イベントタイプ

構造体
union XEventXEvent 共用体
struct XAnyEventXAnyEvent 構造体
キー/ポインタ
KeyPress
KeyRelease
キー押し/離し
ButtonPress
ButtonRelease
ボタン押し/離し
MotionNotifyポインタ移動
EnterNotify
LeaveNotify
ポインタが別のウィンドウ上に表示される時
FocusIn
FocusOut
入力フォーカス
KeymapNotifyキーの押し状態の変化
MappingNotifyキーやポインタのマッピングが変更された時
グラフィック
Exposeウィンドウ内容の更新
GraphicsExposeXCopyArea/XCopyPlane 中に領域を計算できなかった場合
NoExposeGraphicsExpose が生成される可能性のある要求で、何も生成しない場合
ウィンドウ状態変化
CirculateNotifyウィンドウのスタック位置が循環された時
ConfigureNotifyウィンドウの位置やサイズが変化した
CreateNotify子ウィンドウが作成された時
DestroyNotifyウィンドウが破棄された時
GravityNotify親のサイズ変更により子の位置が変化した時
MapNotifyウィンドウがマップされた時
UnmapNotifyウィンドウがアンマップした時
ReparentNotify親ウィンドウが変更された時
VisibilityNotify領域の可視状態が変化した
状態変化要求
CirculateRequestスタックの循環要求を受け取る
ConfigureRequest位置やサイズなどの変更要求を受け取る
MapRequestマップの要求を受け取る
ResizeRequestサイズ変更の要求を受け取る
カラーマップ
ColormapNotifyカラーマップが変更された時
クライアント通信
ClientMessageXSendEvent 関数でデータが送られた時
PropertyNotifyプロパティが変化した時
SelectionClearセレクションの所有権を失った時
SelectionRequestセレクションのデータが要求された時
SelectionNotify変換が完了した時 or 所有者がいない時
構造体
typedef union _XEvent {
 int                            type;
 XAnyEvent                      xany;
 XKeyEvent                      xkey;
 XButtonEvent                   xbutton;
 XMotionEvent                   xmotion;
 XCrossingEvent                 xcrossing;
 XFocusChangeEvent              xfocus;
 XExposeEvent                   xexpose;
 XGraphicsExposeEvent           xgraphicsexpose;
 XNoExposeEvent                 xnoexpose;
 XVisibilityEvent               xvisibility;
 XCreateWindowEvent             xcreatewindow;
 XDestroyWindowEvent            xdestroywindow;
 XUnmapEvent                    xunmap;
 XMapEvent                      xmap;
 XMapRequestEvent               xmaprequest;
 XReparentEvent                 xreparent;
 XConfigureEvent                xconfigure;
 XGravityEvent                  xgravity;
 XResizeRequestEvent            xresizerequest;
 XConfigureRequestEvent         xconfigurerequest;
 XCirculateEvent                xcirculate;
 XCirculateRequestEvent         xcirculaterequest;
 XPropertyEvent                 xproperty;
 XSelectionClearEvent           xselectionclear;
 XSelectionRequestEvent         xselectionrequest;
 XSelectionEvent                xselection;
 XColormapEvent                 xcolormap;
 XClientMessageEvent            xclient;
 XMappingEvent                  xmapping;
 XErrorEvent                    xerror;
 XKeymapEvent                   xkeymap;
 long                           pad[24];
} XEvent;
XEvent 共用体
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
} XAnyEvent;
XAnyEvent 構造体
type
イベントタイプ
serial
プロトコルのシリアル番号
send_event
True で、XSendEvent によって送信された。
display
イベントを読み込んだクライアントの Display
window
イベントが送られたウィンドウ
キー/ポインタ
typedef struct {
  int            type;
  unsigned long  serial;
  Bool           send_event;
  Display        *display;
  Window         window;
  Window         root;
  Window         subwindow;
  Time           time;
  int            x, y;
  int            x_root, y_root;
  unsigned int   state;
  unsigned int   keycode;
  Bool           same_screen;
} XKeyEvent;
typedef XKeyEvent XKeyPressedEvent;
typedef XKeyEvent XKeyReleasedEvent;
キー押し/離し
root
イベントが起きたルートウィンドウ
subwindow
親のウィンドウがイベントを処理した場合、実際にイベントが起きた子ウィンドウ。
それ以外は None。
time
イベントが生成された時刻 (ミリ秒単位)
x,y
イベントウィンドウがルートウィンドウと同じスクリーン上にある場合、イベントウィンドウの原点を基準とした相対座標。それ以外の場合、0。
state
このイベント直前に押されていたポインタボタンと修飾キー。
このイベントで押されたキーは含まない。

Button1Mask、Button2Mask、Button3Mask、Button4Mask、Button5Mask、
ShiftMask、LockMask、ControlMask、
Mod1Mask、Mod2Mask、Mod3Mask、Mod4Mask、Mod5Mask
keycode
キーボードの物理キーを表す番号
same_screen
イベントウィンドウが、ルートウィンドウと同じスクリーン上にあるか。
typedef struct {
 int            type;
 unsigned long  serial;
 Bool           send_event;
 Display        *display;
 Window         window;
 Window         root;
 Window         subwindow;
 Time           time;
 int            x, y;
 int            x_root, y_root;
 unsigned int   state;
 unsigned int   button;
 Bool           same_screen;
} XButtonEvent;
typedef XButtonEvent XButtonPressedEvent;
typedef XButtonEvent XButtonReleasedEvent;
ボタン押し/離し
button
状態が変化したポインタボタン番号。(1〜)
Button1、Button2、Button3、Button4、Button5 が定義済みだが、それ以上の値も使用可能。
state
このイベント直前に押されていたポインタボタンと修飾キー。
このイベントで押されたボタンは含まない。
typedef struct {
 int            type;
 unsigned long  serial;
 Bool           send_event;
 Display        *display;
 Window         window;
 Window         root;
 Window         subwindow;
 Time           time;
 int            x, y;
 int            x_root, y_root;
 unsigned int   state;
 char           is_hint;
 Bool           same_screen;
} XMotionEvent;
typedef XMotionEvent XPointerMovedEvent;
マウスポインタが移動した時。
MotionNotify イベントの間隔頻度は保証されていないが、ポインタが移動して停止したときに、少なくとも 1 つのイベントを受信することが保証されている。
デバイスのイベント処理がフリーズしている場合、イベントは遅れて来る。
is_hint
NotifyNormal で通常。
NotifyHint は、PointerMotionHintMask が選択されている状態の場合、指定されたタイミングで来たことを示す。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 Window        root;
 Window        subwindow;
 Time          time;
 int           x, y;
 int           x_root, y_root;
 int           mode;
 int           detail;
 Bool          same_screen;
 Bool          focus;
 unsigned int  state;
} XCrossingEvent;
typedef XCrossingEvent XEnterWindowEvent;
typedef XCrossingEvent XLeaveWindowEvent;
ポインタの移動やその他の理由によって、ポインタが以前と異なるウィンドウ上に表示される場合、EnterNotify または LeaveNotify イベントが送られる。

ウィンドウの表示状態の変更によって発生する場合は、UnmapNotify、MapNotify、ConfigureNotify、GravityNotify、CirculateNotify イベントの後に生成される。
ただし、FocusOut、VisibilityNotify、Expose イベントに関しては、イベントの順序は決まっていない。

XGrabPointer や XUngrabPointer を呼び出したときにも生成される。

ポインタ移動によってウィンドウ領域内に入った場合、EnterNotify の後に、同じ位置で MotionNotify も来る。
ポインタ移動中に、ポインタ下のボタンの強調表示などをしたい場合、ウィンドウの表示状態などの変化によって領域内に入った場合は、EnterNotify を MotionNotify のように扱う必要がある。

■ A→B に移動し、B > A の場合

・A : [LeaveNotify] detail = NotifyAncestor
・A-B 間 : [LeaveNotify] detail = NotifyVirtual
・B : [EnterNotify] detail = NotifyInferior

■ A→B に移動し、A > B の場合

・A : [LeaveNotify] detail = NotifyInferior
・A-B 間 : [EnterNotify] detail = NotifyVirtual
・B : [EnterNotify] detail = NotifyAncestor

■ A→B に移動し、C がそれらの最小共通祖先である場合

・A : [LeaveNotify] detail = NotifyNonlinear
・A-C 間 : [LeaveNotify] detail = NotifyNonlinearVirtual
・C-B 間 : [EnterNotify] detail = NotifyNonlinearVirtual
・B : [EnterNotify] detail = NotifyNonlinear

■ 別の画面上で A→B に移動した場合

・A : [LeaveNotify] detail = NotifyNonlinear
・(A がルートウィンドウでない場合) A より上の (ルートを含む) 各ウィンドウ : [LeaveNotify] detail = NotifyNonlinearVirtual
・(B がルートウィンドウでない場合) B のルートから B まで (B は含まない) の各ウィンドウ : [EnterNotify] detail = NotifyNonlinearVirtual
・B : [EnterNotify] detail = NotifyNonlinear

■ ポインタが他のウィンドウ上にある時にグラブが開始した時

mode = NotifyGrab で、EnterNotify と LeaveNotify を生成。
ポインタが、現在位置からグラブウィンドウの位置に突然ワープしたかのように生成されます。
ただし、実際は移動しておらず、X サーバーは現在位置を使って座標を指定する。

■ グラブ解除時、ポインタがグラブウィンドウ外にある場合

mode = NotifyUngrab で、EnterNotify と LeaveNotify を生成。
ポインタが、グラブウィンドウの位置から、実際の位置に突然ワープしたかのように生成されます。
subwindow
イベントウィンドウのいずれかの子の上にポインタがある場合、その子ウィンドウ。なければ None。
x,y
Leave の場合は、ポインタがウィンドウ上にない状態の現在の位置。負の値など、領域外の座標になっている。
mode
通常のイベントか、グラブによるイベントか。

NotifyNormal (0):通常のイベント
NotifyGrab (1): グラブがアクティブになったときのイベント
NotifyUngrab (2): グラブが非アクティブになったときのイベント
detail
詳細の情報。

NotifyAncestor (0): 先祖
NotifyVirtual (1): 仮想
NotifyInferior (2): 下位
NotifyNonlinear (3): 通常のウィンドウ間移動では、この値。
NotifyNonlinearVirtual (4)
focus
True の場合、イベントウィンドウは、フォーカスウィンドウまたは、フォーカスウィンドウの下位ウィンドウ。
state
押されているポインタボタンと修飾キーの状態
typedef struct {
     int           type;
     unsigned long serial;
     Bool          send_event;
     Display       *display;
     Window        window;
     int           mode;
     int           detail;
} XFocusChangeEvent;
typedef XFocusChangeEvent XFocusInEvent;
typedef XFocusChangeEvent XFocusOutEvent;
フォーカスウィンドウとポインタの位置によって、キーボード入力を受け取るウィンドウが決まります。
クライアントは、画面上の領域のハイライトを制御するために、入力フォーカスがいつ変更されるかを知る必要がある場合があります。

ウィンドウのマップ解除によって発生するすべての FocusOut イベントは、UnmapNotify イベントの後に生成されます。
ただし、X プロトコルは、生成された EnterNotify、LeaveNotify、VisibilityNotify、Expose イベントに関して FocusOut イベントの順序を制限しません。

■ フォーカスが A→B に移動し、B > A でポインタが P 上にある場合

・A : [FocusOut] detail = NotifyAncestor
・A-B 間 : [FocusOut] detail = NotifyVirtual
・B : [FocusIn] detail = NotifyInferior
・B > P だが、P が A の祖先や子でない場合、B の下から P までの各ウィンドウで、[FocusIn] detail = NotifyPointer

■ フォーカスが A→B に移動し、A > B でポインタが P にある場合

・A > P だが、P が B の祖先や子でない場合、P から A までの各ウィンドウで [FocusOut] detail = NotifyPointer
・A : [FocusOut] detail = NotifyInferior
・A-B 間 : [FocusIn] detail = NotifyVirtual
・B : [FocusIn] detail = NotifyAncestor

■ フォーカスが A→B に移動し、C がそれらの最小共通祖先であり、ポインタが P にある場合

・A > P の場合、P から A までの各ウィンドウで [FocusOut] detail = NotifyPointer
・A : [FocusOut] detail = NotifyNonlinear
・A-C 間 : [FocusOut] detail = NotifyNonlinearVirtual
・C-B 間 : [FocusIn] detail = NotifyNonlinearVirtual
・B : [FocusIn] detail = NotifyNonlinear
・B > P の場合、B の下から P までの各ウィンドウで [FocusIn] detail = NotifyPointer

■ 別の画面でフォーカスが A→B に移動し、ポインタが P にある場合

・A > P の場合、P から A までの各ウィンドウで [FocusOut] detail = NotifyPointer
・A : [FocusOut] detail = NotifyNonlinear
・A がルートウィンドウではない場合、A より上の (ルートを含む) ウィンドウで [FocusOut] detail = NotifyNonlinearVirtual
・B がルートウィンドウではない場合、B のルートから B まで (B は含まない) の各ウィンドウで [FocusIn] detail = NotifyNonlinearVirtual
・B : [FocusIn] detail = NotifyNonlinear
・B > P の場合、B の下から P までの各ウィンドウで [FocusIn] detail = NotifyPointer

■ フォーカスが A から PointerRoot (ポインタの下のウィンドウに送信されるイベント) または None (破棄) に移動し、ポインタが P にある場合

・A > P の場合、P から A までの各ウィンドウで [FocusOut] detail = NotifyPointer
・A : [FocusOut] detail = NotifyNonlinear
・A がルートウィンドウではない場合、A より上の各ウィンドウ (ルート含む) で [FocusOut] detail = NotifyNonlinearVirtual
・すべての画面のルートウィンドウ : [FocusIn] detail = NotifyPointerRoot (または NotifyDetailNone)
・新しいフォーカスが PointerRoot の場合、P のルートから P までの各ウィンドウで [FocusIn] detail = NotifyPointer

■ フォーカスが PointerRoot または None から、A に移動し、ポインタがウィンドウ P にある場合

・古いフォーカスが PointerRoot の場合、P から P のルートまでの各ウィンドウで [FocusOut] detail = NotifyPointer
・すべてのルートウィンドウ : [FocusOut] detail = NotifyPointerRoot (または NotifyDetailNone)
・A がルートウィンドウでない場合、A のルートから A まで (A 含まない) の各ウィンドウで [FocusIn] detail = NotifyNonlinearVirtual
・A : [FocusIn] detail = NotifyNonlinear
・A > P の場合、 A の下から P までの各ウィンドウで [FocusIn] detail = NotifyPointer

■ フォーカスが PointerRoot から None、またはその逆に移動し、ポインタが P にある場合

・古いフォーカスが PointerRoot の場合、P から P のルートまでの各ウィンドウで [FocusOut] detail = NotifyPointer
・すべてのルートウィンドウに [FocusOut] detail = NotifyPointerRoot または NotifyDetailNone
・すべてのルートウィンドウに [FocusIn] detail = NotifyDetailNone または NotifyPointerRoot
・新しいフォーカスが PointerRoot の場合、P のルートから P までの各ウィンドウで [FocusIn] detail = NotifyPointer

■ キーボードグラブが、グラブをアクティブにする実際の KeyPress イベントを生成する前にアクティブになる時

mode = NotifyGrab で、FocusIn と FocusOut イベントを生成。
これらのイベントは、フォーカスが現在のウィンドウからグラブウィンドウに変化したかのように生成されます。

■ キーボードグラブが、グラブを非アクティブ化する実際の KeyRelease イベントの生成後に非アクティブ化された時

mode = NotifyUngrab で、FocusIn と FocusOut イベントを生成。
これらのイベントは、フォーカスがグラブウィンドウから本来のウィンドウに変化したかのように生成されます。
mode
NotifyNormal (0) : 通常イベント
NotifyGrab (1) : キーボードグラブがアクティブ化されたときのフォーカスイベント
NotifyUngrab (2) : キーボードグラブが非アクティブ化されたときのフォーカスイベント
NotifyWhileGrabbed (3) : キーボードグラブ中のフォーカスイベント
detail
NotifyAncestor (0) : 祖先
NotifyVirtual (1)
NotifyInferior (2) : 下位
NotifyNonlinear (3) : 非線形 (親や子の関係にない)
NotifyNonlinearVirtual (4)
NotifyPointer (5) : ウィンドウ内にポインタがある
NotifyPointerRoot (6)
NotifyDetailNone (7)
typedef struct {
 int            type;
 unsigned long  serial;
 Bool           send_event;
 Display        *display;
 Window         window;
 char           key_vector[32];
} XKeymapEvent;
すべての物理キーの押し状態が送られてくる。
X サーバーは、すべての EnterNotify および FocusIn イベントの直後に、このイベントを生成します。
この後のキー変化は、KeyPress/KeyRelease イベントで処理する必要がある。
key_vector
256個の各物理キーの押し状態のフラグ。
[0] の下位ビットから順に並んでいる。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 int           request;
 int           first_keycode;
 int           count;
} XMappingEvent;
X サーバーは、クライアントが次の呼び出しに成功するたびに、MappingNotify イベントをすべてのクライアントに報告します。
[ XSetModifierMapping, XChangeKeyboardMapping, XSetPointerMapping ]

キーボードに関するクライアントの情報を更新するには、XRefreshKeyboardMapping を呼び出す必要があります。
request
発生したマッピング変更の種類。
MappingModifier : 修飾子のマッピングが変更された。
MappingKeyboard : キーボードマッピングが変更された。
MappingPointer : ポインタボタンのマッピングが変更された
first_keycode
(MappingKeyboard 時) 変更されたマッピングの範囲内の最初の数値
count
(MappingKeyboard 時) 変更されたキーコードの数
グラフィック
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 int           x, y;
 int           width, height;
 int           count;
} XExposeEvent;
ウィンドウ領域の描画内容が失われていて、再描画が必要なタイミングで来る。

X サーバーが Expose イベントを生成する状況は、他のイベントほど明確ではありません。
ただし、X サーバーは、InputOnly クラスのウィンドウでは Expose イベントを生成しません。

X サーバーは、ウィンドウの領域に有効な内容が利用できず、領域が表示されている場合、領域が表示可能で、サーバーが (おそらく新たに) ウィンドウ上のバッキングストアを維持している場合、またはウィンドウが表示不可能である場合に Expose イベントを生成できます。
ただし、サーバーはウィンドウの backing_store 属性が Always または WhenMapped の場合、それを尊重します。

領域は (任意の) 四角形のセットに分解され、各四角形に対して、Expose イベントが生成されます。
X サーバーは、任意のウィンドウについて、Expose イベントを引き起こすアクションによって公開されたすべての領域を、連続して報告することを保証します。
x,y
ウィンドウの原点を基準とした相対位置
count
この後に続く Expose イベントの数。
count が 0 の場合、このウィンドウに対してこれ以上 Expose イベントは続きません。
ただし、count がゼロ以外の場合、このウィンドウには少なくともその数 (場合によってはそれ以上) の Expose イベントが続きます。
ウィンドウのサブエリアを区別して再表示を最適化したくない単純なアプリケーションは、カウントが 0 以外のすべての Expose イベントを無視し、カウントが 0 のイベントに対して完全な再表示を実行できます。
typedef struct {
 int            type;
 unsigned long  serial;
 Bool           send_event;
 Display        *display;
 Drawable       drawable;
 int            x, y;
 int            width, height;
 int            count;
 int            major_code;
 int            minor_code;
} XGraphicsExposeEvent;
X サーバーは、特定のグラフィックス要求 (XCopyArea または XCopyPlane) 中に、dest 領域を計算できなかった場合に GraphicsExpose イベントを報告できます。
X サーバーは、ソース領域が隠れているか、境界線の外の範囲であるために dest 領域を計算できなかった場合に、このイベントを生成します。

X サーバーは、何らかのグラフィックス要求によって公開されるすべての領域を、連続して報告することを保証します。
drawable
dest のドローアブル
major_code
リクエストのプロトコル番号。
X_CopyArea または X_CopyPlane
minor_code
コア X プロトコルでは定義されていないため、0。拡張機能で使用される。
count
後続する GraphicsExpose イベントの数
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Drawable      drawable;
 int           major_code;
 int           minor_code;
} XNoExposeEvent;
X サーバーは、GraphicsExpose イベントを生成する可能性のあるグラフィックス要求が、何も生成しない場合は、常に NoExpose イベントを生成します。
つまり、クライアントは実際には GraphicsExpose イベントを要求しているが、代わりに NoExpose イベントを受け取ります。
ウィンドウ状態変化
typedef struct {
 int type;
 unsigned long serial;
 Bool send_event;
 Display *display;
 Window event;
 Window window;
 int place;
} XCirculateEvent;
X サーバーは、クライアントアプリケーションが XCirculateSubwindows、XCirculateSubwindowsUp、XCirculateSubwindowsDown を呼び出した結果として、ウィンドウが実際に再スタックされるたびに、このイベントタイプを生成します。

CirculateNotify イベントを受信するには、ウィンドウのイベントマスク属性の StructureNotifyMask ビットを設定するか、親ウィンドウのイベントマスク属性の SubStructureNotifyMask ビットを設定します (この場合、子を循環させるとイベントが生成されます)。
event
StructureNotify では自身のウィンドウ、SubstructuralNotify では親ウィンドウ
window
再スタックされたウィンドウ
place
再スタックが発生した後のウィンドウ位置。
PlaceOnTop の場合、ウィンドウはすべての兄弟の最前面に表示されます。
PlaceOnBottom の場合、ウィンドウはすべての兄弟の下にあります。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        event;
 Window        window;
 int           x, y;
 int           width, height;
 int           border_width;
 Window        above;
 Bool          override_redirect;
} XConfigureEvent;
ウィンドウの位置、サイズ、境界幅、重なり順が変化した。
StructureNotifyMask イベントマスクを選択すると、自身のウィンドウでのイベント、SubStructureNotifyMask イベントマスクを選択すると、子ウィンドウでのイベントが生成されます。
event
自身のウィンドウ、または親ウィンドウ
window
実際に変化したウィンドウ
x,y
親ウィンドウの原点を基準とした位置
width,height
境界線を含まないサイズ
border_width
境界線の幅
above
このウィンドウの下に位置する兄弟ウィンドウ。
None の場合、状態が変更されたウィンドウは、兄弟ウィンドウに関してスタックの一番下にあります。
それ以外の場合、状態が変更されたウィンドウは、この兄弟ウィンドウの上に配置されます。
override_redirect
ウィンドウの override_redirect 属性から設定される。
True の場合、ウィンドウマネージャーは通常、このウィンドウを無視する必要があります。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        parent;
 Window        window;
 int           x, y;
 int           width, height;
 int           border_width;
 Bool          override_redirect;
} XCreateWindowEvent;
X サーバーは、クライアントアプリケーションが XCreateWindow または XCreateSimpleWindow を呼び出して子ウィンドウを作成するたびに、このイベントを生成します。
CreateNotify イベントを受信するには、ウィンドウのイベントマスク属性で、親に SubStructureNotifyMask ビットを設定します。子を作成するとイベントが生成されます。
parent
作成されたウィンドウの親
window
作成されるウィンドウ
x,y
親ウィンドウの原点を基準とした位置
width,height
作成されたウィンドウの内側のサイズ (境界線は含まない)。常に 0 以外の値になります。
override_redirect
ウィンドウの override_redirect 属性から設定される
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        event;
 Window        window;
} XDestroyWindowEvent;
X サーバーは、クライアントアプリケーションが XDestroyWindow または XDestroySubwindows を呼び出してウィンドウを破棄するたびに、このイベントを生成します。

DestroyNotify イベントの順序は、特定のウィンドウに対して、DestroyNotify がそのウィンドウ自体で生成される前に、そのウィンドウの下位すべてで生成されるようになります。
X プロトコルは、兄弟間およびサブ階層間の順序を制限しません。

DestroyNotify イベントを受信するには、ウィンドウのイベントマスク属性の StructureNotifyMask ビットを設定するか、親ウィンドウのイベントマスク属性の SubStructureNotifyMask ビットを設定します (この場合、子を破棄するとイベントが生成されます)。
event
StructureNotify では破棄されたウィンドウ、SubstructuralNotify では親ウィンドウ
window
破棄されたウィンドウ
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        event;
 Window        window;
 int           x, y;
} XGravityEvent;
X サーバーは、XConfigureWindow、XMoveResizeWindow、XResizeWindow を呼び出して親ウィンドウのサイズを変更した結果、クライアントアプリケーションが実際に子ウィンドウを移動するたびに、このイベントを生成します。

GravityNotify イベントを受信するには、ウィンドウのイベントマスク属性の StructureNotifyMask ビットを設定するか、親ウィンドウのイベントマスク属性の SubStructureNotifyMask ビットを設定します。
event
StructureNotify では自身のウィンドウ、SubstructuralNotify では親ウィンドウ
window
移動した子ウィンドウ
x,y
親ウィンドウの原点を基準とした、新しい相対座標
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        event;
 Window        window;
 Bool          override_redirect;
} XMapEvent;
X サーバーは、クライアントアプリケーションが XMapWindow、XMapRaized、XMapSubwindows、XReparentWindow を呼び出すことによって、またはセーブセット処理の結果として、ウィンドウの状態がマップされていない状態から、マップされた状態に変更されるたびに、このイベントタイプを生成します。

MapNotify イベントを受信するには、ウィンドウのイベントマスク属性の StructureNotifyMask ビットを設定するか、親ウィンドウのイベントマスク属性の SubStructureNotifyMask ビットを設定します (この場合、子をマッピングするとイベントが生成されます)。
event
StructureNotify では自身のウィンドウ、SubstructuralNotify では親ウィンドウ
window
マップされたウィンドウ
override_redirect
ウィンドウの override_redirect 属性から設定される
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        event;
 Window        window;
 Bool          from_configure;
} XUnmapEvent;
X サーバーは、クライアントアプリケーションが、ウィンドウの状態をマップされた状態から、マップされていない状態に変更するたびに、このイベントタイプを生成します。

UnmapNotify イベントを受信するには、ウィンドウのイベントマスク属性の StructureNotifyMask ビットを設定するか、親ウィンドウのイベントマスク属性の SubStructureNotifyMask ビットを設定します (この場合、子ウィンドウのマッピングを解除するとイベントが生成されます)。
event
StructureNotify では自身のウィンドウ、SubstructuralNotify では親ウィンドウ
window
マップ解除されたウィンドウ
from_configure
自身のウィンドウの win_gravity が UnmapGravity の時に、ウィンドウの親がサイズ変更された結果としてイベントが生成された場合、from_configure メンバーは True に設定されます。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        event;
 Window        window;
 Window        parent;
 int           x, y;
 Bool          override_redirect;
} XReparentEvent;
X サーバーは、クライアントアプリケーションが XReparentWindow を呼び出し、ウィンドウが実際に再親化されるたびにこのイベントを生成します。

ReparentNotify イベントを受信するには、ウィンドウのイベントマスク属性の StructureNotifyMask ビットを設定するか、古い親ウィンドウまたは新しい親ウィンドウのイベントマスク属性の SubStructureNotifyMask ビットを設定します (この場合、子を再親化するとイベントが生成されます)。
event
StructureNotify では自身のウィンドウ、SubstructuralNotify では古い親か新しい親
window
親が変更されたウィンドウ
parent
新しい親ウィンドウ
x,y
新しい親ウィンドウの原点を基準とした座標
override_redirect
ウィンドウの override_redirect 属性から設定される
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 int           state;
} XVisibilityEvent;
画面を見ている人が実際にウィンドウの領域を見ることができる場合、ウィンドウの領域が表示されます。
X サーバーは、可視性の状態が変化するたびにこのイベントを生成します。
ただし、このイベントは、クラスが InputOnly のウィンドウに対しては生成されません。

階層の変更によって発生するすべての VisibilityNotify イベントは、その変更によって発生する階層イベント (UnmapNotify、MapNotify、ConfigureNotify、GravityNotify、CirculateNotify) の後に生成されます。
特定のウィンドウ上のすべての VisibilityNotify イベントは、そのウィンドウ上のすべての Expose イベントの前に生成されますが、すべてのウィンドウ上のすべての VisibilityNotify イベントが、すべてのウィンドウ上のすべての Expose イベントより前に生成される必要はありません。
X プロトコルは、FocusOut、EnterNotify、LeaveNotify イベントに関して、VisibilityNotify イベントの順序を制限しません。

VisibilityNotify イベントを受信するには、ウィンドウのイベントマスク属性で VisibilityChangeMask ビットを設定します。
state
ウィンドウの可視性の状態。
VisibilityUnobscured (0) の場合、部分的または完全に隠れている or 非表示状態から、表示可能で全体が見えている状態に変化した時。
VisibilityPartiallyObscured (1) の場合、全体が見えている or 非表示状態から、表示可能で一部が隠れている状態に変化した時。
VisibilityFullyObscured (2) の場合、表示可能で全体が見えている or 一部が隠れている or 非表示状態から、表示可能で全体が隠れた状態に変化した時。
状態変化要求
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        parent;
 Window        window;
 int place;
} XCirculateRequestEvent;
X サーバーは、クライアントがウィンドウ上で循環ウィンドウ要求を開始し、サブウィンドウを実際に再スタックする必要がある場合は常に、このイベントタイプを生成します。
クライアントは、XCirculateSubwindows、XCirculateSubwindowsUp、XCirculateSubwindowsDown を呼び出して、ウィンドウ上で循環ウィンドウリクエストを開始します。

CirculateRequest イベントを受信するには、ウィンドウのイベントマスク属性に SubstructureRedirectMask を設定します。
その後、指定されたウィンドウに対する循環ウィンドウ要求は実行されないため、スタック内のサブウィンドウの位置は変更されません。
たとえば、クライアントアプリケーションが XCirculateSubwindowsUp を呼び出してサブウィンドウをスタックの最上位に上げるとします。
ウィンドウで SubstructreRedirectMask を選択した場合、X サーバーは CirculateRequest イベントを報告し、サブウィンドウをスタックの最上位に上げません。
window
再スタックされるウィンドウ
place
PlaceOnTop の場合、サブウィンドウはすべての兄弟ウィンドウの上にある必要があります。
PlaceOnBottom の場合、サブウィンドウはすべての兄弟の下にある必要があります。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        parent;
 Window        window;
 int           x, y;
 int           width, height;
 int           border_width;
 Window        above;
 int           detail;
 unsigned long value_mask;
} XConfigureRequestEvent;
ConfigureRequest リクエストは、ウィンドウのサイズ、位置、境界線、重なり順の再構成を試みます。
X サーバーは、別のクライアントが XConfigureWindow、XLowerWindow、XRaiseWindow、XMapRaized、XMoveResizeWindow、XMoveWindow、XResizeWindow、XRestackWindows、XSetWindowBorderWidth を呼び出して、ウィンドウ上で ConfigureWindow リクエストを開始するたびに、このイベントを生成します。

ConfigureRequest イベントを受信するには、ウィンドウのイベントマスク属性で SubstructureRedirectMask ビットを設定します。
ConfigureRequest イベントは、ConfigureWindow プロトコル要求が、別のクライアントによって子ウィンドウで発行されると生成されます。

たとえば、クライアントアプリケーションが XLowerWindow を呼び出してウィンドウを下げるとします。
親ウィンドウで SubstructreRedirectMask を選択し、ウィンドウの override_redirect 属性が False に設定されている場合、X サーバーは ConfigureRequest イベントを報告し、指定されたウィンドウを下げません。
above
リクエスト時に指定されていない場合、None
detail
リクエスト時に指定されていない場合、Above。
Above, Below, TopIf, BottomIf, Opposite
value_mask
どの値が指定されたかのマスク。
CWX, CWY, CWWidth, CWHeight, CWBorderWidth, CWSibling, CWStackMode
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        parent;
 Window        window;
} XMapRequestEvent;
Map リクエストが完了すると、ウィンドウはマップされたとみなされます。
X サーバーは、override_redirect メンバーが False に設定されている、マップされていないウィンドウに対して、別のクライアントがマップ ウィンドウ要求を開始するたびに、このイベントを生成します。
クライアントは、XMapWindow、XMapRaized、XMapSubwindows を呼び出してマップウィンドウ要求を開始します。

MapRequest イベントを受信するには、ウィンドウのイベントマスク属性で SubstructureRedirectMask ビットを設定します。
これは、別のクライアントがマップ ウィンドウ リクエスト関数の 1 つを呼び出して子ウィンドウをマップしようとする試みがインターセプトされ、代わりに MapRequest が送信されることを意味します。

たとえば、クライアントアプリケーションが XMapWindow を呼び出してウィンドウをマップするとします。
ユーザー (通常はウィンドウマネージャー) が親ウィンドウで SubstructureRedirectMask を選択し、ウィンドウの override_redirect 属性が False に設定されている場合、X サーバーは MapRequest イベントをユーザーに報告し、指定されたウィンドウをマップしません。
したがって、このイベントにより、ウィンドウマネージャークライアントはサブウィンドウの配置を制御できるようになります。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 int           width, height;
} XResizeRequestEvent;
X サーバーは、他のクライアントが XConfigureWindow、XResizeWindow、XMoveResizeWindow を呼び出して、指定されたウィンドウのサイズを変更しようとするたびに、このイベントを生成します。

ResizeRequest イベントを受信するには、ウィンドウのイベントマスク属性で ResizeRedirect ビットを設定します。
他のクライアントによるサイズ変更の試行はリダイレクトされます。
カラーマップ
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 Colormap      colormap;
 Bool          new;
 int           state;
} XColormapEvent;
X サーバーは、クライアント アプリケーションが次の操作を行うたびに、このイベントタイプを生成します。

・XChangeWindowAttributes、XFreeColormap、XSetWindowColormap を呼び出して、XSetWindowAttributes 構造体のカラーマップメンバーが変更された。
・XInstallColormap または XUninstallColormap を呼び出して、カラーマップをインストールまたはアンインストールした。

ColormapNotify イベントを受信するには、ウィンドウのイベントマスク属性で ColormapChangeMask ビットを設定します。
colormap
変更されたカラーマップ。None で XFreeColormap() 実行時。
new
True でカラーマップは変更された。
False の場合、カラーマップはインストールまたはアンインストールされた。
state
ColormapInstalled でカラーマップはインストールされている。
ColormapUninstalled でアンインストールされている。
クライアント通信
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 Atom          message_type;
 int           format;
 union{
     char  b[20];
     short s[10];
     long  l[5];
 } data;
} XClientMessageEvent;
X サーバーは、クライアントが XSendEvent 関数を呼び出した場合にのみ、ClientMessage イベントを生成します。
X サーバーは、window、message_type、data メンバーの値を解釈しません。
message_type
受信側のクライアントが、データをどのように解釈するかを示すアトム
format
データのフォーマット。8,16,32。
それぞれ、data.b, data.s, data.l の値を使う。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 Atom atom;
 Time time;
 int state;
} XPropertyEvent;
X サーバーは、指定されたウィンドウのプロパティが変更された時、PropertyNotify イベントを報告できます。
PropertyNotify イベントを受信するには、ウィンドウのイベントマスク属性で PropertyChangeMask ビットを設定します。
atom
プロパティのアトム
time
プロパティが変更されたときのサーバー時刻
state
PropertyNewValue で、新しい値に変更された。
PropertyDelete で、プロパティが削除された。
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        window;
 Atom          selection;
 Time          time;
} XSelectionClearEvent;
X サーバーは、セレクションの所有権を失ったクライアントに、SelectionClear イベントを報告します。
別のクライアントが XSetSelectionOwner を呼び出してセレクションの所有権を変更すると、X サーバーはこのイベントタイプを生成します。
window
XSetSelectionOwner 呼び出しで現在の所有者 (セレクションを失った所有者) によって指定されたウィンドウ
time
セレクションに対して記録された、最後の変更時刻
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        owner;
 Window        requestor;
 Atom          selection;
 Atom          target;
 Atom          property;
 Time          time;
} XSelectionRequestEvent;
X サーバーは、SelectionRequest イベントをセレクションの所有者に報告します。
X サーバーは、クライアントが所有するセレクションに対して XConvertSelection が呼び出され、データの変換を要求するたびに、このイベントを生成します。

所有者は、指定されたターゲットタイプに基づいてセレクションを変換し、プロパティにデータをセットした後で、XSendEvent を使って、SelectionNotify イベントを要求者に送り返す必要があります。
(変換できなかった時は property = None にする)

property = None が指定されていた場合、所有者は任意のプロパティを選択してデータをセットし、SelectionNotify の property には、実際にデータがセットされたプロパティを指定して送信する必要があります。
owner
セレクション所有者
requestor
データを要求したウィンドウ
target
要求するタイプ
property
プロパティ名または None
time
XConvertSelection で渡されたタイムスタンプ、または CurrentTime
typedef struct {
 int           type;
 unsigned long serial;
 Bool          send_event;
 Display       *display;
 Window        requestor;
 Atom          selection;
 Atom          target;
 Atom          property;
 Time          time;
} XSelectionEvent;
セレクションの所有者が存在する場合は、セレクションの所有者によって、変換が完了した時に XSendEvent を使用して送信されます。
セレクションの所有者が存在しない場合は、XConvertSelection の結果として、X サーバーによって生成されます。

要求者は、このイベントが来た時、プロパティからデータを読み込みます。
requestor
要求したウィンドウ
property
結果が格納されたプロパティを示すアトム。
変換に失敗した場合、None。
time
変換が要求された時間。タイムスタンプまたは CurrentTime