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

Я настроил 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 уже включен:

настройки вкладок

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

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

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 &

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

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