diff --git a/.notion/cfg_dock.lua b/.notion/cfg_dock.lua new file mode 100644 index 0000000..b49facb --- /dev/null +++ b/.notion/cfg_dock.lua @@ -0,0 +1,35 @@ +-- +-- Notion dock module configuration +-- + +-- Create a dock +mod_dock.create{ + -- Dock mode: embedded|floating + mode="floating", + + -- The screen to create the dock on + screen=0, + + -- Corner or side of the screen to place the dock on. + -- For embedded dock the valid values are: tl|tr|bl|br + -- For floating dock the following are also valid: tc|bc|ml|mc|mr + pos="mr", + + -- Growth direction: left|right|up|down + grow="down", + + -- Whether new dockapps should be added automatically to this dock + is_auto=false, + + -- Show floating dock initially? + floating_hidden=false, + + -- Name of the dock + name="*dock*", +} + +-- For floating docks, you may want the following toggle binding. +defbindings("WScreen", { + bdoc("Toggle floating dock."), + kpress(META.."c", "mod_dock.set_floating_shown_on(_, 'toggle')"), +}) diff --git a/.notion/cfg_kludges.lua b/.notion/cfg_kludges.lua new file mode 100644 index 0000000..b7fbafb --- /dev/null +++ b/.notion/cfg_kludges.lua @@ -0,0 +1,47 @@ +-- +-- Options to get some programs work more nicely (or at all) +-- + +defwinprop{ + class = "mpv", + instance = "selfcam", + target = "*dock*", + -- float = true, + ignore_cfgrq = false, + ignore_min_size = false, + min_size = { w = 640, h = 480 } +} + +defwinprop{ + name = "Crack Attack!", + float = true, + ignore_cfgrq = true, + transient_mode = true +} +defwinprop{ + class = "RawTherapee", + name = "RawTherapee", + float = false, +} + +defwinprop{ + class = "Xpdf", + instance = "openDialog_popup", + ignore_cfgrq = true +} + +defwinprop { + class = "stalonetray", + instance = "stalonetray", + statusbar = "systray", +} + +-- Define some additional title shortening rules to use when the full +-- title doesn't fit in the available space. The first-defined matching +-- rule that succeeds in making the title short enough is used. +-- ioncore.defshortening("(.*) - Mozilla(<[0-9]+>)", "$1$2$|$1$<...$2") +-- ioncore.defshortening("(.*) - Mozilla", "$1$|$1$<...") +-- ioncore.defshortening("[^:]+: (.*)(<[0-9]+>)", "$1$2$|$1$<...$2") +-- ioncore.defshortening("[^:]+: (.*)", "$1$|$1$<...") +-- ioncore.defshortening("(.*)(<[0-9]+>)", "$1$2$|$1$<...$2") +ioncore.defshortening("(.*)", "$1$|$1$<...") diff --git a/.notion/cfg_layout_dev.lua b/.notion/cfg_layout_dev.lua new file mode 100644 index 0000000..4b2df19 --- /dev/null +++ b/.notion/cfg_layout_dev.lua @@ -0,0 +1,136 @@ +return { + [0] = { + ["name"] = "WScreen", + ["managed"] = { + [1] = { + ["geom"] = { + ["x"] = 0.0, + ["y"] = 0.0, + ["h"] = 1080.0, + ["w"] = 1920.0, + }, + ["switchto"] = true, + ["managed"] = { + [1] = { + ["bottom"] = true, + ["geom"] = { + ["x"] = 0.0, + ["y"] = 0.0, + ["h"] = 1080.0, + ["w"] = 1920.0, + }, + ["sizepolicy"] = "full", + ["split_tree"] = { + ["tls"] = 1062.0, + ["tl"] = { + ["tls"] = 1286.0, + ["tl"] = { + ["regparams"] = { + ["mode"] = 1.0, + ["name"] = "Tiling Frame<1>", + ["managed"] = { + [1] = { + ["geom"] = { + ["x"] = 1.0, + ["y"] = 18.0, + ["h"] = 1043.0, + ["w"] = 1284.0, + }, + ["managed"] = { + [1] = { + ["bottom"] = true, + ["checkcode"] = 1.0, + ["sizepolicy"] = "full", + ["windowid"] = 25165827.0, + ["geom"] = { + ["x"] = 0.0, + ["y"] = 5.0, + ["h"] = 1033.0, + ["w"] = 1284.0, + }, + ["level"] = 0.0, + ["type"] = "WClientWin", + }, + }, + ["sizepolicy"] = "full", + ["switchto"] = true, + ["name"] = "WGroupCW", + ["level"] = 0.0, + ["type"] = "WGroupCW", + }, + }, + ["type"] = "WFrame", + }, + ["type"] = "WSplitRegion", + }, + ["br"] = { + ["tls"] = 673.0, + ["tl"] = { + ["tls"] = 353.0, + ["tl"] = { + ["regparams"] = { + ["mode"] = 1.0, + ["name"] = "Tiling Frame", + ["managed"] = { + }, + ["type"] = "WFrame", + }, + ["type"] = "WSplitRegion", + }, + ["br"] = { + ["regparams"] = { + ["mode"] = 1.0, + ["name"] = "Tiling Frame<3>", + ["managed"] = { + }, + ["type"] = "WFrame", + }, + ["type"] = "WSplitRegion", + }, + ["dir"] = "vertical", + ["brs"] = 320.0, + ["type"] = "WSplitSplit", + }, + ["br"] = { + ["regparams"] = { + ["mode"] = 1.0, + ["name"] = "Tiling Frame<2>", + ["managed"] = { + }, + ["type"] = "WFrame", + }, + ["type"] = "WSplitRegion", + }, + ["dir"] = "vertical", + ["brs"] = 389.0, + ["type"] = "WSplitSplit", + }, + ["dir"] = "horizontal", + ["brs"] = 634.0, + ["type"] = "WSplitSplit", + }, + ["br"] = { + ["type"] = "WSplitST", + }, + ["dir"] = "vertical", + ["brs"] = 18.0, + ["type"] = "WSplitSplit", + }, + ["name"] = "WTiling", + ["level"] = 0.0, + ["type"] = "WTiling", + }, + }, + ["initial_outputs"] = { + [1] = "eDP", + }, + ["sizepolicy"] = "full", + ["name"] = "WGroupWS", + ["level"] = 0.0, + ["type"] = "WGroupWS", + }, + }, + ["type"] = "WScreen", + }, +} + diff --git a/.notion/cfg_layouts.lua b/.notion/cfg_layouts.lua new file mode 100644 index 0000000..63442c9 --- /dev/null +++ b/.notion/cfg_layouts.lua @@ -0,0 +1,78 @@ +-- +-- Layouts for Ion +-- + +-- +-- Helper routines and structures +-- + +-- Tiled frame template for the layouts below +local a_frame = { + type="WSplitRegion", + regparams = { + type = "WFrame", + frame_style = "frame-tiled" + } +} + +-- Helper function for generating splits for layouts +local function mksplit(dir, tl, br, float) + return { + type = (float and "WSplitFloat" or "WSplitSplit"), + dir = dir, + tls = 1, + brs = 1, + tl = tl, + br = br, + } +end + +local function mktiling(split_tree) + return { + managed = { + { + type = "WTiling", + bottom = true, -- Make it the bottom of the group + split_tree = split_tree, + } + } + } +end + + + +-- +-- The layouts +-- +ioncore.deflayout("default", full) + +-- Tiling with single 1:1 horizontal split +ioncore.deflayout("hsplit", + mksplit("horizontal", a_frame, a_frame) +) + +-- Tiling with single 1:1 vertical split +ioncore.deflayout("vsplit", + mktiling(mksplit("vertical", a_frame, a_frame)) +) + +-- Tiling with single 1:1 floating horizontal split +ioncore.deflayout("hfloat", + mktiling(mksplit("horizontal", a_frame, a_frame, true)) +) + +-- Tiling with single 1:1 floating vertical split +ioncore.deflayout("vfloat", + mktiling(mksplit("vertical", a_frame, a_frame, true)) +) + +-- Tiling with horizontal and then vertical splits +ioncore.deflayout("2x2", + mktiling(mksplit("horizontal", + mksplit("vertical", a_frame, a_frame), + mksplit("vertical", a_frame, a_frame)) + ) +) + +-- Tiling with single full screen frame +ioncore.deflayout("full", mktiling(a_frame)) diff --git a/.notion/cfg_menu.lua b/.notion/cfg_menu.lua new file mode 100644 index 0000000..a2a64ff --- /dev/null +++ b/.notion/cfg_menu.lua @@ -0,0 +1,32 @@ +-- +-- Menu module configuration. +-- +-- Only bindings that are effect in menus are configured here. +-- See ion-menus.lua for menu definitions and ion-bindings.lua +-- for bindings to display menus. +-- + + +defbindings("WMenu", { + bdoc("Close the menu."), + kpress("Escape", "WMenu.cancel(_)"), + kpress("Control+G", "WMenu.cancel(_)"), + kpress("Control+C", "WMenu.cancel(_)"), + kpress("Left", "WMenu.cancel(_)"), + + bdoc("Activate current menu entry."), + kpress("Return", "WMenu.finish(_)"), + kpress("KP_Enter", "WMenu.finish(_)"), + kpress("Control+M", "WMenu.finish(_)"), + kpress("Right", "WMenu.finish(_)"), + + bdoc("Select next/previous menu entry."), + kpress("Control+N", "WMenu.select_next(_)"), + kpress("Control+P", "WMenu.select_prev(_)"), + kpress("Up", "WMenu.select_prev(_)"), + kpress("Down", "WMenu.select_next(_)"), + + bdoc("Clear the menu's typeahead find buffer."), + kpress("BackSpace", "WMenu.typeahead_clear(_)"), +}) + diff --git a/.notion/cfg_notion.lua b/.notion/cfg_notion.lua new file mode 100644 index 0000000..9634895 --- /dev/null +++ b/.notion/cfg_notion.lua @@ -0,0 +1,75 @@ +-- +-- Ion main configuration file +-- + +-- Meta key that can be use in key bindings (xmodmap) +META="Mod1+" + +-- Editor command +EDIT_COMMAND="bterm -e vim" + +-- Display command (used to display keyboard layout reference) +VIEW_COMMAND="firefox" + +-- Configure global notion core settings +ioncore.set{ + + -- Fast clicks are considered double-clicks (default: 250) + --dblclick_delay=250, + + -- Quit resize mode timeout (default: 1500) + --kbresize_delay=1500, + + -- Display frame content while resizing (default: false) + opaque_resize=false, + + -- float dialog type windows + window_dialog_float=true, + + -- Mouse cursor moves with focus changes (default: true) + warp=true, + + -- Switch frames to display newly mapped windows (default: true) + --switchto=true, + + -- On frame close, switch to this frame (default: next) + -- Possible values: next, last + --frame_default_index='next', + + -- Auto-unsqueeze transients/menus/queries (default: true) + -- unsqueeze=false, + + -- Display tooltips for activity on hidden workspace (default: true) + --screen_notify=true, + -- + -- Show Workspace after switch + --workspace_indicator_timeout=1000, + -- + -- + framed_transients=true, + window_stacking_request="activate", +} + +-- Load configuration of the Ion '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") +dopath("cfg_layout_dev") + +-- Load modules +-- Module mod_$module loads cfg_$module +dopath("mod_query") +dopath("mod_menu") +dopath("mod_tiling") +dopath("mod_statusbar") +dopath("mod_dock") +dopath("mod_sp") +dopath("mod_float-sb") +-- dopath("min_tabs") + +-- dopath("net_client_list") +dopath("mod_xrandr") diff --git a/.notion/cfg_notioncore.lua b/.notion/cfg_notioncore.lua new file mode 100644 index 0000000..7c61fb2 --- /dev/null +++ b/.notion/cfg_notioncore.lua @@ -0,0 +1,321 @@ +-- WScreen context bindings +-- The bindings in this context are available all the time. + +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 last active object within current screen."), + kpress(META.."Tab", "ioncore.goto_previous_workspace()"), + submap(META.."K", { + bdoc("Go to first region demanding attention or previously active one."), + kpress("K", "mod_menu.grabmenu(_, _sub, 'focuslist')"), + bdoc("Go to first object on activity/urgency list."), + kpress("A", "ioncore.goto_activity()"), + }), + + bdoc("Switch to next/previous object within current screen."), + kpress(META.."Shift+Next", "WScreen.switch_next(_)"), + kpress(META.."Shift+Prior", "WScreen.switch_prev(_)"), + + 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.."Shift+Left", "ioncore.goto_prev_screen()"), + kpress(META.."Shift+Right", "ioncore.goto_next_screen()"), + + bdoc("Create a new workspace of chosen default type."), + kpress(META.."F12", "ioncore.create_ws(_)"), + kpress(META.."Shift+F12", "mod_query.query_workspace(_)"), + + bdoc("Display the main menu."), + --kpress(ALTMETA.."F12", "mod_query.query_menu(_, _sub, 'mainmenu', 'Main menu:')"), + kpress("Super_L", "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')"), + +}) + + +-- Client window bindings +-- +-- These bindings affect client windows directly. + +defbindings("WClientWin", { + bdoc("Kill client owning the client window."), + kpress(META.."Q", "WRegion.rqclose(_)"), + submap(META.."K", { + kpress("Q", "WClientWin.kill(_)"), + }), +}) + + +-- Client window group bindings + +defbindings("WGroupCW", { + bdoc("Toggle client window group full-screen mode"), + kpress(META.."F", "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(META.."Shift+Q", "WRegion.rqclose(_)"), +}) + +-- 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("Query for manual page to be displayed."), + kpress(META.."M", "mod_query.query_man(_, '::man')"), + + bdoc("Run a small terminal emulator."), + kpress(META.."Return", "ioncore.exec_on(_, 'sterm')"), + + bdoc("Run a big terminal emulator."), + kpress(META.."Shift+Return", "ioncore.exec_on(_, 'bterm')"), + + bdoc("Run a huge terminal emulator."), + kpress(META.."Control+Return", "ioncore.exec_on(_, 'hterm')"), + + bdoc("Screenshot."), + kpress(META.."Print", "ioncore.exec_on(_, 'sshot')"), + + bdoc("Screenshot selection."), + kpress(META.."Shift+Print", "ioncore.exec_on(_, 'xpick_copy')"), + + bdoc("Query for command line to execute."), + kpress(META.."D", "ioncore.exec_on(_, 'dexec')"), + + bdoc("Port list viewer"), + kpress(META.."S", "ioncore.exec_on(_, 'bterm goport')"), + + bdoc("cscope /usr/src/sys"), + kpress(META.."Shift+L", "ioncore.exec_on(_, 'dsys')"), + + bdoc("dcont"), + kpress(META.."Shift+D", "ioncore.exec_on(_, 'sterm dev-continue')"), + + bdoc("Show SSH Menu"), + kpress(META.."plus", "ioncore.exec_on(_, 'dexec_ssh_favs')"), + + bdoc("Show APPS Menu"), + kpress(META.."A", "ioncore.exec_on(_, 'dexec_apps')"), + + bdoc("Start Browser"), + kpress(META.."Shift+F", "ioncore.exec_on(_, 'dexec_browser')"), + kpress(META.."Shift+M", "ioncore.exec_on(_, 'dexec_man')"), + + bdoc("Start Passmenu"), + kpress(META.."Shift+P", "ioncore.exec_on(_, 'dexec_pass')"), + + bdoc("Start personal information menu"), + kpress(META.."P", "ioncore.exec_on(_, 'dexec_pim')"), + + bdoc("Query for Lua code to execute."), + kpress(META.."L", "mod_query.query_lua(_)"), + + bdoc("Query for a client window to go to."), + kpress(META.."G", "mod_query.query_gotoclient(_)"), + + bdoc("Detach (float) or reattach an object to its previous location."), + kpress(META.."space", "ioncore.detach(_chld, 'toggle')", "_chld:non-nil"), + + bdoc("Show Notion 'live docs'.", "help"), + kpress(META.."ssharp", "notioncore.show_live_docs(_)"), + +}) + + +-- 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", { + 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(_)"), +}) + +-- 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(_)"), + + bdoc("Switch to next/previous object within the frame."), + kpress(META.."Next", "WFrame.switch_next(_)"), + kpress(META.."Prior", "WFrame.switch_prev(_)"), + + kpress(META.."XF86Forward", "WFrame.switch_next(_)"), + kpress(META.."XF86Back", "WFrame.switch_prev(_)"), + + bdoc("Rename Workspace"), + kpress(META.."Shift+R", "mod_query.query_renameworkspace(nil, _)"), + + submap(META.."K", { + 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("Attach tagged objects to this frame."), + kpress("T", "ioncore.tagged_attach(_)"), + + bdoc("Rename Workspace"), + kpress("R", "mod_query.query_renameframe(_)"), + }), +}) + +-- 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)"), + + 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)"), + + 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)"), +}) + + +-- +-- Menu definitions +-- + +-- Main menu +defmenu("mainmenu", { + menuentry("Lock screen", "ioncore.exec_on(_, 'slock')"), + menuentry("Run...", "mod_query.query_exec(_)"), + submenu("Session", "sessionmenu"), + menuentry("Restart", "ioncore.restart()"), +}) + + +-- Session control menu +defmenu("sessionmenu", { + menuentry("Save", "ioncore.snapshot()"), + submenu("Styles", "stylemenu"), + 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(_)"), +}) diff --git a/.notion/cfg_query.lua b/.notion/cfg_query.lua new file mode 100644 index 0000000..65f17e2 --- /dev/null +++ b/.notion/cfg_query.lua @@ -0,0 +1,102 @@ +-- +-- Query module configuration. +-- +-- Only bindings that are in effect in queries and message displays are +-- configured here. Actions to display queries are configured in +-- ion-bindings.lua +-- + + +defbindings("WEdln", { + bdoc("Move one character forward/backward."), + kpress("Control+F", "WEdln.forward(_)"), + kpress("Control+B", "WEdln.back(_)"), + kpress("Right", "WEdln.forward(_)"), + kpress("Left", "WEdln.back(_)"), + + bdoc("Go to end/beginning."), + kpress("Control+E", "WEdln.eol(_)"), + kpress("Control+A", "WEdln.bol(_)"), + kpress("End", "WEdln.eol(_)"), + kpress("Home", "WEdln.bol(_)"), + + bdoc("Skip one word forward/backward."), + kpress("Control+X", "WEdln.skip_word(_)"), + kpress("Control+Z", "WEdln.bskip_word(_)"), + + bdoc("Delete next character."), + kpress("Control+D", "WEdln.delete(_)"), + kpress("Delete", "WEdln.delete(_)"), + + bdoc("Delete previous character."), + kpress("BackSpace", "WEdln.backspace(_)"), + kpress("Control+H", "WEdln.backspace(_)"), + + bdoc("Delete one word forward/backward."), + kpress("Control+W", "WEdln.kill_word(_)"), + kpress("Control+O", "WEdln.bkill_word(_)"), + + bdoc("Delete to end of line."), + kpress("Control+J", "WEdln.kill_to_eol(_)"), + + bdoc("Delete the whole line."), + kpress("Control+Y", "WEdln.kill_line(_)"), + + bdoc("Transpose characters."), + kpress("Control+T", "WEdln.transpose_chars(_)"), + + bdoc("Select next/previous (matching) history entry."), + kpress("Control+P", "WEdln.history_prev(_)"), + kpress("Control+N", "WEdln.history_next(_)"), + kpress("Up", "WEdln.history_prev(_)"), + kpress("Down", "WEdln.history_next(_)"), + kpress("Control+Up", "WEdln.history_prev(_, true)"), + kpress("Control+Down", "WEdln.history_next(_, true)"), + + bdoc("Paste from the clipboard."), + mclick("Button2", "WEdln.paste(_)"), + submap("Control+K", { + kpress("C", "WEdln.paste(_)"), + + bdoc("Set mark/begin selection."), + kpress("B", "WEdln.set_mark(_)"), + + bdoc("Cut selection."), + kpress("Y", "WEdln.cut(_)"), + + bdoc("Copy selection."), + kpress("K", "WEdln.copy(_)"), + + bdoc("Clear mark/cancel selection."), + kpress("G", "WEdln.clear_mark(_)"), + }), + + bdoc("Try to complete the entered text or cycle through completions."), + kpress("Tab", "WEdln.complete(_, 'next', 'normal')"), + kpress("Shift+Tab", "WEdln.complete(_, 'prev', 'normal')"), + -- Do not cycle; only force evaluation of new completions + kpress("Control+Tab", "WEdln.complete(_, nil, 'normal')"), + + bdoc("Complete from history"), + kpress("Control+R", "WEdln.complete(_, 'next', 'history')"), + kpress("Control+S", "WEdln.complete(_, 'prev', 'history')"), + + bdoc("Close the query and execute bound action."), + kpress("Control+M", "WEdln.finish(_)"), + kpress("Return", "WEdln.finish(_)"), + kpress("KP_Enter", "WEdln.finish(_)"), +}) + + +defbindings("WInput", { + bdoc("Close the query/message box, not executing bound actions."), + kpress("Escape", "WInput.cancel(_)"), + kpress("Control+G", "WInput.cancel(_)"), + kpress("Control+C", "WInput.cancel(_)"), + + bdoc("Scroll the message or completions up/down."), + kpress("Control+U", "WInput.scrollup(_)"), + kpress("Control+V", "WInput.scrolldown(_)"), + kpress("Page_Up", "WInput.scrollup(_)"), + kpress("Page_Down", "WInput.scrolldown(_)"), +}) diff --git a/.notion/cfg_sp.lua b/.notion/cfg_sp.lua new file mode 100644 index 0000000..69a4081 --- /dev/null +++ b/.notion/cfg_sp.lua @@ -0,0 +1,11 @@ +-- +-- Ion mod_sp configuration file +-- + +mod_sp.set_size(1600, 800); + +defbindings("WScreen", { + bdoc("Toggle scratchpad."), + kpress(META.."minus", "mod_sp.set_shown_on(_, 'toggle')"), +}) + diff --git a/.notion/cfg_statusbar.lua b/.notion/cfg_statusbar.lua new file mode 100644 index 0000000..2750d9f --- /dev/null +++ b/.notion/cfg_statusbar.lua @@ -0,0 +1,32 @@ +-- +-- Notion statusbar module configuration file +-- + +-- Create a statusbar +mod_statusbar.create { + + -- First screen, tl left corner + screen=0, + pos='br', + + -- Set this to true if you want a full-width statusbar + fullsize=true, + + -- Swallow systray windows + systray=true, + + -- %workspace_name + -- %workspace_frame + -- %workspace_pager + -- %workspace_name_pager + -- %workspace_num_name_pager + + template="%workspace_pager %filler %systray %shellbar %date", +} + +-- Launch ion-statusd. This must be done after creating any statusbars +-- for necessary statusd modules to be parsed from the templates. +-- mod_statusbar.launch_statusd { +-- shellbar, +-- date={ date_format='%a %Y-%m-%d %H:%M', }, +-- } diff --git a/.notion/cfg_tiling.lua b/.notion/cfg_tiling.lua new file mode 100644 index 0000000..073cb53 --- /dev/null +++ b/.notion/cfg_tiling.lua @@ -0,0 +1,84 @@ +-- +-- Ion tiling module configuration file +-- + +-- Bindings for the tilings. + +defbindings("WTiling", { + + bdoc("Go to frame above/below/right/left of current frame."), + kpress(META.."Up", "ioncore.goto_next(_sub, 'up', {no_ascend=_})"), + kpress(META.."Down", "ioncore.goto_next(_sub, 'down', {no_ascend=_})"), + kpress(META.."Right", "ioncore.goto_next(_sub, 'right')"), + kpress(META.."Left", "ioncore.goto_next(_sub, 'left')"), + + submap(META.."K", { + bdoc("Split current frame horizontally."), + kpress("Right", "WTiling.split_at(_, _sub, 'right', false)"), + kpress("Left", "WTiling.split_at(_, _sub, 'left', false)"), + kpress("l", "WTiling.split_at(_, _sub, 'right', false)"), + kpress("j", "WTiling.split_at(_, _sub, 'left', false)"), + bdoc("Split current frame vertically."), + kpress("Down", "WTiling.split_at(_, _sub, 'bottom', false)"), + kpress("Up", "WTiling.split_at(_, _sub, 'top', false)"), + kpress("comma", "WTiling.split_at(_, _sub, 'bottom', false)"), + kpress("i", "WTiling.split_at(_, _sub, 'top', false)"), + }), +}) + + +-- Frame bindings + +defbindings("WFrame.floating", { + submap(META.."K", { + bdoc("Tile frame, if no tiling exists on the workspace"), + kpress("B", "mod_tiling.mkbottom(_)"), + }), +}) + + +-- Context menu for tiled workspaces. + +defctxmenu("WTiling", "Tiling", { + menuentry("Destroy frame", + "WTiling.unsplit_at(_, _sub)"), + + menuentry("Split vertically", + "WTiling.split_at(_, _sub, 'bottom', true)"), + menuentry("Split horizontally", + "WTiling.split_at(_, _sub, 'right', true)"), + + menuentry("Flip", "WTiling.flip_at(_, _sub)"), + menuentry("Transpose", "WTiling.transpose_at(_, _sub)"), + + menuentry("Untile", "mod_tiling.untile(_)"), + + submenu("Float split", { + menuentry("At left", + "WTiling.set_floating_at(_, _sub, 'toggle', 'left')"), + menuentry("At right", + "WTiling.set_floating_at(_, _sub, 'toggle', 'right')"), + menuentry("Above", + "WTiling.set_floating_at(_, _sub, 'toggle', 'up')"), + menuentry("Below", + "WTiling.set_floating_at(_, _sub, 'toggle', 'down')"), + }), + + submenu("At root", { + menuentry("Split vertically", + "WTiling.split_top(_, 'bottom')"), + menuentry("Split horizontally", + "WTiling.split_top(_, 'right')"), + menuentry("Flip", "WTiling.flip_at(_)"), + menuentry("Transpose", "WTiling.transpose_at(_)"), + }), +}) + + +-- Extra context menu extra entries for floatframes. + +defctxmenu("WFrame.floating", "Floating frame", { + append=true, + menuentry("New tiling", "mod_tiling.mkbottom(_)"), +}) + diff --git a/.notion/cfg_xrandr.lua b/.notion/cfg_xrandr.lua new file mode 100644 index 0000000..3a762e0 --- /dev/null +++ b/.notion/cfg_xrandr.lua @@ -0,0 +1,262 @@ +-- For honest workspaces, the initial outputs information, which determines the +-- physical screen that a workspace wants to be on, is part of the C class +-- WGroupWS. For "full screen workspaces" and scratchpads, we only keep this +-- information in a temporary list. +InitialOutputs={} + +function getInitialOutputs(ws) + if obj_is(ws, "WGroupCW") or is_scratchpad(ws) then + return InitialOutputs[ws:name()] + elseif obj_is(ws, "WGroupWS") then + return WGroupWS.get_initial_outputs(ws) + else + return nil + end +end + +function setInitialOutputs(ws, outputs) + if obj_is(ws, "WGroupCW") or is_scratchpad(ws) then + InitialOutputs[ws:name()] = outputs + elseif obj_is(ws, "WGroupWS") then + WGroupWS.set_initial_outputs(ws, outputs) + end +end + +function nilOrEmpty(t) + return not t or empty(t) +end + +function mod_xrandr.workspace_added(ws) + if nilOrEmpty(getInitialOutputs(ws)) then + outputs = mod_xrandr.get_outputs(ws:screen_of(ws)) + outputKeys = {} + for k,v in pairs(outputs) do + table.insert(outputKeys, k) + end + setInitialOutputs(ws, outputKeys) + end + return true +end + +function for_all_workspaces_do(fn) + local workspaces={} + notioncore.region_i(function(scr) + scr:managed_i(function(ws) + table.insert(workspaces, ws) + return true + end) + return true + end, "WScreen") + for _,ws in ipairs(workspaces) do + fn(ws) + end +end + +function mod_xrandr.workspaces_added() + for_all_workspaces_do(mod_xrandr.workspace_added) +end + +function mod_xrandr.screenmanagedchanged(tab) + if tab.mode == 'add' then + mod_xrandr.workspace_added(tab.sub); + end +end + +screen_managed_changed_hook = notioncore.get_hook('screen_managed_changed_hook') +if screen_managed_changed_hook then + screen_managed_changed_hook:add(mod_xrandr.screenmanagedchanged) +end + +post_layout_setup_hook = notioncore.get_hook('ioncore_post_layout_setup_hook') +post_layout_setup_hook:add(mod_xrandr.workspaces_added) + +function add_safe(t, key, value) + if t[key] == nil then + t[key] = {} + end + + table.insert(t[key], value) +end + +-- parameter: list of output names +-- returns: map from screen name to screen +function candidate_screens_for_output(max_screen_id, all_outputs, outputname) + local retval = {} + + function addIfContainsOutput(screen) + local outputs_within_screen = mod_xrandr.get_outputs_within(all_outputs, screen) + if screen:id() <= max_screen_id and outputs_within_screen[outputname] ~= nil then + retval[screen:name()] = screen + end + return true + end + notioncore.region_i(addIfContainsOutput, "WScreen") + + return retval +end + +-- parameter: maximum screen id, list of all output names, list of output names for which we want the screens +-- returns: map from screen name to screen +function candidate_screens_for_outputs(max_screen_id, all_outputs, outputnames) + local result = {} + + if outputnames == nil then return result end + + for i,outputname in pairs(outputnames) do + local screens = candidate_screens_for_output(max_screen_id, all_outputs, outputname) + for k,screen in pairs(screens) do + result[k] = screen; + end + end + return result; +end + +function firstValue(t) + local key, value = next(t) + return value +end + +function firstKey(t) + local key, value = next(t) + return key +end + +function empty(t) + return not next(t) +end + +function singleton(t) + local first = next(t) + return first and not next(t, first) +end + +function is_scratchpad(ws) + return package.loaded["mod_sp"] and mod_sp.is_scratchpad(ws) +end + +function find_scratchpad(screen) + local sp + screen:managed_i(function(ws) + if is_scratchpad(ws) then + sp=ws + return false + else + return true + end + end) + return sp +end + +function move_if_needed(workspace, screen_id) + local screen = notioncore.find_screen_id(screen_id) + + if workspace:screen_of() ~= screen then + if is_scratchpad(workspace) then + -- Moving a scratchpad to another screen is not meaningful, so instead we move + -- its content + local content={} + workspace:bottom():managed_i(function(reg) + table.insert(content, reg) + return true + end) + local sp=find_scratchpad(screen) + for _,reg in ipairs(content) do + sp:bottom():attach(reg) + end + return + end + + screen:attach(workspace) + end +end + +-- Arrange the workspaces over the first number_of_screens screens +function mod_xrandr.rearrangeworkspaces(max_screen_id) + -- for each screen id, which workspaces should be on that screen + new_mapping = {} + -- workspaces that want to be on an output that's currently not on any screen + orphans = {} + -- workspaces that want to be on multiple available outputs + wanderers = {} + + local all_outputs = mod_xrandr.get_all_outputs() + + -- When moving a "full screen workspace" to another screen, we seem to lose + -- its placeholder and thereby the possibility to return it from full + -- screen later. Let's therefore try to close any full screen workspace + -- before rearranging. + full_screen_workspaces={} + for_all_workspaces_do(function(ws) + if obj_is(ws, "WGroupCW") then table.insert(full_screen_workspaces, ws) + end + return true + end) + for _,ws in ipairs(full_screen_workspaces) do + ws:set_fullscreen("false") + end + + -- round one: divide workspaces in directly assignable, + -- orphans and wanderers + function roundone(workspace) + local screens = candidate_screens_for_outputs(max_screen_id, all_outputs, getInitialOutputs(workspace)) + if nilOrEmpty(screens) then + table.insert(orphans, workspace) + elseif singleton(screens) then + add_safe(new_mapping, firstValue(screens):id(), workspace) + else + wanderers[workspace] = screens + end + return true + end + for_all_workspaces_do(roundone) + + for workspace,screens in pairs(wanderers) do + -- TODO add to screen with least # of workspaces instead of just the + -- first one that applies + if screens[workspace:screen_of():name()] then + add_safe(new_mapping, workspace:screen_of():id(), workspace) + else + add_safe(new_mapping, firstValue(screens):id(), workspace) + end + end + for i,workspace in pairs(orphans) do + -- TODO add to screen with least # of workspaces instead of just the first one + add_safe(new_mapping, 0, workspace) + end + + for screen_id,workspaces in pairs(new_mapping) do + -- move workspace to that + for i,workspace in pairs(workspaces) do + move_if_needed(workspace, screen_id) + end + end +end + +-- refresh xinerama and rearrange workspaces on screen layout updates +function mod_xrandr.screenlayoutupdated() + notioncore.profiling_start('notion_xrandrrefresh.prof') + + local screens = mod_xinerama.query_screens() + if screens then + local merged_screens = mod_xinerama.merge_overlapping_screens(screens) + mod_xinerama.setup_screens(merged_screens) + end + + local max_screen_id = mod_xinerama.find_max_screen_id(screens); + mod_xrandr.rearrangeworkspaces(max_screen_id) + + if screens then + mod_xinerama.close_invisible_screens(max_screen_id) + end + + mod_xinerama.populate_empty_screens() + + notioncore.screens_updated(notioncore.rootwin()) + notioncore.profiling_stop() +end + +randr_screen_change_notify_hook = notioncore.get_hook('randr_screen_change_notify') + +if randr_screen_change_notify_hook then + randr_screen_change_notify_hook:add(mod_xrandr.screenlayoutupdated) +end diff --git a/.notion/look.lua b/.notion/look.lua new file mode 100644 index 0000000..6fd4371 --- /dev/null +++ b/.notion/look.lua @@ -0,0 +1 @@ +dopath('look_codevoid') diff --git a/.notion/look_codevoid.lua b/.notion/look_codevoid.lua new file mode 100644 index 0000000..16ee870 --- /dev/null +++ b/.notion/look_codevoid.lua @@ -0,0 +1,193 @@ +-- look_brownsteel.lua drawing engine configuration file for Notion. + +if not gr.select_engine("de") then return end + +de.reset() + +de.defstyle("*", { + shadow_colour = "#404040", + highlight_colour = "#707070", + background_colour = "#121212", + foreground_colour = "#FFA600", + padding_pixels = 1, + highlight_pixels = 1, + shadow_pixels = 1, + border_style = "elevated", + font = "-nil-profont-medium-r-normal---220-72-72-c-120-iso8859-1", + text_align = "center", +}) + +de.defstyle("frame", { + shadow_colour = "#404040", + highlight_colour = "#121212", + padding_colour = "#505050", + background_colour = "#000000", + foreground_colour = "#FFA600", + padding_pixels = 1, + highlight_pixels = 1, + shadow_pixels = 1, + spacing = 0, +}) + +de.defstyle("tab", { + de.substyle("active-selected", { + shadow_colour = "#1c1c1c", + highlight_colour = "#1c1c1c", + background_colour = "#242424", + foreground_colour = "#FFA600", + }), + de.substyle("active-unselected", { + shadow_colour = "#121212", + highlight_colour = "#121212", + background_colour = "#121212", + foreground_colour = "#6f6f6f", + }), + de.substyle("inactive-selected", { + shadow_colour = "#080808", + highlight_colour = "#181818", + background_colour = "#121212", + foreground_colour = "#804C00", + }), + -- de.substyle("inactive-unselected", { + shadow_colour = "#080808", + highlight_colour = "#080808", + background_colour = "#080808", + foreground_colour = "#4c4c4c", + -- }), + text_align = "center", +}) + + +de.defstyle("input", { + shadow_colour = "#404040", + highlight_colour = "#707070", + background_colour = "#1c1c1c", + foreground_colour = "#FFA600", + padding_pixels = 1, + highlight_pixels = 1, + shadow_pixels = 1, + border_style = "elevated", + de.substyle("*-cursor", { + background_colour = "#1c1c1c", + foreground_colour = "#FFA600", + }), + de.substyle("*-selection", { + background_colour = "#121212", + foreground_colour = "#ffffff", + }), +}) + +de.defstyle("input-menu", { + de.substyle("active", { + shadow_colour = "#304050", + highlight_colour = "#708090", + background_colour = "#1c1c1c", + foreground_colour = "#ffffff", + }), +}) + + +-- Common stdisp settings for the "emboss" styles + +de.defstyle("stdisp", { + shadow_pixels = 0, + highlight_pixels = 0, + text_align = "left", + + de.substyle("important", { + foreground_colour = "green", + }), + + de.substyle("critical", { + foreground_colour = "red", + }), +}) + +-- Common tab settings for the "emboss" styles + +de.defstyle("actnotify", { + shadow_colour = "#600808", + highlight_colour = "#c04040", + background_colour = "#b03030", + foreground_colour = "#ffffff", +}) + +de.defstyle("tab-frame", { + -- TODO: some kind of amend option. It should not be necessary to + -- duplicate this definition for both tab-frame and tab-menuentry, + -- or for each style, nor use more complex hacks to communicate + -- this stuff otherwise. + de.substyle("*-*-*-unselected-activity", { + shadow_colour = "#600808", + highlight_colour = "#c04040", + background_colour = "#901010", + foreground_colour = "#eeeeee", + }), + + de.substyle("*-*-*-selected-activity", { + shadow_colour = "#600808", + highlight_colour = "#c04040", + background_colour = "#b03030", + foreground_colour = "#ffffff", + }), + + de.substyle("*-*-*-tabnumber", { + background_colour = "black", + foreground_colour = "green", + }), +}) + +de.defstyle("tab-frame-tiled", { + spacing = 0, +}) + +de.defstyle("tab-menuentry", { + text_align = "left", + highlight_pixels = 0, + shadow_pixels = 0, + + de.substyle("*-*-*-unselected-activity", { + shadow_colour = "#600808", + highlight_colour = "#c04040", + background_colour = "#901010", + foreground_colour = "#eeeeee", + }), + + de.substyle("*-*-*-selected-activity", { + shadow_colour = "#600808", + highlight_colour = "#c04040", + background_colour = "#b03030", + foreground_colour = "#ffffff", + }), +}) + +de.defstyle("tab-menuentry-big", { + padding_pixels = 7, +}) + +de.defstyle("frame-tiled", { + border_style = "inlaid", + padding_pixels = 0, + spacing = 0, +}) + +de.defstyle("frame-floating", { + border_style = "ridge", + bar = "shaped" +}) + +de.defstyle("frame-tiled-alt", { + bar = "none", +}) + +de.defstyle("dock", { + border = 7, + outline_style = "each", + tile_size = { + width = "640", + height= "800", + }, +}) + +gr.refresh() + diff --git a/.notion/look_huf.lua b/.notion/look_huf.lua new file mode 100644 index 0000000..ffbc1bc --- /dev/null +++ b/.notion/look_huf.lua @@ -0,0 +1,197 @@ +-- look_clean.lua drawing engine configuration file for Ion. + +if not gr.select_engine("de") then return end + +de.reset() + +de.defstyle("*", { + shadow_colour = "#233340", + highlight_colour = "#233340", + background_colour = "#233340", + foreground_colour = "grey", + padding_pixels = 0, + highlight_pixels = 1, + shadow_pixels = 1, + border_style = "elevated", + font = "-misc-fixed-medium-r-*-*-13-*-*-*-*-60-*-*", + text_align = "center", +}) +de.defstyle("tab", { + font = "-misc-fixed-medium-r-*-*-13-*-*-*-*-60-*-*", + + de.substyle("*", { + shadow_colour = "grey15", + highlight_colour = "grey15", + background_colour = "black", + foreground_colour = "grey50", + }), + + de.substyle("active-selected", { + shadow_colour = "#233340", + highlight_colour = "#233340", + background_colour = "#233340", + foreground_colour = "grey90", + }), + + de.substyle("active-unselected", { + shadow_colour = "grey15", + highlight_colour = "grey15", + background_colour = "grey15", + foreground_colour = "grey", + }), + + de.substyle("inactive-selected", { + shadow_colour = "#2A3D4D", + highlight_colour = "#2A3D4D", + background_colour = "black", + foreground_colour = "grey70", + }), + + de.substyle("inactive-unselected", { + shadow_colour = "grey15", + highlight_colour = "grey15", + background_colour = "black", + foreground_colour = "grey50", + }), + + text_align = "center", +}) + +de.defstyle("input", { + foreground_colour = "white", + de.substyle("*-cursor", { + background_colour = "white", + foreground_colour = "#405d75", + }), + de.substyle("*-selection", { + background_colour = "#aaaaaa", + foreground_colour = "black", + }), + font = "-misc-fixed-medium-r-*-*-13-*-*-*-*-60-*-*", +}) + + +-- Common settings for the "clean" styles + +de.defstyle("frame", { + background_colour = "#000000", + + de.substyle("active", { + -- Something detached from the frame is active +-- padding_colour = "#314759", + --padding_colour = "#233340", + padding_colour = "grey40", + }), + de.substyle("quasiactive", { + -- Something detached from the frame is active +-- padding_colour = "#FF0000", // XXX ask tuomo about this, how to make it work in reverse? + padding_colour = "#233340", + }), + de.substyle("userattr1", { + -- For user scripts + padding_colour = "#009010", + }), + padding_pixels = 1, +}) + +de.defstyle("frame-tiled", { + shadow_pixels = 0, + highlight_pixels = 0, + spacing = 1, +}) + +de.defstyle("frame-tiled-alt", { + bar = "none", +}) + +de.defstyle("frame-floating", { + bar = "shaped", + padding_pixels = 0, +}) + +de.defstyle("frame-transient", { + bar = "none", + padding_pixels = 0, +}) + + +de.defstyle("actnotify", { + shadow_colour = "#c04040", + highlight_colour = "#c04040", + background_colour = "#901010", + foreground_colour = "#eeeeee", +}) + +de.defstyle("tab", { + de.substyle("*-*-*-unselected-activity", { + shadow_colour = "#c04040", + highlight_colour = "#c04040", + background_colour = "#901010", + foreground_colour = "#eeeeee", + }), + + de.substyle("*-*-*-selected-activity", { + shadow_colour = "#c04040", + highlight_colour = "#c04040", + background_colour = "#b03030", + foreground_colour = "#ffffff", + }), + + de.substyle("*-*-*-tabnumber", { + background_colour = "black", + foreground_colour = "green", + }), +}) + +de.defstyle("tab-frame", { + spacing = 1, +}) + +de.defstyle("tab-frame-floating", { + spacing = 0, +}) + +de.defstyle("tab-menuentry", { + text_align = "left", + de.substyle("inactive-selected", { + background_colour = "#233340", + }), +}) + +de.defstyle("tab-menuentry-big", { + font = "-*-helvetica-medium-r-normal-*-17-*-*-*-*-*-*-*", + padding_pixels = 7, +}) + + +de.defstyle("stdisp", { + shadow_pixels = 0, + highlight_pixels = 0, + text_align = "left", + background_colour = "#000000", + foreground_colour = "grey", + font="-misc-fixed-medium-r-*-*-13-*-*-*-*-60-*-*", + + de.substyle("important", { + foreground_colour = "green", + }), + + de.substyle("critical", { + foreground_colour = "red", + }), + + de.substyle("separator", { + -- foreground_colour = "#405d75", + foreground_colour = "blue", + -- foreground_colour = "#8a999e", + }), +}) + +de.defstyle("tab-menuentry-big", { + padding_pixels = 7, + font = "-misc-fixed-medium-r-*-*-18-*-*-*-*-*-*-*", +}) + +gr.refresh() + + diff --git a/.notion/mod_float-sb.lua b/.notion/mod_float-sb.lua new file mode 100644 index 0000000..fc6d0fb --- /dev/null +++ b/.notion/mod_float-sb.lua @@ -0,0 +1,26 @@ +-- Authors: Unknown +-- License: Unknown +-- Last Changed: Unknown +-- +-- Example of floating toggleable statusbar +-- + +local floatsbscr=ioncore.find_screen_id(0) +local floatsb + +floatsb=floatsbscr:attach_new{ + type="WStatusBar", + unnumbered=true, + sizepolicy='southwest', + template='%workspace_pager', + passive=true, + level=2 +} + +local function toggle_floatsb() + floatsbscr:set_hidden(floatsb, 'toggle') +end + +ioncore.defbindings("WScreen", { + kpress(META.."B", toggle_floatsb) +}) diff --git a/.notion/save_statusbar.lua b/.notion/save_statusbar.lua new file mode 100644 index 0000000..203849a --- /dev/null +++ b/.notion/save_statusbar.lua @@ -0,0 +1,11 @@ +ctrl_statusbar.save = { +active = { +"%date", +"load:% %>load", +}, +inactive = { +"battery: %battery", +"%workspace_pager", +"net:% %>netmon", +} +} \ No newline at end of file diff --git a/.notion/shellbar.sh b/.notion/shellbar.sh new file mode 100755 index 0000000..8db5cfd --- /dev/null +++ b/.notion/shellbar.sh @@ -0,0 +1,15 @@ +#!/bin/ksh +set -A _SYSV -- $(sysctl -n hw.sensors.cpu0.temp0 \ + hw.sensors.acpithinkpad0.fan0 \ + hw.cpuspeed \ + | cut -d" " -f1) + +TEMP="$(sysctl -n hw.sensors.cpu{0,1,2,3,4,5,6,7,8,9,10,11}.frequency0 \ + | cut -d. -f1 | sort)" + +AVG="$(printf '(%s)/12' "$TEMP" | tr '\n' '+')" + +out() { printf '%s/1000/1000\n' "$1" | bc; } + +printf " %s%% | %2s°C | %4sRPM | %4sMhz (~%4sMhz) |" \ + "$(apm -l)" "${_SYSV[0]}" "${_SYSV[1]}" "${_SYSV[2]}" "$(out $AVG)" diff --git a/.notion/statusbar_workspace.lua b/.notion/statusbar_workspace.lua new file mode 100644 index 0000000..2c5eebf --- /dev/null +++ b/.notion/statusbar_workspace.lua @@ -0,0 +1,117 @@ +-- Authors: Rico Schiekel , Canaan Hadley-Voth, Kevin Granade +-- License: Unknown +-- Last Changed: 2007-05-09 +-- +-- statusbar_workspace.lua +-- +-- Show current workspace name or number in the statusbar. +-- +-- Put any of these in cfg_statusbar.lua's template-line: +-- %workspace_name +-- %workspace_frame +-- %workspace_pager +-- %workspace_name_pager +-- %workspace_num_name_pager +-- +-- This is an internal statusbar monitor and does NOT require +-- a dopath statement (effective after a 2006-02-12 build). +-- +-- version 1 +-- author: Rico Schiekel +-- +-- version 2 +-- added 2006-02-14 by Canaan Hadley-Voth: +-- * %workspace_pager shows a list of workspace numbers +-- with the current one indicated: +-- +-- 1i 2i [3f] 4p 5c +-- +-- i=WIonWS, f=WFloatWS, p=WPaneWS, c=WClientWin/other +-- +-- * %workspace_frame - name of the active frame. +-- +-- * Added statusbar_ to the filename (since it *is* +-- an internal statusbar monitor) so that it works without +-- a "dopath" call. +-- +-- * Removed timer. Only needs to run on hook. +-- Much faster this way. +-- +-- version 3 +-- update for ion-3rc-20070506 on 2007-05-09 +-- by Kevin Granade +-- +-- Updated to use new wx_ api +-- Replaced region_activated_hook with region_notify_hook +-- Added %workspace_name_pager, which works similarly to %workspace_pager, +-- but instead displays the name of each workspace +-- Added display for WGroupWS to %workspace_pager, displayed as 'g' +-- + +local function update_frame() + local fr + ioncore.defer( function() + fr=ioncore.current():name() + mod_statusbar.inform('workspace_frame', fr) + mod_statusbar.update() + end) +end + +local function update_workspace() + local scr=ioncore.find_screen_id(0) + local curws = scr:mx_current() + local wstype, c + local pager="" + local name_pager="" + local name_pager_plus="" + local curindex = scr:get_index(curws)+1 + n = scr:mx_count(1) + for i=1,n do + tmpws=scr:mx_nth(i-1) + wstype=obj_typename(tmpws) + if wstype=="WIonWS" then + c="-I" + elseif wstype=="WFloatWS" then + c="-FL" + elseif wstype=="WPaneWS" then + c="-PA" + elseif wstype=="WGroupWS" then + c="" + else + c="-FS" + end + if i==curindex then + name_pager_plus=name_pager_plus.." ["..tmpws:name().."]" + name_pager=name_pager.." "..tmpws:name().." " + pager=pager.."["..(i)..c.."]" + else + name_pager_plus=name_pager_plus.." "..(i)..":"..tmpws:name() + name_pager=name_pager.." "..tmpws:name() + pager=pager.." "..(i)..c.." " + end + end + + local fr,cur + + -- Older versions without an ioncore.current() should + -- skip update_frame. + -- update_frame() + + ioncore.defer( function() + mod_statusbar.inform('workspace_pager', pager) + -- mod_statusbar.inform('workspace_name', curws:name()) + -- mod_statusbar.inform('workspace_name_pager', name_pager) + -- mod_statusbar.inform('workspace_num_name_pager', name_pager_plus) + mod_statusbar.update() + end) +end + +local function update_workspace_wrap(reg, how) +-- if how ~= "name" then +-- return +-- end + update_workspace() +end + +ioncore.get_hook("region_notify_hook"):add(update_workspace_wrap) +ioncore.get_hook("screen_managed_changed_hook"):add(update_workspace) diff --git a/.notion/statusd_shellbar.lua b/.notion/statusd_shellbar.lua new file mode 100644 index 0000000..a4e66a2 --- /dev/null +++ b/.notion/statusd_shellbar.lua @@ -0,0 +1,21 @@ +function get_shell(cmd) + local handle = io.popen(cmd, 'r') + if not handle then + return "could not open shellbar.sh" + end + local result, error = handle:read('*a') + handle:close() + if not result then + return "(" .. error .. ")" -- chance of interrupted system call + end + return result +end + +local timer = statusd.create_timer() + +local function update() + statusd.inform("shellbar", get_shell('/home/sdk/.notion/shellbar.sh')) + timer:set(5000, update) +end + +update()