我想知道如何向X11询问哪些窗口具有焦点。如果由于任何原因我自己的应用程序(可能是可见的或不可见)得到了焦点,我希望能够让以前的窗口再次获得焦点。

例如,我的应用程序与许多其他应用程序一起运行(例如firefox,gvim,nautilus,...)

假设首先firefox具有焦点,并且用户点击了我现在具有焦点的应用程序。我希望我的应用程序再次关注firefox。

有谁知道如何实现这一目标?书籍建议非常好。

非常感谢。

有帮助吗?

解决方案

使用此 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/窗口信息/ XQueryTree.html

我找到了来源:

http://examples.oreilly.com/networksa/tools/xsnoop.c

祝你好运

其他提示

查看大多数现代窗口管理器设置的根窗口的 _NET_ACTIVE_WINDOW 值:

xprop -root _NET_ACTIVE_WINDOW

当然,可以使用Xlib库调用获取此值。

您可能需要 XGetInputFocus 调用。

Window focused;
int revert_to;

XGetInputFocus(dpy, &focused, &revert_to);

在这个片段中, focused 将成为当前输入焦点,获取键盘事件和鼠标按键的窗口。

即使窗口管理器没有在EWMH指定的根窗口上设置 _NET_ACTIVE_WINDOW 属性,这也可以工作。一些窗口管理器,例如dwm和我的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'focus window'那样内置 exec zsh myscript.zsh 等,但是你想要使用它。

编辑 - 您可以使用 xdotool windowfocus [options] [window] 进行聚焦,如 xdotool search --class firefox windowfocus 。在我的情况下,这会导致错误,因为Firefox显示为几十个“窗口”,但都具有相同的PID;它的工作原理是正确的ID。希望这是一个开始。

编辑2 - '窗口ID'是窗口指针的十进制表示,例如,来自 xprop

> xprop -root _NET_ACTIVE_WINDOW
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x1c00007, 0x0
> xdotool getwindowfocus
29360135
> printf '%d\n' '0x1c00007'
29360135
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top