-- Standard awesome library
require("awful")
-- Theme handling library
require("beautiful")
-- Notification library
require("naughty")
require("tabulous")
-- Widgets library
require("wicked")
theme_path = "/home/mdm/.config/awesome/themes/dyned"
-- Actually load theme
beautiful.init(theme_path)
-- This is used later as the default terminal and editor to run.
terminal = "urxvt"
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor
-- Default modkey
modkey = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters.
layouts =
{
awful.layout.suit.tile,
awful.layout.suit.tile.bottom,
awful.layout.suit.fair,
awful.layout.suit.fair.horizontal,
awful.layout.suit.max,
awful.layout.suit.magnifier,
awful.layout.suit.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
["gimp"] = false,
["MPlayer"] = 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 },
["Iceweasel"] = { screen = 1, tag = 1 },
["Pidgin"] = { screen = 1, tag = 2 },
["Skype"] = { screen = 1, tag = 2 },
["pcmanfm"] = { screen = 1, tag = 3 },
["gpicview"] = { screen = 1, tag = 3 },
["urxvt"] = { screen = 1, tag = 4 },
["Geany"] = { screen = 1, tag = 5 },
["OpenOffice*"] = { screen = 1, tag = 5 },
["FBReader"] = { screen = 1, tag = 5 },
["gimp"] = { screen = 1, tag = 6 },
["gimp-remote"] = { screen = 1, tag = 6 },
["*"] = { screen = 1, tag = 7 },
}
-- Define if we want to use titlebar on all applications.
use_titlebar = false
tagnames = {"1:web", "2:im", "3:dir", "4:term", "Q:dev", "W:gimp", "E:oth"}
taglayouts = {
awful.layout.suit.magnifier, --web
awful.layout.suit.tile.left, --im
awful.layout.suit.tile, --dir
awful.layout.suit.fair.horizontal, --term
awful.layout.suit.magnifier, --dev
awful.layout.suit.tile.top, --gimp
awful.layout.suit.floating --other
}
tagmwfacts = {
0.5, --web
0.8, --im
0.5, --dir
0.5, --term
0.5, --dev
0.8, --gimp
0.5 --other
}
tags = {}
for s = 1, screen.count() do
tags[s] = {}
for tagnumber = 1, 7 do
tags[s][tagnumber] = tag({ name = tagnames[tagnumber]})
tags[s][tagnumber].screen = s
awful.layout.set(taglayouts[tagnumber], tags[s][tagnumber])
awful.tag.setmwfact(tagmwfacts[tagnumber], tags[s][tagnumber])
end
tags[s][1].selected = true
end
-- {{{ Wibox
-- 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 }
}
sysmenu = {
{ "Halt", "sudo halt" },
{ "Reboot", "sudo reboot" }
}
officemenu = {
{ "OOo Base", "soffice -base" },
{ "OOo Writer", "soffice -writer" },
{ "OOo Calc", "soffice -calc" },
{ "OOo Draw", "soffice -draw" },
{ "OOo From Template", "office slot:5500" },
{ "OOo Impress", "soffice -impress" },
{ "OOo Math", "soffice -math" },
{ "OOo Printer Administration", "spadmin" }
}
mymainmenu = awful.menu.new({ items = { { "Geany", "geany" },
{ "FBReader", "FBReader" },
{ "GQView", "gqview" },
{ "The GIMP", "gimp" },
{ "ALSA mixer", "xterm -e alsamixer" },
{ "FireFox", "firefox" },
{ "Pidgin", "pidgin" },
{ "Skype", "skype" },
{ "PCmanFM", "pcmanfm" },
{ "Xcalc", "xcalc" },
{ "URxvt", "urxvt" },
{ "Xterm", "xterm" },
{ "OpenTTD", "openttd" },
{ "Office", officemenu },
{ "Awesome", myawesomemenu },
{ "System", sysmenu }
}
})
-- Create a systray
mysystray = widget({ type = "systray", align = "right" })
-- Create a wibox for each screen and add it
bar = {}
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)
if not c:isvisible() then
awful.tag.viewonly(c:tags()[1])
end
client.focus = c
c:raise()
end),
button({ }, 3, function () if instance then instance:hide() end instance = 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", fg = "beautiful.fg_focus" })
-- 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" })
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)
--RAM usage widget
memwidget = widget({
type = 'textbox',
name = 'memwidget',
align = "right"
})
wicked.register(memwidget, wicked.widgets.mem, ' M:<span color="#cccccc">$1%</span> ')
--CPU usage widget
cpuwidget = widget({
type = 'textbox',
name = 'cpuwidget',
align = "right"
})
wicked.register(cpuwidget, wicked.widgets.cpu, ' C:<span color="#cccccc">$1%</span> ')
--Filesystem usage wigdet
fswidget = widget({
type = 'textbox',
name = 'fswidget',
align = 'right'
})
wicked.register(fswidget, wicked.widgets.fs, '/: ${/ used}/${/ size} (<span color="#cccccc">${/ usep}%</span>) | /home: ${/home used}/${/home size} (<span color="#cccccc">${/home usep}%</span>)', 120)
--Network interface monitor widget
netwidget = widget({
type = 'textbox',
name = 'netwidget',
align = 'right'
})
wicked.register(netwidget, wicked.widgets.net, 'NET: <span color="#cccccc">${eth1 rx}</span>/<span color="#cccccc">${eth1 tx}</span>',nil, nil, 3)
-- Date widget
datewidget = widget({ type = 'textbox', name = 'datewidget', align = 'right'})
wicked.register(datewidget, wicked.widgets.date,' <span color="#909090">%d.%m <span color="#cccccc">%H:%M</span> %a</span>')
-- Battery widget
batwidget = widget({ type = 'textbox', name = 'batwidget'})
function run_script()
local pc = io.popen('bat_prec')
local p = pc:read()
pc:close()
local sc = io.popen('bat_state')
local s = sc:read()
sc:close()
return {p,s}
end
wicked.register(batwidget, run_script, " $2:<span color='#cccccc'>$1\%</span> ", 60)
-- Spacer widget
spacer = widget({ type = "textbox", name = "spacer", align = "right" })
spacer.text = (" | ")
spacer1 = widget({ type = "textbox", name = "spacer1",align = "right" })
spacer1.text = (" ")
spacer2 = widget({ type = "textbox", name = "spacer2",align = "right" })
spacer2.text = (" ")
-- Create the wibox
mywibox[s] = wibox({ position = "top", height = 16, fg = beautiful.fg_normal, bg = beautiful.bg_normal })
-- Add widgets to the wibox - order matters
mywibox[s].widgets = { mytaglist[s],
mylayoutbox[s],
mypromptbox[s],
batwidget,
mytasklist[s],
spacer1,
cpuwidget,
memwidget,
datewidget,
spacer1,
mysystray
}
mywibox[s].screen = s
end
-- }}}
-- {{{ Mouse bindings
root.buttons({
button({ }, 3, function () mymainmenu:toggle() end),
button({ }, 4, awful.tag.viewnext),
button({ }, 5, awful.tag.viewprev)
})
-- }}}
-- {{{ Key bindings
globalkeys =
{
key({ modkey, }, "Left", awful.tag.viewprev ),
key({ modkey, }, "Right", awful.tag.viewnext ),
key({ modkey, }, "Escape", awful.tag.history.restore),
key({ modkey, }, "j",
function ()
awful.client.focus.byidx( 1)
if client.focus then client.focus:raise() end
end),
key({ modkey, }, "k",
function ()
awful.client.focus.byidx(-1)
if client.focus then client.focus:raise() end
end),
-- Layout manipulation
key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end),
key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end),
key({ modkey, "Control" }, "j", function () awful.screen.focus( 1) end),
key({ modkey, "Control" }, "k", function () awful.screen.focus(-1) end),
key({ modkey, }, "u", awful.client.urgent.jumpto),
key({ modkey, }, "Tab",
function ()
awful.client.focus.history.previous()
if client.focus then
client.focus:raise()
end
end),
-- Standard program
key({ "Mod1", "Control" }, "r", awesome.restart),
key({ "Mod1", "Control" }, "q", awesome.quit),
key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end),
key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end),
key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end),
key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end),
key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end),
key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end),
key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end),
key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end),
-- Prompt
key({ modkey }, "F1",
function ()
awful.prompt.run({ prompt = " Run: " },
mypromptbox[mouse.screen],
awful.util.spawn, awful.completion.bash,
awful.util.getdir("cache") .. "/history")
end),
key({ 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),
}
-- Client awful tagging: this is useful to tag some clients and then do stuff like move to tag on them
clientkeys =
{
key({ modkey, "Shift" }, "c", function (c) c:kill() end),
key({ modkey, "Control" }, "space", awful.client.floating.toggle ),
key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end),
key({ modkey, }, "o", awful.client.movetoscreen ),
key({ modkey, "Shift" }, "r", function (c) c:redraw() end),
key({ modkey }, "t", awful.client.togglemarked),
key({ modkey,}, "m",
function (c)
c.maximized_horizontal = not c.maximized_horizontal
c.maximized_vertical = not c.maximized_vertical
end),
}
-- 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
tagkeys = {"1","2","3","4","q","w","e","r"}
for i = 1, keynumber do
table.insert(globalkeys,
key({ modkey }, tagkeys[i],
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
end
end))
table.insert(globalkeys,
key({ modkey, "Control" }, tagkeys[i],
function ()
local screen = mouse.screen
if tags[screen][i] then
tags[screen][i].selected = not tags[screen][i].selected
end
end))
table.insert(globalkeys,
key({ modkey, "Shift" }, tagkeys[i],
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.movetotag(tags[client.focus.screen][i])
end
end))
table.insert(globalkeys,
key({ modkey, "Control", "Shift" }, tagkeys[i],
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.toggletag(tags[client.focus.screen][i])
end
end))
end
for i = 1, keynumber do
table.insert(globalkeys, key({ modkey, "Shift" }, "F" .. tagkeys[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))
end
-- Set keys
root.keys(globalkeys)
-- }}}
-- {{{ 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) ~= awful.layout.suit.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, startup)
-- If we are not managing this application at startup,
-- move it to the screen where the mouse is.
-- We only do it for filtered windows (i.e. no dock, etc).
if not startup and awful.client.focus.filter(c) then
c.screen = mouse.screen
end
if use_titlebar then
-- Add a titlebar
awful.titlebar.add(c, { modkey = modkey })
end
-- Add mouse bindings
c:buttons({
button({ }, 1, function (c) client.focus = c; c:raise() end),
button({ modkey }, 1, awful.mouse.client.move),
button({ modkey }, 3, awful.mouse.client.resize)
})
-- 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
awful.client.floating.set(c, floatapps[cls])
elseif floatapps[inst] then
awful.client.floating.set(c, 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 key bindings
c:keys(clientkeys)
-- 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.size_hints_honor = false
end)
-- Hook function to execute when arranging the screen.
-- c.honorsizehints = false
-- (tag switch, new client, etc)
awful.hooks.arrange.register(function (screen)
local layout = awful.layout.getname(awful.layout.get(screen))
if layout and beautiful["layout_" ..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
end)
Add a code snippet to your website: www.paste.org