2

このC関数は、多くのウィンドウマネージャーでウィンドウ装飾を無効または有効にするために使用できます。'mode'が'd'の場合、ウィンドウは装飾を非表示にします。それ以外の場合、'mode'が'D'の場合、ウィンドウは装飾を表示します。

void window_tune_decorations(Display *disp, Window win, char mode) {
    long hints[5] = { 2, 0, 0, 0, 0};
    Atom motif_hints = XInternAtom(disp, "_MOTIF_WM_HINTS", False);

    switch (mode) {
        case 'D':
            hints[2] = 1;
            /* fall through */
        case 'd':
            XChangeProperty(disp, win, motif_hints, motif_hints, 32, PropModeReplace, (unsigned char *)hints, 5);
            break;
        default:
            fputs("Invalid mode.\n", stderr);
    }
}

「トグルモード」を実装したいのですが。だから私の質問は、窓に装飾があるかどうかを検出する方法はありますか?XGetWindowPropertyを_MOTIF_WM_HINTSで使用しようとしましたが、出力を解釈する方法がわかりません。

4

1 に答える 1

4

から取得したデータXGetWindowPropertyは、 に送信されたデータを解釈するのと同じ方法で解釈しますXChangeProperty

の場合は_MOTIF_WM_HINTS、5 の配列long、またはおそらくstruct MwmHints(syn. MotifWmHints) です。これは、5 つのlongフィールドといくつかの#defined ビット フラグの構造体です。これは Motif ウィンドウ マネージャから継承されていますが、最近では通常 Motif のインクルードとライブラリを保持していないため、構造体はさまざまな場所にコピーされます (悪い習慣ですが、誰もがそうしています)。その定義はxprops.h、Gnome や他のいくつかの場所で見つけることができます。ネットで検索してコードにコピーするか、既に依存しているインクルード ファイルで見つけるか、単に定義を見て 5longの配列を使用し続けるかを選択します。

正しいフィールドで正しいフラグを確認する必要があります。装飾については、最初にウィンドウがオーバーライド リダイレクトされているかどうかを確認します。そうである場合、それは (明らかに) 装飾されておらず、装飾を追加することはできません。ウィンドウ マネージャが実行されていない場合は、同様に装飾されておらず、この場合も装飾を追加することはできません。

それ以外の場合、ウィンドウにプロパティがまったくない (にXGetWindowProperty設定typeされているNone) 場合は、装飾されていると見なすことができます。

プロパティがあり、MWM_HINTS_DECORATIONSビットが に設定されている場合、ビット値によってフィールドでflags指定された装飾が正確に適用されます。フィールドがゼロ以外の場合、いくつかの装飾が存在します。AFAIKが設定されていない場合、ウィンドウは (驚くほど) 装飾されています。しかし、これを自分でテストしてください。覚えていませんし、現時点では X11 マシンを持っていないため、確認できません。decorationsMWM_DECOR_*MWM_HINTS_DECORATIONS

当然、一部のウィンドウ マネージャは使用しません_MOTIF_WM_HINTS(たとえば、Motif より前にあったもの)。これらをお持ちの場合、この方法では装飾の確認や設定ができません。

を忘れないでくださいXFree(hints)

于 2012-12-09T15:49:17.163 に答える