diff --git a/notion/Makefile b/notion/Makefile new file mode 100644 index 0000000..2daf159 --- /dev/null +++ b/notion/Makefile @@ -0,0 +1,6 @@ +SUBDIR=.notion + +include ../dotfiles2.mk + +install: RFLAGS:=$(RFLAGS) --exclude=default-session--0 +install: RFLAGS:=$(RFLAGS) --exclude=.welcome_msg_displayed diff --git a/notion/cfg_notion.lua b/notion/cfg_notion.lua new file mode 100644 index 0000000..d31458d --- /dev/null +++ b/notion/cfg_notion.lua @@ -0,0 +1,99 @@ +-- +-- Notion main configuration file +-- +-- This file only includes some settings that are rather frequently altered. +-- The rest of the settings are in cfg_notioncore.lua and individual modules' +-- configuration files (cfg_modulename.lua). +-- +-- When any binding and other customisations that you want are minor, it is +-- recommended that you include them in a copy of this file in ~/.notion/. +-- Simply create or copy the relevant settings at the end of this file (from +-- the other files), recalling that a key can be unbound by passing 'nil' +-- (without the quotes) as the callback. For more information, please see +-- the Notion configuration manual available from the Notion Web page. +-- + +-- Set default modifiers. Alt should usually be mapped to Mod1 on +-- XFree86-based systems. The flying window keys are probably Mod3 +-- or Mod4; see the output of 'xmodmap'. +META="Mod4+" +--ALTMETA="" + +-- Terminal emulator +XTERM="urxvt" + +WScreen.set_managed_offset(ioncore.find_screen_id(0), {x=0, y=0, w=0, h=-1}) + +-- Some basic settings +ioncore.set{ + -- Maximum delay between clicks in milliseconds to be considered a + -- double click. + --dblclick_delay=250, + + -- For keyboard resize, time (in milliseconds) to wait after latest + -- key press before automatically leaving resize mode (and doing + -- the resize in case of non-opaque move). + --kbresize_delay=1500, + + -- Opaque resize? + --opaque_resize=false, + + -- Movement commands warp the pointer to frames instead of just + -- changing focus. Enabled by default. + --warp=true, + + -- Switch frames to display newly mapped windows + --switchto=true, + + -- Default index for windows in frames: one of 'last', 'next' (for + -- after current), or 'next-act' (for after current and anything with + -- activity right after it). + --frame_default_index='next', + + -- Auto-unsqueeze transients/menus/queries. + --unsqueeze=true, + + -- Display notification tooltips for activity on hidden workspace. + screen_notify=true, + + -- Automatically save layout on restart and exit. + --autosave_layout=true, + + -- Mouse focus mode; set to "sloppy" if you want the focus to follow the + -- mouse, and to "disabled" otherwise. + mousefocus="disabled", + + -- Controls Notion's reaction to stacking requests sent by clients. Set to + -- "ignore" to ignore these requests, and to "activate" to set the activity + -- flag on a window that requests to be stacked "Above". + window_stacking_request="ignore", +} + + +-- Load default settings. The file cfg_defaults loads all the files +-- commented out below, except mod_dock. If you do not want to load +-- something, comment out this line, and uncomment the lines corresponding +-- the the modules or configuration files that you want, below. +-- The modules' configuration files correspond to the names of the +-- modules with 'mod' replaced by 'cfg'. +--dopath("cfg_defaults") + +-- Load configuration of the Notion 'core'. Most bindings are here. +dopath("cfg_notioncore") + +-- Load some kludges to make apps behave better. +dopath("cfg_kludges") + +-- Define some layouts. +dopath("cfg_layouts") + +-- Load some modules. Bindings and other configuration specific to modules +-- are in the files cfg_modulename.lua. +dopath("mod_query") +dopath("mod_menu") +dopath("mod_tiling") +--dopath("mod_statusbar") +--dopath("mod_dock") +dopath("mod_sp") +dopath("mod_notionflux") +dopath("mod_xrandr") diff --git a/notion/cfg_notioncore.lua b/notion/cfg_notioncore.lua new file mode 100644 index 0000000..2839409 --- /dev/null +++ b/notion/cfg_notioncore.lua @@ -0,0 +1,411 @@ +-- +-- Notion core configuration file +-- + +function oni_match_class(class) + local result = {} + ioncore.clientwin_i( + function (win) + if class == win:get_ident().class then + table.insert(result, win) + return false + end + return true + end + ) + return result +end + +function xsteve_run_byclass(prog, class) + local win = oni_match_class(class)[1] + if win then + win:goto_() + else + ioncore.exec(prog) + end +end + +-- +-- Bindings. This includes global bindings and bindings common to +-- screens and all types of frames only. See modules' configuration +-- files for other bindings. +-- + + +-- WScreen context bindings +-- +-- The bindings in this context are available all the time. +-- +-- The variable META should contain a string of the form 'Mod1+' +-- where Mod1 maybe replaced with the modifier you want to use for most +-- of the bindings. Similarly ALTMETA may be redefined to add a +-- modifier to some of the F-key bindings. + +defbindings("WScreen", { + bdoc("Switch to n:th object (workspace, full screen client window) ".. + "within current screen."), + kpress(META.."1", "WScreen.switch_nth(_, 0)"), + kpress(META.."2", "WScreen.switch_nth(_, 1)"), + kpress(META.."3", "WScreen.switch_nth(_, 2)"), + kpress(META.."4", "WScreen.switch_nth(_, 3)"), + kpress(META.."5", "WScreen.switch_nth(_, 4)"), + kpress(META.."6", "WScreen.switch_nth(_, 5)"), + kpress(META.."7", "WScreen.switch_nth(_, 6)"), + kpress(META.."8", "WScreen.switch_nth(_, 7)"), + kpress(META.."9", "WScreen.switch_nth(_, 8)"), + kpress(META.."0", "WScreen.switch_nth(_, 9)"), + + bdoc("Switch to next/previous object within current screen."), + kpress(META.."comma", "WScreen.switch_prev(_)"), + kpress(META.."period", "WScreen.switch_next(_)"), + + submap(META.."K", { + --bdoc("Go to previous active object."), + --kpress("K", "ioncore.goto_previous()"), + + --bdoc("Go to first object on activity/urgency list."), + --kpress("I", "ioncore.goto_activity()"), + + bdoc("Clear all tags."), + kpress("T", "ioncore.tagged_clear()"), + }), + + bdoc("Go to n:th screen on multihead setup."), + kpress(META.."Shift+1", "ioncore.goto_nth_screen(0)"), + kpress(META.."Shift+2", "ioncore.goto_nth_screen(1)"), + kpress(META.."Shift+3", "ioncore.goto_nth_screen(2)"), + kpress(META.."E", "ioncore.goto_nth_screen(2)"), + + bdoc("Go to next/previous screen on multihead setup."), + kpress(META.."Shift+comma", "ioncore.goto_prev_screen()"), + kpress(META.."I", "ioncore.goto_prev_screen()"), + + bdoc("Create a new workspace of chosen default type."), + kpress(META.."F9", "ioncore.create_ws(_)"), + + bdoc("Display the main menu."), + kpress(ALTMETA.."F12", "mod_menu.menu(_, _sub, 'mainmenu', {big=true})"), + mpress("Button3", "mod_menu.pmenu(_, _sub, 'mainmenu')"), + + bdoc("Display the window list menu."), + mpress("Button2", "mod_menu.pmenu(_, _sub, 'windowlist')"), + + submap(META.."K", { + bdoc("Backward-circulate focus."), + kpress("AnyModifier+Tab", "ioncore.goto_next(_chld, 'left')", + "_chld:non-nil"), + + bdoc("Raise focused object, if possible."), + kpress("AnyModifier+R", "WRegion.rqorder(_chld, 'front')", + "_chld:non-nil"), + }), + + bdoc("Start i3lock"), + kpress("Mod1+Control+l", "ioncore.exec('i3lock -c 000000')"), + + submap("Control+Z", { + kpress("B", "mod_menu.grabmenu(_, _sub, 'focuslist')"), + + bdoc("Forward-circulate focus."), + -- '_chld' used here stands to for an actual child window that may not + -- be managed by the screen itself, unlike '_sub', that is likely to be + -- the managing group of that window. The right/left directions are + -- used instead of next/prev, because they work better in conjunction + -- with tilings. + kpress("space", "ioncore.goto_next(_chld, 'right')", "_chld:non-nil"), + + kpress("O", "ioncore.goto_next_screen()"), + + kpress("E", "xsteve_run_byclass('emacsclient -ca emacs', 'Emacs')"), + kpress("W", "xsteve_run_byclass('conkeror', 'Conkeror')"), + kpress("C", "xsteve_run_byclass('urxvt', 'URxvt')"), + }), +}) + + +-- Client window bindings +-- +-- These bindings affect client windows directly. + +defbindings("WClientWin", { + submap(META.."K", { + bdoc("Nudge the client window. This might help with some ".. + "programs' resizing problems."), + kpress_wait(META.."L", "WClientWin.nudge(_)"), + + bdoc("Kill client owning the client window."), + kpress("C", "WClientWin.kill(_)"), + }), + submap("Control+Z", { + bdoc("Send next key press to the client window. ".. + "Some programs may not allow this by default."), + kpress("Q", "WClientWin.quote_next(_)"), + }), +}) + + +-- Client window group bindings + +defbindings("WGroupCW", { + bdoc("Toggle client window group full-screen mode"), + kpress_wait(META.."Return", "WGroup.set_fullscreen(_, 'toggle')"), +}) + + +-- WMPlex context bindings +-- +-- These bindings work in frames and on screens. The innermost of such +-- contexts/objects always gets to handle the key press. + +defbindings("WMPlex", { + bdoc("Close current object."), + kpress_wait(META.."C", "nil"), +}) + +-- Frames for transient windows ignore this bindmap +defbindings("WMPlex.toplevel", { + bdoc("Toggle tag of current object."), + kpress(META.."T", "WRegion.set_tagged(_sub, 'toggle')", "_sub:non-nil"), + + bdoc("Lock screen"), + kpress(META.."L", "notioncore.exec_on(_, notioncore.lookup_script('notion-lock'))"), + + bdoc("Query for manual page to be displayed."), + kpress(ALTMETA.."F1", "mod_query.query_man(_, ':man')"), + + bdoc("Show the Notion manual page."), + kpress(META.."F1", "ioncore.exec_on(_, ':man notion')"), + + bdoc("Run a terminal emulator."), + kpress(ALTMETA.."F2", "mod_query.exec_on_merr(_, XTERM or 'xterm')"), + + bdoc("Query for command line to execute."), + kpress(ALTMETA.."F3", "mod_query.query_exec(_)"), + + bdoc("Query for Lua code to execute."), + kpress(META.."F3", "mod_query.query_lua(_)"), + + bdoc("Query for host to connect to with SSH."), + kpress(ALTMETA.."F4", "mod_query.query_ssh(_, ':ssh')"), + + bdoc("Query for workspace to go to or create a new one."), + kpress(ALTMETA.."F9", "mod_query.query_workspace(_)"), + + bdoc("Query for a client window to go to."), + kpress(META.."G", "mod_query.query_gotoclient(_)"), + + bdoc("Display context menu."), + kpress(META.."M", "mod_menu.menu(_, _sub, 'ctxmenu')"), + + submap(META.."K", { + bdoc("Detach (float) or reattach an object to its previous location."), + -- By using _chld instead of _sub, we can detach/reattach queries + -- attached to a group. The detach code checks if the parameter + -- (_chld) is a group 'bottom' and detaches the whole group in that + -- case. + kpress("D", "ioncore.detach(_chld, 'toggle')", "_chld:non-nil"), + }), +}) + + +-- WFrame context bindings +-- +-- These bindings are common to all types of frames. Some additional +-- frame bindings are found in some modules' configuration files. + +defbindings("WFrame", { + submap(META.."K", { + bdoc("Maximize the frame horizontally/vertically."), + kpress("H", "WFrame.maximize_horiz(_)"), + kpress("V", "WFrame.maximize_vert(_)"), + }), + + bdoc("Display context menu."), + mpress("Button3", "mod_menu.pmenu(_, _sub, 'ctxmenu')"), + + bdoc("Begin move/resize mode."), + kpress(META.."R", "WFrame.begin_kbresize(_)"), + + bdoc("Switch the frame to display the object indicated by the tab."), + mclick("Button1@tab", "WFrame.p_switch_tab(_)"), + mclick("Button2@tab", "WFrame.p_switch_tab(_)"), + + bdoc("Resize the frame."), + mdrag("Button1@border", "WFrame.p_resize(_)"), + mdrag(META.."Button3", "WFrame.p_resize(_)"), + + bdoc("Move the frame."), + mdrag(META.."Button1", "WFrame.p_move(_)"), + + bdoc("Move objects between frames by dragging and dropping the tab."), + mdrag("Button1@tab", "WFrame.p_tabdrag(_)"), + mdrag("Button2@tab", "WFrame.p_tabdrag(_)"), + + bdoc("Switch to next/previous object within the frame."), + mclick(META.."Button4", "WFrame.switch_next(_)"), + mclick(META.."Button5", "WFrame.switch_prev(_)"), +}) + +-- Frames for transient windows ignore this bindmap + +defbindings("WFrame.toplevel", { + bdoc("Query for a client window to attach."), + kpress(META.."A", "mod_query.query_attachclient(_)"), + + submap(META.."K", { + -- Display tab numbers when modifiers are released + submap_wait("ioncore.tabnum.show(_)"), + + bdoc("Switch to n:th object within the frame."), + kpress("1", "WFrame.switch_nth(_, 0)"), + kpress("2", "WFrame.switch_nth(_, 1)"), + kpress("3", "WFrame.switch_nth(_, 2)"), + kpress("4", "WFrame.switch_nth(_, 3)"), + kpress("5", "WFrame.switch_nth(_, 4)"), + kpress("6", "WFrame.switch_nth(_, 5)"), + kpress("7", "WFrame.switch_nth(_, 6)"), + kpress("8", "WFrame.switch_nth(_, 7)"), + kpress("9", "WFrame.switch_nth(_, 8)"), + kpress("0", "WFrame.switch_nth(_, 9)"), + + bdoc("Move current object within the frame left/right."), + kpress("comma", "WFrame.dec_index(_, _sub)", "_sub:non-nil"), + kpress("period", "WFrame.inc_index(_, _sub)", "_sub:non-nil"), + + bdoc("Maximize the frame horizontally/vertically."), + kpress("H", "WFrame.maximize_horiz(_)"), + kpress("V", "WFrame.maximize_vert(_)"), + + bdoc("Attach tagged objects to this frame."), + kpress("A", "ioncore.tagged_attach(_)"), + }), + + submap("Control+Z", { + bdoc("Switch to next object within the frame."), + kpress("Z", "WFrame.switch_next(_)"), + }), +}) + +-- Bindings for floating frames. + +defbindings("WFrame.floating", { + bdoc("Toggle shade mode"), + mdblclick("Button1@tab", "WFrame.set_shaded(_, 'toggle')"), + + bdoc("Raise the frame."), + mpress("Button1@tab", "WRegion.rqorder(_, 'front')"), + mpress("Button1@border", "WRegion.rqorder(_, 'front')"), + mclick(META.."Button1", "WRegion.rqorder(_, 'front')"), + + bdoc("Lower the frame."), + mclick(META.."Button3", "WRegion.rqorder(_, 'back')"), + + bdoc("Move the frame."), + mdrag("Button1@tab", "WFrame.p_move(_)"), +}) + + +-- WMoveresMode context bindings +-- +-- These bindings are available keyboard move/resize mode. The mode +-- is activated on frames with the command begin_kbresize (bound to +-- META.."R" above by default). + +defbindings("WMoveresMode", { + bdoc("Cancel the resize mode."), + kpress("AnyModifier+Escape","WMoveresMode.cancel(_)"), + + bdoc("End the resize mode."), + kpress("AnyModifier+Return","WMoveresMode.finish(_)"), + + bdoc("Grow in specified direction."), + kpress("Left", "WMoveresMode.resize(_, 1, 0, 0, 0)"), + kpress("Right", "WMoveresMode.resize(_, 0, 1, 0, 0)"), + kpress("Up", "WMoveresMode.resize(_, 0, 0, 1, 0)"), + kpress("Down", "WMoveresMode.resize(_, 0, 0, 0, 1)"), + kpress("F", "WMoveresMode.resize(_, 1, 0, 0, 0)"), + kpress("B", "WMoveresMode.resize(_, 0, 1, 0, 0)"), + kpress("P", "WMoveresMode.resize(_, 0, 0, 1, 0)"), + kpress("N", "WMoveresMode.resize(_, 0, 0, 0, 1)"), + + bdoc("Shrink in specified direction."), + kpress("Shift+Left", "WMoveresMode.resize(_,-1, 0, 0, 0)"), + kpress("Shift+Right", "WMoveresMode.resize(_, 0,-1, 0, 0)"), + kpress("Shift+Up", "WMoveresMode.resize(_, 0, 0,-1, 0)"), + kpress("Shift+Down", "WMoveresMode.resize(_, 0, 0, 0,-1)"), + kpress("Shift+F", "WMoveresMode.resize(_,-1, 0, 0, 0)"), + kpress("Shift+B", "WMoveresMode.resize(_, 0,-1, 0, 0)"), + kpress("Shift+P", "WMoveresMode.resize(_, 0, 0,-1, 0)"), + kpress("Shift+N", "WMoveresMode.resize(_, 0, 0, 0,-1)"), + + bdoc("Move in specified direction."), + kpress(META.."Left", "WMoveresMode.move(_,-1, 0)"), + kpress(META.."Right", "WMoveresMode.move(_, 1, 0)"), + kpress(META.."Up", "WMoveresMode.move(_, 0,-1)"), + kpress(META.."Down", "WMoveresMode.move(_, 0, 1)"), + kpress(META.."F", "WMoveresMode.move(_,-1, 0)"), + kpress(META.."B", "WMoveresMode.move(_, 1, 0)"), + kpress(META.."P", "WMoveresMode.move(_, 0,-1)"), + kpress(META.."N", "WMoveresMode.move(_, 0, 1)"), +}) + + +-- +-- Menu definitions +-- + + +-- Main menu +defmenu("mainmenu", { + menuentry("Run...", "mod_query.query_exec(_)"), + menuentry("Terminal", "mod_query.exec_on_merr(_, XTERM or 'xterm')"), + menuentry("Lock screen", + "notioncore.exec_on(_, notioncore.lookup_script('notion-lock'))"), + menuentry("Help", "mod_query.query_man(_)"), + menuentry("About Notion", "mod_query.show_about_ion(_)"), + submenu("Styles", "stylemenu"), + submenu("Session", "sessionmenu"), +}) + + +-- Session control menu +defmenu("sessionmenu", { + menuentry("Save", "ioncore.snapshot()"), + menuentry("Restart", "ioncore.restart()"), + menuentry("Restart TWM", "ioncore.restart_other('twm')"), + menuentry("Exit", "ioncore.shutdown()"), +}) + + +-- Context menu (frame actions etc.) +defctxmenu("WFrame", "Frame", { + -- Note: this propagates the close to any subwindows; it does not + -- destroy the frame itself, unless empty. An entry to destroy tiled + -- frames is configured in cfg_tiling.lua. + menuentry("Close", "WRegion.rqclose_propagate(_, _sub)"), + -- Low-priority entries + menuentry("Attach tagged", "ioncore.tagged_attach(_)", { priority = 0 }), + menuentry("Clear tags", "ioncore.tagged_clear()", { priority = 0 }), + menuentry("Window info", "mod_query.show_tree(_, _sub)", { priority = 0 }), +}) + + +-- Context menu for groups (workspaces, client windows) +defctxmenu("WGroup", "Group", { + menuentry("Toggle tag", "WRegion.set_tagged(_, 'toggle')"), + menuentry("De/reattach", "ioncore.detach(_, 'toggle')"), +}) + + +-- Context menu for workspaces +defctxmenu("WGroupWS", "Workspace", { + menuentry("Close", "WRegion.rqclose(_)"), + menuentry("Rename", "mod_query.query_renameworkspace(nil, _)"), + menuentry("Attach tagged", "ioncore.tagged_attach(_)"), +}) + + +-- Context menu for client windows +defctxmenu("WClientWin", "Client window", { + menuentry("Kill", "WClientWin.kill(_)"), +})