15

どのウィンドウにフォーカスがあるかをX11に尋ねる方法を知りたいのですが。そして、何らかの理由で自分のアプリケーション(表示されているかどうかに関係なく)がフォーカスを取得した場合、以前のウィンドウに再びフォーカスを取得できるようにしたいと思います。

たとえば、私のアプリケーションは他の多くのアプリケーション(Firefox、gvim、nautilusなど)で実行されています。

最初にFirefoxにフォーカスがあり、ユーザーが現在フォーカスがある私のアプリをクリックしたとします。私のアプリケーションがFirefoxに再び焦点を合わせてほしい。

誰かがこれを達成する方法を知っていますか?本の推奨事項は非常にいいでしょう。

どうもありがとう。

4

4 に答える 4

22

_NET_ACTIVE_WINDOW最近のほとんどのウィンドウ マネージャーで設定されているルート ウィンドウの値を見てみましょう。

xprop -root _NET_ACTIVE_WINDOW

もちろん、この値は Xlib ライブラリ呼び出しを使用して取得できます。

于 2009-06-19T13:36:06.380 に答える
11

あなたはおそらくXGetInputFocus電話をしたいでしょう。

Window focused;
int revert_to;

XGetInputFocus(dpy, &focused, &revert_to);

このスニペットでfocusedは、現在の入力フォーカスを持つウィンドウになり、キーボード イベントとマウス ボタンの押下を取得します。

_NET_ACTIVE_WINDOWこれは、EWMH で指定されているように、ウィンドウ マネージャーがルート ウィンドウにプロパティを設定していない場合でも機能します。dwm や私の 9wm などのいくつかのウィンドウ マネージャは、これを設定しません。

于 2015-03-06T02:47:59.167 に答える
7

この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

幸運を

于 2009-06-18T20:00:42.860 に答える