mirror of
https://github.com/vincentbernat/i3wm-configuration.git
synced 2025-06-23 18:28:34 +02:00
Moreover, we define a more generic function to toggle a window that can be used for windows with urgency hint or for any group of windows. The undo stack will skip windows that cannnot be restored yet (not visible) and will be cleaned up if it becomes too large.
195 lines
7 KiB
Lua
195 lines
7 KiB
Lua
config.keys = {}
|
|
config.mouse = {}
|
|
local volume = loadrc("volume", "vbe/volume")
|
|
local brightness = loadrc("brightness", "vbe/brightness")
|
|
local keydoc = loadrc("keydoc", "vbe/keydoc")
|
|
local sharetags = loadrc("sharetags", "vbe/sharetags")
|
|
|
|
local function screenshot(client)
|
|
if not client then
|
|
client = "root"
|
|
else
|
|
client = client.window
|
|
end
|
|
local path = awful.util.getdir("config") .. "/screenshots/" ..
|
|
"screenshot-" .. os.date("%Y-%m-%d--%H:%M:%S") .. ".png"
|
|
awful.util.spawn("import -window " .. client .. " " .. path, false)
|
|
end
|
|
|
|
|
|
-- Function to toggle a given window to the currently selected and
|
|
-- focused tag. We need a filter. This function can be used to focus a
|
|
-- particular window. When the filter is unable to select something,
|
|
-- we undo previous actions (hence "toggle"). This function returns a
|
|
-- function that will effectively toggle things.
|
|
local function toggle_window(filter)
|
|
local undo = {} -- undo stack
|
|
local toggle = function()
|
|
-- "Current" screen
|
|
local s = client.focus and client.focus.screen or mouse.screen
|
|
local cl = filter() -- Client to toggle
|
|
if cl and client.focus ~= cl then
|
|
-- So, we have a client.
|
|
if not cl:isvisible() then
|
|
-- But it is not visible. So we will add it to the current
|
|
-- tag of the current screen.
|
|
local t = assert(awful.tag.selected(s))
|
|
-- Before adding the tag to the client, we should ensure it
|
|
-- is on the same screen.
|
|
if s ~= cl.screen then
|
|
sharetags.tag_move(cl:tags()[1], s)
|
|
end
|
|
-- Add our tag to the client
|
|
undo[#undo + 1] = { cl, t }
|
|
awful.client.toggletag(t, cl)
|
|
end
|
|
|
|
-- Focus and raise the client
|
|
if s ~= cl.screen then
|
|
mouse.screen = cl.screen
|
|
end
|
|
client.focus = cl
|
|
cl:raise()
|
|
else
|
|
-- OK, we need to restore the previously pushed window to its
|
|
-- original state.
|
|
local i = #undo
|
|
while i > 0 do
|
|
local cl, t = unpack(undo[i])
|
|
-- We only handle visible clients that are attached to the
|
|
-- appropriate tag. Otherwise, we try the next one.
|
|
if cl and cl:isvisible() and
|
|
awful.util.table.hasitem(cl:tags(), t) then
|
|
awful.client.toggletag(t, cl)
|
|
table.remove(undo, i)
|
|
return
|
|
end
|
|
end
|
|
-- Clean up...
|
|
while #undo > 10 do
|
|
table.remove(undo, 1)
|
|
end
|
|
end
|
|
end
|
|
return toggle
|
|
end
|
|
|
|
-- Toggle pidgin conversation window
|
|
local toggle_pidgin = toggle_window(
|
|
function ()
|
|
return awful.client.cycle(function(c)
|
|
return awful.rules.match(c, { class = "Pidgin",
|
|
role = "conversation" })
|
|
end)()
|
|
end)
|
|
|
|
-- Toggle urgent window
|
|
local toggle_urgent = toggle_window(awful.client.urgent.get)
|
|
|
|
config.keys.global = awful.util.table.join(
|
|
keydoc.group("Focus"),
|
|
awful.key({ modkey, }, "j",
|
|
function ()
|
|
awful.client.focus.byidx( 1)
|
|
if client.focus then client.focus:raise() end
|
|
end,
|
|
"Focus next window"),
|
|
awful.key({ modkey, }, "k",
|
|
function ()
|
|
awful.client.focus.byidx(-1)
|
|
if client.focus then client.focus:raise() end
|
|
end,
|
|
"Focus previous window"),
|
|
awful.key({ modkey, }, "Tab",
|
|
function ()
|
|
awful.client.focus.history.previous()
|
|
if client.focus then
|
|
client.focus:raise()
|
|
end
|
|
end,
|
|
"Focus previously focused window"),
|
|
awful.key({ modkey, }, "u", toggle_pidgin,
|
|
"Toggle Pidgin conversation window"),
|
|
awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end,
|
|
"Jump to next screen"),
|
|
awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end),
|
|
|
|
keydoc.group("Layout manipulation"),
|
|
awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end,
|
|
"Increase master-width factor"),
|
|
awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end,
|
|
"Decrease master-width factor"),
|
|
awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster( 1) end,
|
|
"Increase number of masters"),
|
|
awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster(-1) end,
|
|
"Decrease number of masters"),
|
|
awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol( 1) end,
|
|
"Increase number of columns"),
|
|
awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol(-1) end,
|
|
"Decrease number of columns"),
|
|
awful.key({ modkey, }, "space", function () awful.layout.inc(config.layouts, 1) end,
|
|
"Next layout"),
|
|
awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(config.layouts, -1) end,
|
|
"Previous layout"),
|
|
awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end,
|
|
"Swap with next window"),
|
|
awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end,
|
|
"Swap with previous window"),
|
|
|
|
keydoc.group("Misc"),
|
|
|
|
-- Spawn a terminal
|
|
awful.key({ modkey, }, "Return", function () awful.util.spawn(config.terminal) end,
|
|
"Spawn a terminal"),
|
|
|
|
-- Screenshot
|
|
awful.key({}, "Print", screenshot, "Screenshot"),
|
|
|
|
-- Restart awesome
|
|
awful.key({ modkey, "Control" }, "r", awesome.restart, "Restart awesome"),
|
|
|
|
-- Multimedia keys
|
|
awful.key({ }, "XF86MonBrightnessUp", brightness.increase),
|
|
awful.key({ }, "XF86MonBrightnessDown", brightness.decrease),
|
|
awful.key({ }, "XF86AudioRaiseVolume", volume.increase),
|
|
awful.key({ }, "XF86AudioLowerVolume", volume.decrease),
|
|
awful.key({ }, "XF86AudioMute", volume.toggle),
|
|
|
|
-- Help
|
|
awful.key({ modkey, }, "F1", keydoc.display)
|
|
)
|
|
|
|
config.keys.client = awful.util.table.join(
|
|
keydoc.group("Window-specific bindings"),
|
|
awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end,
|
|
"Fullscreen"),
|
|
awful.key({ modkey, }, "x", function (c) c:kill() end,
|
|
"Close"),
|
|
awful.key({ modkey, }, "o", awful.client.movetoscreen, "Move to the other screen"),
|
|
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle, "Toggle floating"),
|
|
awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end,
|
|
"Switch with master window"),
|
|
awful.key({ modkey, }, "t", function (c) c:raise() end,
|
|
"Raise window"),
|
|
awful.key({ modkey, }, "s", function (c) c.sticky = not c.sticky end,
|
|
"Stick window"),
|
|
awful.key({ modkey, }, "i", dbg,
|
|
"Get client-related information"),
|
|
awful.key({ modkey, }, "m",
|
|
function (c)
|
|
c.maximized_horizontal = not c.maximized_horizontal
|
|
c.maximized_vertical = not c.maximized_vertical
|
|
end,
|
|
"Maximize"),
|
|
|
|
|
|
-- Screenshot
|
|
awful.key({ modkey }, "Print", screenshot, "Screenshot")
|
|
)
|
|
|
|
keydoc.group("Misc")
|
|
|
|
config.mouse.client = awful.util.table.join(
|
|
awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
|
|
awful.button({ modkey }, 1, awful.mouse.client.move),
|
|
awful.button({ modkey }, 3, awful.mouse.client.resize))
|