我设置了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
- 打开第二个窗口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 将不执行任何操作并以非零(false)退出状态退出,在这种情况下,我们可以假设程序没有运行,而是启动它。
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
这样我们就可以选择 VM_CLASS 为“Navigator.Firefox”的窗口
wmctrl -Fxa Navigator.Firefox || firefox &
希望同样的做法也适用于其他程序。