
我設定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 中出現。
Edit
→ Preferences
→ Tabs
→Open new windows in a new tab instead
已啟用:
會發生什麼當火狐瀏覽器運作時我firefox
從終端開始?
firefox
- 第二個視窗打開firefox about:startpage
- Firefox 中會開啟一個預先設定起始頁的新選項卡- (!)
firefox about:blank
- Firefox 中會開啟一個新選項卡,其中包含我的個人起始頁 (快速撥號) firefox chrome://speeddial/content/speeddial.xul
(這是快速撥號起始頁的網址)- 什麼都沒發生
會發生什麼當 Firefox 未運作時我firefox
從終端開始?
firefox
Preferences
- Firefox 依照(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
其中的一些 shell 程式碼來源沒有做它聲稱要做的事;主要是這樣的類型:
if [ -n $(pgrep -f vlc) ]; then (vlc &); fi
這vlc &
在兩種情況下運行。如果沒有與「vlc」相符的進程,並且恰好有一個與「vlc」相符的進程。如果有多個進程匹配“vlc”,vlc &
則不會運行。所以這些 if 區塊是相當無用的。只是跑步vlc &
可能會更正確。
不幸的是,糟糕的 shell 建議在網路上很常見。
根據您的問題描述,您希望的結果是,如果程式尚未運行,則運行該程式;如果正在運行,則將該視窗置於最前面,並給予其焦點。為此,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 &
希望同樣的情況也適用於其他程序。