Получить геометрию виджетов с переменным размером

Ситуация

У меня есть виджет pop_up (скажем, текстовое поле), который я могу произвольно разместить на экране, установив свойства x и y соответственно. С другой стороны, я использую подсказку, которая находится в вайбаре по умолчанию.

Я хотел бы разместить виджет pop_up непосредственно под подсказкой

Проблема

Мне пока не удалось собрать какую-либо полезную информацию о геометрии подсказки. Под геометрией я подразумеваю ее значения x и y, а также ее высоту и ширину. Я решил позиционирование по оси Y, используя высоту самого вайбара. Но я застрял с x-позиционированием. Есть ли способ получить ширину виджетов на панели инструментов?

Уведомление

Я что-то читал про принудительную_ширину, но в данной ситуации это звучит как хак. Поэтому я бы предпочел избегать форсирования любой ширины.

В настоящее время я использую потрясающую WM 4.2 на Fedora 26.


person manuben    schedule 05.12.2017    source источник


Ответы (1)


Часть проблемы заключается в том, что виджет «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