summaryrefslogtreecommitdiffstats
path: root/.config/awesome/rc.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/rc.lua')
-rw-r--r--.config/awesome/rc.lua874
1 files changed, 874 insertions, 0 deletions
diff --git a/.config/awesome/rc.lua b/.config/awesome/rc.lua
new file mode 100644
index 0000000..21f79e8
--- /dev/null
+++ b/.config/awesome/rc.lua
@@ -0,0 +1,874 @@
+-- Standard awesome library
+local gears = require("gears")
+local awful = require("awful")
+require("awful.autofocus")
+-- Widget and layout library
+local wibox = require("wibox")
+-- Theme handling library
+local beautiful = require("beautiful")
+-- Notification library
+local naughty = require("naughty")
+local menubar = require("menubar")
+local hotkeys_popup = require("awful.hotkeys_popup").widget
+
+-- Load Debian menu entries
+require("debian.menu")
+
+-- Load vicious
+vicious = require("vicious")
+vicious.contrib = require("vicious.contrib")
+
+-- Load lain
+lain = require("lain")
+lain.helpers = require("lain.helpers")
+
+-- Load run_once function
+require("functions.run_once")
+
+-- {{{ Error handling
+-- Check if awesome encountered an error during startup and fell back to
+-- another config (This code will only ever execute for the fallback config)
+if awesome.startup_errors then
+ naughty.notify({ preset = naughty.config.presets.critical,
+ title = "Oops, there were errors during startup!",
+ text = awesome.startup_errors })
+end
+
+-- Handle runtime errors after startup
+do
+ local in_error = false
+ awesome.connect_signal("debug::error", function (err)
+ -- Make sure we don't go into an endless error loop
+ if in_error then return end
+ in_error = true
+
+ naughty.notify({ preset = naughty.config.presets.critical,
+ title = "Oops, an error happened!",
+ text = tostring(err) })
+ in_error = false
+ end)
+end
+-- }}}
+
+-- {{{ Variable definitions
+configpath="/home/"..os.getenv("USER").."/.config/awesome/"
+
+-- Themes define colours, icons, font and wallpapers.
+beautiful.init(configpath .. "/theme.lua")
+
+-- This is used later as the default terminal and editor to run.
+terminal = "/usr/bin/urxvtcd"
+editor = os.getenv("EDITOR") or "editor"
+editor_cmd = terminal .. " -e " .. editor
+
+-- System Info
+local popen_cmds = io.popen("hostname -f; egrep -o '([0-9]+)\.([0-9]+)(.[0-9]+)\-([0-9]+)' /proc/sys/kernel/version")
+local hostname = popen_cmds:read("*l")
+local kernel = popen_cmds:read("*l")
+popen_cmds:close()
+
+-- Default modkey.
+-- Usually, Mod4 is the key with a logo between Control and Alt.
+-- If you do not like this or do not have such a key,
+-- I suggest you to remap Mod4 to another key using xmodmap or other tools.
+-- However, you can use another modifier like Mod1, but it may interact with others.
+modkey = "Mod4"
+
+-- Static configs
+naughty.config.defaults.icon_size = 150
+
+-- Table of layouts to cover with awful.layout.inc, order matters.
+awful.layout.layouts = {
+ awful.layout.suit.tile,
+ awful.layout.suit.tile.left,
+ awful.layout.suit.tile.bottom,
+ awful.layout.suit.tile.top,
+ awful.layout.suit.fair,
+ awful.layout.suit.fair.horizontal,
+ -- awful.layout.suit.spiral,
+ -- awful.layout.suit.spiral.dwindle,
+ awful.layout.suit.floating,
+ awful.layout.suit.max,
+ -- awful.layout.suit.max.fullscreen,
+ -- awful.layout.suit.magnifier,
+ awful.layout.suit.corner.nw,
+ awful.layout.suit.corner.ne,
+ awful.layout.suit.corner.sw,
+ awful.layout.suit.corner.se,
+}
+-- }}}
+
+-- {{{ Helper functions
+local function client_menu_toggle_fn()
+ local instance = nil
+
+ return function ()
+ if instance and instance.wibox.visible then
+ instance:hide()
+ instance = nil
+ else
+ instance = awful.menu.clients({ theme = { width = 250 } })
+ end
+ end
+end
+-- }}}
+
+-- {{{ Menu
+-- Create a launcher widget and a main menu
+systemmenu = {
+ { "hotkeys", function() return false, hotkeys_popup.show_help end},
+ { "monitor standby", "sleep 2 && xset dpms force off" }, -- xset s blank
+ { "lock screen", "sleep 2 && xautolock -locknow"},
+ { "suspend", "systemctl suspend" },
+ { "hibernate", "systemctl hibernate" },
+ { "restart awesome", awesome.restart },
+ { "logoff", function() awesome.quit() end },
+ { "reboot to EFI", "systemctl reboot --firmware-setup" },
+ { "reboot", "systemctl reboot" },
+ { "halt", "systemctl poweroff" }
+}
+
+mymainmenu = awful.menu({ items = { { hostname , nil, beautiful.debian_icon },
+ { "linux " .. kernel, nil, beautiful.linux_icon },
+ { "awesome " .. awesome.version, nil, beautiful.awesome_icon },
+ { "" },
+ -- { "open terminal", terminal },
+ { "applications", debian.menu.Debian_menu.Debian },
+ { "system", systemmenu }
+ }
+ })
+
+mylauncher = awful.widget.launcher({ image = beautiful.debian_icon,
+ menu = mymainmenu })
+
+-- Menubar configuration
+menubar.utils.terminal = terminal -- Set the terminal for applications that require it
+-- }}}
+
+-- Keyboard map indicator and switcher
+mykeyboardlayout = awful.widget.keyboardlayout()
+
+-- {{{ Wibar
+-- Create a textclock widget
+mytextclock = wibox.widget.textclock("%a, %d %b %Y %H:%M")
+laincal = lain.widget.calendar({
+ attach_to = { mytextclock },
+ followtag = true,
+ cal = "/usr/bin/gcal -H no",
+ notification_preset = {
+ fg = "#FFFFFF",
+ bg = beautiful.bg_normal,
+ position = "bottom_right",
+ font = "dejavu sans mono 8"
+ }
+})
+
+-- {{ Divider widgets
+dividerwidget = wibox.widget.textbox()
+dividerwidget:set_text(" | ")
+
+ldividerwidget = wibox.widget.textbox()
+ldividerwidget:set_text("| ")
+
+rdividerwidget = wibox.widget.textbox()
+rdividerwidget:set_text(" |")
+
+spacewidget = wibox.widget.textbox()
+spacewidget:set_text(" ")
+-- }}
+
+-- {{ Load widget
+loadwidget = wibox.widget.textbox()
+vicious.cache(vicious.widgets.uptime)
+vicious.register(loadwidget, vicious.widgets.uptime, "load: $4, $5, $6", 3)
+loadwidget:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell(terminal .. " -n htop -e htop") end)
+ )
+ )
+-- }}
+
+-- {{ Memory widget
+memwidget = wibox.widget.textbox()
+vicious.cache(vicious.widgets.mem)
+vicious.register(memwidget, vicious.widgets.mem, "mem: $1%", 3)
+-- }}
+
+-- {{ CPU widget
+cpuwidget = wibox.widget.textbox()
+vicious.cache(vicious.widgets.cpu)
+vicious.register(cpuwidget, vicious.widgets.cpu, "cpu: $1%", 3)
+-- }}
+
+-- {{ Network widget
+netwidget = wibox.widget.textbox()
+vicious.cache(vicious.widgets.net)
+vicious.register(netwidget, vicious.widgets.net, "net: ↑${eth0 up_kb}kb/s↑ ↓${eth0 down_kb}kb/s↓", 3)
+-- }}
+
+-- {{ Volume widget
+volwidget = wibox.widget.textbox()
+volmenu = awful.menu({ items = { { "pavucontrol", function() awful.spawn.with_shell("/usr/bin/pavucontrol") end },
+ { "" },
+ { "headphones", function() awful.spawn.with_shell("pacmd set-default-sink headphones") end },
+ { "speakers", function() awful.spawn.with_shell("pacmd set-default-sink speakers") end }
+ }
+ })
+vicious.cache(vicious.contrib.pulse)
+vicious.register(volwidget, vicious.contrib.pulse,
+ function(widget, args)
+ local volvalue = nil
+ if args[1] == 0 then
+ volvalue = " M"
+ else
+ volvalue = args[1]
+ end
+ return "vol: " .. volvalue .. "%"
+ end, 1, "alsa_output.pci-0000_05_00.0.analog-surround-71" )
+volwidget:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("pactl set-sink-mute 0 toggle") end),
+ awful.button({ }, 3, function() volmenu:show() end),
+ awful.button({ }, 4, function() awful.spawn.with_shell("pactl set-sink-volume 0 +5%") end),
+ awful.button({ }, 5, function() awful.spawn.with_shell("pactl set-sink-volume 0 -5%") end)
+ )
+ )
+-- }}
+
+-- {{ Package widget
+pkgwidget = wibox.widget.textbox()
+vicious.cache(vicious.widgets.pkg)
+vicious.register(pkgwidget, vicious.widgets.pkg, "pkg: $1", 1800, "Debian")
+-- }}
+
+-- {{ Weather widget
+weatherwidget = lain.widget.weather({
+ city_id = 2964574, -- Dublin, Ireland
+ units = "metric",
+ cnt = 1,
+ forecast_call = "curl -s 'http://api.openweathermap.org/data/2.5/forecast?id=%s&units=%s&lang=%s&cnt=%s&APPID=%s'",
+ notification_preset = {fg = "#FFFFFF",bg = beautiful.bg_normal,position = "bottom_right",font = "dejavu sans mono 8" },
+ notification_text_fun = function(wn)
+ --local day = os.date("%A", wn["dt"])
+ local desc = wn["weather"][1]["description"]
+ local temp = math.floor(wn["main"]["temp"])
+ --local sunrise = tonumber(wn["sys"]["sunrise"])
+ local pres = math.floor(wn["main"]["pressure"])
+ local humi = math.floor(wn["main"]["humidity"])
+ local wspe = math.floor(wn["wind"]["speed"])
+ local wdeg = math.floor(wn["wind"]["deg"])
+ local clou = math.floor(wn["clouds"]["all"])
+ local rain3h = 0
+ if wn["rain"]["3h"] then
+ rain3h = math.floor(wn["rain"]["3h"])
+ end
+
+ -- format infos as you like, HTML text markup is allowed
+ return string.format("%s<br>temperature: %d°C<br>pressure: %dhPa<br>humidity: %d%%<br>wind: %d m/s at %d°<br>cloudliness: %d%%<br>rain: %d mm", desc, temp, pres, humi, wspe, wdeg, clou, rain3h)
+ end,
+ settings = function()
+ units = math.floor(weather_now["main"]["temp"])
+ widget:set_text(units .. "°C")
+ end
+})
+weatherwidget.widget:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/firefox http://www.met.ie/latest/rainfall_radar.asp") end),
+ awful.button({ }, 3, function() awful.spawn.with_shell("/usr/bin/firefox http://www.met.ie/forecasts/5day-ireland.asp") end)
+ )
+ )
+
+
+-- {{ gmusicbrowser widget (set using awesome-client)
+gmbwidget = wibox.widget.textbox()
+gmbwidget:set_text("music: nothing playing")
+gmbwidget:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/gmusicbrowser -cmd PlayPause") end),
+ awful.button({ }, 3, function() screen[2].tags[3]:view_only() end),
+ awful.button({ }, 4, function() awful.spawn.with_shell("/usr/bin/gmusicbrowser -cmd NextSong -ifnotrunning abort") end),
+ awful.button({ }, 5, function() awful.spawn.with_shell("/usr/bin/gmusicbrowser -cmd PrevSong -ifnotrunning abort") end)
+ )
+ )
+-- }}
+
+-- {{ quodlibet widget (using quodlibet dbus signal)
+quodlibetwidget = wibox.widget.textbox()
+quodlibetwidget:set_text("music: nothing playing")
+dbus.add_match("session", "interface='net.sacredchao.QuodLibet'")
+dbus.connect_signal("net.sacredchao.QuodLibet", function(...)
+ local dbussignal = {...}
+ if dbussignal[1].member == 'SongStarted' then
+ quodlibetwidget:set_text("music: " .. dbussignal[2].title .. " by " .. dbussignal[2].artist )
+ else if dbussignal[1].member == 'SongEnded' then
+ quodlibetwidget:set_text("music: nothing playing")
+ end
+ end
+ end)
+quodlibetwidget:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/quodlibet --run --play-pause") end),
+ --awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/xdotool key ctrl+shift+8") end),
+ awful.button({ }, 3, function() screen[2].tags[3]:view_only() end),
+ awful.button({ }, 4, function() awful.spawn.with_shell("/usr/bin/quodlibet --next") end),
+ awful.button({ }, 5, function() awful.spawn.with_shell("/usr/bin/quodlibet --force-previous") end)
+ )
+ )
+-- }}
+
+-- {{ Quicklaunch
+quicklaunch_urxvt = wibox.widget.imagebox()
+quicklaunch_urxvt:set_image("/usr/share/pixmaps/urxvt_32x32.xpm")
+quicklaunch_urxvt:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/urxvt") end)
+ )
+ )
+
+quicklaunch_firefox = wibox.widget.imagebox()
+quicklaunch_firefox:set_image("/usr/share/icons/hicolor/32x32/apps/firefox.png")
+quicklaunch_firefox:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/firefox") end),
+ awful.button({ }, 3, function() awful.spawn.with_shell("/usr/bin/firefox -private-window") end)
+ )
+ )
+
+quicklaunch_chromium = wibox.widget.imagebox()
+quicklaunch_chromium:set_image("/usr/share/icons/hicolor/48x48/apps/chromium.png")
+quicklaunch_chromium:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/chromium %U --incognito --user-agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36\"" ) end),
+ awful.button({ }, 3, function() awful.spawn.with_shell("/usr/bin/chromium %U --incognito --user-agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36\" --disable-plugins --disable-bundled-ppapi-flash --proxy-server=alpha:8123 --host-resolver-rules=\"MAP * 0.0.0.0 , EXCLUDE alpha\" http://check.torproject.org") end)
+ )
+ )
+
+quicklaunch_chrome = wibox.widget.imagebox()
+quicklaunch_chrome:set_image("/opt/google/chrome/product_logo_64.png")
+quicklaunch_chrome:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/google-chrome") end)
+ )
+ )
+
+quicklaunch_torbrowser = wibox.widget.imagebox()
+quicklaunch_torbrowser:set_image("/usr/share/pixmaps/torbrowser.png")
+quicklaunch_torbrowser:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/torbrowser-launcher" ) end)
+ )
+ )
+
+quicklaunch_chrome_gpm = wibox.widget.imagebox()
+quicklaunch_chrome_gpm:set_image("/home/jmccrohan/.config/awesome/icons/googleplaymusic.png")
+quicklaunch_chrome_gpm:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/google-chrome --app=https://play.google.com/music/listen") end)
+ )
+ )
+
+quicklaunch_mutt = wibox.widget.imagebox()
+quicklaunch_mutt:set_image("/usr/share/pixmaps/mutt.xpm")
+quicklaunch_mutt:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() os.execute("sleep 1"); awful.spawn.with_shell(terminal .. " -n mutt -e mutt") end)
+ )
+ )
+
+quicklaunch_vlc = wibox.widget.imagebox()
+quicklaunch_vlc:set_image("/usr/share/icons/hicolor/32x32/apps/vlc.png")
+quicklaunch_vlc:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/vlc") end)
+ )
+ )
+
+--quicklaunch_gmusicbrowser = wibox.widget.imagebox()
+--quicklaunch_gmusicbrowser:set_image("/usr/share/icons/hicolor/32x32/apps/gmusicbrowser.png")
+--quicklaunch_gmusicbrowser:buttons(awful.util.table.join(
+-- )
+-- )
+
+quicklaunch_quodlibet = wibox.widget.imagebox()
+quicklaunch_quodlibet:set_image("/usr/share/icons/hicolor/64x64/apps/quodlibet.png")
+quicklaunch_quodlibet:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/quodlibet") end)
+ )
+ )
+
+quicklaunch_virtmanager = wibox.widget.imagebox()
+quicklaunch_virtmanager:set_image("/usr/share/icons/hicolor/32x32/apps/virt-manager.png")
+quicklaunch_virtmanager:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/virt-manager") end)
+ )
+ )
+
+quicklaunch_remmina = wibox.widget.imagebox()
+quicklaunch_remmina:set_image("/usr/share/icons/hicolor/32x32/apps/remmina.png")
+quicklaunch_remmina:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/remmina") end)
+ )
+ )
+
+quicklaunch_thunar = wibox.widget.imagebox()
+quicklaunch_thunar:set_image("/usr/share/icons/gnome/32x32/places/user-home.png")
+quicklaunch_thunar:buttons(awful.util.table.join(
+ awful.button({ }, 1, function() awful.spawn.with_shell("/usr/bin/thunar") end)
+ )
+ )
+
+-- Create Quicklaunch wibox
+local quicklaunch = wibox.layout.fixed.horizontal()
+quicklaunch:add(quicklaunch_urxvt)
+quicklaunch:add(quicklaunch_firefox)
+quicklaunch:add(quicklaunch_mutt)
+quicklaunch:add(quicklaunch_quodlibet)
+quicklaunch:add(quicklaunch_chrome_gpm)
+quicklaunch:add(quicklaunch_chromium)
+quicklaunch:add(quicklaunch_chrome)
+quicklaunch:add(quicklaunch_torbrowser)
+quicklaunch:add(quicklaunch_vlc)
+quicklaunch:add(quicklaunch_virtmanager)
+quicklaunch:add(quicklaunch_remmina)
+quicklaunch:add(quicklaunch_thunar)
+--}}
+
+-- Create a wibox for each screen and add it
+local taglist_buttons = awful.util.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 = awful.util.table.join(
+ awful.button({ }, 1, function (c)
+ if c == client.focus then
+ c.minimized = true
+ else
+ -- Without this, the following
+ -- :isvisible() makes no sense
+ c.minimized = false
+ if not c:isvisible() and c.first_tag then
+ c.first_tag:view_only()
+ end
+ -- This will also un-minimize
+ -- the client, if needed
+ client.focus = c
+ c:raise()
+ end
+ end),
+ awful.button({ }, 3, client_menu_toggle_fn()),
+ awful.button({ }, 4, function ()
+ awful.client.focus.byidx(1)
+ end),
+ awful.button({ }, 5, function ()
+ awful.client.focus.byidx(-1)
+ end))
+
+local function set_wallpaper(s)
+ -- Wallpaper
+ if beautiful.wallpaper then
+ local wallpaper = beautiful.wallpaper
+ -- If wallpaper is a function, call it with the screen
+ if type(wallpaper) == "function" then
+ wallpaper = wallpaper(s)
+ end
+ gears.wallpaper.maximized(wallpaper, s, true)
+ end
+end
+
+-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution)
+screen.connect_signal("property::geometry", set_wallpaper)
+
+awful.screen.connect_for_each_screen(function(s)
+ -- Wallpaper
+ set_wallpaper(s)
+
+ -- Each screen has its own tag table.
+ awful.tag({ "", "", "", "", "", "" }, s, awful.layout.layouts[1])
+
+ -- Create a promptbox for each screen
+ s.mypromptbox = awful.widget.prompt()
+ -- Create an imagebox widget which will contains an icon indicating which layout we're using.
+ -- We need one layoutbox per screen.
+ s.mylayoutbox = awful.widget.layoutbox(s)
+ s.mylayoutbox:buttons(awful.util.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 a taglist widget
+ s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, taglist_buttons)
+
+ -- Create a tasklist widget
+ s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, tasklist_buttons)
+
+ -- Create the wibox
+ s.mywibox = awful.wibar({ position = "bottom", height = "15", screen = s })
+
+ -- Add widgets to the wibox
+ s.mywibox:setup {
+ layout = wibox.layout.align.horizontal,
+ { -- Left widgets
+ layout = wibox.layout.fixed.horizontal,
+ s.index == 1 and mylauncher,
+ s.index == 1 and spacewidget,
+ s.index == 1 and spacewidget,
+ s.index == 1 and spacewidget,
+ s.index == 1 and spacewidget,
+ s.index == 1 and quicklaunch,
+ s.index == 1 and spacewidget,
+ s.index == 1 and spacewidget,
+ s.index == 1 and spacewidget,
+ s.index == 1 and spacewidget,
+
+ s.mypromptbox,
+ },
+ s.mytasklist, -- Middle widget
+ { -- Right widgets
+ layout = wibox.layout.fixed.horizontal,
+ s.index == 1 and mykeyboardlayout,
+ s.index == 1 and wibox.widget.systray(),
+ s.index == 1 and dividerwidget,
+ s.index == 1 and volwidget,
+ s.index == 1 and dividerwidget,
+ s.index == 1 and weatherwidget,
+ s.index == 1 and dividerwidget,
+ s.index == 1 and mytextclock,
+
+ s.index == 2 and ldividerwidget,
+ s.index == 2 and quodlibetwidget,
+ s.index == 2 and dividerwidget,
+ s.index == 2 and loadwidget,
+ s.index == 2 and dividerwidget,
+ s.index == 2 and memwidget,
+ s.index == 2 and dividerwidget,
+ s.index == 2 and netwidget,
+ s.index == 2 and dividerwidget,
+ s.index == 2 and pkgwidget,
+
+ s.mylayoutbox,
+ s.mytaglist,
+ },
+ }
+end)
+-- }}}
+
+-- {{{ Mouse bindings
+root.buttons(awful.util.table.join(
+ awful.button({ }, 3, function () mymainmenu:toggle() end),
+ awful.button({ }, 4, awful.tag.viewnext),
+ awful.button({ }, 5, awful.tag.viewprev)
+))
+-- }}}
+
+-- {{{ Key bindings
+globalkeys = awful.util.table.join(
+ awful.key({ modkey, }, "s", hotkeys_popup.show_help,
+ {description="show help", group="awesome"}),
+ awful.key({ modkey, }, "Left", awful.tag.viewprev,
+ {description = "view previous", group = "tag"}),
+ awful.key({ modkey, }, "Right", awful.tag.viewnext,
+ {description = "view next", group = "tag"}),
+ awful.key({ modkey, }, "Escape", awful.tag.history.restore,
+ {description = "go back", group = "tag"}),
+
+ 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, }, "w", function () mymainmenu:show() end,
+ {description = "show main menu", group = "awesome"}),
+
+ -- Layout manipulation
+ 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, "Control" }, "j", 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"}),
+
+ -- Standard program
+ awful.key({ modkey, }, "Return", function () awful.spawn(terminal) end,
+ {description = "open a terminal", group = "launcher"}),
+ awful.key({ modkey, "Control" }, "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()
+ -- Focus restored client
+ if c then
+ client.focus = c
+ c:raise()
+ end
+ end,
+ {description = "restore minimized", group = "client"}),
+
+ -- Prompt
+ awful.key({ modkey }, "r", function () awful.screen.focused().mypromptbox:run() end,
+ {description = "run prompt", group = "launcher"}),
+
+ awful.key({ modkey }, "x",
+ 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 }, "p", function() menubar.show() end,
+ {description = "show the menubar", group = "launcher"})
+)
+
+clientkeys = awful.util.table.join(
+ awful.key({ modkey, }, "f",
+ function (c)
+ c.fullscreen = not c.fullscreen
+ c:raise()
+ end,
+ {description = "toggle fullscreen", group = "client"}),
+ awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end,
+ {description = "close", group = "client"}),
+ awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ,
+ {description = "toggle floating", group = "client"}),
+ awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end,
+ {description = "move to master", 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, }, "n",
+ function (c)
+ -- The client currently has the input focus, so it cannot be
+ -- minimized, since minimized clients can't have the focus.
+ c.minimized = true
+ end ,
+ {description = "minimize", group = "client"}),
+ awful.key({ modkey, }, "m",
+ function (c)
+ c.maximized = not c.maximized
+ c:raise()
+ end ,
+ {description = "maximize", group = "client"})
+)
+
+-- Bind all key numbers to tags.
+-- Be careful: we use keycodes to make it works on any keyboard layout.
+-- This should map on the top row of your keyboard, usually 1 to 9.
+for i = 1, 9 do
+ globalkeys = awful.util.table.join(globalkeys,
+ -- View tag only.
+ 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"}),
+ -- Toggle tag display.
+ 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"}),
+ -- Move client to 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"}),
+ -- Toggle tag on focused client.
+ 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 = 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))
+
+-- Set keys
+root.keys(globalkeys)
+-- }}}
+
+-- {{{ Rules
+-- Rules to apply to new clients (through the "manage" signal).
+awful.rules.rules = {
+ -- All clients will match this rule.
+ { rule = { },
+ properties = { border_width = beautiful.border_width,
+ border_color = beautiful.border_normal,
+ focus = awful.client.focus.filter,
+ raise = true,
+ keys = clientkeys,
+ buttons = clientbuttons,
+ size_hints_honor = false,
+ screen = awful.screen.preferred,
+ placement = awful.placement.no_overlap+awful.placement.no_offscreen
+ }
+ },
+
+ { rule = { class = "gimp" }, properties = { floating = true } },
+ { rule = { class = "Firefox" }, properties = { floating = true } },
+ { rule = { class = "Firefox", instance = "Navigator" }, properties = { tag = screen[1].tags[1], floating = false } },
+ { rule = { class = "Thunar" }, properties = { tag = screen[1].tags[2], switchtotag = true } },
+ { rule = { class = "Evince" }, properties = { tag = screen[1].tags[3], switchtotag = true } },
+ { rule = { class = "Eog" }, properties = { tag = screen[1].tags[4], switchtotag = true } },
+ { rule = { name = "mutt" }, properties = { tag = screen[2].tags[2] } },
+ { rule = { class = "Gmusicbrowser" }, properties = { tag = screen[2].tags[3] } },
+ { rule = { class = "Quodlibet" }, properties = { tag = screen[2].tags[3] } },
+ { rule = { class = "Google-chrome", instance = "play.google.com__music" }, properties = { tag = screen[2].tags[3] } },
+ { rule = { class = "Steam" }, properties = { floating = true, tag = screen[2].tags[4] } },
+ { rule = { instance = "plugin-container" }, properties = { floating = true }, callback = awful.titlebar.add },
+ { rule = { instance = "exe", class = "Exe" }, properties = { floating = true } },
+ { rule = { class = "Wine" }, properties = { floating = true } },
+
+ -- Add titlebars to normal clients and dialogs
+ --{ rule_any = {type = { "normal", "dialog" }
+ -- }, properties = { titlebars_enabled = true }
+ --},
+
+ -- Set Firefox to always map on the tag named "2" on screen 1.
+ -- { rule = { class = "Firefox" },
+ -- properties = { screen = 1, tag = "2" } },
+}
+-- }}}
+
+-- {{{ Signals
+-- Signal function to execute when a new client appears.
+client.connect_signal("manage", function (c)
+ -- Set the windows at the slave,
+ -- i.e. put it at the end of others instead of setting it master.
+ -- 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
+ -- Prevent clients from being unreachable after screen count changes.
+ awful.placement.no_offscreen(c)
+ end
+end)
+
+-- Add a titlebar if titlebars_enabled is set to true in the rules.
+client.connect_signal("request::titlebars", function(c)
+ -- buttons for the titlebar
+ local buttons = awful.util.table.join(
+ awful.button({ }, 1, function()
+ client.focus = c
+ c:raise()
+ awful.mouse.client.move(c)
+ end),
+ awful.button({ }, 3, function()
+ client.focus = c
+ c:raise()
+ awful.mouse.client.resize(c)
+ end)
+ )
+
+ awful.titlebar(c) : 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, so that focus follows mouse.
+client.connect_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.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)
+-- }}}
+
+-- {{{ Startup Apps
+run_once("redshift")
+run_once("xbindkeys")
+-- run_once("parcellite", "parcellite --no-icon")
+run_once("nitrogen", "nitrogen --restore")
+run_once("xautolock", "xautolock -time 20 -locker 'i3lock -denc 000000' -killtime 60 -killer 'systemctl suspend' -detectsleep")
+run_once("pulseaudio", "pulseaudio --daemonize")
+-- }}}