Merge pull request #2127 from Elv13/doc_tests_and_notif_p3_1

awful.widget.common overhaul
This commit is contained in:
Emmanuel Lepage Vallée 2017-12-05 14:06:05 -05:00 committed by GitHub
commit dd5be865c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 643 additions and 163 deletions

View File

@ -210,10 +210,18 @@ awful.screen.connect_for_each_screen(function(s)
awful.button({ }, 4, function () awful.layout.inc( 1) end),
awful.button({ }, 5, function () awful.layout.inc(-1) end)))
-- Create a taglist widget
s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, taglist_buttons)
s.mytaglist = awful.widget.taglist {
screen = s,
filter = awful.widget.taglist.filter.all,
buttons = taglist_buttons
}
-- Create a tasklist widget
s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, tasklist_buttons)
s.mytasklist = awful.widget.tasklist {
screen = s,
filter = awful.widget.tasklist.filter.currenttags,
buttons = tasklist_buttons
}
-- @DOC_WIBAR@
-- Create the wibox

View File

@ -9,7 +9,9 @@ local type = type
local ipairs = ipairs
local capi = { button = button }
local wibox = require("wibox")
local gdebug = require("gears.debug")
local dpi = require("beautiful").xresources.apply_dpi
local base = require("wibox.widget.base")
--- Common utilities for awful widgets
local common = {}
@ -36,6 +38,52 @@ function common.create_buttons(buttons, object)
end
end
local function default_template()
local ib = wibox.widget.imagebox()
local tb = wibox.widget.textbox()
local bgb = wibox.container.background()
local tbm = wibox.container.margin(tb, dpi(4), dpi(4))
local ibm = wibox.container.margin(ib, dpi(4))
local l = wibox.layout.fixed.horizontal()
-- All of this is added in a fixed widget
l:fill_space(true)
l:add(ibm)
l:add(tbm)
-- And all of this gets a background
bgb:set_widget(l)
return {
ib = ib,
tb = tb,
bgb = bgb,
tbm = tbm,
ibm = ibm,
primary = l,
}
end
local function custom_template(args)
local l = base.make_widget_from_value(args.widget_template)
-- The template system requires being able to get children elements by ids.
-- This is not optimal, but for now there is no way around it.
assert(l.get_children_by_id,"The given widget template did not result in a"..
"layout with a 'get_children_by_id' method")
return {
ib = l:get_children_by_id( "icon_role" )[1],
tb = l:get_children_by_id( "text_role" )[1],
bgb = l:get_children_by_id( "background_role" )[1],
tbm = l:get_children_by_id( "text_margin_role" )[1],
ibm = l:get_children_by_id( "icon_margin_role" )[1],
primary = l,
update_callback = l.update_callback,
create_callback = l.create_callback,
}
end
--- Common update method.
-- @param w The widget.
-- @tab buttons
@ -44,73 +92,69 @@ end
-- has to return `text`, `bg`, `bg_image`, `icon`.
-- @tab data Current data/cache, indexed by objects.
-- @tab objects Objects to be displayed / updated.
function common.list_update(w, buttons, label, data, objects)
-- @tparam[opt={}] table args
function common.list_update(w, buttons, label, data, objects, args)
-- update the widgets, creating them if needed
w:reset()
for i, o in ipairs(objects) do
local cache = data[o]
local ib, tb, bgb, tbm, ibm, l
if cache then
ib = cache.ib
tb = cache.tb
bgb = cache.bgb
tbm = cache.tbm
ibm = cache.ibm
else
ib = wibox.widget.imagebox()
tb = wibox.widget.textbox()
bgb = wibox.container.background()
tbm = wibox.container.margin(tb, dpi(4), dpi(4))
ibm = wibox.container.margin(ib, dpi(4))
l = wibox.layout.fixed.horizontal()
-- All of this is added in a fixed widget
l:fill_space(true)
l:add(ibm)
l:add(tbm)
if not cache then
cache = (args and args.widget_template) and
custom_template(args) or default_template()
-- And all of this gets a background
bgb:set_widget(l)
cache.primary:buttons(common.create_buttons(buttons, o))
bgb:buttons(common.create_buttons(buttons, o))
if cache.create_callback then
cache.create_callback(cache.primary, o, i, objects)
end
data[o] = {
ib = ib,
tb = tb,
bgb = bgb,
tbm = tbm,
ibm = ibm,
}
data[o] = cache
elseif cache.update_callback then
cache.update_callback(cache.primary, o, i, objects)
end
local text, bg, bg_image, icon, args = label(o, tb)
args = args or {}
local text, bg, bg_image, icon, item_args = label(o, cache.tb)
item_args = item_args or {}
-- The text might be invalid, so use pcall.
if text == nil or text == "" then
tbm:set_margins(0)
else
if not tb:set_markup_silently(text) then
tb:set_markup("<i>&lt;Invalid text&gt;</i>")
if cache.tbm and (text == nil or text == "") then
cache.tbm:set_margins(0)
elseif cache.tb then
if not cache.tb:set_markup_silently(text) then
cache.tb:set_markup("<i>&lt;Invalid text&gt;</i>")
end
end
bgb:set_bg(bg)
if type(bg_image) == "function" then
-- TODO: Why does this pass nil as an argument?
bg_image = bg_image(tb,o,nil,objects,i)
end
bgb:set_bgimage(bg_image)
if icon then
ib:set_image(icon)
else
ibm:set_margins(0)
if cache.bgb then
cache.bgb:set_bg(bg)
--TODO v5 remove this if, it existed only for a removed and
-- undocumented API
if type(bg_image) ~= "function" then
cache.bgb:set_bgimage(bg_image)
else
gdebug.deprecate("If you read this, you used an undocumented API"..
" which has been replaced by the new awful.widget.common "..
"templating system, please migrate now. This feature is "..
"already staged for removal", {
deprecated_in = 4
})
end
cache.bgb.shape = item_args.shape
cache.bgb.shape_border_width = item_args.shape_border_width
cache.bgb.shape_border_color = item_args.shape_border_color
end
bgb.shape = args.shape
bgb.shape_border_width = args.shape_border_width
bgb.shape_border_color = args.shape_border_color
if cache.ib and icon then
cache.ib:set_image(icon)
elseif cache.ibm then
cache.ibm:set_margins(0)
end
w:add(bgb)
w:add(cache.primary)
end
end

View File

@ -1,6 +1,37 @@
---------------------------------------------------------------------------
--- Taglist widget module for awful
--
-- Here is a more advanced example of how to extent the `taglist`. It provides:
--
-- * mouse "hover" color
-- * an extra index field
-- * a powerline look and feel
--
--@DOC_wibox_awidget_taglist_indexed_EXAMPLE@
--
-- As demonstrated in the example above, there are a few "shortcuts" to avoid
-- re-inventing the wheel. By setting the predefined roles as widget `id`s,
-- `awful.widget.common` will do most of the work to update the values
-- automatically. All of them are optional. The supported roles are:
--
-- * `icon_role`: A `wibox.widget.imagebox`
-- * `text_role`: A `wibox.widget.textbox`
-- * `background_role`: A `wibox.container.background`
-- * `text_margin_role`: A `wibox.container.margin`
-- * `icon_margin_role`: A `wibox.container.margin`
--
-- `awful.widget.common` also has 2 callbacks to give more control over the widget:
--
-- * `create_callback`: Called once after the widget instance is created
-- * `update_callback`: Called everytime the data is refreshed
--
-- Both callback have the same parameters:
--
-- * `self`: The widget instance (*widget*).
-- * `t`: The tag (*tag*)
-- * `index`: The widget position in the list (*number*)
-- * `tags`: The list of tag, in order (*table*)
--
-- @author Julien Danjou &lt;julien@danjou.info&gt;
-- @copyright 2008-2009 Julien Danjou
-- @classmod awful.widget.taglist
@ -22,6 +53,8 @@ local surface = require("gears.surface")
local timer = require("gears.timer")
local gcolor = require("gears.color")
local gstring = require("gears.string")
local gdebug = require("gears.debug")
local base = require("wibox.widget.base")
local function get_screen(s)
return s and capi.screen[s]
@ -351,7 +384,7 @@ function taglist.taglist_label(t, args)
return text, bg_color, bg_image, not taglist_disable_icon and icon or nil, other_args
end
local function taglist_update(s, w, buttons, filter, data, style, update_function)
local function taglist_update(s, w, buttons, filter, data, style, update_function, args)
local tags = {}
for _, t in ipairs(s.tags) do
if not tag.getproperty(t, "hide") and filter(t) then
@ -361,73 +394,113 @@ local function taglist_update(s, w, buttons, filter, data, style, update_functio
local function label(c) return taglist.taglist_label(c, style) end
update_function(w, buttons, label, data, tags)
update_function(w, buttons, label, data, tags, args)
end
--- Create a new taglist widget. The last two arguments (update_function
-- and base_widget) serve to customize the layout of the taglist (eg. to
-- and layout) serve to customize the layout of the taglist (eg. to
-- make it vertical). For that, you will need to copy the
-- awful.widget.common.list_update function, make your changes to it
-- and pass it as update_function here. Also change the base_widget if the
-- and pass it as update_function here. Also change the layout if the
-- default is not what you want.
-- @param screen The screen to draw taglist for.
-- @param filter Filter function to define what clients will be listed.
-- @param buttons A table with buttons binding to set.
-- @tparam[opt={}] table style The style overrides default theme.
-- @tparam[opt=nil] string|pattern style.fg_focus
-- @tparam[opt=nil] string|pattern style.bg_focus
-- @tparam[opt=nil] string|pattern style.fg_urgent
-- @tparam[opt=nil] string|pattern style.bg_urgent
-- @tparam[opt=nil] string|pattern style.bg_occupied
-- @tparam[opt=nil] string|pattern style.fg_occupied
-- @tparam[opt=nil] string|pattern style.bg_empty
-- @tparam[opt=nil] string|pattern style.fg_empty
-- @tparam[opt=nil] string|pattern style.bg_volatile
-- @tparam[opt=nil] string|pattern style.fg_volatile
-- @tparam[opt=nil] string style.squares_sel
-- @tparam[opt=nil] string style.squares_unsel
-- @tparam[opt=nil] string style.squares_sel_empty
-- @tparam[opt=nil] string style.squares_unsel_empty
-- @tparam[opt=nil] string style.squares_resize
-- @tparam[opt=nil] string style.disable_icon
-- @tparam[opt=nil] string style.font
-- @tparam[opt=nil] number style.spacing The spacing between tags.
-- @param[opt] update_function Function to create a tag widget on each
-- @tparam table args
-- @tparam screen args.screen The screen to draw taglist for.
-- @tparam function[opt=nil] args.filter Filter function to define what clients will be listed.
-- @tparam table args.buttons A table with buttons binding to set.
-- @tparam[opt] function args.update_function Function to create a tag widget on each
-- update. See `awful.widget.common`.
-- @param[opt] base_widget Optional container widget for tag widgets. Default
-- @tparam[opt] widget args.layout Optional layout widget for tag widgets. Default
-- is wibox.layout.fixed.horizontal().
-- @param base_widget.bg_focus The background color for focused client.
-- @param base_widget.fg_focus The foreground color for focused client.
-- @param base_widget.bg_urgent The background color for urgent clients.
-- @param base_widget.fg_urgent The foreground color for urgent clients.
-- @param[opt] base_widget.squares_sel A user provided image for selected squares.
-- @param[opt] base_widget.squares_unsel A user provided image for unselected squares.
-- @param[opt] base_widget.squares_sel_empty A user provided image for selected squares for empty tags.
-- @param[opt] base_widget.squares_unsel_empty A user provided image for unselected squares for empty tags.
-- @param[opt] base_widget.squares_resize True or false to resize squares.
-- @param base_widget.font The font.
-- @tparam[opt] table widget_template A custom widget to be used for each tag
-- @tparam[opt={}] table args.style The style overrides default theme.
-- @tparam[opt=nil] string|pattern args.style.fg_focus
-- @tparam[opt=nil] string|pattern args.style.bg_focus
-- @tparam[opt=nil] string|pattern args.style.fg_urgent
-- @tparam[opt=nil] string|pattern args.style.bg_urgent
-- @tparam[opt=nil] string|pattern args.style.bg_occupied
-- @tparam[opt=nil] string|pattern args.style.fg_occupied
-- @tparam[opt=nil] string|pattern args.style.bg_empty
-- @tparam[opt=nil] string|pattern args.style.fg_empty
-- @tparam[opt=nil] string|pattern args.style.bg_volatile
-- @tparam[opt=nil] string|pattern args.style.fg_volatile
-- @tparam[opt=nil] string args.style.squares_sel
-- @tparam[opt=nil] string args.style.squares_unsel
-- @tparam[opt=nil] string args.style.squares_sel_empty
-- @tparam[opt=nil] string args.style.squares_unsel_empty
-- @tparam[opt=nil] string args.style.squares_resize
-- @tparam[opt=nil] string args.style.disable_icon
-- @tparam[opt=nil] string args.style.font
-- @tparam[opt=nil] number args.style.spacing The spacing between tags.
-- @tparam[opt] string args.style.squares_sel A user provided image for selected squares.
-- @tparam[opt] string args.style.squares_unsel A user provided image for unselected squares.
-- @tparam[opt] string args.style.squares_sel_empty A user provided image for selected squares for empty tags.
-- @tparam[opt] string args.style.squares_unsel_empty A user provided image for unselected squares for empty tags.
-- @tparam[opt] boolean args.style.squares_resize True or false to resize squares.
-- @tparam string|pattern args.style.bg_focus The background color for focused client.
-- @tparam string|pattern args.style.fg_focus The foreground color for focused client.
-- @tparam string|pattern args.style.bg_urgent The background color for urgent clients.
-- @tparam string|pattern args.style.fg_urgent The foreground color for urgent clients.
-- @tparam string args.style.font The font.
-- @param filter **DEPRECATED** use args.filter
-- @param buttons **DEPRECATED** use args.buttons
-- @param style **DEPRECATED** use args.style
-- @param update_function **DEPRECATED** use args.update_function
-- @param base_widget **DEPRECATED** use args.base_widget
-- @function awful.taglist
function taglist.new(screen, filter, buttons, style, update_function, base_widget)
screen = get_screen(screen)
local uf = update_function or common.list_update
local w = base_widget or fixed.horizontal()
function taglist.new(args, filter, buttons, style, update_function, base_widget)
if w.set_spacing and (style and style.spacing or beautiful.taglist_spacing) then
w:set_spacing(style and style.spacing or beautiful.taglist_spacing)
local screen = nil
local argstype = type(args)
-- Detect the old function signature
if argstype == "number" or argstype == "screen" or
(argstype == "table" and args.index and args == capi.screen[args.index]) then
gdebug.deprecate("The `screen` paramater is deprecated, use `args.screen`.",
{deprecated_in=5})
screen = get_screen(args)
args = {}
end
assert(type(args) == "table")
for k, v in pairs { filter = filter,
buttons = buttons,
style = style,
update_function = update_function,
layout = base_widget
} do
gdebug.deprecate("The `awful.widget.taglist()` `"..k
.."` paramater is deprecated, use `args."..k.."`.",
{deprecated_in=5})
args[k] = v
end
screen = screen or get_screen(args.screen)
local uf = args.update_function or common.list_update
local w = base.make_widget_from_value(args.layout or fixed.horizontal)
if w.set_spacing and (args.style and args.style.spacing or beautiful.taglist_spacing) then
w:set_spacing(args.style and args.style.spacing or beautiful.taglist_spacing)
end
local data = setmetatable({}, { __mode = 'k' })
local queued_update = {}
function w._do_taglist_update_now()
if screen.valid then
taglist_update(screen, w, args.buttons, args.filter, data, args.style, uf, args)
end
queued_update[screen] = false
end
function w._do_taglist_update()
-- Add a delayed callback for the first update.
if not queued_update[screen] then
timer.delayed_call(function()
if screen.valid then
taglist_update(screen, w, buttons, filter, data, style, uf)
end
queued_update[screen] = false
end)
timer.delayed_call(w._do_taglist_update_now)
queued_update[screen] = true
end
end

View File

@ -24,6 +24,50 @@
-- <tr><td>⬍</td><td><a href="./client.html#client.maximized_vertical">maximized_vertical</a></td></tr>
-- </table>
--
-- **Customizing the tasklist:**
--
-- The `tasklist` created by `rc.lua` use the default values for almost
-- everything. However, it is possible to override each aspects to create a
-- very different widget. Here's an example that create a tasklist similar to
-- the default one, but with an explicit layout and some spacing widgets:
--
--@DOC_wibox_awidget_tasklist_rounded_EXAMPLE@
--
-- As demonstrated in the example above, there are a few "shortcuts" to avoid
-- re-inventing the wheel. By setting the predefined roles as widget `id`s,
-- `awful.widget.common` will do most of the work to update the values
-- automatically. All of them are optional. The supported roles are:
--
-- * `icon_role`: A `wibox.widget.imagebox`
-- * `text_role`: A `wibox.widget.textbox`
-- * `background_role`: A `wibox.container.background`
-- * `text_margin_role`: A `wibox.container.margin`
-- * `icon_margin_role`: A `wibox.container.margin`
--
-- `awful.widget.common` also has 2 callbacks to give more control over the widget:
--
-- * `create_callback`: Called once after the widget instance is created
-- * `update_callback`: Called everytime the data is refreshed
--
-- Both callback have the same parameters:
--
-- * `self`: The widget instance (*widget*).
-- * `c`: The client (*client*)
-- * `index`: The widget position in the list (*number*)
-- * `clients`: The list of client, in order (*table*)
--
-- It is also possible to omit some roles and create an icon only tasklist.
-- Notice that this example use the `awful.widget.clienticon` widget instead
-- of an `imagebox`. This allows higher resoluton icons to be loaded. This
-- example reproduces the Windows 10 tasklist look and feel:
--
--@DOC_wibox_awidget_tasklist_windows10_EXAMPLE@
--
-- The tasklist can also be created in an `awful.popup` in case there is no
-- permanent `awful.wibar`:
--
--@DOC_awful_popup_alttab_EXAMPLE@
--
-- @author Julien Danjou &lt;julien@danjou.info&gt;
-- @copyright 2008-2009 Julien Danjou
-- @classmod awful.widget.tasklist
@ -42,6 +86,8 @@ local flex = require("wibox.layout.flex")
local timer = require("gears.timer")
local gcolor = require("gears.color")
local gstring = require("gears.string")
local gdebug = require("gears.debug")
local base = require("wibox.widget.base")
local function get_screen(s)
return s and screen[s]
@ -244,7 +290,9 @@ local function tasklist_label(c, args, tb)
local maximized_horizontal = args.maximized_horizontal or theme.tasklist_maximized_horizontal or ''
local maximized_vertical = args.maximized_vertical or theme.tasklist_maximized_vertical or ''
tb:set_align(align)
if tb then
tb:set_align(align)
end
if not theme.tasklist_plain_task_name then
if c.sticky then name = name .. sticky end
@ -337,7 +385,10 @@ local function tasklist_label(c, args, tb)
text = text .. "<span color='"..fg_normal.."'>"..name.."</span>"
bg_image = bg_image_normal
end
tb:set_font(font)
if tb then
tb:set_font(font)
end
local other_args = {
shape = shape,
@ -348,7 +399,7 @@ local function tasklist_label(c, args, tb)
return text, bg, bg_image, not tasklist_disable_icon and c.icon or nil, other_args
end
local function tasklist_update(s, w, buttons, filter, data, style, update_function)
local function tasklist_update(s, w, buttons, filter, data, style, update_function, args)
local clients = {}
for _, c in ipairs(capi.client.get()) do
if not (c.skip_taskbar or c.hidden
@ -360,77 +411,118 @@ local function tasklist_update(s, w, buttons, filter, data, style, update_functi
local function label(c, tb) return tasklist_label(c, style, tb) end
update_function(w, buttons, label, data, clients)
update_function(w, buttons, label, data, clients, args)
end
--- Create a new tasklist widget. The last two arguments (update_function
-- and base_widget) serve to customize the layout of the tasklist (eg. to
--- Create a new tasklist widget.
-- The last two arguments (update_function
-- and layout) serve to customize the layout of the tasklist (eg. to
-- make it vertical). For that, you will need to copy the
-- awful.widget.common.list_update function, make your changes to it
-- and pass it as update_function here. Also change the base_widget if the
-- and pass it as update_function here. Also change the layout if the
-- default is not what you want.
-- @param screen The screen to draw tasklist for.
-- @param filter Filter function to define what clients will be listed.
-- @param buttons A table with buttons binding to set.
-- @tparam[opt={}] table style The style overrides default theme.
-- @tparam[opt=nil] string|pattern style.fg_normal
-- @tparam[opt=nil] string|pattern style.bg_normal
-- @tparam[opt=nil] string|pattern style.fg_focus
-- @tparam[opt=nil] string|pattern style.bg_focus
-- @tparam[opt=nil] string|pattern style.fg_urgent
-- @tparam[opt=nil] string|pattern style.bg_urgent
-- @tparam[opt=nil] string|pattern style.fg_minimize
-- @tparam[opt=nil] string|pattern style.bg_minimize
-- @tparam[opt=nil] string style.bg_image_normal
-- @tparam[opt=nil] string style.bg_image_focus
-- @tparam[opt=nil] string style.bg_image_urgent
-- @tparam[opt=nil] string style.bg_image_minimize
-- @tparam[opt=nil] boolean style.tasklist_disable_icon
-- @tparam[opt=false] boolean style.disable_task_name
-- @tparam[opt=nil] string style.font
-- @tparam[opt=left] string style.align *left*, *right* or *center*
-- @tparam[opt=nil] string style.font_focus
-- @tparam[opt=nil] string style.font_minimized
-- @tparam[opt=nil] string style.font_urgent
-- @tparam[opt=nil] number style.spacing The spacing between tags.
-- @tparam[opt=nil] gears.shape style.shape
-- @tparam[opt=nil] number style.shape_border_width
-- @tparam[opt=nil] string|color style.shape_border_color
-- @tparam[opt=nil] gears.shape style.shape_focus
-- @tparam[opt=nil] number style.shape_border_width_focus
-- @tparam[opt=nil] string|color style.shape_border_color_focus
-- @tparam[opt=nil] gears.shape style.shape_minimized
-- @tparam[opt=nil] number style.shape_border_width_minimized
-- @tparam[opt=nil] string|color style.shape_border_color_minimized
-- @tparam[opt=nil] gears.shape style.shape_urgent
-- @tparam[opt=nil] number style.shape_border_width_urgent
-- @tparam[opt=nil] string|color style.shape_border_color_urgent
-- @param[opt] update_function Function to create a tag widget on each
--
-- @tparam table args
-- @tparam screen args.screen The screen to draw tasklist for.
-- @tparam function args.filter Filter function to define what clients will be listed.
-- @tparam table args.buttons A table with buttons binding to set.
-- @tparam[opt] function args.update_function Function to create a tag widget on each
-- update. See `awful.widget.common.list_update`.
-- @tparam[opt] table base_widget Container widget for tag widgets. Default
-- @tparam[opt] table args.layout Container widget for tag widgets. Default
-- is `wibox.layout.flex.horizontal`.
-- @tparam[opt] table widget_template A custom widget to be used for each client
-- @tparam[opt={}] table args.style The style overrides default theme.
-- @tparam[opt=nil] string|pattern args.style.fg_normal
-- @tparam[opt=nil] string|pattern args.style.bg_normal
-- @tparam[opt=nil] string|pattern args.style.fg_focus
-- @tparam[opt=nil] string|pattern args.style.bg_focus
-- @tparam[opt=nil] string|pattern args.style.fg_urgent
-- @tparam[opt=nil] string|pattern args.style.bg_urgent
-- @tparam[opt=nil] string|pattern args.style.fg_minimize
-- @tparam[opt=nil] string|pattern args.style.bg_minimize
-- @tparam[opt=nil] string args.style.bg_image_normal
-- @tparam[opt=nil] string args.style.bg_image_focus
-- @tparam[opt=nil] string args.style.bg_image_urgent
-- @tparam[opt=nil] string args.style.bg_image_minimize
-- @tparam[opt=nil] boolean args.style.tasklist_disable_icon
-- @tparam[opt=false] boolean args.style.disable_task_name
-- @tparam[opt=nil] string args.style.font
-- @tparam[opt=left] string args.style.align *left*, *right* or *center*
-- @tparam[opt=nil] string args.style.font_focus
-- @tparam[opt=nil] string args.style.font_minimized
-- @tparam[opt=nil] string args.style.font_urgent
-- @tparam[opt=nil] number args.style.spacing The spacing between tags.
-- @tparam[opt=nil] gears.shape args.style.shape
-- @tparam[opt=nil] number args.style.shape_border_width
-- @tparam[opt=nil] string|color args.style.shape_border_color
-- @tparam[opt=nil] gears.shape args.style.shape_focus
-- @tparam[opt=nil] number args.style.shape_border_width_focus
-- @tparam[opt=nil] string|color args.style.shape_border_color_focus
-- @tparam[opt=nil] gears.shape args.style.shape_minimized
-- @tparam[opt=nil] number args.style.shape_border_width_minimized
-- @tparam[opt=nil] string|color args.style.shape_border_color_minimized
-- @tparam[opt=nil] gears.shape args.style.shape_urgent
-- @tparam[opt=nil] number args.style.shape_border_width_urgent
-- @tparam[opt=nil] string|color args.style.shape_border_color_urgent
-- @param filter **DEPRECATED** use args.filter
-- @param buttons **DEPRECATED** use args.buttons
-- @param style **DEPRECATED** use args.style
-- @param update_function **DEPRECATED** use args.update_function
-- @param base_widget **DEPRECATED** use args.base_widget
-- @function awful.tasklist
function tasklist.new(screen, filter, buttons, style, update_function, base_widget)
screen = get_screen(screen)
local uf = update_function or common.list_update
local w = base_widget or flex.horizontal()
function tasklist.new(args, filter, buttons, style, update_function, base_widget)
local screen = nil
local argstype = type(args)
-- Detect the old function signature
if argstype == "number" or argstype == "screen" or
(argstype == "table" and args.index and args == capi.screen[args.index]) then
gdebug.deprecate("The `screen` paramater is deprecated, use `args.screen`.",
{deprecated_in=5})
screen = get_screen(args)
args = {}
end
assert(type(args) == "table")
for k, v in pairs { filter = filter,
buttons = buttons,
style = style,
update_function = update_function,
layout = base_widget
} do
gdebug.deprecate("The `awful.widget.tasklist()` `"..k
.."` paramater is deprecated, use `args."..k.."`.",
{deprecated_in=5})
args[k] = v
end
screen = screen or get_screen(args.screen)
local uf = args.update_function or common.list_update
local w = base.make_widget_from_value(args.layout or flex.horizontal)
local data = setmetatable({}, { __mode = 'k' })
if w.set_spacing and (style and style.spacing or beautiful.tasklist_spacing) then
w:set_spacing(style and style.spacing or beautiful.tasklist_spacing)
if w.set_spacing and (args.style and args.style.spacing or beautiful.tasklist_spacing) then
w:set_spacing(args.style and args.style.spacing or beautiful.tasklist_spacing)
end
local queued_update = false
-- For the tests
function w._do_tasklist_update_now()
queued_update = false
if screen.valid then
tasklist_update(screen, w, args.buttons, args.filter, data, args.style, uf, args)
end
end
function w._do_tasklist_update()
-- Add a delayed callback for the first update.
if not queued_update then
timer.delayed_call(function()
queued_update = false
if screen.valid then
tasklist_update(screen, w, buttons, filter, data, style, uf)
end
end)
timer.delayed_call(w._do_tasklist_update_now)
queued_update = true
end
end

View File

@ -8,7 +8,10 @@ return { create_wibox = function()
-- Widgets that are aligned to the left
local left_layout = wibox.layout.fixed.horizontal()
left_layout:add(awful.widget.launcher({ image = img, command = "bash" }))
left_layout:add(awful.widget.taglist(1, awful.widget.taglist.filter.all))
left_layout:add(awful.widget.taglist {
screen = 1,
filter = awful.widget.taglist.filter.all
})
left_layout:add(awful.widget.prompt())
-- Widgets that are aligned to the right
@ -20,7 +23,10 @@ return { create_wibox = function()
-- Now bring it all together (with the tasklist in the middle)
local layout = wibox.layout.align.horizontal()
layout:set_left(left_layout)
layout:set_middle(awful.widget.tasklist(1, awful.widget.tasklist.filter.currenttags))
layout:set_middle(awful.widget.tasklist {
screen = 1,
filter = awful.widget.tasklist.filter.currenttags
})
layout:set_right(right_layout)
-- Create wibox

View File

@ -0,0 +1,106 @@
local parent = ... --DOC_NO_USAGE --DOC_HIDE
local awful = { --DOC_HIDE
tag = require("awful.tag"), --DOC_HIDE
layout = require("awful.layout"), --DOC_HIDE
placement = require("awful.placement"), --DOC_HIDE
widget = {taglist = require("awful.widget.taglist")} --DOC_HIDE
} --DOC_HIDE
local gears = { shape = require("gears.shape") } --DOC_HIDE
local wibox = require("wibox") --DOC_HIDE
local beautiful = require("beautiful") --DOC_HIDE
local s = screen[1] --DOC_HIDE
local taglist_buttons = nil -- To make luacheck shut up --DOC_HIDE
local tags = awful.tag({ "term", "net", "mail", "chat", "files" }, --DOC_HIDE
s, awful.layout.suit.floating) --DOC_HIDE
for i=1, 5 do tags[i].selected = false end --DOC_HIDE
tags[2].selected = true --DOC_HIDE
--DOC_HIDE add some clients to some tags
local c = client.gen_fake {x = 80, y = 55, width=75, height=50} --DOC_HIDE
local c2 = client.gen_fake {x = 80, y = 55, width=75, height=50} --DOC_HIDE
c:tags(tags[4]) --DOC_HIDE
c2:tags(tags[1]) --DOC_HIDE
s.mytaglist = awful.widget.taglist {
screen = s,
filter = awful.widget.taglist.filter.all,
style = {
shape = gears.shape.powerline
},
layout = {
spacing = -12,
spacing_widget = {
color = "#dddddd",
shape = gears.shape.powerline,
widget = wibox.widget.separator,
},
layout = wibox.layout.fixed.horizontal
},
widget_template = {
{
{
{
{
{
id = "index_role",
widget = wibox.widget.textbox,
},
margins = 4,
widget = wibox.container.margin,
},
bg = "#dddddd",
shape = gears.shape.circle,
widget = wibox.container.background,
},
{
{
id = "icon_role",
widget = wibox.widget.imagebox,
},
margins = 2,
widget = wibox.container.margin,
},
{
id = "text_role",
widget = wibox.widget.textbox,
},
layout = wibox.layout.fixed.horizontal,
},
left = 18,
right = 18,
widget = wibox.container.margin
},
id = "background_role",
widget = wibox.container.background,
-- Add support for hover colors and an index label
create_callback = function(self, c3, index, objects) --luacheck: no unused args
self:get_children_by_id("index_role")[1].markup = "<b> "..index.." </b>"
self:connect_signal("mouse::enter", function()
if self.bg ~= "#ff0000" then
self.backup = self.bg
self.has_backup = true
end
self.bg = "#ff0000"
end)
self:connect_signal("mouse::leave", function()
if self.has_backup then self.bg = self.backup end
end)
end,
update_callback = function(self, c3, index, objects) --luacheck: no unused args
self:get_children_by_id("index_role")[1].markup = "<b> "..index.." </b>"
end,
},
buttons = taglist_buttons
}
s.mytaglist.forced_width = 400 --DOC_HIDE
s.mytaglist.forced_height = 18 --DOC_HIDE
s.mytaglist._do_taglist_update_now() --DOC_HIDE
parent:add(wibox.widget.background(s.mytaglist, beautiful.bg_normal)) --DOC_HIDE

View File

@ -0,0 +1,78 @@
local parent = ... --DOC_NO_USAGE --DOC_HIDE
local awful = { --DOC_HIDE
tag = require("awful.tag"), --DOC_HIDE
placement = require("awful.placement"), --DOC_HIDE
widget = {tasklist = require("awful.widget.tasklist")} --DOC_HIDE
} --DOC_HIDE
local gears = { shape = require("gears.shape") } --DOC_HIDE
local wibox = require("wibox") --DOC_HIDE
local beautiful = require("beautiful") --DOC_HIDE
local s = screen[1] --DOC_HIDE
local tasklist_buttons = nil -- To make luacheck shut up --DOC_HIDE
local t_real = awful.tag.add("Test", {screen=screen[1]}) --DOC_HIDE
for i=1, 3 do --DOC_HIDE
local c = client.gen_fake {x = 80, y = 55, width=75, height=50} --DOC_HIDE
c:tags{t_real} --DOC_HIDE
c.icon = beautiful.awesome_icon --DOC_HIDE
c.name = " Client "..i.." " --DOC_HIDE
end --DOC_HIDE
s.mytasklist = awful.widget.tasklist {
screen = s,
filter = awful.widget.tasklist.filter.currenttags,
buttons = tasklist_buttons,
style = {
shape_border_width = 1,
shape_border_color = "#777777",
shape = gears.shape.rounded_bar,
},
layout = {
spacing = 10,
spacing_widget = {
{
forced_width = 5,
shape = gears.shape.circle,
widget = wibox.widget.separator
},
valign = "center",
halign = "center",
widget = wibox.container.place,
},
layout = wibox.layout.flex.horizontal
},
-- Notice that there is *NO* `wibox.wibox` prefix, it is a template,
-- not a widget instance.
widget_template = {
{
{
{
{
id = "icon_role",
widget = wibox.widget.imagebox,
},
margins = 2,
widget = wibox.container.margin,
},
{
id = "text_role",
widget = wibox.widget.textbox,
},
layout = wibox.layout.fixed.horizontal,
},
left = 10,
right = 10,
widget = wibox.container.margin
},
id = "background_role",
widget = wibox.container.background,
},
}
s.mytasklist.forced_width = 400 --DOC_HIDE
s.mytasklist.forced_height = 18 --DOC_HIDE
s.mytasklist._do_tasklist_update_now() --DOC_HIDE
parent:add( s.mytasklist) --DOC_HIDE

View File

@ -0,0 +1,73 @@
local parent = ... --DOC_NO_USAGE --DOC_HIDE
local awful = { --DOC_HIDE
tag = require("awful.tag"), --DOC_HIDE
placement = require("awful.placement"), --DOC_HIDE
widget = {clienticon =require("awful.widget.clienticon"), --DOC_HIDE
tasklist = require("awful.widget.tasklist")} --DOC_HIDE
} --DOC_HIDE
local wibox = require("wibox") --DOC_HIDE
local beautiful = require("beautiful") --DOC_HIDE
local s = screen[1] --DOC_HIDE
local tasklist_buttons = nil -- To make luacheck shut up --DOC_HIDE
local t_real = awful.tag.add("Test", {screen=screen[1]}) --DOC_HIDE
for i=1, 3 do --DOC_HIDE
local c = client.gen_fake {x = 80, y = 55, width=75, height=50} --DOC_HIDE
c:tags{t_real} --DOC_HIDE
c.icon = beautiful.awesome_icon --DOC_HIDE
c.name = " Client "..i.." " --DOC_HIDE
client.focus = i==2 and c or client.focus --DOC_HIDE
end --DOC_HIDE
s.mytasklist = awful.widget.tasklist {
screen = s,
filter = awful.widget.tasklist.filter.currenttags,
buttons = tasklist_buttons,
layout = {
spacing_widget = {
{
forced_width = 5,
forced_height = 24,
thickness = 1,
color = "#777777",
widget = wibox.widget.separator
},
valign = "center",
halign = "center",
widget = wibox.container.place,
},
spacing = 1,
layout = wibox.layout.fixed.horizontal
},
-- Notice that there is *NO* `wibox.wibox` prefix, it is a template,
-- not a widget instance.
widget_template = {
{
wibox.widget.base.make_widget(),
forced_height = 5,
id = "background_role",
widget = wibox.container.background,
},
{
{
id = "clienticon",
widget = awful.widget.clienticon,
},
margins = 5,
widget = wibox.container.margin
},
nil,
create_callback = function(self, c, index, objects) --luacheck: no unused args
self:get_children_by_id("clienticon")[1].client = c
end,
layout = wibox.layout.align.vertical,
},
}
s.mytasklist.forced_width = 400 --DOC_HIDE
s.mytasklist.forced_height = 48 --DOC_HIDE
s.mytasklist._do_tasklist_update_now() --DOC_HIDE
parent:add( s.mytasklist) --DOC_HIDE

View File

@ -73,10 +73,10 @@ prepare_for_collect = emit_refresh
collectable(tooltip_now())
prepare_for_collect = emit_refresh
collectable(awful.widget.taglist(1, awful.widget.taglist.filter.all))
collectable(awful.widget.taglist{screen=1, filter=awful.widget.taglist.filter.all})
prepare_for_collect = emit_refresh
collectable(awful.widget.tasklist(1, awful.widget.tasklist.filter.currenttags))
collectable(awful.widget.tasklist{screen=1, filter=awful.widget.tasklist.filter.currenttags})
prepare_for_collect = emit_refresh
collectable(create_wibox())