Автогенерация виджетов в awesome-wm

Итак, что я сейчас хочу сделать, так это реализовать rofi в awesome.

Причина, по которой я хочу это сделать, а не просто использовать rofi, заключается в том, что я хочу научиться «автогенерировать» виджеты в awesome. Это пригодится позже, когда я буду реализовывать такие вещи, как сетевые виджеты, которые при нажатии показывают вам панель, показывают вам точки доступа Wi-Fi, доступные в виде строк, и т. д. и т. д. Так что это просто для меня, чтобы узнать, как awesome работает лучше. Но также, я хочу программу запуска.

А еще, прежде чем кто-то предложит это, я уже знаю, что в awesome есть встроенный лаунчер, и я также знаю, что есть это. Это не то, что я ищу. Я хочу, чтобы у rofi и dmenu было то же самое: я хочу, чтобы предложения всплывали при нажатии клавиш. и я хочу иметь возможность нажимать на предложения и т. д. Я хочу что-то вроде этого: uhhhh< /а>

Итак, у меня проблемы: как мне автоматически генерировать строки? Я хочу иметь возможность указать только в одном месте, сколько строк мне нужно, а awesome сделает все остальное.

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

Итак, мой вопрос: как я могу заставить это работать? Как мне сделать виджеты, которые автоматически действуют как строки?

TL;DR:

  • Я хочу написать программу запуска, такую ​​​​как rofi, в awesome
  • я хочу иметь возможность указать только в одном месте количество строк
  • поэтому, ((( я думаю))) мне нужно как-то автоматически генерировать виджеты как строки, как я могу это сделать?

РЕДАКТИРОВАТЬ:

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


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

local num_rows = 10
local row_height = 40

-- set the height of the background in accordance to how many rows there are,
-- and how high each row should be
local prompt_height = row_height * num_rows
local prompt_width = 300

-- make a widget in the middle of the screen
local background = wibox({
    x = awful.screen.focused().geometry.width / 2 - prompt_width / 2,
    y = awful.screen.focused().geometry.height / 2 - prompt_height / 2,
    width = prompt_width,
    height = prompt_height,
    bg = "#111111",
    visible = false,
    ontop = false
})
local rofi_launcher = wibox.widget({
    widget = background,
    {
        -- get a flexible layout so the searchbox and the suggestion boxes get 
        -- scaled to take up all the space of the background
        layout = wibox.layout.flex.vertical,
        { -- the prompt you actually type in
            -- set id here so we can adjust its ratio later, so the magnifying
            -- glass will end up on the right, and the texbox will take up the left side
            id = "searchbox_and_mangifying_glass",
            layout = wibox.layout.ratio.horizontal,
            {
                -- set id so we can use it as a prompt later
                id = "searchbox",
                widget = wibox.widget.textbox,
            },
            {
                widget = wibox.widget.imagebox,
                icon = '~/path/to/magnifying_glass_icon.svg',
                
            },
        },
        { -- this is where I actually create the rows that will display suggestions
            { -- row number 1
                -- make a background for the textbox to sit in, so you can change 
                -- background color later for the selected widget, etc etc. 
                widget = wibox.widget.background,
                    {
                        -- give it an id so we can change what's displayed in the
                        -- textbox when we press keys in the prompt
                        id = "suggestion_1",
                        widget = wibox.widget.textbox,
                    },
            },
            { -- row number 2
                -- background, again
                widget = wibox.widget.background,
                    {
                        -- id and textbox again
                        id = "suggestion_2",
                        widget = wibox.widget.textbox,
                    },
            },
            -- and another 8 (according to the `num_rows` variable) of the same two 
            -- textboxes above. This is exactly my problem. How can I make these 
            -- textboxes automatically and still be able to interact with them to 
            -- display suggestions on the fly, as the user types keys into the prompt?

        },

    },
})

Если это недостаточно ясно, сообщите мне, что вы не понимаете, и я обновлю свой вопрос.


person LawsDontApplyToPigs    schedule 04.04.2019    source источник
comment
У меня есть небольшая проблема, чтобы понять, что именно вы спрашиваете. Если бы я написал для вас пример кода, что именно он должен был бы делать? Простое динамическое создание виджета - это просто вызов, например. wibox.widget.textbox() в нужном месте...?   -  person Uli Schlachter    schedule 05.04.2019
comment
Я обновил свой вопрос. Если все еще не ясно, что я хочу сделать, пожалуйста, попросите меня предоставить более конкретную информацию.   -  person LawsDontApplyToPigs    schedule 05.04.2019


Ответы (1)


Такой же непроверенный, как и ваш код, но это создает таблицы текстовых полей вместо использования декларативного макета для создания всех этих текстовых полей:

[SNIP; For shorter code I removed some stuff at the beginning]

local textboxes = {}
local widgets = {}

for i = 1, num_rows do
    local tb = wibox.widget.textbox()
    local bg = wibox.widget.background(tb)
    bg:set_bg("#ff0000") -- The original code did not set a bg color, but that would make the bg widget useless...?

    tb.id = "suggestion_" .. tostring(i) -- This is likely unnecessary, but the original code set these IDs, too

    table.insert(textboxes, tb)
    table.insert(widgets, bg)
end

local rofi_launcher = wibox.widget({
    widget = background,
    {
        -- get a flexible layout so the searchbox and the suggestion boxes get 
        -- scaled to take up all the space of the background
        layout = wibox.layout.flex.vertical,
        { -- the prompt you actually type in
        [SNIP - I did not change anything here; I only removed this part to make the code shorter]
        },
        widgets
    },
})

-- Now make the textboxes display something
textboxes[3].text = "I am the third row"
textboxes[5].text = "I am not"
person Uli Schlachter    schedule 06.04.2019