# HG changeset patch # User Fabien Ninoles # Date 1442170046 14400 # Node ID 6348b9f842b2a39cc163f5842422547b2e514f31 # Parent e9e2f624cd9951b825ce2f7655fb55655083fba5 Move back to non-shifty awesomeness. diff -r e9e2f624cd99 -r 6348b9f842b2 awesome/my.lua --- a/awesome/my.lua Sat Jun 20 20:32:45 2015 -0400 +++ b/awesome/my.lua Sun Sep 13 14:47:26 2015 -0400 @@ -24,7 +24,7 @@ --- Stolen from shifty: Shows a popup and logs to a file -- @param message The text message. --- @param log_level 1 = INFO, 2 = WARN, 3 = ERROR, if nothting is provided 1 is used. +-- @param log_level 1 = INFO, 2 = WARN, 3 = ERROR, if nothing is provided 1 is used. function log(message, log_level) if log_level == nil then log_level = 1 @@ -37,11 +37,12 @@ } -- %c eg: Wed Jan 30 14:25:13 2013 local time = os.date("%c") - message = time .. " - " .. log_table[log_level].level .. " - " .. message .. "\n" .. debug.traceback() + message = time .. " - " .. log_table[log_level].level .. " - " .. message .. "\n" + tb = debug.traceback() local home = os.getenv("HOME") local log_file = io.open(home .. "/.awesome.log", "a+") - log_file:write(message .."\n") + log_file:write(message .. tb .. "\n") log_file:close() naughty.notify({ preset = naughty.config.presets.critical, text = message, bg = log_table[log_level].bg_colour, fg = log_table[log_level].fg_colour}) @@ -142,9 +143,9 @@ local w = wibox.widget.textbox() -- w:set_vertical(true) w.width = 150 - w.align = 'center' + w:set_align('center') vicious.register(w, wicked.widgets.net, - '${' .. device .. ' up} / ${' .. device .. ' down}', + '${' .. device .. ' up} ▴ ${' .. device .. ' down} ▾', 1) return w end @@ -182,12 +183,19 @@ mode = widgets_mode, keyboard = widgets_keyboard, decorated = widgets_decorated, + } - function make_key(k, n, f) return { key = k, name = n, func = f} end +function make_single_key(k, n, f) + if f == nil then + log("name: " .. n .. " is nil", 3) + end + return make_key(k, n, function (c) f(c); return true ; end) +end + function show_kt(keytable, title) -- todo: replace with a menu ? text = "" @@ -293,10 +301,24 @@ end end +function split_modifiers(key) + local modifiers = {} + local pattern = capi.string.format("([^+]+)", sep) + key:gsub(pattern, function(mod) table.insert(modifiers, mod) end) + key = table.remove(modifiers) + return modifiers, key +end + function make_globalkeys(modifiers, keytable) local t = {} for _,k in ipairs(keytable) do - t = awful.util.table.join(t, awful.key(modifiers, k.key, k.func)) + local mods, key = split_modifiers(k.key) + mods = awful.util.table.join(modifiers, mods) + -- log("name=" .. k.name .. "; modifiers=" .. table.concat(mods, ":") .. "; key=" .. key) + if key == "Space" then + key = capi.string.lower(key) + end + t = awful.util.table.join(t, awful.key(mods, key, k.func)) end return t end diff -r e9e2f624cd99 -r 6348b9f842b2 awesome/rc.lua --- 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)