module(..., package.seeall) local awful = require 'awful' local djas = require 'djas' local shifty = require 'shifty' local tjoin = awful.util.table.join local keyjoiner_methods = {} function keyjoiner_methods:oldact(mods, key, action) if (mods ~= nil) then self.keys = tjoin(self.keys, awful.key(mods, key, action)) end return self.keys end function keyjoiner_methods:act(key, action) if key ~= nil then assert(action, "Unable to act if there's no action") local mods = {} local _ local map = { C = "Control", S = "Shift", A = "Mod1", M = self.modkey, } while key:match("^[CSMA]%-") do _, _, prefix, key = key:find("^(.)%-(.+)$") mods[#mods+1] = map[prefix] end if key:match("^[0-9]$") then key = tonumber(key) end self.keys = tjoin(self.keys, awful.key(mods, key, action)) end return self.keys end local keyjoiner_meta = { __index = keyjoiner_methods, __call = keyjoiner_methods.oldact, } function keyjoiner_new(modkey) return setmetatable({modkey = modkey, keys={}}, keyjoiner_meta) end function clientkeys(modkey) local lockeys = keyjoiner_new(modkey) lockeys:act("C-S-A-Left", djas.warpprev) lockeys:act("C-S-A-Right", djas.warpnext) lockeys:act("M-f", function (c) c.fullscreen = not c.fullscreen end) lockeys:act("A-F4", function(c) c:kill() end) lockeys:act("M-C-space", awful.client.floating.toggle) lockeys:act("C-M-Return", function (c) c:swap(awful.client.getmaster()) end) lockeys:act("M-o", awful.client.movetoscreen) lockeys:act("C-S-A-Up", awful.client.movetoscreen) lockeys:act("C-S-A-Down", awful.client.movetoscreen) lockeys:act("M-t", function (c) c.ontop = not c.ontop end) do local function maximiser (c) c.maximized_horizontal = not c.maximized_horizontal c.maximized_vertical = not c.maximized_vertical end lockeys:act("M-m", maximiser) lockeys:act("C-S-F11", maximiser) end return lockeys() end local function speshulterminal(t,e) awful.util.spawn("gnome-terminal --role " .. t .. " --title " .. t .. " -e " .. e, false) end function globalkeys(modkey,mypromptbox) local globkeys = keyjoiner_new(modkey) globkeys:act("C-A-M-m", function() speshulterminal("Mutt", "mutt") speshulterminal("OfflineIMAP", "offlineimap") end) globkeys:act("C-A-Left", awful.tag.viewprev) globkeys:act("C-A-Right", awful.tag.viewnext) globkeys:act("C-M-Left", shifty.shift_prev) globkeys:act("C-M-Right", shifty.shift_next) globkeys:act("M-t", function() shifty.add({ rel_index = 1 }) end) globkeys:act("C-M-t", function() shifty.add({ rel_index = 1, nopopup = true }) end) globkeys:act("M-r", shifty.rename) globkeys:act("M-w", shifty.del) globkeys:act("M-Escape", awful.tag.history.restore) globkeys:act("M-j", function () awful.client.focus.byidx( 1) if client.focus then client.focus:raise() end end) globkeys:act("M-k", function () awful.client.focus.byidx(-1) if client.focus then client.focus:raise() end end) globkeys:act("M-Menu", function () mymainmenu:show({keygrabber=true}) end) -- Layout manipulation globkeys:act("M-S-j", function () awful.client.swap.byidx( 1) end) globkeys:act("M-S-k", function () awful.client.swap.byidx( -1) end) globkeys:act("M-C-j", function () awful.screen.focus_relative( 1) end) globkeys:act("M-C-k", function () awful.screen.focus_relative(-1) end) globkeys:act("C-A-Up", function () awful.screen.focus_relative( 1) end) globkeys:act("C-A-Down", function () awful.screen.focus_relative(-1) end) globkeys:act("M-u", awful.client.urgent.jumpto) globkeys:act("M-Tab", function () awful.client.focus.history.previous() if client.focus then client.focus:raise() end end) -- Standard program globkeys:act("M-x", function () awful.util.spawn(terminal) end) globkeys:act("M-C-r", awesome.restart) globkeys:act("M-C-n", awful.client.restore) -- Prompt globkeys:act("A-F2", function () mypromptbox[mouse.screen]:run() end) globkeys:act("M-C-x", function () awful.prompt.run({ prompt = "Run Lua code: " }, mypromptbox[mouse.screen].widget, awful.util.eval, nil, awful.util.getdir("cache") .. "/history_eval") end) -- Tag switching for i=1,9 do local function si(p) return p .. "-" .. tostring(i) end globkeys:act(si "M", function () local t = awful.tag.viewonly(shifty.getpos(i)) end) globkeys:act(si "M-C", function () local t = shifty.getpos(i) t.selected = not t.selected end) globkeys:act(si "M-C-S", function () if client.focus then awful.client.toggletag(shifty.getpos(i)) end end) -- move clients to other tags globkeys:act(si "M-S", function () if client.focus then local t = shifty.getpos(i) awful.client.movetotag(t) awful.tag.viewonly(t) end end) end return globkeys() end