web-dev-qa-db-ja.com

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の実行中に赤いボタンを押すと、モードが切り替わります(必要に応じて)and2番目のウィンドウを開きます/ Firefoxのインスタンス(あるべきではない)

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

EditPreferencesTabsOpen new windows in a new tab insteadは既に有効になっています:

tabs preferences

Firefoxの実行中に何が起こるか、ターミナルでfirefoxを起動しますか?

  • firefox-2番目のウィンドウが開きます
  • firefox about:startpage-事前設定されたスタートページでFirefoxの新しいタブが開きます
  • (!)firefox about:blank-個人のスタートページでFirefoxの新しいタブが開きます( Speeddial
  • firefox chrome://speeddial/content/speeddial.xul(これはSpeeddialの開始ページのアドレスです)-何も起こりません

Firefoxが実行されていないときに何が起こりますか、端末でfirefoxを起動しますか?

  • firefox-PreferencesShow my windows and tabs from last time)で設定されたとおりにFirefoxが開きます
  • 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が既に実行されているときにFirefoxをフォアグラウンドに入れない。これは時々のみ発生します。

この不正行為を修正するためにこのスクリプトを編集するのを手伝ってくれる人はいますか? ソース 修正したスクリプトの)。

4
Jakob

その中の一部のシェルコード source は、主張することを実行しません。主に行くタイプ:

if [ -n $(pgrep -f vlc) ]; then (vlc &); fi

これは、2つのケースでvlc &を実行します。 「vlc」に一致するプロセスがなく、「vlc」に一致するプロセスが1つだけの場合。 「vlc」に一致するプロセスが複数ある場合、vlc &は実行されません。したがって、これらのifブロックはかなり役に立たない。代わりにvlc &を実行するだけで、おそらくより正確になります。

残念ながら、インターネット上ではBad Shellのアドバイスは一般的です。

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

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

wmctrl -a 'Mozilla Firefox' || firefox &

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

-xを使用すると、wmctrlはウィンドウのVM_CLASSで動作し、通常はプログラムごとに一意の値を持ちます。 firefoxの実行中にwmctrl -lxを実行するとわかるように、すべての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 &

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

3
geirha