]> git.madduck.net Git - etc/awesome.git/blob - .config/awesome/rc.lua

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

replace ICON_PATH placeholders with DATADIR
[etc/awesome.git] / .config / awesome / rc.lua
1 -- awesome 3 configuration file
2
3 AWESOME_DATADIR = "/home/madduck/code/awesome"
4 package.path = AWESOME_DATADIR .. "/lib/?.lua;" .. package.path
5
6 -- Include awesome library, with lots of useful function!
7 require("awful")
8 require("tabulous")
9
10 -- Uncomment this to activate autotabbing
11 -- tabulous.autotab_start()
12
13 -- {{{ Variable definitions
14 -- This is used later as the default terminal to run.
15 terminal = "x-terminal-emulator"
16
17 -- Default modkey.
18 -- Usually, Mod4 is the key with a logo between Control and Alt.
19 -- If you do not like this or do not have such a key,
20 -- I suggest you to remap Mod4 to another key using xmodmap or other tools.
21 -- However, you can use another modifier like Mod1, but it may interact with others.
22 modkey = "Mod4"
23
24 -- Table of layouts to cover with awful.layout.inc, order matters.
25 layouts =
26 {
27     "tile",
28     "tileleft",
29     "tilebottom",
30     "tiletop",
31     "magnifier",
32     "max",
33     "spiral",
34     "dwindle",
35     "floating"
36 }
37
38 -- Table of clients that should be set floating
39 floatings =
40 {
41     ["mplayer"] = true,
42     ["pinentry"] = true,
43     ["GIMP"] = true,
44     ["twinkle"] = true,
45     ["Add-ons"] = true,
46     ["Play stream"] = true
47 }
48
49 -- Color & Appearance definitions, we use these later to display things
50 font = "RotisSansSerif 10"
51 border_width = 1
52
53 bg_normal = "#222222"
54 fg_normal = "#aaaaaa"
55 border_normal = "#000000"
56
57 bg_focus = "#535d6c"
58 fg_focus = "#ffffff"
59 border_focus = bg_focus
60 border_marked = "#91231C"
61
62 awesome.font_set(font)
63 awesome.colors_set({ fg = fg_normal, bg = bg_normal })
64
65 -- }}}
66
67 -- {{{ Tags
68 -- Define tags table
69 tags = {}
70 for s = 1, screen.count() do
71     -- Each screen has its own tag table
72     tags[s] = {}
73     -- Create 9 tags per screen
74     for tagnumber = 1, 9 do
75         tags[s][tagnumber] = tag({ name = tagnumber, layout = layouts[1] })
76         -- Add tags to screen one by one
77         -- split at 0.5/50% exactly
78         tags[s][tagnumber].mwfact = 0.5
79         tags[s][tagnumber]:add(s)
80     end
81     -- I'm sure you want to see at least one tag.
82     tags[s][1].selected = true
83 end
84 -- }}}
85
86 -- {{{ Statusbar
87 -- Create a taglist widget
88 mytaglist = widget({ type = "taglist", name = "mytaglist" })
89 mytaglist:mouse_add(mouse({}, 1, function (object, tag) awful.tag.viewonly(tag) end))
90 mytaglist:mouse_add(mouse({ modkey }, 1, function (object, tag) awful.client.movetotag(tag) end))
91 mytaglist:mouse_add(mouse({}, 3, function (object, tag) tag.selected = not tag.selected end))
92 mytaglist:mouse_add(mouse({ modkey }, 3, function (object, tag) awful.client.toggletag(tag) end))
93 mytaglist:mouse_add(mouse({ }, 4, awful.tag.viewnext))
94 mytaglist:mouse_add(mouse({ }, 5, awful.tag.viewprev))
95 function mytaglist.label(t)
96     local text = ""
97     if t.selected then
98         text = "<bg color='"..bg_focus.."'/> <span color='"..fg_focus.."'>"..t.name.."</span> "
99     else
100         text = " "..t.name.." "
101     end
102     return text
103 end
104
105 -- Create a tasklist widget
106 mytasklist = widget({ type = "tasklist", name = "mytasklist" })
107 mytasklist:mouse_add(mouse({ }, 1, function (object, c) c:focus_set(); c:raise() end))
108 mytasklist:mouse_add(mouse({ }, 4, function () awful.client.focus(1) end))
109 mytasklist:mouse_add(mouse({ }, 5, function () awful.client.focus(-1) end))
110 function mytasklist.label(c)
111     local text = ""
112     if c.floating then
113         text = "<bg image=\"" .. AWESOME_DATADIR .. "/icons/floatingw.png\" align=\"right\"/>"
114     end
115     if client.focus_get() == c then
116         text = text .. " <bg color='"..bg_focus.."'/><span color='"..awful.escape(fg_focus).."'>"..c.name.."</span> "
117     else
118         text = text .. " "..awful.escape(c.name).." "
119     end
120     return text
121 end
122
123 -- Create a textbox widget
124 mytextbox = widget({ type = "textbox", name = "mytextbox", align = "right" })
125 -- Set the default text in textbox
126 mytextbox.text = "<b><small> awesome " .. AWESOME_VERSION .. " </small></b>"
127 mypromptbox = widget({ type = "textbox", name = "mypromptbox", align = "left" })
128
129 -- Create an iconbox widget
130 myiconbox = widget({ type = "textbox", name = "myiconbox", align = "left" })
131 myiconbox.text = "<bg image=\"" .. AWESOME_DATADIR .. "/icons/awesome16.png\" resize=\"true\"/>"
132
133 -- Create a systray
134 mysystray = widget({ type = "systray", name = "mysystray", align = "right" })
135
136 -- Create an iconbox widget which will contains an icon indicating which layout we're using.
137 -- We need one layoutbox per screen.
138 mylayoutbox = {}
139 for s = 1, screen.count() do
140     mylayoutbox[s] = widget({ type = "textbox", name = "mylayoutbox", align = "right" })
141     mylayoutbox[s]:mouse_add(mouse({ }, 1, function () awful.layout.inc(layouts, 1) end))
142     mylayoutbox[s]:mouse_add(mouse({ }, 3, function () awful.layout.inc(layouts, -1) end))
143     mylayoutbox[s]:mouse_add(mouse({ }, 4, function () awful.layout.inc(layouts, 1) end))
144     mylayoutbox[s]:mouse_add(mouse({ }, 5, function () awful.layout.inc(layouts, -1) end))
145     mylayoutbox[s].text = "<bg image=\"" .. AWESOME_DATADIR .. "/layouts/tilew.png\" resize=\"true\"/>"
146 end
147
148 -- Create a statusbar for each screen and add it
149 mystatusbar = {}
150 for s = 1, screen.count() do
151     mystatusbar[s] = statusbar({ position = "top", name = "mystatusbar" .. s,
152                                    fg = fg_normal, bg = bg_normal })
153     -- Add widgets to the statusbar - order matters
154     mystatusbar[s]:widget_add(mytaglist)
155     mystatusbar[s]:widget_add(mytasklist)
156     mystatusbar[s]:widget_add(mypromptbox)
157     mystatusbar[s]:widget_add(mytextbox)
158     mystatusbar[s]:widget_add(mylayoutbox[s])
159     mystatusbar[s]:add(s)
160 end
161 mystatusbar[screen.count()]:widget_add(mysystray)
162 -- }}}
163
164 -- {{{ Mouse bindings
165 awesome.mouse_add(mouse({ }, 3, function () awful.spawn(terminal) end))
166 awesome.mouse_add(mouse({ }, 4, awful.tag.viewnext))
167 awesome.mouse_add(mouse({ }, 5, awful.tag.viewprev))
168 -- }}}
169
170 -- {{{ Key bindings
171
172 -- Bind keyboard digits
173 -- Compute the maximum number of digit we need, limited to 9
174 keynumber = 0
175 for s = 1, screen.count() do
176    keynumber = math.min(9, math.max(#tags[s], keynumber));
177 end
178
179 for i = 1, keynumber do
180     keybinding({ modkey }, i,
181                    function ()
182                        local screen = mouse.screen
183                        if tags[screen][i] then
184                            awful.tag.viewonly(tags[screen][i])
185                        end
186                    end):add()
187     keybinding({ modkey, "Control" }, i,
188                    function ()
189                        local screen = mouse.screen
190                        if tags[screen][i] then
191                            tags[screen][i].selected = not tags[screen][i].selected
192                        end
193                    end):add()
194     keybinding({ modkey, "Shift" }, i,
195                    function ()
196                        local screen = mouse.screen
197                        if tags[screen][i] then
198                            awful.client.movetotag(tags[screen][i])
199                        end
200                    end):add()
201     keybinding({ modkey, "Control", "Shift" }, i,
202                    function ()
203                        local screen = mouse.screen
204                        if tags[screen][i] then
205                            awful.client.toggletag(tags[screen][i])
206                        end
207                    end):add()
208 end
209
210 keybinding({ modkey }, "Left", awful.tag.viewprev):add()
211 keybinding({ modkey }, "Right", awful.tag.viewnext):add()
212
213 -- Standard program
214 keybinding({ modkey }, "Return", function () awful.spawn(terminal) end):add()
215
216 keybinding({ modkey, "Control" }, "r", awesome.restart):add()
217 keybinding({ modkey, "Shift" }, "q", awesome.quit):add()
218
219 -- Client manipulation
220 keybinding({ modkey, "Shift" }, "c", function () client.focus_get():kill() end):add()
221 keybinding({ modkey }, "j", function () awful.client.focus(1); client.focus_get():raise() end):add()
222 keybinding({ modkey }, "k", function () awful.client.focus(-1);  client.focus_get():raise() end):add()
223 keybinding({ modkey, "Shift" }, "j", function () awful.client.swap(1) end):add()
224 keybinding({ modkey, "Shift" }, "k", function () awful.client.swap(-1) end):add()
225 keybinding({ modkey, "Control" }, "j", function () awful.screen.focus(1) end):add()
226 keybinding({ modkey, "Control" }, "k", function () awful.screen.focus(-1) end):add()
227 keybinding({ modkey, "Control" }, "space", awful.client.togglefloating):add()
228 keybinding({ modkey, "Control" }, "Return", function () client.focus_get():swap(awful.client.master()) end):add()
229 keybinding({ modkey }, "o", awful.client.movetoscreen):add()
230
231 -- Layout manipulation
232 keybinding({ modkey }, "l", function () awful.tag.incmwfact(0.05) end):add()
233 keybinding({ modkey }, "h", function () awful.tag.incmwfact(-0.05) end):add()
234 keybinding({ modkey, "Shift" }, "h", function () awful.tag.incnmaster(1) end):add()
235 keybinding({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end):add()
236 keybinding({ modkey, "Control" }, "h", function () awful.tag.incncol(1) end):add()
237 keybinding({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end):add()
238 keybinding({ modkey }, "space", function () awful.layout.inc(layouts, 1) end):add()
239 keybinding({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end):add()
240
241 -- Prompt
242 keybinding({ modkey }, "F1", function ()
243                                      awful.prompt({ prompt = "Run: ", cursor_fg = fg_focus, cursor_bg = bg_focus }, mypromptbox, awful.spawn, awful.completion.bash)
244                                  end):add()
245 keybinding({ modkey }, "F4", function ()
246                                      awful.prompt({ prompt = "Run Lua code: ", cursor_fg = fg_focus, cursor_bg = bg_focus }, mypromptbox, awful.eval, awful.prompt.bash)
247                                  end):add()
248
249 --- Tabulous, tab manipulation
250 keybinding({ modkey, "Control" }, "y", function ()
251     local tabbedview = tabulous.tabindex_get()
252     local nextclient = awful.client.next(1)
253
254     if tabbedview == nil then
255         tabbedview = tabulous.tabindex_get(nextclient)
256
257         if tabbedview == nil then
258             tabbedview = tabulous.tab_create()
259             tabulous.tab(tabbedview, nextclient)
260         else
261             tabulous.tab(tabbedview, client.focus_get())
262         end
263     else
264         tabulous.tab(tabbedview, nextclient)
265     end
266 end):add()
267
268 keybinding({ modkey, "Shift" }, "y", tabulous.untab):add()
269
270 keybinding({ modkey }, "y", function ()
271    local tabbedview = tabulous.tabindex_get()
272
273    if tabbedview ~= nil then
274        local n = tabulous.next(tabbedview)
275        tabulous.display(tabbedview, n)
276    end
277 end):add()
278
279 -- Client awful tagging: this is useful to tag some clients and then do stuff like move to tag on them
280 keybinding({ modkey }, "t", awful.client.togglemarked):add()
281 keybinding({ modkey, 'Shift' }, "t", function ()
282     local tabbedview = tabulous.tabindex_get()
283     local clients = awful.client.getmarked()
284
285     if tabbedview == nil then
286         tabbedview = tabulous.tab_create(clients[1])
287         table.remove(clients, 1)
288     end
289
290     for k,c in pairs(clients) do
291         tabulous.tab(tabbedview, c)
292     end
293
294 end):add()
295
296 for i = 1, keynumber do
297     keybinding({ modkey, "Shift" }, "F" .. i,
298                    function ()
299                        local screen = mouse.screen
300                        if tags[screen][i] then
301                            for k, c in pairs(awful.client.getmarked()) do
302                                awful.client.movetotag(tags[screen][i], c)
303                            end
304                        end
305                    end):add()
306 end
307 -- }}}
308
309 -- {{{ Hooks
310 -- Hook function to execute when focusing a client.
311 function hook_focus(c)
312     if not awful.client.ismarked(c) then
313         c.border_color = border_focus
314     end
315 end
316
317 -- Hook function to execute when unfocusing a client.
318 function hook_unfocus(c)
319     if not awful.client.ismarked(c) then
320         c.border_color = border_normal
321     end
322 end
323
324 -- Hook function to execute when marking a client
325 function hook_marked(c)
326     c.border_color = border_marked
327 end
328
329 -- Hook function to execute when unmarking a client
330 function hook_unmarked(c)
331     c.border_color = border_focus
332 end
333
334 -- Hook function to execute when the mouse is over a client.
335 function hook_mouseover(c)
336     -- Sloppy focus, but disabled for magnifier layout
337     if awful.layout.get(c.screen) ~= "magnifier" then
338         c:focus_set()
339     end
340 end
341
342 -- Hook function to execute when a new client appears.
343 function hook_manage(c)
344     -- Add mouse bindings
345     c:mouse_add(mouse({ }, 1, function (c) c:focus_set(); c:raise() end))
346     c:mouse_add(mouse({ modkey }, 1, function (c) c:mouse_move() end))
347     c:mouse_add(mouse({ modkey }, 3, function (c) c:mouse_resize() end))
348     -- New client may not receive focus
349     -- if they're not focusable, so set border anyway.
350     c.border_width = border_width
351     c.border_color = border_normal
352     c:focus_set()
353     if floatings[c.name:lower()] then
354         c.floating = true
355     end
356     -- Honor size hints
357     c.honorsizehints = true
358 end
359
360 -- Hook function to execute when arranging the screen
361 -- (tag switch, new client, etc)
362 function hook_arrange(screen)
363     local layout = awful.layout.get(screen)
364     mylayoutbox[screen].text = "<bg image=\"" .. AWESOME_DATADIR .. "/icons/layouts/" .. layout .. "w.png\" resize=\"true\"/>"
365
366     -- Uncomment if you want mouse warping
367     --[[
368     local sel = client.focus_get()
369     if sel then
370         local c_c = sel.coords
371         local m_c = mouse.coords
372
373         if m_c.x < c_c.x or m_c.x >= c_c.x + c_c.width or
374             m_c.y < c_c.y or m_c.y >= c_c.y + c_c.height then
375             if table.maxn(m_c.buttons) == 0 then
376                 mouse.coords = { x = c_c.x + 5, y = c_c.y + 5}
377             end
378         end
379     end
380     ]]
381 end
382
383 -- Hook called every second
384 function hook_timer ()
385     -- For unix time_t lovers
386     -- mytextbox.text = " " .. os.time() .. " time_t "
387     -- Otherwise use:
388     mytextbox.text = " " .. os.date() .. " "
389 end
390
391 -- Set up some hooks
392 awful.hooks.focus(hook_focus)
393 awful.hooks.unfocus(hook_unfocus)
394 awful.hooks.marked(hook_marked)
395 awful.hooks.unmarked(hook_unmarked)
396 awful.hooks.manage(hook_manage)
397 awful.hooks.mouseover(hook_mouseover)
398 awful.hooks.arrange(hook_arrange)
399 awful.hooks.timer(1, hook_timer)
400 -- }}}
401
402 cmdmodkey = "Mod3"
403
404 -- xmms2 & sound
405 keybinding({ cmdmodkey }, "Prior", function () awful.spawn("amixer set Master 2+") end):add()
406 keybinding({ cmdmodkey }, "Next", function () awful.spawn("amixer set Master 2-") end):add()
407 keybinding({ cmdmodkey }, "Up", function () awful.spawn("amixer set PCM 2+") end):add()
408 keybinding({ cmdmodkey }, "Down", function () awful.spawn("amixer set PCM 2-") end):add()
409 keybinding({ cmdmodkey }, "Home", function () awful.spawn("amixer set Mic toggle") end):add()
410 keybinding({ cmdmodkey }, "End", function () awful.spawn("amixer set Master toggle") end):add()
411 keybinding({ cmdmodkey }, "Left", function () awful.spawn("xmms2 prev") end):add()
412 keybinding({ cmdmodkey }, "Right", function () awful.spawn("xmms2 next") end):add()
413 keybinding({ cmdmodkey }, "space", function () awful.spawn("xmms2 toggleplay") end):add()
414 keybinding({ cmdmodkey }, "backslash", function () awful.spawn("xmms2 current | head -1 | xmessage -nearmouse -timeout 5 -file -") end):add()
415 keybinding({ cmdmodkey, "Shift" }, "backslash", function () awful.spawn("xmms2 list | xmessage -nearmouse -timeout 5 -file -") end):add()
416
417 -- misc apps
418 keybinding({ cmdmodkey }, "n", function () awful.spawn("sensible-browser") end):add()
419 keybinding({ cmdmodkey }, "m", function () awful.spawn(terminal .. " -e mutt -f =store") end):add()
420 keybinding({ cmdmodkey }, "t", function () awful.spawn(terminal) end):add()
421 keybinding({ cmdmodkey }, "c", function () awful.spawn(terminal .. " -e python") end):add()
422 keybinding({ cmdmodkey }, "r", function () awful.spawn("gmrun") end):add()
423 keybinding({ cmdmodkey }, "j", function () awful.spawn("jpilot") end):add()
424 keybinding({ cmdmodkey }, "x", function () awful.spawn("/sbin/start-stop-daemon --start --background --exec /usr/bin/xscreensaver; xscreensaver-command -lock") end):add()
425 keybinding({ cmdmodkey, "Shift" }, "x", function () awful.spawn("xscreensaver-command -exit") end):add()