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:

screen swapping keymappings fixed
[etc/awesome.git] / .config / awesome / rc.lua
1 -- Standard awesome library
2 require("awful")
3 require("awful.autofocus")
4 require("awful.rules")
5 -- Theme handling library
6 require("beautiful")
7 -- Notification library
8 require("naughty")
9
10 --require("vicious")
11
12 require("obvious.battery")
13 require("obvious.clock")
14
15 --require("bashets.bashets")
16
17 -- Load Debian menu entries
18 require("debian.menu")
19
20 -- {{{ Variable definitions
21 -- Themes define colours, icons, and wallpapers
22 -- The default is a dark theme
23 theme_path = "/usr/share/awesome/themes/default/theme.lua"
24 -- Uncommment this for a lighter theme
25 -- theme_path = "/usr/share/awesome/themes/sky/theme.lua"
26
27 wallpaper_cmd = { "awsetbg -t .config/awesome/bgstripes.png" } 
28
29 -- Actually load theme
30 beautiful.init(theme_path)
31
32 -- This is used later as the default terminal and editor to run.
33 terminal = "x-terminal-emulator"
34 editor = os.getenv("EDITOR") or "editor"
35 editor_cmd = terminal .. " -e " .. editor
36
37 -- Default modkey.
38 -- Usually, Mod4 is the key with a logo between Control and Alt.
39 -- If you do not like this or do not have such a key,
40 -- I suggest you to remap Mod4 to another key using xmodmap or other tools.
41 -- However, you can use another modifier like Mod1, but it may interact with others.
42 modkey = "Mod4"
43
44 -- Table of layouts to cover with awful.layout.inc, order matters.
45 layouts =
46 {
47 --    awful.layout.suit.tile,
48 --    awful.layout.suit.tile.left,
49 --    awful.layout.suit.tile.bottom,
50 --    awful.layout.suit.tile.top,
51     awful.layout.suit.fair,
52     awful.layout.suit.fair.horizontal,
53 --    awful.layout.suit.spiral,
54 --    awful.layout.suit.spiral.dwindle,
55     awful.layout.suit.max,
56 --    awful.layout.suit.max.fullscreen,
57     awful.layout.suit.magnifier,
58     awful.layout.suit.floating
59 }
60
61 ---- Table of clients that should be set floating. The index may be either
62 ---- the application class or instance. The instance is useful when running
63 ---- a console app in a terminal like (Music on Console)
64 ----    xterm -name mocp -e mocp
65 ---- OVERRULED BY TILEDAPPS BELOW
66 --floatapps =
67 --{
68 --    -- by class
69 --    ["MPlayer"] = true,
70 --    ["pinentry"] = true,
71 --    ["GIMP"] = true,
72 --    ["twinkle"] = true,
73 --    ["Add-ons"] = true,
74 --    ["Play stream"] = true,
75 --    ["gscan2pdf"] = true,
76 --}
77 --
78 ---- Applications that should never float, assuming everything else floats
79 ---- (by instance)
80 --tiledapps =
81 --{
82 --    ["urxvt"] = true,
83 --}
84 --
85 ---- Applications that should be maximised
86 ---- (by instance)
87 --maxapps =
88 --{
89 --    ["Navigator"] = true,
90 --    -- jpilot is -v
91 --    ["-v"] = true,
92 --    ["Xpdf"] = true,
93 --    ["gscan2pdf"] = true
94 --}
95 --
96 ---- Applications to be moved to a pre-defined tag by class or instance.
97 ---- Use the screen and tags indices.
98 --apptags =
99 --{
100 --    ["Navigator"] = { screen = 1, tag = 9 },
101 --    -- jpilot is -v
102 --    ["-v"] = { screen = 1, tag = 8 },
103 --}
104
105 -- Define if we want to use titlebar on all applications.
106 use_titlebar = false
107 -- }}}
108
109 -- {{{ Tags
110 tags = {}
111 tags.settings = {
112     { name = "1", layout = layouts[1] },
113     { name = "2", layout = layouts[1] },
114     { name = "3", layout = layouts[1] },
115     { name = "4", layout = layouts[1] },
116     { name = "5", layout = layouts[1] },
117     { name = "6", layout = layouts[1] },
118     { name = "7", layout = layouts[3] },
119     { name = "8", layout = layouts[3] },
120     { name = "9", layout = layouts[3] },
121 }
122
123 -- Define a tag table which hold all screen tags.
124 for s = 1, screen.count() do
125     tags[s] = {}
126     for i, v in ipairs(tags.settings) do
127         tags[s][i] = tag({ name = v.name })
128         tags[s][i].screen = s
129         awful.tag.setproperty(tags[s][i], "layout", v.layout)
130         awful.tag.setproperty(tags[s][i], "mwfact", v.mwfact)
131         awful.tag.setproperty(tags[s][i], "hide",   v.hide)
132     end
133     tags[s][1].selected = true
134 end
135
136 if screen.count() == 3 then
137   tags[1][1].selected = false
138   tags[1][9].selected = true
139 end
140 -- }}}
141
142 -- {{{ Menu
143 -- Create a laucher widget and a main menu
144 myawesomemenu = {
145    { "manual", terminal .. " -e man awesome" },
146    { "edit config", editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua" },
147    { "restart", awesome.restart },
148    { "quit", awesome.quit }
149 }
150
151 mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
152                                     { "Debian", debian.menu.Debian_menu.Debian },
153                                     { "open terminal", terminal }
154                                   }
155                         })
156
157 mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon),
158                                      menu = mymainmenu })
159 -- }}}
160
161 -- {{{ Wibox
162
163 -- {{{ Reusable separators
164 spacer         = widget({ type = "textbox", name = "spacer" })
165 separator      = widget({ type = "textbox", name = "separator" })
166 spacer.text    = " "
167 separator.text = "٭"
168 -- }}}
169
170 ---- {{{ CPU usage and temperature
171 ---- Widget icon
172 --cpuicon        = widget({ type = "imagebox", name = "cpuicon" })
173 --cpuicon.image  = image(beautiful.widget_cpu)
174 ---- Initialize widgets
175 --thermalwidget  = widget({ type = "textbox", name = "thermalwidget" })
176 --cpuwidget      = awful.widget.graph({ layout = awful.widget.layout.horizontal.rightleft })
177 ---- Graph properties
178 --cpuwidget:set_width(50)
179 ----cpuwidget:set_scale(false)
180 --cpuwidget:set_max_value(100)
181 --cpuwidget:set_background_color(beautiful.fg_off_widget)
182 --cpuwidget:set_border_color(beautiful.border_widget)
183 --cpuwidget:set_color(beautiful.fg_end_widget)
184 --cpuwidget:set_gradient_angle(0)
185 --cpuwidget:set_gradient_colors({
186 --    beautiful.fg_end_widget,
187 --    beautiful.fg_center_widget,
188 --    beautiful.fg_widget })
189 ---- Register widgets
190 --vicious.register(cpuwidget, vicious.widgets.cpu, "$1")
191 --vicious.register(thermalwidget, vicious.widgets.thermal, "CPU: $1°C", 19, "hwmon0")
192 ---- }}}
193
194 -- Battery widget
195 --batterywidget = widget({ type = 'progressbar', name = 'batterywidget' })
196 --batterywidget.width = 100
197 --batterywidget.height = 0.8
198 --batterywidget.gap = 1
199 --batterywidget.border_padding = 1
200 --batterywidget.border_width = 1
201 --batterywidget.ticks_count = 10
202 --batterywidget.ticks_gap = 1
203 --batterywidget.vertical = false
204 --batterywidget:bar_properties_set('bat', {
205 --  bg = 'black',
206 --  fg = 'blue4',
207 --  fg_off = 'red',
208 --  reverse = false,
209 --  min_value = 0,
210 --  max_value = 100
211 --})
212
213 -- Create a textclock widget
214 mytextclock = awful.widget.textclock({ align = "right" }, "%a %d %b %H:%M:%S", 1)
215
216 -- Create a systray
217 mysystray = widget({ type = "systray", align = "right" })
218
219 mybatterybox = widget({ type = "textbox", name = "mybatterybox", align = "right" })
220
221 -- Create a wibox for each screen and add it
222 mywibox = {}
223 mypromptbox = {}
224 mylayoutbox = {}
225 mytaglist = {}
226 mytaglist.buttons = awful.util.table.join(
227                     awful.button({ }, 1, awful.tag.viewonly),
228                     awful.button({ modkey }, 1, awful.client.movetotag),
229                     awful.button({ }, 3, awful.tag.viewtoggle),
230                     awful.button({ modkey }, 3, awful.client.toggletag),
231                     awful.button({ }, 4, awful.tag.viewnext),
232                     awful.button({ }, 5, awful.tag.viewprev)
233                     )
234 mytasklist = {}
235 mytasklist.buttons = awful.util.table.join(
236                      awful.button({ }, 1, function (c)
237                                               if not c:isvisible() then
238                                                   awful.tag.viewonly(c:tags()[1])
239                                               end
240                                               client.focus = c
241                                               c:raise()
242                                           end),
243                      awful.button({ }, 3, function ()
244                                               if instance then
245                                                   instance:hide()
246                                                   instance = nil
247                                               else
248                                                   instance = awful.menu.clients({ width=250 })
249                                               end
250                                           end),
251                      awful.button({ }, 4, function ()
252                                               awful.client.focus.byidx(1)
253                                               if client.focus then client.focus:raise() end
254                                           end),
255                      awful.button({ }, 5, function ()
256                                               awful.client.focus.byidx(-1)
257                                               if client.focus then client.focus:raise() end
258                                           end))
259
260 for s = 1, screen.count() do
261     -- Create a promptbox for each screen
262     mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright })
263     -- Create an imagebox widget which will contains an icon indicating which layout we're using.
264     -- We need one layoutbox per screen.
265     mylayoutbox[s] = awful.widget.layoutbox(s)
266     mylayoutbox[s]:buttons(awful.util.table.join(
267                            awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end),
268                            awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end),
269                            awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end),
270                            awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end)))
271     -- Create a taglist widget
272     mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, mytaglist.buttons)
273
274     -- Create a tasklist widget
275     mytasklist[s] = awful.widget.tasklist(function(c)
276                                               return awful.widget.tasklist.label.currenttags(c, s)
277                                           end, mytasklist.buttons)
278
279     -- Create the wibox
280     mywibox[s] = awful.wibox({ position = "top", screen = s })
281     -- Add widgets to the wibox - order matters
282     mywibox[s].widgets = {
283         {
284 --            mylauncher,
285             mytaglist[s],
286             mypromptbox[s],
287             layout = awful.widget.layout.horizontal.leftright
288         },
289         mylayoutbox[s],
290         spacer,
291         mytextclock,
292         spacer, separator, spacer,
293         obvious.battery.widget,
294 --        mybatterybox,
295 --        batterywidget,
296 --        spacer, separator, spacer,
297 --        cpuwidget.widget,
298 --        spacer, separator, spacer,
299 --        thermalwidget.widget,
300         spacer,
301         s == screen.count() and mysystray or nil,
302         mytasklist[s],
303         layout = awful.widget.layout.horizontal.rightleft
304     }
305 end
306
307 -- }}}
308
309 -- {{{ Mouse bindings
310 root.buttons(awful.util.table.join(
311     awful.button({ }, 3, function () mymainmenu:toggle() end),
312     awful.button({ }, 4, awful.tag.viewnext),
313     awful.button({ }, 5, awful.tag.viewprev)
314 ))
315 -- }}}
316
317 -- {{{ Key bindings
318 globalkeys = awful.util.table.join(
319     awful.key({ modkey,           }, "Left",   awful.tag.viewprev       ),
320     awful.key({ modkey,           }, "Right",  awful.tag.viewnext       ),
321     awful.key({ modkey,           }, "Escape", awful.tag.history.restore),
322     awful.key({ modkey, "Shift"   }, "Right", function () awful.screen.focus_relative( 1)       end),
323     awful.key({ modkey, "Shift"   }, "Left", function () awful.screen.focus_relative(-1)       end),
324
325     awful.key({ modkey,           }, "k",
326         function ()
327             awful.client.focus.byidx( 1)
328             if client.focus then client.focus:raise() end
329         end),
330     awful.key({ modkey,           }, "j",
331         function ()
332             awful.client.focus.byidx(-1)
333             if client.focus then client.focus:raise() end
334         end),
335     awful.key({ modkey,           }, "w", function () mymainmenu:show(true)        end),
336
337     -- Layout manipulation
338     awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx(  1) end),
339     awful.key({ modkey, "Shift"   }, "j", function () awful.client.swap.byidx( -1) end),
340     awful.key({ modkey, "Control" }, "k", function () awful.screen.focus( 1)       end),
341     awful.key({ modkey, "Control" }, "j", function () awful.screen.focus(-1)       end),
342     awful.key({ modkey,           }, "u", awful.client.urgent.jumpto),
343     awful.key({ modkey,           }, "Tab",
344         function ()
345             awful.client.focus.history.previous()
346             if client.focus then
347                 client.focus:raise()
348             end
349         end),
350
351     -- Standard program
352     awful.key({ modkey,           }, "Return", function () awful.util.spawn(terminal) end),
353     awful.key({ modkey, "Control" }, "r", awesome.restart),
354     awful.key({ modkey, "Shift"   }, "q", awesome.quit),
355
356     awful.key({ modkey,           }, "l",     function () awful.tag.incmwfact( 0.05)    end),
357     awful.key({ modkey,           }, "h",     function () awful.tag.incmwfact(-0.05)    end),
358     awful.key({ modkey, "Shift"   }, "h",     function () awful.tag.incnmaster( 1)      end),
359     awful.key({ modkey, "Shift"   }, "l",     function () awful.tag.incnmaster(-1)      end),
360     awful.key({ modkey, "Control" }, "h",     function () awful.tag.incncol( 1)         end),
361     awful.key({ modkey, "Control" }, "l",     function () awful.tag.incncol(-1)         end),
362     awful.key({ modkey,           }, "space", function () awful.layout.inc(layouts,  1) end),
363     awful.key({ modkey, "Shift"   }, "space", function () awful.layout.inc(layouts, -1) end),
364
365     -- Prompt
366     awful.key({ modkey },            "r",     function () mypromptbox[mouse.screen]:run() end),
367
368     awful.key({ modkey }, "x",
369               function ()
370                   awful.prompt.run({ prompt = "Run Lua code: " },
371                   mypromptbox[mouse.screen].widget,
372                   awful.util.eval, nil,
373                   awful.util.getdir("cache") .. "/history_eval")
374               end),
375     awful.key({ modkey }, "F1", function () awful.screen.focus(1) end),
376     awful.key({ modkey }, "F2", function () awful.screen.focus(2) end),
377     awful.key({ modkey }, "F3", function () awful.screen.focus(3) end),
378     awful.key({ modkey, "Shift" }, "F1", function () awful.client.movetoscreen(c, 1) end),
379     awful.key({ modkey, "Shift" }, "F2", function () awful.client.movetoscreen(c, 2) end),
380     awful.key({ modkey, "Shift" }, "F3", function () awful.client.movetoscreen(c, 3) end)
381 )
382
383 clientkeys = awful.util.table.join(
384     awful.key({ modkey,           }, "f",      function (c) c.fullscreen = not c.fullscreen  end),
385     awful.key({ modkey, "Shift"   }, "c",      function (c) c:kill()                         end),
386     awful.key({ modkey, "Control" }, "space",  awful.client.floating.toggle                     ),
387     awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end),
388     awful.key({ modkey,           }, "o",      function (c) awful.client.movetoscreen(c, c.screen-1) end),
389     awful.key({ modkey,           }, "p",      function (c) awful.client.movetoscreen(c, c.screen+1) end),
390     awful.key({ modkey, "Shift"   }, "r",      function (c) c:redraw()                       end),
391     awful.key({ modkey,           }, "t",      function (c) c.ontop = not c.ontop            end),
392     awful.key({ modkey,           }, "n",      function (c) c.minimized = not c.minimized    end),
393     awful.key({ modkey,           }, "m",
394         function (c)
395             -- silly lua can't do bitwise operations
396             if not c.maximized_horizontal and not c.maximized_vertical then
397                 c.maximized_horizontal = true
398                 c.maximized_vertical = true
399             elseif c.maximized_horizontal and c.maximized_vertical then
400                 c.maximized_horizontal = false
401                 c.maximized_vertical = true
402             elseif not c.maximized_horizontal and c.maximized_vertical then
403                 c.maximized_horizontal = true
404                 c.maximized_vertical = false
405             elseif c.maximized_horizontal and not c.maximized_vertical then
406                 c.maximized_horizontal = false
407                 c.maximized_vertical = false
408             end
409         end)
410 )
411
412 -- Compute the maximum number of digit we need, limited to 9
413 keynumber = 0
414 for s = 1, screen.count() do
415    keynumber = math.min(9, math.max(#tags[s], keynumber));
416 end
417
418 -- Bind all key numbers to tags.
419 -- Be careful: we use keycodes to make it works on any keyboard layout.
420 -- This should map on the top row of your keyboard, usually 1 to 9.
421 for i = 1, keynumber do
422     globalkeys = awful.util.table.join(globalkeys,
423         awful.key({ modkey }, "#" .. i + 9,
424                   function ()
425                         local screen = mouse.screen
426                         if tags[screen][i] then
427                             awful.tag.viewonly(tags[screen][i])
428                         end
429                   end),
430         awful.key({ modkey, "Control" }, "#" .. i + 9,
431                   function ()
432                       local screen = mouse.screen
433                       if tags[screen][i] then
434                           awful.tag.viewtoggle(tags[screen][i])
435                       end
436                   end),
437         awful.key({ modkey, "Shift" }, "#" .. i + 9,
438                   function ()
439                       if client.focus and tags[client.focus.screen][i] then
440                           awful.client.movetotag(tags[client.focus.screen][i])
441                       end
442                   end),
443         awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
444                   function ()
445                       if client.focus and tags[client.focus.screen][i] then
446                           awful.client.toggletag(tags[client.focus.screen][i])
447                       end
448                   end))
449 end
450
451 clientbuttons = awful.util.table.join(
452     awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
453     awful.button({ modkey }, 1, awful.mouse.client.move),
454     awful.button({ modkey }, 3, awful.mouse.client.resize))
455
456 cmdmodkey = "Mod3"
457
458 -- xmms2 & sound
459 globalkeys = awful.util.table.join(globalkeys,
460   awful.key({ cmdmodkey }, "Prior", function () awful.util.spawn("amixer set Master 2%+") end),
461   awful.key({ cmdmodkey }, "Next", function () awful.util.spawn("amixer set Master 2%-") end),
462   awful.key({ cmdmodkey }, "Up", function () awful.util.spawn("amixer set PCM 2%+") end),
463   awful.key({ cmdmodkey }, "Down", function () awful.util.spawn("amixer set PCM 2%-") end),
464   awful.key({ cmdmodkey }, "Home", function () awful.util.spawn("amixer set Mic toggle") end),
465   awful.key({ cmdmodkey }, "End", function () awful.util.spawn("amixer set Master toggle") end),
466   awful.key({ cmdmodkey }, "Left", function () awful.util.spawn("nyxmms2 prev") end),
467   awful.key({ cmdmodkey }, "Right", function () awful.util.spawn("nyxmms2 next") end),
468   awful.key({ cmdmodkey }, "space", function () awful.util.spawn("nyxmms2 toggle") end),
469   awful.key({ cmdmodkey }, "backslash", function ()
470     local f = io.popen('nyxmms2 current', 'r')
471     for s, t in string.gmatch(f:read(), '(%w+):%s+([^:]+)') do
472       naughty.notify({ title = s, text = t, timeout = 5 })
473     end
474     f:close()
475   end),
476   awful.key({ cmdmodkey, "Shift" }, "backslash", function ()
477     local f = io.popen('nyxmms2 list', 'r')
478     naughty.notify({ title = "Playlist", text = f:read("*a"), timeout = 15 })
479     f:close()
480   end)
481 )
482
483 -- misc apps
484 globalkeys = awful.util.table.join(globalkeys,
485   awful.key({ cmdmodkey }, "n", function () awful.util.spawn("sensible-browser") end),
486   awful.key({ cmdmodkey }, "m", function () awful.util.spawn(terminal .. " -e mutt -f =store") end),
487   awful.key({ cmdmodkey }, "t", function () awful.util.spawn(terminal) end),
488   awful.key({ cmdmodkey }, "y", function () awful.util.spawn(terminal .. " -e python") end),
489   awful.key({ cmdmodkey }, "c", function () awful.util.spawn("icedove") end),
490   awful.key({ cmdmodkey }, "r", function () mypromptbox[mouse.screen]:run() end),
491   awful.key({ cmdmodkey }, "g", function () awful.util.spawn("gscan2pdf") end),
492   awful.key({ cmdmodkey }, "o", function () awful.util.spawn("okular") end),
493   awful.key({ cmdmodkey }, "l", function () awful.util.spawn("libreoffice") end),
494   awful.key({ cmdmodkey }, "i", function () awful.util.spawn(terminal .. " -title irc -name irc -e env MOSH_TITLE_NOPREFIX=true mosh -- irc screen -dr irc") end),
495   awful.key({ cmdmodkey }, "x", function () awful.util.spawn_with_shell("/sbin/start-stop-daemon --start --background --exec /usr/bin/xscreensaver -- -no-capture-stderr -log ~/.tmp/xscreensaver.log; xscreensaver-command -lock") end),
496   awful.key({ cmdmodkey, "Shift" }, "x", function () awful.util.spawn("xscreensaver-command -exit") end),
497   awful.key(nil, "XF86ScreenSaver", function () awful.util.spawn("xset dpms force off") end)
498 )
499
500 -- Set keys
501 root.keys(globalkeys)
502 -- }}}
503
504 -- {{{ Rules
505 awful.rules.rules = {
506     -- All clients will match this rule.
507     { rule = { },
508       properties = { border_width = beautiful.border_width,
509                      border_color = beautiful.border_normal,
510                      focus = true,
511                      floating = true,
512                      keys = clientkeys,
513                      buttons = clientbuttons },
514       callback = awful.placement.centered
515     },
516     { rule = { class = "URxvt" },
517       properties = { floating = false } },
518     { rule = { class = "URxvt", instance = "irc" },
519       properties = { floating = false, tag = tags[screen.count()][screen.count() == 1 and 2 or 1], switchtotag = true } },
520     { rule = { class = "Iceweasel", instance = "Navigator" },
521       properties = { tag = tags[screen.count() == 3 and 1 or screen.count()][9], switchtotag = false, floating = false } },
522     { rule = { class = "Icedove", instance = "Mail" },
523       properties = { tag = tags[screen.count() == 3 and 1 or screen.count()][8], switchtotag = false, floating = false } },
524 }
525 -- }}}
526
527 -- {{{ Signals
528 -- Signal function to execute when a new client appears.
529 client.add_signal("manage", function (c, startup)
530     -- Add a titlebar
531     -- awful.titlebar.add(c, { modkey = modkey })
532
533     -- Enable sloppy focus
534     c:add_signal("mouse::enter", function(c)
535         if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
536             and awful.client.focus.filter(c) then
537             client.focus = c
538         end
539     end)
540
541     if not startup then
542         -- Set the windows at the slave,
543         -- i.e. put it at the end of others instead of setting it master.
544         -- awful.client.setslave(c)
545
546         -- Put windows in a smart way, only if they does not set an initial position.
547         if not c.size_hints.user_position and not c.size_hints.program_position then
548             --awful.placement.center_vertical(c)
549             --awful.placement.center_horizontal(c)
550             awful.placement.no_overlap(c)
551             awful.placement.no_offscreen(c)
552         end
553     end
554     c.size_hints_honor = false
555 end)
556
557 client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end)
558 client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
559
560 function clear_urgency_flag(c)
561     print("property::urgent received for client: ", c)
562     io.flush ()
563 --    if c.urgent then
564 --        c.urgent = false
565 --    end
566 end
567
568 client.add_signal("new", function (c)
569   c:add_signal("property::urgent", clear_urgency_flag)
570 end)
571
572 -- Hook called every sixty seconds
573 function hook_battery()
574     mybatterybox.text = " " .. get_acpibatt() .. " "
575 end
576 -- }}}
577
578 -- {{{ Statusbar battery
579 --
580 function get_acpibatt()
581     local f = io.popen('acpi -b', 'r')
582     if not f then
583       return "acpi -b failed"
584     end
585
586     local s = f:read('*l')
587     f:close()
588     if not s then
589       return '-';
590     end
591
592     -- Battery 0: Discharging, 89%, 00:02:14 remaining
593     -- Battery 0: Charging, 58%, 00:02:14 until charged
594     -- Battery 0: Full, 100%
595     -- so find the first bit first and then go look for the time
596     local st, en, status, percent = string.find(s, '%a+%s%d:%s(%a+),%s(%d+%%)');
597     local st, en, time = string.find(s, ',%s(%d+:%d+):%d+%s%a+', en);
598
599     if not status or not percent then -- time can be empty if we're full
600       return "couldn't parse line " .. s
601     end
602
603     if not time then
604       return percent
605     end
606
607     if status == 'Charging' then
608       return '↑ ' .. percent;
609     elseif status == 'Discharging' then
610       return '↓ '.. time;
611     else
612       return '';
613     end
614 end
615 --t = timer({ timeout = 20 })
616 --t:add_signal('timeout', hook_battery)
617 --t:start()
618 --hook_battery()
619 --bashets.register_lua(mybatterybox, get_acpibatt, '%1', 30)
620 --bashets.start()
621 -- }}}