diff --git a/.gitignore b/.gitignore index 98e0180..1270333 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ wallpaper walls *.swp localconf.lua +debugging diff --git a/.gitmodules b/.gitmodules index 0ae50e8..2a6f841 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "obvious"] - path = obvious - url = git://git.mercenariesguild.net/obvious.git [submodule "vicious"] path = vicious url = http://git.sysphere.org/vicious diff --git a/autobeautiful.lua b/autobeautiful.lua new file mode 100644 index 0000000..0935cf7 --- /dev/null +++ b/autobeautiful.lua @@ -0,0 +1,12 @@ +local beautiful = require("beautiful") +local gears = require("gears") + +beautiful.init(awful.util.getdir("config") .. "/theme.lua") + +if beautiful.wallpaper then + for s = 1, screen.count() do + gears.wallpaper.maximized(beautiful.wallpaper, s, true) + end +end + +return beautiful diff --git a/aweswt.lua b/aweswt.lua deleted file mode 100644 index f7eb326..0000000 --- a/aweswt.lua +++ /dev/null @@ -1,138 +0,0 @@ --- aweswt.lua --- Application switcher using dmenu --- - -local M = {} - --- local functions -local get_out, get_input, _switch, assemble_command - -local defaults = {} -local settings = {} - -defaults.bg_focus = theme.bg_focus -defaults.fg_focus = theme.fg_focus -defaults.bg_normal = theme.bg_normal -defaults.fg_normal = theme.fg_normal -defaults.font = string.gsub(theme.font, " ","-") -defaults.menu_cmd = "dmenu -nf %q -nb %q -sf %q -sb %q -p 'Switch to' -fn %q -i" - -local command - -for key, value in pairs(defaults) do - settings[key] = value -end - - - --- switch with window titles -M.switch = function() - _switch(true) -end - --- switch with client instance and class -M.switch_class = function() - _switch(false) -end - --- {{{ option setters - -M.set_bg_focus = function (color) - settings.bg_focus = color or defaults.bg_focus - assemble_command() -end - -M.set_fg_focus = function (color) - settings.fg_focus = color or defaults.fg_focus - assemble_command() -end - -M.set_bg_normal = function (color) - settings.bg_normal = color or defaults.bg_normal - assemble_command() -end - -M.set_fg_normal = function (color) - settings.fg_normal = color or defaults.fg_normal - assemble_command() -end - -M.set_font = function (font) - settings.font = font or defaults.font - assemble_command() -end - -M.set_menu_command = function (command) - settings.menu_cmd = command or defaults.menu_cmd - assemble_command() -end - --- }}} - --- {{{ io functions -get_out = function (a) - local f = io.popen(a) - t = {} - for line in f:lines() do - table.insert(t, line) - end - return t -end - -get_input = function (a) - s1 = 'echo "' .. a .. '" | ' .. command - return get_out(s1) -end - --- }}} - --- {{{ main worker function -_switch = function(use_name) - local clients = client.get() - - if table.getn(clients) == 0 then - return - end - - local client_list_table = {} - local apps = {} - - for key, client in pairs(clients) do - local app - - if use_name then - app = client['name'] - else - app = key .. ':' .. client['instance'] .. '.' .. client['class'] - end - - table.insert(client_list_table, app) - apps[app] = client - end - - table.sort(client_list_table, function(a, b) - return string.lower(a) < string.lower(b) - end) - local client_list = table.concat(client_list_table, "\n") - - local client_selected = apps[get_input(client_list)[1]] - if client_selected then - local ctags = client_selected:tags() - awful.tag.viewonly(ctags[1]) - client.focus = client_selected - client_selected:raise() - end -end --- }}} - -assemble_command = function() - command = string.format(settings.menu_cmd, - settings.fg_normal, - settings.bg_normal, - settings.fg_focus, - settings.bg_focus, - settings.font) -end - -assemble_command() -return M diff --git a/bindings.lua b/bindings.lua index e7c5587..a978c2b 100644 --- a/bindings.lua +++ b/bindings.lua @@ -1,6 +1,13 @@ -local aweswt = require("aweswt") -local mb = require("modalbind") +-- key bindings +local awful = awful +local conf = conf local mpd = require("mpd") +local scratch = require("scratch") + +local modkey = conf.modkey or "Mod4" +local mb = require("modalbind") + +local bindings = {mb = mb} -- {{{ Mouse bindings root.buttons(awful.util.table.join( @@ -11,28 +18,37 @@ awful.button({ }, 5, awful.tag.viewprev) local function spawnf(cmd) return function() awful.util.spawn(cmd) end end +conf.cmd.run = conf.cmd.run or spawnf("dmenu_run") + mpdmap = { name = "MPD", m = mpd.ctrl.toggle, n = mpd.ctrl.next, N = mpd.ctrl.prev, s = spawnf("mpd"), - g = spawnf(cmd.mpd_client) + S = spawnf("mpd --kill"), + g = spawnf(conf.cmd.mpd_client) } mpdpromts = { name = "MPD PROMPTS", a = mpd.prompt.artist, - A = mpd.prompt.album, + b = mpd.prompt.album, t = mpd.prompt.title, - r = mpd.prompt.toggle_replace_on_search, + r = mpd.prompt.toggle_replace_on_search } progmap = { name = "PROGRAMS", - f = spawnf(cmd.browser), - i = spawnf(cmd.im_client), - I = spawnf(cmd.irc_client), - m = spawnf(cmd.mail_client) + f = spawnf(conf.cmd.browser), + i = spawnf(conf.cmd.im_client), + I = spawnf(conf.cmd.irc_client), + m = spawnf(conf.cmd.mail_client) +} + +docmap = { + name = "DOCUMENTS", + u = spawnf("docopen ~/uni pdf"), + b = spawnf("docopen ~/books pdf epub mobi txt lit html htm"), } adapters = { u = "wwan", w = "wlan", b = "bluetooth" } @@ -41,95 +57,44 @@ function rfkill(cmd) for key, adapter in pairs(adapters) do map[key] = spawnf("sudo rfkill "..cmd.." "..adapter) end - print(map["name"]) return map end -wirelessmap = { - name = "RFKILL", - b = function () mb.grab(rfkill("block")) end, - u = function () mb.grab(rfkill("unblock")) end + +connectmap = { + name = "CONNECT", + u = spawnf("umts"), + w = spawnf("wlanacpi") } --- {{{ Key bindings -globalkeys = awful.util.table.join( - --{{{ Focus and Tags - awful.key({ modkey, }, "Left", awful.tag.viewprev ), - awful.key({ modkey, }, "Right", awful.tag.viewnext ), - awful.key({ modkey, }, "Escape", awful.tag.history.restore), - - awful.key({ modkey, }, "j", - function () - awful.client.focus.byidx( 1) - if client.focus then client.focus:raise() end - end), - awful.key({ modkey, }, "k", - function () - awful.client.focus.byidx(-1) - if client.focus then client.focus:raise() end - end), - - awful.key({ modkey, "Control" }, "j", function () - awful.screen.focus_relative( 1) - end), - - awful.key({ modkey, "Control" }, "k", function () - awful.screen.focus_relative(-1) - end), +wirelessmap = { + name = "WIRELESS", + b = mb.grabf(rfkill("block")), + u = mb.grabf(rfkill("unblock")), + c = mb.grabf(connectmap) +} +function bindings.extend_and_register_key_table(globalkeys) + local totalkeys = globalkeys or {} + totalkeys = awful.util.table.join(totalkeys, awful.key({ }, "Menu", spawnf('wmselect')), - --}}} - - --{{{ Layout manipulation - awful.key({ modkey, "Shift" }, "j", function () - awful.client.swap.byidx( 1) - end), - - awful.key({ modkey, "Shift" }, "k", function () - awful.client.swap.byidx( -1) - end), - - awful.key({ modkey, }, "u", awful.client.urgent.jumpto), - awful.key({ modkey, }, "Tab", function () - awful.client.focus.history.previous() - if client.focus then - client.focus:raise() - end - end), - awful.key({ "Mod1", }, "Tab", function () - awful.client.focus.history.previous() - if client.focus then - client.focus:raise() - end - end), - - awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), - awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), - awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), - awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), - awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), - awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), - awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), - awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, 0) end), - - --}}} awful.key({ modkey, "Control" }, "r", awesome.restart), awful.key({ modkey, "Shift" }, "q", awesome.quit), - awful.key({ modkey, }, "Return", spawnf(cmd.terminal)), + awful.key({ modkey, }, "Return", spawnf(conf.cmd.terminal)), --{{{ Modal mappings - awful.key({ modkey }, "m", function () mb.grab(mpdmap, true) end), - awful.key({ modkey, "Shift" }, "m", function () mb.grab(mpdpromts) end), - awful.key({ modkey }, "c", function () mb.grab(progmap) end), - awful.key({ modkey }, "w", function () mb.grab(wirelessmap) end), - + awful.key({ modkey }, "m", mb.grabf(mpdmap, true)), + awful.key({ modkey, "Shift" }, "m", mb.grabf(mpdpromts)), + awful.key({ modkey }, "c", mb.grabf(progmap)), + awful.key({ modkey }, "w", mb.grabf(wirelessmap)), + awful.key({ modkey }, "d", mb.grabf(docmap)), --}}} --{{{ Audio control - awful.key({ }, "XF86AudioLowerVolume", function () awful.util.spawn("amixer set Master 2%-")end ), - awful.key({ }, "XF86AudioRaiseVolume", function () awful.util.spawn("amixer set Master 2%+")end ), + awful.key({ }, "XF86AudioLowerVolume", spawnf("amixer set Master 2%-")), + awful.key({ }, "XF86AudioRaiseVolume", spawnf("amixer set Master 2%+")), awful.key({ }, "XF86AudioMute", spawnf("amixer set Master toggle")), awful.key({ }, "XF86AudioPlay", mpd.ctrl.toggle), awful.key({ }, "XF86AudioNext", mpd.ctrl.next), @@ -138,38 +103,38 @@ globalkeys = awful.util.table.join( --}}} -- {{{ teardrops - awful.key({ }, "F12", function () teardrop(cmd.terminal,"center","center", 0.99, 0.7)end ), - awful.key({ modkey }, "`", function () teardrop("urxvtc -e ncmpcpp","bottom","center", 0.99, 0.4)end ), - awful.key({ }, "Print", function () teardrop("galsamixer","top","center", 0.99, 0.4)end ), + awful.key({ }, "F12", function () + scratch.drop(conf.cmd.terminal,"center","center", 0.99, 0.7) + end ), + awful.key({ modkey }, "`", function () + scratch.drop("gpms","bottom","center", 0.99, 0.4) + end ), + awful.key({ }, "Print", function () + scratch.drop("gpulse-mixer","top","center", 0.99, 0.4) + end ), -- }}} --{{{ Prompt - awful.key({ modkey }, "r", function () - obvious.popup_run_prompt.set_prompt_string(" Run~ ") - obvious.popup_run_prompt.set_cache("history") - obvious.popup_run_prompt.set_run_function(awful.util.spawn) - obvious.popup_run_prompt.run_prompt() - end), - awful.key({ modkey }, "e", function () - obvious.popup_run_prompt.set_prompt_string(" exec Lua~ ") - obvious.popup_run_prompt.set_cache("history_eval") - obvious.popup_run_prompt.set_run_function(awful.util.eval) - obvious.popup_run_prompt.run_prompt() - end), + awful.key({ modkey }, "r", conf.cmd.run), + + awful.key({ modkey }, "s", spawnf("dmsearch")), --}}} --{{{ misc. XF86 Keys - awful.key({ }, "XF86Sleep", function () awful.util.spawn("/usr/local/bin/s2ram")end ), - awful.key({ }, "XF86Away", function () awful.util.spawn("xlock")end ), - awful.key({ }, "XF86TouchpadToggle", function () awful.util.spawn("touchpad")end ), + awful.key({ }, "XF86Sleep", spawnf("s2ram")), + awful.key({ }, "XF86Away", spawnf("xlock")), + awful.key({ }, "XF86TouchpadToggle", spawnf("touchpad")) + ) --}}} - awful.key({ modkey }, "BackSpace", rodentbane.start) -) + -- Set keys + root.keys(totalkeys) +end + function client_opacity_set(c, default, max, step) if c.opacity < 0 or c.opacity > 1 then @@ -183,7 +148,6 @@ function client_opacity_set(c, default, max, step) end end - clientkeys = awful.util.table.join( awful.key({ modkey, "Shift" }, "f", function (c) c.fullscreen = not c.fullscreen end), awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), @@ -199,60 +163,10 @@ clientkeys = awful.util.table.join( awful.key({ }, "XF86Calculater", awful.client.movetoscreen ) ) --- Compute the maximum number of digit we need, limited to 22 -keynumber = 0 -for s = 1, screen.count() do - keynumber = math.min(22, math.max(#tags[s], keynumber)); -end - --- 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. --- FKeys: 67-78 -for i = 1, keynumber do - if i < 10 then - k = "#" .. i + 9 - elseif i == 10 then - k = "#19" - elseif i > 10 then - k = "F" .. i - 10 - end - globalkeys = awful.util.table.join(globalkeys, - awful.key({ modkey }, k, - function () - local screen = mouse.screen - if tags[screen][i] then - awful.tag.viewonly(tags[screen][i]) - end - end), - awful.key({ modkey, "Control" }, k, - function () - local screen = mouse.screen - if tags[screen][i] then - awful.tag.viewtoggle(tags[screen][i]) - end - end), - awful.key({ modkey, "Shift" }, k, - function () - if client.focus and tags[client.focus.screen][i] then - awful.client.movetotag(tags[client.focus.screen][i]) - end - end), - awful.key({ modkey, "Control", "Shift" }, k, - function () - if client.focus and tags[client.focus.screen][i] then - awful.client.toggletag(tags[client.focus.screen][i]) - 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 -root.keys(globalkeys) --- }}} +return bindings -- vim: set fenc=utf-8 tw=80 foldmethod=marker : - diff --git a/boxes.lua b/boxes.lua deleted file mode 100644 index 607aec7..0000000 --- a/boxes.lua +++ /dev/null @@ -1,201 +0,0 @@ -function exists(filename) - local file = io.open(filename) - if file then - io.close(file) - return true - else - return false - end -end - - --- {{{ Reusable separators -spacer = widget({ type = "textbox", name = "spacer" }) -spacer.text = " " - -nullwidget = widget({ type = "textbox", name = "nullwidget" }) --- }}} - --- {{{ Wibox - ---popup run - --- Create a textclock widget ---clock = awful.widget.textclock({ align = "right" }) -mysystray = widget({ type = "systray" }) - -clock = widget({ type = "textbox" }) -vicious.register(clock, vicious.widgets.date, "%b %d, %R", 60) - - --- music widget {{{ -mpdwidget = widget({ type = "textbox" }) -vicious.register(mpdwidget, vicious.widgets.mpd, - function(widget, args) - if args["{state}"] == "N/A" then - return "" - else - return "[ ♫ "..args["{Artist}"].." - "..args["{Title}"].." ]" - end - end, 3, {nil, os.getenv("MPD_HOST"), os.getenv("MPD_PORT")}) -mpdwidget:buttons(awful.util.table.join( - awful.button({ }, 1, function () teardrop("urxvtc -e ncmpcpp","top","center", 0.99, 0.4)end ) - )) - -mpdnext = widget({ type = "textbox" }) -mpdnext.text = "▲" -mpdnext:buttons(awful.util.table.join( - awful.button({ }, 1, function () awful.util.spawn("mpc next") end) - )) -mpdprev = widget({ type = "textbox" }) -mpdprev.text = "▼" -mpdprev:buttons(awful.util.table.join( - awful.button({ }, 1, function () awful.util.spawn("mpc prev") end) - )) --- }}} - --- mail widget {{{ -mailwidget = widget({ type = "textbox" }) -vicious.register(mailwidget, vicious.widgets.mdir, - function(widget, args) - if args[1] > 0 then - naughty.notify({ - title = "New mail arrived", - text = "Unread "..args[2].." / New "..args[1], - position = "top_left" - - }) - widget.bg = theme.bg_urgent - widget.fg = theme.fg_urgent - elseif args[2] > 0 then - widget.bg = theme.bg_focus - widget.fg = theme.fg_focus - else - widget.bg = theme.bg_normal - widget.fg = theme.fg_normal - end - return "⬓⬓ Unread "..args[2].." / New "..args[1].. " " - end, 181, {os.getenv("HOME") .. "/.maildir/"}) ---}}} - --- battery {{{ -if exists("/sys/class/power_supply/BAT0") then - batwidget0 = widget({ type = "textbox" }) - vicious.register(batwidget0, vicious.widgets.bat, - function (widget, args) - if args[2] == 0 then return "" - else - if args[2] < 15 then - widget.bg = theme.bg_urgent - widget.fg = theme.fg_urgent - else - widget.bg = theme.bg_normal - widget.fg = theme.fg_normal - end - return "( BAT0: "..args[1]..args[2].."% - "..args[3].." )" - end - end, 61, "BAT0") -else batwidget0 = nullwidget end - -if exists("/sys/class/power_supply/BAT1") then - batwidget1 = widget({ type = "textbox" }) - vicious.register(batwidget1, vicious.widgets.bat, - function (widget, args) - if args[2] == 0 then return "" - else - if args[2] < 15 then - widget.bg = theme.bg_urgent - widget.fg = theme.fg_urgent - else - widget.bg = theme.bg_normal - widget.fg = theme.fg_normal - end - return "( BAT1: "..args[1]..args[2].."% - "..args[3].." )" - end - end, 61, "BAT1") -else batwidget1 = nullwidget end - -if exists("/sys/class/power_supply/BAT2") then - batwidget2 = widget({ type = "textbox" }) - vicious.register(batwidget2, vicious.widgets.bat, - function (widget, args) - if args[2] == 0 then return "" - else - if args[2] < 15 then - widget.bg = theme.bg_urgent - widget.fg = theme.fg_urgent - else - widget.bg = theme.bg_normal - widget.fg = theme.fg_normal - end - return "( BAT2: "..args[1]..args[2].."% - "..args[3].." )" - end - end, 61, "BAT2") -else batwidget2 = nullwidget end - ---}}} - -cpulabel = widget({ type = "textbox" }) -vicious.register(cpulabel, vicious.widgets.cpu, "CPU: $1%") - -if exists("/sys/class/net/wlan0") then - wlanwidget = widget({ type = "textbox" }) - vicious.register(wlanwidget, vicious.widgets.wifi, " )( WLAN ${ssid} @ ${sign}, Q:${link}/70", 31, "wlan0") -else wlanwidget = nullwidget end - --- Create a wibox for each screen and add it -leftwibox = {} -rightwibox = {} - -mylayoutbox = {} -mytaglist = {} -mytaglist.buttons = awful.util.table.join( - awful.button({ }, 1, awful.tag.viewonly), - awful.button({ modkey }, 1, awful.client.movetotag), - awful.button({ }, 3, awful.tag.viewtoggle), - awful.button({ modkey }, 3, awful.client.toggletag), - awful.button({ }, 4, awful.tag.viewnext), - awful.button({ }, 5, awful.tag.viewprev) - ) - -for s = 1, screen.count() do - 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.label.all, mytaglist.buttons) - - - -- Create the wibox - leftwibox[s] = awful.wibox({ position = "left", screen = s, width = 18 }) - rightwibox[s] = awful.wibox({ position = "right", screen = s , width = 18}) - -- Add widgets to the wibox - order matters - leftwibox[s].widgets = { - mytaglist[s], - mylayoutbox[s], - mailwidget, - spacer, - layout = awful.widget.layout.horizontal.rightleft - } - rightwibox[s].widgets = { - { - clock, spacer, - batwidget0, - batwidget1, - batwidget2, - wlanwidget, - spacer, cpulabel, cpuwidget, - spacer, mpdwidget, mpdnext, spacer, mpdprev, - spacer, - layout = awful.widget.layout.horizontal.leftright - }, - separator, spacer, mysystray, - layout = awful.widget.layout.horizontal.leftright - } -end --- }}} --- --- vim:foldmethod=marker diff --git a/errors.lua b/errors.lua new file mode 100644 index 0000000..268b601 --- /dev/null +++ b/errors.lua @@ -0,0 +1,27 @@ +-- Notification library +local naughty = naughty + +-- {{{ 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 = err }) + in_error = false + end) +end +-- }}} diff --git a/inspect.lua b/inspect.lua new file mode 100644 index 0000000..25632c9 --- /dev/null +++ b/inspect.lua @@ -0,0 +1,248 @@ +----------------------------------------------------------------------------------------------------------------------- +-- inspect.lua - v1.2.0 (2012-10) +-- Enrique García Cota - enrique.garcia.cota [AT] gmail [DOT] com +-- human-readable representations of tables. +-- inspired by http://lua-users.org/wiki/TableSerialization +----------------------------------------------------------------------------------------------------------------------- + +local inspect ={} +inspect.__VERSION = '1.2.0' + +-- Apostrophizes the string if it has quotes, but not aphostrophes +-- Otherwise, it returns a regular quoted string +local function smartQuote(str) + if string.match( string.gsub(str,"[^'\"]",""), '^"+$' ) then + return "'" .. str .. "'" + end + return string.format("%q", str ) +end + +local controlCharsTranslation = { + ["\a"] = "\\a", ["\b"] = "\\b", ["\f"] = "\\f", ["\n"] = "\\n", + ["\r"] = "\\r", ["\t"] = "\\t", ["\v"] = "\\v", ["\\"] = "\\\\" +} + +local function unescapeChar(c) return controlCharsTranslation[c] end + +local function unescape(str) + local result, _ = string.gsub( str, "(%c)", unescapeChar ) + return result +end + +local function isIdentifier(str) + return type(str) == 'string' and str:match( "^[_%a][_%a%d]*$" ) +end + +local function isArrayKey(k, length) + return type(k)=='number' and 1 <= k and k <= length +end + +local function isDictionaryKey(k, length) + return not isArrayKey(k, length) +end + +local sortOrdersByType = { + ['number'] = 1, ['boolean'] = 2, ['string'] = 3, ['table'] = 4, + ['function'] = 5, ['userdata'] = 6, ['thread'] = 7 +} + +local function sortKeys(a,b) + local ta, tb = type(a), type(b) + if ta ~= tb then return sortOrdersByType[ta] < sortOrdersByType[tb] end + if ta == 'string' or ta == 'number' then return a < b end + return false +end + +local function getDictionaryKeys(t) + local length = #t + local keys = {} + for k,_ in pairs(t) do + if isDictionaryKey(k, length) then table.insert(keys,k) end + end + table.sort(keys, sortKeys) + return keys +end + +local function getToStringResultSafely(t, mt) + local __tostring = type(mt) == 'table' and mt.__tostring + local string, status + if type(__tostring) == 'function' then + status, string = pcall(__tostring, t) + string = status and string or 'error: ' .. tostring(string) + end + return string +end + +local Inspector = {} + +function Inspector:new(t, depth) + local inspector = { + buffer = {}, + depth = depth, + level = 0, + maxIds = { + ['function'] = 0, + ['userdata'] = 0, + ['thread'] = 0, + ['table'] = 0, + ['key'] = 0, + ['tag'] = 0 + }, + ids = { + ['function'] = setmetatable({}, {__mode = "kv"}), + ['userdata'] = setmetatable({}, {__mode = "kv"}), + ['thread'] = setmetatable({}, {__mode = "kv"}), + ['table'] = setmetatable({}, {__mode = "kv"}), + ['key'] = setmetatable({}, {__mode = "kv"}), + ['tag'] = setmetatable({}, {__mode = "kv"}) + }, + tableAppearances = setmetatable({}, {__mode = "k"}) + } + + setmetatable(inspector, {__index = Inspector}) + + inspector:countTableAppearances(t) + + return inspector:putValue(t) +end + +function Inspector:countTableAppearances(t) + if type(t) == 'table' then + if not self.tableAppearances[t] then + self.tableAppearances[t] = 1 + for k,v in pairs(t) do + self:countTableAppearances(k) + self:countTableAppearances(v) + end + else + self.tableAppearances[t] = self.tableAppearances[t] + 1 + end + self:countTableAppearances(getmetatable(t)) + end +end + +function Inspector:tabify() + self:puts("\n", string.rep(" ", self.level)) + return self +end + +function Inspector:up() + self.level = self.level - 1 +end + +function Inspector:down() + self.level = self.level + 1 +end + +function Inspector:puts(...) + local args = {...} + local len = #self.buffer + for i=1, #args do + len = len + 1 + self.buffer[len] = tostring(args[i]) + end + return self +end + +function Inspector:commaControl(comma) + if comma then self:puts(',') end + return true +end + +function Inspector:putTable(t) + if self:alreadyVisited(t) then + self:puts('') + elseif self.depth and self.level >= self.depth then + self:puts('{...}') + else + if self.tableAppearances[t] > 1 then + self:puts('<',self:getId(t),'>') + end + self:puts('{') + self:down() + + local length = #t + local mt = getmetatable(t) + + local string = getToStringResultSafely(t, mt) + if type(string) == 'string' and #string > 0 then + self:puts(' -- ', unescape(string)) + if length >= 1 then self:tabify() end -- tabify the array values + end + + local comma = false + for i=1, length do + comma = self:commaControl(comma) + self:puts(' '):putValue(t[i]) + end + + local dictKeys = getDictionaryKeys(t) + + for _,k in ipairs(dictKeys) do + comma = self:commaControl(comma) + self:tabify():putKey(k):puts(' = '):putValue(t[k]) + end + + if mt then + comma = self:commaControl(comma) + self:tabify():puts(' = '):putValue(mt) + end + + self:up() + + if #dictKeys > 0 or mt then -- dictionary table. Justify closing } + self:tabify() + elseif length > 0 then -- array tables have one extra space before closing } + self:puts(' ') + end + self:puts('}') + end + return self +end + +function Inspector:alreadyVisited(v) + return self.ids[type(v)][v] ~= nil +end + +function Inspector:getId(v) + local tv = type(v) + local idtable = self.ids[tv] + local id = idtable and idtable[v] or nil + if not id then + id = self.maxIds[tv] + 1 + self.maxIds[tv] = id + self.ids[tv][v] = id + end + return id +end + +function Inspector:putValue(v) + local tv = type(v) + + if tv == 'string' then + self:puts(smartQuote(unescape(v))) + elseif tv == 'number' or tv == 'boolean' or tv == 'nil' then + self:puts(tostring(v)) + elseif tv == 'table' then + self:putTable(v) + else + self:puts('<',tv,' ',self:getId(v),'>') + end + return self +end + +function Inspector:putKey(k) + if isIdentifier(k) then return self:puts(k) end + return self:puts( "[" ):putValue(k):puts("]") +end + +function Inspector:tostring() + return table.concat(self.buffer) +end + +setmetatable(inspect, { __call = function(_,t,depth) + return Inspector:new(t, depth):tostring() +end }) + +return inspect + diff --git a/layouts.lua b/layouts.lua new file mode 100644 index 0000000..7bf2a52 --- /dev/null +++ b/layouts.lua @@ -0,0 +1,90 @@ +local awful = awful +local conf = conf +local modkey = conf.modkey or "Mod4" + +local layouts={ mt={} } +local list = { + awful.layout.suit.fair, + awful.layout.suit.fair.horizontal, + awful.layout.suit.tile, + awful.layout.suit.tile.bottom, + awful.layout.suit.max, + awful.layout.suit.max.fullscreen, + awful.layout.suit.floating +} + +function layouts.set_list(layout_list) + list = layout_list +end + +function layouts.extend_key_table(globalkeys) + local layoutkeys = globalkeys or {} + return awful.util.table.join(layoutkeys, + awful.key({ modkey }, "j", function () + awful.client.focus.byidx( 1) + if client.focus then client.focus:raise() end + end), + awful.key({ modkey }, "k", function () + awful.client.focus.byidx(-1) + if client.focus then client.focus:raise() end + end), + + -- Layout manipulation + awful.key({ modkey }, "u", awful.client.urgent.jumpto), + awful.key({ modkey }, "Tab", function () + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + end), + awful.key({ "Mod1", }, "Tab", function () + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + end), + awful.key({ modkey, }, "l", function () + awful.tag.incmwfact( 0.05) + end), + awful.key({ modkey, }, "h", function () + awful.tag.incmwfact(-0.05) + end), + awful.key({ modkey, "Shift" }, "h", function () + awful.tag.incnmaster( 1) + end), + awful.key({ modkey, "Shift" }, "l", function () + awful.tag.incnmaster(-1) + end), + awful.key({ modkey, "Control" }, "h", function () + awful.tag.incncol(1) + end), + awful.key({ modkey, "Control" }, "l", function () + awful.tag.incncol(-1) + end), + awful.key({ modkey, }, "space", function () + awful.layout.inc(list, 1) + end), + awful.key({ modkey, "Shift" }, "space", function () + awful.layout.inc(list, -1) + end), + awful.key({ modkey, "Shift" }, "j", function () + awful.client.swap.byidx( 1) + end), + awful.key({ modkey, "Shift" }, "k", function () + awful.client.swap.byidx( -1) + end), + awful.key({ modkey, "Control" }, "j", function () + awful.screen.focus_relative( 1) + end), + awful.key({ modkey, "Control" }, "k", function () + awful.screen.focus_relative(-1) + end), + awful.key({ modkey }, "Left", awful.tag.viewprev ), + awful.key({ modkey }, "Right", awful.tag.viewnext ), + awful.key({ modkey }, "Escape", awful.tag.history.restore) + ); +end + +layouts.mt.__index = list +layouts.mt.__newindex = list +return setmetatable(layouts, layouts.mt) diff --git a/modalbind.lua b/modalbind.lua index c8e3959..aef2c71 100644 --- a/modalbind.lua +++ b/modalbind.lua @@ -1,133 +1,147 @@ -local M = {} +local modalbind = {} +local wibox = require("wibox") local inited = false local modewidget = {} local modewibox = { screen = -1 } +local nesting = 0 --local functions -local ensure_init, set_default, update_settings, show_box, hide_box -M.grab = function(keymap, stay_in_mode) - if keymap.name then show_box(mouse.screen, keymap) end - - keygrabber.run(function(mod, key, event) - if key == "Escape" then - keygrabber.stop() - hide_box(); - return true - end - - if event == "release" then return true end - - if keymap[key] then - keygrabber.stop() - if stay_in_mode then - keymap[key](key) - M.grab(keymap, true) - else - hide_box() - keymap[key](key) - return true - end - end - - return true - end) -end - --- Partially adapted from Obvious Widget Library module "popup_run_prompt" -- --- Original Author: Andrei "Garoth" Thorp -- --- Copyright 2009 Andrei "Garoth" Thorp -- local defaults = {} --- Default is 1 for people without compositing + defaults.opacity = 1.0 defaults.height = 22 defaults.border_width = 1 -defaults.x_offset = 18 +defaults.x_offset = 0 +defaults.y_offset = 0 defaults.show_options = true -- Clone the defaults for the used settings local settings = {} for key, value in pairs(defaults) do - settings[key] = value + settings[key] = value +end + +local function update_settings() + for s, value in ipairs(modewibox) do + value.border_width = settings.border_width + set_default(s) + value.opacity = settings.opacity + end end -M.set_opacity = function (amount) - settings.opacity = amount or defaults.opacity - update_settings() +--- Change the opacity of the modebox. +-- @param amount opacity between 0.0 and 1.0, or nil to use default +function set_opacity(amount) + settings.opacity = amount or defaults.opacity + update_settings() end +modalbind.set_opacity = set_opacity -M.set_height = function (amount) - settings.height = amount or defaults.height - update_settings() +--- Change height of the modebox. +-- @param amount height in pixels, or nil to use default +function set_height(amount) + settings.height = amount or defaults.height + update_settings() end +modalbind.set_height = set_height -M.set_border_width = function (amount) - settings.border_width = amount or defaults.border_width - update_settings() +--- Change border width of the modebox. +-- @param amount width in pixels, or nil to use default +function set_border_width(amount) + settings.border_width = amount or defaults.border_width + update_settings() end +modalbind.set_border_width = set_border_width -M.set_x_offset = function (amount) - settings.x_offset = amount or defaults.x_offset - update_settings() +--- Change horizontal offset of the modebox. +-- set location for the box with set_corner(). The box is shifted to the right +-- if it is in one of the left corners or to the left otherwise +-- @param amount horizontal shift in pixels, or nil to use default +function set_x_offset (amount) + settings.x_offset = amount or defaults.x_offset + update_settings() end +modalbind.set_x_offset = set_x_offset -M.set_show_options = function (bool) - settings.show_options = bool +--- Change vertical offset of the modebox. +-- set location for the box with set_corner(). The box is shifted downwards if it +-- is in one of the upper corners or upwards otherwise. +-- @param amount vertical shift in pixels, or nil to use default +function set_y_offset(amount) + settings.y_offset = amount or defaults.y_offset + update_settings() end +modalbind.set_y_offset = set_y_offset -ensure_init = function () - if inited then - return - end - - inited = true - for s = 1, screen.count() do - modewidget[s] = widget({ - type = "textbox", - name = "modewidget" .. s, - align = "center" - }) - - modewibox[s] = wibox({ - fg = beautiful.fg_normal, - bg = beautiful.bg_normal, - border_width = settings.border_width, - border_color = beautiful.bg_focus, - }) - set_default(s) - modewibox[s].visible = false - modewibox[s].screen = s - modewibox[s].ontop = true - - -- Widgets for prompt wibox - modewibox[s].widgets = { - modewidget[s], - layout = awful.widget.layout.vertical.center - } - end +--- Set the corner, where the modebox will be displayed +-- If a parameter is not a valid orientation (see below), the function returns +-- without doing anything +-- @param vertical either top or bottom +-- @param horizontal either left or right +function set_corner(vertical, horizontal) + if (vertical ~= "top" and vertical ~= "bottom") then + return + end + if (horizontal ~= "left" and horizontal ~= "right") then + return + end + settings.corner_v = vertical or defaults.corner_v + settings.corner_h = horizontal or defaults.corner_h end +modalbind.set_corner = set_corner -set_default = function (s) - modewibox[s]:geometry({ - width = modewidget[s].extents(modewidget[s]).width, - height = settings.height, - x = settings.x_offset < 0 and +function set_show_options(bool) + settings.show_options = bool +end +modalbind.set_show_options = set_show_options + +local function set_default(s) + minwidth, minheight = modewidget[s]:fit(screen[s].geometry.width, + screen[s].geometry.height) + modewibox[s].width = minwidth + 1; + modewibox[s].height = math.max(settings.height, minheight) + modewibox[s].x = settings.x_offset < 0 and screen[s].geometry.x - width + settings.x_offset or - settings.x_offset, - y = screen[s].geometry.y + screen[s].geometry.height - settings.height - }) + settings.x_offset + modewibox[s].y = screen[s].geometry.height - settings.height end -update_settings = function () - for s, value in ipairs(modewibox) do - value.border_width = settings.border_width - set_default(s) - value.opacity = settings.opacity - end +local function ensure_init() + if inited then + return + end + inited = true + for s = 1, screen.count() do + modewidget[s] = wibox.widget.textbox() + modewidget[s]:set_align("center") + + modewibox[s] = wibox({ + fg = beautiful.fg_normal, + bg = beautiful.bg_normal, + border_width = settings.border_width, + border_color = beautiful.bg_focus, + }) + + local modelayout = {} + modelayout[s] = wibox.layout.fixed.horizontal() + modelayout[s]:add(modewidget[s]) + modewibox[s]:set_widget(modelayout[s]); + set_default(s) + modewibox[s].visible = false + modewibox[s].screen = s + modewibox[s].ontop = true + + -- Widgets for prompt wibox + modewibox[s].widgets = { + modewidget[s], + layout = wibox.layout.fixed.horizontal + } + end end -show_box = function (s, map) +local function show_box(s, map) ensure_init() modewibox.screen = s local label = " -- " .. map.name .. " -- " @@ -136,14 +150,55 @@ show_box = function (s, map) if key ~= "name" then label = label .. " " .. key end end end - modewidget[s].text = label - set_default(s) - modewibox[s].visible = true + modewidget[s]:set_text(label) + modewibox[s].visible = true + set_default(s) end -hide_box = function () +local function hide_box() local s = modewibox.screen - if s ~= -1 then modewibox[s].visible = false end + if s ~= -1 then modewibox[s].visible = false end end -return M +function grab(keymap, stay_in_mode) + if keymap.name then + show_box(mouse.screen, keymap) + nesting = nesting + 1 + end + + keygrabber.run(function(mod, key, event) + if key == "Escape" then + keygrabber.stop() + nesting = 0 + hide_box(); + return true + end + + if event == "release" then return true end + + if keymap[key] then + keygrabber.stop() + keymap[key]() + if stay_in_mode then + grab(keymap, true) + else + nesting = nesting - 1 + if nesting < 1 then hide_box() end + return true + end + end + + return true + end) +end +modalbind.grab = grab + +function grabf(keymap, stay_in_mode) + return function() grab(keymap, stay_in_mode) end +end +modalbind.grabf = grabf + +function modebox() return modewibox[1] end +modalbind.modebox = modebox + +return modalbind diff --git a/mpd.lua b/mpd.lua index ad52474..99b3c9b 100644 --- a/mpd.lua +++ b/mpd.lua @@ -1,80 +1,76 @@ -local awful = awful local M = {} -local type = "" +local conf = conf +local awful = awful +local log = log -- local functions -local show, mpc_play_search, notify +local dmenu, mpc_play_search, notify, mpc local defaults = {} local settings = {} -defaults.host = "127.0.0.1" -defaults.port = 6600 defaults.replace_on_search = true for key, value in pairs(defaults) do settings[key] = value end --- {{{ basic functions - --- }}} +mpc = function(command) + awful.util.spawn("mpc " .. command) +end -- {{{ mpd.ctrl submodule M.ctrl = {} M.ctrl.toggle = function () - awful.util.spawn("mpc toggle") + mpc("toggle") end M.ctrl.play = function () - awful.util.spawn("mpc play") + mpc("play") end M.ctrl.pause = function () - awful.util.spawn("mpc pause") + mpc("pause") end M.ctrl.next = function () - awful.util.spawn("mpc next") + mpc("next") end M.ctrl.prev = function () - awful.util.spawn("mpc prev") -end - -M.ctrl.clear = function () - awful.util.spawn("mpc clear") + mpc("prev") end -- }}} -- {{{ mpd.prompt submodule -local clear_before = cfg.mpd_prompt_clear_before == nil and +local clear_before = conf.mpd_prompt_clear_before == nil and true or - cfg.mpd_prompt_clear_before + conf.mpd_prompt_clear_before M.prompt = {} M.prompt.artist = function() - type = "artist" - show() + dmenu("-a") end M.prompt.album = function() - type = "album" - show() + dmenu("-a -b") end M.prompt.title = function() - type = "title" - show() + dmenu("-a -b -t") end M.prompt.title = title +function dmenu(opts) + awful.util.spawn("dmpc " .. (clear_before and "-r" or "-R") .. " " .. opts) +end + M.prompt.replace_on_search = function(bool) clear_before = bool end @@ -86,16 +82,8 @@ M.prompt.toggle_replace_on_search = function() ).. " the playlist") end -function show() - obvious.popup_run_prompt.set_prompt_string("Play ".. type .. ":") - obvious.popup_run_prompt.set_cache("/mpd_ ".. type); - obvious.popup_run_prompt.set_run_function(mpc_play_search) - obvious.popup_run_prompt.run_prompt() -end - function mpc_play_search(s) - if clear_before then M.ctrl.clear() end - awful.util.spawn("mpc search " .. type .. " | mpc add; mpc play") + notify("Found " .. (s) .. " matches"); end -- }}} diff --git a/obvious b/obvious deleted file mode 160000 index c5b8844..0000000 --- a/obvious +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c5b884459194a15a38b88c99d5558a64efaf4e89 diff --git a/rc.lua b/rc.lua index efbcd62..0e1fe34 100644 --- a/rc.lua +++ b/rc.lua @@ -1,40 +1,79 @@ +-- libraries {{{ +awful = require("awful") +awful.rules = require("awful.rules") + require("awful.autofocus") +wibox = require("wibox") +beautiful = require("autobeautiful") +naughty = require("naughty") +conf = require("localconf") + require("errors") +inspect = require("inspect") +-- }}} --- Standard awesome library -require("awful") -require("awful.autofocus") -require("awful.rules") -require("beautiful") -require("naughty") -require("teardrop") -require("obvious.popup_run_prompt") -require("vicious") -require("rodentbane.rodentbane") +layouts = require('layouts') -MY_PATH = os.getenv("HOME") .. "/.config/awesome/" +-- {{{ Logging +log = require("simplelog") +log.add_logger(log.loggers.stdio, 0) +log.add_logger(log.loggers.naughty, 2) -dofile (MY_PATH .. "localconf.lua") +-- }}} --- Themes define colours, icons, and wallpapers -beautiful.init("/home/crater2150/.config/awesome/zenburn/theme.lua") +-- {{{ Tags +tags = require('tags') +tags.setup() --- Table of layouts to cover with awful.layout.inc, order matters. -layouts = -{ - awful.layout.suit.fair, - awful.layout.suit.fair.horizontal, - awful.layout.suit.tile, - awful.layout.suit.tile.bottom, - awful.layout.suit.max, - awful.layout.suit.max.fullscreen, - awful.layout.suit.floating -} +-- }}} -awful.util.spawn("wmname LG3D") +-- {{{ widgets +widgets = require("widgets") +widgets.setup() +for s = 1, screen.count() do + local ltop = widgets.layout(s,"left","top") + local rtop = widgets.layout(s,"right","top") + local lbottom = widgets.layout(s,"left","bottom") -dofile (MY_PATH .. "/tags.lua") -dofile (MY_PATH .. "/boxes.lua") -dofile (MY_PATH .. "/bindings.lua") -dofile (MY_PATH .. "/rules.lua") -dofile (MY_PATH .. "/signals.lua") --- dofile (MY_PATH .. "uzbl.lua") + -- {{{ + widgets.add.mail("mail_me", s, ltop, { os.getenv("HOME") .. "/.maildir/me" }) + widgets.add.spacer(ltop) + widgets.add.mail("mail_uber", s, ltop, { os.getenv("HOME") .. "/.maildir/uber" }) + widgets.add.spacer(ltop) + widgets.add.clock("clock", s, ltop) + + widgets.add.layout(s, lbottom) + widgets.add.taglist("tags", s, lbottom) + + widgets.add.cpu("cpu", s, rtop) + widgets.add.spacer(rtop) + widgets.add.battery("bat", s, rtop, "BAT0") + widgets.add.spacer(rtop) + widgets.add.battery("slice", s, rtop, "BAT1") + widgets.add.spacer(rtop) + widgets.add.wifi("wlan", s, rtop, "wlan0") + widgets.add.spacer(rtop) + widgets.add.systray(s, rtop) + + widgets.set_spacer_text(" ◈ ") +end +-- }}} + +-- {{{ Key bindings +globalkeys = {} +globalkeys = layouts.extend_key_table(globalkeys); +globalkeys = tags.extend_key_table(globalkeys); + +bindings = require("bindings") +bindings.extend_and_register_key_table(globalkeys) +bindings.mb.set_x_offset(18) +-- }}} + +-- {{{ rules +rules = require("rules") +rules.setup() +-- }}} + +require("signals") + +-- +-- vim: fdm=marker diff --git a/rules.lua b/rules.lua index 1322c82..8cd7cb7 100644 --- a/rules.lua +++ b/rules.lua @@ -1,70 +1,201 @@ +local rules = { mt={} } +local awful = awful +local conf = conf +local tags = tags +local beautiful = beautiful +local inspect=require("inspect") -awful.rules.rules = { - -- All clients will match this rule. - { rule = { }, - properties = { border_width = beautiful.border_width, - border_color = beautiful.border_normal, - focus = true, - size_hints_honor = false, - keys = clientkeys, - minimized = false, - --skip_taskbar = true, - buttons = clientbuttons } }, - { rule = { class = "MPlayer" }, - properties = { floating = true, - size_hints_honor = true } }, - { rule = { class = "Passprompt" }, - properties = { floating = true, - ontop = true, - focus = true } }, - { rule = { class = "pinentry" }, - properties = { floating = true } }, - -- Set Firefox to always map on tags number 2 of screen 1. - { rule = { class = "Uzbl-core" }, - properties = { tag = tags[rule_screen][2], - skip_taskbar = false } }, - { rule = { class = "Firefox", instance = "Navigator" }, - properties = { tag = tags[rule_screen][2], - floating = false, minimized = false } }, - { rule = { class = "Webbrowser", instance = "Navigator" }, - properties = { tag = tags[rule_screen][2], - floating = false, minimized = false } }, - { rule = { class = "Pidgin" }, - properties = { tag = tags[rule_screen][3], opacity = 0.9 } }, - { rule = { role = "buddy_list" }, - properties = { master = true } }, - { rule = { role = "conversation" }, - callback = awful.client.setslave }, - { rule = { instance = "Weechat"}, - properties = { tag = tags[rule_screen][3]} , - callback = awful.client.setslave}, - { rule = { class = "Irssi"}, - properties = { tag = tags[rule_screen][3]} , - callback = awful.client.setslave}, - { rule = { class = "Claws-mail" }, - properties = { tag = tags[rule_screen][4] } }, - { rule = { instance = "Gmutt" }, - properties = { tag = tags[rule_screen][4] } }, - { rule = { instance = "Gcanto" }, - properties = { tag = tags[rule_screen][5] } }, - { rule = { instance = "Gncmpcpp" }, - properties = { tag = tags[rule_screen][6] } }, - { rule = { class = "Gmpc" }, - properties = { tag = tags[rule_screen][6] } }, - { rule = { class = "Deluge" }, - properties = { tag = tags[rule_screen][7] } }, - { rule = { class = "Cellwriter" }, - properties = { tag = tags[rule_screen][1], - ontop = true, - size_hints_honor = true, - float = true, - sticky = true, - fullscreen = true - } }, - { rule = { class = "Xhtop" }, - properties = { tag = tags[rule_screen][22] } }, - { rule = { class = "URxvt" }, - properties = { opacity = 0.9 } }, - { rule = { instance = "URxvt" }, - properties = { opacity = 0.9 } }, -} +local rule_screen = conf.rule_screen or 1 + +local function popup_urgent(message) + return function(client) + client:connect_signal("property::urgent", function (c) + if c.urgent and not c.focus then + naughty.notify({ text=message }) + end + end) + end +end + +local function setup(self) + awful.rules.rules = { + -- All clients will match this rule. + { + rule = { }, + properties = { + border_width = beautiful.border_width, + border_color = beautiful.border_normal, + focus = true, + size_hints_honor = false, + keys = clientkeys, + minimized = false, + --skip_taskbar = true, + buttons = clientbuttons + } + }, + { + rule = { class = "Passprompt" }, + properties = { ontop = true, focus = true} + }, + { + rule = { class = "Sm" }, + properties = { + ontop = true, + border_width = 0 + } + }, + { + rule_any = { class = { + "pinentry", "Passprompt", "MPlayer" + }}, + properties = { floating = true, size_hints_honor = true } + }, + + { + rule = { class = "Firefox", instance = "Navigator" }, + properties = { + tag = tags[rule_screen][2], + floating = false, minimized = false + } + }, + { + rule_any = { class = {"Pidgin"}, instance = {"Weechat"} }, + properties = { + tag = tags[rule_screen][3], opacity = 0.9 + }, + callback = popup_urgent("new chat message") + }, + { + rule = { role = "buddy_list" }, + properties = { + master = true + } + }, + + { + rule = { class = "Steam", name = "Friends" }, + properties = { + master = true + } + }, + + { + rule_any = { role ={ "conversation" }, instance = { "Weechat" } }, + callback = awful.client.setslave + }, + { + rule = { class = "Irssi"}, + properties = { + tag = tags[rule_screen][3] + } , + callback = awful.client.setslave + }, + { + rule = { class = "Claws-mail" }, + properties = { + tag = tags[rule_screen][4] + } + }, + { + rule = { instance = "Gmutt" }, + properties = { + tag = tags[rule_screen][4] + } + }, + { + rule = { instance = "Gcanto" }, + properties = { + tag = tags[rule_screen][5] + } + }, + { + rule = { instance = "Gncmpcpp" }, + properties = { + tag = tags[rule_screen][6] + } + }, + { + rule = { class = "Gmpc" }, + properties = { + tag = tags[rule_screen][6] + } + }, + { + rule = { class = "Deluge" }, + properties = { + tag = tags[rule_screen][7] + } + }, + { + rule = { class = "Pdfpc" }, + properties = { + size_hints_honor = true, + float = true, + fullscreen = true + } + }, + { + rule = { class = "Cellwriter" }, + properties = { + tag = tags[rule_screen][1], + ontop = true, + size_hints_honor = true, + float = true, + sticky = true, + fullscreen = true + } + }, + { + rule = { class = "Xhtop" }, + properties = { + tag = tags[rule_screen][22] + } + }, + { + rule = { class = "Dmenu" }, + properties = { + opacity = 0.8 + } + }, + { + rule = { class = "URxvt" }, + properties = { + opacity = 0.9 + } + }, + { + rule = { class = "Gvim" }, + properties = { + opacity = 0.9 + } + }, + { + rule = { class = "feh", name = "timetable" }, + properties = { + tag = tags[rule_screen][13], + skip_taskbar = true, + type = desktop, + focusable = false, + border_width = 0 + } + }, + { + rule = { instance = "Awesomelog" }, + properties = { + tag = tags[rule_screen][14] + } + }, + { + rule = { class = "GLSlideshow" }, + properties = { + + } + } + } +end + +rules.setup = setup + +rules.mt.__call = setup + +return setmetatable(rules, rules.mt) diff --git a/teardrop.lua b/scratch/drop.lua similarity index 71% rename from teardrop.lua rename to scratch/drop.lua index f9ce7bb..4690e65 100644 --- a/teardrop.lua +++ b/scratch/drop.lua @@ -1,26 +1,27 @@ ----------------------------------------------------------------- +------------------------------------------------------------------- -- Drop-down applications manager for the awesome window manager ----------------------------------------------------------------- --- Adrian C. +------------------------------------------------------------------- +-- Coded by: * Lucas de Vries +-- Hacked by: * Adrian C. (anrxc) -- Licensed under the WTFPL version 2 -- * http://sam.zoy.org/wtfpl/COPYING ----------------------------------------------------------------- +------------------------------------------------------------------- -- To use this module add: --- require("teardrop") +-- local scratch = require("scratch") -- to the top of your rc.lua, and call it from a keybinding: --- teardrop(prog, vert, horiz, width, height, sticky, screen) +-- scratch.drop(prog, vert, horiz, width, height, sticky, screen) -- -- Parameters: -- prog - Program to run; "urxvt", "gmrun", "thunderbird" -- vert - Vertical; "bottom", "center" or "top" (default) -- horiz - Horizontal; "left", "right" or "center" (default) -- width - Width in absolute pixels, or width percentage --- when < 1 (0.9999 (99.9% of the screen) by default) +-- when <= 1 (1 (100% of the screen) by default) -- height - Height in absolute pixels, or height percentage --- when < 1 (0.25 (25% of the screen) by default) +-- when <= 1 (0.25 (25% of the screen) by default) -- sticky - Visible on all tags, false by default -- screen - Screen (optional), mouse.screen by default ----------------------------------------------------------------- +------------------------------------------------------------------- -- Grab environment local pairs = pairs @@ -32,26 +33,31 @@ local capi = { screen = screen } --- Teardrop: Drop-down applications manager for the awesome window manager -module("teardrop") +-- Scratchdrop: drop-down applications manager for the awesome window manager +local drop = {} -- module scratch.drop + local dropdown = {} -- Create a new window for the drop-down application when it doesn't -- exist, or toggle between hidden and visible states when it does function toggle(prog, vert, horiz, width, height, sticky, screen) - local vert = vert or "top" - local horiz = horiz or "center" - local width = width or 0.9999 - local height = height or 0.25 - local sticky = sticky or false - local screen = screen or capi.mouse.screen + vert = vert or "top" + horiz = horiz or "center" + width = width or 1 + height = height or 0.25 + sticky = sticky or false + screen = screen or capi.mouse.screen + + -- Determine signal usage in this version of awesome + local attach_signal = client.connect_signal or client.add_signal + local detach_signal = client.disconnect_signal or client.remove_signal if not dropdown[prog] then dropdown[prog] = {} - -- Add unmanage signal for teardrop programs - capi.client.add_signal("unmanage", function (c) + -- Add unmanage signal for scratchdrop programs + attach_signal("unmanage", function (c) for scr, cl in pairs(dropdown[prog]) do if cl == c then dropdown[prog][scr] = nil @@ -64,14 +70,14 @@ function toggle(prog, vert, horiz, width, height, sticky, screen) spawnw = function (c) dropdown[prog][screen] = c - -- Teardrop clients are floaters + -- Scratchdrop clients are floaters awful.client.floating.set(c, true) -- Client geometry and placement local screengeom = capi.screen[screen].workarea - if width < 1 then width = screengeom.width * width end - if height < 1 then height = screengeom.height * height end + if width <= 1 then width = screengeom.width * width end + if height <= 1 then height = screengeom.height * height end if horiz == "left" then x = screengeom.x elseif horiz == "right" then x = screengeom.width - width @@ -91,18 +97,18 @@ function toggle(prog, vert, horiz, width, height, sticky, screen) c:raise() capi.client.focus = c - capi.client.remove_signal("manage", spawnw) + detach_signal("manage", spawnw) end -- Add manage signal and spawn the program - capi.client.add_signal("manage", spawnw) + attach_signal("manage", spawnw) awful.util.spawn(prog, false) else -- Get a running client c = dropdown[prog][screen] -- Switch the client to the current workspace - if c:isvisible() == false then c.hidden = true; + if c:isvisible() == false then c.hidden = true awful.client.movetotag(awful.tag.selected(screen), c) end @@ -117,7 +123,7 @@ function toggle(prog, vert, horiz, width, height, sticky, screen) else -- Hide and detach tags if not c.hidden = true local ctags = c:tags() - for i, v in pairs(ctags) do + for i, t in pairs(ctags) do ctags[i] = nil end c:tags(ctags) @@ -125,4 +131,4 @@ function toggle(prog, vert, horiz, width, height, sticky, screen) end end -setmetatable(_M, { __call = function(_, ...) return toggle(...) end }) +return setmetatable(drop, { __call = function(_, ...) return toggle(...) end }) diff --git a/scratch/init.lua b/scratch/init.lua new file mode 100644 index 0000000..f3b3e7e --- /dev/null +++ b/scratch/init.lua @@ -0,0 +1,14 @@ +--------------------------------------------------------------- +-- Drop-down applications and scratchpad manager for awesome wm +--------------------------------------------------------------- +-- Coded by: * Adrian C. (anrxc) +-- Licensed under the WTFPL version 2 +-- * http://sam.zoy.org/wtfpl/COPYING +--------------------------------------------------------------- + +local scratch = {} -- module scratch + +scratch.pad = require("scratch.pad") +scratch.drop = require("scratch.drop") + +return scratch diff --git a/scratch/pad.lua b/scratch/pad.lua new file mode 100644 index 0000000..1208aab --- /dev/null +++ b/scratch/pad.lua @@ -0,0 +1,137 @@ +--------------------------------------------------------------- +-- Basic scratchpad manager for the awesome window manager +--------------------------------------------------------------- +-- Coded by: * Adrian C. (anrxc) +-- Licensed under the WTFPL version 2 +-- * http://sam.zoy.org/wtfpl/COPYING +--------------------------------------------------------------- +-- To use this module add: +-- local scratch = require("scratch") +-- to the top of your rc.lua, and call: +-- scratch.pad.set(c, width, height, sticky, screen) +-- from a clientkeys binding, and: +-- scratch.pad.toggle(screen) +-- from a globalkeys binding. +-- +-- Parameters: +-- c - Client to scratch or un-scratch +-- width - Width in absolute pixels, or width percentage +-- when <= 1 (0.50 (50% of the screen) by default) +-- height - Height in absolute pixels, or height percentage +-- when <= 1 (0.50 (50% of the screen) by default) +-- sticky - Visible on all tags, false by default +-- screen - Screen (optional), mouse.screen by default +--------------------------------------------------------------- + +-- Grab environment +local pairs = pairs +local awful = require("awful") +local capi = { + mouse = mouse, + client = client, + screen = screen +} + +-- Scratchpad: basic scratchpad manager for the awesome window manager +local pad = {} -- module scratch.pad + + +local scratchpad = {} + +-- Toggle a set of properties on a client. +local function toggleprop(c, prop) + c.ontop = prop.ontop or false + c.above = prop.above or false + c.hidden = prop.hidden or false + c.sticky = prop.stick or false + c.skip_taskbar = prop.task or false +end + +-- Scratch the focused client, or un-scratch and tile it. If another +-- client is already scratched, replace it with the focused client. +function pad.set(c, width, height, sticky, screen) + width = width or 0.50 + height = height or 0.50 + sticky = sticky or false + screen = screen or capi.mouse.screen + + -- Determine signal usage in this version of awesome + local attach_signal = capi.client.add_signal or capi.client.connect_signal + local detach_signal = capi.client.remove_signal or capi.client.disconnect_signal + + local function setscratch(c) + -- Scratchpad is floating and has no titlebar + awful.client.floating.set(c, true); awful.titlebar.remove(c) + + -- Scratchpad client properties + toggleprop(c, {ontop=true, above=true, task=true, stick=sticky}) + + -- Scratchpad geometry and placement + local screengeom = capi.screen[screen].workarea + if width <= 1 then width = screengeom.width * width end + if height <= 1 then height = screengeom.height * height end + + c:geometry({ -- Scratchpad is always centered on screen + x = screengeom.x + (screengeom.width - width) / 2, + y = screengeom.y + (screengeom.height - height) / 2, + width = width, height = height + }) + + -- Scratchpad should not loose focus + c:raise(); capi.client.focus = c + end + + -- Prepare a table for storing clients, + if not scratchpad.pad then scratchpad.pad = {} + -- add unmanage signal for scratchpad clients + attach_signal("unmanage", function (c) + for scr, cl in pairs(scratchpad.pad) do + if cl == c then scratchpad.pad[scr] = nil end + end + end) + end + + -- If the scratcphad is emtpy, store the client, + if not scratchpad.pad[screen] then + scratchpad.pad[screen] = c + -- then apply geometry and properties + setscratch(c) + else -- If a client is already scratched, + local oc = scratchpad.pad[screen] + -- unscratch, and compare it with the focused client + awful.client.floating.toggle(oc); toggleprop(oc, {}) + -- If it matches clear the table, if not replace it + if oc == c then scratchpad.pad[screen] = nil + else scratchpad.pad[screen] = c; setscratch(c) end + end +end + +-- Move the scratchpad to the current workspace, focus and raise it +-- when it's hidden, or hide it when it's visible. +function pad.toggle(screen) + screen = screen or capi.mouse.screen + + -- Check if we have a client on storage, + if scratchpad.pad and + scratchpad.pad[screen] ~= nil + then -- and get it out, to play + local c = scratchpad.pad[screen] + + -- If it's visible on another tag hide it, + if c:isvisible() == false then c.hidden = true + -- and move it to the current worskpace + awful.client.movetotag(awful.tag.selected(screen), c) + end + + -- Focus and raise if it's hidden, + if c.hidden then + awful.placement.centered(c) + c.hidden = false + c:raise(); capi.client.focus = c + else -- hide it if it's not + c.hidden = true + end + end +end + +return pad diff --git a/signals.lua b/signals.lua index 8f5f0c2..8c599de 100644 --- a/signals.lua +++ b/signals.lua @@ -1,12 +1,9 @@ +local awful = awful +local beautiful = beautiful --- {{{ Signals --- Signal function to execute when a new client appears. -client.add_signal("manage", function (c, startup) - -- Add a titlebar - -- awful.titlebar.add(c, { modkey = modkey }) - +client.connect_signal("manage", function (c, startup) -- Enable sloppy focus - c:add_signal("mouse::enter", function(c) + 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 @@ -24,8 +21,45 @@ client.add_signal("manage", function (c, startup) awful.placement.no_offscreen(c) end end + + local titlebars_enabled = false + if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then + -- Widgets that are aligned to the left + local left_layout = wibox.layout.fixed.horizontal() + left_layout:add(awful.titlebar.widget.iconwidget(c)) + + -- 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 title = awful.titlebar.widget.titlewidget(c) + title: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) + )) + + -- Now bring it all together + local layout = wibox.layout.align.horizontal() + layout:set_left(left_layout) + layout:set_right(right_layout) + layout:set_middle(title) + + awful.titlebar(c):set_widget(layout) + end end) -client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) -client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) --- }}} +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) diff --git a/simplelog.lua b/simplelog.lua new file mode 100644 index 0000000..b4e4c30 --- /dev/null +++ b/simplelog.lua @@ -0,0 +1,79 @@ +local naughty = require("naughty") + +local simplelog = { loggers = {}, mt = {}} + +local defaults = {} +local settings = {} + +defaults.loggers = { } +defaults.defaultlevel = 0 + +for key, value in pairs(defaults) do + settings[key] = value +end + +level = { + ERROR = 3, + WARNING = 2, + NORMAL = 1, + DEBUG = 0 +} +simplelog.level = level + +function loglv(msg, level) + for _,logger in ipairs(settings.loggers) do + logger(msg, level) + end +end + +function dbg(msg) + loglv(msg, 0) +end +simplelog.debug = dbg + +function log(msg) + loglv(msg, 1) +end +simplelog.log = log + +function warn(msg) + loglv(msg, 2) +end +simplelog.warn = warn + +function error(msg) + loglv(msg, 3) +end +simplelog.error = error + +function add_logger(logger, level) + if level == nil then + level = settings.defaultlevel + end + table.insert(settings.loggers, function(msg, severity) + if severity >= level then + logger(msg, severity) + end + end) +end +simplelog.add_logger = add_logger + +function logger_naughty(msg, severity) + if severity == level.WARNING then + msg = "".. msg .. "" + elseif severity == level.ERROR then + msg = "".. msg .. "" + end + naughty.notify({ text = msg }) +end +simplelog.loggers.naughty = logger_naughty + + +function logger_print(msg, severity) + print(msg) +end +simplelog.loggers.stdio = logger_print + +simplelog.mt.__call = log + +return setmetatable(simplelog, simplelog.mt) diff --git a/tags.lua b/tags.lua index 643730e..d6a8d37 100644 --- a/tags.lua +++ b/tags.lua @@ -1,21 +1,60 @@ +-- tags and layouts +local awful = awful +local conf = conf +local modkey = conf.modkey or "Mod4" --- {{{ Tags -tags={} -tags.setup = { - { name = "1:⚙", layout = layouts[1] }, +local tags={ mt={} } +local layouts = layouts + +local function funcViewOnly(i) + return function () + local screen = mouse.screen + if tags[screen][i] then + awful.tag.viewonly(tags[screen][i]) + end + end +end + +local function funcViewToggle(i) + return function () + local screen = mouse.screen + if tags[screen][i] then + awful.tag.viewtoggle(tags[screen][i]) + end + end +end + +local function funcMoveTo(i) + return function () + if client.focus and tags[client.focus.screen][i] then + awful.client.movetotag(tags[client.focus.screen][i]) + end + end +end + +local function funcToggle(i) + return function () + if client.focus and tags[client.focus.screen][i] then + awful.client.toggletag(tags[client.focus.screen][i]) + end + end +end + +local defaultsetup = { + {"1:⚙"}, { name = "2:⌘", layout = layouts[5] }, { name = "3:☻", layout = layouts[3], mwfact = 0.20 }, { name = "4:✉", layout = layouts[5] }, - { name = "5:☑", layout = layouts[1] }, - { name = "6:♫", layout = layouts[1] }, - { name = "7:☣", layout = layouts[1] }, - { name = "8:☕", layout = layouts[1] }, - { name = "9:⚂", layout = layouts[1] }, - { name = "0:☠", layout = layouts[1] }, - { name = "F1:☭", layout = layouts[1] }, - { name = "F2:♚", layout = layouts[1] }, - { name = "F3:♛", layout = layouts[1] }, - { name = "F4:♜", layout = layouts[1] }--, + {"5:☑"}, + {"6:♫"}, + {"7:☣"}, + {"8:☕"}, + {"9:⚂"}, + {"0:☠"}, + {"F1:☭"}, + {"F2:♚"}, + {"F3:♛"}, + {"F4:♜"}--, -- { name = "F5:♝", layout = layouts[1] }, -- { name = "F6:♞", layout = layouts[1] }, -- { name = "F7:♟", layout = layouts[1] }, @@ -26,15 +65,54 @@ tags.setup = { -- { name = "F12:⚙", layout = layouts[1] } } -for s = 1, screen.count() do - tags[s] = {} - for i, t in ipairs(tags.setup) do - tags[s][i] = tag({ name = t.name }) - tags[s][i].screen = s - awful.tag.setproperty(tags[s][i], "layout", t.layout) - awful.tag.setproperty(tags[s][i], "mwfact", t.mwfact) - awful.tag.setproperty(tags[s][i], "hide", t.hide) - end - tags[s][1].selected = true +local list = {} + +function tags.setup(setuptable) + local setup = setuptable or defaultsetup + for s = 1, screen.count() do + list[s] = {} + for i, t in ipairs(setup) do + local layout = t.layout or layouts[1] + local name = t.name or t[1] + list[s][i] = awful.tag.new({name}, s, layout)[1]; + list[s][i].selected = false + if(t.mwfact) then + awful.tag.setmwfact(t.mwfact,list[s][i]) + end + end + list[s][1].selected = true + end end --- }}} + +function tags.extend_key_table(globalkeys) + -- Compute the maximum number of digit we need, limited to 22 + keynumber = 0 + for s = 1, screen.count() do + keynumber = math.min(22, math.max(#(list[s]), keynumber)); + end + + local inspect = require("inspect") + local tagkeys = globalkeys or {} + + -- Bind all key numbers to tags, using keycodes + for i = 1, keynumber do + if i < 10 then + k = "#" .. i + 9 -- number keys 1-9 + elseif i == 10 then + k = "#19" -- zero + elseif i > 10 then + k = "F" .. i - 10 -- F keys + end + tagkeys = awful.util.table.join(tagkeys, + awful.key( { modkey }, k, funcViewOnly(i)), + awful.key( { modkey, "Control" }, k, funcViewToggle(i)), + awful.key( { modkey, "Shift" }, k, funcMoveTo(i)), + awful.key( { modkey, "Control", "Shift" }, k, funcToggle(i)) + ) + end + return tagkeys; +end + +tags.mt.__index = list +tags.mt.__newindex = list +return setmetatable(tags, tags.mt) diff --git a/zenburn/theme.lua b/theme.lua similarity index 78% rename from zenburn/theme.lua rename to theme.lua index a567a08..8f1580c 100644 --- a/zenburn/theme.lua +++ b/theme.lua @@ -1,16 +1,7 @@ -------------------------------- --- "Zenburn" awesome theme -- --- By Adrian C. (anrxc) -- -------------------------------- - --- Alternative icon sets and widget icons: --- * http://awesome.naquadah.org/wiki/Nice_Icons - -- {{{ Main theme = {} -theme.wallpaper_cmd = { "awsetbg -l" } +theme.wallpaper = "~/.wallpaper" -- }}} - -- {{{ Styles theme.font = "dejavu 7" @@ -35,40 +26,6 @@ theme.titlebar_bg_focus = "#3F3F3F" theme.titlebar_bg_normal = "#3F3F3F" -- }}} --- There are other variable sets --- overriding the default one when --- defined, the sets are: --- [taglist|tasklist]_[bg|fg]_[focus|urgent] --- titlebar_[normal|focus] --- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] --- Example: ---theme.taglist_bg_focus = "#CC9393" --- }}} - --- {{{ Widgets --- You can add as many variables as --- you wish and access them by using --- beautiful.variable in your rc.lua ---theme.fg_widget = "#AECF96" ---theme.fg_center_widget = "#88A175" ---theme.fg_end_widget = "#FF5656" ---theme.bg_widget = "#494B4F" ---theme.border_widget = "#3F3F3F" --- }}} - --- {{{ Mouse finder -theme.mouse_finder_color = "#CC9393" --- mouse_finder_[timeout|animate_timeout|radius|factor] --- }}} - --- {{{ Menu --- Variables set for theming the menu: --- menu_[bg|fg]_[normal|focus] --- menu_[border_color|border_width] -theme.menu_height = "15" -theme.menu_width = "100" --- }}} - -- {{{ Icons -- {{{ Taglist theme.taglist_squares_sel = "/usr/share/awesome/themes/zenburn/taglist/squarefz.png" diff --git a/uzbl.lua b/uzbl.lua deleted file mode 100644 index bbd6b22..0000000 --- a/uzbl.lua +++ /dev/null @@ -1,47 +0,0 @@ - - -uzbltag = tags[rule_screen][2] -mytasklist = {} -mytasklist.buttons = awful.util.table.join( -awful.button({ }, 1, function (c) - if c == client.focus then - c.minimized = true - else - 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 -end), -awful.button({ }, 3, function () - if instance then - instance:hide() - instance = nil - else - instance = awful.menu.clients({ width=250 }) - end -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)) - -mytasklist[rule_screen] = awful.widget.tasklist(function(c) - return awful.widget.tasklist.label.currenttags(c, rule_screen) -end, mytasklist.buttons) -uzblbox = {} -uzblbox = awful.wibox({ position = "top", screen = rule_screen }) -uzblbox.visible = false -uzblbox.widgets = { mytasklist[rule_screen], -layout = awful.widget.layout.horizontal.rightleft } - -uzbltag:add_signal("property::selected", function (tag) - uzblbox.visible = tag.selected -end) diff --git a/vicious b/vicious index 2d8d7d7..c316528 160000 --- a/vicious +++ b/vicious @@ -1 +1 @@ -Subproject commit 2d8d7d752bc54310634c44f2d90e4c54357ba989 +Subproject commit c316528698906fe5ce92a20b4de5863b1c1ab31b diff --git a/widgets.lua b/widgets.lua new file mode 100644 index 0000000..9c7b21f --- /dev/null +++ b/widgets.lua @@ -0,0 +1,265 @@ +local wibox = require("wibox") +local vicious = require("vicious") +local modkey = conf.modkey or "Mod4" + +local widgets = { add = {} } + +-------------------------------------------------------------------------------- +-- table declarations {{{ +-------------------------------------------------------------------------------- +local wlist = {} +local bars = {} +local leftwibox = {} +local rightwibox = {} + +local mytaglist = {} +mytaglist.buttons = awful.util.table.join( +awful.button({ }, 1, awful.tag.viewonly), +awful.button({ modkey }, 1, awful.client.movetotag), +awful.button({ }, 3, awful.tag.viewtoggle), +awful.button({ modkey }, 3, awful.client.toggletag), +awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end), +awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end) +) +-- }}} +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- setup {{{ +-------------------------------------------------------------------------------- +local function setup() -- {{{ + for s = 1, screen.count() do + wlist[s]={} + bars[s]={} + + + + -- Create the wibox + leftwibox[s] = awful.wibox({ + position = "left", + screen = s, + width = 18 + }) + rightwibox[s] = awful.wibox({ + position = "right", + screen = s, + width = 18 + }) + + -- {{{ create layouts + local left_bottom_layout = wibox.layout.fixed.horizontal() + local left_top_layout = wibox.layout.fixed.horizontal() + + local left_layout = wibox.layout.align.horizontal() + left_layout:set_left(left_bottom_layout) + left_layout:set_right(left_top_layout) + + local right_bottom_layout = wibox.layout.fixed.horizontal() + local right_top_layout = wibox.layout.fixed.horizontal() + + local right_layout = wibox.layout.align.horizontal() + right_layout:set_left(right_top_layout) + right_layout:set_right(right_bottom_layout) + --}}} + + + -- {{{ rotate layouts and add to wibox + local leftrotate = wibox.layout.rotate() + leftrotate:set_direction('east') + leftrotate:set_widget(left_layout) + leftwibox[s]:set_widget(leftrotate) + + local rightrotate = wibox.layout.rotate() + rightrotate:set_direction('west') + rightrotate:set_widget(right_layout) + rightwibox[s]:set_widget(rightrotate) + --}}} + + + bars[s] = {} + bars[s].left = {} + bars[s].left.bottom = left_bottom_layout + bars[s].left.top = left_top_layout + bars[s].right = {} + bars[s].right.bottom = right_bottom_layout + bars[s].right.top = right_top_layout + end +end -- }}} +widgets.setup = setup + +-- }}} +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- Utility {{{ +-------------------------------------------------------------------------------- + +-- force update of a widget +local function update(widgetname, index) -- {{{ + for s = 1, screen.count() do + if wlist[s] ~= nil and wlist[s][widgetname] ~= nil then + if index ~= nil then + vicious.force({ wlist[s][widgetname][index] }) + else + vicious.force({ wlist[s][widgetname] }) + end + end + end +end +--}}} +widgets.update = update + +-- get layout for adding widgets +local function get_layout(screen, bar, align) --{{{ + if bars[screen][bar] == nil then return nil end + + return bars[screen][bar][align] +end --}}} +widgets.layout = get_layout + +-- }}} +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- widget creators {{{ +-------------------------------------------------------------------------------- + +-- mail widget +local function mailwidget(name, screen, parent_layout, mailboxes) --{{{ + local widget = wibox.widget.textbox() + local bg = wibox.widget.background() + bg:set_widget(widget) + vicious.register(widget, vicious.widgets.mdir, function(widget, args) + if args[1] > 0 then + naughty.notify({ + title = "New mail arrived", + text = "Unread "..args[2].." / New "..args[1], + position = "top_left" + + }) + bg:set_bg(theme.bg_urgent) + bg:set_fg(theme.fg_urgent) + elseif args[2] > 0 then + bg:set_bg(theme.bg_focus) + bg:set_fg(theme.fg_focus) + else + bg:set_bg(theme.bg_normal) + bg:set_fg(theme.fg_normal) + end + return "⬓⬓ Unread "..args[2].." / New "..args[1].. " " + end, 0, mailboxes) + wlist[screen][name] = widget + parent_layout:add(bg) + widgets.update(name) +end +--}}} +widgets.add.mail = mailwidget + +-- text clock +local function clockwidget(name, screen, parent_layout) -- {{{ + wlist[screen][name] = awful.widget.textclock() + parent_layout:add(wlist[screen][name]) +end +--}}} +widgets.add.clock = clockwidget + +-- layoutbox +local function layoutwidget(screen, parent_layout) -- {{{ + wlist[screen]["layout"] = awful.widget.layoutbox(s) + parent_layout:add(wlist[screen]["layout"]) +end +--}}} +widgets.add.layout = layoutwidget + +-- taglist +local function taglistwidget(name, screen, parent_layout) --{{{ + -- Create a taglist widget + wlist[screen][name] = awful.widget.taglist(screen, + awful.widget.taglist.filter.all, + mytaglist.buttons) + parent_layout:add(wlist[screen][name]) +end --}}} +widgets.add.taglist = taglistwidget + +-- system tray +-- not using a name argument, because only one systray is allowed +local function systraywidget(screen, parent_layout) --{{{ + if (wlist["systray"] ~= nil) then + return + end + wlist["systray"] = wibox.widget.systray() + parent_layout:add(wlist["systray"]) +end --}}} +widgets.add.systray = systraywidget + +-- cpu usage +local function cpuwidget(name, screen, parent_layout) --{{{ + wlist[screen][name] = wibox.widget.textbox() + vicious.register(wlist[screen][name], vicious.widgets.cpu, "CPU: $1%") + parent_layout:add(wlist[screen][name]) +end --}}} +widgets.add.cpu = cpuwidget + +-- battery +local function batterywidget(name, screen, parent_layout, batname) --{{{ + print("creating batwidget '" .. name .. "' for battery '"..batname.."'") + local widget = wibox.widget.textbox() + local bg = wibox.widget.background() + bg:set_widget(widget) + vicious.register(widget, vicious.widgets.bat, function (widget, args) + if args[2] == 0 then return "" + else + if args[2] < 15 then + bg:set_bg(theme.bg_urgent) + bg:set_fg(theme.fg_urgent) + else + bg:set_bg(theme.bg_normal) + bg:set_fg(theme.fg_normal) + end + return name .. ": " .. + args[1]..args[2].."% - "..args[3] + end + end, 61, batname) + wlist[screen][name] = widget + parent_layout:add(bg) + widgets.update(name) +end --}}} +widgets.add.battery = batterywidget + +-- wireless status +local function wifiwidget(name, screen, parent_layout, interface) --{{{ + wlist[screen][name] = wibox.widget.textbox() + vicious.register(wlist[screen][name], vicious.widgets.wifi, + "WLAN ${ssid} @ ${sign}, Q:${link}/70", 31, interface) + parent_layout:add(wlist[screen][name]) +end --}}} +widgets.add.wifi = wifiwidget + +-- }}} +-------------------------------------------------------------------------------- + +-------------------------------------------------------------------------------- +-- spacers {{{ +-------------------------------------------------------------------------------- + +local spacer = wibox.widget.textbox() +spacer:set_text(" ") + +-- manual spacing between widgets +local function spacerwidget(parent_layout) --{{{ + parent_layout:add(spacer) +end --}}} +widgets.add.spacer = spacerwidget + +-- change appearance of spacers +local function spacertext(text) --{{{ + spacer:set_text(text) +end --}}} +widgets.set_spacer_text = spacertext + +-- }}} +-------------------------------------------------------------------------------- + +return widgets + +-- vim:foldmethod=marker diff --git a/zenburn/awesome-icon.png b/zenburn/awesome-icon.png deleted file mode 100644 index 70978d3..0000000 Binary files a/zenburn/awesome-icon.png and /dev/null differ diff --git a/zenburn/layouts/dwindle.png b/zenburn/layouts/dwindle.png deleted file mode 100644 index 1aa4bf2..0000000 Binary files a/zenburn/layouts/dwindle.png and /dev/null differ diff --git a/zenburn/layouts/fairh.png b/zenburn/layouts/fairh.png deleted file mode 100644 index e176bb3..0000000 Binary files a/zenburn/layouts/fairh.png and /dev/null differ diff --git a/zenburn/layouts/fairv.png b/zenburn/layouts/fairv.png deleted file mode 100644 index 7c0a92c..0000000 Binary files a/zenburn/layouts/fairv.png and /dev/null differ diff --git a/zenburn/layouts/floating.png b/zenburn/layouts/floating.png deleted file mode 100644 index a399092..0000000 Binary files a/zenburn/layouts/floating.png and /dev/null differ diff --git a/zenburn/layouts/fullscreen.png b/zenburn/layouts/fullscreen.png deleted file mode 100644 index a0c795c..0000000 Binary files a/zenburn/layouts/fullscreen.png and /dev/null differ diff --git a/zenburn/layouts/magnifier.png b/zenburn/layouts/magnifier.png deleted file mode 100644 index bca6db9..0000000 Binary files a/zenburn/layouts/magnifier.png and /dev/null differ diff --git a/zenburn/layouts/max.png b/zenburn/layouts/max.png deleted file mode 100644 index 96a237a..0000000 Binary files a/zenburn/layouts/max.png and /dev/null differ diff --git a/zenburn/layouts/spiral.png b/zenburn/layouts/spiral.png deleted file mode 100644 index 8f5aeed..0000000 Binary files a/zenburn/layouts/spiral.png and /dev/null differ diff --git a/zenburn/layouts/tile.png b/zenburn/layouts/tile.png deleted file mode 100644 index 3fcc904..0000000 Binary files a/zenburn/layouts/tile.png and /dev/null differ diff --git a/zenburn/layouts/tilebottom.png b/zenburn/layouts/tilebottom.png deleted file mode 100644 index dfe7832..0000000 Binary files a/zenburn/layouts/tilebottom.png and /dev/null differ diff --git a/zenburn/layouts/tileleft.png b/zenburn/layouts/tileleft.png deleted file mode 100644 index c5decfd..0000000 Binary files a/zenburn/layouts/tileleft.png and /dev/null differ diff --git a/zenburn/layouts/tiletop.png b/zenburn/layouts/tiletop.png deleted file mode 100644 index b251661..0000000 Binary files a/zenburn/layouts/tiletop.png and /dev/null differ diff --git a/zenburn/taglist/squarefz.png b/zenburn/taglist/squarefz.png deleted file mode 100644 index 0927720..0000000 Binary files a/zenburn/taglist/squarefz.png and /dev/null differ diff --git a/zenburn/taglist/squarez.png b/zenburn/taglist/squarez.png deleted file mode 100644 index 9b41c26..0000000 Binary files a/zenburn/taglist/squarez.png and /dev/null differ diff --git a/zenburn/titlebar/close_focus.png b/zenburn/titlebar/close_focus.png deleted file mode 100644 index 02565b9..0000000 Binary files a/zenburn/titlebar/close_focus.png and /dev/null differ diff --git a/zenburn/titlebar/close_normal.png b/zenburn/titlebar/close_normal.png deleted file mode 100644 index bc97b7c..0000000 Binary files a/zenburn/titlebar/close_normal.png and /dev/null differ diff --git a/zenburn/titlebar/floating_focus_active.png b/zenburn/titlebar/floating_focus_active.png deleted file mode 100644 index 63d900b..0000000 Binary files a/zenburn/titlebar/floating_focus_active.png and /dev/null differ diff --git a/zenburn/titlebar/floating_focus_inactive.png b/zenburn/titlebar/floating_focus_inactive.png deleted file mode 100644 index f442d78..0000000 Binary files a/zenburn/titlebar/floating_focus_inactive.png and /dev/null differ diff --git a/zenburn/titlebar/floating_normal_active.png b/zenburn/titlebar/floating_normal_active.png deleted file mode 100644 index 1355a55..0000000 Binary files a/zenburn/titlebar/floating_normal_active.png and /dev/null differ diff --git a/zenburn/titlebar/floating_normal_inactive.png b/zenburn/titlebar/floating_normal_inactive.png deleted file mode 100644 index e6731a3..0000000 Binary files a/zenburn/titlebar/floating_normal_inactive.png and /dev/null differ diff --git a/zenburn/titlebar/maximized_focus_active.png b/zenburn/titlebar/maximized_focus_active.png deleted file mode 100644 index 834f106..0000000 Binary files a/zenburn/titlebar/maximized_focus_active.png and /dev/null differ diff --git a/zenburn/titlebar/maximized_focus_inactive.png b/zenburn/titlebar/maximized_focus_inactive.png deleted file mode 100644 index 61cb93b..0000000 Binary files a/zenburn/titlebar/maximized_focus_inactive.png and /dev/null differ diff --git a/zenburn/titlebar/maximized_normal_active.png b/zenburn/titlebar/maximized_normal_active.png deleted file mode 100644 index ba5139a..0000000 Binary files a/zenburn/titlebar/maximized_normal_active.png and /dev/null differ diff --git a/zenburn/titlebar/maximized_normal_inactive.png b/zenburn/titlebar/maximized_normal_inactive.png deleted file mode 100644 index debd21f..0000000 Binary files a/zenburn/titlebar/maximized_normal_inactive.png and /dev/null differ diff --git a/zenburn/titlebar/ontop_focus_active.png b/zenburn/titlebar/ontop_focus_active.png deleted file mode 100644 index 776d586..0000000 Binary files a/zenburn/titlebar/ontop_focus_active.png and /dev/null differ diff --git a/zenburn/titlebar/ontop_focus_inactive.png b/zenburn/titlebar/ontop_focus_inactive.png deleted file mode 100644 index 3b8b5c3..0000000 Binary files a/zenburn/titlebar/ontop_focus_inactive.png and /dev/null differ diff --git a/zenburn/titlebar/ontop_normal_active.png b/zenburn/titlebar/ontop_normal_active.png deleted file mode 100644 index 70c0540..0000000 Binary files a/zenburn/titlebar/ontop_normal_active.png and /dev/null differ diff --git a/zenburn/titlebar/ontop_normal_inactive.png b/zenburn/titlebar/ontop_normal_inactive.png deleted file mode 100644 index 136f3f0..0000000 Binary files a/zenburn/titlebar/ontop_normal_inactive.png and /dev/null differ diff --git a/zenburn/titlebar/sticky_focus_active.png b/zenburn/titlebar/sticky_focus_active.png deleted file mode 100644 index 1726f90..0000000 Binary files a/zenburn/titlebar/sticky_focus_active.png and /dev/null differ diff --git a/zenburn/titlebar/sticky_focus_inactive.png b/zenburn/titlebar/sticky_focus_inactive.png deleted file mode 100644 index b83ceff..0000000 Binary files a/zenburn/titlebar/sticky_focus_inactive.png and /dev/null differ diff --git a/zenburn/titlebar/sticky_normal_active.png b/zenburn/titlebar/sticky_normal_active.png deleted file mode 100644 index 9b74056..0000000 Binary files a/zenburn/titlebar/sticky_normal_active.png and /dev/null differ diff --git a/zenburn/titlebar/sticky_normal_inactive.png b/zenburn/titlebar/sticky_normal_inactive.png deleted file mode 100644 index 0e29780..0000000 Binary files a/zenburn/titlebar/sticky_normal_inactive.png and /dev/null differ diff --git a/zenburn/zenburn-background.png b/zenburn/zenburn-background.png deleted file mode 100644 index 1eb9437..0000000 Binary files a/zenburn/zenburn-background.png and /dev/null differ