2 番目のインスタンスを開かないようにするにはどうすればよいですか?

2 番目のインスタンスを開かないようにするにはどうすればよいですか?

lircリモコンでPCを操作できるように設定しました。モードを切り替えるには、.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 の 2 番目のウィンドウ/インスタンスが開きます (本来は開くべきではない)

この問題は Firefox でのみ発生します。

EditPreferencesTabs→ はOpen new windows in a new tab insteadすでに有効になっています:

タブの設定

何が起こるのですかFirefoxが起動しているときfirefoxターミナルで起動しますか?

  • firefox- 2番目のウィンドウが開きます
  • firefox about:startpage- Firefoxの新しいタブが、事前に設定されたスタートページで開きます
  • (!)firefox about:blank- Firefoxの新しいタブが開き、私の個人用スタートページが表示されます(短縮ダイヤル
  • firefox chrome://speeddial/content/speeddial.xul (スピードダイヤルのスタートページのアドレスです)- 何も起こりません

何が起こるのですかFirefoxが起動していないときfirefoxターミナルで起動しますか?

  • firefox- FirefoxはPreferencesShow 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 &2 つの場合に実行されます。"vlc" に一致するプロセスがない場合と、"vlc" に一致するプロセスが 1 つだけある場合です。"vlc" に一致するプロセスが複数ある場合は、vlc &実行されません。したがって、これらの if ブロックはあまり役に立ちません。vlc &代わりに、単に実行する方がおそらくより正確です。

残念ながら、インターネット上ではシェルに関する誤ったアドバイスがよく見られます。

問題の説明からすると、プログラムがまだ実行されていない場合はプログラムを実行し、実行されている場合は、そのウィンドウを前面に移動してフォーカスを与えることが、結果的に望ましいことになります。これを行うには、wmctrlを使用できます。

wmctrl -a 'Mozilla Firefox'タイトルに「Mozilla Firefox」を含むウィンドウを見つけて、それを「アクティブ化」します。つまり、そのウィンドウがあるワークスペースに移動し、それを前面に持ってきてフォーカスを与えます。次に、一致するウィンドウがない場合、wmctrl は何もせず、ゼロ以外の (偽の) 終了ステータスで終了します。この場合、プログラムが実行されていないと想定して、代わりにプログラムを起動できます。

wmctrl -a 'Mozilla Firefox' || firefox &

ただし、まだ完璧ではありません。Firefox ウィンドウ以外のウィンドウのタイトルにその文字列が含まれる可能性があるため、この場合は正しいウィンドウを識別するためのより信頼性の高い方法を見つける必要があります。

wmctrl -lx-x を使用すると、wmctrl はウィンドウの VM_CLASS を操作します。これは通常、プログラムごとに一意の値を持ちます。Firefoxの実行中に実行するとわかるように、すべての Firefox ウィンドウの VM_CLASS は "Navigator.Firefox" になります。

$ wmctrl -lx
...
0x03ba3d43  3 gnome-terminal.Gnome-terminal  pilot Terminal
0x04c000bc  0 Navigator.Firefox     pilot Group #1 - Speed Dial - Mozilla Firefox

これにより、VM_CLASSとして「Navigator.Firefox」を持つウィンドウを選択できます。

wmctrl -Fxa Navigator.Firefox || firefox &

同じことが他のプログラムにも当てはまるはずです。

関連情報