-- {{{ License -- -- Awesome configuration, using awesome 4.3-7 on Debian 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 pcall(require, "luarocks.loader") -- Standard awesome library local gears = require("gears") local awful = require("awful") require("awful.autofocus") -- Widget and layout libraries local wibox = require("wibox") local vicious = require("vicious") -- Theme handling library local beautiful = require("beautiful") -- Notification library --local naughty = require("naughty") --local menubar = require("menubar") -- }}} -- {{{ Variable definitions terminal = "/usr/bin/urxvt" editor = "emacs" editor_cmd = terminal .. " -e emacs -nw" modkey = "Mod4" altkey = "Mod1" home = os.getenv("HOME") exec = awful.spawn scount = screen.count() -- Beautiful theme beautiful.init(gears.filesystem.get_themes_dir() .. "zenburn/theme.lua") -- Window management layouts awful.layout.layouts = { awful.layout.suit.floating, -- 1 awful.layout.suit.tile, -- 2 awful.layout.suit.tile.left, -- 3 awful.layout.suit.tile.bottom, -- 4 awful.layout.suit.tile.top, -- 5 awful.layout.suit.fair, -- 6 awful.layout.suit.fair.horizontal, -- 7 awful.layout.suit.spiral, -- 8 awful.layout.suit.spiral.dwindle, -- 9 awful.layout.suit.max, -- 10 awful.layout.suit.max.fullscreen, -- 11 awful.layout.suit.magnifier, -- 12 awful.layout.suit.corner.nw, -- 13 -- awful.layout.suit.corner.ne, -- awful.layout.suit.corner.sw, -- awful.layout.suit.corner.se, } -- }}} -- {{{ Menu --menubar.utils.terminal = terminal -- }}} -- {{{ Wibar -- -- {{{ Reusable separator myseparator = wibox.widget.imagebox(home .. "/.config/awesome/icons/separator.png", false) -- }}} -- {{{ CPU temperature mycpuicon = wibox.widget.imagebox(home .. "/.config/awesome/icons/cpu.png", false) -- Initialize widget mycpuwidget = wibox.widget.textbox() -- Register widget vicious.register(mycpuwidget, vicious.widgets.thermal, "$1C", 19, "thermal_zone0") -- }}} -- {{{ Battery state mybaticon = wibox.widget.imagebox(home .. "/.config/awesome/icons/bat.png", false) -- Initialize widget mybatwidget = wibox.widget.textbox() -- Register widget vicious.register(mybatwidget, vicious.widgets.bat, "$1$2%", 61, "BAT0") -- }}} -- {{{ Network usage mydnicon = wibox.widget.imagebox(home .. "/.config/awesome/icons/down.png", false) myupicon = wibox.widget.imagebox(home .. "/.config/awesome/icons/up.png", false) -- Initialize widget mynetwidget = wibox.widget.textbox() -- Register widget vicious.register(mynetwidget, vicious.widgets.net, '${eth0 down_kb} ${eth0 up_kb}', 3) -- }}} -- {{{ Volume level myvolicon = wibox.widget.imagebox(home .. "/.config/awesome/icons/vol.png", false) -- Initialize widget myvolwidget = wibox.widget.textbox() -- Enable caching vicious.cache(vicious.widgets.volume) -- Register widget vicious.register(myvolwidget, vicious.widgets.volume, "$1%", 2, "Master") -- Register buttons myvolwidget:buttons(gears.table.join( awful.button({ }, 1, function () exec("urxvt -T Alsamixer -e alsamixer") end), awful.button({ }, 4, function () exec("amixer -q -c 0 set Master 1dB+", false) end), awful.button({ }, 5, function () exec("amixer -q -c 0 set Master 1dB-", false) end) )) -- }}} -- {{{ Date and time mydateicon = wibox.widget.imagebox(home .. "/.config/awesome/icons/time.png", false) -- Initialize widgets mydatewidget = wibox.widget.textbox() mydatestwidget = wibox.widget.textbox() -- Register widgets vicious.register(mydatewidget, vicious.widgets.date, "%R", 61) -- Amsterdam vicious.register(mydatestwidget, vicious.widgets.date, "%R", 61, -21600) -- New York -- Register buttons mydatewidget:buttons(gears.table.join( -- GTK3 calendar applet with holidays: https://sysphere.org/~anrxc/local/sources/pylendar.py awful.button({ }, 1, function () exec(home .. "/bin/pylendar.py", false) end) )) mydatestwidget:buttons(gears.table.join( awful.button({ }, 1, function () exec(home .. "/bin/pylendar.py", false) end) )) -- }}} -- {{{ Flexible widget myflexeidget = wibox.widget.textbox() -- }}} -- {{{ Wibox initialisation local taglist_buttons = gears.table.join( awful.button({ }, 1, function(t) t:view_only() end), awful.button({ modkey }, 1, function(t) if client.focus then client.focus:move_to_tag(t) end end), awful.button({ }, 3, awful.tag.viewtoggle), awful.button({ modkey }, 3, function(t) if client.focus then client.focus:toggle_tag(t) end end), awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end), awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end) ) local tasklist_buttons = gears.table.join( awful.button({ }, 1, function (c) if c == client.focus then c.minimized = true else c:emit_signal( "request::activate", "tasklist", {raise = true} ) end end), awful.button({ }, 3, function() awful.menu.client_list({ theme = { width = 250 } }) end), awful.button({ }, 4, function () awful.client.focus.byidx(1) end), awful.button({ }, 5, function () awful.client.focus.byidx(-1) end)) -- Wallpaper signal handler local function set_wallpaper(s) if beautiful.wallpaper then local wallpaper = beautiful.wallpaper if type(wallpaper) == "function" then wallpaper = wallpaper(s) end gears.wallpaper.maximized(wallpaper, s, true) end end screen.connect_signal("property::geometry", set_wallpaper) awful.screen.connect_for_each_screen(function(s) set_wallpaper(s) -- Tags local names = { "term", "emacs", "web", "mail", "im", "6", "7", "ssh", "media" } local ly = awful.layout.suit local llayouts = { ly.tile, ly.tile, ly.tile, ly.magnifier, ly.tile, ly.floating, ly.floating, ly.fair, ly.floating } awful.tag(names, s, llayouts) -- Create a promptbox s.mypromptbox = awful.widget.prompt() -- Create a layoutbox s.mylayoutbox = awful.widget.layoutbox(s) s.mylayoutbox:buttons(gears.table.join( awful.button({ }, 1, function () awful.layout.inc( 1) end), awful.button({ }, 3, function () awful.layout.inc(-1) end), awful.button({ }, 4, function () awful.layout.inc( 1) end), awful.button({ }, 5, function () awful.layout.inc(-1) end) )) -- Create the taglist s.mytaglist = awful.widget.taglist { screen = s, filter = awful.widget.taglist.filter.all, buttons = taglist_buttons } -- Create the tasklist --s.mytasklist = awful.widget.tasklist { -- screen = s, -- filter = awful.widget.tasklist.filter.currenttags, -- buttons = tasklist_buttons --} -- Create the wibox -- * theme font "Terminus 8" or "ProFont 8" for this widget bar height s.mywibox = awful.wibar({ position = "top", screen = s, height = 12 }) -- Add widgets to the wibox s.mywibox:setup { layout = wibox.layout.align.horizontal, { -- Left widgets layout = wibox.layout.fixed.horizontal, s.mytaglist, s.mylayoutbox, myseparator, s.mypromptbox, }, { -- Middle widget layout = wibox.layout.flex.horizontal, myflexwidget, }, --s.mytasklist, { -- Right widgets layout = wibox.layout.fixed.horizontal, myseparator, mycpuicon, mycpuwidget, myseparator, mybaticon, mybatwidget, myseparator, mydnicon, mynetwidget, myupicon, myseparator, myvolicon, myvolwidget, myseparator, mydateicon, mydatestwidget, myseparator, mydateicon, mydatewidget, myseparator, s == scount and wibox.widget.systray() or nil, }, } end) -- }}} -- }}} -- {{{ Mouse bindings root.buttons(gears.table.join( awful.button({ }, 4, awful.tag.viewnext), awful.button({ }, 5, awful.tag.viewprev) )) -- }}} -- {{{ Key bindings globalkeys = gears.table.join( -- Tag browsing awful.key({ altkey, }, "p", awful.tag.viewprev, {description = "view previous", group = "tag"}), awful.key({ altkey, }, "n", awful.tag.viewnext, {description = "view next", group = "tag"}), awful.key({ altkey, }, "Tab", awful.tag.history.restore, {description = "go back", group = "tag"}), -- Focus controls awful.key({ modkey, }, "j", function () awful.client.focus.byidx( 1) end, {description = "focus next by index", group = "client"} ), awful.key({ modkey, }, "k", function () awful.client.focus.byidx(-1) end, {description = "focus previous by index", group = "client"} ), awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end, {description = "swap with next client by index", group = "client"}), awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end, {description = "swap with previous client by index", group = "client"}), awful.key({ modkey }, "p", function () awful.screen.focus_relative( 1) end, {description = "focus the next screen", group = "screen"}), awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end, {description = "focus the previous screen", group = "screen"}), awful.key({ modkey, }, "u", awful.client.urgent.jumpto, {description = "jump to urgent client", group = "client"}), awful.key({ modkey, }, "Tab", function () awful.client.focus.history.previous() if client.focus then client.focus:raise() end end, {description = "go back", group = "client"}), -- Multimedia keys awful.key({}, "#151", function () awful.spawn("xdg-screensaver lock") end, {description = "lock the screen", group = "launcher"}), awful.key({}, "#198", function () awful.spawn("amixer set Capture toggle") end, {description = "mute the microphone", group = "launcher"}), awful.key({}, "#233", function () awful.spawn(home .. "/bin/plight.py -a -c plus", false) end, {description = "increase brightness", group = "launcher"}), awful.key({}, "#232", function () awful.spawn(home .. "/bin/plight.py -a -c minus", false) end, {description = "decrease brightness", group = "launcher"}), -- Applications awful.key({ altkey, }, "F1", function () awful.spawn(terminal) end, {description = "open a terminal", group = "launcher"}), awful.key({ modkey, }, "w", function () awful.spawn("firefox") end, {description = "open a browser", group = "launcher"}), awful.key({ modkey, }, "n", function () awful.spawn("urxvt -T Terminal1 -e terminal1-expect-script") end, {description = "open ssh terminal1", group = "launcher"}), awful.key({ modkey, }, "v", function () awful.spawn("urxvt -T Terminal2 -e ssh terminal2") end, {description = "open ssh terminal2", group = "launcher"}), awful.key({ modkey, }, "a", function () awful.spawn("urxvt -T Alpine -e alpine") end, {description = "open e-mail client", group = "launcher"}), awful.key({ modkey, }, "e", function () awful.spawn("emacs") end, {description = "open emacs", group = "launcher"}), -- Awesome controls awful.key({ modkey, "Shift" }, "r", awesome.restart, {description = "reload awesome", group = "awesome"}), awful.key({ modkey, "Shift" }, "q", awesome.quit, {description = "quit awesome", group = "awesome"}), awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end, {description = "increase master width factor", group = "layout"}), awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end, {description = "decrease master width factor", group = "layout"}), awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1, nil, true) end, {description = "increase the number of master clients", group = "layout"}), awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1, nil, true) end, {description = "decrease the number of master clients", group = "layout"}), awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1, nil, true) end, {description = "increase the number of columns", group = "layout"}), awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1, nil, true) end, {description = "decrease the number of columns", group = "layout"}), awful.key({ modkey, }, "space", function () awful.layout.inc( 1) end, {description = "select next", group = "layout"}), awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(-1) end, {description = "select previous", group = "layout"}), awful.key({ modkey, "Control" }, "n", function () local c = awful.client.restore() if c then c:emit_signal( "request::activate", "key.unminimize", {raise = true} ) end end, {description = "restore minimized", group = "client"}), -- Prompt menus awful.key({ altkey }, "F2", function () awful.screen.focused().mypromptbox:run() end, {description = "run prompt", group = "launcher"}), awful.key({ altkey }, "F5", function () awful.prompt.run { prompt = "Run Lua code: ", textbox = awful.screen.focused().mypromptbox.widget, exe_callback = awful.util.eval, history_path = awful.util.get_cache_dir() .. "/history_eval" } end, {description = "lua execute prompt", group = "awesome"}) -- Menubar --awful.key({ modkey, "Control" }, "j", function() menubar.show() end, -- {description = "show the menubar", group = "launcher"}) ) -- {{{ Client manipulation clientkeys = gears.table.join( awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen c:raise() end, {description = "toggle fullscreen", group = "client"}), awful.key({ modkey, }, "c", function (c) c:kill() end, {description = "kill client", group = "client"}), awful.key({ modkey, "Shift" }, "f", awful.client.floating.toggle , {description = "toggle floating", group = "client"}), awful.key({ modkey, "Shift" }, "m", function (c) c:swap(awful.client.getmaster()) end, {description = "move to master", group = "client"}), awful.key({ modkey, "Control" }, "r", function (c) c:redraw() end, {description = "redraw client", group = "client"}), awful.key({ modkey, }, "o", function (c) c:move_to_screen() end, {description = "move to screen", group = "client"}), awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end, {description = "toggle keep on top", group = "client"}), awful.key({ modkey, }, "Next", function (c) awful.client.moveresize( 20, 20, -40, -40) end, {description = "resize client PgUP", group = "client"}), awful.key({ modkey, }, "Prior", function (c) awful.client.moveresize(-20, -20, 40, 40) end, {description = "resize client PgDN", group = "client"}), awful.key({ modkey, }, "Down", function (c) awful.client.moveresize(0, 20, 0, 0) end, {description = "move client down", group = "client"}), awful.key({ modkey, }, "Up", function (c) awful.client.moveresize(0, -20, 0, 0) end, {description = "move client up", group = "client"}), awful.key({ modkey, }, "Left", function (c) awful.client.moveresize(-20, 0, 0, 0) end, {description = "move client left", group = "client"}), awful.key({ modkey, }, "Right", function (c) awful.client.moveresize(20, 0, 0, 0) end, {description = "move client right", group = "client"}), awful.key({ modkey, "Shift" }, "t", function (c) awful.titlebar.toggle(c) end, {description = "remove client titlebar", group = "client"}), awful.key({ modkey, }, "m", function (c) c.maximized = not c.maximized c:raise() end , {description = "(un)maximize", group = "client"}) --awful.key({ modkey, "Control" }, "m", -- function (c) -- c.maximized_vertical = not c.maximized_vertical -- c:raise() -- end , -- {description = "(un)maximize vertically", group = "client"}), --awful.key({ modkey, "Shift" }, "m", -- function (c) -- c.maximized_horizontal = not c.maximized_horizontal -- c:raise() -- end , -- {description = "(un)maximize horizontally", group = "client"}) ) -- }}} -- {{{ Tag controls for i = 1, 9 do globalkeys = gears.table.join(globalkeys, awful.key({ modkey }, "#" .. i + 9, function () local screen = awful.screen.focused() local tag = screen.tags[i] if tag then tag:view_only() end end, {description = "view tag #"..i, group = "tag"}), awful.key({ modkey, "Control" }, "#" .. i + 9, function () local screen = awful.screen.focused() local tag = screen.tags[i] if tag then awful.tag.viewtoggle(tag) end end, {description = "toggle tag #" .. i, group = "tag"}), awful.key({ modkey, "Shift" }, "#" .. i + 9, function () if client.focus then local tag = client.focus.screen.tags[i] if tag then client.focus:move_to_tag(tag) end end end, {description = "move focused client to tag #"..i, group = "tag"}), awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, function () if client.focus then local tag = client.focus.screen.tags[i] if tag then client.focus:toggle_tag(tag) end end end, {description = "toggle focused client on tag #" .. i, group = "tag"}) ) end clientbuttons = gears.table.join( awful.button({ }, 1, function (c) c:emit_signal("request::activate", "mouse_click", {raise = true}) end), awful.button({ modkey }, 1, function (c) c:emit_signal("request::activate", "mouse_click", {raise = true}) awful.mouse.client.move(c) end), awful.button({ modkey }, 3, function (c) c:emit_signal("request::activate", "mouse_click", {raise = true}) awful.mouse.client.resize(c) end) ) -- Set keys root.keys(globalkeys) -- }}} -- {{{ Rules awful.rules.rules = { { rule = { }, properties = { border_width = beautiful.border_width, border_color = beautiful.border_normal, focus = awful.client.focus.filter, size_hints_honor = false, raise = true, keys = clientkeys, buttons = clientbuttons, screen = awful.screen.preferred, placement = awful.placement.no_overlap+awful.placement.no_offscreen } }, { rule = { name = "Alpine" }, properties = { screen = 1, tag = "mail" } }, { rule = { name = "alpine" }, properties = { screen = 1, tag = "mail" } }, { rule = { class = "Emacs" }, properties = { screen = scount, tag = "emacs" } }, { rule = { class = "Firefox" }, properties = { screen = scount, tag = "web" } }, { rule = { class = "firefox" }, properties = { screen = scount, tag = "web" } }, { rule = { class = "Slack" }, properties = { screen = scount, tag = "im" } }, { rule_any = { instance = { "xmessage", "pinentry", "plugin-container", }, class = { "Places", -- firefox downloads, history... "Pinentry.*", "Nautilus", "feh", "ROX-Filer", "Xmessage", }, name = { "Library", -- firefox downloads, history... "Event Tester", -- xev "Alsamixer", "About Mozilla Firefox", }, role = { "AlarmWindow", -- Thunderbird calendar "ConfigManager", -- Thunderbird about:config "pop-up", -- Browser developer tools } }, properties = { floating = true, titlebars_enabled = true }}, { rule_any = {type = { "normal", "dialog" } }, properties = { titlebars_enabled = true } }, } -- }}} -- {{{ Signals client.connect_signal("manage", function (c) if not awesome.startup then awful.client.setslave(c) end if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then awful.placement.no_overlap(c) awful.placement.no_offscreen(c) end if not awful.client.floating.get(c) then awful.titlebar.hide(c) end if awful.layout.get(c.screen) == awful.layout.suit.floating then awful.titlebar.show(c) end end) -- New client signal handlers client.connect_signal("request::titlebars", function(c) local buttons = gears.table.join( awful.button({ }, 1, function() c:emit_signal("request::activate", "titlebar", {raise = true}) awful.mouse.client.move(c) end), awful.button({ }, 3, function() c:emit_signal("request::activate", "titlebar", {raise = true}) awful.mouse.client.resize(c) end) ) -- Theme font "Terminus 8" or "ProFont 8" for this titlebar height awful.titlebar(c, { size = 16}) : setup { { -- Left awful.titlebar.widget.iconwidget(c), buttons = buttons, layout = wibox.layout.fixed.horizontal }, { -- Middle { -- Title align = "center", widget = awful.titlebar.widget.titlewidget(c) }, buttons = buttons, layout = wibox.layout.flex.horizontal }, { -- Right awful.titlebar.widget.floatingbutton (c), awful.titlebar.widget.maximizedbutton(c), awful.titlebar.widget.stickybutton (c), awful.titlebar.widget.ontopbutton (c), awful.titlebar.widget.closebutton (c), layout = wibox.layout.fixed.horizontal() }, layout = wibox.layout.align.horizontal } end) -- Enable sloppy focus client.connect_signal("mouse::enter", function(c) c:emit_signal("request::activate", "mouse_enter", {raise = false}) end) client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) -- }}} -- {{{ Screen padding -- * when a laptop is right in front of the monitor and its -- LCD is obstructing the view of the bottom of the screen -- on the external monitor if scount == 2 then awful.screen.padding(screen[1], { bottom = 235 }) end -- }}} -- {{{ Autostart awful.spawn("/usr/bin/xinput set-prop 9 334 0 1 0", false) -- touchpad single finger scrolling awful.spawn(home .. "/bin/autostart-keychain-agent.sh", false) -- launch the ssh-agent awful.spawn(home .. "/bin/autostart-xmodmap-xdefaults.sh", false) -- xrdb merge defaults and keymap -- }}}