Почему делает мой wmctrl-a, команда не повышают мое минимизированное окно Rhythmbox?

Проблема

Я в настоящее время добавляю несколько пользовательских ярлыков.

Я перестал работать при раскрытии минимизированного окна Rhythmbox. Я использую wmctrl в сценарии оболочки, вижу ниже для этой задачи. Когда я нажимаю ключевую комбинацию, ничего не происходит (визуально). Разоблачающий Firefox, например, с помощью адаптированной версии сценария оболочки ниже работ без любых проблем; почему Rhythmbox не ведет себя то же?

Упомянутый сценарий оболочки:

sh -c "if pgrep -x rhythmbox > /dev/null; then wmctrl -a rhythmbox; else rhythmbox; fi"

Важное редактирование:

По-видимому, мой сценарий работает теперь - не изменив что-либо об этом. Однако я работал killall rhythmbox. После того, как тот мой сценарий оболочки работал как ожидалось. Я думаю, просто добавив фиксацию вместо того, чтобы удалить вопрос, я, возможно, могу помочь кому-то спотыкающемуся через ту же проблему. Если Вы думаете, что знаете, почему это произошло, очень чувствуйте себя свободно для совместного использования theroy.

Еще одно редактирование:

Ничего себе, хорошо... Буквально спустя секунды после добавления, которые в последний раз редактируют, я пытался использовать повторенный ярлык, и он не работал. Я уничтожил процесс, и все работало снова - then И else тело. После нажатия в и из нескольких других окон, это прекратило работать снова. После того, как я работал killall rhythmbox и наблюдение она работать снова отлично, даже после того, как мне не удалось воспроизвести ошибку, я пришел к выводу, что она действует довольно случайная. Ну, псевдослучайный, конечно. Если Вы хотите попробовать его за себя, Вы знаете, как сделать это. Можно получить wmctrl путем выполнения sudo apt install wmctrl. Я использую версию 1.07 его на Ubuntu 16.04 LTS и очень смущенный.

Последнее редактирование (никогда не говорят в последний раз):

Я на самом деле заставил Firefox показывать себя теперь после нажатия сочетания клавиш. Это прохладно, просто не, что я хочу. Я выпью большую чашку кофе теперь и сделаю что-то еще, ничего себе.

4
задан 6 February 2017 в 15:13

1 ответ

Проблема: rhythmbox меняет имя окна

Проблема - то, что Вы определяете окно его именем, с помощью wmctrl -a. От man wmctrl:

-a <WIN>
    Switch to the desktop containing the window <WIN>, raise the window, and give it focus. 

<WIN> строка идентификации на имя окна.

Особенно в Вашем случае, это, вероятно, вызовет ошибки, так как Rhythmbox меняет имя окна, в зависимости от песни. Необходимо определить окно или его классом окна или его id

Последний может быть сделан с помощью:

wmctrl -ia

где опция -i обозначает идентификатор окна:

   -i     Interpret window arguments (<WIN>) as  a  numeric  value  rather
          than  a  string name for the window. If the numeric value starts
          with the prefix '0x' it is assumed to be a hexadecimal number.

И идентификатор окна и pid, которому принадлежит окно, могут быть получены из списка окна, названного командой:

wmctrl -lp 

Надежная команда для повышения нового окна от, например, Rhythmbox затем:

wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

Объяснение:

wmctrl -lp

списки все окна, включая их pids. Важное свойство команды - то, что она перечисляет окна в порядке, они были созданы.

Поэтому:

wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }'

будет:

  • перечислите все окна + pids, они принадлежат:

    wmctrl -lp
    
  • найдите тех, принадлежащими rhythmbox:

    grep "$(pgrep rhythmbox)"
    
  • найдите последний (который является также последним созданным):

    tail -1
    
  • извлеките первую строку в строке (который является окном - идентификатор):

    awk '{ print $1 }'
    

Команда:

wmctrl -ia

затем повысит новое окно Rhythmbox его идентификатором.

Сценарий

По причинам удобства, и предотвратить проблемы с кавычками, я сделал бы крошечный сценарий из него с командой и выполнил бы его от ярлыка:

#!/bin/bash
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

Сделайте это исполняемым файлом и Добавьте shortut ключ: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

/path/to/script.sh

Дополнительно

Похоже на использование команды/сценария для нескольких приложений. Вместо того, чтобы делать отдельные сценарии для каждого приложения, можно привести аргумент приложения сценарию:

#!/bin/bash
app=$(pgrep $1)
wmctrl -ia "$(wmctrl -lp | grep "$app" | tail -1 | awk '{ print $1 }')"

Затем

 /path/to/script.sh gedit

повысит последний раз созданный gedit окно, в то время как

/path/to/script.sh rhythmbox

повысит последний раз созданный rhythmbox окно, и так далее.

2
ответ дан 1 December 2019 в 10:16

Другие вопросы по тегам:

Похожие вопросы: