Merge pull request #2127 from Elv13/doc_tests_and_notif_p3_1
awful.widget.common overhaul
This commit is contained in:
commit
dd5be865c3
|
@ -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
|
||||
|
|
|
@ -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><Invalid text></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><Invalid text></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
|
||||
|
||||
|
|
|
@ -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 <julien@danjou.info>
|
||||
-- @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
|
||||
|
|
|
@ -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 <julien@danjou.info>
|
||||
-- @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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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())
|
||||
|
|
Loading…
Reference in New Issue