绘制真棒后如何获取小部件的宽度和高度?

时间:2019-04-24 09:17:31

标签: awesome-wm

这就是这种情况:假设我有一个文本框,希望将其精确地放置在屏幕的右侧,但仍然让该文本框保留其自己的尺寸。换句话说,我只想指定字体,让文本框选择合适的尺寸,然后将其放置在屏幕的边缘。如果我知道尺寸,那真的很容易,从那时起我就可以做到

local awful = require("awful")
local wibox = require("wibox")

local text_widget = wibox.widget({
    widget = wibox.widget.textbox,
    font = "Roboto Medium 15",
    text = "hello world",
})

local rightmost_place = wibox.widget({
    layout = wibox.layout.manual,
    {
        text_widget,
        point = {
            y = 0, 
            -- You can't actually do the `text_widget.geometry.width`
            x = awful.screen.focused().geometry.width
                - text_widget.geometry.width
        },
        -- We're not setting these so the textbox
        -- will get its size automatically
        -- forced_width = 
        -- forced_height = 
    },
})

这样,每当我输入一些内容时,文本框都会变大,但会根据x坐标自动重新定位。

此外,这不仅涉及文本框。我在其他小部件上也遇到了同样的问题,所以我的问题是:是否有某种方法可以让小部件获取它们喜欢的尺寸,但仍然可以使它们的几何形状重新定位到您想要的位置?

1 个答案:

答案 0 :(得分:0)

问题是小部件可以同时放置在多个位置(具有多个大小)。这对于某些情况(例如文本时钟)在所有屏幕上都具有单个实例(带有单个计时器)很有用。这使得获取尺寸有些棘手。如果您不打算在多个位置使用小部件,则可以作弊并添加width / height属性。

-- in the declarative syntax, add an `id`
id = `id_of_the_widget_with_size`,

-- Get the widget (somewhere outside of the declarative section)
local w = rightmost_place:get_children_by_id("id_of_the_widget_with_size")[1]
w._real_draw = w.draw
w.draw = function(self, context, cr, width, height)
    self.width, self.height = width, height
    w._real_draw(self, context, cr, width, height)
end

现在,从理论上讲,该小部件将具有widthheight属性。