diff options
Diffstat (limited to 'rc.lua')
-rw-r--r-- | rc.lua | 881 |
1 files changed, 881 insertions, 0 deletions
@@ -0,0 +1,881 @@ +-- {{{ Header +-- +-- Awesome configuration file, using awesome 3.3.3 on Arch GNU/Linux. +-- * Adrian C. <anrxc_at_sysphere_org> + +-- Updated on: Aug 27, 04:27:20 CEST 2009 +-- Screenshot: http://sysphere.org/gallery/snapshots + +-- FAQ: +-- 1. Statusbar widgets created with Vicious: +-- - http://git.sysphere.org/vicious + +-- 2. Why is there no Menu or a Taskbar in your config? +-- Everything is done with the keyboard. + +-- 3. Why these colors? +-- It's Zenburn. Awesome, Emacs, Urxvt, Alpine... all use these colors. +-- - http://slinky.imukuppi.org/zenburnpage/ + +-- 3a. My .Xdefaults can be found here: +-- - http://git.sysphere.org/dotfiles + +-- 4. Fonts used on my desktop: +-- Terminus : http://www.is-vn.bg/hamster +-- Profont : http://www.tobias-jung.de/seekingprofont + +-- This work is licensed under the Creative Commons Attribution-Share Alike License. +-- To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ +-- }}} + + +-- {{{ Libraries +require("awful") +require("beautiful") +-- User libraries +require("vicious") +require("teardrop") +-- }}} + + +-- {{{ Variable definitions +-- +-- Zenburn theme +beautiful.init(awful.util.getdir("config") .. "/zenburn.lua") + +-- Modifier keys +altkey = "Mod1" -- Alt_L +modkey = "Mod4" -- Super_L + +-- Window titlebars +use_titlebar = false -- True for floaters (arrange hook) + +-- Window management layouts +layouts = { + awful.layout.suit.tile, -- 1 + awful.layout.suit.tile.left, -- 2 + awful.layout.suit.tile.bottom, -- 3 + awful.layout.suit.tile.top, -- 4 + awful.layout.suit.fair, -- 5 + awful.layout.suit.fair.horizontal, -- 6 + awful.layout.suit.max, -- 7 +-- awful.layout.suit.max.fullscreen, -- / + awful.layout.suit.magnifier, -- 8 + awful.layout.suit.floating -- 9 +} + +-- Application specific behaviour +apprules = { +-- cls = class, ins = instance, name, scr = screen, tag, float + { cls = "Gajim.py", scr = 1, tag = 5 }, + { cls = "Knode", scr = 1, tag = 8 }, + { cls = "Akregator", scr = 1, tag = 8 }, + { cls = "Amarok", scr = 1, tag = 9 }, + { cls = "Amarokapp", scr = 1, tag = 9 }, + { cls = "Gimp", scr = 1, tag = 9 }, + { name = "Alpine", scr = 1, tag = 4 }, + { ins = "uTorrent.exe", scr = screen.count(), tag = 9 }, + { cls = "Emacs", scr = screen.count(), tag = 2 }, + { cls = "Firefox", scr = screen.count(), tag = 3 }, + { cls = "Firefox", ins = "Download", float = true }, + { cls = "Firefox", ins = "Places", float = true }, + { cls = "Firefox", ins = "Greasemonkey", float = true }, + { cls = "Firefox", ins = "Extension", float = true }, + { cls = "Firefox", ins = "Scrapbook", float = true }, + { cls = "Emacs", ins = "_Remember_", float = true }, + { cls = "Xmag", ins = "xmag", float = true }, + { cls = "Xmessage", ins = "xmessage", float = true }, + { cls = "ROX-Filer", float = true }, + { cls = "Ark", float = true }, + { cls = "Kgpg", float = true }, + { cls = "Kmix", float = true }, + { cls = "Geeqie", float = true }, + { cls = "Smplayer", float = true }, + { cls = "xine", float = true }, + { name = "VLC media player", float = true }, + { name = "pinentry-gtk-2", float = true }, +} +-- }}} + + +-- {{{ Tags +-- +-- Define tags table +tags = {} +tags.settings = { + { name = "term", layout = layouts[2] }, + { name = "emacs", layout = layouts[1] }, + { name = "web", layout = layouts[1] }, + { name = "mail", layout = layouts[7] }, + { name = "im", layout = layouts[1], mwfact = 0.13 }, + { name = "6", layout = layouts[9] }, + { name = "7", layout = layouts[9] }, + { name = "rss", layout = layouts[8] }, + { name = "media", layout = layouts[9] } +} + +-- Initialize tags +for s = 1, screen.count() do + tags[s] = {} + for i, v in ipairs(tags.settings) do + tags[s][i] = tag(v.name) + tags[s][i].screen = s + awful.tag.setproperty(tags[s][i], "layout", v.layout) + awful.tag.setproperty(tags[s][i], "mwfact", v.mwfact) + end + tags[s][1].selected = true +end +-- }}} + + +-- {{{ Wibox +-- +-- {{{ Widgets configuration +-- +-- {{{ Reusable separators +myspacer = widget({ type = "textbox", name = "myspacer", align = "right" }) +myseparator = widget({ type = "textbox", name = "myseparator", align = "right" }) +myspacer.text = " " +myseparator.text = "|" +-- }}} + +-- {{{ CPU usage graph and temperature +-- Widget icon +mycpuicon = widget({ type = "imagebox", name = "mycpuicon", align = "right" }) +mycpuicon.image = image(beautiful.widget_cpu) +-- Initialize widgets +mythermalwidget = widget({ type = "textbox", name = "mythermalwidget", align = "right" }) +mycpuwidget = widget({ type = "graph", name = "mycpuwidget", align = "right" }) +-- CPU graph properties +mycpuwidget.width = 50 +mycpuwidget.height = 0.90 +mycpuwidget.grow = "left" +mycpuwidget.bg = beautiful.fg_off_widget +mycpuwidget.border_color = beautiful.border_widget +mycpuwidget:plot_properties_set("cpu", { + fg = beautiful.fg_widget, + fg_center = beautiful.fg_center_widget, + fg_end = beautiful.fg_end_widget, + vertical_gradient = false }) +-- Register widgets +vicious.register(mycpuwidget, vicious.widgets.cpu, "$1", 2, "cpu") +vicious.register(mythermalwidget, vicious.widgets.thermal, "$1°C", 60, nil, "TZS0") +-- }}} + +-- {{{ Battery percentage and state indicator +-- Widget icon +mybaticon = widget({ type = "imagebox", name = "mybaticon", align = "right" }) +mybaticon.image = image(beautiful.widget_bat) +-- Initialize widget +mybatwidget = widget({ type = "textbox", name = "mybatwidget", align = "right" }) +-- Register widget +vicious.register(mybatwidget, vicious.widgets.bat, "$1$2%", 60, nil, "BAT0") +-- }}} + +-- {{{ Memory usage bar +-- Widget icon +mymemicon = widget({ type = "imagebox", name = "mymemicon", align = "right" }) +mymemicon.image = image(beautiful.widget_mem) +-- Initialize widget +mymemwidget = widget({ type = "progressbar", name = "mymemwidget", align = "right" }) +-- MEM progressbar properties +mymemwidget.width = 10 +mymemwidget.height = 0.9 +mymemwidget.gap = 0 +mymemwidget.border_padding = 1 +mymemwidget.border_width = 0 +mymemwidget.ticks_count = 4 +mymemwidget.ticks_gap = 1 +mymemwidget.vertical = true +mymemwidget:bar_properties_set("mem", { + bg = beautiful.bg_widget, + fg = beautiful.fg_widget, + fg_center = beautiful.fg_center_widget, + fg_end = beautiful.fg_end_widget, + fg_off = beautiful.fg_off_widget, + min_value = 0, + max_value = 100 }) +-- Register widget +vicious.register(mymemwidget, vicious.widgets.mem, "$1", 60, "mem") +-- }}} + +-- {{{ File system usage bars +-- Widget icon +myfsicon = widget({ type = "imagebox", name = "myfsicon", align = "right" }) +myfsicon.image = image(beautiful.widget_fs) +-- Initialize widget +myfswidget = widget({ type = "progressbar", name = "myfswidget", align = "right" }) +-- FS progressbar properties +myfswidget.width = 20 +myfswidget.height = 0.9 +myfswidget.gap = 1 +myfswidget.border_padding = 1 +myfswidget.border_width = 0 +myfswidget.ticks_count = 4 +myfswidget.ticks_gap = 1 +myfswidget.vertical = true +myfswidget:bar_properties_set("rootfs", { + bg = beautiful.bg_widget, + fg = beautiful.fg_widget, + fg_center = beautiful.fg_center_widget, + fg_end = beautiful.fg_end_widget, + fg_off = beautiful.fg_off_widget, + min_value = 0, + max_value = 100 }) +myfswidget:bar_properties_set("homefs", { + bg = beautiful.bg_widget, + fg = beautiful.fg_widget, + fg_center = beautiful.fg_center_widget, + fg_end = beautiful.fg_end_widget, + fg_off = beautiful.fg_off_widget, + min_value = 0, + max_value = 100 }) +myfswidget:bar_properties_set("storagefs", { + bg = beautiful.bg_widget, + fg = beautiful.fg_widget, + fg_center = beautiful.fg_center_widget, + fg_end = beautiful.fg_end_widget, + fg_off = beautiful.fg_off_widget, + min_value = 0, + max_value = 100 }) +myfswidget:bar_properties_set("backupfs", { + bg = beautiful.bg_widget, + fg = beautiful.fg_widget, + fg_center = beautiful.fg_center_widget, + fg_end = beautiful.fg_end_widget, + fg_off = beautiful.fg_off_widget, + min_value = 0, + max_value = 100 }) +-- Register widgets +vicious.register(myfswidget, vicious.widgets.fs, "${/ usep}", 240, "rootfs") +vicious.register(myfswidget, vicious.widgets.fs, "${/home usep}", 240, "homefs") +vicious.register(myfswidget, vicious.widgets.fs, "${/mnt/storage usep}", 240, "storagefs") +vicious.register(myfswidget, vicious.widgets.fs, "${/mnt/backup usep}", 240, "backupfs") +-- Register buttons +myfswidget:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.util.spawn("rox", false) end))) +-- }}} + +-- {{{ Network usage statistics +-- Widget icons +myneticon = widget({ type = "imagebox", name = "myneticon", align = "right" }) +myneticonup = widget({ type = "imagebox", name = "myneticonup", align = "right" }) +myneticon.image = image(beautiful.widget_net) +myneticonup.image = image(beautiful.widget_netup) +-- Initialize widgets +mynetwidget = widget({ type = "textbox", name = "mynetwidget", align = "right" }) +mynetfiwidget = widget({ type = "textbox", name = "mynetfiwidget", align = "right" }) +-- Register ethernet widget +vicious.register(mynetwidget, vicious.widgets.net, + '<span color="'.. beautiful.fg_netdn_widget ..'">${eth0 down_kb}</span> <span color="' + .. beautiful.fg_netup_widget ..'">${eth0 up_kb}</span>', 2) +-- Register wireless widget +vicious.register(mynetfiwidget, vicious.widgets.net, + '<span color="'.. beautiful.fg_netdn_widget ..'">${wlan0 down_kb}</span> <span color="' + .. beautiful.fg_netup_widget ..'">${wlan0 up_kb}</span>', 2) +-- }}} + +-- {{{ Mail subject (latest e-mail) +-- Widget icon +mymailicon = widget({ type = "imagebox", name = "mymailicon", align = "right" }) +mymailicon.image = image(beautiful.widget_mail) +-- Initialize widget +mymboxwidget = widget({ type = "textbox", name = "mymboxwidget", align = "right" }) +-- Register widget +vicious.register(mymboxwidget, vicious.widgets.mbox, "$1", 60, nil, "/home/anrxc/mail/Inbox") +-- Register buttons +mymboxwidget:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.util.spawn("urxvt -title Alpine -e alpine_exp", false) end))) +-- }}} + +-- {{{ Agenda and Todo (Emacs org-mode) +-- Widget icon +myorgicon = widget({ type = "imagebox", name = "myorgicon", align = "right" }) +myorgicon.image = image(beautiful.widget_org) +-- Initialize widget +myorgwidget = widget({ type = "textbox", name = "myorgwidget", align = "right" }) +-- Configure widget +myorgmode = {} +myorgmode.files = { -- Agenda files to be included + os.getenv("HOME") .. "/.org/work.org", os.getenv("HOME") .. "/.org/index.org", + os.getenv("HOME") .. "/.org/personal.org", os.getenv("HOME") .. "/.org/computers.org" +} +myorgmode.colors = { -- Index: past, today, soon, future + '<span color="'..beautiful.fg_urgent..'">', '<span color="'..beautiful.fg_normal..'">', + '<span color="'..beautiful.fg_widget..'">', '<span color="'..beautiful.fg_netup_widget..'">' +} +-- Register widget +vicious.register(myorgwidget, vicious.widgets.org, + myorgmode.colors[1] .. '$1</span>|' .. myorgmode.colors[2] .. '$2</span>|' .. + myorgmode.colors[3] .. '$3</span>|' .. myorgmode.colors[4] .. '$4</span>', + 240, nil, myorgmode.files) +-- Register buttons +myorgwidget:buttons(awful.util.table.join( + awful.button({ }, 1, function () + awful.util.spawn("emacsclient --eval '(org-agenda-list)'", false) + end), + awful.button({ }, 3, function () + awful.util.spawn("emacsclient --eval '(make-remember-frame)'", false) + end))) +-- }}} + +-- {{{ Volume level, progressbar and changer +-- Widget icon +myvolicon = widget({ type = "imagebox", name = "myvolicon", align = "right" }) +myvolicon.image = image(beautiful.widget_vol) +-- Initialize widgets +myvolwidget = widget({ type = "textbox", name = "myvolwidget", align = "right" }) +myvolbarwidget = widget({ type = "progressbar", name = "myvolbarwidget", align = "right" }) +-- VOL progressbar properties +myvolbarwidget.width = 10 +myvolbarwidget.height = 0.9 +myvolbarwidget.gap = 0 +myvolbarwidget.border_padding = 1 +myvolbarwidget.border_width = 0 +myvolbarwidget.ticks_count = 4 +myvolbarwidget.ticks_gap = 1 +myvolbarwidget.vertical = true +myvolbarwidget:bar_properties_set("volume", { + bg = beautiful.bg_widget, + fg = beautiful.fg_widget, + fg_center = beautiful.fg_widget, + fg_end = beautiful.fg_end_widget, + fg_off = beautiful.fg_off_widget, + min_value = 0, + max_value = 100 }) +-- Register widgets +vicious.register(myvolwidget, vicious.widgets.volume, "$1%", 2, nil, "PCM") +vicious.register(myvolbarwidget, vicious.widgets.volume, "$1", 2, "volume", "PCM") +-- Register buttons +myvolbarwidget:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.util.spawn("kmix", false) end), + awful.button({ }, 2, function () awful.util.spawn("amixer -q sset Master toggle", false) end), + awful.button({ }, 4, function () awful.util.spawn("amixer -q sset PCM 2dB+", false) end), + awful.button({ }, 5, function () awful.util.spawn("amixer -q sset PCM 2dB-", false) end))) +-- Register buttons +myvolwidget:buttons( myvolbarwidget:buttons() ) +-- }}} + +-- {{{ Date, time and a calendar +-- Widget icon +mydateicon = widget({ type = "imagebox", name = "mydateicon", align = "right" }) +mydateicon.image = image(beautiful.widget_date) +-- Initialize widget +mydatewidget = widget({ type = "textbox", name = "mydatewidget", align = "right" }) +-- Register widget +vicious.register(mydatewidget, vicious.widgets.date, "%b %e, %R", 60) +-- Register buttons +mydatewidget:buttons(awful.util.table.join( + -- PyLendar: http://sysphere.org/~anrxc/j/archives/2009/03/11/desktop_calendars + awful.button({ }, 1, function () awful.util.spawn("pylendar.py", false) end))) +-- }}} + +-- {{{ System tray +-- Initialize widget +mysystray = widget({ type = "systray", align = "right" }) +-- }}} +-- }}} + +-- {{{ Wibox initialisation +mywibox = {} +mypromptbox = {} +mylayoutbox = {} +mytaglist = {} +mytaglist.buttons = awful.util.table.join( + awful.button({ }, 1, awful.tag.viewonly), + awful.button({ modkey }, 1, awful.client.movetotag), + awful.button({ }, 3, function (tag) tag.selected = not tag.selected end), + awful.button({ modkey }, 3, awful.client.toggletag), + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev)) + +-- Add a wibox to each screen +for s = 1, screen.count() do + -- Create a promptbox + mypromptbox[s] = awful.widget.prompt({ align = "left" }) + -- Create an imagebox widget with icons indicating active layout + mylayoutbox[s] = widget({ type = "imagebox", align = "left" }) + mylayoutbox[s]:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), + awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), + awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), + awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) + + -- Create the taglist + mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, mytaglist.buttons) + -- Create the wibox + mywibox[s] = wibox({ position="top", height="14", fg=beautiful.fg_normal, bg=beautiful.bg_normal }) + -- Add widgets to the wibox (order matters) + mywibox[s].widgets = { mytaglist[s], + mylayoutbox[s], + mypromptbox[s], + mycpuicon, mythermalwidget, myspacer, mycpuwidget, + myseparator, + mybaticon, mybatwidget, myspacer, + myseparator, + mymemicon, myspacer, mymemwidget, myspacer, + myseparator, + myfsicon, myfswidget, myspacer, + myseparator, + myneticon, mynetwidget, myneticonup, + myseparator, + myneticon, mynetfiwidget, myneticonup, + myseparator, + mymailicon, myspacer, mymboxwidget, myspacer, + myseparator, + myorgicon, myorgwidget, myspacer, + myseparator, + myvolicon, myvolwidget, myspacer, myvolbarwidget, myspacer, + myseparator, + mydateicon, mydatewidget, + myseparator, + s == screen.count() and mysystray or nil + } + mywibox[s].screen = s +end +-- }}} +-- }}} + + +-- {{{ Mouse bindings +root.buttons(awful.util.table.join( + awful.button({ }, 3, function () + awful.prompt.run({ prompt = "Run: " }, mypromptbox[mouse.screen].widget, + function (...) mypromptbox[mouse.screen].text = awful.util.spawn(unpack(arg), false) end, + awful.completion.shell, awful.util.getdir("cache") .. "/history") + end), + awful.button({ }, 4, awful.tag.viewnext), + awful.button({ }, 5, awful.tag.viewprev) +)) +-- }}} + + +-- {{{ Key bindings +-- +-- {{{ Global keys +globalkeys = awful.util.table.join( + -- {{{ Applications + awful.key({ modkey }, "e", function () awful.util.spawn("emacsclient -n -c", false) end), + awful.key({ modkey }, "r", function () awful.util.spawn("rox", false) end), + awful.key({ modkey }, "u", function () awful.util.spawn("utorrent", false) end), + awful.key({ modkey }, "w", function () awful.util.spawn("firefox", false) end), + awful.key({ altkey }, "F1", function () awful.util.spawn("urxvt", false) end), + awful.key({ altkey }, "#49", function () teardrop.toggle("urxvt") end), + awful.key({ modkey }, "F2", function () teardrop.toggle("gmrun", 1, 0.08) end), + awful.key({ modkey }, "a", function () + awful.util.spawn("urxvt -title Alpine -e alpine_exp", false) + end), + awful.key({ modkey }, "g", function () + awful.util.spawn_with_shell("GTK2_RC_FILES=~/.gtkrc-gajim gajim", false) + end), + awful.key({ modkey }, "q", function () + awful.util.spawn("emacsclient --eval '(make-remember-frame)'", false) + end), + -- }}} + + -- {{{ Multimedia keys + awful.key({}, "#160", function () awful.util.spawn("kscreenlocker --forcelock", false) end), + awful.key({}, "#146", function () awful.util.spawn("khelpcenter", false) end), + -- pvol: http://sysphere.org/~anrxc/j/archives/2009/03/21/pvol_and_ossaudiodev + awful.key({}, "#121", function () awful.util.spawn("pvol.py -m", false) end), + awful.key({}, "#122", function () awful.util.spawn("pvol.py -p -c -2", false) end), + awful.key({}, "#123", function () awful.util.spawn("pvol.py -p -c 2", false) end), + -- plight: http://sysphere.org/~anrxc/j/archives/2009/05/13/plight_and_brightness + awful.key({}, "#232", function () awful.util.spawn("plight.py -s -a", false) end), + awful.key({}, "#233", function () awful.util.spawn("plight.py -s -a", false) end), + awful.key({}, "#244", function () awful.util.spawn("sudo /usr/sbin/pm-hibernate", false) end), + awful.key({}, "#150", function () awful.util.spawn("sudo /usr/sbin/pm-suspend", false) end), + awful.key({}, "#156", function () awful.util.spawn("emacsclient -n -c", false) end), + -- pypres: http://sysphere.org/~anrxc/j/archives/2009/07/23/python_presentation_manager + awful.key({}, "#225", function () awful.util.spawn("pypres.py", false) end), + awful.key({}, "#181", function () awful.util.spawn("xrefresh", false) end), + awful.key({}, "#180", function () awful.util.spawn("firefox -browser", false) end), + awful.key({}, "#163", function () awful.util.spawn("urxvt -title Alpine -e alpine", false) end), + awful.key({}, "#157", function () awful.util.spawn("geeqie", false) end), + awful.key({}, "Print",function () awful.util.spawn("ksnapshot", false) end), + -- }}} + + -- {{{ Prompt menus + -- - Run, Dictionary, Manual, Lua, SSH, Calculator and Web search + awful.key({ altkey }, "F2", function () + awful.prompt.run({ prompt = "Run: " }, mypromptbox[mouse.screen].widget, + function (...) mypromptbox[mouse.screen].text = awful.util.spawn(unpack(arg), false) end, + awful.completion.shell, awful.util.getdir("cache") .. "/history") + end), + awful.key({ altkey }, "F3", function () + awful.prompt.run({ prompt = "Dictionary: " }, mypromptbox[mouse.screen].widget, + function (words) + local xmessage = "xmessage -timeout 10 -file -" + awful.util.spawn_with_shell("crodict " .. words .. " | " .. xmessage, false) + end) + end), + awful.key({ altkey }, "F4", function () + awful.prompt.run({ prompt = "Manual: " }, mypromptbox[mouse.screen].widget, + function (page) awful.util.spawn("urxvt -e man " .. page, false) end, + function(cmd, cur_pos, ncomp) + local pages = {} + local m = 'IFS=: && find $(manpath||echo "$MANPATH") -type f -printf "%f\n"| cut -d. -f1' + local c, err = io.popen(m) + if c then while true do + local manpage = c:read("*line") + if not manpage then break end + if manpage:find("^" .. cmd:sub(1, cur_pos)) then + table.insert(pages, manpage) + end + end + c:close() + else io.stderr:write(err) end + if #cmd == 0 then return cmd, cur_pos end + if #pages == 0 then return end + while ncomp > #pages do ncomp = ncomp - #pages end + return pages[ncomp], cur_pos + end) + end), + awful.key({ altkey }, "F5", function () + awful.prompt.run({ prompt = "Run Lua code: " }, mypromptbox[mouse.screen].widget, + awful.util.eval, nil, awful.util.getdir("cache") .. "/history_eval") + end), + awful.key({ altkey }, "F10", function () + awful.prompt.run({ prompt = "Connect: " }, mypromptbox[mouse.screen].widget, + function (host) awful.util.spawn("urxvt -e ssh " .. host, false) end) + end), + awful.key({ altkey }, "F11", function () + awful.prompt.run({ prompt = "Calculate: " }, mypromptbox[mouse.screen].widget, + function (expr) + local xmessage = "xmessage -timeout 10 -file -" + awful.util.spawn_with_shell("echo '" .. expr .. ' = ' .. + awful.util.eval("return (" .. expr .. ")") .. "' | " .. xmessage, false) + end) + end), + awful.key({ altkey }, "F12", function () + awful.prompt.run({ prompt = "Web search: " }, mypromptbox[mouse.screen].widget, + function (command) + awful.util.spawn("firefox 'http://yubnub.org/parser/parse?command="..command.."'", false) + if tags[mouse.screen][3] then awful.tag.viewonly(tags[mouse.screen][3]) end + end) + end), + -- }}} + + -- {{{ Awesome controls + awful.key({ modkey, "Shift" }, "q", awesome.quit), + awful.key({ modkey, "Shift" }, "r", function () + mypromptbox[mouse.screen].text = awful.util.escape(awful.util.restart()) + end), + -- }}} + + -- {{{ Tag browsing + awful.key({ altkey }, "n", awful.tag.viewnext), + awful.key({ altkey }, "p", awful.tag.viewprev), + awful.key({ altkey }, "Escape", awful.tag.history.restore), + -- }}} + + -- {{{ Layout manipulation + awful.key({ modkey }, "l", function () awful.tag.incmwfact(0.05) end), + awful.key({ modkey }, "h", function () awful.tag.incmwfact(-0.05) end), + awful.key({ modkey, "Shift" }, "l", function () awful.client.incwfact(-0.05) end), + awful.key({ modkey, "Shift" }, "h", function () awful.client.incwfact(0.05) end), + awful.key({ modkey }, "space", function () awful.layout.inc(layouts, 1) end), + awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), + awful.key({ altkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), + awful.key({ altkey, "Shift" }, "h", function () awful.tag.incnmaster(1) end), + awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), + awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol(1) end), + -- }}} + + -- {{{ Focus controls + awful.key({ modkey }, "p", function () awful.screen.focus(1) end), + awful.key({ modkey }, "s", function () + for k, c in pairs(client.get(mouse.screen)) do + if c.minimized then -- Scratchpad replacement/imitation + awful.client.movetotag(awful.tag.selected(mouse.screen), c) + awful.client.floating.set(c, true) + awful.placement.centered(c) + c.minimized = false; c.sticky = true + client.focus = c; c:raise() + end + end + end), + awful.key({ altkey }, "Tab", awful.client.urgent.jumpto), + awful.key({ modkey }, "Tab", function () awful.client.focus.history.previous(); + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "j", function () awful.client.focus.byidx(1); + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "k", function () awful.client.focus.byidx(-1); + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "#48", function () awful.client.focus.bydirection("down"); + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "#34", function () awful.client.focus.bydirection("up"); + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "#47", function () awful.client.focus.bydirection("left"); + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "#51", function () awful.client.focus.bydirection("right"); + if client.focus then client.focus:raise() end + end), + awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx(1) end), + awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx(-1) end), + awful.key({ modkey, "Shift" }, "#48", function () awful.client.swap.bydirection("down") end), + awful.key({ modkey, "Shift" }, "#34", function () awful.client.swap.bydirection("up") end), + awful.key({ modkey, "Shift" }, "#47", function () awful.client.swap.bydirection("left") end), + awful.key({ modkey, "Shift" }, "#51", function () awful.client.swap.bydirection("right") end) + -- }}} +) +-- }}} + +-- {{{ Client manipulation +clientkeys = awful.util.table.join( + awful.key({ modkey }, "b", function () -- Hide the wibox + if mywibox[mouse.screen].screen == nil then mywibox[mouse.screen].screen = mouse.screen + else mywibox[mouse.screen].screen = nil end + end), + awful.key({ modkey }, "c", function (c) c:kill() end), + awful.key({ modkey }, "f", function (c) c.fullscreen = not c.fullscreen end), + awful.key({ modkey }, "m", function (c) + c.maximized_horizontal = not c.maximized_horizontal + c.maximized_vertical = not c.maximized_vertical + end), + awful.key({ modkey }, "o", awful.client.movetoscreen), + awful.key({ modkey }, "t", awful.client.togglemarked), + awful.key({ modkey }, "Next", function () awful.client.moveresize(20, 20, -20, -20) end), + awful.key({ modkey }, "Prior", function () awful.client.moveresize(-20, -20, 20, 20) end), + awful.key({ modkey }, "Down", function () awful.client.moveresize(0, 20, 0, 0) end), + awful.key({ modkey }, "Up", function () awful.client.moveresize(0, -20, 0, 0) end), + awful.key({ modkey }, "Left", function () awful.client.moveresize(-20, 0, 0, 0) end), + awful.key({ modkey }, "Right", function () awful.client.moveresize(20, 0, 0, 0) end), + awful.key({ modkey }, "d", function (c) c.minimized = not c.minimized end), + awful.key({ modkey, "Shift" }, "0", function (c) c.sticky = not c.sticky end), + awful.key({ modkey, "Shift" }, "o", function (c) c.ontop = not c.ontop end), + awful.key({ modkey, "Shift" }, "t", function (c) + if c.titlebar then awful.titlebar.remove(c) + else awful.titlebar.add(c, { modkey = modkey }) end + end), + awful.key({ modkey, "Control" }, "r", function (c) c:redraw() end), + awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle), + awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), + -- Suspend/resume on focus changes could be auto. when running on bat power, if only suspending FF: + awful.key({ modkey, "Shift" }, "c", function (c) awful.util.spawn("kill -CONT "..c.pid, false) end), + awful.key({ modkey, "Shift" }, "s", function (c) awful.util.spawn("kill -STOP "..c.pid, false) end) +) +-- }}} + +-- {{{ Bind keyboard digits +keynumber = 0 +for s = 1, screen.count() do + keynumber = math.min(9, math.max(#tags[s], keynumber)); +end +-- }}} + +-- {{{ Tag controls +for i = 1, keynumber do + globalkeys = awful.util.table.join( globalkeys, + awful.key({ modkey }, i, + function () + local screen = mouse.screen + if tags[screen][i] then + awful.tag.viewonly(tags[screen][i]) + end + end), + awful.key({ modkey, "Control" }, i, + function () + local screen = mouse.screen + if tags[screen][i] then + tags[screen][i].selected = not tags[screen][i].selected + end + end), + awful.key({ modkey, "Shift" }, i, + function () + if client.focus and tags[client.focus.screen][i] then + awful.client.movetotag(tags[client.focus.screen][i]) + end + end), + awful.key({ modkey, "Control", "Shift" }, i, + function () + if client.focus and tags[client.focus.screen][i] then + awful.client.toggletag(tags[client.focus.screen][i]) + end + end), + awful.key({ modkey, "Shift" }, "F" .. i, + function () + local screen = mouse.screen + if tags[screen][i] then + for k, c in pairs(awful.client.getmarked()) do + awful.client.movetotag(tags[screen][i], c) + end + end + end)) +end +-- }}} + +-- Set keys +root.keys(globalkeys) +-- }}} + + +-- {{{ Hooks +-- +-- {{{ Hook function to execute when focusing a client +awful.hooks.focus.register(function (c) + if not awful.client.ismarked(c) then + c.border_color = beautiful.border_focus + end +end) +-- }}} + +-- {{{ Hook function to execute when unfocusing a client +awful.hooks.unfocus.register(function (c) + if not awful.client.ismarked(c) then + c.border_color = beautiful.border_normal + end +end) +-- }}} + +-- {{{ Hook function to execute when marking a client +awful.hooks.marked.register(function (c) + c.border_color = beautiful.border_marked +end) +-- }}} + +-- {{{ Hook function to execute when unmarking a client +awful.hooks.unmarked.register(function (c) + c.border_color = beautiful.border_focus +end) +-- }}} + +-- {{{ Hook function to execute when the mouse enters a client +awful.hooks.mouse_enter.register(function (c) + -- Sloppy focus (but disabled for magnifier layout) + if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier + and awful.client.focus.filter(c) then + client.focus = c + end +end) +-- }}} + +-- {{{ Hook function to execute when a new client appears +awful.hooks.manage.register(function (c) + -- If we are not managing this application at startup, + -- move it to the screen where the mouse is + if not startup and awful.client.focus.filter(c) then + c.screen = mouse.screen + -- Additionaly make sure it is not maximized + -- - common problem with apps like Firefox + c.maximized_vertical = false + c.maximized_horizontal = false + end + + -- Add a titlebar to each client if enabled globaly + -- - check the arrange hook for finer controls + if use_titlebar then + awful.titlebar.add(c, { modkey = modkey }) + c.titlebar.border_width = beautiful.border_width + c.titlebar.border_color = beautiful.border_focus + end + + -- Set client mouse bindings + c:buttons(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) + )) + + -- New clients may not receive focus (unfocusable), so set the border anyway + c.border_width = beautiful.border_width + c.border_color = beautiful.border_normal + + -- Check application->screen/tag mappings and floating state + local target_screen, target_tag, target_float + + for _, rule in pairs(apprules) do + if (((rule.cls == nil) or (c.class and c.class == rule.cls)) + and ((rule.ins == nil) or (c.instance and c.instance == rule.ins)) + and ((rule.name == nil) or (c.name and string.find(c.name, rule.name, 1, true)))) + then + target_screen = rule.scr + target_tag = rule.tag + target_float = rule.float + end + end + + -- Apply application->screen/tag mappings and floating state + if target_float then awful.client.floating.set(c, target_float) end + if target_screen then + c.screen = target_screen + awful.client.movetotag(tags[target_screen][target_tag], c) + end + + -- Focus after tag mapping + client.focus = c + + -- Set client key bindings + c:keys(clientkeys) + + -- Set new clients as slaves + awful.client.setslave(c) + + -- New floating windows: + -- - don't cover the wibox + awful.placement.no_offscreen(c) + -- - don't overlap until it's unavoidable + --awful.placement.no_overlap(c) + -- - are centered on the screen + --awful.placement.centered(c, c.transient_for) + + -- Honoring of size hints + -- - false will remove gaps between windows + c.size_hints_honor = false +end) +-- }}} + +-- {{{ Hook function to execute when arranging the screen +awful.hooks.arrange.register(function (screen) + -- Update layout imagebox widget with an icon indicating active layout + local layout = awful.layout.getname(awful.layout.get(screen)) + if layout and beautiful["layout_" ..layout] then + mylayoutbox[screen].image = image(beautiful["layout_" .. layout]) + else + mylayoutbox[screen].image = nil + end + + -- If no window has focus or current one is a desktop or a dock: + if not client.focus then + -- - give focus to the latest client in history + local c = awful.client.focus.history.get(screen, 0) + -- - give focus the the client under the pointer + --local c = awful.mouse.client_under_pointer() + if c then client.focus = c end + end + + -- Fine grained borders and floaters control + local visible_clients = awful.client.visible(screen) + + if #visible_clients > 0 then + for _, c in pairs(visible_clients) do + -- Floating clients always have borders + if awful.client.floating.get(c) or layout == "floating" then + c.border_width = beautiful.border_width + if not c.fullscreen then + -- Floating clients always have titlebars + if not c.titlebar and c.class ~= "Xmessage" then + awful.titlebar.add(c, { modkey = modkey }) + end + -- Floating clients are always on top + c.above = true + end + -- Tiled clients don't have borders if only one client is visible + --elseif (#visible_clients == 1) or (layout == "max") then + -- - avoid flicker in max layout if floaters are on top + elseif #visible_clients == 1 then + visible_clients[1].border_width = 0 + else + c.border_width = beautiful.border_width + end + end + end +end) +-- }}} +-- }}} |