Как постараться не открывать второй экземпляр?

Я настроил 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.

EditPreferencesTabsOpen new windows in a new tab instead уже включен:

tabs preferences

Что происходит, когда 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 в передний план, когда она уже работает. Это только иногда происходит.

Кто-либо мог помочь мне отредактировать этот сценарий для фиксации этого недостойного поведения? (Источник сценария, который я изменил.)

4
задан 4 March 2012 в 23:32

1 ответ

Часть шелл-кода из этого источника не делает то, что заявляет; в основном это тип:

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 &

То же самое должно быть применимо к другим программам.

0
ответ дан 4 March 2012 в 23:32

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

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