Часть проблемы заключается в том, что виджет «a» не имеет положения и размера, поскольку awesome позволяет отображать виджеты в нескольких местах одновременно. Однако, если мы просто проигнорируем эту проблему, может сработать что-то вроде следующего (честно говоря, я не проверял это):
function find_widget_in_wibox(wb, widget)
local function find_widget_in_hierarchy(h, widget)
if h:get_widget() == widget then
return h
end
local result
for _, ch in ipairs(h:get_children()) do
result = result or find_widget_in_hierarchy(ch, widget)
end
return result
end
local h = wb._drawable._widget_hierarchy
return h and find_widget_in_hierarchy(h, widget)
end
Тем не менее, я должен предупредить вас, что вышеуказанное может сломаться в более новых версиях awesome, поскольку оно обращается к непубличному API (часть с wb._drawable._widget_hierarchy
). Есть способ работать только с общедоступным API, используя :find_widgets()
, но я пока слишком ленив для этого.
Вышеупомянутая функция получает экземпляр wibox.hierarchy
, представляющий виджет, который позволяет получить геометрию подсказки с помощью чего-то вроде следующего (в конфигурации по умолчанию awesome 4.2):
local s = screen.primary -- Pick a screen to work with
local h = find_widget_in_wibox(s.mywibox, s.mypromptbox)
local x, y, width, height = h:get_matrix_to_device()
:transform_rectangle(0, 0, h:get_size())
local geo = s.mywibox:geometry()
x, y = x + geo.x, y + geo.y
print(string.format("The widget is inside of the rectangle (%d, %d, %d, %d) on the screen", x, y, width, height)
Наконец, обратите внимание, что иерархия виджетов обновляется только во время перерисовки. Таким образом, при запуске приведенный выше код вообще не сможет найти виджет, и сразу после того, как что-то изменилось (например, вы ввели другой символ в поле подсказки), приведенный выше код все равно «выяснит» старую геометрию.
person
Uli Schlachter
schedule
06.12.2017