From 6a5354e09fcf0a89e2d48bd80ecd494fc52c7b48 Mon Sep 17 00:00:00 2001 From: "Adrian C. (anrxc)" Date: Mon, 27 May 2024 17:08:20 +0200 Subject: rc.lua: port to awesomev4 Old awesomewm v3 configuration moved to branch awesomev3. --- rc.lua | 981 ++++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 511 insertions(+), 470 deletions(-) (limited to 'rc.lua') diff --git a/rc.lua b/rc.lua index c2347ca..1601c2e 100644 --- a/rc.lua +++ b/rc.lua @@ -1,6 +1,6 @@ -- {{{ License -- --- Awesome configuration, using awesome 3.4.14 on Arch GNU/Linux +-- Awesome configuration, using awesome 4.3-7 on Debian GNU/Linux -- * Adrian C. -- Screenshot: http://sysphere.org/gallery/snapshots @@ -11,556 +11,597 @@ -- {{{ Libraries -require("awful") -require("awful.rules") +pcall(require, "luarocks.loader") +-- Standard awesome library +local gears = require("gears") +local awful = require("awful") require("awful.autofocus") --- User libraries -vicious = require("vicious") -scratch = require("scratch") +-- 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 -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() +terminal = "/usr/bin/urxvt" +editor = "emacs" +editor_cmd = terminal .. " -e emacs -nw" +modkey = "Mod4" +altkey = "Mod1" +exec = awful.spawn +scount = screen.count() -- Beautiful theme -beautiful.init(home .. "/.config/awesome/zenburn.lua") +beautiful.init(gears.filesystem.get_themes_dir() .. "zenburn/theme.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 +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, } -- }}} - --- {{{ Tags -tags = { - names = { "term", "emacs", "web", "mail", "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 +-- {{{ Menu +--menubar.utils.terminal = terminal -- }}} --- {{{ Wibox --- --- {{{ Widgets configuration +-- {{{ Wibar -- -- {{{ Reusable separator -separator = widget({ type = "imagebox" }) -separator.image = image(beautiful.widget_sep) --- }}} - --- {{{ 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(40):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, " $1C", 19, "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) +myseparator = wibox.widget.imagebox("/home/anrxc/.config/awesome/icons/separator.png", false) -- }}} --- {{{ Network usage -dnicon = widget({ type = "imagebox" }) -upicon = widget({ type = "imagebox" }) -dnicon.image = image(beautiful.widget_net) -upicon.image = image(beautiful.widget_netup) +-- {{{ CPU temperature +mycpuicon = wibox.widget.imagebox("/home/anrxc/.config/awesome/icons/cpu.png", false) -- Initialize widget -netwidget = widget({ type = "textbox" }) +mycpuwidget = wibox.widget.textbox() -- Register widget -vicious.register(netwidget, vicious.widgets.net, '${eth0 down_kb} ${eth0 up_kb}', 3) +vicious.register(mycpuwidget, vicious.widgets.thermal, "$1C", 19, "thermal_zone0") -- }}} --- {{{ Mail subject -mailicon = widget({ type = "imagebox" }) -mailicon.image = image(beautiful.widget_mail) +-- {{{ Battery state +mybaticon = wibox.widget.imagebox("/home/anrxc/.config/awesome/icons/bat.png", false) -- Initialize widget -mailwidget = widget({ type = "textbox" }) +mybatwidget = wibox.widget.textbox() -- Register widget -vicious.register(mailwidget, vicious.widgets.mbox, "$1", 181, {home .. "/mail/Inbox", 15}) --- Register buttons -mailwidget:buttons(awful.util.table.join( - awful.button({ }, 1, function () exec("urxvt -T Alpine -e alpine.exp") end) -)) +vicious.register(mybatwidget, vicious.widgets.bat, "$1$2%", 61, "BAT0") -- }}} --- {{{ Org-mode agenda -orgicon = widget({ type = "imagebox" }) -orgicon.image = image(beautiful.widget_org) --- Initialize widget -orgwidget = widget({ type = "textbox" }) --- Configure widget -local orgmode = { - files = { home.."/.org/computers.org", - home.."/.org/index.org", home.."/.org/personal.org", - }, - color = { - past = '', - today = '', - soon = '', - future = '' -}} -- Register widget -vicious.register(orgwidget, vicious.widgets.org, - orgmode.color.past..'$1-'..orgmode.color.today .. '$2-' .. - orgmode.color.soon..'$3-'..orgmode.color.future.. '$4', 601, - orgmode.files -) -- Register buttons -orgwidget:buttons(awful.util.table.join( - awful.button({ }, 1, function () exec("emacsclient --eval '(org-agenda-list)'") end), - awful.button({ }, 3, function () exec("emacsclient --eval '(make-remember-frame)'") end) -)) --- }}} - --- {{{ Volume level -volicon = widget({ type = "imagebox" }) -volicon.image = image(beautiful.widget_vol) +-- {{{ Date and time +mydateicon = wibox.widget.imagebox("/home/anrxc/.config/awesome/icons/time.png", false) -- Initialize widgets -volbar = awful.widget.progressbar() -volwidget = widget({ type = "textbox" }) --- Progressbar properties -volbar:set_vertical(true):set_ticks(true) -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_widget, - beautiful.fg_center_widget, beautiful.fg_end_widget -}) -- Enable caching -vicious.cache(vicious.widgets.volume) +mydatewidget = wibox.widget.textbox() +mydatestwidget = wibox.widget.textbox() -- Register widgets -vicious.register(volbar, vicious.widgets.volume, "$1", 2, "PCM") -vicious.register(volwidget, vicious.widgets.volume, " $1%", 2, "PCM") --- Register buttons -volbar.widget:buttons(awful.util.table.join( - awful.button({ }, 1, function () exec("kmix") end), - awful.button({ }, 4, function () exec("amixer -q set PCM 1dB+", false) end), - awful.button({ }, 5, function () exec("amixer -q set PCM 1dB-", false) end) -)) -- Register assigned buttons -volwidget:buttons(volbar.widget:buttons()) +vicious.register(mydatewidget, vicious.widgets.date, "%R", 61) -- Amsterdam +vicious.register(mydatestwidget, vicious.widgets.date, "%R", 61, -21600) -- New York -- }}} --- {{{ 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, "%R", 61) --- Register buttons -datewidget:buttons(awful.util.table.join( - awful.button({ }, 1, function () exec("pylendar.py") end) -)) --- }}} - --- {{{ System tray -systray = widget({ type = "systray" }) --- }}} --- }}} -- {{{ 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({ }, 4, awful.tag.viewnext), - awful.button({ }, 5, awful.tag.viewprev -)) +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) -for s = 1, scount do -- Create a promptbox - promptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright }) + s.mypromptbox = awful.widget.prompt() + -- 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) + 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 - taglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, taglist.buttons) + 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 - 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 - }) + -- * 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 - wibox[s].widgets = { - { taglist[s], layoutbox[s], separator, promptbox[s], - ["layout"] = awful.widget.layout.horizontal.leftright + s.mywibox:setup { + layout = wibox.layout.align.horizontal, + { -- Left widgets + layout = wibox.layout.fixed.horizontal, + s.mytaglist, + s.mylayoutbox, + myseparator, + s.mypromptbox, + }, + s.mytasklist, -- Middle widget + { -- Right widgets + layout = wibox.layout.fixed.horizontal, + myseparator, + mycpuicon, + mycpuwidget, + myseparator, + mybaticon, + mybatwidget, + myseparator, + mydateicon, + mydatestwidget, + myseparator, + mydateicon, + mydatewidget, + myseparator, + s == scount and wibox.widget.systray() or nil, }, - s == 1 and systray or nil, - separator, datewidget, dateicon, - separator, volwidget, volbar.widget, volicon, - separator, orgwidget, orgicon, - separator, mailwidget, mailicon, - separator, upicon, netwidget, dnicon, - separator, fs.s.widget, fs.h.widget, fs.r.widget, fs.b.widget, fsicon, - separator, membar.widget, memicon, - separator, batwidget, baticon, - separator, tzswidget, cpugraph.widget, cpuicon, - separator, ["layout"] = awful.widget.layout.horizontal.rightleft } -end +end) -- }}} -- }}} - -- {{{ Mouse bindings -root.buttons(awful.util.table.join( +root.buttons(gears.table.join( awful.button({ }, 4, awful.tag.viewnext), awful.button({ }, 5, 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 }, "e", function () exec("emacsclient -n -c") end), - awful.key({ modkey }, "r", function () exec("rox", false) end), - awful.key({ modkey }, "w", function () exec("firefox") end), - awful.key({ altkey }, "F1", function () exec("urxvt") end), - awful.key({ altkey }, "#49", 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({ modkey }, "g", function () sexec("GTK2_RC_FILES=~/.gtkrc-gajim gajim") end), - awful.key({ modkey }, "q", function () exec("emacsclient --eval '(make-remember-frame)'") 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({}, "#160", function () exec("kscreenlocker --forcelock") end), - --awful.key({}, "#121", function () exec("pvol.py -m") end), - awful.key({}, "#122", function () exec("pvol.py -p -c -2") end), - awful.key({}, "#123", function () exec("pvol.py -p -c 2") end), - awful.key({}, "#232", function () exec("plight.py -s") end), - awful.key({}, "#233", function () exec("plight.py -s") end), - --awful.key({}, "#150", function () exec("sudo /usr/bin/pm-suspend") end), - awful.key({}, "#213", function () exec("sudo /usr/bin/pm-hibernate") end), - --awful.key({}, "#235", function () exec("xset dpms force off") end), - awful.key({}, "#235", function () exec("pypres.py") end), - awful.key({}, "#244", function () sexec("acpitool -b | xmessage -timeout 10 -file -") 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("firefox '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) - -- }}} +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"}), + + -- 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 = 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) +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"}) ) -- }}} --- {{{ 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)) +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 = { - focus = true, size_hints_honor = false, - keys = clientkeys, buttons = clientbuttons, - border_width = beautiful.border_width, - border_color = beautiful.border_normal } + { 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 = "4" } }, + { rule = { class = "Emacs" }, + properties = { screen = scount, tag = "2" } }, + { rule = { class = "Firefox" }, + properties = { screen = scount, tag = "3" } }, + { rule = { class = "Slack" }, + properties = { screen = scount, tag = "5" } }, + + { 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 + }, + + 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 } }, - { rule = { class = "Firefox", instance = "Navigator" }, - 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 } }, } -- }}} - -- {{{ 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 +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 - -- 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 awful.client.floating.get(c) then + awful.titlebar.hide(c) + end - 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 + if awful.layout.get(c.screen) == awful.layout.suit.floating then + awful.titlebar.show(c) 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) +-- 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) -- }}} --- {{{ 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) +-- {{{ 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") -- touchpad single finger scrolling +awful.spawn("/home/anrxc/bin/autostart-keychain-agent.sh") -- launch the ssh-agent +awful.spawn("/home/anrxc/bin/autostart-xmodmap-xdefaults.sh") -- xrdb merge defaults and keymap -- }}} -- cgit v1.2.3