qdb: finish getting rid of eminent
authorPierre Habouzit <madcoder@debian.org>
Tue, 27 Oct 2009 10:16:51 +0000 (11:16 +0100)
committerPierre Habouzit <madcoder@debian.org>
Tue, 27 Oct 2009 10:16:51 +0000 (11:16 +0100)
Signed-off-by: Pierre Habouzit <madcoder@debian.org>
config/awesome/rc.lua

index 5a838ca..552b893 100644 (file)
@@ -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
 
 -- }}}