--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/awesome/rc.lua Mon Oct 27 12:54:34 2014 -0400
@@ -0,0 +1,645 @@
+require("debug")
+--
+-- Standard awesome library
+require("awful")
+require("awful.autofocus")
+-- Theme handling library
+require("beautiful")
+-- Notification library
+require("naughty")
+-- shifty - dynamic tagging library
+require("shifty")
+-- Revelation
+require("revelation")
+-- vicious widgets
+local vicious = require("vicious")
+local wicked = require("wicked")
+-- Load Debian menu entries
+require("debian.menu")
+
+-- require("keychains")
+
+require("my")
+
+-- {{{ 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
+ awesome.add_signal("debug::error", my.notify_error)
+end
+-- }}}
+
+-- Variable definitions
+-- Themes define colours, icons, and wallpapers
+-- The default is a dark theme
+-- theme_path = "/usr/share/awesome/themes/default/theme.lua"
+-- Uncommment this for a lighter theme
+theme_path = "/usr/share/awesome/themes/sky/theme.lua"
+
+-- This is used later as the default terminal and editor to run.
+terminal = "x-terminal-emulator"
+editor = os.getenv("EDITOR") or "editor"
+editor_cmd = terminal .. " -e " .. editor
+browser = "iceweasel"
+mail = "icedove"
+musicplayer = "ario"
+monitor = "gnome-system-monitor"
+filemanager = "pcmanfm"
+lookup = "pcmanfm -f"
+calculator = "galculator"
+
+-- 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"
+
+wallpaper_dir = "/home/fabien/themes/backgrounds/"
+wallpaper = wallpaper_dir .. "universalis_1024_jsh.jpg"
+
+-- Actually load theme
+beautiful.init(theme_path)
+beautiful.get().wallpaper_cmd = { "awsetbg -a " .. wallpaper }
+awful.util.spawn_with_shell("pgrep unagi || unagi &")
+
+
+-- Table of layouts to cover with awful.layout.inc, order matters.
+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.max,
+ awful.layout.suit.max.fullscreen,
+ awful.layout.suit.magnifier,
+ awful.layout.suit.floating
+ }
+
+-- Define if we want to use titlebar on all applications.
+use_titlebar = true
+
+-- Shifty configured tags.
+shifty.config.tags = {
+ w1 = {
+ layout = awful.layout.suit.tile,
+ mwfact = 0.60,
+ exclusive = false,
+ position = 1,
+ init = true,
+ screen = 1,
+ slave = true,
+ },
+ web = {
+ layout = awful.layout.suit.tile.bottom,
+ mwfact = 0.65,
+ exclusive = true,
+ max_clients = 1,
+ position = 4,
+ spawn = browser,
+ },
+ mail = {
+ layout = awful.layout.suit.tile,
+ mwfact = 0.55,
+ exclusive = false,
+ position = 5,
+ spawn = mail,
+ slave = true
+ },
+ media = {
+ layout = awful.layout.suit.float,
+ exclusive = false,
+ position = 8,
+ spawn = musicplayer
+ },
+ office = {
+ layout = awful.layout.suit.tile,
+ position = 9,
+ },
+ steam = {
+ layout = awful.layout.suit.max,
+ mwfact = 0.65,
+ exclusive = true,
+ spawn = "steam",
+ position = 6,
+ },
+}
+
+-- SHIFTY: application matching rules
+-- order here matters, early rules will be applied first
+shifty.config.apps = {
+ {
+ match = {
+ "Navigator",
+ "Vimperator",
+ "Gran Paradiso",
+ },
+ float = false,
+ tag = "web",
+ },
+ {
+ match = {
+ "Shredder.*",
+ "Thunderbird",
+ "Icedove",
+ "mutt",
+ },
+ tag = "mail",
+ },
+ {
+ match = {
+ "pcmanfm",
+ },
+ slave = true
+ },
+ {
+ match = {
+ "OpenOffice.*",
+ "Abiword",
+ "Gnumeric",
+ },
+ tag = "office",
+ },
+ {
+ match = {
+ "Mplayer.*",
+ "Mirage",
+ "gimp",
+ "gtkpod",
+ "Ufraw",
+ "easytag",
+ "Ario",
+ },
+ tag = "media",
+ nopopup = true,
+ },
+ {
+ match = {
+ "MPlayer",
+ "Gnuplot",
+ "galculator",
+ "speedcrunch"
+ },
+ float = true,
+ },
+ {
+ match = { "emacs" },
+ tag = "emacs"
+ },
+ {
+ match = {
+ terminal,
+ },
+ honorsizehints = false,
+ slave = true,
+ },
+ {
+ match = { "Steam" },
+ tag = "steam",
+ },
+ {
+ match = {""},
+ buttons = awful.util.table.join(
+ awful.button({}, 1, function (c) client.focus = c; c:raise() end),
+ awful.button({modkey}, 1, function(c)
+ client.focus = c
+ c:raise()
+ awful.mouse.client.move(c)
+ end),
+ awful.button({modkey}, 3, awful.mouse.client.resize)
+ )
+ },
+}
+
+-- SHIFTY: default tag creation rules
+-- parameter description
+-- * floatBars : if floating clients should always have a titlebar
+-- * guess_name : should shifty try and guess tag names when creating
+-- new (unconfigured) tags?
+-- * guess_position: as above, but for position parameter
+-- * run : function to exec when shifty creates a new tag
+-- * all other parameters (e.g. layout, mwfact) follow awesome's tag API
+shifty.config.defaults = {
+ layout = awful.layout.suit.tile.bottom,
+ ncol = 1,
+ mwfact = 0.60,
+ floatBars = true,
+ guess_name = true,
+ guess_position = true,
+}
+
+-- Wibox
+-- Create a textbox widget
+mytextclock = awful.widget.textclock({align = "right"})
+
+-- Create a laucher widget and a main menu
+myawesomemenu = {
+ {"manual", terminal .. " -e man awesome"},
+ {"edit config",
+ editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua"},
+ {"restart", awesome.restart},
+ {"quit", my.quit}
+}
+
+mymainmenu = awful.menu(
+ {
+ items = {
+ {"awesome", myawesomemenu, beautiful.awesome_icon},
+ { "Debian", debian.menu.Debian_menu.Debian },
+ {"open terminal", terminal}}
+})
+
+mylauncher = awful.widget.launcher({image = image(beautiful.awesome_icon),
+ menu = mymainmenu})
+
+-- Create a systray
+mysystray = widget({type = "systray", align = "right"})
+
+-- Create a wibox for each screen and add it
+mywibox = {}
+mypromptbox = {}
+mylayoutbox = {}
+mytaglist = {}
+mytaglist.buttons = awful.util.table.join(
+ awful.button({}, 1, awful.tag.viewonly),
+ awful.button({modkey}, 1, awful.client.movetotag),
+ awful.button({}, 3, function(tag) tag.selected = not tag.selected end),
+ awful.button({modkey}, 3, awful.client.toggletag),
+ awful.button({}, 4, awful.tag.viewnext),
+ awful.button({}, 5, awful.tag.viewprev)
+)
+
+mytasklist = {}
+mytasklist.buttons = awful.util.table.join(
+ awful.button({}, 1, function(c)
+ if not c:isvisible() then
+ awful.tag.viewonly(c:tags()[1])
+ end
+ client.focus = c
+ c:raise()
+ end),
+ awful.button({modkey}, 3, my.show_clients),
+ awful.button({}, 3, function(c)
+ c.minimized = not c.minimized
+ end),
+ awful.button({}, 4, function()
+ awful.client.focus.byidx(1)
+ if client.focus then client.focus:raise() end
+ end),
+ awful.button({}, 5, function()
+ awful.client.focus.byidx(-1)
+ if client.focus then client.focus:raise() end
+end))
+
+local mycpuwidget = my.widgets.decorated(my.widgets.cpu(), my.mkspawn(monitor))
+local mymemwidget = my.widgets.decorated(my.widgets.mem(), my.mkspawn(monitor))
+local mynetwidget = my.widgets.decorated(my.widgets.net("eth1"), my.mkspawn(monitor))
+-- local mynetupwidget = my.decorated_monitor_widget(make_netwidget("eth1", "up"))
+-- local mynetdownwidget = my.decorated_monitor_widget(make_netwidget("eth1", "down"))
+local myktwidget = my.widgets.mode()
+
+for s = 1, screen.count() do
+ awful.util.spawn("awsetbg -a " .. wallpaper, false, s)
+
+ -- status box
+
+ -- Create a promptbox for each screen
+ mypromptbox[s] =
+ awful.widget.prompt({layout = awful.widget.layout.leftright})
+ -- Create an imagebox widget which will contains an icon indicating which
+ -- layout we're using. We need one layoutbox per screen.
+ mylayoutbox[s] = awful.widget.layoutbox(s)
+ mylayoutbox[s]:buttons(awful.util.table.join(
+ awful.button({}, 1, function() awful.layout.inc(layouts, 1) end),
+ awful.button({}, 3, function() awful.layout.inc(layouts, -1) end),
+ awful.button({}, 4, function() awful.layout.inc(layouts, 1) end),
+ awful.button({}, 5, function() awful.layout.inc(layouts, -1) end)))
+ -- Create a taglist widget
+ mytaglist[s] = awful.widget.taglist.new(s,
+ awful.widget.taglist.label.all,
+ mytaglist.buttons)
+
+ -- Create a tasklist widget
+ mytasklist[s] = awful.widget.tasklist.new(
+ function(c)
+ return awful.widget.tasklist.label.currenttags(c, s)
+ end,
+ mytasklist.buttons)
+
+
+ -- Create the wibox
+ mywibox[s] = awful.wibox({position = "top", screen = s})
+ -- Add widgets to the wibox - order matters
+ mywibox[s].widgets = {
+ {
+ myktwidget,
+ mylauncher,
+ s == 1 and mycpuwidget or nil,
+ s == 1 and mymemwidget or nil,
+ mytaglist[s],
+ mypromptbox[s],
+ layout = awful.widget.layout.horizontal.leftright
+ },
+ mylayoutbox[s],
+ s == 1 and mynetwidget or nil,
+ mytextclock,
+ s == 1 and mysystray or nil,
+ mytasklist[s],
+ layout = awful.widget.layout.horizontal.rightleft
+ }
+
+ mywibox[s].screen = s
+end
+
+-- SHIFTY: initialize shifty
+-- the assignment of shifty.taglist must always be after its actually
+-- initialized with awful.widget.taglist.new()
+shifty.taglist = mytaglist
+shifty.init()
+
+-- 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 tables
+
+local tagkeys = {
+ -- Shifty: keybindings specific to shifty
+ my.make_key("n", "Send to Next Tag", shifty.send_next), -- client to next tag
+ my.make_key("a", "Add tag", my.mkinteractive(shifty.add)), -- create a new tag
+ my.make_key("r", "Rename tag", my.mkinteractive(shifty.rename)), -- rename a tag
+ my.make_key("d", "Delete tag", shifty.del),
+ my.make_key("Shift+A", "Add tag (no popup)", -- nopopup new tag
+ my.mkinteractive(function() shifty.add({nopopup = true}) end)),
+ my.make_key("Up", "View prev",
+ function () awful.tag.viewprev(); return true; end),
+ my.make_key("Down", "View next",
+ function () awful.tag.viewnext(); return true; end),
+ my.make_key("Shift+Up", "Move tag left",
+ function()
+ local t = awful.tag.selected()
+ local s = awful.util.cycle(screen.count(), t.screen + 1)
+ awful.tag.history.restore()
+ t = shifty.tagtoscr(s, t)
+ awful.tag.viewonly(t)
+ return true
+ end),
+ my.make_key("Shift+Right", "Move tag left",
+ function()
+ local t = awful.tag.selected()
+ local s = awful.util.cycle(screen.count(), t.screen + 1)
+ awful.tag.history.restore()
+ t = shifty.tagtoscr(s, t)
+ awful.tag.viewonly(t)
+ return true
+ end),
+}
+
+local awesome_keys = {
+ my.make_key("m", "Menu", my.mkinteractive(function ()
+ mymainmenu:show({keygrabber=true})
+ return true
+ end)),
+ -- my.make_key("k", "Kill all clients",
+ -- function ()
+ -- for client.
+ -- my.kill_all(function (c)
+ my.make_key("r", "Restart", awesome.restart),
+ my.make_key("q", "Quit", awesome.quit),
+ my.make_key("t", "Terminal", my.mkspawn(terminal)),
+}
+
+local layout_keys = {
+ my.make_key("Right", "Focus right",
+ function () awful.client.focus.bydirection("right"); return true end),
+ my.make_key("Left", "Focus left",
+ function () awful.client.focus.bydirection("left"); return true end),
+ my.make_key("Up", "Focus up",
+ function () awful.client.focus.bydirection("up"); return true end),
+ my.make_key("Down", "Focus down",
+ function () awful.client.focus.bydirection("down"); return true end),
+ my.make_key("Shift+Right", "Move right",
+ function () awful.client.swap.bydirection("right"); return true end),
+ my.make_key("Shift+Left", "Move left",
+ function () awful.client.swap.bydirection("left"); return true end),
+ my.make_key("Shift+Up", "Move up",
+ function () awful.client.swap.bydirection("up"); return true end),
+ my.make_key("Shift+Down", "Move down",
+ function () awful.client.swap.bydirection("down"); return true end),
+ -- my.make_key("Right", "Focus next",
+ -- function () awful.client.focus.byidx(1); return true end),
+ -- my.make_key("Left", "Focus prev",
+ -- function () awful.client.focus.byidx(-1); return true end),
+ -- my.make_key("Shift+Right", "Move next",
+ -- function() awful.client.swap.byidx(1); return true end),
+ -- my.make_key("Shift+Left", "Move previous",
+ -- function() awful.client.swap.byidx(-1); return true end),
+ -- my.make_key("Shift+Right", "Move next",
+ -- function() awful.screen.focus(1); return true end),
+ -- my.make_key("Shift+Left", "Move previous",
+ -- function() awful.screen.focus(-1); return true end),
+ my.make_key("c", "Master grow",
+ function() awful.tag.incmwfact(0.05); return true end),
+ my.make_key("z", "Master shrink",
+ function() awful.tag.incmwfact(-0.05); return true end),
+ my.make_key("Shift+c", "Add master windows",
+ function() awful.tag.incnmaster(1); return true end),
+ my.make_key("Shift+z", "Remove master windows",
+ function() awful.tag.incnmaster(-1); return true end),
+ my.make_key("Control+c", "Add column",
+ function() awful.tag.incncol(1); return true end),
+ my.make_key("Control+z", "Remove column",
+ function() awful.tag.incncol(-1); return true end),
+ my.make_key("Space", "Next layout",
+ function() awful.layout.inc(layouts, 1); return true end),
+ my.make_key("Shift+_", "Previous layout",
+ function() awful.layout.inc(layouts, -1) ; return true end),
+}
+
+media_keys = {
+ -- media keys
+ my.make_key("XF86HomePage", "Browser", my.mkspawn(browser)),
+ my.make_key("XF86Mail", "Mail", my.mkspawn(mail)),
+ my.make_key("XF86Search", "Search file...", my.mkspawn(lookup)),
+ my.make_key("XF86Explorer", "File Manager", my.mkspawn(filemanager)),
+ my.make_key("XF86Calculator", "Calculator", my.mkspawn(calculator)),
+ my.make_key("XF86Tools", "Music", my.mkspawn(musicplayer)),
+ my.make_key("XF86AudioPrev", "Previous song", my.mkspawn("mpc prev")),
+ my.make_key("XF86AudioNext", "Next song", my.mkspawn("mpc next")),
+ my.make_key("XF86AudioPlay", "Play song", my.mkspawn("mpc toggle")),
+ my.make_key("XF86AudioMute", "Mute", my.mkspawn("pulseaudio-ctl mute")),
+ my.make_key("XF86AudioLowerVolume", "Volume down", my.mkspawn("pulseaudio-ctl down")),
+ my.make_key("XF86AudioRaiseVolume", "Volume up", my.mkspawn("pulseaudio-ctl up")),
+ my.make_key("XF86Eject", "Eject", my.mkspawn("eject")),
+}
+
+global_table = {
+ my.make_key("Escape", "Restore History", awful.tag.history.restore),
+ my.make_key("e", "Revel windows", revelation),
+ my.make_key("c", "Previous tag", awful.tag.viewprev),
+ my.make_key("z", "Next tag", awful.tag.viewnext),
+ my.make_key("Right", "Right client", my.make_focus_bydirection("right")),
+ my.make_key("Left", "Left client", my.make_focus_bydirection("left")),
+ my.make_key("Up", "Up client", my.make_focus_bydirection("up")),
+ my.make_key("Down", "Down client", my.make_focus_bydirection("down")),
+ my.make_key("u", "Jump to urgent", awful.client.urgent.jumpto),
+ my.make_key("Tab", "Previous client",
+ function()
+ awful.client.focus.history.previous()
+ if client.focus then
+ client.focus:raise()
+ end
+ end),
+
+ -- Prompt
+ my.make_key("F2", "Run...", function()
+ awful.prompt.run({prompt = "Run: "},
+ mypromptbox[mouse.screen].widget,
+ awful.util.spawn, awful.completion.shell,
+ awful.util.getdir("cache") .. "/history")
+ end),
+
+ my.make_key("F3", "Eval...", function()
+ awful.prompt.run({prompt = "Run Lua code: "},
+ mypromptbox[mouse.screen].widget,
+ awful.util.eval, nil,
+ awful.util.getdir("cache") .. "/history_eval")
+ end),
+
+ -- modal key binding
+ my.make_key("a", "Main mode", my.make_kt(awesome_keys, "awesome") ),
+ my.make_key("t", "Tag mode...", my.make_kt(tagkeys, "tag") ),
+ my.make_key("l", "layout mode...", my.make_kt(layout_keys, "layout") ),
+}
+
+client_keytable = {
+ my.make_key("F4", "Kill client",
+ function(c) c:kill() end),
+ my.make_key("k", "Kill client",
+ function(c) c:kill() end),
+ my.make_key("f", "Toggle fullscreen",
+ function(c) c.fullscreen = not c.fullscreen end),
+ my.make_key("space", "Toggle floating",
+ awful.client.floating.toggle),
+ my.make_key("m", "Toggle maximize",
+ function(c)
+ c.maximized_horizontal = not c.maximized_horizontal
+ c.maximized_vertical = not c.maximized_vertical
+ end),
+ my.make_key("h", "Toggle minimized",
+ function (c)
+ c.minimized = not c.minimized
+ end),
+ my.make_key("Return", "Swap master",
+ function(c)
+ c:swap(awful.client.getmaster())
+ end),
+ my.make_key("o", "Move to screen", awful.client.movetoscreen),
+}
+
+-- Key bindings
+globalkeys = awful.util.table.join(
+ awful.key({modkey}, "F1", function () my.show_kt(global_table, "Global binding") end),
+ my.make_globalkeys({modkey}, global_table),
+ my.make_globalkeys({}, media_keys),
+ -- forcing restart of mpd.
+ -- it sometime have difficulty to connect to pulse
+ awful.key({modkey}, "F6", function ()
+ awful.util.spawn("pkill -9 mpd")
+ awful.util.spawn("mpd")
+ end)
+ )
+
+
+-- Client awful tagging: this is useful to tag some clients and then do stuff
+-- like move to tag on them
+clientkeys = awful.util.table.join(
+ awful.key({modkey, "Shift"}, "F1",
+ function () my.show_kt(client_keytable, "Client binding") end),
+ my.make_globalkeys({modkey}, client_keytable),
+ awful.key({modkey, "Shift"}, "r", function(c) c:redraw() end),
+ awful.key({modkey, "Shift"}, "t", awful.client.togglemarked))
+
+
+-- SHIFTY: assign client keys to shifty for use in
+-- match() function(manage hook)
+shifty.config.clientkeys = clientkeys
+shifty.config.modkey = modkey
+
+-- Compute the maximum number of digit we need, limited to 10
+local number_row = {
+ '"', '<', '>', '(', ')',
+ '@', '+', '-', '/', '*'
+}
+
+for i = 1, (shifty.config.maxtags or #number_row) do
+ local k = number_row[i-1]
+ globalkeys = awful.util.table.join(
+ globalkeys,
+ awful.key({modkey}, k, function()
+ local t = awful.tag.viewonly(shifty.getpos(i))
+ end),
+ awful.key({modkey, "Control"}, k, function()
+ local t = shifty.getpos(i)
+ t.selected = not t.selected
+ end),
+ awful.key({modkey, "Control", "Shift"}, k, function()
+ if client.focus then
+ awful.client.toggletag(shifty.getpos(i))
+ end
+ end),
+ -- move clients to other tags
+ awful.key({modkey, "Shift"}, k, function()
+ if client.focus then
+ t = shifty.getpos(i)
+ awful.client.movetotag(t)
+ awful.tag.viewonly(t)
+ end
+ end))
+end
+
+-- Set keys
+-- mympdwidget:append_global_keys()
+-- keychains.init(globalkeys,{})
+root.keys(globalkeys)
+
+-- local function kt2kc(kt)
+-- t = {}
+-- for _,k in ipairs(kt) do
+-- t[k.key] = { func = k.func, info = key.desc }
+-- end
+-- return t
+-- end
+-- keychains.add({modkey}, "w", "Awesome", nil, kt2kc(awesome_keys))
+-- keychains.start(5)
+
+-- Hook function to execute when focusing a client.
+client.add_signal("focus",
+ function(c)
+ if not awful.client.ismarked(c) then
+ c.border_color = beautiful.border_focus
+ c.opacity = 1.0
+ end
+end)
+
+-- Hook function to execute when unfocusing a client.
+client.add_signal("unfocus", function(c)
+ if not awful.client.ismarked(c) then
+ c.border_color = beautiful.border_normal
+ c.opacity = 0.8
+ end
+end)
+