我对 X 打开下的窗口感到恼火,并将焦点从当前具有焦点的窗口移开。当您在密码对话框中输入密码而另一个应用程序窃取焦点时,这尤其令人讨厌,因此您的某些击键最终会出现在新应用程序中。
我一直对 Windows 中的这个感到恼火,但在那里几乎无能为力,我不禁觉得这应该可以在 Unix 上修复。
我目前使用 Gnome 作为我的桌面环境(在 RHEL 5.8 上),并且根据wmctrl -m我目前Metacity用作我的窗口管理器。虽然我更愿意坚持使用这些默认选项,但我很乐意了解不表现出这种行为的窗口管理器。
我想要一个键盘快捷键来“转到”(焦点 + 提升)窗口,并设置了 URGENT 标志,看起来像 URGENT:它出现在任务栏(Gnome + Metacity)上,即使它在桌面上而不是当前并开始眨眼(感谢@slm 指出)。
此窗口可能位于当前虚拟桌面之外的其他虚拟桌面上。
在这种特殊情况下,Skype 窗口设置了紧急标志,因此它们出现在alt-tab弹出窗口(metacity WM)中,但如果它不在当前虚拟桌面上,我无法切换到此窗口。
我正在调查xdotool和wmctrl指挥,但没有运气。
任何想法或线索?
更新:看来,我在谈论_NET_WM_STATE= _NET_WM_STATE_DEMANDS_ATTENTION...
我的 GNOME Shell 中有多个工作区和两个显示器,我想找到一种方法来排除辅助显示器上的窗口窃取焦点。理想情况下,最好也将这些窗口排除在外Alt+Tab。
下面的设置是一个很好的例子,说明这会如何妨碍:
Primary Secondary
1: Thunderbird system monitor
2: (nothing) system monitor
3: Terminal system monitor
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我在工作区 #1 中阅读邮件并切换到工作区 #3(终端)做某事然后回来,我现在的重点是系统监视器而不是 Thunderbird。
我不知道有任何扩展可以解决这个问题,但是如果确实存在,或者我们只是在谈论对 dconf 或其他东西的更改,我会很高兴。但是,如果事实证明这在 GNOME 中目前是不可能的,那么我也想知道这一点,以便我可以将其报告为功能请求。
我使用 Archlinux 3.17.2-1 和 gnome-shell 3.14.1.5-1
我使用键盘快捷键打开各种应用程序,例如Ctrl+Alt+G打开gnome-terminal和Ctrl+Alt+T打开xfce4-terminal
按下 时Ctrl+Alt+g,焦点将设置为新Ctrl+Alt+t打开的终端,但按下时焦点不会更改为打开的终端。
是否有任何命令可以使舒尔将焦点设置到新窗口?
notify-send在 bash 脚本中给出一些简单的命令,例如
notify-send "test"
Run Code Online (Sandbox Code Playgroud)
当用户单击该通知时,如何使确定的窗口获得焦点?我以为玩转-a开关会做些什么,但我无法让它在 GNOME Shell 和 XFCE 上工作。
我有一个脚本可以重新编译并重新启动我在 linux 中构建的软件项目。但是,我通常不希望在程序启动后立即看到我的程序窗口,因为我希望将键盘焦点放在我的 vim 窗口上。
通常,我的程序启动,自动获得焦点,并出现在我工作区的其他窗口之上。
是否可以在 linux 中启动一个程序,但不能让它窃取焦点,也不能让它出现在所有其他窗口的顶部?
注意:如果重要的话,我正在运行 Fedora 13、GNOME、compiz 并使用 Emerald 主题。
理想情况下,我想要一种从 shell 脚本中检测窗口是否具有焦点的好方法。通过一个“好”的方式,我的意思是一些需要几个简单的步骤,最好不这样不要求通过每个打开的窗口筛选盲目寻矿基于标题。
目的是在许多不同的脚本中控制通知——所以我只是在寻找一个可以适用于所有脚本的通用解决方案。
到目前为止,我想出的是迂回曲折的——如下:
将我的标题设置为独特的或机械相关的(在我的模型中,它是我的 PTS 路径,或者更可靠的 UUID)。迫切希望这个标题不会被某些东西覆盖。
按标题获取所有打开窗口的列表。
遍历列表以通过将它与标题元素匹配来识别我的窗口。(请注意,如果另一个窗口碰巧具有相同的标题元素,则此处可能会出错。)
检测所述窗口是否具有焦点与否。
应当指出的是,我根本不想要实现这一点,只会做它作为最后的手段。所以我在这里要求的不是 this。
这个解决方案显然很糟糕,所以我想知道是否有更好的方法。我更喜欢便携、优雅和完美的东西,但我意识到可能需要妥协。通过更好地我的意思是下列任何:
一种仅适用于特定终端仿真器的解决方案,例如通过让终端仿真器本身设置一个环境变量,允许脚本检测它所在的窗口。
一种不需要设置标题的解决方案,而是在窗口状态中使用其他一些不可见标记,该标记可从附加到所述窗口的 shell 脚本中访问和检测。
重新使用父进程阶梯以查找父终端模拟器 PID,并从那里开始工作(请注意,通过重新使用进程树来检测启动脚本的父进程的解决方案仅在脚本在本地运行时才有效,所以这个解决方案不完整但仍然很好!)
我收到了关于我的首选解决方案应该在什么条件下运行的问题,答案是尽可能多。但至少,我想要一些有效的东西:
在本机运行的单选项卡终端会话中(默认方案)。
在像 tmux 这样的终端多路复用器中。(不同终端多路复用器之间的可移植性是首选,但实际上不是必需的。)
我非常欣赏的附加功能(按重要性排序)包括:
能够通过 telnet 和 SSH 进行远程连接。
能够区分哪个选项卡在多选项卡终端会话中打开。
我想要一个很好的方法来找到我的 shell 脚本附加到哪个终端仿真器窗口,以便我可以检测它是否有焦点。
请注意,我已经知道的力学如何通过打开的窗口进行迭代,以及如何检测自己是否有焦点或不和他们有什么头衔。我知道and 这个问题的存在xdotool与xprop这些工具的基本机制无关(除非有一些隐藏的黑魔法功能我不知道这会回避我当前解决方案的内在技巧。)
我不想那样做的原因是因为它太可怕了。即完成同样的事情没有其他解决办法?
嗨,我需要定期自动在两个窗口之间切换焦点(使用软件或 w/e)。这可以在linux上实现吗?
我需要在 KDE 中将焦点设置为 VirtualBox,为此我编写了一个 KWin 脚本,但我不知道如何从控制台运行它。
我尝试过的:
此 KWin 脚本可在桌面 Shell 脚本控制台中运行
如何打开桌面 Shell 脚本控制台:
按Alt+ F2,输入
运行 wm 控制台
剧本:
// Main reference: http://techbase.kde.org/Development/Tutorials/KWin/Scripting
// API: https://techbase.kde.org/Development/Tutorials/KWin/Scripting/API_4.9
// Sets focus to VirtualBox
var clients = workspace.clientList();
for (var i=0; i<clients.length; i++) {
print(clients[i].caption);
var cap = clients[i].caption;
if (cap.indexOf("- Oracle VM VirtualBox") != -1) {
workspace.activeClient = clients[i];
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在 Bash 中运行它时(根据这个方法)脚本似乎没有设置,因为我收到这些错误:
Error org.freedesktop.DBus.Error.ServiceUnknown: The name org.kde.kwin.Scripting was not provided by any …Run Code Online (Sandbox Code Playgroud) focus ×9
gnome ×4
window ×3
metacity ×2
scripting ×2
x11 ×2
arch-linux ×1
fedora ×1
gnome-shell ×1
kwin ×1
notify-send ×1
shell ×1
shell-script ×1