我想要一个键盘快捷键来“转到”(焦点+提升)窗口,并设置紧急标志,看起来像紧急:它出现在任务栏(Gnome + Metacity)上,即使它位于当前桌面以外的桌面上并且开始眨眼(感谢@slm 指出)。
该窗口可能位于当前虚拟桌面之外的其他虚拟桌面上。
在这种特殊情况下,Skype 窗口设置了紧急标志,因此它们出现在alt-tab
弹出窗口(metacity WM)中,但如果它不在当前虚拟桌面上,我无法切换到该窗口。
我正在调查xdotool
和wmctrl
指挥,但没有运气。
有什么想法或线索吗?
更新:看来我正在谈论_NET_WM_STATE
= _NET_WM_STATE_DEMANDS_ATTENTION
...
答案1
我想我已经找到了一些在职的解决方案这里。
提供的 Bash 脚本就是我正在寻找的内容,并且它们显然利用了wmctrl
!
为了快速访问/存档目的,我将两个脚本复制粘贴到此处:
跳转到需要注意的窗口:
#!/bin/bash
activeWinIdLine=`xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\) `
activeWinId="${activeWinIdLine:40}"
echo $activeWinId > ~/activeWinId
for id in `wmctrl -l | cut -d " " -f 1`; do
xprop -id $id | grep "_NET_WM_STATE_DEMANDS_ATTENTION" 2>&1 > /dev/null
if [ "$?" = "0" ]; then
wmctrl -i -a $id
exit 0
fi
done
exit 1
跳回到您正忙着的窗口:
#!/bin/bash
if [ -f ~/activeWinId ]; then
origWinId=`cat ~/activeWinId`
wmctrl -i -a $origWinId
fi
感谢您的讨论,特别是@slm 为我指明了正确的方向。
答案2
有一个小型的 C 项目塞图尔金特(谢谢希尔乔)。用法:
seturgent <winid> [0|1] # 0: urgent off, 1: urgent on
复制源seturgent.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
static void die(const char *s) {
fputs(s, stderr);
exit(EXIT_FAILURE);
}
static void seturgency(Display *dpy, Window winid, Bool set) {
XWMHints *hints = XGetWMHints(dpy, winid);
if(!hints) {
fputs("seturgent: unable to get window manager hints.\n", stderr);
return;
}
if(set)
hints->flags |= XUrgencyHint;
else
hints->flags &= ~XUrgencyHint;
if(!XSetWMHints(dpy, winid, hints))
fputs("seturgent: unable to set urgency hint.\n", stderr);
XFree(hints);
}
int main(int argc, char **argv) {
Display *dpy;
if(argc < 2 || !strcmp(argv[1], "-h")) /* help / usage */
die("Usage: seturgent <winid> [0|1]\n");
if(argc == 2 && !strcmp(argv[1], "-v")) /* version */
die("seturgent-"VERSION" © 2010-2012 seturgent engineer, see " \
"LICENSE file for details.\n");
if(!(dpy = XOpenDisplay(NULL)))
die("seturgent: unable to open display.\n");
/* set the urgency hint (or not), if not specified its True. */
seturgency(dpy, (Window)strtol(argv[1], NULL, 0),
!((argc > 2) && !atol(argv[2])));
XSync(dpy, False);
XCloseDisplay(dpy);
return EXIT_SUCCESS;
}