Как переключить заголовок в AwesomeWM?

Я пытаюсь изменить свой файл rc.lua следующим образом: когда я нажимаю Mod4 + R, сочетание клавиш AwesomeWM для запуска команды, я хочу, чтобы Rofi появлялся, размывал мои обои и скрывал все с моего экрана. Я хочу, чтобы была видна только подсказка Rofi поверх размытых обоев.

Для этого у меня есть следующий код в моем файле conf. Я использую AwesomeWM v3.5.9 (Mighty Ravendark) с Lua 5.3.3:

--From PROmpt COMmand:
procom = "rofi -show run"

awful.key({ modkey }, "r", function () awful.util.spawn(procom)

    for _,c in ipairs(client.get()) do
        if c:isvisible() then
            mywibox[mouse.screen].visible = not mywibox[mouse.screen].visible 
        else 
            mywibox[mouse.screen].visible = mywibox[mouse.screen].visible 
        end
    end

end),

Перезапуск AwesomeWM вообще не будет жаловаться, но мой wibox не исчезнет. Если я изменю код на что-то тривиальное (например, if mywibox[mouse.screen],visible в качестве условного оператора), виджеты исчезнут, но пустая черная полоса останется там, даже если я выйду из Rofi, только вернувшись в исходное состояние. при повторном вызове Рофи (это вызвано заявлением, которое я сделал изначально, поэтому я посчитал его тривиальным).


person xvlaze    schedule 08.01.2017    source источник
comment
Название этого вопроса вводит в заблуждение и не отражает то, что спрашивали и обсуждали. Google привел меня сюда по этой причине, и я потратил время, выясняя, что это не имеет значения.   -  person Arnaud Meuret    schedule 04.09.2020


Ответы (2)


Для нового вопроса:

Ваш фрагмент кода не работает, потому что вы проверяете, виден ли клиент, а затем переключаете случайный wibox (хорошо, не такой случайный). Wibox будет отображаться и скрываться много раз, если вы делаете это для каждого клиента. Таким образом, вы получаете ~ 50% изменение возврата к исходному состоянию и ~ 50% изменение отсутствия wibox и возможности его вернуть.

Я расширю последнюю часть моего предыдущего ответа, поскольку теперь это вопрос.

Что вы хотите:

  • Скрыть вайбар (mywibox) при запуске rofi
  • Скрыть всех клиентов при запуске rofi
  • Восстановить wibar, когда rofi существует
  • Возможно, снова отобразить тег (или нет, на ваше усмотрение).

Проблемы:

  1. Вы не знаете, когда Рофи выходит
  2. Вы не знаете, когда появится Рофи
  3. Вы не знаете имен вещей, которые хотите скрыть
  4. Нужно скрыть теги и вайбар

Проблема 3:

Не ваша вина, в версии 3.5 нет документации по этому поводу, и вики в равной степени сбивает с толку.

  • awful.wibox (теперь переименованный в wibar) — это штука в верхней части экрана.
  • wibox — это случайный свободно плавающий виджет на экране. Вибар — это тип вайбокса, работающий как панель.
  • Клиент — это окно на экране
  • Тег похож на виртуальную рабочую область

Проблема 2:

Это сложно. Когда вы запускаете команду, существует задержка между этим и появлением приложения. Есть способы его обнаружить, но они не тривиальны. Пока вы можете игнорировать эту проблему.

Проблема 1:

Это то, что вам действительно нужно решить. Awesome 3.5 не имеет хорошего API для отслеживания жизненного цикла от команды до выхода из приложения. Awesome 4.0 немного лучше, но решить эту проблему сложно. Однако вы должны знать class rofi (используя xprop). Как только вы это узнаете, вы можете упростить проблему, заботясь только о том, чтобы «создать событие, когда rofi выходит». Код для этого:

client.connect_signal("unmanage", function(c)
    if c.class == "whatever_its_class_is" then
        -- watch out of you have multiple screens, this may be too simplified.
        mywibox[mouse.screen].visible = true

        -- show the first tag, change this to what you prefer
        awful.tag.gettags(mouse.screen)[1].selected = true
    end
end)

Проблема 4:

Простой способ скрыть текущий тег (предполагается, что у вас есть 1 экран и 1 выбранный тег для простоты)

awful.tag.selected().selected = false

Скрыть основной вайбар (при условии, что вы сохранили имя по умолчанию)

mywibox[mouse.screen].visible = false

Исходный ответ: (вопрос изменился)

Ну, c это просто переменная. В данном случае вы никогда его не определяли, так что это nil.

Я думаю, вы хотите, чтобы все видимые в настоящее время client. Чтобы проверить это, используйте client:isvisible().

Вы можете зациклиться на всех клиентах, используя

for _, c in ipairs(client.get()) do
    if c:isvisible() then
        -- do something
    end
end

Как показано в документации клиента (https://awesomewm.org/apidoc/classes/client.html [1])

При этом я не понимаю, как подходят описание и вопрос/код. Если вы хотите скрыть все, снимите все теги и скройте вайбар. Возиться с заголовками (вещь поверх клиентов) кажется довольно ненужным.

[1] Ссылка предназначена для Awesome 4.0, но в данном случае не сильно отличается от API 3.5.

person Emmanuel Lepage Vallee    schedule 09.01.2017
comment
Я думаю, вы на правильном пути, но после некоторых изменений проблема все еще существует. Я обновил вопрос. - person xvlaze; 09.01.2017
comment
Я обновил ответ, чтобы отразить более конкретный вопрос - person Emmanuel Lepage Vallee; 10.01.2017
comment
Кажется, невозможно найти имя класса Rofi. Прилагаю код результата. Спасибо за ваше время! - person xvlaze; 10.01.2017
comment
Если класс не установлен (это ошибка, о которой вы должны сообщить им), вы можете использовать имя или проанализировать startup_id. Подойдет все, что может идентифицировать клиента. - person Emmanuel Lepage Vallee; 11.01.2017
comment
Если я заменю "whatever_its_class_is" на "rofi", ничего не произойдет. - person xvlaze; 11.01.2017
comment
Как я сказал в последнем комментарии, если у него нет класса, то это их ошибка, но вы можете обойти ее, используя что-то еще, например свойства name или startup_id. Почитайте документ (awesomewm.org/apidoc/classes/client.html). (ссылка для 4.0, вы должны обновить)). Я имею в виду, что могу ответить на конкретные вопросы, но вам все равно придется немного покопаться и понять принципы игры. Использование Awesome без понимания того, как это работает, никогда не сработает. Если у вас есть вопросы, связанные с API, на которые документ не может ответить, сообщите об ошибке в системе отслеживания проблем Awesome. - person Emmanuel Lepage Vallee; 11.01.2017
comment
Я выберу вариант имени. Поэтому, если я немного изменю код, я получу mywibox[mouse.screen].visible = false и внутри части unmanage if c.name == "rofi" then строку, которая делает wibox видимым. Я могу заставить его исчезнуть, но он больше не появится. - person xvlaze; 11.01.2017
comment
Заставить его появляться и исчезать - две разные проблемы. Когда клиент запускается и когда клиент выходит, это не одно и то же событие. См. полный ответ выше. - person Emmanuel Lepage Vallee; 13.01.2017
comment
Я обновил свой код, чтобы вам было легко увидеть мою ситуацию. Еще раз, спасибо за ваше время. - person xvlaze; 13.01.2017

Вся функция в моем rc.lua прямо сейчас. Работает нормально, но в будущем планирую улучшить. Зато отлично отвечает на вопрос.

 -- Prompt
    awful.key({ modkey }, "r", 
              function ()
                  myscreen                 = awful.screen.focused()
                  commandPrompter          = "rofi -show run -normal-window"
                  blur                     = "hsetroot -fill /usr/local/share/awesome/themes/modded/back$
                  unblur                   = "hsetroot -fill /usr/local/share/awesome/themes/modded/back$
                  awful.spawn(commandPrompter)
                  myscreen.mywibox.visible = false
                  awful.spawn(blur)
              end),

введите здесь описание изображения

person xvlaze    schedule 24.07.2017