-- {{{ License -- -- Awesome configuration, using awesome 3.4.13 on Arch GNU/Linux -- * Adrian C. -- Screenshot: http://sysphere.org/gallery/snapshots -- This work is licensed under the Creative Commons Attribution-Share -- Alike License: http://creativecommons.org/licenses/by-sa/3.0/ -- }}} -- {{{ Libraries require("awful") require("awful.rules") require("awful.autofocus") -- User libraries vicious = require("vicious") local scratch = require("scratch") -- }}} -- {{{ Variable definitions local altkey = "Mod1" local modkey = "Mod4" local home = os.getenv("HOME") local exec = awful.util.spawn local sexec = awful.util.spawn_with_shell local scount = screen.count() -- Beautiful theme beautiful.init(home .. "/.config/awesome/themes/zenburntheme/zenburn.lua") -- Window management layouts layouts = { awful.layout.suit.tile, -- 1 awful.layout.suit.tile.bottom, -- 2 awful.layout.suit.fair, -- 3 awful.layout.suit.max, -- 4 awful.layout.suit.magnifier, -- 5 awful.layout.suit.floating -- 6 } -- }}} -- {{{ Tags tags = { names = { "term", "vim", "web", "stuff", "im", 6, 7, "rss", "media" }, layout = { layouts[2], layouts[1], layouts[1], layouts[4], layouts[1], layouts[6], layouts[6], layouts[5], layouts[6] }} for s = 1, scount do tags[s] = awful.tag(tags.names, s, tags.layout) for i, t in ipairs(tags[s]) do awful.tag.setproperty(t, "mwfact", i==5 and 0.13 or 0.5) awful.tag.setproperty(t, "hide", (i==6 or i==7) and true) end end -- }}} -- {{{ Wibox -- -- {{{ Widgets configuration -- -- {{{ Reusable separator separator = widget({ type = "imagebox" }) separator.image = image(beautiful.widget_sep) -- }}} -- {{{ Reusable spacer spacer = widget({ type = "textbox" }) spacer.text = " " -- }}} -- Pacman Widget pacwidget = widget({type = "textbox"}) pacicon = widget({ type = "imagebox" }) pacicon.image = image(beautiful.widget_pacman) pacwidget_t = awful.tooltip({ objects = { pacwidget},}) vicious.register(pacwidget, vicious.widgets.pkg, function(widget,args) local io = { popen = io.popen } local s = io.popen("pacman -Qu") local str = '' for line in s:lines() do str = str .. line .. "\n" end pacwidget_t:set_text(str) s:close() return args[1] end, 1800, "Arch") --'1800' means check every 30 minutes -- {{{ CPU usage and temperature cpuicon = widget({ type = "imagebox" }) cpuicon.image = image(beautiful.widget_cpu) -- Initialize widgets cpugraph = awful.widget.graph() tzswidget = widget({ type = "textbox" }) -- Graph properties cpugraph:set_width(30):set_height(14) cpugraph:set_background_color(beautiful.fg_off_widget) cpugraph:set_gradient_angle(0):set_gradient_colors({ beautiful.fg_end_widget, beautiful.fg_center_widget, beautiful.fg_widget }) -- Register widgets vicious.register(cpugraph, vicious.widgets.cpu, "$1") vicious.register(tzswidget, vicious.widgets.thermal, " $1°C", 2, "thermal_zone0") -- }}} -- {{{ Battery state baticon = widget({ type = "imagebox" }) baticon.image = image(beautiful.widget_bat) -- Initialize widget batwidget = widget({ type = "textbox" }) -- Register widget vicious.register(batwidget, vicious.widgets.bat, "$1$2%", 61, "BAT0") -- }}} -- {{{ Memory usage memicon = widget({ type = "imagebox" }) memicon.image = image(beautiful.widget_mem) -- Initialize widget membar = awful.widget.progressbar() -- Pogressbar properties membar:set_vertical(true):set_ticks(true) membar:set_height(12):set_width(8):set_ticks_size(2) membar:set_background_color(beautiful.fg_off_widget) membar:set_gradient_colors({ beautiful.fg_widget, beautiful.fg_center_widget, beautiful.fg_end_widget }) -- Register widget vicious.register(membar, vicious.widgets.mem, "$1", 13) -- }}} -- {{{ File system usage fsicon = widget({ type = "imagebox" }) fsicon.image = image(beautiful.widget_fs) -- Initialize widgets fs = { b = awful.widget.progressbar(), r = awful.widget.progressbar(), h = awful.widget.progressbar(), s = awful.widget.progressbar() } -- Progressbar properties for _, w in pairs(fs) do w:set_vertical(true):set_ticks(true) w:set_height(14):set_width(5):set_ticks_size(2) w:set_border_color(beautiful.border_widget) w:set_background_color(beautiful.fg_off_widget) w:set_gradient_colors({ beautiful.fg_widget, beautiful.fg_center_widget, beautiful.fg_end_widget }) -- Register buttons w.widget:buttons(awful.util.table.join( awful.button({ }, 1, function () exec("rox", false) end) )) end -- Enable caching vicious.cache(vicious.widgets.fs) -- Register widgets vicious.register(fs.b, vicious.widgets.fs, "${/boot used_p}", 599) vicious.register(fs.r, vicious.widgets.fs, "${/ used_p}", 599) vicious.register(fs.h, vicious.widgets.fs, "${/home used_p}", 599) vicious.register(fs.s, vicious.widgets.fs, "${/mnt/storage used_p}", 599) -- }}} -- {{{ Network usage dnicon = widget({ type = "imagebox" }) upicon = widget({ type = "imagebox" }) dnicon.image = image(beautiful.widget_net) upicon.image = image(beautiful.widget_netup) -- Initialize widget netwidget = widget({ type = "textbox" }) -- Register widget vicious.register(netwidget, vicious.widgets.net, '${wlan0 down_kb} ${wlan0 up_kb}', 3) -- }}} -- {{{ Mail subject mygmail = widget({ type = "textbox" }) gmail_t = awful.tooltip({ objects = { mygmail },}) mygmailimg = widget({ type = "imagebox" }) mygmailimg.image = image(beautiful.widget_mail) vicious.register(mygmail, vicious.widgets.gmail, function (widget, args) gmail_t:set_text(args["{subject}"]) gmail_t:add_to_object(mygmailimg) return args["{count}"] end, 120) --the '120' here means check every 2 minutes. mygmail:buttons(awful.util.table.join( awful.button({ }, 1, function () exec("google-chrome\ https://gmail.com") end) )) -- }}} -- {{{ Volume level volicon = widget({ type = "imagebox" }) volicon.image = image(beautiful.widget_vol) -- Initialize widgets volbar = awful.widget.progressbar() volwidget = widget({ type = "textbox" }) -- Progressbar properties volbar:set_vertical(true):set_ticks(false) volbar:set_height(12):set_width(8):set_ticks_size(2) volbar:set_background_color(beautiful.fg_off_widget) volbar:set_gradient_colors({ beautiful.fg_end_widget, beautiful.fg_center_widget, beautiful.fg_widget }) -- Enable caching vicious.cache(vicious.widgets.volume) -- Register widgets vicious.register(volbar, vicious.widgets.volume, "$1", 2, "Master") vicious.register(volwidget, vicious.widgets.volume, "$1%", 2, "Master") -- Register buttons volbar.widget:buttons(awful.util.table.join( awful.button({ }, 1, function () exec("xfce4-mixer") end), awful.button({ }, 4, function () exec("amixer set Master 5%+", false) end), awful.button({ }, 5, function () exec("amixer set Master 5%-", false) end) )) -- Register assigned buttons volwidget:buttons(volbar.widget:buttons()) -- }}} -- {{{ Date and time dateicon = widget({ type = "imagebox" }) dateicon.image = image(beautiful.widget_date) -- Initialize widget datewidget = widget({ type = "textbox" }) -- Register widget vicious.register(datewidget, vicious.widgets.date, "%a %d %b %T ", 1) -- Register buttons datewidget:buttons(awful.util.table.join( awful.button({ }, 1, function () exec("pylendar.py") end) )) -- }}} -- Weather widget weathericon = widget({ type = "imagebox" }) weathericon.image = image(beautiful.widget_temp) weatherwidget = widget({ type = "textbox" }) weather_t = awful.tooltip({ objects = { weatherwidget },}) vicious.register(weatherwidget, vicious.widgets.weather1, function (widget, args) weather_t:set_text("City: " .. args["{city}"] .."\nWind: " .. args["{windkmh}"] .. "km/h " .. args["{wind}"] .. "\nSky: " .. args["{sky}"] .. "\nHumidity: " .. args["{humid}"] .. "%") return args["{tempc}"] .. "°C" end, 180, "LIRZ") --'1800': check every 30 minutes. --'LIRZ': the Montreal ICAO code. -- {{{ System tray systray = widget({ type = "systray" }) -- }}} -- }}} -- MPD Initialize widget mpdwidget = widget({ type = "textbox"}) mpdwidget.align = "center" mpdwidget.width = 600 -- Register widget vicious.register(mpdwidget, vicious.widgets.mpd, function (widget, args) if args["{state}"] == "Stop" then return "...No music :(" else a = "" .. args["{Artist}"] .. "" return a..' - '.. args["{Title}"] end end, 1) -- {{{ Wibox initialisation wibox = {} promptbox = {} layoutbox = {} taglist = {} taglist.buttons = awful.util.table.join( awful.button({ }, 1, awful.tag.viewonly), awful.button({ modkey }, 1, awful.client.movetotag), awful.button({ }, 3, awful.tag.viewtoggle), awful.button({ modkey }, 3, awful.client.toggletag), awful.button({ }, 5, awful.tag.viewnext), awful.button({ }, 4, awful.tag.viewprev )) for s = 1, scount do -- Create a promptbox promptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright }) -- Create a layoutbox layoutbox[s] = awful.widget.layoutbox(s) layoutbox[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 taglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, taglist.buttons) -- Create the wibox wibox[s] = awful.wibox({ screen = s, fg = beautiful.fg_normal, height = 12, bg = beautiful.bg_normal, position = "top", border_color = beautiful.border_focus, border_width = beautiful.border_width }) -- Add widgets to the wibox wibox[s].widgets = { { taglist[s], layoutbox[s], separator, promptbox[s], mpdwidget, ["layout"] = awful.widget.layout.horizontal.leftright }, s == 1 and systray or nil, batwidget, baticon, separator, volwidget, volicon, separator, weatherwidget, weathericon, datewidget, dateicon, separator, mygmail, mygmailimg, -- separator, upicon, netwidget, dnicon, separator, netwidget, separator, fs.s.widget, fs.h.widget, fs.r.widget, fs.b.widget, fsicon, separator, membar.widget, memicon, separator, tzswidget, cpugraph.widget, cpuicon, separator, pacwidget, pacicon, separator, ["layout"] = awful.widget.layout.horizontal.rightleft } end -- }}} -- }}} -- {{{ Mouse bindings root.buttons(awful.util.table.join( awful.button({ }, 5, awful.tag.viewnext), awful.button({ }, 4, awful.tag.viewprev) )) -- Client bindings clientbuttons = 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) ) -- }}} -- {{{ Key bindings -- -- {{{ Global keys globalkeys = awful.util.table.join( -- {{{ Applications awful.key({ modkey }, "w", function () exec("google-chrome") end), awful.key({ altkey }, "F1", function () exec("urxvt") end), awful.key({ altkey }, "Space", function () scratch.drop("urxvt", "bottom", nil, nil, 0.30) end), awful.key({ modkey }, "a", function () exec("urxvt -T Alpine -e alpine.exp") end), awful.key({ altkey }, "#51", function () if boosk then osk(nil, mouse.screen) else boosk, osk = pcall(require, "osk") end end), -- }}} -- {{{ Multimedia keys awful.key({ "Control" }, "#114", function () exec("mpc next") end), awful.key({ "Control" }, "#113", function () exec("mpc prev") end), awful.key({ "Control" }, "#111", function () exec("amixer set Master 5%+, false") end), awful.key({ "Control" }, "#116", function () exec("amixer set Master 5%-, false") end), awful.key({}, "#165", function () exec("sudo /usr/sbin/pm-hibernate") end), awful.key({}, "#213", function () exec("sudo /usr/sbin/pm-suspend") end), awful.key({}, "#163", function () exec("pypres.py") end), -- }}} -- {{{ Prompt menus awful.key({ altkey }, "F2", function () awful.prompt.run({ prompt = "Run: " }, promptbox[mouse.screen].widget, function (...) promptbox[mouse.screen].text = exec(unpack(arg), false) end, awful.completion.shell, awful.util.getdir("cache") .. "/history") end), awful.key({ altkey }, "F3", function () awful.prompt.run({ prompt = "Dictionary: " }, promptbox[mouse.screen].widget, function (words) sexec("crodict "..words.." | ".."xmessage -timeout 10 -file -") end) end), awful.key({ altkey }, "F4", function () awful.prompt.run({ prompt = "Web: " }, promptbox[mouse.screen].widget, function (command) sexec("google-chrome 'http://yubnub.org/parser/parse?command="..command.."'") awful.tag.viewonly(tags[scount][3]) end) end), awful.key({ altkey }, "F5", function () awful.prompt.run({ prompt = "Lua: " }, promptbox[mouse.screen].widget, awful.util.eval, nil, awful.util.getdir("cache") .. "/history_eval") end), -- }}} -- {{{ Awesome controls awful.key({ modkey }, "b", function () wibox[mouse.screen].visible = not wibox[mouse.screen].visible end), awful.key({ modkey, "Shift" }, "q", awesome.quit), awful.key({ modkey, "Shift" }, "r", function () promptbox[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 }, "Tab", 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, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), awful.key({ modkey }, "space", function () awful.layout.inc(layouts, 1) end), -- }}} -- {{{ Focus controls awful.key({ modkey }, "p", function () awful.screen.focus_relative(1) end), awful.key({ modkey }, "s", function () scratch.pad.toggle() end), awful.key({ modkey }, "u", awful.client.urgent.jumpto), 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 }, "Tab", function () awful.client.focus.history.previous() if client.focus then client.focus:raise() end end), awful.key({ altkey }, "Escape", function () awful.menu.menu_keys.down = { "Down", "Alt_L" } local cmenu = awful.menu.clients({width=230}, { keygrabber=true, coords={x=525, y=330} }) 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) -- }}} ) -- }}} -- {{{ Client manipulation clientkeys = awful.util.table.join( awful.key({ modkey }, "c", function (c) c:kill() end), awful.key({ modkey }, "d", function (c) scratch.pad.set(c, 0.60, 0.60, true) 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 }, "Next", function () awful.client.moveresize( 20, 20, -40, -40) end), awful.key({ modkey }, "Prior", function () awful.client.moveresize(-20, -20, 40, 40) 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, "Control"},"r", function (c) c:redraw() end), awful.key({ modkey, "Shift" }, "0", function (c) c.sticky = not c.sticky end), awful.key({ modkey, "Shift" }, "m", function (c) c:swap(awful.client.getmaster()) end), awful.key({ modkey, "Shift" }, "c", function (c) exec("kill -CONT " .. c.pid) end), awful.key({ modkey, "Shift" }, "s", function (c) exec("kill -STOP " .. c.pid) 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, "Shift" }, "f", function (c) if awful.client.floating.get(c) then awful.client.floating.delete(c); awful.titlebar.remove(c) else awful.client.floating.set(c, true); awful.titlebar.add(c) end end) ) -- }}} -- {{{ Keyboard digits local keynumber = 0 for s = 1, scount 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 + 9, function () local screen = mouse.screen if tags[screen][i] then awful.tag.viewonly(tags[screen][i]) end end), awful.key({ modkey, "Control" }, "#" .. i + 9, function () local screen = mouse.screen if tags[screen][i] then awful.tag.viewtoggle(tags[screen][i]) end end), awful.key({ modkey, "Shift" }, "#" .. i + 9, 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 + 9, function () if client.focus and tags[client.focus.screen][i] then awful.client.toggletag(tags[client.focus.screen][i]) end end)) end -- }}} -- Set keys root.keys(globalkeys) -- }}} -- {{{ Rules function titlebarwithsettings(c) awful.titlebar.add(c, {modkey = modkey}) end awful.rules.rules = { { rule = { }, properties = { focus = true, size_hints_honor = false, keys = clientkeys, buttons = clientbuttons, border_width = beautiful.border_width, border_color = beautiful.border_normal } }, { rule = { class = "Firefox", instance = "Navigator" }, properties = { tag = tags[scount][3] } }, { rule = { class = "Google-chrome", instance = "google-chrome" }, properties = { tag = tags[scount][3] } }, { rule = { class = "Emacs", instance = "emacs" }, properties = { tag = tags[1][2] } }, { rule = { class = "Emacs", instance = "_Remember_" }, properties = { floating = true }, callback = awful.titlebar.add }, { rule = { class = "Xmessage", instance = "xmessage" }, properties = { floating = true }, callback = awful.titlebar.add }, { rule = { instance = "plugin-container" }, properties = { floating = true }, callback = awful.titlebar.add }, { rule = { class = "Akregator" }, properties = { tag = tags[scount][8]}}, { rule = { name = "Alpine" }, properties = { tag = tags[1][4]} }, { rule = { class = "Gajim" }, properties = { tag = tags[1][5]} }, { rule = { class = "Ark" }, properties = { floating = true } }, { rule = { class = "Geeqie" }, properties = { floating = true } }, { rule = { class = "ROX-Filer" }, properties = { floating = true } }, { rule = { class = "Pinentry.*" }, properties = { floating = true } }, { rule = { class = "Conky", instance = "Conky" }, properties = { floating = true }, callback = awful.titlebar.add }, { rule = { class = "Xfce4-notifyd", instance = "xfce4-notifyd" }, properties = { floating = true }, callback = awful.titlebar.add }, } -- }}} -- {{{ Signals -- -- {{{ Manage signal handler client.add_signal("manage", function (c, startup) -- Add titlebar to floaters, but remove those from rule callback if awful.client.floating.get(c) or awful.layout.get(c.screen) == awful.layout.suit.floating then if c.titlebar then awful.titlebar.remove(c) else awful.titlebar.add(c, {modkey = modkey}) end end -- Enable sloppy focus c:add_signal("mouse::enter", function (c) if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier and awful.client.focus.filter(c) then client.focus = c end end) -- Client placement if not startup then awful.client.setslave(c) if not c.size_hints.program_position and not c.size_hints.user_position then awful.placement.no_overlap(c) awful.placement.no_offscreen(c) end end end) -- }}} -- {{{ Focus signal handlers client.add_signal("focus", function (c) c.border_color = beautiful.border_focus end) client.add_signal("unfocus", function (c) c.border_color = beautiful.border_normal end) -- }}} -- {{{ Arrange signal handler for s = 1, scount do screen[s]:add_signal("arrange", function () local clients = awful.client.visible(s) local layout = awful.layout.getname(awful.layout.get(s)) for _, c in pairs(clients) do -- Floaters are always on top if awful.client.floating.get(c) or layout == "floating" then if not c.fullscreen then c.above = true end else c.above = false end end end) end -- }}} -- }}} awful.util.spawn("urxvt") awful.util.spawn("/home/archer/.conky/conky_start")