--- a/awesome/rc.lua Sat Jun 20 20:32:45 2015 -0400
+++ b/awesome/rc.lua Sun Sep 13 14:47:26 2015 -0400
@@ -1,38 +1,35 @@
-local debug = require("debug")
---
-- Standard awesome library
+local gears = require("gears")
local awful = require("awful")
-awful.autofocus = require("awful.autofocus")
+awful.rules = require("awful.rules")
+require("awful.autofocus")
+-- Widget and layout library
local wibox = require("wibox")
-- Theme handling library
local beautiful = require("beautiful")
-- Notification library
local naughty = require("naughty")
--- shifty - dynamic tagging library
-local shifty = require("shifty")
--- Revelation
-local revelation = require("revelation")
--- vicious widgets
-local vicious = require("vicious")
-local wicked = require("wicked")
+local menubar = require("menubar")
+
-- Load Debian menu entries
require("debian.menu")
--- require("keychains")
+local my = require("my")
-local my = require("my")
+local titlebars_enabled = false
-- {{{ 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 })
+ 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", my.notify_error)
awesome.connect_signal("debug::deprecation", my.notify_error)
awesome.connect_signal("debug::index::miss",
@@ -46,13 +43,9 @@
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
+-- {{{ Variable definitions
+-- Themes define colours, icons, font and wallpapers.
theme_path = awful.util.getdir("config") .. "/current_theme/theme.lua"
-
-- This is used later as the default terminal and editor to run.
terminal = "x-terminal-emulator"
-- terminal = "terminology"
@@ -71,9 +64,9 @@
-- 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.
+-- 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 = awful.util.getdir("config") .. "/default"
@@ -84,191 +77,44 @@
beautiful.wallpaper_cmd = { wallpaper_cmd }
awful.util.spawn_with_shell("pgrep unagi || unagi &")
+-- Table of layouts to cover with awful.layout.inc, order matters.
+local layouts =
+{
+ awful.layout.suit.floating,
+ 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.max,
+ -- awful.layout.suit.max.fullscreen,
+ awful.layout.suit.magnifier,
+}
+local default_layout = 2
+-- }}}
--- 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
- }
+-- {{{ Wallpaper
+if beautiful.wallpaper then
+ for s = 1, screen.count() do
+ gears.wallpaper.maximized(beautiful.wallpaper, s, true)
+ end
+end
+-- }}}
-- Define if we want to use titlebar on all applications.
use_titlebar = true
--- Remove the focus follow mouse install by shifty.
--- shifty.config.sloppy = false
-
--- 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 = 2,
- spawn = browser,
- },
- mail = {
- layout = awful.layout.suit.tile,
- mwfact = 0.55,
- exclusive = false,
- position = 3,
- spawn = mail,
- slave = true
- },
- steam = {
- layout = awful.layout.suit.float,
- mwfact = 0.65,
- exclusive = true,
- spawn = "steam",
- position = 4,
- },
- media = {
- layout = awful.layout.suit.float,
- exclusive = false,
- position = 5,
- spawn = musicplayer
- },
- office = {
- layout = awful.layout.suit.tile,
- position = 6,
- },
- OZoNE = {
- layout = awful.layout.suit.max,
- position = 7,
- spawn = terminal .. " -e ssh o"
- }
-}
-
--- 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 = { "kupfer.py" },
- slave = true,
- },
- {
- 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)
- -- awful.mouse.client.dragtotag.border(c)
- -- awful.mouse.client.dragtotag.widget(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,
- ncol = 1,
- mwfact = 0.60,
- floatBars = true,
- guess_name = true,
- guess_position = true,
-}
-
--- Wibox
--- Create a textbox widget
-mytextclock = awful.widget.textclock()
+-- {{{ Tags
+-- Define a tag table which hold all screen tags.
+tags = {}
+for s = 1, screen.count() do
+ -- Each screen has its own tag table.
+ tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[default_layout])
+end
+-- }}}
-- Create a laucher widget and a main menu
myawesomemenu = {
@@ -289,8 +135,16 @@
{"open terminal", terminal}}
})
-mylauncher = awful.widget.launcher({image = beautiful.awesome_icon,
- menu = mymainmenu})
+mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
+ menu = mymainmenu })
+
+-- Menubar configuration
+menubar.utils.terminal = terminal -- Set the terminal for applications that require it
+-- }}}
+
+-- {{{ Wibox
+-- Create a textclock widget
+mytextclock = awful.widget.textclock()
-- Create a systray
mysystray = wibox.widget.systray({align = "right"})
@@ -301,32 +155,48 @@
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)
+ 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, function(t)
+ awful.tag.viewnext(awful.tag.getscreen(t)) end),
+ awful.button({ }, 5, function(t)
+ awful.tag.viewprev(awful.tag.getscreen(t)) end)
)
-
mytasklist = {}
mytasklist.buttons = awful.util.table.join(
- awful.button({}, 1, function(c)
- if not c:isvisible() then
- awful.tag.viewonly(c:tags()[1])
+ 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() then
+ awful.tag.viewonly(c:tags()[1])
+ end
+ -- This will also un-minimize
+ -- the client, if needed
+ client.focus = c
+ c:raise()
end
- client.focus = c
- c:raise()
end),
- awful.button({modkey}, 3, my.show_clients),
- awful.button({}, 3, function(c)
- c.minimized = not c.minimized
+ awful.button({ }, 3, function ()
+ if instance then
+ instance:hide()
+ instance = nil
+ else
+ instance = awful.menu.clients({
+ theme = { width = 250 }
+ })
+ end
end),
- awful.button({}, 4, function()
+ awful.button({ }, 4, function ()
awful.client.focus.byidx(1)
if client.focus then client.focus:raise() end
end),
- awful.button({}, 5, function()
+ awful.button({ }, 5, function ()
awful.client.focus.byidx(-1)
if client.focus then client.focus:raise() end
end))
@@ -336,337 +206,328 @@
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()
+local mymodewidget = my.widgets.mode()
+
for s = 1, screen.count() do
- awful.util.spawn(wallpaper_cmd, false, s)
-
- -- status box
+ -- Create a promptbox for each screen
+ mypromptbox[s] = awful.widget.prompt()
+ -- 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(s, awful.widget.taglist.filter.all, mytaglist.buttons)
- -- Create a promptbox for each screen
- mypromptbox[s] = awful.widget.prompt()
- -- 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(s, awful.widget.taglist.filter.all, mytaglist.buttons)
+ -- Create a tasklist widget
+ mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
- -- Create a tasklist widget
- mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
+ -- Create the wibox
+ mywibox[s] = awful.wibox({ position = "top", screen = s })
- -- Create the wibox
- mywibox[s] = awful.wibox({position = "top", screen = s})
- -- Add widgets to the wibox - order matters
- local left_layout = wibox.layout.fixed.horizontal()
- left_layout:add(myktwidget)
- left_layout:add(mylauncher)
- if s == 1 then
- left_layout:add(mycpuwidget)
- left_layout:add(mymemwidget)
- end
- left_layout:add(mytaglist[s])
- left_layout:add(mypromptbox[s])
-
- local right_layout = wibox.layout.fixed.horizontal()
- if (s == 1) then right_layout:add(mynetwidget) end
- if (s == 1) then right_layout:add(mysystray) end
- right_layout:add(mytextclock)
- right_layout:add(mylayoutbox[s])
+ -- Widgets that are aligned to the left
+ local left_layout = wibox.layout.fixed.horizontal()
+ left_layout:add(mymodewidget)
+ left_layout:add(mylauncher)
+ if s == 1 then
+ left_layout:add(mycpuwidget)
+ left_layout:add(mymemwidget)
+ end
+ left_layout:add(mytaglist[s])
+ left_layout:add(mypromptbox[s])
- local layout = wibox.layout.align.horizontal()
- layout:set_left(left_layout)
- layout:set_middle(mytasklist[s])
- layout:set_right(right_layout)
- mywibox[s]:set_widget(layout)
-end
+ -- Widgets that are aligned to the right
+ local right_layout = wibox.layout.fixed.horizontal()
+ if s == 1 then
+ right_layout:add(mynetwidget)
+ right_layout:add(mysystray)
+ end
+ right_layout:add(mytextclock)
+ right_layout:add(mylayoutbox[s])
--- 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()
+ -- Now bring it all together (with the tasklist in the middle)
+ local layout = wibox.layout.align.horizontal()
+ layout:set_left(left_layout)
+ layout:set_middle(mytasklist[s])
+ layout:set_right(right_layout)
--- Mouse bindings
+ mywibox[s]:set_widget(layout)
+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)
+ 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 right",
- -- 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+Down", "Move tag left",
- -- function()
- -- local t = awful.tag.selected()
- -- local s = screen.count() + t.screen - 1
- -- s = awful.util.cycle(screen.count(), s)
- -- 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", logout),
- my.make_key("t", "Terminal", my.mkspawn(terminal)),
- my.make_key("f", "Toggle sloppy mouse", my.sloppy_toggle)
-}
-
-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),
+-- {{{ Key tables
+local global_table = {
+ my.make_single_key("Up", "View prev", awful.tag.viewprev),
+ my.make_single_key("Down", "View next", awful.tag.viewnext),
+ my.make_single_key("Escape", "Restore history", awful.tag.history.restore),
+ my.make_single_key("Right", "Next screen",
+ function ()
+ awful.client.focus.byidx( 1)
+ if client.focus then client.focus:raise() end
+ end),
+ my.make_single_key("Left", "Previous screen",
+ function ()
+ awful.client.focus.byidx(-1)
+ if client.focus then client.focus:raise() end
+ end),
+ my.make_single_key("w", "Main menu", function () mymainmenu:show() end),
+ my.make_single_key("Shift+Right", "Swap with next",
+ function () awful.client.swap.byidx( 1); end),
+ my.make_single_key("Shift+Left", "Swap with prev",
+ function () awful.client.swap.byidx(-1); end),
+ -- Is this work ?
+ my.make_single_key("Control+Right", "Focus next screen",
+ function () awful.screen.focus_relative( 1); end),
+ -- Is this work ?
+ my.make_single_key("Control+Left", "Focus prev screen",
+ function () awful.screen.focus_relative(-1); end),
+ my.make_single_key("u", "Go to urgent",
+ function () awful.client.urgent.jumpto(); end),
+ my.make_single_key("Tab", "Next client",
+ function ()
+ awful.client.focus.history.previous()
+ if client.focus then
+ client.focus:raise()
+ end
+ end),
+ my.make_single_key("Return", "Start terminal", my.mkspawn(terminal)),
+ my.make_single_key("Control+r", "Restart", awesome.restart),
+ my.make_single_key("Shift+q", "Quit", logout),
+ my.make_single_key("l", "Inc Master Size",
+ function () awful.tag.incmwfact( 0.05 ) end),
+ my.make_single_key("h", "Dec Master Size",
+ function () awful.tag.incmwfact( -0.05 ) end),
+ my.make_single_key("Shift+l", "Inc Master Count",
+ function () awful.tag.incnmaster( 1 ) end),
+ my.make_single_key("Shift+h", "Dec Master Count",
+ function () awful.tag.incnmaster( -1 ) end),
+ my.make_single_key("Control+l", "Inc Column Count",
+ function () awful.tag.incncol( 1 ) end),
+ my.make_single_key("Control+h", "Dec Column Count",
+ function () awful.tag.incncol( -1 ) end),
+ my.make_single_key("Space", "Next layout",
+ function () awful.layout.inc(layouts, 1 ) end),
+ my.make_single_key("Shift+Space", "Prev layout",
+ function () awful.layout.inc(layouts, -1 ) end),
+ my.make_single_key("Control+n", "Restore clients", awful.client.restore),
+ my.make_single_key("r", "Run",
+ function () mypromptbox[mouse.screen]:run() end),
+ my.make_single_key("x", "Lua prompt",
+ function ()
+ awful.prompt.run({ prompt = "Run Lua code: " },
+ mypromptbox[mouse.screen].widget,
+ awful.util.eval, nil,
+ awful.util.getdir("cache") .. "/history_eval")
+ end),
+ -- This one returns an error.
+ my.make_single_key("p", "Menu bar", function () menubar.show() 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")),
+client_table = {
+ my.make_single_key("f", "Toggle fullscreen",
+ function (c) c.fullscreen = not c.fullscreen end),
+ my.make_single_key("Shift+c", "Kill client", function (c) c:kill() end),
+ my.make_single_key("Control+Space", "Toggle floating", awful.client.floating.toggle),
+ my.make_single_key("o", "Move to screen", awful.client.movetoscreen),
+ my.make_single_key("t", "Toggle on top", function (c) c.ontop = not c.ontop end),
+ my.make_single_key("n", "Iconized",
+ 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),
+ my.make_single_key("m", "Toggle maximized",
+ function (c)
+ maximized = not c.maximized_horizontal
+ c.maximized_horizontal = maximized
+ c.maximized_vertical = maximized
+ end),
+ my.make_single_key("Shift+t", "Toggle mark", awful.client.togglemarked)
}
-
-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
+-- {{{ 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(
+ -- make the client binding help available even when there is no client.
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
+ function () my.show_kt(client_table, "Client binding") end),
+ my.make_globalkeys({modkey}, global_table)
+)
--- 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-1))
- end),
- awful.key({modkey, "Control"}, k, function()
- local t = shifty.getpos(i-1)
- t.selected = not t.selected
- end),
- awful.key({modkey, "Control", "Shift"}, k, function()
- if client.focus then
- awful.client.toggletag(shifty.getpos(i-1))
- end
- end),
- -- move clients to other tags
- awful.key({modkey, "Shift"}, k, function()
- if client.focus then
- t = shifty.getpos(i-1)
- awful.client.movetotag(t)
- awful.tag.viewonly(t)
- end
- end))
+clientkeys = awful.util.table.join(
+ my.make_globalkeys({modkey}, client_table)
+)
+
+-- 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 = mouse.screen
+ local tag = awful.tag.gettags(screen)[i]
+ if tag then
+ awful.tag.viewonly(tag)
+ end
+ end),
+ -- Toggle tag.
+ awful.key({ modkey, "Control" }, "#" .. i + 9,
+ function ()
+ local screen = mouse.screen
+ local tag = awful.tag.gettags(screen)[i]
+ if tag then
+ awful.tag.viewtoggle(tag)
+ end
+ end),
+ -- Move client to tag.
+ awful.key({ modkey, "Shift" }, "#" .. i + 9,
+ function ()
+ if client.focus then
+ local tag = awful.tag.gettags(client.focus.screen)[i]
+ if tag then
+ awful.client.movetotag(tag)
+ end
+ end
+ end),
+ -- Toggle tag.
+ awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
+ function ()
+ if client.focus then
+ local tag = awful.tag.gettags(client.focus.screen)[i]
+ if tag then
+ awful.client.toggletag(tag)
+ end
+ end
+ end))
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
--- mympdwidget:append_global_keys()
--- keychains.init(globalkeys,{})
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 } },
+ { rule = { class = "MPlayer" },
+ properties = { floating = true } },
+ { rule = { class = "pinentry" },
+ properties = { floating = true } },
+ { rule = { class = "gimp" },
+ properties = { floating = true } },
+ -- Set Firefox to always map on tags number 2 of screen 1.
+ -- { rule = { class = "Firefox" },
+ -- properties = { tag = tags[1][2] } },
+}
+-- }}}
+
+-- {{{ Signals
+-- Signal function to execute when a new client appears.
+client.connect_signal("manage", function (c, startup)
+ -- Enable sloppy focus
+ -- c: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)
+
+ if not startup then
+ -- Set the windows at the slave,
+ -- i.e. put it at the end of others instead of setting it master.
+ -- awful.client.setslave(c)
--- 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)
+ -- Put windows in a smart way, only if they does not set an initial position.
+ if 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
+ elseif not c.size_hints.user_position and not c.size_hints.program_position then
+ -- Prevent clients from being unreachable after screen count change
+ awful.placement.no_offscreen(c)
+ end
+
+ if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then
+ -- 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)
+ )
--- Hook function to execute when focusing a client.
-client.connect_signal("focus",
- function(c)
- if not awful.client.ismarked(c) then
- c.border_color = beautiful.border_focus
- c.opacity = 1.0
- end
+ -- Widgets that are aligned to the left
+ local left_layout = wibox.layout.fixed.horizontal()
+ left_layout:add(awful.titlebar.widget.iconwidget(c))
+ left_layout:buttons(buttons)
+
+ -- Widgets that are aligned to the right
+ local right_layout = wibox.layout.fixed.horizontal()
+ right_layout:add(awful.titlebar.widget.floatingbutton(c))
+ right_layout:add(awful.titlebar.widget.maximizedbutton(c))
+ right_layout:add(awful.titlebar.widget.stickybutton(c))
+ right_layout:add(awful.titlebar.widget.ontopbutton(c))
+ right_layout:add(awful.titlebar.widget.closebutton(c))
+
+ -- The title goes in the middle
+ local middle_layout = wibox.layout.flex.horizontal()
+ local title = awful.titlebar.widget.titlewidget(c)
+ title:set_align("center")
+ middle_layout:add(title)
+ middle_layout:buttons(buttons)
+
+ -- Now bring it all together
+ local layout = wibox.layout.align.horizontal()
+ layout:set_left(left_layout)
+ layout:set_right(right_layout)
+ layout:set_middle(middle_layout)
+
+ awful.titlebar(c):set_widget(layout)
+ end
end)
--- Hook function to execute when unfocusing a client.
-client.connect_signal("unfocus", function(c)
- if not awful.client.ismarked(c) then
- c.border_color = beautiful.border_normal
- c.opacity = 0.8
- 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)
+-- }}}
+
my.sloppy_install(0.5)