防止窗口抢占焦点

我正在使用启用了Compiz的Maverick。
我已经在AskUbuntu和Google上搜索过了。AskUbuntu上没有关于这个主题的任何内容,而且Google找到的所有结果都是几年前的。
我正在进行浏览器测试,我的测试不断生成新的Firefox窗口。问题是,当窗口生成时,它会获得焦点。这非常让人恼火,因为我通常正在其他地方输入文字。这不仅发生在我的测试中,但这是我遇到的最常见的例子。有时候我的IDE决定在某些特殊情况下(比如编译完成时)获得焦点,然后我会在代码中找到我输入的即时消息的片段。这让我疯狂。我已经在Gnome设置和Compiz设置中查找了,但找不到阻止这种情况发生的方法。
有人知道如何防止应用程序在打开时窃取焦点吗?我宁愿任务栏闪烁来引起我的注意。
4个回答


1谢谢,那很有帮助。这样可以确保我输入的内容进入正确的窗口,但是打开的 Firefox 窗口仍然会显示在我正在工作的窗口之上...即使它们没有焦点。另外,IntelliJ 仍然忽略了这个规则。 - Joel
你在做什么样的测试,又打开了什么样的新窗口? - lovinglinux
1@lovinglinux: 不好意思刚注意到你的问题。我正在运行Selenium测试,因此会打开Firefox窗口。另外,我正在使用调试器运行JUnit测试,所以当遇到断点时,IntelliJ会将焦点转移到告诉我相关信息。根据msw的帖子中提到的方法,Firefox的焦点问题已经解决了。然而,IntelliJ似乎忽略了Compiz的设置。 - Joel
@Joel,你是怎么设置的?你使用了什么焦点防护级别,以及你是如何配置“焦点防护窗口”的匹配规则的? - blueyed
@blueyed,抱歉,但是已经过了很长时间,我换了电脑,不记得设置是什么了。 - Joel
在16.04版本中,选项的路径是CompizConfig -> General Options -> Focus&Raise Behavior tab。回答中的"General"一词有点误导性,因为在主要的CompizConfig视图中有一个名为"General"的选项卡。 - Dmitry Koroliov
这个方法帮助我解决了在Ubuntu 16.04上使用Unity时Itellij Idea窗口焦点被抢占的问题,只需将Focus Prevention Level设置为Very HighHigh,并将Focus Prevention Windows设置为!(class=Polkit-gnome-authentication-agent-1) & class=jetbrains-idea即可。 - Alex Burdusel

这不是你应该在全局配置的东西。 也就是说,你真正想要的不是没有新窗口获得焦点,而是没有测试窗口获得焦点。 为了实现这一点,使用Compiz的Window Rules插件来阻止所有“测试”Firefox窗口获得焦点。
你需要编写一个规则来仅识别“测试”Firefox实例。如果它们的标题中都有特定的字符串,那么这个方法可以工作。否则,你可以使用wmctrl来设置WM_ICON_NAME X属性。(我不知道如何轻松地为Firefox设置X属性...如果有其他人知道,请告诉我!)

你可以在gconf-editor中更改此设置,如果你没有安装CCSM的话。导航到/apps/compiz/general/screen0/options/focus_prevention_level键,并将其值设置为4。
对于一些人来说,4太高了。当设置为4时,Eclipse用户会发现各种对话框无法正确地抓取键盘焦点,但如果设置为3,则可以。

如果你大部分时间都在一个窗口中工作,你可以右键点击标题栏,并选择让窗口始终置顶...这不是一个完美的解决方案,但是你可以在完成工作后将窗口遮蔽起来,或者将其最小化然后再返回。