2009-06-18 24 views
11

どのウィンドウにどのウィンドウがフォーカスしているかをX11に問い合わせることができます。そして、何らかの理由で自分のアプリケーション(目に見えるかもしれない)がフォーカスを得ていたら、元のウィンドウに再び焦点を合わせさせたいと思っています。例えばどのウィンドウにフォーカスがあり、どのように変更するかを知るには?

、私のアプリケーションは、他の多くで実行されている(例えばFirefoxの、gvimを、オウムガイ、...)

は、最初のFirefoxに焦点を当て、ユーザーが現在フォーカスを持っている私のアプリ上でクリックしたことがあると仮定し。私は自分のアプリケーションが再びfirefoxに焦点を当てるようにしたい。

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

ありがとうございます。

答えて

6

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

を幸運

この値は、当然のことながら、Xlibのライブラリ呼び出しを使用して取得することができる

xprop -root _NET_ACTIVE_WINDOW 

:10

+1

エイデン、ありがとうございました。このコードは私を助けるでしょう。 私はそれを試して、このウィンドウにフォーカスがない場合でもマウスポインタの下にあるウィンドウを報告します。 実際にフォーカスが当てられているウィンドウを知りたい。私のアプリがリスナーとして自分自身を登録する方法はありますか?または、マウスの位置を使わなくてもこの情報を与えることができる機能はありますか? もう一度ありがとうございます。 –

+0

@Marcio - xprop.cのxprop.cソースファイルを調べて、libx11がその情報を取得するために使用する機能について調べる価値があります:) –

+0

xprop.c ans xsnoop.cを見ました。私は、XSetInputFocusで使用するコードを適合させ、私が望む動作を得ることができると信じています。 よろしくお願いいたします。 –

15

は最も近代的なウィンドウマネージャによって設定されたルートウィンドウの値を見てみましょう。

9

おそらくXGetInputFocusコールが必要です。このスニペットで

Window focused; 
int revert_to; 

XGetInputFocus(dpy, &focused, &revert_to); 

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

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

+2

彼はまた、 "それを変更する方法"を尋ねた、 'XSetInputFocus'それを行うことができます:' XSetInputFocus(display、window_to_focus、RevertToNone、CurrentTime); ' –

関連する問題