--
-- config for awesome 3.1
-- by Andrey A. Ugolnik
-- http://www.ugolnik.info
-- andrey (0) ugolnik.info
-- Include awesome libraries, with lots of useful function!
require("awful")
require("beautiful")
require("tabulous")
require("wicked")
-- {{{ Variable definitions
-- Themes define colours, icons, and wallpapers
-- The default is a dark theme
theme_path = os.getenv("HOME") .. "/.config/awesome/theme-my"
-- Uncommment this for a lighter theme
-- theme_path = "/usr/share/awesome/themes/sky/theme"
-- Actually load theme
beautiful.init(theme_path)
-- This is used later as the default terminal and editor to run.
terminal = "uxterm"
editor = os.getenv("EDITOR") or "vi"
editor_cmd = terminal .. " -e " .. editor
-- Default modkey.
-- Usually, Mod4 is the key with a logo between Control and Alt.
-- If you do not like this or do not have such a key,
-- I suggest you to remap Mod4 to another key using xmodmap or other tools.
-- However, you can use another modifier like Mod1, but it may interact with others.
modkey = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters.
layouts =
{
"tile",
"tileleft",
"tilebottom",
"tiletop",
"fairh",
"fairv",
"magnifier",
"max",
"fullscreen",
"spiral",
"dwindle",
"floating"
}
-- Table of clients that should be set floating. The index may be either
-- the application class or instance. The instance is useful when running
-- a console app in a terminal like (Music on Console)
-- xterm -name mocp -e mocp
floatapps =
{
-- by class
["MPlayer"] = true,
["Smplayer"] = true,
["pinentry"] = true,
["gimp"] = true,
["psi"] = true,
-- ["Gajim.py"] = true,
["SimpleViewer"] = true,
["Keepassx"] = true,
["Qalculate"] = true,
["Qalculate-kde"] = true,
["Qstardict"] = true,
["Ossxmix"] = true,
-- by instance
["mocp"] = true,
["openmsx"] = true,
["wpa_gui"] = true,
["Qmpdclient"] = true,
["wicd-client.py"] = true,
}
-- Applications to be moved to a pre-defined tag by class or instance.
-- Use the screen and tags indices.
apptags =
{
["Firefox"] = { screen = 1, tag = 1 },
["WeeChat"] = { screen = 1, tag = 3 },
["NewsBeuter"] = { screen = 1, tag = 3 },
["Kontact"] = { screen = 1, tag = 3 },
["psi"] = { screen = 1, tag = 3 },
["Thunderbird-bin"] = { screen = 1, tag = 3 },
["Gajim.py"] = { screen = 1, tag = 3 },
["VirtualBox"] = { screen = 1, tag = 6 },
["Codeblocks"] = { screen = 1, tag = 4 },
["gimp"] = { screen = 1, tag = 5 },
["Vmware"] = { screen = 1, tag = 6 },
-- ["mocp"] = { screen = 2, tag = 4 },
}
---------------------------------------------
-- by _Andrey_
--
-- some useful stuff
os.execute("killall -s KILL xhkeys")
os.execute("xhkeys &")
os.execute("killall -s KILL xxkb")
os.execute("xxkb &")
--os.execute("killall xneur")
--os.execute("xneur &")
-- generate programs list for dmenu
progslist_path = os.getenv("HOME") .. "/.cache/awesome/proglist"
function proglist()
local path = os.getenv("PATH")
os.execute("paths=$(echo \"" .. path .. "\" | sed 'y/:/ /') ; ls -lL $paths 2>/dev/null | awk '$1 ~ /^[^d].*x/ && NF > 2 { print $NF }' | sort | uniq > " .. progslist_path)
-- unregister this function
awful.hooks.timer.unregister(proglist)
end
-- make proglist in background after awesome starts (prevent awesome freeze)
awful.hooks.timer.register(5, proglist)
--proglist(os.getenv("PATH"))
-- date and time widget
datewidget = widget({ type = 'textbox', name = 'datewidget', align = "right" })
wicked.register(datewidget, wicked.widgets.date, ' %a %d.%m.%Y %H:%M ')
-- music player daemon info
--mpdScrollerPos = 1
--mpdScrollerDir = true
--mpdScrollerLen = 20
mpdwidget = widget({ type = 'textbox', name = 'mpdwidget', align = 'right', })
--wicked.register(mpdwidget, wicked.widgets.mpd, ' mpd:$1')
wicked.register(mpdwidget, wicked.widgets.mpd,
function (widget, args)
if args[1]:find("volume:") == nil then
mpdwidget.width = 150
local song = awful.util.escape(args[1])
--[[ local out
local maxlen = song:len()
if mpdScrollerPos + mpdScrollerLen - 1 < maxlen then
maxlen = mpdScrollerPos + mpdScrollerLen - 1
end
out = song:sub(mpdScrollerPos, maxlen)
if mpdScrollerDir == true then
mpdScrollerPos = mpdScrollerPos + 1
else
mpdScrollerPos = mpdScrollerPos - 1
end
if mpdScrollerPos + mpdScrollerLen > args[1]:len() or mpdScrollerPos == 1 then
mpdScrollerDir = not mpdScrollerDir
end
return ' mpd:' .. out
--]] return ' mpd:' .. song
else
mpdwidget.width = 150
return ''
end
end)
-- common widget (volume and ram now)
myinfo = widget({ type = "textbox", name = "myinfo", align = "right" })
--memwidget = widget({ type = 'textbox', name = 'memwidget' })
--wicked.register(memwidget, wicked.widgets.mem, ' mem: $1 ($2Mb/$3Mb)')
-- graphics cpu widget
cpugraphwidget = widget({ type = 'graph', name = 'cpugraphwidget', align = 'right' })
--cpugraphwidget.height = 0.85
cpugraphwidget.height = 0.95
cpugraphwidget.width = 40
cpugraphwidget.bg = '#000022'
cpugraphwidget.border_color = '#0a0a0a'
cpugraphwidget.grow = 'left'
cpugraphwidget:plot_properties_set('cpu', { fg = '#60ff60', fg_center = '#50e050', fg_end = '#40d040', vertical_gradient = false })
wicked.register(cpugraphwidget, wicked.widgets.cpu, '$1', 1, 'cpu')
-- network interfaces widget
netwidget = widget({ type = 'textbox', name = 'netwidget', align = 'right' })
wicked.register(netwidget, wicked.widgets.net, ' wifi:${wlan0 rx}/${wlan0 tx} ppp:${ppp0 rx}/${ppp0 tx} ', nil, nil, 0)
--[[wicked.register(netwidget, wicked.widgets.net,
function (widget, args)
local out = '['
if args['{wlan0 rx}'] ~= nil then
out = out .. 'wwwww'--' wifi:${wlan0 rx}/${wlan0 tx}'
end
-- if '${ppp0 rx}' ~= nil then
-- out = out .. ' ppp:${ppp0 rx}/${ppp0 tx}'
-- end
return out .. ']'
end, nil, nil, 0)
--]]
-- laptop battary widget, discharging, charging, normal
batterywidget = widget({ type = 'textbox', name = 'batterywidget', align = 'right' })
function my_battery(format)
local f = io.popen('acpitool')
local l = f:lines()
local v = ''
for line in l do
if line:find('discharging') ~= nil then
st = line:find('%d+.%d+')
en = line:find('%', 0, true)
v = '-' .. line:sub(st, en-1) .. '%% (' .. line:sub(en+3, line:len()-3) .. ')'
break
end
if line:find('charging') ~= nil then
st = line:find('%d+.%d+')
en = line:find('%', 0, true)
v = '+' .. line:sub(st, en-1) .. '%%'
if line:len() > en then
v = v .. ' (' .. line:sub(en+3, line:len()-3) .. ')'
end
break
end
if line:find('charged') ~= nil then
st = line:find('%d+.%d+')
en = line:find('%', 0, true)
v = line:sub(st, en-1) .. '%%'
break
end
end
f:close()
return {v}
end
wicked.register(batterywidget, my_battery, " bat:$1", 5)
--
-- by _Andrey_
---------------------------------------------
-- Define if we want to use titlebar on all applications.
use_titlebar = true
-- }}}
-- {{{ Tags
-- Define tags table.
tags = {}
--tags_names = { "browser", "console", "messaging", "develop", "graphics", "vm", "7", "8", "9" }
tags_names = { "brw", "cns", "msg", "dev", "gfx", "vm", "7", "8", "9" }
tags_layout = { "tile", "tileleft", "magnifier", "floating", "tile", "max", "tile", "tile", "tile" }
for s = 1, screen.count() do
-- Each screen has its own tag table.
tags[s] = {}
-- Create 9 tags per screen.
for tagnumber = 1, 9 do
--tags[s][tagnumber] = tag({ name = tagnumber, layout = layouts[1] })
tags[s][tagnumber] = tag({ name = tags_names[tagnumber], layout = tags_layout[tagnumber] })
-- Add tags to screen one by one
tags[s][tagnumber].screen = s
end
-- I'm sure you want to see at least one tag.
tags[s][1].selected = true
end
-- }}}
-- {{{ Wibox
-- Create a textbox widget
--mytextbox = widget({ type = "textbox", align = "right" })
-- Set the default text in textbox
--mytextbox.text = " " .. AWESOME_RELEASE .. " "
--[[ Create a laucher widget and a main menu
myawesomemenu = {
{ "manual", terminal .. " -e man awesome" },
{ "edit config", editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua" },
{ "restart", awesome.restart },
{ "quit", awesome.quit }
}
mymainmenu = awful.menu.new({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
{ "open terminal", terminal }
}
})
mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
menu = mymainmenu })
--]]
-- Create a systray
mysystray = widget({ type = "systray", align = "right" })
-- Create a wibox for each screen and add it
mywibox = {}
mypromptbox = {}
mylayoutbox = {}
mytaglist = {}
mytaglist.buttons = { button({ }, 1, awful.tag.viewonly),
button({ modkey }, 1, awful.client.movetotag),
button({ }, 3, function (tag) tag.selected = not tag.selected end),
button({ modkey }, 3, awful.client.toggletag),
button({ }, 4, awful.tag.viewnext),
button({ }, 5, awful.tag.viewprev) }
mytasklist = {}
mytasklist.buttons = { button({ }, 1, function (c) client.focus = c; c:raise() end),
button({ }, 3, function () awful.menu.clients({ width=250 }) end),
button({ }, 4, function () awful.client.focus.byidx(1) end),
button({ }, 5, function () awful.client.focus.byidx(-1) end) }
for s = 1, screen.count() do
-- Create a promptbox for each screen
mypromptbox[s] = widget({ type = "textbox", align = "left" })
-- Create an imagebox widget which will contains an icon indicating which layout we're using.
-- We need one layoutbox per screen.
mylayoutbox[s] = widget({ type = "imagebox", align = "right" })
mylayoutbox[s]:buttons({ button({ }, 1, function () awful.layout.inc(layouts, 1) end),
button({ }, 3, function () awful.layout.inc(layouts, -1) end),
button({ }, 4, function () awful.layout.inc(layouts, 1) end),
button({ }, 5, function () awful.layout.inc(layouts, -1) end) })
-- Create a taglist widget
mytaglist[s] = awful.widget.taglist.new(s, awful.widget.taglist.label.all, mytaglist.buttons)
-- Create a tasklist widget
mytasklist[s] = awful.widget.tasklist.new(function(c)
return awful.widget.tasklist.label.currenttags(c, s)
end, mytasklist.buttons)
-- Create the wibox
mywibox[s] = wibox({ position = "bottom", fg = beautiful.fg_normal, bg = beautiful.bg_normal, height = "16" })
-- Add widgets to the wibox - order matters
mywibox[s].widgets = {
-- mylauncher,
mytaglist[s],
-- mytasklist[s],
mypromptbox[s],
mpdwidget,
batterywidget,
myinfo,
netwidget,
cpugraphwidget,
-- mytextbox,
s == 1 and mysystray or nil,
datewidget,
mylayoutbox[s],
}
mywibox[s].screen = s
end
-- }}}
-- {{{ Mouse bindings
awesome.buttons({
-- button({ }, 3, function () mymainmenu:toggle() end),
button({ }, 4, awful.tag.viewnext),
button({ }, 5, awful.tag.viewprev)
})
-- }}}
-- {{{ Key bindings
-- Bind keyboard digits
-- Compute the maximum number of digit we need, limited to 9
keynumber = 0
for s = 1, screen.count() do
keynumber = math.min(9, math.max(#tags[s], keynumber));
end
for i = 1, keynumber do
keybinding({ modkey }, i,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
end
end):add()
keybinding({ modkey, "Control" }, i,
function ()
local screen = mouse.screen
if tags[screen][i] then
tags[screen][i].selected = not tags[screen][i].selected
end
end):add()
keybinding({ modkey, "Shift" }, i,
function ()
if client.focus then
if tags[client.focus.screen][i] then
awful.client.movetotag(tags[client.focus.screen][i])
end
end
end):add()
keybinding({ modkey, "Control", "Shift" }, i,
function ()
if client.focus then
if tags[client.focus.screen][i] then
awful.client.toggletag(tags[client.focus.screen][i])
end
end
end):add()
end
keybinding({ modkey }, "Left", awful.tag.viewprev):add()
keybinding({ modkey }, "Right", awful.tag.viewnext):add()
keybinding({ modkey }, "Escape", awful.tag.history.restore):add()
-- Standard program
keybinding({ modkey }, "Return", function () awful.util.spawn(terminal) end):add()
keybinding({ modkey, "Control" }, "r", function ()
mypromptbox[mouse.screen].text =
awful.util.escape(awful.util.restart())
end):add()
keybinding({ modkey, "Shift" }, "q", awesome.quit):add()
-- Client manipulation
keybinding({ modkey }, "m", awful.client.maximize):add()
keybinding({ modkey }, "f", function () if client.focus then client.focus.fullscreen = not client.focus.fullscreen end end):add()
keybinding({ modkey, "Shift" }, "c", function () if client.focus then client.focus:kill() end end):add()
keybinding({ modkey }, "j", function () awful.client.focus.byidx(1); if client.focus then client.focus:raise() end end):add()
keybinding({ modkey }, "k", function () awful.client.focus.byidx(-1); if client.focus then client.focus:raise() end end):add()
keybinding({ modkey, "Shift" }, "j", function () awful.client.swap.byidx(1) end):add()
keybinding({ modkey, "Shift" }, "k", function () awful.client.swap.byidx(-1) end):add()
keybinding({ modkey, "Control" }, "j", function () awful.screen.focus(1) end):add()
keybinding({ modkey, "Control" }, "k", function () awful.screen.focus(-1) end):add()
keybinding({ modkey, "Control" }, "space", awful.client.togglefloating):add()
keybinding({ modkey, "Control" }, "Return", function () if client.focus then client.focus:swap(awful.client.getmaster()) end end):add()
keybinding({ modkey }, "o", awful.client.movetoscreen):add()
keybinding({ modkey }, "Tab", awful.client.focus.history.previous):add()
keybinding({ modkey }, "u", awful.client.urgent.jumpto):add()
keybinding({ modkey, "Shift" }, "r", function () if client.focus then client.focus:redraw() end end):add()
-- Layout manipulation
keybinding({ modkey }, "l", function () awful.tag.incmwfact(0.05) end):add()
keybinding({ modkey }, "h", function () awful.tag.incmwfact(-0.05) end):add()
keybinding({ modkey, "Shift" }, "h", function () awful.tag.incnmaster(1) end):add()
keybinding({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end):add()
keybinding({ modkey, "Control" }, "h", function () awful.tag.incncol(1) end):add()
keybinding({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end):add()
keybinding({ modkey }, "space", function () awful.layout.inc(layouts, 1) end):add()
keybinding({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end):add()
-- Prompt
--[[
keybinding({ modkey }, "F1", function ()
awful.prompt.run({ prompt = "Run: " }, mypromptbox[mouse.screen], awful.util.spawn, awful.completion.bash,
awful.util.getdir("cache") .. "/history")
end):add()
--]]
-- bind dmenu on Mod4 + F1
dmenu = "dmenu -i -fn '" .. beautiful.font .. "' -nb '" .. beautiful.bg_normal .."' -nf '" .. beautiful.fg_normal .. "'"
keybinding({ modkey }, "F1",
function ()
local f = io.popen(dmenu .. " <" .. progslist_path)
local l = f:lines()
for line in l do
if line ~= nil then
os.execute(line .."&")
break
end
end
f:close()
end):add()
-- lock screen and keyboard
keybinding({ modkey }, "F12",
function ()
awful.spawn('alock -bg blank:color=#000033 none -auth pam')
end):add()
keybinding({ modkey }, "F4", function ()
awful.prompt.run({ prompt = "Run Lua code: " }, mypromptbox[mouse.screen], awful.util.eval, awful.prompt.bash,
awful.util.getdir("cache") .. "/history_eval")
end):add()
keybinding({ modkey, "Ctrl" }, "i", function ()
local s = mouse.screen
if mypromptbox[s].text then
mypromptbox[s].text = nil
elseif client.focus then
mypromptbox[s].text = nil
if client.focus.class then
mypromptbox[s].text = "Class: " .. client.focus.class .. " "
end
if client.focus.instance then
mypromptbox[s].text = mypromptbox[s].text .. "Instance: ".. client.focus.instance .. " "
end
if client.focus.role then
mypromptbox[s].text = mypromptbox[s].text .. "Role: ".. client.focus.role
end
end
end):add()
-- Client awful tagging: this is useful to tag some clients and then do stuff like move to tag on them
keybinding({ modkey }, "t", awful.client.togglemarked):add()
for i = 1, keynumber do
keybinding({ modkey, "Shift" }, "F" .. i,
function ()
local screen = mouse.screen
if tags[screen][i] then
for k, c in pairs(awful.client.getmarked()) do
awful.client.movetotag(tags[screen][i], c)
end
end
end):add()
end
-- }}}
-- {{{ Hooks
-- Hook function to execute when focusing a client.
awful.hooks.focus.register(function (c)
if not awful.client.ismarked(c) then
c.border_color = beautiful.border_focus
end
end)
-- Hook function to execute when unfocusing a client.
awful.hooks.unfocus.register(function (c)
if not awful.client.ismarked(c) then
c.border_color = beautiful.border_normal
end
end)
-- Hook function to execute when marking a client
awful.hooks.marked.register(function (c)
c.border_color = beautiful.border_marked
end)
-- Hook function to execute when unmarking a client.
awful.hooks.unmarked.register(function (c)
c.border_color = beautiful.border_focus
end)
-- Hook function to execute when the mouse enters a client.
awful.hooks.mouse_enter.register(function (c)
-- Sloppy focus, but disabled for magnifier layout
if awful.layout.get(c.screen) ~= "magnifier"
and awful.client.focus.filter(c) then
client.focus = c
end
end)
-- Hook function to execute when a new client appears.
awful.hooks.manage.register(function (c)
if use_titlebar then
-- Add a titlebar
awful.titlebar.add(c, { modkey = modkey, height = "14" })
end
-- Add mouse bindings
c:buttons({
button({ }, 1, function (c) client.focus = c; c:raise() end),
button({ modkey }, 1, function (c) c:mouse_move() end),
button({ modkey }, 3, function (c) c:mouse_resize() end)
})
-- New client may not receive focus
-- if they're not focusable, so set border anyway.
c.border_width = beautiful.border_width
c.border_color = beautiful.border_normal
-- Check if the application should be floating.
local cls = c.class
local inst = c.instance
if floatapps[cls] then
c.floating = floatapps[cls]
elseif floatapps[inst] then
c.floating = floatapps[inst]
end
-- Check application->screen/tag mappings.
local target
if apptags[cls] then
target = apptags[cls]
elseif apptags[inst] then
target = apptags[inst]
end
if target then
c.screen = target.screen
awful.client.movetotag(tags[target.screen][target.tag], c)
end
-- Do this after tag mapping, so you don't see it on the wrong tag for a split second.
client.focus = c
-- Set the windows at the slave,
-- i.e. put it at the end of others instead of setting it master.
-- awful.client.setslave(c)
-- Honor size hints: if you want to drop the gaps between windows, set this to false.
-- c.honorsizehints = false
end)
-- Hook function to execute when arranging the screen.
-- (tag switch, new client, etc)
awful.hooks.arrange.register(function (screen)
local layout = awful.layout.get(screen)
if layout then
mylayoutbox[screen].image = image(beautiful["layout_" .. layout])
else
mylayoutbox[screen].image = nil
end
-- Give focus to the latest client in history if no window has focus
-- or if the current window is a desktop or a dock one.
if not client.focus then
local c = awful.client.focus.history.get(screen, 0)
if c then client.focus = c end
end
-- Uncomment if you want mouse warping
--[[
if client.focus then
local c_c = client.focus:fullgeometry()
local m_c = mouse.coords()
if m_c.x < c_c.x or m_c.x >= c_c.x + c_c.width or
m_c.y < c_c.y or m_c.y >= c_c.y + c_c.height then
if table.maxn(m_c.buttons) == 0 then
mouse.coords({ x = c_c.x + 5, y = c_c.y + 5})
end
end
end
]]
end)
--[[ Hook called every second
awful.hooks.timer.register(1, function ()
-- For unix time_t lovers
mytextbox.text = " " .. os.time() .. " time_t "
-- Otherwise use:
-- mytextbox.text = " " .. os.date() .. " "
end)
-- }}}
--]]
---------------------------------------------
-- by _Andrey_
--
function exec_cmd(cmd)
local ph, line
ph = io.popen(cmd)
if ph == nil then
return ""
end
line = ph:read()
io.close(ph)
return line
end
awful.hooks.timer.register(1, function ()
--local data
--data = cpu("cpu")
--myinfo.text = "| " .. data[0] .. " " .. data[1] .. " " .. data[2] .. " |"
-- myinfo.text = " | bat:" .. exec_cmd("acpitool | head -n 1 | sed 's/.*charging, //; s/.*charged, //'") .. " | "
-- myinfo.text = " | " .. exec_cmd("mpc --format \"%artist%: %title%\" | head -n 1 | gawk '{if($2==\"repeat:\" && $4==\"random:\"){print \"mpd\"; exit}; print}'") .. " | "
myinfo.text = " vol:" .. exec_cmd("ossmix vmix0-vol | gawk '{print $10*100/25\"%\"}'")
-- myinfo.text = myinfo.text .. exec_cmd("uptime | sed 's/.*: //; s/,//g'") .. " | "
myinfo.text = myinfo.text .. " ram:" .. exec_cmd("free -m | head -n 2 | tail -n 1 | gawk '{print $3 \"/\" $2}'")
-- myinfo.text = myinfo.text .. exec_cmd("/sbin/ifconfig ppp0 | gawk '/RX bytes:/ {split($2,rx,\":\");split($6,tx,\":\");print \"ppp: \"int(rx[2]/1024)\"k/\"int(tx[2]/1024)\"k\"}'") .. " |"
end)
-- Switch Touchpad ON or OFF
--function touchpad_togle()
-- exec_cmd("/usr/bin/synclient -l | grep TouchpadOff | gawk '{var=\"0\"; if($3==0)var=\"1\"; system(\"/usr/bin/synclient TouchpadOff=\"var)}'")
--end
--
-- by _Andrey_
---------------------------------------------