diff --git a/lib/awful/widget.lua.in b/lib/awful/widget.lua.in
deleted file mode 100644
index 94dd8140..00000000
--- a/lib/awful/widget.lua.in
+++ /dev/null
@@ -1,453 +0,0 @@
----------------------------------------------------------------------------
--- @author Julien Danjou <julien@danjou.info>
--- @copyright 2008 Julien Danjou
--- @release @AWESOME_VERSION@
----------------------------------------------------------------------------
-
--- Grab environment we need
-local ipairs = ipairs
-local pairs = pairs
-local table = table
-local otable = otable
-local type = type
-local math = math
-local capi =
-{
- screen = screen,
- client = client,
- button = button,
- widget = widget,
- image = image,
- mouse = mouse
-}
-local util = require("awful.util")
-local hooks = require("awful.hooks")
-local beautiful = require("beautiful")
-local menu = require("awful.menu")
-local client = require("awful.client")
-local tag = require("awful.tag")
-
---- Widget module for awful
-module("awful.widget")
-
--- Various public structures
-taglist = {}
-taglist.label = {}
-tasklist = {}
-tasklist.label = {}
-
--- Private structures
-local tagwidgets = otable()
-
-local function list_update(w, buttons, label, data, widgets, objects)
- -- Hack: if it has been registered as a widget in a wibox,
- -- it's w.len since __len meta does not work on table until Lua 5.2.
- -- Otherwise it's standard #w.
- local len = (w.len or #w) / 2
- -- Add more widgets
- if len < #objects then
- for i = len * 2 + 1, #objects * 2, 2 do
- local ib = capi.widget({ type = "imagebox", align = widgets.imagebox.align })
- local tb = capi.widget({ type = "textbox", align = widgets.textbox.align })
-
- w[i] = ib
- w[i + 1] = tb
- w[i + 1]:margin({ left = widgets.textbox.margin.left, right = widgets.textbox.margin.right })
- w[i + 1].bg_resize = widgets.textbox.bg_resize or false
- w[i + 1].bg_align = widgets.textbox.bg_align or ""
-
- if type(objects[math.floor(i / 2) + 1]) == "tag" then
- tagwidgets[ib] = objects[math.floor(i / 2) + 1]
- tagwidgets[tb] = objects[math.floor(i / 2) + 1]
- end
- end
- -- Remove widgets
- elseif len > #objects then
- for i = #objects * 2 + 1, len * 2, 2 do
- w[i] = nil
- w[i + 1] = nil
- end
- end
-
- -- update widgets text
- for k = 1, #objects * 2, 2 do
- local o = objects[(k + 1) / 2]
- if buttons then
- if not data[o] then
- data[o] = { }
- -- Replace press function by a new one calling with object as
- -- argument
- for kb, b in ipairs(buttons) do
- -- Copy object
- data[o][kb] = capi.button(b)
- data[o][kb].press = function () b.press(o) end
- end
- end
- w[k]:buttons(data[o])
- w[k + 1]:buttons(data[o])
- end
-
- local text, bg, bg_image, icon = label(o)
- w[k + 1].text, w[k + 1].bg, w[k + 1].bg_image = text, bg, bg_image
- w[k].bg, w[k].image = bg, icon
- if not w[k + 1].text then
- w[k+1].visible = false
- else
- w[k+1].visible = true
- end
- if not w[k].image then
- w[k].visible = false
- else
- w[k].visible = true
- end
- end
-end
-
-local function taglist_update (screen, w, label, buttons, data, widgets)
- local tags = capi.screen[screen]:tags()
-
- list_update(w, buttons, label, data, widgets, tags)
-end
-
---- Get the tag object the given widget appears on.
--- @param widget The widget the look for.
--- @return The tag object.
-function taglist.gettag(widget)
- return tagwidgets[widget]
-end
-
---- Create a new taglist widget.
--- @param screen The screen to draw tag list for.
--- @param label Label function to use.
--- @param buttons A table with buttons binding to set.
-function taglist.new(screen, label, buttons)
- local w = {}
- local widgets = { }
- widgets.imagebox = { }
- widgets.textbox = { ["margin"] = { ["left"] = 0,
- ["right"] = 0},
- ["bg_resize"] = true
- }
- local data = otable()
- local u = function (s)
- if s == screen then
- taglist_update(s, w, label, buttons, data, widgets)
- end
- end
- local uc = function (c) return u(c.screen) end
- hooks.focus.register(uc)
- hooks.unfocus.register(uc)
- hooks.arrange.register(u)
- hooks.tags.register(u)
- hooks.tagged.register(uc)
- hooks.property.register(function (c, prop)
- if prop == "urgent" then
- u(c.screen)
- end
- end)
- -- Free data on tag removal
- hooks.tags.register(function (s, tag, action)
- if action == "remove" then data[tag] = nil end
- end)
- u(screen)
- return w
-end
-
---- Return labels for a taglist widget with all tag from screen.
--- It returns the tag name and set a special
--- foreground and background color for selected tags.
--- @param t The tag.
--- @param args The arguments table.
--- bg_focus The background color for selected tag.
--- fg_focus The foreground color for selected tag.
--- bg_urgent The background color for urgent tags.
--- fg_urgent The foreground color for urgent tags.
--- squares_sel Optional: a user provided image for selected squares.
--- squares_unsel Optional: a user provided image for unselected squares.
--- squares_resize Optional: true or false to resize squares.
--- @return A string to print, a background color, a background image and a
--- background resize value.
-function taglist.label.all(t, args)
- if not args then args = {} end
- local theme = beautiful.get()
- local fg_focus = args.fg_focus or theme.taglist_fg_focus or theme.fg_focus
- local bg_focus = args.bg_focus or theme.taglist_bg_focus or theme.bg_focus
- local fg_urgent = args.fg_urgent or theme.taglist_fg_urgent or theme.fg_urgent
- local bg_urgent = args.bg_urgent or theme.taglist_bg_urgent or theme.bg_urgent
- local taglist_squares_sel = args.squares_sel or theme.taglist_squares_sel
- local taglist_squares_unsel = args.squares_unsel or theme.taglist_squares_unsel
- local taglist_squares_resize = theme.taglist_squares_resize or args.squares_resize or "true"
- local font = args.font or theme.taglist_font or theme.font or ""
- local text = ""
- local sel = capi.client.focus
- local bg_color = nil
- local fg_color = nil
- local bg_image
- local icon
- local bg_resize = false
- if t.selected then
- bg_color = bg_focus
- fg_color = fg_focus
- end
- if sel and sel:tags()[t] then
- if taglist_squares_sel then
- bg_image = capi.image(taglist_squares_sel)
- bg_resize = taglist_squares_resize == "true"
- end
- else
- local cls = t:clients()
- if #cls > 0 and taglist_squares_unsel then
- bg_image = capi.image(taglist_squares_unsel)
- bg_resize = taglist_squares_resize == "true"
- end
- for k, c in pairs(cls) do
- if c.urgent then
- if bg_urgent then bg_color = bg_urgent end
- if fg_urgent then fg_color = fg_urgent end
- break
- end
- end
- end
- local taglist_squares = false
- if taglist_squares_sel or taglist_squares_unsel then
- taglist_squares = true
- end
- if t.name then
- if fg_color then
- text = text .. ""
- if taglist_squares then
- text = text .. " "
- end
- text = text..util.escape(t.name).." "
- else
- if taglist_squares then
- text = text .. " "
- end
- text = text .. util.escape(t.name) .. " "
- end
- elseif taglist_squares then
- text = text .. " "
- end
- text = text .. ""
- if tag.geticon(t) and type(tag.geticon(t)) == "image" then
- icon = tag.geticon(t)
- elseif tag.geticon(t) then
- icon = capi.image(tag.geticon(t))
- end
-
- return text, bg_color, bg_image, icon
-end
-
---- Return labels for a taglist widget with all *non empty* tags from screen.
--- It returns the tag name and set a special
--- foreground and background color for selected tags.
--- @param t The tag.
--- @param args The arguments table.
--- bg_focus The background color for selected tag.
--- fg_focus The foreground color for selected tag.
--- bg_urgent The background color for urgent tags.
--- fg_urgent The foreground color for urgent tags.
--- @return A string to print, a background color, a background image and a
--- background resize value.
-function taglist.label.noempty(t, args)
- if #t:clients() > 0 or t.selected then
- return taglist.label.all(t, args)
- end
-end
-
-local function tasklist_update(w, buttons, label, data, widgets)
- local clients = capi.client.get()
- local shownclients = {}
- for k, c in ipairs(clients) do
- if not (c.skip_taskbar or c.hide
- or c.type == "splash" or c.type == "dock" or c.type == "desktop") then
- table.insert(shownclients, c)
- end
- end
- clients = shownclients
-
- list_update(w, buttons, label, data, widgets, clients)
-end
-
---- Create a new tasklist widget.
--- @param label Label function to use.
--- @param buttons A table with buttons binding to set.
-function tasklist.new(label, buttons)
- local w = {}
- local widgets = { }
- widgets.imagebox = { ["align"] = "flex" }
- widgets.textbox = { ["align"] = "flex",
- ["margin"] = { ["left"] = 2,
- ["right"] = 2 },
- ["bg_resize"] = true,
- ["bg_align"] = "right"
- }
- local data = otable()
- local u = function () tasklist_update(w, buttons, label, data, widgets) end
- hooks.arrange.register(u)
- hooks.clients.register(u)
- hooks.tagged.register(u)
- hooks.focus.register(u)
- hooks.unfocus.register(u)
- hooks.property.register(function (c, prop)
- if prop == "urgent"
- or prop == "floating"
- or prop == "maximized_horizontal"
- or prop == "maximized_vertical"
- or prop == "icon"
- or prop == "name"
- or prop == "icon_name" then
- u()
- end
- end)
- u()
- -- Free data on unmanage
- hooks.unmanage.register(function (c) data[c] = nil end)
- return w
-end
-
-local function widget_tasklist_label_common(c, args)
- if not args then args = {} end
- local theme = beautiful.get()
- local fg_focus = args.fg_focus or theme.tasklist_fg_focus or theme.fg_focus
- local bg_focus = args.bg_focus or theme.tasklist_bg_focus or theme.bg_focus
- local fg_urgent = args.fg_urgent or theme.tasklist_fg_urgent or theme.fg_urgent
- local bg_urgent = args.bg_urgent or theme.tasklist_bg_urgent or theme.bg_urgent
- local fg_minimize = args.fg_minimize or theme.tasklist_fg_minimize or theme.fg_minimize
- local bg_minimize = args.bg_minimize or theme.tasklist_bg_minimize or theme.bg_minimize
- local floating_icon = args.floating_icon or theme.tasklist_floating_icon
- local font = args.font or theme.tasklist_font or theme.font or ""
- local bg = nil
- local text = ""
- local name
- local status_image
- if client.floating.get(c) and floating_icon then
- status_image = capi.image(floating_icon)
- end
- if c.minimized then
- name = util.escape(c.icon_name) or util.escape("")
- else
- name = util.escape(c.name) or util.escape("")
- end
- if capi.client.focus == c then
- bg = bg_focus
- if fg_focus then
- text = text .. ""..name..""
- else
- text = text .. name
- end
- elseif c.urgent and fg_urgent then
- bg = bg_urgent
- text = text .. ""..name..""
- elseif c.minimized and fg_minimize and bg_minimize then
- bg = bg_minimize
- text = text .. ""..name..""
- else
- text = text .. name
- end
- text = text .. ""
- return text, bg, status_image, c.icon
-end
-
---- Return labels for a tasklist widget with clients from all tags and screen.
--- It returns the client name and set a special
--- foreground and background color for focused client.
--- It also puts a special icon for floating windows.
--- @param c The client.
--- @param screen The screen we are drawing on.
--- @param args The arguments table.
--- bg_focus The background color for focused client.
--- fg_focus The foreground color for focused client.
--- bg_urgent The background color for urgent clients.
--- fg_urgent The foreground color for urgent clients.
--- @return A string to print, a background color and a status image.
-function tasklist.label.allscreen(c, screen, args)
- return widget_tasklist_label_common(c, args)
-end
-
---- Return labels for a tasklist widget with clients from all tags.
--- It returns the client name and set a special
--- foreground and background color for focused client.
--- It also puts a special icon for floating windows.
--- @param c The client.
--- @param screen The screen we are drawing on.
--- @param args The arguments table.
--- bg_focus The background color for focused client.
--- fg_focus The foreground color for focused client.
--- bg_urgent The background color for urgent clients.
--- fg_urgent The foreground color for urgent clients.
--- @return A string to print, a background color and a status image.
-function tasklist.label.alltags(c, screen, args)
- -- Only print client on the same screen as this widget
- if c.screen ~= screen then return end
- return widget_tasklist_label_common(c, args)
-end
-
---- Return labels for a tasklist widget with clients from currently selected tags.
--- It returns the client name and set a special
--- foreground and background color for focused client.
--- It also puts a special icon for floating windows.
--- @param c The client.
--- @param screen The screen we are drawing on.
--- @param args The arguments table.
--- bg_focus The background color for focused client.
--- fg_focus The foreground color for focused client.
--- bg_urgent The background color for urgent clients.
--- fg_urgent The foreground color for urgent clients.
--- @return A string to print, a background color and a status image.
-function tasklist.label.currenttags(c, screen, args)
- -- Only print client on the same screen as this widget
- if c.screen ~= screen then return end
- for k, t in ipairs(capi.screen[screen]:tags()) do
- if t.selected and c:tags()[t] then
- return widget_tasklist_label_common(c, args)
- end
- end
-end
-
---- Create a button widget. When clicked, the image is deplaced to make it like
--- a real button.
--- @param args Standard widget table arguments, plus image for the image path or
--- the image object.
--- @return A textbox widget configured as a button.
-function button(args)
- if not args or not args.image then return end
- local img_release
- if type(args.image) == "string" then
- img_release = capi.image(args.image)
- elseif type(args.image) == "image" then
- img_release = args.image
- else
- return
- end
- local img_press = img_release:crop(-2, -2, img_release.width, img_release.height)
- args.type = "imagebox"
- local w = capi.widget(args)
- w.image = img_release
- w:buttons({ capi.button({}, 1, function () w.image = img_press end, function () w.image = img_release end) })
- function w.mouse_leave(s) w.image = img_release end
- function w.mouse_enter(s) if capi.mouse.coords().buttons[1] then w.image = img_press end end
- return w
-end
-
---- Create a button widget which will launch a command.
--- @param args Standard widget table arguments, plus image for the image path
--- and command for the command to run on click, or either menu to create menu.
--- @return A launcher widget.
-function launcher(args)
- if not args.command and not args.menu then return end
- local w = button(args)
- if not w then return end
- local b = w:buttons()
-
- if args.command then
- b[#b + 1] = capi.button({}, 1, nil, function () util.spawn(args.command) end)
- elseif args.menu then
- b[#b + 1] = capi.button({}, 1, nil, function () args.menu:toggle() end)
- end
-
- w:buttons(b)
- return w
-end
-
--- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
diff --git a/lib/awful/widget/button.lua.in b/lib/awful/widget/button.lua.in
new file mode 100644
index 00000000..2e5bd345
--- /dev/null
+++ b/lib/awful/widget/button.lua.in
@@ -0,0 +1,43 @@
+---------------------------------------------------------------------------
+-- @author Julien Danjou <julien@danjou.info>
+-- @copyright 2008-2009 Julien Danjou
+-- @release @AWESOME_VERSION@
+---------------------------------------------------------------------------
+
+local setmetatable = setmetatable
+local type = type
+local capi = { image = image,
+ widget = widget,
+ mouse = mouse,
+ button = button }
+
+module("awful.widget.button")
+
+--- Create a button widget. When clicked, the image is deplaced to make it like
+-- a real button.
+-- @param args Standard widget table arguments, plus image for the image path or
+-- the image object.
+-- @return A textbox widget configured as a button.
+function new(_, args)
+ if not args or not args.image then return end
+ local img_release
+ if type(args.image) == "string" then
+ img_release = capi.image(args.image)
+ elseif type(args.image) == "image" then
+ img_release = args.image
+ else
+ return
+ end
+ local img_press = img_release:crop(-2, -2, img_release.width, img_release.height)
+ args.type = "imagebox"
+ local w = capi.widget(args)
+ w.image = img_release
+ w:buttons({ capi.button({}, 1, function () w.image = img_press end, function () w.image = img_release end) })
+ function w.mouse_leave(s) w.image = img_release end
+ function w.mouse_enter(s) if capi.mouse.coords().buttons[1] then w.image = img_press end end
+ return w
+end
+
+setmetatable(_M, { __call = new })
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
diff --git a/lib/awful/widget/common.lua.in b/lib/awful/widget/common.lua.in
new file mode 100644
index 00000000..a94fb866
--- /dev/null
+++ b/lib/awful/widget/common.lua.in
@@ -0,0 +1,85 @@
+---------------------------------------------------------------------------
+-- @author Julien Danjou <julien@danjou.info>
+-- @copyright 2008-2009 Julien Danjou
+-- @release @AWESOME_VERSION@
+---------------------------------------------------------------------------
+
+-- Grab environment we need
+local math = math
+local type = type
+local otable = otable
+local ipairs = ipairs
+local capi = { widget = widget,
+ button = button }
+
+--- Common widget code
+module("awful.widget.common")
+
+-- Private structures
+tagwidgets = otable()
+
+function list_update(w, buttons, label, data, widgets, objects)
+ -- Hack: if it has been registered as a widget in a wibox,
+ -- it's w.len since __len meta does not work on table until Lua 5.2.
+ -- Otherwise it's standard #w.
+ local len = (w.len or #w) / 2
+ -- Add more widgets
+ if len < #objects then
+ for i = len * 2 + 1, #objects * 2, 2 do
+ local ib = capi.widget({ type = "imagebox", align = widgets.imagebox.align })
+ local tb = capi.widget({ type = "textbox", align = widgets.textbox.align })
+
+ w[i] = ib
+ w[i + 1] = tb
+ w[i + 1]:margin({ left = widgets.textbox.margin.left, right = widgets.textbox.margin.right })
+ w[i + 1].bg_resize = widgets.textbox.bg_resize or false
+ w[i + 1].bg_align = widgets.textbox.bg_align or ""
+
+ if type(objects[math.floor(i / 2) + 1]) == "tag" then
+ tagwidgets[ib] = objects[math.floor(i / 2) + 1]
+ tagwidgets[tb] = objects[math.floor(i / 2) + 1]
+ end
+ end
+ -- Remove widgets
+ elseif len > #objects then
+ for i = #objects * 2 + 1, len * 2, 2 do
+ w[i] = nil
+ w[i + 1] = nil
+ end
+ end
+
+ -- update widgets text
+ for k = 1, #objects * 2, 2 do
+ local o = objects[(k + 1) / 2]
+ if buttons then
+ if not data[o] then
+ data[o] = { }
+ -- Replace press function by a new one calling with object as
+ -- argument
+ for kb, b in ipairs(buttons) do
+ -- Copy object
+ data[o][kb] = capi.button(b)
+ data[o][kb].press = function () b.press(o) end
+ end
+ end
+ w[k]:buttons(data[o])
+ w[k + 1]:buttons(data[o])
+ end
+
+ local text, bg, bg_image, icon = label(o)
+ w[k + 1].text, w[k + 1].bg, w[k + 1].bg_image = text, bg, bg_image
+ w[k].bg, w[k].image = bg, icon
+ if not w[k + 1].text then
+ w[k+1].visible = false
+ else
+ w[k+1].visible = true
+ end
+ if not w[k].image then
+ w[k].visible = false
+ else
+ w[k].visible = true
+ end
+ end
+end
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
diff --git a/lib/awful/widget/init.lua.in b/lib/awful/widget/init.lua.in
new file mode 100644
index 00000000..0451385a
--- /dev/null
+++ b/lib/awful/widget/init.lua.in
@@ -0,0 +1,15 @@
+---------------------------------------------------------------------------
+-- @author Julien Danjou <julien@danjou.info>
+-- @copyright 2008-2009 Julien Danjou
+-- @release @AWESOME_VERSION@
+---------------------------------------------------------------------------
+
+require("awful.widget.taglist")
+require("awful.widget.tasklist")
+require("awful.widget.button")
+require("awful.widget.launcher")
+
+--- Widget module for awful
+module("awful.widget")
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
diff --git a/lib/awful/widget/launcher.lua.in b/lib/awful/widget/launcher.lua.in
new file mode 100644
index 00000000..1ad63c93
--- /dev/null
+++ b/lib/awful/widget/launcher.lua.in
@@ -0,0 +1,36 @@
+---------------------------------------------------------------------------
+-- @author Julien Danjou <julien@danjou.info>
+-- @copyright 2008-2009 Julien Danjou
+-- @release @AWESOME_VERSION@
+---------------------------------------------------------------------------
+
+local setmetatable = setmetatable
+local capi = { button = button }
+local util = require("awful.util")
+local button = require("awful.widget.button")
+
+module("awful.widget.launcher")
+
+--- Create a button widget which will launch a command.
+-- @param args Standard widget table arguments, plus image for the image path
+-- and command for the command to run on click, or either menu to create menu.
+-- @return A launcher widget.
+local function new(_, args)
+ if not args.command and not args.menu then return end
+ local w = button(args)
+ if not w then return end
+ local b = w:buttons()
+
+ if args.command then
+ b[#b + 1] = capi.button({}, 1, nil, function () util.spawn(args.command) end)
+ elseif args.menu then
+ b[#b + 1] = capi.button({}, 1, nil, function () args.menu:toggle() end)
+ end
+
+ w:buttons(b)
+ return w
+end
+
+setmetatable(_M, { __call = new })
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
diff --git a/lib/awful/widget/taglist.lua.in b/lib/awful/widget/taglist.lua.in
new file mode 100644
index 00000000..4d339b9d
--- /dev/null
+++ b/lib/awful/widget/taglist.lua.in
@@ -0,0 +1,177 @@
+---------------------------------------------------------------------------
+-- @author Julien Danjou <julien@danjou.info>
+-- @copyright 2008-2009 Julien Danjou
+-- @release @AWESOME_VERSION@
+---------------------------------------------------------------------------
+
+-- Grab environment we need
+local capi = { widget = widget,
+ screen = screen,
+ image = image,
+ client = client }
+local otable = otable
+local type = type
+local pairs = pairs
+local hooks = require("awful.hooks")
+local common = require("awful.widget.common")
+local util = require("awful.util")
+local tag = require("awful.tag")
+local beautiful = require("beautiful")
+
+--- Taglist widget module for awful
+module("awful.widget.taglist")
+
+label = {}
+
+local function taglist_update (screen, w, label, buttons, data, widgets)
+ local tags = capi.screen[screen]:tags()
+ common.list_update(w, buttons, label, data, widgets, tags)
+end
+
+--- Get the tag object the given widget appears on.
+-- @param widget The widget the look for.
+-- @return The tag object.
+function gettag(widget)
+ return common.tagwidgets[widget]
+end
+
+--- Create a new taglist widget.
+-- @param screen The screen to draw tag list for.
+-- @param label Label function to use.
+-- @param buttons A table with buttons binding to set.
+function new(screen, label, buttons)
+ local w = {}
+ local widgets = { }
+ widgets.imagebox = { }
+ widgets.textbox = { ["margin"] = { ["left"] = 0,
+ ["right"] = 0},
+ ["bg_resize"] = true
+ }
+ local data = otable()
+ local u = function (s)
+ if s == screen then
+ taglist_update(s, w, label, buttons, data, widgets)
+ end
+ end
+ local uc = function (c) return u(c.screen) end
+ hooks.focus.register(uc)
+ hooks.unfocus.register(uc)
+ hooks.arrange.register(u)
+ hooks.tags.register(u)
+ hooks.tagged.register(uc)
+ hooks.property.register(function (c, prop)
+ if prop == "urgent" then
+ u(c.screen)
+ end
+ end)
+ -- Free data on tag removal
+ hooks.tags.register(function (s, tag, action)
+ if action == "remove" then data[tag] = nil end
+ end)
+ u(screen)
+ return w
+end
+
+--- Return labels for a taglist widget with all tag from screen.
+-- It returns the tag name and set a special
+-- foreground and background color for selected tags.
+-- @param t The tag.
+-- @param args The arguments table.
+-- bg_focus The background color for selected tag.
+-- fg_focus The foreground color for selected tag.
+-- bg_urgent The background color for urgent tags.
+-- fg_urgent The foreground color for urgent tags.
+-- squares_sel Optional: a user provided image for selected squares.
+-- squares_unsel Optional: a user provided image for unselected squares.
+-- squares_resize Optional: true or false to resize squares.
+-- @return A string to print, a background color, a background image and a
+-- background resize value.
+function label.all(t, args)
+ if not args then args = {} end
+ local theme = beautiful.get()
+ local fg_focus = args.fg_focus or theme.taglist_fg_focus or theme.fg_focus
+ local bg_focus = args.bg_focus or theme.taglist_bg_focus or theme.bg_focus
+ local fg_urgent = args.fg_urgent or theme.taglist_fg_urgent or theme.fg_urgent
+ local bg_urgent = args.bg_urgent or theme.taglist_bg_urgent or theme.bg_urgent
+ local taglist_squares_sel = args.squares_sel or theme.taglist_squares_sel
+ local taglist_squares_unsel = args.squares_unsel or theme.taglist_squares_unsel
+ local taglist_squares_resize = theme.taglist_squares_resize or args.squares_resize or "true"
+ local font = args.font or theme.taglist_font or theme.font or ""
+ local text = ""
+ local sel = capi.client.focus
+ local bg_color = nil
+ local fg_color = nil
+ local bg_image
+ local icon
+ local bg_resize = false
+ if t.selected then
+ bg_color = bg_focus
+ fg_color = fg_focus
+ end
+ if sel and sel:tags()[t] then
+ if taglist_squares_sel then
+ bg_image = capi.image(taglist_squares_sel)
+ bg_resize = taglist_squares_resize == "true"
+ end
+ else
+ local cls = t:clients()
+ if #cls > 0 and taglist_squares_unsel then
+ bg_image = capi.image(taglist_squares_unsel)
+ bg_resize = taglist_squares_resize == "true"
+ end
+ for k, c in pairs(cls) do
+ if c.urgent then
+ if bg_urgent then bg_color = bg_urgent end
+ if fg_urgent then fg_color = fg_urgent end
+ break
+ end
+ end
+ end
+ local taglist_squares = false
+ if taglist_squares_sel or taglist_squares_unsel then
+ taglist_squares = true
+ end
+ if t.name then
+ if fg_color then
+ text = text .. ""
+ if taglist_squares then
+ text = text .. " "
+ end
+ text = text..util.escape(t.name).." "
+ else
+ if taglist_squares then
+ text = text .. " "
+ end
+ text = text .. util.escape(t.name) .. " "
+ end
+ elseif taglist_squares then
+ text = text .. " "
+ end
+ text = text .. ""
+ if tag.geticon(t) and type(tag.geticon(t)) == "image" then
+ icon = tag.geticon(t)
+ elseif tag.geticon(t) then
+ icon = capi.image(tag.geticon(t))
+ end
+
+ return text, bg_color, bg_image, icon
+end
+
+--- Return labels for a taglist widget with all *non empty* tags from screen.
+-- It returns the tag name and set a special
+-- foreground and background color for selected tags.
+-- @param t The tag.
+-- @param args The arguments table.
+-- bg_focus The background color for selected tag.
+-- fg_focus The foreground color for selected tag.
+-- bg_urgent The background color for urgent tags.
+-- fg_urgent The foreground color for urgent tags.
+-- @return A string to print, a background color, a background image and a
+-- background resize value.
+function label.noempty(t, args)
+ if #t:clients() > 0 or t.selected then
+ return label.all(t, args)
+ end
+end
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80
diff --git a/lib/awful/widget/tasklist.lua.in b/lib/awful/widget/tasklist.lua.in
new file mode 100644
index 00000000..3f94ec21
--- /dev/null
+++ b/lib/awful/widget/tasklist.lua.in
@@ -0,0 +1,176 @@
+---------------------------------------------------------------------------
+-- @author Julien Danjou <julien@danjou.info>
+-- @copyright 2008-2009 Julien Danjou
+-- @release @AWESOME_VERSION@
+---------------------------------------------------------------------------
+
+-- Grab environment we need
+local capi = { screen = screen,
+ image = image,
+ client = client }
+local otable = otable
+local ipairs = ipairs
+local table = table
+local hooks = require("awful.hooks")
+local common = require("awful.widget.common")
+local beautiful = require("beautiful")
+local client = require("awful.client")
+local util = require("awful.util")
+
+--- Tasklist widget module for awful
+module("awful.widget.tasklist")
+
+-- Public structures
+label = {}
+
+local function tasklist_update(w, buttons, label, data, widgets)
+ local clients = capi.client.get()
+ local shownclients = {}
+ for k, c in ipairs(clients) do
+ if not (c.skip_taskbar or c.hide
+ or c.type == "splash" or c.type == "dock" or c.type == "desktop") then
+ table.insert(shownclients, c)
+ end
+ end
+ clients = shownclients
+
+ common.list_update(w, buttons, label, data, widgets, clients)
+end
+
+--- Create a new tasklist widget.
+-- @param label Label function to use.
+-- @param buttons A table with buttons binding to set.
+function new(label, buttons)
+ local w = {}
+ local widgets = { }
+ widgets.imagebox = { align = "flex" }
+ widgets.textbox = { align = "flex",
+ margin = { left = 2,
+ right = 2 },
+ bg_resize = true,
+ bg_align = "right"
+ }
+ local data = otable()
+ local u = function () tasklist_update(w, buttons, label, data, widgets) end
+ hooks.arrange.register(u)
+ hooks.clients.register(u)
+ hooks.tagged.register(u)
+ hooks.focus.register(u)
+ hooks.unfocus.register(u)
+ hooks.property.register(function (c, prop)
+ if prop == "urgent"
+ or prop == "floating"
+ or prop == "maximized_horizontal"
+ or prop == "maximized_vertical"
+ or prop == "icon"
+ or prop == "name"
+ or prop == "icon_name" then
+ u()
+ end
+ end)
+ u()
+ -- Free data on unmanage
+ hooks.unmanage.register(function (c) data[c] = nil end)
+ return w
+end
+
+local function widget_tasklist_label_common(c, args)
+ if not args then args = {} end
+ local theme = beautiful.get()
+ local fg_focus = args.fg_focus or theme.tasklist_fg_focus or theme.fg_focus
+ local bg_focus = args.bg_focus or theme.tasklist_bg_focus or theme.bg_focus
+ local fg_urgent = args.fg_urgent or theme.tasklist_fg_urgent or theme.fg_urgent
+ local bg_urgent = args.bg_urgent or theme.tasklist_bg_urgent or theme.bg_urgent
+ local fg_minimize = args.fg_minimize or theme.tasklist_fg_minimize or theme.fg_minimize
+ local bg_minimize = args.bg_minimize or theme.tasklist_bg_minimize or theme.bg_minimize
+ local floating_icon = args.floating_icon or theme.tasklist_floating_icon
+ local font = args.font or theme.tasklist_font or theme.font or ""
+ local bg = nil
+ local text = ""
+ local name
+ local status_image
+ if client.floating.get(c) and floating_icon then
+ status_image = capi.image(floating_icon)
+ end
+ if c.minimized then
+ name = util.escape(c.icon_name) or util.escape("")
+ else
+ name = util.escape(c.name) or util.escape("")
+ end
+ if capi.client.focus == c then
+ bg = bg_focus
+ if fg_focus then
+ text = text .. ""..name..""
+ else
+ text = text .. name
+ end
+ elseif c.urgent and fg_urgent then
+ bg = bg_urgent
+ text = text .. ""..name..""
+ elseif c.minimized and fg_minimize and bg_minimize then
+ bg = bg_minimize
+ text = text .. ""..name..""
+ else
+ text = text .. name
+ end
+ text = text .. ""
+ return text, bg, status_image, c.icon
+end
+
+--- Return labels for a tasklist widget with clients from all tags and screen.
+-- It returns the client name and set a special
+-- foreground and background color for focused client.
+-- It also puts a special icon for floating windows.
+-- @param c The client.
+-- @param screen The screen we are drawing on.
+-- @param args The arguments table.
+-- bg_focus The background color for focused client.
+-- fg_focus The foreground color for focused client.
+-- bg_urgent The background color for urgent clients.
+-- fg_urgent The foreground color for urgent clients.
+-- @return A string to print, a background color and a status image.
+function label.allscreen(c, screen, args)
+ return widget_tasklist_label_common(c, args)
+end
+
+--- Return labels for a tasklist widget with clients from all tags.
+-- It returns the client name and set a special
+-- foreground and background color for focused client.
+-- It also puts a special icon for floating windows.
+-- @param c The client.
+-- @param screen The screen we are drawing on.
+-- @param args The arguments table.
+-- bg_focus The background color for focused client.
+-- fg_focus The foreground color for focused client.
+-- bg_urgent The background color for urgent clients.
+-- fg_urgent The foreground color for urgent clients.
+-- @return A string to print, a background color and a status image.
+function label.alltags(c, screen, args)
+ -- Only print client on the same screen as this widget
+ if c.screen ~= screen then return end
+ return widget_tasklist_label_common(c, args)
+end
+
+--- Return labels for a tasklist widget with clients from currently selected tags.
+-- It returns the client name and set a special
+-- foreground and background color for focused client.
+-- It also puts a special icon for floating windows.
+-- @param c The client.
+-- @param screen The screen we are drawing on.
+-- @param args The arguments table.
+-- bg_focus The background color for focused client.
+-- fg_focus The foreground color for focused client.
+-- bg_urgent The background color for urgent clients.
+-- fg_urgent The foreground color for urgent clients.
+-- @return A string to print, a background color and a status image.
+function label.currenttags(c, screen, args)
+ -- Only print client on the same screen as this widget
+ if c.screen ~= screen then return end
+ for k, t in ipairs(capi.screen[screen]:tags()) do
+ if t.selected and c:tags()[t] then
+ return widget_tasklist_label_common(c, args)
+ end
+ end
+end
+
+-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80