我想知道如何询问 X11 哪些窗口有焦点。如果出于任何原因我自己的应用程序(可能可见或不可见)获得焦点,我希望能够让以前的窗口再次获得焦点。
例如,我的应用程序与许多其他应用程序一起运行(例如 firefox、gvim、nautilus、...)
假设一开始 Firefox 有焦点,并且用户点击了我现在拥有焦点的应用程序。我希望我的应用程序再次关注 Firefox。
有谁知道如何实现这一目标?书籍推荐会非常好。
非常感谢。
我想知道如何询问 X11 哪些窗口有焦点。如果出于任何原因我自己的应用程序(可能可见或不可见)获得焦点,我希望能够让以前的窗口再次获得焦点。
例如,我的应用程序与许多其他应用程序一起运行(例如 firefox、gvim、nautilus、...)
假设一开始 Firefox 有焦点,并且用户点击了我现在拥有焦点的应用程序。我希望我的应用程序再次关注 Firefox。
有谁知道如何实现这一目标?书籍推荐会非常好。
非常感谢。
看看_NET_ACTIVE_WINDOW
大多数现代窗口管理器设置的根窗口的值:
xprop -root _NET_ACTIVE_WINDOW
当然,这个值可以使用 Xlib 库调用来获得。
你可能想XGetInputFocus
打电话。
Window focused;
int revert_to;
XGetInputFocus(dpy, &focused, &revert_to);
在这个片段中,focused
将是具有当前输入焦点的窗口,获取键盘事件和鼠标按钮按下。
即使窗口管理器没有_NET_ACTIVE_WINDOW
按照 EWMH 的规定在根窗口上设置属性,这也会起作用。一些窗口管理器,例如 dwm 和 my 9wm,没有设置这个。
我推荐一个名为 XDoTool 的应用程序。它支持相当多的查询、控件甚至钩子。
> xdotool getwindowfocus # 29360135
> xdotool getwindowfocus getwindowpid # 12988
> xdotool getwindowfocus getwindowname # tilda
> xdotool getwindowfocus behave '%@' blur getmouselocation
# or focus, mouse-enter, etc.
x:514 y:317 screen:0 window:56623121
x:271 y:26 screen:0 window:56623121
...
接受回调之类的命令behave
,可以是内置的,也可以是getmouselocation
外部的exec notify-send 'focused window'
,例如,exec zsh myscript.zsh
等,但是您想使用它。
xdotool windowfocus [options] [window]
编辑 - 您可以使用,如 中的焦点xdotool search --class firefox windowfocus
。就我而言,这会导致错误,因为 Firefox 显示为几十个“窗口”,但都具有相同的 PID;给定正确的ID,它就可以工作。希望这是一个开始。
编辑 2 - 'window ID' 是窗口指针的十进制表示,例如来自xprop:
> xprop -root _NET_ACTIVE_WINDOW
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x1c00007, 0x0
> xdotool getwindowfocus
29360135
> printf '%d\n' '0x1c00007'
29360135
使用此XQueryTree查找当前活动的或最顶层的窗口。
这是一个函数,当给定一个显示时,它将找到当前窗口的焦点:
static Window
GetCurrWindow(d)
Display *d;
{
Window foo;
Window win;
int bar;
do{
(void) XQueryPointer(d, DefaultRootWindow(d), &foo, &win,
&bar, &bar, &bar, &bar, &bar);
} while(win <= 0);
#ifdef VROOT
{
int n;
Window *wins;
XWindowAttributes xwa;
(void) fputs("=xwa=", stdout);
/* do{ */
XQueryTree(d, win, &foo, &foo, &wins, &n);
/* } while(wins <= 0); */
bar=0;
while(--n >= 0) {
XGetWindowAttributes(d, wins[n], &xwa);
if( (xwa.width * xwa.height) > bar) {
win = wins[n];
bar = xwa.width * xwa.height;
}
n--;
}
XFree(wins);
}
#endif
return(win);
}
http://tronche.com/gui/x/xlib/window-information/XQueryTree.html
我找到了来源:
http://examples.oreilly.com/networksa/tools/xsnoop.c
祝你好运