-- Include awesome library, with lots of useful function!
require("awful")
-require("eminent")
+require("awful.autofocus")
+require("awful.rules")
require("vicious")
require("beautiful")
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.
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
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 = {}
)
-- }}}
--- {{{ Widgets
-
-- {{{ Load Average Widget
loadwidget = widget({ type = 'textbox' })
else
percent = fg('red', percent)
end
- cpugraphwidget:add_value(r / 100)
+ -- cpugraphwidget:add_value(r / 100)
return heading('CPU')..': '..percent..' '
end, 2)
-- {{{ Statusbar
mainstatusbar = {}
+mysystray = widget({ type = "systray" })
for s = 1, screen.count() do
mainstatusbar[s] = awful.wibox{ position = "top", height = 18, screen = s }
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,
-- }}}
-- }}}
-
-- {{{ 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),
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),
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
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 = ""
-- 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
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
-- }}}