SHOW:
|
|
- or go back to the newest paste.
1 | --[[ | |
2 | ||
3 | Blackburn Awesome WM config 2.0 | |
4 | github.com/copycat-killer | |
5 | ||
6 | --]] | |
7 | ||
8 | -- {{{ Required libraries | |
9 | local gears = require("gears") | |
10 | local awful = require("awful") | |
11 | awful.rules = require("awful.rules") | |
12 | require("awful.autofocus") | |
13 | local wibox = require("wibox") | |
14 | local beautiful = require("beautiful") | |
15 | local naughty = require("naughty") | |
16 | local drop = require("scratchdrop") | |
17 | local lain = require("lain") | |
18 | -- }}} | |
19 | ||
20 | -- {{{ Error handling | |
21 | if awesome.startup_errors then | |
22 | naughty.notify({ preset = naughty.config.presets.critical, | |
23 | title = "Oops, there were errors during startup!", | |
24 | text = awesome.startup_errors }) | |
25 | end | |
26 | ||
27 | do | |
28 | local in_error = false | |
29 | awesome.connect_signal("debug::error", function (err) | |
30 | if in_error then return end | |
31 | in_error = true | |
32 | ||
33 | naughty.notify({ preset = naughty.config.presets.critical, | |
34 | title = "Oops, an error happened!", | |
35 | text = err }) | |
36 | in_error = false | |
37 | end) | |
38 | end | |
39 | -- }}} | |
40 | ||
41 | -- {{{ Autostart applications | |
42 | function run_once(cmd) | |
43 | findme = cmd | |
44 | firstspace = cmd:find(" ") | |
45 | if firstspace then | |
46 | findme = cmd:sub(0, firstspace-1) | |
47 | end | |
48 | awful.util.spawn_with_shell("pgrep -u $USER -x " .. findme .. " > /dev/null || (" .. cmd .. ")") | |
49 | end | |
50 | ||
51 | run_once("unclutter -idle 10") | |
52 | run_once("urxvtd") | |
53 | run_once("xrdb -merge ~/.Xresources") | |
54 | run_once("setxkbmap pl") | |
55 | run_once("mpd") | |
56 | run_once("/usr/bin/xscreensaver -no-splash &") | |
57 | run_once("/home/rlk120/.scripts/lightson.sh &") | |
58 | -- }}} | |
59 | ||
60 | -- {{{ Variable definitions | |
61 | -- localization | |
62 | os.setlocale(os.getenv("LANG")) | |
63 | ||
64 | -- home path | |
65 | homedir = os.getenv("HOME") .. "/.config/awesome/" | |
66 | ||
67 | -- beautiful init | |
68 | beautiful.init(awful.util.getdir("config") .. "/themes/blackburn/theme.lua") | |
69 | ||
70 | -- common | |
71 | modkey = "Mod4" | |
72 | altkey = "Mod1" | |
73 | terminal = "urxvtc" or "xterm" | |
74 | editor = os.getenv("EDITOR") or "nano" or "vi" | |
75 | editor_cmd = terminal .. " -e " .. editor | |
76 | ||
77 | -- user defined | |
78 | browser = "dwb" | |
79 | gui_editor = "gvim" | |
80 | graphics = "gimp" | |
81 | musicplr = terminal .. " -g 130x34-320+16 -e ncmpcpp " | |
82 | tasks = terminal .. " -e htop " | |
83 | explorer = "spacefm" | |
84 | ||
85 | local layouts = { | |
86 | awful.layout.suit.floating, | |
87 | lain.layout.uselesstile, | |
88 | awful.layout.suit.fair, | |
89 | lain.layout.uselesstile.left, | |
90 | lain.layout.uselesstile.top | |
91 | } | |
92 | -- }}} | |
93 | ||
94 | -- {{{ Tags | |
95 | tags = { | |
96 | names = { "web", "term", "docs", "media", "down"}, | |
97 | layout = { layouts[1], layouts[3], layouts[2], layouts[1], layouts[5] } | |
98 | } | |
99 | for s = 1, screen.count() do | |
100 | tags[s] = awful.tag(tags.names, s, tags.layout) | |
101 | end | |
102 | -- }}} | |
103 | ||
104 | -- {{{ Wallpaper | |
105 | if beautiful.wallpaper then | |
106 | for s = 1, screen.count() do | |
107 | gears.wallpaper.maximized(beautiful.wallpaper, s, true) | |
108 | end | |
109 | end | |
110 | -- }}} | |
111 | -- {{{ Menu | |
112 | require("freedesktop/freedesktop") | |
113 | -- }}} | |
114 | ||
115 | -- {{{ Wibox | |
116 | markup = lain.util.markup | |
117 | gray = "#9E9C9A" | |
118 | ||
119 | -- Textclock | |
120 | mytextclock = awful.widget.textclock(" %H:%M ") | |
121 | ||
122 | -- Calendar | |
123 | lain.widgets.calendar:attach(mytextclock) | |
124 | ||
125 | -- Mail IMAP check | |
126 | -- commented because it needs to be set before use | |
127 | mailwidget = lain.widgets.imap({ | |
128 | - | is_plain = true, |
128 | + | is_plain = true, |
129 | - | timeout = 5, |
129 | + | timeout = 120, |
130 | server = "imap.gmail.com", | |
131 | mail = "xorgx3@gmail.com", | |
132 | - | password = "tkoK7WR4ejshL6fz", |
132 | + | password = "mypassword", |
133 | settings = function() | |
134 | mail_notification_preset.position = "top_right" | |
135 | ||
136 | mail = "" | |
137 | count = "" | |
138 | ||
139 | if mailcount > 0 then | |
140 | mail = "Mail: " | |
141 | count = mailcount .. " " | |
142 | end | |
143 | ||
144 | widget:set_markup(markup(gray, mail) .. count) | |
145 | end | |
146 | }) | |
147 | ||
148 | ||
149 | -- MPD | |
150 | mpdwidget = lain.widgets.mpd({ | |
151 | settings = function() | |
152 | artist = mpd_now.artist .. " " | |
153 | title = mpd_now.title .. " " | |
154 | ||
155 | if mpd_now.state == "pause" then | |
156 | artist = "mpd " | |
157 | title = "paused " | |
158 | elseif mpd_now.state == "stop" then | |
159 | artist = "" | |
160 | title = "" | |
161 | end | |
162 | ||
163 | widget:set_markup(markup(gray, artist) .. title) | |
164 | end | |
165 | }) | |
166 | mpdwidget:buttons(awful.util.table.join(awful.button({ }, 1, function () awful.util.spawn_with_shell(musicplr) end))) | |
167 | ||
168 | -- /home fs | |
169 | fshome = lain.widgets.fs({ | |
170 | partition = "/home", | |
171 | settings = function() | |
172 | fs_header = "" | |
173 | fs_p = "" | |
174 | ||
175 | if fs_now.used >= 90 then | |
176 | fs_header = " Hdd " | |
177 | fs_p = fs_now.used | |
178 | end | |
179 | ||
180 | widget:set_markup(markup(gray, fs_header) .. fs_p) | |
181 | end | |
182 | }) | |
183 | ||
184 | -- Battery | |
185 | batwidget = lain.widgets.bat({ | |
186 | settings = function() | |
187 | bat_header = " Bat " | |
188 | bat_p = bat_now.perc .. " " | |
189 | ||
190 | if bat_now.status == "Not present" then | |
191 | bat_header = "" | |
192 | bat_p = "" | |
193 | end | |
194 | ||
195 | widget:set_markup(markup(gray, bat_header) .. bat_p) | |
196 | end | |
197 | }) | |
198 | ||
199 | -- ALSA volume | |
200 | volumewidget = lain.widgets.alsa({ | |
201 | settings = function() | |
202 | header = " Vol " | |
203 | level = volume_now.level | |
204 | ||
205 | if volume_now.status == "off" then | |
206 | level = "Mute " | |
207 | else | |
208 | level = level .. " " | |
209 | end | |
210 | ||
211 | widget:set_markup(markup(gray, header) .. level) | |
212 | end | |
213 | }) | |
214 | ||
215 | -- Weather | |
216 | yawn = lain.widgets.yawn(523920, | |
217 | { | |
218 | settings = function() | |
219 | widget:set_markup(" " .. units .. " ") | |
220 | end | |
221 | }) | |
222 | ||
223 | -- Separators | |
224 | first = wibox.widget.textbox('<span font="Tamsyn 4"> </span>') | |
225 | arrl_pre = wibox.widget.imagebox() | |
226 | arrl_pre:set_image(beautiful.arrl_lr_pre) | |
227 | arrl_post = wibox.widget.imagebox() | |
228 | arrl_post:set_image(beautiful.arrl_lr_post) | |
229 | ||
230 | -- Create a wibox for each screen and add it | |
231 | mywibox = {} | |
232 | mypromptbox = {} | |
233 | mylayoutbox = {} | |
234 | mytaglist = {} | |
235 | mytaglist.buttons = awful.util.table.join( | |
236 | awful.button({ }, 1, awful.tag.viewonly), | |
237 | awful.button({ modkey }, 1, awful.client.movetotag), | |
238 | awful.button({ }, 3, awful.tag.viewtoggle), | |
239 | awful.button({ modkey }, 3, awful.client.toggletag), | |
240 | awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end), | |
241 | awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end) | |
242 | ) | |
243 | mytasklist = {} | |
244 | mytasklist.buttons = awful.util.table.join( | |
245 | awful.button({ }, 1, function (c) | |
246 | if c == client.focus then | |
247 | c.minimized = true | |
248 | else | |
249 | -- Without this, the following | |
250 | -- :isvisible() makes no sense | |
251 | c.minimized = false | |
252 | if not c:isvisible() then | |
253 | awful.tag.viewonly(c:tags()[1]) | |
254 | end | |
255 | -- This will also un-minimize | |
256 | -- the client, if needed | |
257 | client.focus = c | |
258 | c:raise() | |
259 | end | |
260 | end), | |
261 | awful.button({ }, 3, function () | |
262 | if instance then | |
263 | instance:hide() | |
264 | instance = nil | |
265 | else | |
266 | instance = awful.menu.clients({ width=250 }) | |
267 | end | |
268 | end), | |
269 | awful.button({ }, 4, function () | |
270 | awful.client.focus.byidx(1) | |
271 | if client.focus then client.focus:raise() end | |
272 | end), | |
273 | awful.button({ }, 5, function () | |
274 | awful.client.focus.byidx(-1) | |
275 | if client.focus then client.focus:raise() end | |
276 | end)) | |
277 | ||
278 | for s = 1, screen.count() do | |
279 | -- Create a promptbox for each screen | |
280 | mypromptbox[s] = awful.widget.prompt() | |
281 | -- Create an imagebox widget which will contains an icon indicating which layout we're using. | |
282 | -- We need one layoutbox per screen. | |
283 | mylayoutbox[s] = awful.widget.layoutbox(s) | |
284 | mylayoutbox[s]:buttons(awful.util.table.join( | |
285 | awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), | |
286 | awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), | |
287 | awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), | |
288 | awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) | |
289 | -- Create a taglist widget | |
290 | mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons) | |
291 | ||
292 | -- Create a tasklist widget | |
293 | mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons) | |
294 | ||
295 | -- Create the wibox | |
296 | mywibox[s] = awful.wibox({ position = "top", screen = s, height = 18 }) | |
297 | ||
298 | -- Widgets that are aligned to the left | |
299 | local left_layout = wibox.layout.fixed.horizontal() | |
300 | left_layout:add(first) | |
301 | left_layout:add(mytaglist[s]) | |
302 | left_layout:add(arrl_pre) | |
303 | left_layout:add(mylayoutbox[s]) | |
304 | left_layout:add(arrl_post) | |
305 | left_layout:add(mypromptbox[s]) | |
306 | left_layout:add(first) | |
307 | ||
308 | -- Widgets that are aligned to the right | |
309 | local right_layout = wibox.layout.fixed.horizontal() | |
310 | if s == 1 then right_layout:add(wibox.widget.systray()) end | |
311 | right_layout:add(first) | |
312 | right_layout:add(mpdwidget) | |
313 | right_layout:add(mailwidget) | |
314 | right_layout:add(yawn.icon) | |
315 | right_layout:add(yawn.widget) | |
316 | right_layout:add(fshome) | |
317 | --right_layout:add(batwidget) | |
318 | right_layout:add(volumewidget) | |
319 | right_layout:add(mytextclock) | |
320 | ||
321 | -- Now bring it all together (with the tasklist in the middle) | |
322 | local layout = wibox.layout.align.horizontal() | |
323 | layout:set_left(left_layout) | |
324 | layout:set_middle(mytasklist[s]) | |
325 | layout:set_right(right_layout) | |
326 | ||
327 | mywibox[s]:set_widget(layout) | |
328 | ||
329 | -- Set proper background, instead of beautiful.bg_normal | |
330 | mywibox[s]:set_bg(beautiful.topbar_path .. screen[mouse.screen].workarea.width .. ".png") | |
331 | end | |
332 | -- }}} | |
333 | ||
334 | -- {{{ Mouse bindings | |
335 | root.buttons(awful.util.table.join( | |
336 | awful.button({ }, 3, function () mymainmenu:toggle() end), | |
337 | awful.button({ }, 4, awful.tag.viewnext), | |
338 | awful.button({ }, 5, awful.tag.viewprev) | |
339 | )) | |
340 | -- }}} | |
341 | ||
342 | -- {{{ Key bindings | |
343 | globalkeys = awful.util.table.join( | |
344 | -- Take a screenshot | |
345 | -- https://github.com/copycat-killer/dots/blob/master/bin/screenshot | |
346 | awful.key({ }, "#99", function() os.execute("screenshot") end), | |
347 | ||
348 | -- Tag browsing | |
349 | awful.key({ modkey }, "Left", awful.tag.viewprev ), | |
350 | awful.key({ modkey }, "Right", awful.tag.viewnext ), | |
351 | awful.key({ modkey }, "Escape", awful.tag.history.restore), | |
352 | ||
353 | -- Non-empty tag browsing | |
354 | awful.key({ altkey }, "Left", function () lain.util.tag_view_nonempty(-1) end), | |
355 | awful.key({ altkey }, "Right", function () lain.util.tag_view_nonempty(1) end), | |
356 | ||
357 | -- Default client focus | |
358 | awful.key({ altkey }, "k", | |
359 | function () | |
360 | awful.client.focus.byidx( 1) | |
361 | if client.focus then client.focus:raise() end | |
362 | end), | |
363 | awful.key({ altkey }, "j", | |
364 | function () | |
365 | awful.client.focus.byidx(-1) | |
366 | if client.focus then client.focus:raise() end | |
367 | end), | |
368 | ||
369 | -- By direction client focus | |
370 | awful.key({ modkey }, "j", | |
371 | function() | |
372 | awful.client.focus.bydirection("down") | |
373 | if client.focus then client.focus:raise() end | |
374 | end), | |
375 | awful.key({ modkey }, "k", | |
376 | function() | |
377 | awful.client.focus.bydirection("up") | |
378 | if client.focus then client.focus:raise() end | |
379 | end), | |
380 | awful.key({ modkey }, "h", | |
381 | function() | |
382 | awful.client.focus.bydirection("left") | |
383 | if client.focus then client.focus:raise() end | |
384 | end), | |
385 | awful.key({ modkey }, "l", | |
386 | function() | |
387 | awful.client.focus.bydirection("right") | |
388 | if client.focus then client.focus:raise() end | |
389 | end), | |
390 | ||
391 | -- Show Menu | |
392 | awful.key({ modkey }, "w", | |
393 | function () | |
394 | mymainmenu:show({ keygrabber = true }) | |
395 | end), | |
396 | ||
397 | -- Show/Hide Wibox | |
398 | awful.key({ modkey }, "b", function () | |
399 | mywibox[mouse.screen].visible = not mywibox[mouse.screen].visible | |
400 | end), | |
401 | ||
402 | -- On the fly useless gaps change | |
403 | awful.key({ altkey, "Control" }, "+", function () lain.util.useless_gaps_resize(1) end), | |
404 | awful.key({ altkey, "Control" }, "-", function () lain.util.useless_gaps_resize(-1) end), | |
405 | ||
406 | -- Layout manipulation | |
407 | awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), | |
408 | awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), | |
409 | awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), | |
410 | awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), | |
411 | awful.key({ modkey, }, "u", awful.client.urgent.jumpto), | |
412 | awful.key({ modkey, }, "Tab", | |
413 | function () | |
414 | awful.client.focus.history.previous() | |
415 | if client.focus then | |
416 | client.focus:raise() | |
417 | end | |
418 | end), | |
419 | awful.key({ altkey, "Shift" }, "l", function () awful.tag.incmwfact( 0.05) end), | |
420 | awful.key({ altkey, "Shift" }, "h", function () awful.tag.incmwfact(-0.05) end), | |
421 | awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), | |
422 | awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), | |
423 | awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), | |
424 | awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), | |
425 | awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), | |
426 | awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), | |
427 | awful.key({ modkey, "Control" }, "n", awful.client.restore), | |
428 | ||
429 | -- Standard program | |
430 | awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), | |
431 | awful.key({ altkey, modkey, "Control" }, "r", awesome.restart), | |
432 | awful.key({ modkey, "Shift" }, "q", awesome.quit), | |
433 | ||
434 | -- Dropdown terminal | |
435 | -- awful.key({ modkey, }, "z", function () drop(terminal) end), | |
436 | ||
437 | -- Widgets popups | |
438 | awful.key({ altkey, }, "c", function () lain.widgets.calendar:show(7) end), | |
439 | awful.key({ altkey, }, "h", function () fshome.show(7) end), | |
440 | awful.key({ altkey, }, "w", function () yawn.show(7) end), | |
441 | ||
442 | -- ALSA volume control | |
443 | --[[awful.key({ altkey }, "Up", | |
444 | function () | |
445 | awful.util.spawn("amixer -q set Master 1%+") | |
446 | volumewidget.update() | |
447 | end), | |
448 | awful.key({ altkey }, "Down", | |
449 | function () | |
450 | awful.util.spawn("amixer -q set Master 1%-") | |
451 | volumewidget.update() | |
452 | end), | |
453 | awful.key({ altkey }, "m", | |
454 | function () | |
455 | awful.util.spawn("amixer -q set Master playback toggle") | |
456 | volumewidget.update() | |
457 | end), | |
458 | awful.key({ altkey, "Control" }, "m", | |
459 | function () | |
460 | awful.util.spawn("amixer -q set Master playback 100%") | |
461 | volumewidget.update() | |
462 | end),]] | |
463 | awful.key({ }, "XF86AudioRaiseVolume", function () | |
464 | awful.util.spawn("amixer -q set Master 2+ unmute", false ) | |
465 | volumewidget.update() | |
466 | end), | |
467 | awful.key({ }, "XF86AudioLowerVolume", function () | |
468 | awful.util.spawn("amixer -q set Master 2- unmute", false ) | |
469 | volumewidget.update() | |
470 | end), | |
471 | awful.key({ }, "XF86AudioMute", function () | |
472 | awful.util.spawn("amixer set Master toggle", false ) | |
473 | volumewidget.update() | |
474 | end), | |
475 | ||
476 | -- MPD control | |
477 | awful.key({ }, "#172", | |
478 | function () | |
479 | awful.util.spawn_with_shell("mpc toggle || ncmpcpp toggle || ncmpc toggle || pms toggle") | |
480 | mpdwidget.update() | |
481 | end), | |
482 | awful.key({}, "#174", | |
483 | function () | |
484 | awful.util.spawn_with_shell("mpc stop || ncmpcpp stop || ncmpc stop || pms stop") | |
485 | mpdwidget.update() | |
486 | end), | |
487 | awful.key({}, "#173", | |
488 | function () | |
489 | awful.util.spawn_with_shell("mpc prev || ncmpcpp prev || ncmpc prev || pms prev") | |
490 | mpdwidget.update() | |
491 | end), | |
492 | awful.key({}, "#171", | |
493 | function () | |
494 | awful.util.spawn_with_shell("mpc next || ncmpcpp next || ncmpc next || pms next") | |
495 | mpdwidget.update() | |
496 | end), | |
497 | ||
498 | -- Copy to clipboard | |
499 | awful.key({ modkey }, "c", function () os.execute("xsel -p -o | xsel -i -b") end), | |
500 | ||
501 | -- User programs | |
502 | awful.key({ modkey }, "q", function () awful.util.spawn(browser) end), | |
503 | awful.key({ modkey }, "s", function () awful.util.spawn(gui_editor) end), | |
504 | awful.key({ modkey }, "g", function () awful.util.spawn(graphics) end), | |
505 | awful.key({ }, "#148", function () awful.util.spawn("speedcrunch", false) end), | |
506 | awful.key({ modkey }, "e", function () awful.util.spawn(explorer) end), | |
507 | ||
508 | --shutdown | |
509 | awful.key({}, "#150", function () awful.util.spawn("systemctl suspend", false) end), | |
510 | awful.key({ modkey, "Control" }, "#22", function () awful.util.spawn("systemctl shutdown", false) end), | |
511 | awful.key({ modkey, "Control" }, "r", function () awful.util.spawn("systemctl reboot", false) end), | |
512 | ||
513 | -- Prompt | |
514 | awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end), | |
515 | awful.key({ modkey }, "x", | |
516 | function () | |
517 | awful.prompt.run({ prompt = "Run Lua code: " }, | |
518 | mypromptbox[mouse.screen].widget, | |
519 | awful.util.eval, nil, | |
520 | awful.util.getdir("cache") .. "/history_eval") | |
521 | end) | |
522 | ) | |
523 | ||
524 | clientkeys = awful.util.table.join( | |
525 | awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), | |
526 | awful.key({ altkey }, "q", function (c) c:kill() end), | |
527 | awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), | |
528 | awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), | |
529 | awful.key({ modkey, }, "o", awful.client.movetoscreen ), | |
530 | awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), | |
531 | awful.key({ modkey, }, "n", | |
532 | function (c) | |
533 | -- The client currently has the input focus, so it cannot be | |
534 | -- minimized, since minimized clients can't have the focus. | |
535 | c.minimized = true | |
536 | end), | |
537 | awful.key({ modkey, }, "m", | |
538 | function (c) | |
539 | c.maximized_horizontal = not c.maximized_horizontal | |
540 | c.maximized_vertical = not c.maximized_vertical | |
541 | end) | |
542 | ) | |
543 | ||
544 | -- Bind all key numbers to tags. | |
545 | -- Be careful: we use keycodes to make it works on any keyboard layout. | |
546 | -- This should map on the top row of your keyboard, usually 1 to 9. | |
547 | for i = 1, 9 do | |
548 | globalkeys = awful.util.table.join(globalkeys, | |
549 | awful.key({ modkey }, "#" .. i + 9, | |
550 | function () | |
551 | local screen = mouse.screen | |
552 | local tag = awful.tag.gettags(screen)[i] | |
553 | if tag then | |
554 | awful.tag.viewonly(tag) | |
555 | end | |
556 | end), | |
557 | awful.key({ modkey, "Control" }, "#" .. i + 9, | |
558 | function () | |
559 | local screen = mouse.screen | |
560 | local tag = awful.tag.gettags(screen)[i] | |
561 | if tag then | |
562 | awful.tag.viewtoggle(tag) | |
563 | end | |
564 | end), | |
565 | awful.key({ modkey, "Shift" }, "#" .. i + 9, | |
566 | function () | |
567 | local tag = awful.tag.gettags(client.focus.screen)[i] | |
568 | if client.focus and tag then | |
569 | awful.client.movetotag(tag) | |
570 | end | |
571 | end), | |
572 | awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, | |
573 | function () | |
574 | local tag = awful.tag.gettags(client.focus.screen)[i] | |
575 | if client.focus and tag then | |
576 | awful.client.toggletag(tag) | |
577 | end | |
578 | end)) | |
579 | end | |
580 | ||
581 | clientbuttons = awful.util.table.join( | |
582 | awful.button({ }, 1, function (c) client.focus = c; c:raise() end), | |
583 | awful.button({ modkey }, 1, awful.mouse.client.move), | |
584 | awful.button({ modkey }, 3, awful.mouse.client.resize)) | |
585 | ||
586 | -- Set keys | |
587 | root.keys(globalkeys) | |
588 | -- }}} | |
589 | ||
590 | -- {{{ Rules | |
591 | awful.rules.rules = { | |
592 | -- All clients will match this rule. | |
593 | { rule = { }, | |
594 | properties = { border_width = beautiful.border_width, | |
595 | border_color = beautiful.border_normal, | |
596 | focus = awful.client.focus.filter, | |
597 | keys = clientkeys, | |
598 | buttons = clientbuttons, | |
599 | size_hints_honor = false } }, | |
600 | { rule = { class = "URxvt" }, | |
601 | properties = { opacity = 0.99 } }, | |
602 | ||
603 | { rule = { class = "MPlayer" }, | |
604 | properties = { floating = true } }, | |
605 | ||
606 | { rule = { class = "Dwb" }, | |
607 | properties = { tag = tags[1][1] } }, | |
608 | ||
609 | { rule = { class = "Iron" }, | |
610 | properties = { tag = tags[1][1] } }, | |
611 | ||
612 | { rule = { instance = "plugin-container" }, | |
613 | properties = { tag = tags[1][1] } }, | |
614 | ||
615 | { rule = { class = "Gimp" }, | |
616 | properties = { tag = tags[1][4] } }, | |
617 | ||
618 | { rule = { class = "Gimp", role = "gimp-image-window" }, | |
619 | properties = { maximized_horizontal = true, | |
620 | maximized_vertical = true } }, | |
621 | } | |
622 | -- }}} | |
623 | ||
624 | -- {{{ Signals | |
625 | -- Signal function to execute when a new client appears. | |
626 | client.connect_signal("manage", function (c, startup) | |
627 | -- Enable sloppy focus | |
628 | c:connect_signal("mouse::enter", function(c) | |
629 | if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier | |
630 | and awful.client.focus.filter(c) then | |
631 | client.focus = c | |
632 | end | |
633 | end) | |
634 | ||
635 | if not startup and not c.size_hints.user_position | |
636 | and not c.size_hints.program_position then | |
637 | awful.placement.no_overlap(c) | |
638 | awful.placement.no_offscreen(c) | |
639 | end | |
640 | end) | |
641 | ||
642 | -- No border for maximized clients | |
643 | client.connect_signal("focus", | |
644 | function(c) | |
645 | if c.maximized_horizontal == true and c.maximized_vertical == true then | |
646 | c.border_width = 0 | |
647 | c.border_color = beautiful.border_normal | |
648 | else | |
649 | c.border_width = beautiful.border_width | |
650 | c.border_color = beautiful.border_focus | |
651 | end | |
652 | end) | |
653 | client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) | |
654 | -- }}} | |
655 | ||
656 | -- {{{ Arrange signal handler | |
657 | for s = 1, screen.count() do screen[s]:connect_signal("arrange", function () | |
658 | local clients = awful.client.visible(s) | |
659 | local layout = awful.layout.getname(awful.layout.get(s)) | |
660 | ||
661 | if #clients > 0 then -- Fine grained borders and floaters control | |
662 | for _, c in pairs(clients) do -- Floaters always have borders | |
663 | if awful.client.floating.get(c) or layout == "floating" then | |
664 | c.border_width = beautiful.border_width | |
665 | ||
666 | -- No borders with only one visible client | |
667 | elseif #clients == 1 or layout == "max" then | |
668 | clients[1].border_width = 0 | |
669 | awful.client.moveresize(0, 0, 2, 2, clients[1]) | |
670 | else | |
671 | c.border_width = beautiful.border_width | |
672 | end | |
673 | end | |
674 | end | |
675 | end) | |
676 | end | |
677 | -- }}} |