1 -- awesome 3 configuration file
3 -- Include awesome library, with lots of useful function!
5 require("awful.autofocus")
10 terminal = "x-terminal-emulator"
11 lock = 'xscreensaver-command -lock'
12 beautiful.init(awful.util.getdir("config").."/theme")
22 k_ms = {modkey, shift}
24 k_mc = {modkey, control}
25 k_mcs = {modkey, control, shift}
29 k_cs = {control, shift}
33 -- {{{ Markup helper functions
34 -- Inline markup is a tad ugly, so use these functions
35 -- to dynamically create markup.
36 function fg(color, text)
37 return '<span color="'..color..'">'..text..'</span>'
45 for s = 1, screen.count() do
46 -- Each screen has its own tag table.
49 table.insert(p, "work-"..i)
51 tags[s] = awful.tag(p, s, awful.layout.suit.tile)
54 -- Get the screen number we're on
56 function mtag.getn(idx, s)
57 return tags[s or mouse.screen][idx]
59 function mtag.viewonly (idx, s)
60 local t = mtag.getn(idx, s)
61 if t then awful.tag.viewonly(t) end
63 function mtag.viewtoggle (idx, s)
64 local t = mtag.getn(idx, s)
65 if t then awful.tag.viewtoggle(t) end
67 function mtag.isoccupied(s, t)
68 local clients = (t and t:clients()) or {}
71 function mtag.occupied(s)
74 if not s then s = mouse.screen end
75 for t in pairs(tags[s]) do
77 if mtag.isoccupied(s, t) then table.insert(p, t) end
81 function mtag.getnext(s)
82 if s == nil then s = mouse.screen end
84 local p = mtag.occupied(s)
85 local curtag = awful.tag.selected()
90 if mtag.isoccupied(s, curtag) then
92 if curtag == p[x] then t = x end
99 for x in pairs(tags[s]) do
100 if curtag == tags[s][x] then o = x end
101 if mtag.isoccupied(s, tags[s][x]) then lasto = x end
104 -- Now: t is # in non-empty, o is # in all
105 if o == table.maxn(tags[s]) then
106 -- We're the last tag, create a new one
108 -- We're empty, go to first
111 -- We're occupied, create new
116 -- We're empty, check if we're last
118 -- We're also later than the last non-empty
122 -- Nevermind, get the next
131 function mtag.next(s)
132 awful.tag.viewonly(mtag.getnext(s))
134 function mtag.movetonext(s)
135 local t = mtag.getnext(s)
136 awful.client.movetotag(t)
137 awful.tag.viewonly(t)
139 function mtag.getprev(s)
140 if s == nil then s = mouse.screen end
142 local p = mtag.occupied(s)
143 local curtag = awful.tag.selected()
148 if mtag.isoccupied(s, curtag) then
150 if curtag == p[x] then t = x end
157 for x in pairs(tags[s]) do
158 if curtag == tags[s][x] then o = x end
159 if mtag.isoccupied(s, tags[s][x]) then lasto = x end
162 -- Now: t is # in non-empty, o is # in all
164 -- We're the very first tag, wrap around
165 return p[ table.maxn(p) ]
167 -- We're not first, just go prev
171 function mtag.prev(s)
172 awful.tag.viewonly(mtag.getprev(s))
174 function mtag.movetoprev(s)
175 local t = mtag.getprev(s)
176 awful.client.movetotag(t)
177 awful.tag.viewonly(t)
184 local icondir = awful.util.getdir("config").."/icons/"
186 function make_icon(fname, left, right, h, bg)
187 local icon = image(icondir..fname)
188 local ib = widget { type = 'imagebox' }
189 local w = left + icon.width + right
190 local i = image.argb32(w, h, nil)
192 i:draw_rectangle(0, 0, w, h, true, beautiful.bg_normal)
193 i:insert(icon, left, math.floor((h - icon.height) / 2))
204 maintaglist.buttons = awful.util.table.join(
205 awful.button(k_n, 1, awful.tag.viewonly),
206 awful.button(k_s, 1, awful.client.toggletag)
208 maintaglist.label = awful.widget.taglist.label.noempty
213 mypromptbox = awful.widget.prompt{
214 layout = awful.widget.layout.horizontal.leftright
220 table.insert(mywidgets, make_icon('cpu.png', 16, 4, 16))
222 cputextwidget = widget({ type = 'textbox' })
224 vicious.register(cputextwidget, vicious.widgets.cpu,
225 function (widget, args)
226 local r = tonumber(args[1])
227 local percent = args[1]..'%'
229 percent = '0'..percent
232 percent = fg(theme.fg_focus, percent)
234 percent = fg('yellow', percent)
236 percent = fg('orange', percent)
238 percent = fg('#ff4040', percent)
243 table.insert(mywidgets, cputextwidget)
246 -- {{{ Memory Usage Widget
248 table.insert(mywidgets, make_icon('mem.png', 16, 4, 16))
250 memtextwidget = widget({ type = 'textbox' })
252 vicious.register(memtextwidget, vicious.widgets.mem, function (widget, args)
253 -- Add extra preceding zeroes when needed
254 local r = tonumber(args[1])
255 local percent = args[1]..'%'
257 percent = '0'..percent
260 percent = fg(theme.fg_focus, percent)
262 percent = fg('orange', percent)
264 percent = fg('red', percent)
266 return percent..' '..args[2]..'M'
269 table.insert(mywidgets, memtextwidget)
274 table.insert(mywidgets, make_icon('clock.png', 16, 4, 16))
276 clockwidget = widget({ type = "textbox" })
277 vicious.register(clockwidget, vicious.widgets.date,
278 fg(theme.fg_focus, "%H:%M") .. " %a %d %b ", 10)
280 table.insert(mywidgets, clockwidget)
285 for s = 1, screen.count() do
288 awful.widget.taglist(s, maintaglist.label, maintaglist.buttons),
290 layout = awful.widget.layout.horizontal.leftright
295 table.insert(tab, widget{ type = 'systray' })
297 for i = #mywidgets, 1, -1 do
298 table.insert(tab, mywidgets[i])
300 tab["layout"] = awful.widget.layout.horizontal.rightleft
301 awful.wibox{ position = "top", height = 16, screen = s }.widgets = tab
309 globalkeys = awful.util.table.join(
310 -- Mod+{A/S}: Switch to prev/next tag
311 awful.key(k_m, "Left", mtag.prev),
312 awful.key(k_m, "Right", mtag.next),
314 -- Mod+Shift+{A/S}: Move window to Prev/Next tag
315 awful.key(k_ms, "Left", mtag.movetoprev),
316 awful.key(k_ms, "Right", mtag.movetonext),
318 -- Mod+Shift_{E/D}: move window to next/prev screen
319 awful.key(k_mc, "Right", function()
320 client.focus.screen = awful.util.cycle(screen.count(), mouse.screen + 1)
322 awful.key(k_mc, "Left", function()
323 client.focus.screen = awful.util.cycle(screen.count(), mouse.screen - 1)
327 -- Focus Prev/Next window
330 awful.client.focus.byidx(1)
331 if client.focus then client.focus:raise() end
335 awful.client.focus.byidx(-1)
336 if client.focus then client.focus:raise() end
339 -- Swap window with the Prev/Next one
340 awful.key(k_ms, "j", function () awful.client.swap.byidx(1) end),
341 awful.key(k_ms, "k", function () awful.client.swap.byidx(-1) end),
343 -- Mod+{E/D}: Switch to next/previous screen
344 awful.key(k_m, "Tab", function () awful.screen.focus_relative(1) end),
345 awful.key(k_ms, "Tab", function () awful.screen.focus_relative(-1) end),
347 -- Mod+Enter: Launch a new terminal
348 awful.key(k_m, "e", function() awful.util.spawn("firefox") end),
349 awful.key(k_m, "Return", function() awful.util.spawn(terminal) end),
350 awful.key(k_ac, "r", awesome.restart),
351 awful.key(k_m, "F12", function() awful.util.spawn(lock) end),
352 awful.key({}, "#148", function() awful.util.spawn("kcalc") end),
354 -- Layout manipulation
355 awful.key(k_m, "l", function () awful.tag.incmwfact(0.05) end),
356 awful.key(k_m, "h", function () awful.tag.incmwfact(-0.05) end),
357 awful.key(k_ms, "h", function () awful.tag.incnmaster(1) end),
358 awful.key(k_ms, "l", function () awful.tag.incnmaster(-1) end),
359 awful.key(k_mc, "h", function () awful.tag.incncol(1) end),
360 awful.key(k_mc, "l", function () awful.tag.incncol(-1) end),
363 awful.key(k_m, "r", function () mypromptbox:run() end),
366 awful.prompt.run({ prompt = "Run Lua code: " },
368 awful.util.eval, nil,
369 awful.util.getdir("cache").."/lua_commands")
372 awful.key({}, "#192", function() mtag.viewonly(1) end),
373 awful.key({}, "#193", function() mtag.viewonly(2) end),
374 awful.key({}, "#194", function() mtag.viewonly(3) end),
375 awful.key({}, "#195", function() mtag.viewonly(4) end),
376 awful.key({}, "#196", function() mtag.viewonly(5) end)
379 -- Mod+#: Switch to tag
380 -- Mod+Shift+#: Toggle tag display
381 -- Mod+Control+#: Move client to tag
382 -- Mod+Alt+#: Toggle client on tag
385 globalkeys = awful.util.table.join(
387 awful.key(k_m, i % 10, function() mtag.viewonly(i) end),
388 awful.key(k_ms, i % 10, function() mtag.viewtoggle(i) end),
389 awful.key(k_mc, i % 10,
391 if client.focus and tags[client.focus.screen][i] then
392 awful.client.movetotag(tags[client.focus.screen][i])
395 awful.key(k_mcs, i % 10,
397 if client.focus and tags[client.focus.screen][i] then
398 awful.client.toggletag(tags[client.focus.screen][i])
405 ---- {{{ Client hotkeys / buttons
407 local clientkeys = awful.util.table.join(
408 awful.key(k_m, "i", function (c)
409 if mypromptbox.widget.text then
410 mypromptbox.widget.text = ""
412 mypromptbox.widget.text = "Class: " .. c.class .. " Instance: ".. c.instance
416 -- Client manipulation
417 awful.key(k_m, "c", function (c) c:kill() end),
418 awful.key(k_m, "o", awful.client.floating.toggle),
419 awful.key(k_m, "F11", function (c) c.fullscreen = not c.fullscreen end)
422 local clientbuttons = awful.util.table.join(
423 awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
424 awful.button(k_a, 1, awful.mouse.client.move),
425 awful.button(k_a, 3, awful.mouse.client.resize)
430 root.keys(globalkeys)
434 awful.rules.rules = {
435 -- All clients will match this rule.
439 border_width = beautiful.border_width,
440 border_color = beautiful.border_normal,
443 buttons = clientbuttons,
444 size_hints_honor = false,
447 { rule = { class = "MPlayer" }, properties = { floating = true } },
448 { rule = { class = "pinentry" }, properties = { floating = true } },
449 -- Set Firefox to always map on tags number 2 of screen 1.
450 -- { rule = { class = "Firefox" },
451 -- properties = { tag = tags[1][2] } },
457 function warp_mouse(c)
458 local o = awful.mouse.client_under_pointer()
459 if not o or o ~= c then
460 local g = c:geometry()
461 mouse.coords({ x = g.x + 5, y = g.y + 5 }, true)
465 client.add_signal("focus", function (c)
466 if not awful.client.ismarked(c) then
467 c.border_color = beautiful.border_focus
472 client.add_signal("unfocus", function (c)
473 if not awful.client.ismarked(c) then
474 c.border_color = beautiful.border_normal
478 client.add_signal("manage", function (c, startup)
479 c:add_signal("mouse::enter", function(c) client.focus = c end)
482 for s = 1, screen.count() do
483 screen[s]:add_signal("arrange", function ()
484 if client.focus and client.focus.screen == s then
485 warp_mouse(client.focus)
492 awful.util.spawn("xkbcomp -w 0 -R/usr/share/X11/xkb /home/madcoder/.Xkeyboard :0")
493 awful.util.spawn("xsetroot -cursor_name left_ptr")