2

X11を監視する簡単なアプリケーションを作成しました_NET_CLIENT_LIST。ウィンドウ(conky、tint2、...を含む)が開いたり閉じたりすると、情報が出力されます。メニューを作成するとき(RMBクリックまたはフロントメニューバー)は何も印刷されないことを除いて、正常に動作します。つまり、新しいウィンドウではありませんが、作成元のウィンドウから引き出すことができます。それは...ですか?

アプリで独自のコンテキストメニューを作成したいのですが、ツールキット(GTK、QT、...)を使用したくありません。だから私はそれらがどのように機能するかを知る必要があります。

4

2 に答える 2

2

メニューはWMによって管理されておらず、WM固有のプロパティもありません。

ウィンドウを監視するには、を使用してルートウィンドウでイベントをキャッチXMapNotifyします。これは何かをする非常に単純なプログラムです:XUnmapNotifySubstructureNotifyMask

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>


int main () {
    Display* d = XOpenDisplay(0);
    if (!d) {
        printf ("Oops...!\n");
        exit (EXIT_FAILURE);
    }

    XSelectInput(d, DefaultRootWindow(d), SubstructureNotifyMask);

    for(;;) {
        XEvent e;
        XNextEvent(d, &e);
        if (e.type == MapNotify) {
            printf ("Window %lx mapped!\n", e.xmap.window);
        }
        if (e.type == UnmapNotify) {
            printf ("Window %lx unmapped!\n", e.xunmap.window);
        }
    }    
}

Unmap単純に無視できるスプリアスイベントを報告します。

より完全なプログラムは、おそらくとによって選択されたすべてのイベントを監視する必要がSubstructureNotifyMaskありSubstructureRedirectMaskます。

于 2012-05-21T19:52:11.340 に答える
2

古いものはまったく別の質問のためのものなので、別の答えを追加します:)

ポップアップメニュー(人民元でアクティブ化されているか、メニューバーからのものであるかを問わず)は、完全に通常のX11ウィンドウです。監視プログラムにそれらが表示されない理由は、ウィンドウマネージャーによって引き起こされた変更を監視しているためです。ポップアップメニューは通常、WMを完全にバイパスするため、WMはそれらについて認識しません。

これは、override_redirectウィンドウ属性XSetWindowAttributes構造を設定することによって実現されます。ポップアップメニュー(およびポップアップメニューのみ)に設定すると、すべて設定されます。

于 2012-05-23T12:57:30.043 に答える