【问题标题】:How to get width and height of widget after it's been drawn in awesome?绘制后如何获取小部件的宽度和高度?
【发布时间】:2019-04-25 00:38:19
【问题描述】:

这就是这样的场景:假设我有一个文本框,我想将它准确地放置在屏幕的右侧,但仍然让文本框保留自己的尺寸。换句话说,我只想指定字体,让文本框选择正确的尺寸,然后将其放在屏幕边缘。如果我知道尺寸就很容易了,从那以后我就可以了

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 坐标自动重新定位。

此外,这不仅仅是关于文本框。我对其他小部件也有同样的问题,所以我的问题是:有什么方法可以让小部件获得他们喜欢的尺寸,但仍然可以让它们的几何形状重新定位到你想要的位置?

【问题讨论】:

  • 这是特定于文本框的,所以我不会给出答案,但是:wibox.widget.textbox 有一个get_preferred_size_at_dpi() 函数。这也凸显了为什么很难获得文本框的大小:不同的屏幕可以有不同的 DPI,所以同一个文本框可以同时有不同的大小。其他小部件还有其他复杂性。 Emmanuel 曾经尝试添加一个 API 来获得所有小部件的首选尺寸,我似乎设法说服他放弃它......

标签: awesome-wm


【解决方案1】:

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

-- 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 属性。

【讨论】:

  • 谢谢,但这不适用于多个屏幕吗?我正在自定义我的 wibar,所以据我所知,这是它可能出现在多个屏幕上的情况。因此,如果这是针对一个实例,有没有办法为这个小部件的多个实例执行此操作?
  • 为什么不使用align 布局呢? manual 布局在这里并没有真正的帮助。您还可以将awful.placementmanual 布局一起使用。还有place 容器,它能够将小部件锚定到一个角落。如果调整大小是问题,我可以向它添加一个grow 属性,以便它始终将其基本大小增加到所包含小部件的“新最大”大小。这将解决这样的用例,例如,网络流量小部件最终可以显示具有不同位数的值。不知道是不是你遇到的问题。
  • 谢谢,我最终使用了wibox.container.place 容器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2022-01-15
  • 2015-08-03
  • 2014-10-21
相关资源
最近更新 更多