X11: Motif

Motif
Motif は、X ウィンドウの見栄えや操作を統一するための GUI 規格です。
Open Software Foundation (OSF) によって定められ、現在は The Open Group の管理となっています。

NetWM とは関係ありませんが、この Motif が定義した _MOTIF_WM_HINTS プロパティを使うと、ウィンドウ装飾フレームやウィンドウ操作に関する機能を制限できます。
(ウィンドウマネージャによって対応は異なります)
_MOTIF_WM_HINTS
_MOTIF_WM_HINTS プロパティは、type = "_MOTIF_WM_HINTS", format = 32 の数値の配列です。
3個または4個の配列になります。

[0] flags使用する値のフラグ
[1] functionsウィンドウで使用できる機能のフラグ
[2] decorations装飾フレームに付けるもの
[3] inputmode入力フォーカスのセットモード

//flags
#define MWM_HINTS_FUNCTIONS     (1<<0)
#define MWM_HINTS_DECORATIONS   (1<<1)
#define MWM_HINTS_INPUT_MODE    (1<<2)

//functions
#define MWM_FUNC_ALL            (1<<0)
#define MWM_FUNC_RESIZE         (1<<1)
#define MWM_FUNC_MOVE           (1<<2)
#define MWM_FUNC_MINIMIZE       (1<<3)
#define MWM_FUNC_MAXIMIZE       (1<<4)
#define MWM_FUNC_CLOSE          (1<<5)

//decorations
#define MWM_DECOR_ALL           (1<<0)
#define MWM_DECOR_BORDER        (1<<1)
#define MWM_DECOR_RESIZEH       (1<<2) //リサイズハンドル
#define MWM_DECOR_TITLE         (1<<3)
#define MWM_DECOR_MENU          (1<<4) //メニューボタン
#define MWM_DECOR_MINIMIZE      (1<<5)
#define MWM_DECOR_MAXIMIZE      (1<<6)

//inputmode
#define MWM_INPUT_MODELESS                  0
#define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1
#define MWM_INPUT_SYSTEM_MODAL              2
#define MWM_INPUT_FULL_APPLICATION_MODAL    3

それぞれの値に対応しているかどうかは、ウィンドウマネージャによります。
OpenBox の場合は、inputmode は非対応で、MWM_FUNC_CLOSE と MWM_DECOR_MENU には対応していません。
inputmode
入力フォーカスを設定するモード。
ウィンドウマネージャによっては対応していません。

MWM_INPUT_MODELESSどのウィンドウにも入力フォーカスを設定できる
MWM_INPUT_PRIMARY_APPLICATION_MODAL入力フォーカスはこのウィンドウの祖先にはセットされない
MWM_INPUT_SYSTEM_MODALこのウィンドウにしか入力フォーカスをセットできない
MWM_INPUT_FULL_APPLICATION_MODALこのアプリケーションの、他のウィンドウには入力フォーカスがセットされない
プログラム
リサイズ・最小化・最大化ができないウィンドウにします。
閉じるボタン or ポインタボタン押しで終了します。

ウィンドウマネージャによってそれぞれ対応は異なります。
OpenBox の場合、リサイズはできなくなりますが、最小化・最大化は出来る状態になっています。

$ cc -o run d16-motif.c util.c -lX11

<d16-motif.c>
#include <stdio.h>
#include <X11/Xlib.h>
#include "util.h"

//flags
#define MWM_HINTS_FUNCTIONS     (1<<0)
#define MWM_HINTS_DECORATIONS   (1<<1)
#define MWM_HINTS_INPUT_MODE    (1<<2)

//functions
#define MWM_FUNC_ALL            (1<<0)
#define MWM_FUNC_RESIZE         (1<<1)
#define MWM_FUNC_MOVE           (1<<2)
#define MWM_FUNC_MINIMIZE       (1<<3)
#define MWM_FUNC_MAXIMIZE       (1<<4)
#define MWM_FUNC_CLOSE          (1<<5)

//decorations
#define MWM_DECOR_ALL           (1<<0)
#define MWM_DECOR_BORDER        (1<<1)
#define MWM_DECOR_RESIZEH       (1<<2)
#define MWM_DECOR_TITLE         (1<<3)
#define MWM_DECOR_MENU          (1<<4)
#define MWM_DECOR_MINIMIZE      (1<<5)
#define MWM_DECOR_MAXIMIZE      (1<<6)

int main(int argc,char **argv)
{
    Display *disp;
    Window win;
    XEvent ev;
    long val[3];
    Atom atom;
    
    disp = XOpenDisplay(NULL);
    if(!disp) return 1;

    set_display(disp);

    win = create_test_window2(disp, 200, 200, 0, ButtonPress);

    //_MOTIF_WM_HINTS

    val[0] = MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS;
    val[1] = MWM_FUNC_MOVE | MWM_FUNC_CLOSE;
    val[2] = MWM_DECOR_BORDER | MWM_DECOR_TITLE;

    atom = GET_ATOM("_MOTIF_WM_HINTS");

    XChangeProperty(disp, win, atom, atom, 32, PropModeReplace,
        (unsigned char *)val, 3);

    //イベント

    XMapWindow(disp, win);

    while(1)
    {
        XNextEvent(disp, &ev);

        if(event_quit(&ev)) break;

        if(ev.type == ButtonPress) break;
    }

    XCloseDisplay(disp);

    return 0;
}