我想知道如何向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和我的9wm,没有设置它.
使用此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
祝好运