
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 でのみ発生します。
Edit
→ Preferences
→ Tabs
→ は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は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 &
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 &
同じことが他のプログラムにも当てはまるはずです。