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.
2 -- Standard awesome library
3 local gears = require("gears")
4 local awful = require("awful")
5 require("awful.autofocus")
6 -- Widget and layout library
7 local wibox = require("wibox")
8 -- Theme handling library
9 local beautiful = require("beautiful")
10 -- Notification library
11 local naughty = require("naughty")
12 local menubar = require("menubar")
13 local hotkeys_popup = require("awful.hotkeys_popup").widget
14 local lain = require("lain")
15 local dkjson = require("lain.util").dkjson
16 local math = require("math")
17 local freedesktop = require("freedesktop")
18 local luatz = require("luatz")
22 -- Check if awesome encountered an error during startup and fell back to
23 -- another config (This code will only ever execute for the fallback config)
24 if awesome.startup_errors then
25 naughty.notify({ preset = naughty.config.presets.critical,
26 title = "Oops, there were errors during startup!",
27 text = awesome.startup_errors })
30 -- Handle runtime errors after startup
32 local in_error = false
33 awesome.connect_signal("debug::error", function (err)
34 -- Make sure we don't go into an endless error loop
35 if in_error then return end
38 naughty.notify({ preset = naughty.config.presets.critical,
39 title = "Oops, an error happened!",
40 text = tostring(err) })
46 -- {{{ Variable definitions
47 -- Themes define colours, icons, and wallpapers
48 beautiful.init(awful.util.get_themes_dir() .. "default/theme.lua")
50 -- This is used later as the default terminal and editor to run.
51 terminal = "x-terminal-emulator"
52 editor = "sensible-editor"
53 editor_cmd = terminal .. " -e " .. editor
56 -- Usually, Mod4 is the key with a logo between Control and Alt.
57 -- If you do not like this or do not have such a key,
58 -- I suggest you to remap Mod4 to another key using xmodmap or other tools.
59 -- However, you can use another modifier like Mod1, but it may interact with others.
63 -- Table of layouts to cover with awful.layout.inc, order matters.
64 awful.layout.layouts = {
65 awful.layout.suit.fair,
66 awful.layout.suit.tile,
67 -- awful.layout.suit.tile.left,
68 -- awful.layout.suit.tile.bottom,
69 awful.layout.suit.tile.top,
70 -- awful.layout.suit.spiral,
71 -- awful.layout.suit.spiral.dwindle,
72 awful.layout.suit.max,
73 -- awful.layout.suit.max.fullscreen,
74 -- awful.layout.suit.magnifier,
75 -- awful.layout.suit.corner.nw,
76 -- awful.layout.suit.corner.ne,
77 -- awful.layout.suit.corner.sw,
78 -- awful.layout.suit.corner.se,
79 awful.layout.suit.floating,
82 layout_default = awful.layout.layouts[1]
83 layout_tiled = awful.layout.layouts[2]
84 layout_maximised = awful.layout.layouts[4]
85 layout_floating = awful.layout.layouts[5]
88 -- {{{ Helper functions
89 local function client_menu_toggle_fn()
93 if instance and instance.wibox.visible then
97 instance = awful.menu.clients({ theme = { width = 250 } })
102 local function sorted_pairs(t, f)
104 for n in pairs(t) do table.insert(a, n) end
106 local i = 0 -- iterator variable
107 local iter = function () -- iterator function
109 if a[i] == nil then return nil
110 else return a[i], t[a[i]]
116 local function print_table(tbl, indent)
117 if not indent then indent = 0 end
118 for k, v in pairs(tbl) do
119 formatting = string.rep(" ", indent) .. k .. ": "
120 if type(v) == "table" then
122 print_table(v, indent+1)
124 print(formatting .. tostring(v))
129 local lain_bat = lain.widget.bat({
130 batteries = {"BAT0", "BAT1"},
131 settings = function()
133 if bat_now.status == "Charging" then delim = "↑"
134 elseif bat_now.status == "Unknown" then delim = "٭" end
135 widget:set_text(bat_now.perc .. "% " .. delim .. " " .. bat_now.time)
139 local function poloniex_price(output, pair, prec)
140 local xc, pos, err = dkjson.decode(output, 1, nil)
141 if not prec then prec = 4 end
142 val = (xc and xc[pair]["last"]) or 0
143 val = math.floor(val*10^prec+0.5)/10^prec
144 return (not err and val) or "n/a"
147 local eth_widget = lain.widget.watch({
148 cmd = "curl -m5 -s 'https://poloniex.com/public?command=returnTicker'",
150 settings = function()
151 widget:set_text(poloniex_price(output, 'BTC_ETH') .. " Ƀ/Ξ")
155 local function coindesk_price(output, base, prec)
156 local xc, pos, err = dkjson.decode(output, 1, nil)
157 if not prec then prec = 4 end
158 val = (xc and xc["bpi"][base]["rate_float"]) or 0
159 val = math.floor(val*10^prec+0.5)/10^prec
160 return (not err and val) or "n/a"
163 local btc_widget = lain.widget.watch({
164 cmd = "curl -m5 -Ls 'https://api.coindesk.com/v1/bpi/currentprice/EUR.json'",
166 settings = function()
167 widget:set_text(coindesk_price(output, "EUR", 2) .. " €/Ƀ")
174 -- Create a launcher widget and a main menu
176 { "hotkeys", function() return false, hotkeys_popup.show_help end},
177 { "manual", terminal .. " -e man awesome" },
178 { "edit config", editor_cmd .. " " .. awesome.conffile },
179 { "restart", awesome.restart },
180 { "quit", awesome.quit }
183 mymainmenu = freedesktop.menu.build({
185 { "awesome", myawesomemenu, beautiful.awesome_icon },
186 { "terminal", terminal },
192 mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
196 -- {{{ Menubar configuration
197 menubar.utils.terminal = terminal -- Set the terminal for applications that require it
201 local spacer = wibox.widget.textbox()
202 spacer:set_text(' │ ')
203 -- Create a textclock widget
204 clocks = { wibox.widget.textclock("%a %d %b %H:%M:%S %Z", 1) }
207 ["NZ"] = "Pacific/Auckland",
208 ["DE"] = "Europe/Berlin"
210 local now = luatz.time_in(nil)
211 for c, tz in sorted_pairs(ZONES) do
212 local t = luatz.time_in(tz)
213 if math.abs(os.difftime(t, now)) > 10 then
214 local widget = wibox.widget.textclock(c .. ": %H:%M (%a)", 60, tz)
215 table.insert(clocks, 1, spacer)
216 table.insert(clocks, 1, widget)
220 -- Create a wibox for each screen and add it
225 mytaglist.buttons = awful.util.table.join(
226 awful.button({ }, 1, function(t) t:view_only() end),
227 awful.button({ modkey }, 1, function(t)
229 client.focus:move_to_tag(t)
232 awful.button({ }, 3, awful.tag.viewtoggle),
233 awful.button({ modkey }, 3, function(t)
235 client.focus:toggle_tag(t)
238 awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end),
239 awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end)
243 mytasklist.buttons = awful.util.table.join(
244 awful.button({ }, 1, function (c)
245 if c == client.focus then
246 -- I don't like click-minimising
247 -- c.minimized = true
249 -- Without this, the following
250 -- :isvisible() makes no sense
252 if not c:isvisible() and c.first_tag then
253 c.first_tag:view_only()
255 -- This will also un-minimize
256 -- the client, if needed
261 awful.button({ }, 3, client_menu_toggle_fn()),
262 awful.button({ }, 4, function ()
263 awful.client.focus.byidx(1)
265 awful.button({ }, 5, function ()
266 awful.client.focus.byidx(-1)
273 tags.config["main"] = {
274 t1 = { layout = layout_default, selected = true },
275 t2 = { layout = layout_default },
276 t3 = { layout = layout_tiled },
277 t4 = { layout = layout_tiled },
278 t5 = { layout = layout_tiled },
279 t6 = { layout = layout_floating },
280 t7 = { layout = layout_maximised },
281 t8 = { layout = layout_maximised },
282 t9 = { layout = layout_maximised },
284 tags.config["aux"] = {
285 t1 = { layout = layout_default, selected = true },
286 t2 = { layout = layout_default },
287 t3 = { layout = layout_tiled },
288 t4 = { layout = layout_floating },
289 t5 = { layout = layout_floating },
290 t6 = { layout = layout_floating },
291 t7 = { layout = layout_floating },
292 t8 = { layout = layout_floating },
293 t9 = { layout = layout_maximised },
297 screentags[1] = tags.config["main"]
298 if screen.count() == 2 then -- aux screen is on the right
299 screentags[2] = tags.config["aux"]
300 elseif screen.count() == 3 then -- main screen is still #1 in the middle
301 screentags[2] = tags.config["aux"]
302 screentags[3] = tags.config["aux"]
305 awful.screen.connect_for_each_screen(function(s)
307 --DISABLED--if beautiful.wallpaper then
308 --DISABLED-- local wallpaper = beautiful.wallpaper
309 --DISABLED-- -- If wallpaper is a function, call it with the screen
310 --DISABLED-- if type(wallpaper) == "function" then
311 --DISABLED-- wallpaper = wallpaper(s)
313 --DISABLED-- gears.wallpaper.maximized(wallpaper, s, true)
316 if not tags[s.index] then
319 for n,p in sorted_pairs(screentags[s.index]) do
321 n = string.sub(n, 2) -- remove leading 't' needed for syntax in table
322 table.insert(tags[s.index], awful.tag.add(n, p))
325 -- Create a promptbox for each screen
326 mypromptbox[s] = awful.widget.prompt()
327 -- Create an imagebox widget which will contains an icon indicating which layout we're using.
328 -- We need one layoutbox per screen.
329 mylayoutbox[s] = awful.widget.layoutbox(s)
330 mylayoutbox[s]:buttons(awful.util.table.join(
331 awful.button({ }, 1, function () awful.layout.inc( 1) end),
332 awful.button({ }, 3, function () awful.layout.inc(-1) end),
333 awful.button({ }, 4, function () awful.layout.inc( 1) end),
334 awful.button({ }, 5, function () awful.layout.inc(-1) end)))
335 -- Create a taglist widget
336 mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons)
338 -- Create a tasklist widget
339 mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
342 mywibox[s] = awful.wibar({ position = "top", screen = s })
344 -- Add widgets to the wibox
346 layout = wibox.layout.align.horizontal,
348 layout = wibox.layout.fixed.horizontal,
353 mytasklist[s], -- Middle widget
354 awful.util.table.join( -- Right widgets
356 layout = wibox.layout.fixed.horizontal,
358 wibox.widget.systray(),
373 -- {{{ Mouse bindings
374 root.buttons(awful.util.table.join(
375 awful.button({ }, 3, function () mymainmenu:toggle() end),
376 awful.button({ }, 4, awful.tag.viewnext),
377 awful.button({ }, 5, awful.tag.viewprev)
382 globalkeys = awful.util.table.join(
383 awful.key({ modkey, }, "s", hotkeys_popup.show_help,
384 {description="show help", group="awesome"}),
385 awful.key({ modkey, }, "Left", awful.tag.viewprev,
386 {description = "view previous", group = "tag"}),
387 awful.key({ modkey, }, "Right", awful.tag.viewnext,
388 {description = "view next", group = "tag"}),
389 awful.key({ modkey, }, "Escape", awful.tag.history.restore,
390 {description = "go back", group = "tag"}),
392 awful.key({ modkey, }, "k",
394 awful.client.focus.byidx( 1)
396 {description = "focus next by index", group = "client"}
398 awful.key({ modkey, }, "j",
400 awful.client.focus.byidx(-1)
402 {description = "focus previous by index", group = "client"}
404 awful.key({ modkey, }, "w", function () mymainmenu:show() end,
405 {description = "show main menu", group = "awesome"}),
407 -- Layout manipulation
408 awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( 1) end,
409 {description = "swap with next client by index", group = "client"}),
410 awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( -1) end,
411 {description = "swap with previous client by index", group = "client"}),
412 awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative( 1) end,
413 {description = "focus the next screen", group = "screen"}),
414 awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative(-1) end,
415 {description = "focus the previous screen", group = "screen"}),
416 awful.key({ modkey, }, "u", awful.client.urgent.jumpto,
417 {description = "jump to urgent client", group = "client"}),
418 awful.key({ modkey, }, "Tab",
420 awful.client.focus.history.previous()
425 {description = "go back", group = "client"}),
428 awful.key({ modkey, }, "Return", function () awful.spawn(terminal) end,
429 {description = "open a terminal", group = "launcher"}),
430 awful.key({ modkey, "Control" }, "r", awesome.restart,
431 {description = "reload awesome", group = "awesome"}),
432 awful.key({ modkey, "Shift" }, "q", awesome.quit,
433 {description = "quit awesome", group = "awesome"}),
435 awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end,
436 {description = "increase master width factor", group = "layout"}),
437 awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end,
438 {description = "decrease master width factor", group = "layout"}),
439 awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1, nil, true) end,
440 {description = "increase the number of master clients", group = "layout"}),
441 awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1, nil, true) end,
442 {description = "decrease the number of master clients", group = "layout"}),
443 awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1, nil, true) end,
444 {description = "increase the number of columns", group = "layout"}),
445 awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1, nil, true) end,
446 {description = "decrease the number of columns", group = "layout"}),
447 awful.key({ modkey, }, "space", function () awful.layout.inc( 1) end,
448 {description = "select next", group = "layout"}),
449 awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(-1) end,
450 {description = "select previous", group = "layout"}),
452 awful.key({ modkey, "Control" }, "n",
454 local c = awful.client.restore()
455 -- Focus restored client
461 {description = "restore minimized", group = "client"}),
464 awful.key({ modkey }, "r", function () mypromptbox[awful.screen.focused()]:run() end,
465 {description = "run prompt", group = "launcher"}),
467 awful.key({ modkey }, "x",
469 awful.prompt.run({ prompt = "Run Lua code: " },
470 mypromptbox[awful.screen.focused()].widget,
471 awful.util.eval, nil,
472 awful.util.get_cache_dir() .. "/history_eval")
474 {description = "lua execute prompt", group = "awesome"}),
476 awful.key({ modkey }, "p", function() menubar.show() end,
477 {description = "show the menubar", group = "launcher"})
480 clientkeys = awful.util.table.join(
481 awful.key({ modkey, }, "f",
483 c.fullscreen = not c.fullscreen
486 {description = "toggle fullscreen", group = "client"}),
487 awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end,
488 {description = "close", group = "client"}),
489 awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ,
490 {description = "toggle floating", group = "client"}),
491 awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end,
492 {description = "move to master", group = "client"}),
493 awful.key({ modkey, }, "o", function (c) c:move_to_screen() end,
494 {description = "move to screen", group = "client"}),
495 awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end,
496 {description = "toggle keep on top", group = "client"}),
497 awful.key({ modkey, }, "n",
499 -- The client currently has the input focus, so it cannot be
500 -- minimized, since minimized clients can't have the focus.
503 {description = "minimize", group = "client"}),
504 awful.key({ modkey, }, "m",
506 c.maximized = not c.maximized
507 c.maximized_horizontal = false
508 c.maximized_vertical = false
511 {description = "maximize", group = "client"})
514 -- Bind all key numbers to tags.
515 -- Be careful: we use keycodes to make it works on any keyboard layout.
516 -- This should map on the top row of your keyboard, usually 1 to 9.
518 globalkeys = awful.util.table.join(globalkeys,
520 awful.key({ modkey }, "#" .. i + 9,
522 local screen = awful.screen.focused()
523 local tag = screen.tags[i]
528 {description = "view tag #"..i, group = "tag"}),
530 awful.key({ modkey, "Control" }, "#" .. i + 9,
532 local screen = awful.screen.focused()
533 local tag = screen.tags[i]
535 awful.tag.viewtoggle(tag)
538 {description = "toggle tag #" .. i, group = "tag"}),
539 -- Move client to tag.
540 awful.key({ modkey, "Shift" }, "#" .. i + 9,
543 local tag = client.focus.screen.tags[i]
545 client.focus:move_to_tag(tag)
549 {description = "move focused client to tag #"..i, group = "tag"}),
550 -- Toggle tag on focused client.
551 awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
554 local tag = client.focus.screen.tags[i]
556 client.focus:toggle_tag(tag)
560 {description = "toggle focused client on tag #" .. i, group = "tag"})
564 clientbuttons = awful.util.table.join(
565 awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
566 awful.button({ modkey }, 1, awful.mouse.client.move),
567 awful.button({ modkey }, 3, awful.mouse.client.resize))
570 globalkeys = awful.util.table.join(globalkeys,
571 awful.key({ cmdkey }, "n", function () awful.spawn("firefox") end),
572 awful.key({ cmdkey }, "m", function () awful.spawn("chromium --enable-remote-extensions") end),
573 awful.key({ cmdkey }, "y", function () awful.spawn(terminal .. " -e python") end),
574 awful.key({ cmdkey }, "c", function () awful.spawn("thunderbird") end),
575 awful.key({ cmdkey }, "r", function () mypromptbox[mouse.screen]:run() end),
576 awful.key({ cmdkey }, "g", function () awful.spawn("gscan2pdf") end),
577 awful.key({ cmdkey }, "v", function () awful.spawn("virt-manager") end),
578 awful.key({ cmdkey }, "l", function () awful.spawn("libreoffice") end),
579 awful.key({ cmdkey }, "f", function () awful.spawn("thunar") end),
580 awful.key({ cmdkey }, "i", function () awful.spawn(terminal .. " -name irc -e env MOSH_TITLE_NOPREFIX=true mosh -4 -- irc-host tmux new -As irc irssi") end),
581 awful.key({ cmdkey }, "x", function () awful.spawn.with_shell("/sbin/start-stop-daemon --start --background --exec /usr/bin/xscreensaver -- -no-capture-stderr; sleep 2; xscreensaver-command -lock") end),
582 awful.key({ cmdkey, "Shift" }, "x", function () awful.spawn("xscreensaver-command -exit") end),
585 awful.key(nil, "XF86ScreenSaver", function () awful.spawn("xset dpms force off") end),
586 awful.key(nil, "XF86AudioMute", function () awful.spawn("pactl set-sink-mute 0 toggle") end),
587 awful.key({ cmdkey }, "End", function () awful.spawn("pactl set-sink-mute 0 toggle") end),
588 awful.key(nil, "XF86AudioLowerVolume", function () awful.spawn("pactl set-sink-volume 0 -2%") end),
589 awful.key({ cmdkey }, "Next", function () awful.spawn("pactl set-sink-volume 0 -2%") end),
590 awful.key(nil, "XF86AudioRaiseVolume", function () awful.spawn("pactl set-sink-volume 0 +2%") end),
591 awful.key({ cmdkey }, "Prior", function () awful.spawn("pactl set-sink-volume 0 +2%") end),
592 awful.key(nil, "XF86AudioMicMute", function () awful.spawn("pactl set-source-mute 1 toggle") end),
593 awful.key({ cmdkey }, "Home", function () awful.spawn("pactl set-source-mute 1 toggle") end),
594 awful.key(nil, "XF86MonBrightnessDown", function () awful.spawn("xbacklight -dec 5%") end),
595 awful.key(nil, "XF86MonBrightnessUp", function () awful.spawn("xbacklight -inc 5%") end),
596 awful.key(nil, "XF86Display", function () awful.spawn("") end),
597 awful.key(nil, "XF86WLAN", function () awful.spawn("") end),
598 awful.key(nil, "XF86Tools", function () awful.spawn("") end),
599 awful.key(nil, "XF86Search", function () awful.spawn("") end),
600 awful.key(nil, "XF86LaunchA", function () awful.spawn("") end),
601 awful.key(nil, "XF86Explorer", function () awful.spawn("") end)
605 root.keys(globalkeys)
609 -- Rules to apply to new clients (through the "manage" signal).
611 local function move_to_tag(s, t)
613 c:move_to_tag(tags[s][t])
617 awful.rules.rules = {
618 -- All clients will match this rule.
620 properties = { border_width = beautiful.border_width,
621 border_color = beautiful.border_normal,
622 focus = awful.client.focus.filter,
625 buttons = clientbuttons,
626 screen = awful.screen.preferred,
627 placement = awful.placement.no_overlap+awful.placement.no_offscreen,
632 -- Add titlebars to normal clients and dialogs
633 --DISABLED-- { rule_any = {type = { "normal", "dialog" }
634 --DISABLED-- }, properties = { titlebars_enabled = true }
637 { rule = { type = "dialog" },
638 properties = { floating = true,
639 placement = awful.placement.centered
643 { rule = { class = "URxvt" },
646 size_hints_honor = false
648 { rule = { class = "URxvt", instance = "irc" },
652 callback = move_to_tag(screen.count(), screen.count() == 1 and 2 or 1)
654 { rule = { class = "Firefox", instance = "Navigator" },
658 callback = move_to_tag(screen.count() == 1 and 1 or 2, 9)
660 { rule = { class = "Firefox-esr", instance = "Navigator" },
664 callback = move_to_tag(screen.count() == 1 and 1 or 2, 9)
666 { rule = { class = "Thunderbird", instance = "Mail" },
670 callback = move_to_tag(screen.count() == 1 and 1 or 2, 8)
672 { rule = { class = "Chromium", instance = "chromium" },
676 callback = move_to_tag(screen.count() == 1 and 1 or 2, 9)
678 { rule = { class = "Gscan2pdf" },
682 callback = move_to_tag(1, 5)
684 { rule = { name = "gscan2pdf .*" },
689 { rule = { class = "Thunar", type = "normal" },
694 { rule = { class = "MuPDF", instance = "mupdf" },
699 { rule = { class = "Pinentry", instance = "pinentry" },
704 { rule = { class = "Gxmessage" },
713 -- Signal function to execute when a new client appears.
714 client.connect_signal("manage", function (c)
715 -- Set the windows at the slave,
716 -- i.e. put it at the end of others instead of setting it master.
717 if not awesome.startup then awful.client.setslave(c) end
719 if awesome.startup and
720 not c.size_hints.user_position
721 and not c.size_hints.program_position then
722 -- Prevent clients from being unreachable after screen count changes.
723 awful.placement.no_offscreen(c)
726 c.maximized_horizontal = false
727 c.maximized_vertical = false
730 -- Add a titlebar if titlebars_enabled is set to true in the rules.
731 client.connect_signal("request::titlebars", function(c)
732 -- buttons for the titlebar
733 local buttons = awful.util.table.join(
734 awful.button({ }, 1, function()
737 awful.mouse.client.move(c)
739 awful.button({ }, 3, function()
742 awful.mouse.client.resize(c)
746 awful.titlebar(c) : setup {
748 awful.titlebar.widget.iconwidget(c),
750 layout = wibox.layout.fixed.horizontal
755 widget = awful.titlebar.widget.titlewidget(c)
758 layout = wibox.layout.flex.horizontal
761 awful.titlebar.widget.floatingbutton (c),
762 awful.titlebar.widget.maximizedbutton(c),
763 awful.titlebar.widget.stickybutton (c),
764 awful.titlebar.widget.ontopbutton (c),
765 awful.titlebar.widget.closebutton (c),
766 layout = wibox.layout.fixed.horizontal()
768 layout = wibox.layout.align.horizontal
772 -- Enable sloppy focus
773 client.connect_signal("mouse::enter", function(c)
774 if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
775 and awful.client.focus.filter(c) then
780 client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
781 client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
783 awful.ewmh.add_activate_filter(function(c, context, hints)
784 if context == "ewmh" and (c.class == "Firefox-esr" or c.class == "Firefox") then return false end
787 -- vim:ft=lua:sw=4:sts=4:ts=4:et