标题栏中的滑块小部件

slider widget in titlebars

我想在每个客户端的标题栏中放置一个滑块,以便控制其不透明度。
在官方rc.lua中,在标题栏配置中我们可以找到:
awful.titlebar.widget.floatingbutton (c)
所以客户端的 id 被发送到小部件

我想到了类似下面的代码:

local MAX = 1
local MIN = 0
--
-- le widget slider
opaciteControle = wibox.widget {
   --forced_width        = 100,
   bar_shape           = gears.shape.rounded_rect,
   bar_height          = 1,
   bar_color           = beautiful.border_color,
   --handle_color        = beautiful.bg_normal,
   handle_color        = "#FFFFFF",
   handle_shape        = gears.shape.circle,
   handle_border_color = beautiful.border_color,
   handle_border_width = 1,
   minimum             = MIN,
   maximum             = MAX,
   value               = .8,
   widget              = wibox.widget.slider,
}
-- le widget text
opaciteTexte = wibox.widget {
   text                = "opacite",
   align               = "center",
   widget              = wibox.widget.textbox,
}
-- le widget à afficher
opacite = wibox.widget {
   opaciteTexte,
   opaciteControle,
   vertical_offset=5,
   layout=wibox.layout.stack
}
-- actualisation
opaciteControle:connect_signal("widget::redraw_needed", function(c)
                     local v=opaciteControle.value
                     --
                     c.opacity=v
end)

最后将这个小部件插入标题栏的布局中,但这不起作用;客户端的 ID 似乎没有正确传递给函数。

谢谢你帮助我
大卫

添加 opacity_button(c), 例如在您的配置中 awful.titlebar.widget.floatingbutton(c), 之前。在较早的地方将以下内容添加到您的配置中:

local function opacity_button(c)
    local SCALE = 100
    local slider = wibox.widget {
       --forced_width        = 100,
       bar_shape           = gears.shape.rounded_rect,
       bar_height          = 1,
       bar_color           = beautiful.border_color,
       --handle_color        = beautiful.bg_normal,
       handle_color        = "#FFFFFF",
       handle_shape        = gears.shape.circle,
       handle_border_color = beautiful.border_color,
       handle_border_width = 1,
       minimum             = 0,
       maximum             = SCALE,
       value               = c.opacity * SCALE,
       widget              = wibox.widget.slider,
    }

    c:connect_signal("property::opacity", function()
        slider.value = c.opacity * SCALE
    end)
    slider:connect_signal("property::value", function()
        c.opacity = slider.value / SCALE
    end)

    -- Wrap other widgets around slider here if you want,
    -- e.g. your stack widget and the textbox
    local result = slider
    return slider
end

我不知道你为什么使用widget::redraw_signal信号。这改为使用滑块的 property::value 信号。此外,此小部件会更新滑块,以防客户端的不透明度通过某些外部方式(即在此小部件之外)发生变化。

哦还有:这会将来自小部件的值缩放 100,因为滑块小部件仅生成整数值(至少在我的测试中是这样)。

请注意,此代码以与例如相同的方式将客户端对象传递给小部件浮动按钮:作为信号连接功能的上值。我不知道您是如何找到 widget::redraw_needed,但它没有将客户端作为其第一个参数。