Я настроил lirc
управлять моим ПК с удаленным. Для переключения между различными режимами, я отредактировал .lircrc следующим образом:
begin vlc
include ~/.lirc/vlc
end vlc
begin gnome
include ~/.lirc/gnome
end gnome
begin firefox
include ~/.lirc/firefox
end firefox
begin me-tv
include ~/.lirc/me-tv
end me-tv
begin
prog = irexec
button = KEY_YELLOW
config = if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
mode = vlc
end
begin
prog = irexec
button = KEY_GREEN
mode = gnome
end
begin
prog = irexec
button = KEY_RED
config = if [ -n $(pgrep -x firefox) ]; then (firefox &); fi
mode = firefox
end
begin
prog = irexec
button = KEY_BLUE
config = if [ -n $(pgrep -x me-tv) ]; then (me-tv &); fi
mode = me-tv
end
Все хорошо работает с ним - кроме переключения на Firefox: Когда Firefox работает, и я нажимаю красную кнопку, это переключает режим (как это должно) и открывать второе окно/экземпляр Firefox (поскольку это не должно).
Проблема появляется только с Firefox.
Edit
→ Preferences
→ Tabs
→ Open new windows in a new tab instead
уже включен:
Что происходит, когда Firefox работает, и я запускаю firefox
в терминале?
firefox
- второе окно открываетсяfirefox about:startpage
- новая вкладка в Firefox открывается предварительно сконфигурированной начальной страницейfirefox about:blank
- новая вкладка в Firefox открывается моей персональной начальной страницей (Speeddial)firefox chrome://speeddial/content/speeddial.xul
(который является адресом начальной страницы Speeddial) - ничего не происходитЧто происходит, когда Firefox не работает, и я запускаю firefox
в терминале?
firefox
- Firefox открывается, как настроено в Preferences
(Show my windows and tabs from last time
)firefox about:startpage
- Firefox открывается дополнительной новой вкладкой с предварительно сконфигурированной начальной страницейfirefox about:blank
- Firefox открывается дополнительной новой, пустой вкладкойfirefox chrome://speeddial/content/speeddial.xul
- Firefox не открывается: *** Preventing external load of chrome: URI into browser window.
Use -chrome <uri> instead
Так, когда я изменяю команду в сценарии (config = ...
) и добавьте адрес как about:blank
это решает проблему частично. Поскольку проблема остается, что не помещает Firefox в передний план, когда она уже работает. Это только иногда происходит.
Кто-либо мог помочь мне отредактировать этот сценарий для фиксации этого недостойного поведения? (Источник сценария, который я изменил.)
Часть шелл-кода из этого источника не делает то, что заявляет; в основном это тип:
if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
Это работает vlc &
в двух случаях. Если нет процессов, соответствующих "vlc", и если существует ровно один процесс, соответствующий "vlc". Если существует более одного процесса, соответствующего «vlc», vlc &
не будет запущен. Так что эти блоки довольно бесполезны. Вместо этого, скорее всего, будет просто запустить vlc &
.
К сожалению, плохой совет по оболочке - это обычное явление в Интернете.
Исходя из описания вашей проблемы, вы хотите, чтобы в результате вы запустили программу, если она еще не запущена, и, если она запущена, переместите это окно вперед и выделите его. Для этого можно использовать wmctrl
.
wmctrl -a 'Mozilla Firefox'
найдет окно, содержащее «Mozilla Firefox» в заголовке, и «активирует» его. То есть переместитесь в рабочее пространство, в котором он находится, перенесите его на передний план и выделите его. Во-вторых, если окна не совпадают, wmctrl ничего не сделает и выйдет с ненулевым (ложным) состоянием выхода, и в этом случае мы можем предположить, что программа не запущена, и вместо этого запустить ее.
wmctrl -a 'Mozilla Firefox' || firefox &
Это все еще не идеально, хотя. Другие окна, кроме окон Firefox, потенциально могут содержать эту строку в заголовке, поэтому мы должны найти более надежный способ определения правильного окна в этом случае.
С помощью -x wmctrl будет работать с VM_CLASS окна, которое обычно будет иметь уникальное значение для каждой программы. Все окна Firefox будут иметь VM_CLASS «Navigator.Firefox», что можно увидеть, запустив wmctrl -lx
во время работы Firefox
$ wmctrl -lx
...
0x03ba3d43 3 gnome-terminal.Gnome-terminal pilot Terminal
0x04c000bc 0 Navigator.Firefox pilot Group #1 - Speed Dial - Mozilla Firefox
. Таким образом, мы можем выбрать окно, которое имеет именно «Navigator.Firefox» как VM_CLASS.
wmctrl -Fxa Navigator.Firefox || firefox &
То же самое должно быть применимо к другим программам.