Merge branch 'awesome3.5'

This commit is contained in:
crater2150 2014-01-21 13:25:40 +01:00
commit 9a43fbf203
58 changed files with 1572 additions and 887 deletions

1
.gitignore vendored
View file

@ -3,3 +3,4 @@ wallpaper
walls walls
*.swp *.swp
localconf.lua localconf.lua
debugging

3
.gitmodules vendored
View file

@ -1,6 +1,3 @@
[submodule "obvious"]
path = obvious
url = git://git.mercenariesguild.net/obvious.git
[submodule "vicious"] [submodule "vicious"]
path = vicious path = vicious
url = http://git.sysphere.org/vicious url = http://git.sysphere.org/vicious

12
autobeautiful.lua Normal file
View file

@ -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

View file

@ -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

View file

@ -1,6 +1,13 @@
local aweswt = require("aweswt") -- key bindings
local mb = require("modalbind") local awful = awful
local conf = conf
local mpd = require("mpd") local mpd = require("mpd")
local scratch = require("scratch")
local modkey = conf.modkey or "Mod4"
local mb = require("modalbind")
local bindings = {mb = mb}
-- {{{ Mouse bindings -- {{{ Mouse bindings
root.buttons(awful.util.table.join( 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 local function spawnf(cmd) return function() awful.util.spawn(cmd) end end
conf.cmd.run = conf.cmd.run or spawnf("dmenu_run")
mpdmap = { mpdmap = {
name = "MPD", name = "MPD",
m = mpd.ctrl.toggle, m = mpd.ctrl.toggle,
n = mpd.ctrl.next, n = mpd.ctrl.next,
N = mpd.ctrl.prev, N = mpd.ctrl.prev,
s = spawnf("mpd"), s = spawnf("mpd"),
g = spawnf(cmd.mpd_client) S = spawnf("mpd --kill"),
g = spawnf(conf.cmd.mpd_client)
} }
mpdpromts = { mpdpromts = {
name = "MPD PROMPTS", name = "MPD PROMPTS",
a = mpd.prompt.artist, a = mpd.prompt.artist,
A = mpd.prompt.album, b = mpd.prompt.album,
t = mpd.prompt.title, t = mpd.prompt.title,
r = mpd.prompt.toggle_replace_on_search, r = mpd.prompt.toggle_replace_on_search
} }
progmap = { progmap = {
name = "PROGRAMS", name = "PROGRAMS",
f = spawnf(cmd.browser), f = spawnf(conf.cmd.browser),
i = spawnf(cmd.im_client), i = spawnf(conf.cmd.im_client),
I = spawnf(cmd.irc_client), I = spawnf(conf.cmd.irc_client),
m = spawnf(cmd.mail_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" } adapters = { u = "wwan", w = "wlan", b = "bluetooth" }
@ -41,95 +57,44 @@ function rfkill(cmd)
for key, adapter in pairs(adapters) do for key, adapter in pairs(adapters) do
map[key] = spawnf("sudo rfkill "..cmd.." "..adapter) map[key] = spawnf("sudo rfkill "..cmd.." "..adapter)
end end
print(map["name"])
return map return map
end end
wirelessmap = {
name = "RFKILL", connectmap = {
b = function () mb.grab(rfkill("block")) end, name = "CONNECT",
u = function () mb.grab(rfkill("unblock")) end u = spawnf("umts"),
w = spawnf("wlanacpi")
} }
-- {{{ Key bindings wirelessmap = {
globalkeys = awful.util.table.join( name = "WIRELESS",
--{{{ Focus and Tags b = mb.grabf(rfkill("block")),
awful.key({ modkey, }, "Left", awful.tag.viewprev ), u = mb.grabf(rfkill("unblock")),
awful.key({ modkey, }, "Right", awful.tag.viewnext ), c = mb.grabf(connectmap)
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),
function bindings.extend_and_register_key_table(globalkeys)
local totalkeys = globalkeys or {}
totalkeys = awful.util.table.join(totalkeys,
awful.key({ }, "Menu", spawnf('wmselect')), 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, "Control" }, "r", awesome.restart),
awful.key({ modkey, "Shift" }, "q", awesome.quit), awful.key({ modkey, "Shift" }, "q", awesome.quit),
awful.key({ modkey, }, "Return", spawnf(cmd.terminal)), awful.key({ modkey, }, "Return", spawnf(conf.cmd.terminal)),
--{{{ Modal mappings --{{{ Modal mappings
awful.key({ modkey }, "m", function () mb.grab(mpdmap, true) end), awful.key({ modkey }, "m", mb.grabf(mpdmap, true)),
awful.key({ modkey, "Shift" }, "m", function () mb.grab(mpdpromts) end), awful.key({ modkey, "Shift" }, "m", mb.grabf(mpdpromts)),
awful.key({ modkey }, "c", function () mb.grab(progmap) end), awful.key({ modkey }, "c", mb.grabf(progmap)),
awful.key({ modkey }, "w", function () mb.grab(wirelessmap) end), awful.key({ modkey }, "w", mb.grabf(wirelessmap)),
awful.key({ modkey }, "d", mb.grabf(docmap)),
--}}} --}}}
--{{{ Audio control --{{{ Audio control
awful.key({ }, "XF86AudioLowerVolume", function () awful.util.spawn("amixer set Master 2%-")end ), awful.key({ }, "XF86AudioLowerVolume", spawnf("amixer set Master 2%-")),
awful.key({ }, "XF86AudioRaiseVolume", function () awful.util.spawn("amixer set Master 2%+")end ), awful.key({ }, "XF86AudioRaiseVolume", spawnf("amixer set Master 2%+")),
awful.key({ }, "XF86AudioMute", spawnf("amixer set Master toggle")), awful.key({ }, "XF86AudioMute", spawnf("amixer set Master toggle")),
awful.key({ }, "XF86AudioPlay", mpd.ctrl.toggle), awful.key({ }, "XF86AudioPlay", mpd.ctrl.toggle),
awful.key({ }, "XF86AudioNext", mpd.ctrl.next), awful.key({ }, "XF86AudioNext", mpd.ctrl.next),
@ -138,38 +103,38 @@ globalkeys = awful.util.table.join(
--}}} --}}}
-- {{{ teardrops -- {{{ teardrops
awful.key({ }, "F12", function () teardrop(cmd.terminal,"center","center", 0.99, 0.7)end ), awful.key({ }, "F12", function ()
awful.key({ modkey }, "`", function () teardrop("urxvtc -e ncmpcpp","bottom","center", 0.99, 0.4)end ), scratch.drop(conf.cmd.terminal,"center","center", 0.99, 0.7)
awful.key({ }, "Print", function () teardrop("galsamixer","top","center", 0.99, 0.4)end ), 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 --{{{ Prompt
awful.key({ modkey }, "r", function () awful.key({ modkey }, "r", conf.cmd.run),
obvious.popup_run_prompt.set_prompt_string(" Run~ ")
obvious.popup_run_prompt.set_cache("history") awful.key({ modkey }, "s", spawnf("dmsearch")),
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),
--}}} --}}}
--{{{ misc. XF86 Keys --{{{ misc. XF86 Keys
awful.key({ }, "XF86Sleep", function () awful.util.spawn("/usr/local/bin/s2ram")end ), awful.key({ }, "XF86Sleep", spawnf("s2ram")),
awful.key({ }, "XF86Away", function () awful.util.spawn("xlock")end ), awful.key({ }, "XF86Away", spawnf("xlock")),
awful.key({ }, "XF86TouchpadToggle", function () awful.util.spawn("touchpad")end ), 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) function client_opacity_set(c, default, max, step)
if c.opacity < 0 or c.opacity > 1 then if c.opacity < 0 or c.opacity > 1 then
@ -183,7 +148,6 @@ function client_opacity_set(c, default, max, step)
end end
end end
clientkeys = awful.util.table.join( clientkeys = awful.util.table.join(
awful.key({ modkey, "Shift" }, "f", function (c) c.fullscreen = not c.fullscreen end), awful.key({ modkey, "Shift" }, "f", function (c) c.fullscreen = not c.fullscreen end),
awful.key({ modkey, "Shift" }, "c", function (c) c:kill() 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 ) 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( clientbuttons = awful.util.table.join(
awful.button({ }, 1, function (c) client.focus = c; c:raise() end), awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
awful.button({ modkey }, 1, awful.mouse.client.move), awful.button({ modkey }, 1, awful.mouse.client.move),
awful.button({ modkey }, 3, awful.mouse.client.resize)) awful.button({ modkey }, 3, awful.mouse.client.resize))
-- Set keys return bindings
root.keys(globalkeys)
-- }}}
-- vim: set fenc=utf-8 tw=80 foldmethod=marker : -- vim: set fenc=utf-8 tw=80 foldmethod=marker :

201
boxes.lua
View file

@ -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

27
errors.lua Normal file
View file

@ -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
-- }}}

248
inspect.lua Normal file
View file

@ -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('<table ', self:getId(t), '>')
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('<metatable> = '):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

90
layouts.lua Normal file
View file

@ -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)

View file

@ -1,133 +1,147 @@
local M = {} local modalbind = {}
local wibox = require("wibox")
local inited = false local inited = false
local modewidget = {} local modewidget = {}
local modewibox = { screen = -1 } local modewibox = { screen = -1 }
local nesting = 0
--local functions --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 = {} local defaults = {}
-- Default is 1 for people without compositing
defaults.opacity = 1.0 defaults.opacity = 1.0
defaults.height = 22 defaults.height = 22
defaults.border_width = 1 defaults.border_width = 1
defaults.x_offset = 18 defaults.x_offset = 0
defaults.y_offset = 0
defaults.show_options = true defaults.show_options = true
-- Clone the defaults for the used settings -- Clone the defaults for the used settings
local settings = {} local settings = {}
for key, value in pairs(defaults) do 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 end
M.set_opacity = function (amount) --- Change the opacity of the modebox.
settings.opacity = amount or defaults.opacity -- @param amount opacity between 0.0 and 1.0, or nil to use default
update_settings() function set_opacity(amount)
settings.opacity = amount or defaults.opacity
update_settings()
end end
modalbind.set_opacity = set_opacity
M.set_height = function (amount) --- Change height of the modebox.
settings.height = amount or defaults.height -- @param amount height in pixels, or nil to use default
update_settings() function set_height(amount)
settings.height = amount or defaults.height
update_settings()
end end
modalbind.set_height = set_height
M.set_border_width = function (amount) --- Change border width of the modebox.
settings.border_width = amount or defaults.border_width -- @param amount width in pixels, or nil to use default
update_settings() function set_border_width(amount)
settings.border_width = amount or defaults.border_width
update_settings()
end end
modalbind.set_border_width = set_border_width
M.set_x_offset = function (amount) --- Change horizontal offset of the modebox.
settings.x_offset = amount or defaults.x_offset -- set location for the box with set_corner(). The box is shifted to the right
update_settings() -- 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 end
modalbind.set_x_offset = set_x_offset
M.set_show_options = function (bool) --- Change vertical offset of the modebox.
settings.show_options = bool -- 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 end
modalbind.set_y_offset = set_y_offset
ensure_init = function () --- Set the corner, where the modebox will be displayed
if inited then -- If a parameter is not a valid orientation (see below), the function returns
return -- without doing anything
end -- @param vertical either top or bottom
-- @param horizontal either left or right
inited = true function set_corner(vertical, horizontal)
for s = 1, screen.count() do if (vertical ~= "top" and vertical ~= "bottom") then
modewidget[s] = widget({ return
type = "textbox", end
name = "modewidget" .. s, if (horizontal ~= "left" and horizontal ~= "right") then
align = "center" return
}) end
settings.corner_v = vertical or defaults.corner_v
modewibox[s] = wibox({ settings.corner_h = horizontal or defaults.corner_h
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
end end
modalbind.set_corner = set_corner
set_default = function (s) function set_show_options(bool)
modewibox[s]:geometry({ settings.show_options = bool
width = modewidget[s].extents(modewidget[s]).width, end
height = settings.height, modalbind.set_show_options = set_show_options
x = settings.x_offset < 0 and
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 screen[s].geometry.x - width + settings.x_offset or
settings.x_offset, settings.x_offset
y = screen[s].geometry.y + screen[s].geometry.height - settings.height modewibox[s].y = screen[s].geometry.height - settings.height
})
end end
update_settings = function () local function ensure_init()
for s, value in ipairs(modewibox) do if inited then
value.border_width = settings.border_width return
set_default(s) end
value.opacity = settings.opacity inited = true
end 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 end
show_box = function (s, map) local function show_box(s, map)
ensure_init() ensure_init()
modewibox.screen = s modewibox.screen = s
local label = " -- " .. map.name .. " -- " local label = " -- " .. map.name .. " -- "
@ -136,14 +150,55 @@ show_box = function (s, map)
if key ~= "name" then label = label .. " " .. key end if key ~= "name" then label = label .. " " .. key end
end end
end end
modewidget[s].text = label modewidget[s]:set_text(label)
set_default(s) modewibox[s].visible = true
modewibox[s].visible = true set_default(s)
end end
hide_box = function () local function hide_box()
local s = modewibox.screen local s = modewibox.screen
if s ~= -1 then modewibox[s].visible = false end if s ~= -1 then modewibox[s].visible = false end
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

56
mpd.lua
View file

@ -1,80 +1,76 @@
local awful = awful
local M = {} local M = {}
local type = "" local conf = conf
local awful = awful
local log = log
-- local functions -- local functions
local show, mpc_play_search, notify local dmenu, mpc_play_search, notify, mpc
local defaults = {} local defaults = {}
local settings = {} local settings = {}
defaults.host = "127.0.0.1"
defaults.port = 6600
defaults.replace_on_search = true defaults.replace_on_search = true
for key, value in pairs(defaults) do for key, value in pairs(defaults) do
settings[key] = value settings[key] = value
end end
-- {{{ basic functions mpc = function(command)
awful.util.spawn("mpc " .. command)
-- }}} end
-- {{{ mpd.ctrl submodule -- {{{ mpd.ctrl submodule
M.ctrl = {} M.ctrl = {}
M.ctrl.toggle = function () M.ctrl.toggle = function ()
awful.util.spawn("mpc toggle") mpc("toggle")
end end
M.ctrl.play = function () M.ctrl.play = function ()
awful.util.spawn("mpc play") mpc("play")
end end
M.ctrl.pause = function () M.ctrl.pause = function ()
awful.util.spawn("mpc pause") mpc("pause")
end end
M.ctrl.next = function () M.ctrl.next = function ()
awful.util.spawn("mpc next") mpc("next")
end end
M.ctrl.prev = function () M.ctrl.prev = function ()
awful.util.spawn("mpc prev") mpc("prev")
end
M.ctrl.clear = function ()
awful.util.spawn("mpc clear")
end end
-- }}} -- }}}
-- {{{ mpd.prompt submodule -- {{{ 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 true or
cfg.mpd_prompt_clear_before conf.mpd_prompt_clear_before
M.prompt = {} M.prompt = {}
M.prompt.artist = function() M.prompt.artist = function()
type = "artist" dmenu("-a")
show()
end end
M.prompt.album = function() M.prompt.album = function()
type = "album" dmenu("-a -b")
show()
end end
M.prompt.title = function() M.prompt.title = function()
type = "title" dmenu("-a -b -t")
show()
end end
M.prompt.title = title 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) M.prompt.replace_on_search = function(bool)
clear_before = bool clear_before = bool
end end
@ -86,16 +82,8 @@ M.prompt.toggle_replace_on_search = function()
).. " the playlist") ).. " the playlist")
end 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) function mpc_play_search(s)
if clear_before then M.ctrl.clear() end notify("Found " .. (s) .. " matches");
awful.util.spawn("mpc search " .. type .. " | mpc add; mpc play")
end end
-- }}} -- }}}

@ -1 +0,0 @@
Subproject commit c5b884459194a15a38b88c99d5558a64efaf4e89

103
rc.lua
View file

@ -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 layouts = require('layouts')
require("awful")
require("awful.autofocus")
require("awful.rules")
require("beautiful")
require("naughty")
require("teardrop")
require("obvious.popup_run_prompt")
require("vicious")
require("rodentbane.rodentbane")
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 -- {{{ Tags
beautiful.init("/home/crater2150/.config/awesome/zenburn/theme.lua")
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") widgets.add.mail("mail_me", s, ltop, { os.getenv("HOME") .. "/.maildir/me" })
dofile (MY_PATH .. "/bindings.lua") widgets.add.spacer(ltop)
dofile (MY_PATH .. "/rules.lua") widgets.add.mail("mail_uber", s, ltop, { os.getenv("HOME") .. "/.maildir/uber" })
dofile (MY_PATH .. "/signals.lua") widgets.add.spacer(ltop)
-- dofile (MY_PATH .. "uzbl.lua") 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

269
rules.lua
View file

@ -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 = { local rule_screen = conf.rule_screen or 1
-- All clients will match this rule.
{ rule = { }, local function popup_urgent(message)
properties = { border_width = beautiful.border_width, return function(client)
border_color = beautiful.border_normal, client:connect_signal("property::urgent", function (c)
focus = true, if c.urgent and not c.focus then
size_hints_honor = false, naughty.notify({ text=message })
keys = clientkeys, end
minimized = false, end)
--skip_taskbar = true, end
buttons = clientbuttons } }, end
{ rule = { class = "MPlayer" },
properties = { floating = true, local function setup(self)
size_hints_honor = true } }, awful.rules.rules = {
{ rule = { class = "Passprompt" }, -- All clients will match this rule.
properties = { floating = true, {
ontop = true, rule = { },
focus = true } }, properties = {
{ rule = { class = "pinentry" }, border_width = beautiful.border_width,
properties = { floating = true } }, border_color = beautiful.border_normal,
-- Set Firefox to always map on tags number 2 of screen 1. focus = true,
{ rule = { class = "Uzbl-core" }, size_hints_honor = false,
properties = { tag = tags[rule_screen][2], keys = clientkeys,
skip_taskbar = false } }, minimized = false,
{ rule = { class = "Firefox", instance = "Navigator" }, --skip_taskbar = true,
properties = { tag = tags[rule_screen][2], buttons = clientbuttons
floating = false, minimized = false } }, }
{ rule = { class = "Webbrowser", instance = "Navigator" }, },
properties = { tag = tags[rule_screen][2], {
floating = false, minimized = false } }, rule = { class = "Passprompt" },
{ rule = { class = "Pidgin" }, properties = { ontop = true, focus = true}
properties = { tag = tags[rule_screen][3], opacity = 0.9 } }, },
{ rule = { role = "buddy_list" }, {
properties = { master = true } }, rule = { class = "Sm" },
{ rule = { role = "conversation" }, properties = {
callback = awful.client.setslave }, ontop = true,
{ rule = { instance = "Weechat"}, border_width = 0
properties = { tag = tags[rule_screen][3]} , }
callback = awful.client.setslave}, },
{ rule = { class = "Irssi"}, {
properties = { tag = tags[rule_screen][3]} , rule_any = { class = {
callback = awful.client.setslave}, "pinentry", "Passprompt", "MPlayer"
{ rule = { class = "Claws-mail" }, }},
properties = { tag = tags[rule_screen][4] } }, properties = { floating = true, size_hints_honor = true }
{ rule = { instance = "Gmutt" }, },
properties = { tag = tags[rule_screen][4] } },
{ rule = { instance = "Gcanto" }, {
properties = { tag = tags[rule_screen][5] } }, rule = { class = "Firefox", instance = "Navigator" },
{ rule = { instance = "Gncmpcpp" }, properties = {
properties = { tag = tags[rule_screen][6] } }, tag = tags[rule_screen][2],
{ rule = { class = "Gmpc" }, floating = false, minimized = false
properties = { tag = tags[rule_screen][6] } }, }
{ rule = { class = "Deluge" }, },
properties = { tag = tags[rule_screen][7] } }, {
{ rule = { class = "Cellwriter" }, rule_any = { class = {"Pidgin"}, instance = {"Weechat"} },
properties = { tag = tags[rule_screen][1], properties = {
ontop = true, tag = tags[rule_screen][3], opacity = 0.9
size_hints_honor = true, },
float = true, callback = popup_urgent("new chat message")
sticky = true, },
fullscreen = true {
} }, rule = { role = "buddy_list" },
{ rule = { class = "Xhtop" }, properties = {
properties = { tag = tags[rule_screen][22] } }, master = true
{ rule = { class = "URxvt" }, }
properties = { opacity = 0.9 } }, },
{ rule = { instance = "URxvt" },
properties = { opacity = 0.9 } }, {
} 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)

View file

@ -1,26 +1,27 @@
---------------------------------------------------------------- -------------------------------------------------------------------
-- Drop-down applications manager for the awesome window manager -- Drop-down applications manager for the awesome window manager
---------------------------------------------------------------- -------------------------------------------------------------------
-- Adrian C. <anrxc.sysphere.org> -- Coded by: * Lucas de Vries <lucas@glacicle.com>
-- Hacked by: * Adrian C. (anrxc) <anrxc@sysphere.org>
-- Licensed under the WTFPL version 2 -- Licensed under the WTFPL version 2
-- * http://sam.zoy.org/wtfpl/COPYING -- * http://sam.zoy.org/wtfpl/COPYING
---------------------------------------------------------------- -------------------------------------------------------------------
-- To use this module add: -- To use this module add:
-- require("teardrop") -- local scratch = require("scratch")
-- to the top of your rc.lua, and call it from a keybinding: -- 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: -- Parameters:
-- prog - Program to run; "urxvt", "gmrun", "thunderbird" -- prog - Program to run; "urxvt", "gmrun", "thunderbird"
-- vert - Vertical; "bottom", "center" or "top" (default) -- vert - Vertical; "bottom", "center" or "top" (default)
-- horiz - Horizontal; "left", "right" or "center" (default) -- horiz - Horizontal; "left", "right" or "center" (default)
-- width - Width in absolute pixels, or width percentage -- 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 -- 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 -- sticky - Visible on all tags, false by default
-- screen - Screen (optional), mouse.screen by default -- screen - Screen (optional), mouse.screen by default
---------------------------------------------------------------- -------------------------------------------------------------------
-- Grab environment -- Grab environment
local pairs = pairs local pairs = pairs
@ -32,26 +33,31 @@ local capi = {
screen = screen screen = screen
} }
-- Teardrop: Drop-down applications manager for the awesome window manager -- Scratchdrop: drop-down applications manager for the awesome window manager
module("teardrop") local drop = {} -- module scratch.drop
local dropdown = {} local dropdown = {}
-- Create a new window for the drop-down application when it doesn't -- Create a new window for the drop-down application when it doesn't
-- exist, or toggle between hidden and visible states when it does -- exist, or toggle between hidden and visible states when it does
function toggle(prog, vert, horiz, width, height, sticky, screen) function toggle(prog, vert, horiz, width, height, sticky, screen)
local vert = vert or "top" vert = vert or "top"
local horiz = horiz or "center" horiz = horiz or "center"
local width = width or 0.9999 width = width or 1
local height = height or 0.25 height = height or 0.25
local sticky = sticky or false sticky = sticky or false
local screen = screen or capi.mouse.screen 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 if not dropdown[prog] then
dropdown[prog] = {} dropdown[prog] = {}
-- Add unmanage signal for teardrop programs -- Add unmanage signal for scratchdrop programs
capi.client.add_signal("unmanage", function (c) attach_signal("unmanage", function (c)
for scr, cl in pairs(dropdown[prog]) do for scr, cl in pairs(dropdown[prog]) do
if cl == c then if cl == c then
dropdown[prog][scr] = nil dropdown[prog][scr] = nil
@ -64,14 +70,14 @@ function toggle(prog, vert, horiz, width, height, sticky, screen)
spawnw = function (c) spawnw = function (c)
dropdown[prog][screen] = c dropdown[prog][screen] = c
-- Teardrop clients are floaters -- Scratchdrop clients are floaters
awful.client.floating.set(c, true) awful.client.floating.set(c, true)
-- Client geometry and placement -- Client geometry and placement
local screengeom = capi.screen[screen].workarea local screengeom = capi.screen[screen].workarea
if width < 1 then width = screengeom.width * width end if width <= 1 then width = screengeom.width * width end
if height < 1 then height = screengeom.height * height end if height <= 1 then height = screengeom.height * height end
if horiz == "left" then x = screengeom.x if horiz == "left" then x = screengeom.x
elseif horiz == "right" then x = screengeom.width - width elseif horiz == "right" then x = screengeom.width - width
@ -91,18 +97,18 @@ function toggle(prog, vert, horiz, width, height, sticky, screen)
c:raise() c:raise()
capi.client.focus = c capi.client.focus = c
capi.client.remove_signal("manage", spawnw) detach_signal("manage", spawnw)
end end
-- Add manage signal and spawn the program -- Add manage signal and spawn the program
capi.client.add_signal("manage", spawnw) attach_signal("manage", spawnw)
awful.util.spawn(prog, false) awful.util.spawn(prog, false)
else else
-- Get a running client -- Get a running client
c = dropdown[prog][screen] c = dropdown[prog][screen]
-- Switch the client to the current workspace -- 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) awful.client.movetotag(awful.tag.selected(screen), c)
end end
@ -117,7 +123,7 @@ function toggle(prog, vert, horiz, width, height, sticky, screen)
else -- Hide and detach tags if not else -- Hide and detach tags if not
c.hidden = true c.hidden = true
local ctags = c:tags() local ctags = c:tags()
for i, v in pairs(ctags) do for i, t in pairs(ctags) do
ctags[i] = nil ctags[i] = nil
end end
c:tags(ctags) c:tags(ctags)
@ -125,4 +131,4 @@ function toggle(prog, vert, horiz, width, height, sticky, screen)
end end
end end
setmetatable(_M, { __call = function(_, ...) return toggle(...) end }) return setmetatable(drop, { __call = function(_, ...) return toggle(...) end })

14
scratch/init.lua Normal file
View file

@ -0,0 +1,14 @@
---------------------------------------------------------------
-- Drop-down applications and scratchpad manager for awesome wm
---------------------------------------------------------------
-- Coded by: * Adrian C. (anrxc) <anrxc@sysphere.org>
-- 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

137
scratch/pad.lua Normal file
View file

@ -0,0 +1,137 @@
---------------------------------------------------------------
-- Basic scratchpad manager for the awesome window manager
---------------------------------------------------------------
-- Coded by: * Adrian C. (anrxc) <anrxc@sysphere.org>
-- 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

View file

@ -1,12 +1,9 @@
local awful = awful
local beautiful = beautiful
-- {{{ Signals client.connect_signal("manage", function (c, startup)
-- 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 })
-- Enable sloppy focus -- 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 if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
and awful.client.focus.filter(c) then and awful.client.focus.filter(c) then
client.focus = c client.focus = c
@ -24,8 +21,45 @@ client.add_signal("manage", function (c, startup)
awful.placement.no_offscreen(c) awful.placement.no_offscreen(c)
end end
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) end)
client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end) client.connect_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("unfocus", function(c) c.border_color = beautiful.border_normal end)
-- }}}

79
simplelog.lua Normal file
View file

@ -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 = "<span color=\"#ff6\">".. msg .. "</span>"
elseif severity == level.ERROR then
msg = "<span color=\"#f66\">".. msg .. "</span>"
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)

128
tags.lua
View file

@ -1,21 +1,60 @@
-- tags and layouts
local awful = awful
local conf = conf
local modkey = conf.modkey or "Mod4"
-- {{{ Tags local tags={ mt={} }
tags={} local layouts = layouts
tags.setup = {
{ name = "1:⚙", layout = layouts[1] }, 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 = "2:⌘", layout = layouts[5] },
{ name = "3:☻", layout = layouts[3], mwfact = 0.20 }, { name = "3:☻", layout = layouts[3], mwfact = 0.20 },
{ name = "4:✉", layout = layouts[5] }, { name = "4:✉", layout = layouts[5] },
{ name = "5:☑", layout = layouts[1] }, {"5:☑"},
{ name = "6:♫", layout = layouts[1] }, {"6:♫"},
{ name = "7:☣", layout = layouts[1] }, {"7:☣"},
{ name = "8:☕", layout = layouts[1] }, {"8:☕"},
{ name = "9:⚂", layout = layouts[1] }, {"9:⚂"},
{ name = "0:☠", layout = layouts[1] }, {"0:☠"},
{ name = "F1:☭", layout = layouts[1] }, {"F1:☭"},
{ name = "F2:♚", layout = layouts[1] }, {"F2:♚"},
{ name = "F3:♛", layout = layouts[1] }, {"F3:♛"},
{ name = "F4:♜", layout = layouts[1] }--, {"F4:♜"}--,
-- { name = "F5:♝", layout = layouts[1] }, -- { name = "F5:♝", layout = layouts[1] },
-- { name = "F6:♞", layout = layouts[1] }, -- { name = "F6:♞", layout = layouts[1] },
-- { name = "F7:♟", layout = layouts[1] }, -- { name = "F7:♟", layout = layouts[1] },
@ -26,15 +65,54 @@ tags.setup = {
-- { name = "F12:⚙", layout = layouts[1] } -- { name = "F12:⚙", layout = layouts[1] }
} }
for s = 1, screen.count() do local list = {}
tags[s] = {}
for i, t in ipairs(tags.setup) do function tags.setup(setuptable)
tags[s][i] = tag({ name = t.name }) local setup = setuptable or defaultsetup
tags[s][i].screen = s for s = 1, screen.count() do
awful.tag.setproperty(tags[s][i], "layout", t.layout) list[s] = {}
awful.tag.setproperty(tags[s][i], "mwfact", t.mwfact) for i, t in ipairs(setup) do
awful.tag.setproperty(tags[s][i], "hide", t.hide) local layout = t.layout or layouts[1]
end local name = t.name or t[1]
tags[s][1].selected = true 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 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)

View file

@ -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 -- {{{ Main
theme = {} theme = {}
theme.wallpaper_cmd = { "awsetbg -l" } theme.wallpaper = "~/.wallpaper"
-- }}} -- }}}
-- {{{ Styles -- {{{ Styles
theme.font = "dejavu 7" theme.font = "dejavu 7"
@ -35,40 +26,6 @@ theme.titlebar_bg_focus = "#3F3F3F"
theme.titlebar_bg_normal = "#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 -- {{{ Icons
-- {{{ Taglist -- {{{ Taglist
theme.taglist_squares_sel = "/usr/share/awesome/themes/zenburn/taglist/squarefz.png" theme.taglist_squares_sel = "/usr/share/awesome/themes/zenburn/taglist/squarefz.png"

View file

@ -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)

@ -1 +1 @@
Subproject commit 2d8d7d752bc54310634c44f2d90e4c54357ba989 Subproject commit c316528698906fe5ce92a20b4de5863b1c1ab31b

265
widgets.lua Normal file
View file

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB