Motif
Motif は、X ウィンドウの見栄えや操作を統一するための GUI 規格です。
Open Software Foundation (OSF) によって定められ、現在は The Open Group の管理となっています。
NetWM とは関係ありませんが、この Motif が定義した _MOTIF_WM_HINTS プロパティを使うと、ウィンドウ装飾フレームやウィンドウ操作に関する機能を制限できます。
(ウィンドウマネージャによって対応は異なります)
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個の配列になります。
それぞれの値に対応しているかどうかは、ウィンドウマネージャによります。
OpenBox の場合は、inputmode は非対応で、MWM_FUNC_CLOSE と MWM_DECOR_MENU には対応していません。
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 の場合、リサイズはできなくなりますが、最小化・最大化は出来る状態になっています。
<d16-motif.c>
閉じるボタン 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; }