vincentbernat.i3wm-configur.../rc/bindings.lua
Vincent Bernat 315f902728 bindings: use own screen_focus function that do not move the mouse after focusing the client
This allows a signal to put the mouse in the upper left corner of a
newly focused window on another screen.
2012-07-25 12:27:50 +02:00

212 lines
7.3 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") .. ".jpg"
awful.util.spawn("import -quality 95 -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 t.selected and
awful.util.table.hasitem(cl:tags(), t) then
awful.client.toggletag(t, cl)
table.remove(undo, i)
return
end
i = i - 1
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)
-- Focus a relative screen (similar to `awful.screen.focus_relative`)
local function screen_focus(i)
local s = awful.util.cycle(screen.count(), mouse.screen + i)
local c = awful.client.focus.history.get(s, 0)
mouse.screen = s
if c then client.focus = c end
end
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 ()
screen_focus( 1)
end,
"Jump to next screen"),
awful.key({ modkey, "Control" }, "k", function ()
screen_focus(-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))