parent
b0cd2fe369
commit
83b82ffc4b
@ -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')"), |
||||
}) |
@ -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$<...") |
@ -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", |
||||
}, |
||||
} |
||||
|
@ -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)) |
@ -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(_)"), |
||||
}) |
||||
|
@ -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") |
@ -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(_)"), |
||||
}) |
@ -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(_)"), |
||||
}) |
@ -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')"), |
||||
}) |
||||
|
@ -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', }, |
||||
-- } |
@ -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(_)"), |
||||
}) |
||||
|
@ -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 |
@ -0,0 +1 @@ |
||||
dopath('look_codevoid') |
@ -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", { |
||||