From 07f46021d856344b5452a8ec6f4dd0c46e568f47 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Tue, 27 Oct 2009 11:16:51 +0100 Subject: [PATCH] qdb: finish getting rid of eminent Signed-off-by: Pierre Habouzit --- config/awesome/rc.lua | 343 +++++++++++++++++++++++++++--------------- 1 file changed, 222 insertions(+), 121 deletions(-) diff --git a/config/awesome/rc.lua b/config/awesome/rc.lua index 5a838ca..552b893 100644 --- a/config/awesome/rc.lua +++ b/config/awesome/rc.lua @@ -2,7 +2,8 @@ -- Include awesome library, with lots of useful function! require("awful") -require("eminent") +require("awful.autofocus") +require("awful.rules") require("vicious") require("beautiful") @@ -16,19 +17,19 @@ shift = "Shift" alt = "Mod1" control = "Control" -k_n = {} -k_m = {modkey} -k_ms = {modkey, shift} -k_ma = {modkey, alt} -k_mc = {modkey, control} -k_a = {alt} -k_ac = {alt, control} -k_c = {control} -k_cs = {control, shift} -k_s = {shift} +k_n = {} +k_m = {modkey} +k_ms = {modkey, shift} +k_ma = {modkey, alt} +k_mc = {modkey, control} +k_mcs = {modkey, control, shift} +k_a = {alt} +k_ac = {alt, control} +k_c = {control} +k_cs = {control, shift} +k_s = {shift} -- }}} - -- {{{ Markup helper functions -- Inline markup is a tad ugly, so use these functions -- to dynamically create markup. @@ -41,10 +42,17 @@ function heading(text) end -- }}} --- {{{ Functions --- Toggle whether we're viewing a tag -function tag_toggleview(tag) - tag:view(not tag:isselected()) + +-- {{{ Tags + +tags = {} +for s = 1, screen.count() do + -- Each screen has its own tag table. + local p = {} + for i = 1, 10 do + table.insert(p, "work-"..i) + end + tags[s] = awful.tag(p, s, awful.layout.suit.tile) end -- Get the screen number we're on @@ -53,22 +61,135 @@ function getscreen() return (sel and sel.screen) or mouse.screen end --- Move current client to a specific screen -function client_movetoscreen(i) - client.focus.screen = i +local mtag = { } +function mtag.getn(idx, s) + return tags[s or getscreen()][idx] +end +function mtag.viewonly (idx, s) + local t = mtag.getn(idx, s) + if t then awful.tag.viewonly(t) end +end +function mtag.viewtoggle (idx, s) + local t = mtag.getn(idx, s) + if t then awful.tag.viewtoggle(t) end end +function mtag.isoccupied(s, t) + local clients = (t and t:clients()) or {} + return #clients > 0 +end +function mtag.occupied(s) + local p = {} --- }}} --- {{{ Set tag names + if not s then s = getscreen() end + for t in pairs(tags[s]) do + t = tags[s][t] + if mtag.isoccupied(s, t) then table.insert(p, t) end + end + return p +end +function mtag.getnext(s) + if s == nil then s = getscreen() end -for s = 1, screen.count() do - eminent.newtag(s, 5) - for i = 1, 10 do - eminent.tag.name(i, s, 'work-'..i) + local p = mtag.occupied(s) + local curtag = awful.tag.selected() + + local t = 0 + + -- Get tag # + if mtag.isoccupied(s, curtag) then + for x in pairs(p) do + if curtag == p[x] then t = x end + end end + + local lasto = 1 + local o = 0 + + for x in pairs(tags[s]) do + if curtag == tags[s][x] then o = x end + if mtag.isoccupied(s, tags[s][x]) then lasto = x end + end + + -- Now: t is # in non-empty, o is # in all + if o == table.maxn(tags[s]) then + -- We're the last tag, create a new one + if t == 0 then + -- We're empty, go to first + return tags[s][1] + else + -- We're occupied, create new + return newtag() + end + else + if t == 0 then + -- We're empty, check if we're last + if o > lasto then + -- We're also later than the last non-empty + -- Wrap to first + return tags[s][1] + else + -- Nevermind, get the next + return tags[s][o+1] + end + else + -- Return next tag + return tags[s][o+1] + end + end +end +function mtag.next(s) + awful.tag.viewonly(mtag.getnext(s)) end +function mtag.movetonext(s) + local t = mtag.getnext(s) + awful.client.movetotag(t) + awful.tag.viewonly(t) +end +function mtag.getprev(s) + if s == nil then s = getscreen() end + + local p = mtag.occupied(s) + local curtag = awful.tag.selected() + + local t = 0 + + -- Get tag # + if mtag.isoccupied(s, curtag) then + for x in pairs(p) do + if curtag == p[x] then t = x end + end + end + + local lasto = 1 + local o = 0 + + for x in pairs(tags[s]) do + if curtag == tags[s][x] then o = x end + if mtag.isoccupied(s, tags[s][x]) then lasto = x end + end + + -- Now: t is # in non-empty, o is # in all + if o == 1 then + -- We're the very first tag, wrap around + return p[ table.maxn(p) ] + else + -- We're not first, just go prev + return tags[s][o-1] + end +end +function mtag.prev(s) + awful.tag.viewonly(mtag.getprev(s)) +end +function mtag.movetoprev(s) + local t = mtag.getprev(s) + awful.client.movetotag(t) + awful.tag.viewonly(t) +end + -- }}} +-- {{{ Widgets + -- {{{ Taglist maintaglist = {} @@ -78,8 +199,6 @@ maintaglist.buttons = awful.util.table.join( ) -- }}} --- {{{ Widgets - -- {{{ Load Average Widget loadwidget = widget({ type = 'textbox' }) @@ -128,7 +247,7 @@ function (widget, args) else percent = fg('red', percent) end - cpugraphwidget:add_value(r / 100) + -- cpugraphwidget:add_value(r / 100) return heading('CPU')..': '..percent..' ' end, 2) @@ -177,6 +296,7 @@ mymenubox = widget{ type = "textbox" } -- {{{ Statusbar mainstatusbar = {} +mysystray = widget({ type = "systray" }) for s = 1, screen.count() do mainstatusbar[s] = awful.wibox{ position = "top", height = 18, screen = s } @@ -188,6 +308,8 @@ for s = 1, screen.count() do awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright }), layout = awful.widget.layout.horizontal.leftright }, + s == 1 and mysystray or nil, + s == 1 and rspacer or nil, clockwidget, rspacer, memtextwidget, rspacer, cpugraphwidget, cputextwidget, rspacer, @@ -198,40 +320,29 @@ end -- }}} -- }}} - -- {{{ Keys ---- {{{ Global keys local hist = os.getenv("HOME") .. "/.cache/awesome/history" globalkeys = awful.util.table.join( -- Mod+{A/S}: Switch to prev/next tag - awful.key(k_m, "Left", eminent.tag.prev), - awful.key(k_m, "Right", eminent.tag.next), + awful.key(k_m, "Left", mtag.prev), + awful.key(k_m, "Right", mtag.next), -- Mod+Shift+{A/S}: Move window to Prev/Next tag - awful.key(k_ms, "Left", function() - awful.client.movetotag(eminent.tag.getprev()) - eminent.tag.prev() - end), - awful.key(k_ms, "Right", function() - awful.client.movetotag(eminent.tag.getnext()) - eminent.tag.next() - end), + awful.key(k_ms, "Left", mtag.movetoprev), + awful.key(k_ms, "Right", mtag.movetonext), -- Mod+Shift_{E/D}: move window to next/prev screen awful.key(k_mc, "Right", function() local s = getscreen() + 1 - while s > screen.count() do - s = s-screen.count() - end - client_movetoscreen(s) + while s > screen.count() do s = s - screen.count() end + client.focus.screen = s end), awful.key(k_mc, "Left", function() local s = getscreen() - 1 - while s < 1 do - s = s+screen.count() - end - client_movetoscreen(s) + while s < 1 do s = s + screen.count() end + client.focus.screen = s end), @@ -252,8 +363,8 @@ globalkeys = awful.util.table.join( awful.key(k_ms, "k", function () awful.client.swap.byidx(-1) end), -- Mod+{E/D}: Switch to next/previous screen - awful.key(k_m, "Tab", function () awful.screen.focus(1) end), - awful.key(k_ms, "Tab", function () awful.screen.focus(-1) end), + awful.key(k_m, "Tab", function () awful.screen.focus_relative(1) end), + awful.key(k_ms, "Tab", function () awful.screen.focus_relative(-1) end), -- Mod+Enter: Launch a new terminal awful.key(k_m, "e", function() awful.util.spawn("firefox") end), @@ -288,11 +399,11 @@ globalkeys = awful.util.table.join( awful.util.getdir("cache").."/lua_commands") end), - awful.key({}, "#192", function() eminent.tag.goto(1, nil, true) end), - awful.key({}, "#193", function() eminent.tag.goto(2, nil, true) end), - awful.key({}, "#194", function() eminent.tag.goto(3, nil, true) end), - awful.key({}, "#195", function() eminent.tag.goto(4, nil, true) end), - awful.key({}, "#196", function() eminent.tag.goto(5, nil, true) end) + awful.key({}, "#192", function() mtag.viewonly(1) end), + awful.key({}, "#193", function() mtag.viewonly(2) end), + awful.key({}, "#194", function() mtag.viewonly(3) end), + awful.key({}, "#195", function() mtag.viewonly(4) end), + awful.key({}, "#196", function() mtag.viewonly(5) end) ) -- Mod+#: Switch to tag @@ -303,28 +414,27 @@ globalkeys = awful.util.table.join( for i = 1, 10 do globalkeys = awful.util.table.join( globalkeys, - awful.key(k_m, i % 10, - function() - eminent.tag.goto(i, nil, true) - end), - - awful.key(k_ms, i % 10, - function () - local t = eminent.tag.getn(i, nil, true) - if t ~= nil then t.selected = not t.selected end - end), + awful.key(k_m, i % 10, function() mtag.viewonly(i) end), + awful.key(k_ms, i % 10, function() mtag.viewtoggle(i) end), awful.key(k_mc, i % 10, - function () - local t = eminent.tag.getn(i, nil, true) - if t ~= nil then awful.client.movetotag(t) end - end) + function () + if client.focus and tags[client.focus.screen][i] then + awful.client.movetotag(tags[client.focus.screen][i]) + end + end), + awful.key(k_mcs, i % 10, + function () + if client.focus and tags[client.focus.screen][i] then + awful.client.toggletag(tags[client.focus.screen][i]) + end + end) ) end ---- }}} ----- {{{ Client hotkeys +---- {{{ Client hotkeys / buttons -clientkeys = awful.util.table.join( +local clientkeys = awful.util.table.join( awful.key(k_m, "i", function (c) if mymenubox.text then mymenubox.text = "" @@ -336,15 +446,43 @@ clientkeys = awful.util.table.join( -- Client manipulation awful.key(k_m, "c", function (c) c:kill() end), awful.key(k_m, "o", awful.client.floating.toggle), - awful.key(k_m, "t", awful.client.togglemarked), awful.key(k_m, "F11", function (c) c.fullscreen = not c.fullscreen end) ) +local clientbuttons = awful.util.table.join( + awful.button({ }, 1, function (c) client.focus = c; c:raise() end), + awful.button(k_a, 1, awful.mouse.client.move), + awful.button(k_a, 3, awful.mouse.client.resize) +) + ---- }}} root.keys(globalkeys) -- }}} --- {{{ signals +-- {{{ Rules + +awful.rules.rules = { + -- All clients will match this rule. + { + rule = { }, + properties = { + border_width = beautiful.border_width, + border_color = beautiful.border_normal, + focus = true, + keys = clientkeys, + buttons = clientbuttons, + size_hints_honor = false, + } + }, + { rule = { class = "MPlayer" }, properties = { floating = true } }, + { rule = { class = "pinentry" }, properties = { floating = true } }, + -- Set Firefox to always map on tags number 2 of screen 1. + -- { rule = { class = "Firefox" }, + -- properties = { tag = tags[1][2] } }, +} + +-- }}} +-- {{{ Signals client.add_signal("focus", function (c) if not awful.client.ismarked(c) then @@ -358,68 +496,31 @@ client.add_signal("unfocus", function (c) end end) -client.add_signal("marked", function (c) - c.border_color = beautiful.border_marked -end) - -client.add_signal("unmarked", function (c) - c.border_color = beautiful.border_focus -end) - client.add_signal("manage", function (c, startup) - if not startup and awful.client.focus.filter(c) then - c.screen = mouse.screen - end - - -- Add mouse bindings - c:buttons(awful.util.table.join( - awful.button({ }, 1, function (c) client.focus = c; c:raise() end), - awful.button(k_a, 1, awful.mouse.client.move), - awful.button(k_a, 3, awful.mouse.client.resize) - )) - -- Enable sloppy focus c:add_signal("mouse::enter", function(c) client.focus = c end) - -- Create border - c.border_width = beautiful.border_width - c.border_color = beautiful.border_normal - - -- Make certain windows floating - local class = c.class:lower() - if class:find('pinentry') - or class:find('kcalc') - or class:find('gajim') - then - c.floating = true - end - -- Focus new clients client.focus = c - c:keys(clientkeys) - c.size_hints_honor = false end) --- Hook function to execute when arranging the screen --- (tag switch, new client, etc) -client.add_signal("arrange", function (screen) - local sel = client.focus +function warp_mouse(screen) + local c = client.focus - if not sel then - sel = awful.client.focus.history.get(screen, 0) - if not sel then return end - client.focus = sel + if c then + local o = awful.mouse.client_under_pointer() + if not o or o ~= c then + local g = c:geometry() + mouse.coords { x = g.x + 5, y = g.y + 5 } + end end +end - local o = mouse.object_under_pointer() - if not o or (type(o) == "client" and o ~= sel) then - local g = sel:geometry() - - mouse.coords { x = g.x + 5, y = g.y + 5 } - end -end) +for s = 1, screen.count() do + -- screen[s]:add_signal("arrange", warp_mouse) +end -- }}} -- 2.20.1