Chapter 10 Events

Chapter 10: Events

クライアント・アプリケーションは、 XOpenDisplay 関数で確立するコネクションを通してXサーバーと通信する。 クライアント・アプリケーションは、このコネクション上で X サーバーにリクエストを送る。 これらのリクエストは、クライアント・アプリケーションに呼ばれる Xlib 関数によって作られる。 多くの Xlib 関数は、X サーバーにイベントを発生させる、 さらに、ユーザーのタイピングやポインターの移動は、非同期にイベントを発生させることができる。 X サーバーは、同じコネクションでイベントをクライアントに返す。

この章は、イベントに関係がある以下の話題を説明する:

イベントを取り扱うための機能は、次の章で扱われる。

Event Types

イベントは、あるデバイス活動の結果として、あるいは Xlib 関数によって送られたリクエストの結果として X サーバーによって非同期に発生させられた情報だ。 あるクライアント・アプリケーションがそのイベント型(type)を取得するときまで、あるいは明白に破棄されるときまで、デバイスに関連するイベントは、元のウインドウから上位階層ウインドウへ伝えられる。 一般に、クライアントが明示的にウインドウのイベントマスク属性を設定することによって、明確にそのイベント型(type)の通知を受ける事を要求した場合に限り、X サーバーはクライアント・アプリケーションにイベントを送る。 また、マスクは、あなたがウインドウを作り出すとき、あるいはウインドウのイベントマスクを変更することによって設定できる。 また、あなたは、ウインドウ属性の伝播させないイベントを指定するマスクを操作することによって上位階層ウインドウへ伝わるはずのイベントを隠すことができる。 しかしながら、 MappingNotifyイベントは、常にすべてのクライアントに送られる。

イベント型(type)は、X サーバーによって発生させられた特定のイベントについて述べる。 対応する定数名はイベント型(type)を参照する時に使われる <X11/X.h >において定義される。 以下のテーブルは、イベント・カテゴリー、およびそれに関連するイベント型(type)を列挙する。 これらのイベントに関係がある処理は、セクション 10.5 で議論される。

Event Category Event Type
Keyboard events KeyPress ,KeyRelease
Pointer events ButtonPress , ButtonRelease ,MotionNotify
Window crossing events EnterNotify , LeaveNotify
Input focus events FocusIn , FocusOut
Keymap state notification event KeymapNotify
Exposure events Expose , GraphicsExpose , NoExpose
Structure control events CirculateRequest , ConfigureRequest , MapRequest ,ResizeRequest
Window state notification events CirculateNotify , ConfigureNotify , CreateNotify , DestroyNotify , GravityNotify , MapNotify ,MappingNotify , ReparentNotify , UnmapNotify ,
VisibilityNotify
Colormap state notification event ColormapNotify
Client communication events ClientMessage , PropertyNotify , SelectionClear , SelectionNotify , SelectionRequest

Event Structures

それぞれのイベント型(type)において、対応する構造体は <X11/Xlib.h >で宣言される。 すべてのイベント構造体は以下の共通のメンバーを持つ:

typedef struct {
	int type;
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;
} XAnyEvent;

type メンバーは、一意にそれを識別するイベント型(type)定数名が設定される。 例えば、Xサーバーが GraphicsExposeイベントをクライアント・アプリケーションへ通知するときに、それは、 GraphicsExposeを type メンバーに設定された XGraphicsExposeEvent構造体を送る。 display メンバーは、イベントが読まれたディスプレイへのポインター(pointer)に設定される。 send_event メンバーは、イベントが SendEventプロトコルリクエストによって 送られた物なら Trueに設定される。 serial メンバはプロトコルで通知されたシリアル番号を基に設定される。 ただし、最少桁の16ビットから完全な32ビットの値に拡張される。 window メンバーは、ツールキット・ディスパッチャーにとって最も役に立つウインドウが設定される。

X サーバーは、入力ストリームでいつでもイベントを送ることができる。 Xlib はイベント・キューで応答(reply)を待っている間に受け取ったどんなイベントも後で使うために保存する。 Xlibはまた、あなたがイベント・キューのイベントを調べることを可能にする機能を提供する(セクション11.3を見ろ)。

それぞれのイベント型(type)のために宣言されている個々の構造体に加えて、 XEvent構造体はそれぞれのイベント型(type)のために宣言されている個々の構造体の共用体である。 型(type)に応じて、あなたは、 XEvent共用体を使ってそれぞれのイベントのメンバーにアクセスすべきだ。

typedef union _XEvent {
	int type;	/* must not be changed */
	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構造体の最初のエントリーは、必ず type メンバーだ(イベント型(type)が設定される)。 第2のメンバーは、必ず、イベントを発生させたプロトコル要求のシリアル番号だ。 第3のメンバーは、必ず、send_event だ(異なるクライアントによって送られたイベントかを示す Bool値だ)。 第4のメンバーは、いつも display だ(そのイベントが読まれたディスプレイを示す)。 keymap イベントを除いて、第5のメンバーは、いつも window だ(ツールキット・ディスパッチャーにとって役に立つと注意ぶかく選ばれた)。 toolkits を壊すことを避けるために、これらの最初の 5 つのエントリーの順序は、変えない。 さらにほとんどのイベントは、time メンバーを含む(そこでイベントが起こった時間である)。 加えて、汎用のイベントへのポインターは構造体の中の他のいずれかの情報にアクセスする前にキャストしなくてはならない。

Event Masks

クライアントはウインドウに関係するほとんどのイベントのイベント通知を選ぶ。 これをするには、 イベントマスク引数を必要とする Xlib イベント処理関数にイベントマスクを渡す。 イベント・マスクのビットは <X11/X.h >で定義される。 イベントマスクのそれぞれのビットは、あなたが X サーバーがクライアントアプリケーションに返す事を望んだイベントを記述するイベントマスク名に対応する。

大半のイベントはクライアントが明示的に要求しない限りそれらが発生する時に通知されない。 クライアントが GC の graphics-exposures を Falseに設定することで抑制しない限り GraphicsExposeNoExpose は、 XCopyPlaneXCopyAreaの結果としてデフォルトで通知される。 SelectionClearSelectionRequestSelectionNotify 、そして ClientMessageはマスクすることができない。 セレクションに関連するイベントはセレクションに協力しているクライアントにのみ送られる(see section 4.5)。 キーボード、あるいはポインター・マッピングが変えられるときに、 MappingNotifyが、必ずクライアントに送られる。

以下のテーブルは、 あなたがイベントマスク引数として渡すことの出来るイベントマスク定数と あなたがそのイベントマスクを指定したくなるだろう状況を列挙する:

Event Mask Circumstances
NoEventMask No events wanted
KeyPressMask Keyboard down events wanted
KeyReleaseMask Keyboard up events wanted
ButtonPressMask Pointer button down events wanted
ButtonReleaseMask Pointer button up events wanted
EnterWindowMask Pointer window entry events wanted
LeaveWindowMask Pointer window leave events wanted
PointerMotionMask Pointer motion events wanted
PointerMotionHintMask Pointer motion hints wanted
Button1MotionMask Pointer motion while button 1 down
Button2MotionMask Pointer motion while button 2 down
Button3MotionMask Pointer motion while button 3 down
Button4MotionMask Pointer motion while button 4 down
Button5MotionMask Pointer motion while button 5 down
ButtonMotionMask Pointer motion while any button down
KeymapStateMask Keyboard state wanted at window entry and focus in
ExposureMask Any exposure wanted
VisibilityChangeMask Any change in visibility wanted
StructureNotifyMask Any change in window structure wanted
ResizeRedirectMask Redirect resize of this window
SubstructureNotifyMask Substructure notification wanted
SubstructureRedirectMask Redirect structure requests on children
FocusChangeMask Any change in input focus wanted
PropertyChangeMask Any change in property wanted
ColormapChangeMask Any change in colormap wanted
OwnerGrabButtonMask Automatic grabs should activate with owner_events set to True

Event Processing Overview

イベント処理の間にクライアント・アプリケーションにレポートされるイベントは、あなたがウインドウにイベントマスク属性として提供する(複数の)イベントマスク次第である。 いくつかのイベントマスクでは、イベントマスク定数とイベント型(type)定数が1対1で対応している。 例えば、もしあなたがイベントマスク ButtonPressMaskを渡せば、Xサーバーは、 ButtonPressイベントのみを送り返す。 ほとんどのイベントは、time メンバーを含む(そこでイベントが起こった時間である)。

他の場合で、一つのイベントマスクが複数のイベント型(type)定数に対応する事が出来る。 例えば、もしあなたがイベント・マスク SubstructureNotifyMaskを渡せば、Xサーバーは、 CirculateNotifyConfigureNotifyCreateNotifyDestroyNotifyGravityNotifyMapNotifyReparentNotifyあるいは UnmapNotifyイベントを送り返すことができる。

もう一つのケースで、2つのイベントマスクが 1 つのイベント型(type)に対応する事が出来る。 例えば、もしあなたがイベントマスク PointerMotionMaskまたは ButtonMotionMask(の一方)を渡せば、Xサーバーは MotionNotifyイベントを送り返す。

以下のテーブルは、イベントマスク、それに関連するイベント型(type)を列挙する、そして、構造体名は、イベント型(type)と結び付く。 これらの構造体のいくつかは、実際には、2つのイベント型(type)の間で共有される汎用の構造体の typedefs だ。 注意:情報が適用できないコラムには N.A. が現れる。

Event Mask Event Type Structure Generic Structure
ButtonMotionMask MotionNotify XPointerMovedEvent XMotionEvent
Button1MotionMask Button2MotionMask Button3MotionMask Button4MotionMask
Button5MotionMask ButtonPressMask ButtonPress XButtonPressedEvent
XButtonEvent ButtonReleaseMask ButtonRelease XButtonReleasedEvent
XButtonEvent ColormapChangeMask ColormapNotify XColormapEvent
EnterWindowMask EnterNotify XEnterWindowEvent XCrossingEvent
LeaveWindowMask LeaveNotify XLeaveWindowEvent XCrossingEvent
ExposureMask Expose XExposeEvent GCGraphicsExposures in GC
GraphicsExpose XGraphicsExposeEvent NoExpose
XNoExposeEvent FocusChangeMask FocusIn XFocusInEvent
XFocusChangeEvent FocusOut XFocusOutEvent
XFocusChangeEvent KeymapStateMask KeymapNotify XKeymapEvent
KeyPressMask KeyPress XKeyPressedEvent XKeyEvent
KeyReleaseMask KeyRelease XKeyReleasedEvent XKeyEvent
OwnerGrabButtonMask N.A. N.A. PointerMotionMask
MotionNotify XPointerMovedEvent XMotionEvent PointerMotionHintMask
N.A. N.A. PropertyChangeMask PropertyNotify
XPropertyEvent ResizeRedirectMask ResizeRequest XResizeRequestEvent
StructureNotifyMask CirculateNotify XCirculateEvent
ConfigureNotify XConfigureEvent DestroyNotify
XDestroyWindowEvent GravityNotify XGravityEvent
MapNotify XMapEvent
ReparentNotify XReparentEvent UnmapNotify
XUnmapEvent SubstructureNotifyMask CirculateNotify XCirculateEvent
ConfigureNotify XConfigureEvent
CreateNotify XCreateWindowEvent DestroyNotify
XDestroyWindowEvent GravityNotify XGravityEvent
MapNotify XMapEvent
ReparentNotify XReparentEvent UnmapNotify
XUnmapEvent SubstructureRedirectMask CirculateRequest XCirculateRequestEvent
ConfigureRequest XConfigureRequestEvent
MapRequest XMapRequestEvent N.A. ClientMessage
XClientMessageEvent N.A. MappingNotify XMappingEvent
N.A. SelectionClear XSelectionClearEvent N.A.
SelectionNotify XSelectionEvent N.A. SelectionRequest
XSelectionRequestEvent VisibilityChangeMask VisibilityNotify XVisibilityEvent

後に続くセクションはあなたが異なるイベントマスクを選んだ時に起こる処理について述べる。 セクションは処理のカテゴリ分けに従って編成される:

Keyboard and Pointer Events

This section discusses:

Pointer Button Events

下記では、ポインターボタンプレスが何らかのウインドウ w へのポインター付きで処理されるとき、そしていかなるアクティブグラブも実行中ではない時におこるイベント処理について述べる。

X サーバーは、アクティブになるパッシブグラブを探して、ルートの下へ w の上位階層ウインドウを検索する。 もし、ボタンに関連するパッシブグラブがない場合は、X サーバーは自動的にクライアントがイベントを受け取るためのアクティブグラブを始動して現在のサーバー時間に最終ポインタグラブ時刻を設定する。 結果は、本質的にクライアントが XGrabButtonに以下の引数を渡したことに相当する:

Argument Value
w The event window
event_mask The client's selected pointer events on the event window
pointer_mode GrabModeAsync
keyboard_mode GrabModeAsync
owner_events True ,if the client has selectedOwnerGrabButtonMaskon the event window,otherwiseFalse
confine_to None
cursor None

ポインターの論理的な状態がすべてのボタンが解放された時に、アクティブなグラブは、自動的に終了される。 クライアントは XUngrabPointer、および XChangeActivePointerGrabを呼ぶことによってアクティブグラブを変更することができる。

Keyboard and Pointer Events

このセクションは、キーボード・イベント KeyPressKeyReleaseそしてポインター・イベント ButtonPressButtonRelease 、そして MotionNotifyのために起こる処理を議論する。 キーボード・イベントハンドリングユーティリティについての情報は、11章を見よ。

X サーバーは、キーの論理的な状態の情報を要求するクライアントに KeyPressKeyReleaseイベントを通知する。 ノート:これらのイベントはすべてのキーのために発生させられ、さらにそれらはモディファイアビットに写像されている。 X サーバーは、キーの論理的な状態の情報を必要とするクライアントに ButtonPressButtonReleaseを通知する。

X サーバーは、ポインタが論理的に動いたという情報を要求するクライアントに MotionNotifyを通知する。 X サーバーはポインタが動かされさらにウインドウ内でポインタの動きが始まって終る時にはいつもこのイベントを起こす。 MotionNotifyイベントの精度は、保証されない、 しかし、クライアントはポインターが動きそして止まれば最低一つのイベント型(type)を受け取る事が保証されている。

もし、デバイスイベントの処理が凍結されると物理的な変化と論理的な変化との間にずれが生まれる。

KeyPressKeyReleaseButtonPressButtonRelease イベントを受け取るには ウインドウのイベントマスク属性の KeyPressMaskKeyReleaseMaskButtonPressMaskButtonReleaseMask ビットを設定する。

MotionNotifyイベントを受け取るには、ウインドウのイベントマスク属性に次のイベントマスクビットのうち一つ以上を設定する。

イベントの発生源は、ポインターがある表示可能(viewable)なウインドウだ。 X サーバからそれらのイベントを通知するために使われるウィンドウは、 ウィンドウの階層構造のなかでのそのウィンドウの位置と、 間に入っているウィンドウがイベントの発生を禁止しているかどうかに 依存して決まる。 X サーバは、クライアントからイベントに注目するように指定された 最初のウィンドウを、イベントの発生源のウィンドウから順に ウィンドウの階層構造をさかのぼって探す。 もし間にあるウィンドウの一つに、特定の種類のイベントの発生を禁止する do-not-propagate-mask が設定されていた場合、その種のイベントは抑制される。 間に入っているウインドウの一つが伝播させないイベントを指定するマスクがイ ベント型(type)の生成を禁止するように設定されていると、それらの型のイベン トは抑制される。 クライアントはアクティブグラブを使う事によって、そしてキーボードイベント の場合には、フォーカスウインドウを使う事によっても、実際の通知に使われる ウインドウを変更する事ができる。

これらのイベント型(type)のための構造体は以下を含む:

typedef struct {
	int type;	/* ButtonPress or ButtonRelease */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;	/* ``event'' window it is reported relative to */
	Window root;	/* root window that the event occurred on */
	Window subwindow;	/* child window */
	Time time;	/* milliseconds */
	int x, y;	/* pointer x, y coordinates in event window */
	int x_root, y_root;	/* coordinates relative to root */
	unsigned int state;	/* key or button mask */
	unsigned int button;	/* detail */
	Bool same_screen;	/* same screen flag */
} XButtonEvent;
typedef XButtonEvent XButtonPressedEvent;
typedef XButtonEvent XButtonReleasedEvent;

typedef struct {
	int type;	/* KeyPress or KeyRelease */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;	/* ``event'' window it is reported relative to */
	Window root;	/* root window that the event occurred on */
	Window subwindow;	/* child window */
	Time time;	/* milliseconds */
	int x, y;	/* pointer x, y coordinates in event window */
	int x_root, y_root;	/* coordinates relative to root */
	unsigned int state;	/* key or button mask */
	unsigned int keycode;	/* detail */
	Bool same_screen;	/* same screen flag */
} XKeyEvent;
typedef XKeyEvent XKeyPressedEvent;
typedef XKeyEvent XKeyReleasedEvent;

typedef struct {
	int type;	/* MotionNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;	/* ``event'' window reported relative to */
	Window root;	/* root window that the event occurred on */
	Window subwindow;	/* child window */
	Time time;	/* milliseconds */
	int x, y;	/* pointer x, y coordinates in event window */
	int x_root, y_root;	/* coordinates relative to root */
	unsigned int state;	/* key or button mask */
	char is_hint;	/* detail */
	Bool same_screen;	/* same screen flag */
} XMotionEvent;
typedef XMotionEvent XPointerMovedEvent;

これらの構造体は、以下の共通のメンバーを持つ: window、root、subwindow、time、x、y、x_root、y_root、state、そして same_screen。 window メンバーは、イベントが発生させられた窓に設定されて、イベントウインドウとして参照される。 以前、説明した条件に合致する限り、 これはイベントを通知するために X サーバーによって使われるウインドウだ。 root メンバーは、元のウインドウのルートウインドウに設定される。 x_rootメンバーと y_root メンバーはイベントが起きた時のルートウインドウの原点に対するポインターの相対座標が設定される。

same_screen メンバーはイベントウインドウがルートウインドウと同じスクリーン上にあるかどうかを示すために設定され、 True あるいは Falseに設定される。 もし Trueならば、イベントウインドウとルートウインドウは同じスクリーン上にある。 もし Falseならば、イベントウインドウとルートウインドウは異なるスクリーン上にある。

もしイベント発生源のウインドウがイベントウインドウの下位階層のウインドウなら、 構造体の subwindow メンバーはイベントウインドウの子であるイベント発生源のウイ ンドウ、あるいはイベントウインドウの子であるイベント発生源のウインドウの上位 階層ウインドウに設定される。 そうでないときは、Xサーバーは、subwindow メンバーに Noneを設定する。 time メンバーはイベントが発生した時の時間に設定され、ミリ秒単位で表現される。

もし、イベントウインドウがルートウインドウと同じスクリーン上にあるならば、 x と y メンバーはイベントウインドウの原点に対する相対座標が設定される。 そうでなければ、これらのメンバーは zero に設定される。

state メンバーはそのイベントの直前のポインターボタンと修飾キーの論理的な状態を示すように設定され、以下のボタンあるいは修飾キーマスクのビット論理和である: Button1MaskButton2MaskButton3MaskButton4MaskButton5MaskShiftMaskLockMaskControlMaskMod1MaskMod2MaskMod3MaskMod4Mask 、そして Mod5Mask

これらの構造体のいくつかは詳細を示すメンバーがある。 XKeyPressedEventXKeyReleasedEventでは、このメンバーは keycode と呼ばれる。 それはキーボードの物理的なキーを表す数値が設定される。 keycode は、キーボードのどんなキーのための任意の表現だ(セクション 12.7 と 16.1 を見よ)。

XButtonPressedEventXButtonReleasedEvent構造体では、このメンバーは button と呼ばれる。 それはポインターボタンの状態変化を表し Button1Button2Button3Button4 、あるいは Button5 の値となる。 XPointerMovedEventでは、このメンバーは is_hint と呼ばれる。 それは、 NotifyNormalあるいは NotifyHintが設定される。

このセクションで述べられたシンボルの内いくつかは修正された値を持つ、以下のように:

Symbol Value
Button1MotionMask (1L<<8)
Button2MotionMask (1L<<9)
Button3MotionMask (1L<<10)
Button4MotionMask (1L<<11)
Button5MotionMask (1L<<12)
Button1Mask (1<<8)
Button2Mask (1<<9)
Button3Mask (1<<10)
Button4Mask (1<<11)
Button5Mask (1<<12)
ShiftMask (1<<0)
LockMask (1<<1)
ControlMask (1<<2)
Mod1Mask (1<<3)
Mod2Mask (1<<4)
Mod3Mask (1<<5)
Mod4Mask (1<<6)
Mod5Mask (1<<7)
Button1 1
Button2 2
Button3 3
Button4 4
Button5 5

Window Entry/Exit Events

このセクションはウインドウクロッシングイベント EnterNotifyLeaveNotifyについて述べる。 ポインタの移動やウィンドウの階層構造の変化によって、ポインタが以前と 違うウィンドウにある状態になった場合、X サーバは EnterNotify または LeafNotify のイベントをこれらのイベントを受けとるように選択している (複数の)クライアントに送る。 階層構造の変化によって引き起こされたすべての EnterNotifyLeaveNotifyイベントはその変化によって何らかのヒエラルキーイベント (UnmapNotify ,MapNotify ,ConfigureNotify ,GravityNotify ,CirculateNotify )を引き起こした後に発生させられる; しかしながら、X プロトコルは EnterNotifyイベントや LeaveNotifyイベントに関して発生させられた FocusOutVisibilityNotifyExposeイベントの順序は強制しない。

これは MotionNotifyイベントとは対照的だ。 MotionNotifyイベントもまたポインタの移動によって発生しするが、ポインタの移動が 同一のウィンドウ内で始まって終わっている場合に限られる。

EnterNotifyあるいは LeaveNotifyイベントはあるクライアントアプリケーションが XGrabPointerXUngrabPointerを呼ぶ時は必ず発生させられる。 EnterNotifyLeaveNotifyを受け取るには、ウインドウのイベントマスク属性の EnterWindowMaskLeaveWindowMaskビットを設定する。

これらのイベント型(type)のための構造体は以下を含む:

typedef struct {
	int type;	/* EnterNotify or LeaveNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;	/* ``event'' window reported relative to */
	Window root;	/* root window that the event occurred on */
	Window subwindow;	/* child window */
	Time time;	/* milliseconds */
	int x, y;	/* pointer x, y coordinates in event window */
	int x_root, y_root;	/* coordinates relative to root */
	int mode;	/* NotifyNormal, NotifyGrab, NotifyUngrab */
	int detail;
		/*
	 	* NotifyAncestor, NotifyVirtual, NotifyInferior, 
	 	* NotifyNonlinear,NotifyNonlinearVirtual
	 	*/
	Bool same_screen;	/* same screen flag */
	Bool focus;	/* boolean focus */
	unsigned int state;	/* key or button mask */
} XCrossingEvent;
typedef XCrossingEvent XEnterWindowEvent;
typedef XCrossingEvent XLeaveWindowEvent;

window メンバーは、 EnterNotifyあるいは LeaveNotifyイベントが発生したウインドウに設定され、イベントウインドウとして参照される。 これは、X サーバーがイベントを通知するために使うウインドウで、イベントが起こったルートウインドウに関係している。 root メンバーはイベントか起きたスクリーンのルートウインドウが設定される。

LeaveNotify イベントでは、イベントウインドウの子ウインドウにポインターの初期位置が 含まれているなら、subwindow メンバはその子ウインドウに設定される。 そうでないなら、X サーバーは subwindow メンバーに None を設定する。 EnterNotify イベントでは、イベントウインドウの子にポインターの最終位置が含まれているのなら、subwindow メンバーはその子ウインドウに設定され、そうでないなら None に設定される。

time メンバーはイベントが発生した時の時間が設定され、ミリ秒単位で表される。 x と y メンバーはイベントウインドウ内でのポインター位置の座標に設定される。 この位置は常にポインターの最終位置であり、初期位置ではない。 イベントウインドウがルートウインドウを同じスクリーン上にあるなら、x と y はポインター座標であり、イベントウインドウの原点に対する相対座標に設定される。 そうでないなら、x と y は zero に設定される。 x_root と y_root メンバーはイベントが起きた時のルートウインドウの原点に対する相対座標に設定される。

same_screen メンバーはイベントウインドウとルートウインドウが同じスクリーン上にあるかどうかを示し、 True あるいは False に設定される。 True ならばイベントウインドウとルートウインドウは同じスクリーン上にある。 False ならばイベントウインドウとルートウインドウは異なるスクリーン上にある。 focus メンバーはイベントウインドウがフォーカスウインドウあるいはフォーカスウインドウの下位階層ウインドウであるかどうかを示す。 X サーバーはこのメンバーに True あるいは False を設定する。 True なら、イベントウインドウはフォーカスウインドウあるいはその下位階層ウインドウだ。 False なら、イベントウインドウはフォーカスウインドウあるいはその下位階層ウインドウではない。

state メンバーはそのイベントの直前のポインターボタンとモディファイアーキーの状態が設定される。 X サーバーはこのメンバーに以下のボタンあるいはモディファイアーキーマスクのビット論理和を設定する: Button1MaskButton2MaskButton3MaskButton4MaskButton5MaskShiftMaskLockMaskControlMaskMod1MaskMod2MaskMod3MaskMod4MaskMod5Mask

mode メンバーは、イベントが通常イベント、 グラブが有効になった時の疑似移動(pseudo-motion)イベント、 グラブが無効になった時の疑似移動(pseudo-motion)イベントのどれなのかを 示すように設定される。 X サーバーはこのメンバーに NotifyNormalNotifyGrabNotifyUngrab のどれかを設定する。

detail メンバーは通知の詳細を示し NotifyAncestorNotifyVirtualNotifyInferiorNotifyNonlinearNotifyNonlinearVirtual のどれかが設定される。

Normal Entry/Exit Events

ポインターが1つの窓からほかの窓へ動くときに、 EnterNotifyおよび LeaveNotifyイベントは、発生させられる。 通常の(Normal)イベントは XEnterWindowEventあるいは XLeaveWindowEvent構造体の mode メンバーに NotifyNormal が設定されている事で判別できる。

Grab and Ungrab Entry/Exit Events

疑似移動(pseudo-motion)モードの EnterNotifyLeaveNotifyはポインターグラブがアクティブ化あるいはデアクティブ化する時に発生する。 ポインターグラブがアクティブ化する場合のイベントは XEnterWindowEventあるいは XLeaveWindowEvent構造体の mode メンバーに NotifyGrabが設定されている事によって判別できる。 ポインターグラブがデアクティブ化する場合のイベントは XEnterWindowEventあるいは XLeaveWindowEvent構造体の mode メンバーに NotifyUngrab(see XGrabPointer )が設定されている事によって判別できる。

Input Focus Events

このセクションは入力フォーカスイベント FocusInFocusOutについて述べる。 X サーバーは入力フォーカスが変わった時にクライアントがその情報を要求しているならば FocusInイベントや FocusOutイベントを通知する。 キーボードは、フォーカスウインドウと呼ばれるあるウインドウ (ふつう、ルートウインドウや最上位のウインドウ)に常についている。 フォーカスウインドウとポインターの位置は、キーボード入力を受け取る ウインドウを決める。 クライアントは、入力フォーカスがスクリーン上の領域の強調表示を 変える時を知っている必要があるかも知れない。

FocusInイベントや FocusOutイベントを受け取るには、 ウインドウのイベントマスク属性の FocusChangeMaskビットを設定する。

それらのイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* FocusIn or FocusOut */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;	/* window of event */
	int mode;	/* NotifyNormal, NotifyGrab, NotifyUngrab */
	int detail;
		/*
	 	* NotifyAncestor, NotifyVirtual, NotifyInferior, 
	 	* NotifyNonlinear,NotifyNonlinearVirtual,
		* NotifyPointer, NotifyPointerRoot,
		* NotifyDetailNone 
	 	*/
} XFocusChangeEvent;
typedef XFocusChangeEvent XFocusInEvent;
typedef XFocusChangeEvent XFocusOutEvent;

window メンバーは FocusInイベントや FocusOutイベントを発生させたウインドウに設定される。 これは X サーバーによってイベントを通知するために使われるウインドウだ。 mode メンバーはフォーカスイベントが、普通のフォーカスイベント、 グラブ中のフォーカスイベント、 グラブがアクティブ化する時のフォーカスイベント、 グラブがデアクティブ化する時のフォーカスイベント のどれかを示すように設定される。 X サーバーは mode メンバーに NotifyNormalNotifyWhileGrabbedNotifyGrabNotifyUngrabのいずれかを設定する。

ウインドウのアンマップ(unmap)によって引き起こされるすべての FocusOutイベントは、何らかの UnmapNotifyイベントの後に発生する。しかしながら、 X プロトコルは FocusOutイベントに関して発生させられた EnterNotifyLeaveNotifyVisibilityNotifyExposeイベントの順序は強制しない。

イベントモードに応じて、 detail メンバーは通知の詳細を示し、 NotifyAncestorNotifyVirtualNotifyInferiorNotifyNonlinearNotifyNonlinearVirtualNotifyPointerNotifyPointerRootNotifyDetailNoneのどれかが設定される。

Normal Focus Events and Focus Events While Grabbed

通常のフォーカスイベントは XFocusInEvent構造体や XFocusOutEvent構造体の mode メンバーに NotifyNormalが設定されている事で判別できる。 グラブ中のフォーカスイベントは XFocusInEvent構造体や XFocusOutEvent構造体の mode メンバーに NotifyWhileGrabbedが設定されている事で判別できる。 X サーバーは通常のフォーカスとグラブ中のフォーカスを下記のように処理する:

Focus Events Generated by Grabs

フォーカスイベントがキーボードグラブのアクティブ化による物かどうかは XFocusInEvent構造体や XFocusOutEvent構造体の mode メンバーに XFocusOutEventが設定されている事によって判別できる。 フォーカスイベントがキーボードグラブのデアクティブ化による物かどうかは XFocusInEvent構造体や XFocusOutEvent構造体の mode メンバーに NotifyUngrab( XGrabKeyboardを見よ) が設定されている事によって判別できる。

Key Map State Notification Events

X サーバーは、自身のキーボードの状態の変化の情報を要求するクライアントに KeymapNotifyイベントを通知する。

イベントを受け取るには、 ウインドウのイベントマスク属性の KeymapStateMaskビットを設定する。 X サーバーは EnterNotifyイベントと FocusInイベントの後で、すぐにこのイベントを発生させる。

このイベントのための構造体を以下に示す: KeymapNotify

/* generated on EnterWindow and FocusIn when KeymapState selected */
typedef struct {
	int type;	/* KeymapNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;
	char key_vector[32];
} XKeymapEvent;	

window メンバーは使用されないがいくつかのツールキットの助けになるように 提供される。 key_vector メンバーはキーボードのビットベクトルに設定される。 あるビットに 1 が設定されていると、対応するキーが現在押されている事を示す。 ベクトルは 32 バイトで表現される。 バイト N(0から始まる)は、キー 8N から 8N+7 に対応するビットを持つ。 このバイトの最下位ビットがキー 8N に対応する。

Exposure Events

X プロトコルは、ウインドウが隠蔽(obscure)あるいは最構成(reconfigure) された時に、ウインドウの内容をあらかじめ保存する事を保証しない。 いくつかの実装はウインドウの内容をあらかじめ保存するかも知れない。 他の実装は、ウインドウが露出(expose)された時にウインドウの内容を自由に 破壊できる。 X は露出(expose)されたウインドウの領域の内容を復元する責任を仮定する クライアントアプリケーションを求める。 (ウインドウの領域が露出(expose)されると言う事は、可視(visible)になる 前の領域が以前に隠蔽(obscure)されたウインドウであると言う事だ。) そのため、X サーバーは、ウインドウとウインドウの領域が露出(expose) されたと言う事を知らせる Expose イベントを送る。 単純なクライアントアプリケーションは、通常全体のウインドウを描き直す。 より洗練されたクライアントアプリケーションは、単に露出(expose) された領域を描き直す。

Expose Events

X サーバーは、ウインドウの内容が失われた時にその情報を要求するクライアントに Exposeイベントを通知する。 X サーバーが Exposeイベントを発生させる状況は他のイベントほどはっきりと決まってはいない。 しかしながら、X サーバーは あなたが InputOnlyと指定したクラスのウインドウでは決して Exposeイベントを発生させない。 X サーバーは、有効でない内容がウインドウの領域に存在し、 領域が可視(visible)、 領域が表示可能(viewable)でサーバーがウインドウのバッキングストアを 維持している、 あるいは、ウインドウは表示可能(viewable)ではないがサーバーが ウインドウの AlwaysWhenMappedに設定されているバッキングストア属性を(多分、近頃)受け付けている、のいずれかであるならば Exposeイベントを発生する。 領域はレクタングル(長方形)の(任意の)集まりに分解され、 そしてそれぞれのレクタングル(長方形)のために Exposeイベントが発生される。 如何なるウインドウにも、 ウインドウをレイズ(raise)するなどの Expose イベントを引き起こす何らかの活動によって 露出(expose)されるすべての領域を 直ちに通知する事を X サーバは保証する。

Exposeイベントを受け取るには、 ウインドウのイベントマスク属性の ExposureMaskビットを設定する。

それらのイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* Expose */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;
	int x, y;
	int width, height;
	int count;	/* if nonzero, at least this many more */
} XExposeEvent;

window メンバーは露出(expose)(損傷(damege))したウインドウが設定される。 x と y メンバーはウインドウの原点に対する相対座標が設定され、 レクタングル(長方形)の左上角を示す。 width と height メンバーはレクタングル(長方形)のサイズ(広さ)が設定される。 count メンバーは、後に続く Exposeイベントの数が設定される。 count がゼロならば、このウィンドウに対する Exposeイベントは続かない。 しかし、count がゼロでなければ、最低この数(それ以上のこともある)の Exposeイベントがこのウィンドウに対して続く。 そのウインドウのサブエリアを区別する事で再描画を最適化したくない 単純なアプリケーションは、 count がゼロではないすべての Exposeイベントを単に無視し、 count がゼロの Exposeイベントで完全な再描画を行なう事が出来る。

GraphicsExpose and NoExpose Events

X サーバーは、ディスティネーション領域がグラフィックスリクエスト: XCopyAreaXCopyPlaneのいずれかの間に算定出来ない時にクライアントがその情報を要求しているならば GraphicsExposeイベントを通知する。 X サーバーは、ディスティネーション領域が 隠蔽(obscure)されているかソース領域の境界の外にあるために 計算できない時は、必ずこのイベントを発生させる。 さらに、X サーバはなんらかのグラフィックスリクエスト (たとえば、あるドロワブル(drawable)のエリアを ディスティネーションのドロワブル(drawable)にコピーする) によって露出(expose)されたすべての領域を直ちに報告する事を保証する。

X サーバーは、 GraphicsExposeをつくり出すかも知れない グラフィックスリクエストが何も生み出さない時はいつでも NoExposeイベントを発生する。 言い替えれば、 クライアントは本当は GraphicsExposeを求めているが、 代わりに NoExposeイベントを受け取る。

GraphicsExposeNoExposeを受け取るには、 最初にグラフィックスコンテクストの graphics-exposure 属性を Trueに設定しなければならない。 あなたは XCreateGC を使ってグラフィックスコンテクストをつくり出す時に、 あるいは XSetGraphicsExposuresを呼ぶ事によって graphics-expose 属性を設定できる。

これらのイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* GraphicsExpose */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Drawable drawable;
	int x, y;
	int width, height;
	int count;	/* if nonzero, at least this many more */
	int major_code;	/* core is CopyArea or CopyPlane */
	int minor_code;	/* not defined in the core */
} XGraphicsExposeEvent;

typedef struct {
	int type;	/* NoExpose */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Drawable drawable;
	int major_code;	/* core is CopyArea or CopyPlane */
	int minor_code;	/* not defined in the core */
} XNoExposeEvent;

どちらの構造体も共通のメンバーを drawable、major_code、minor_code を持つ。 drawable メンバーはグラフィックスリクエストが実行されるはずだったディスティネーション領域のドロワブル(drawable)が設定される。 クライアントが起こしたグラフィックスリクエストが設定され、 X_CopyAreaX_CopyPlaneのいずれかである。 X_CopyAreaの場合は、 .ZN XCopyPlane がこのリクエストを起こした。 X_CopyPlaneの場合は XCopyPlaneがこのリクエストを起こした。 これらの定数は <X11/Xproto.h>で定義されている。 minor_code メンバーは、major_code のように、 どのグラフィックスリクエストがクライアントによって始められたのかを示す しかしながら、この minor_code メンバーはコア X プロトコルでは定義されていないのでこのような場合はゼロに設定されるだろうが、このメンバーは拡張によって使われるかも知れない。

XGraphicsExposeEvent構造体は次の追加メンバーを持っている:x、y、wicth、height、count。 ドロワブル(drawable)の原点に対する相対座標に設定され、レクタングル (長方形)の左上角を示す。 width と height メンバーはレクタングル(長方形)のサイズ((広さ)が設定される。 count メンバーは、後に続く GraphicsExposeイベントの数が設定される。 count がゼロならば、このウィンドウに対する GraphicsExposeイベントは続かない。 しかし、count がゼロでなければ、最低この数(それ以上のこともある)の GraphicsExposeイベントがこのウィンドウに対して続く。

Window State Change Events

The following sections discuss:

CirculateNotify Events

X サーバーは、ウインドウがスタックの中でその位置を変える時の 情報を要求するクライアントに CirculateNotifyイベントを通知する。 X サーバーは、クライアントアプリケーションが XCirculateSubwindowsXCirculateSubwindowsUpXCirculateSubwindowsDown のいずれかを呼び出した結果、ウインドウが実際に再スタックされる時は いつもこのイベント型(type)を発生する。

CirculateNotifyイベントを受け取るには、 ウインドウの event-mask 属性の StructureNotifyMaskビットを設定する、あるいはその親ウインドウの event-mask 属性の SubstructureNotifyMaskビットを設定する。 (このばあい、循環(circulate)させる何らかの子ウインドウがイベントが発生する)。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* CirculateNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window event;
	Window window;
	int place;	/* PlaceOnTop, PlaceOnBottom */
} XCirculateEvent;

event メンバーは、 StructureNotifySubstructureNotifyのどちらを選択したかに応じて、再スタックされたウインドウかその親ウインドウのいずれかが設定される。 window メンバーは再スタックされたウインドウに設定される。 place メンバーは再スタック後のウインドウの位置が設定され、 PlaceOnTopPlaceOnBottomのいずれかだ。 それが PlaceOnTopならば、そのウインドウはいますべての兄弟ウインドウの上にある。 それが PlaceOnBottomならば、そのウインドウはいますべての兄弟ウインドウの下にある。

ConfigureNotify Events

X サーバーは、ウインドウの状態(サイズ、位置、ボーダー、 スタッッキングオーダーなどの)の実際の変化についての情報を要求するクライアントに ConfigureNotifyイベントを通知する。

ConfigureNotifyイベントを受け取るには、 ウインドウの event-mask 属性の StructureNotifyMaskビットを設定する、あるいはその親ウインドウの event-mask 属性の SubstructureNotifyMaskビットを設定する。 (このばあい、構成(configure)される何らかの子ウインドウがイベントが発生する)。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* ConfigureNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window event;
	Window window;
	int x, y;
	int width, height;
	int border_width;
	Window above;
	Bool override_redirect;
} XConfigureEvent;

event メンバーは、 StructureNotifySubstructureNotifyのいずれが選択されているかによって、再構築されたウインドウか その親ウインドウのどちらかに設定される。 window メンバーは、サイズ、位置、ボーダー、スタッッキングオーダーが 変更されたウインドウが設定される。

x と y メンバーは親ウインドウの原点に対する相対座標が設定され、 ウインドウの左上角の外側の位置を示す。 width と height メンバーはウインドウの内側の大きさが設定される、 ボーダーは含まれない。 border_width メンバーはウインドウのボーダーの幅が設定される、 ピクセル値だ。

above メンバーは兄弟ウインドウが設定され、 スタッッキング操作に使われる。 X サーバーがこのメンバーに Noneを設定したなら、 状態が変更されたそのウインドウは兄弟ウインドウ(達)のスタックの底にある。 しかし、このメンバーに兄弟ウインドウを設定するなら、 状態が変更されたそのウインドウはこの兄弟ウインドウの上に置かれる。

override_redirect メンバーはウインドウの override-redirect 属性に設定される。 ウインドウマネージャークライアントは、override_redirect メンバーが Trueであるこのウインドウを、通常無視するべきだ。

CreateNotify Events

X サーバーはウインドウの作成(create)についての情報を要求するクライアントに CreateNotifyイベントを通知する。 X サーバーは、クライアントアプリケーションが XCreateWindowXCreateSimpleWindowのいずれかを呼ぶ事でウインドウを作成(create)する時は必ずこの イベントを発生する。

CreateNotifyイベントを受け取るには、 ウインドウの event-mask 属性の SubstructureNotifyMaskビットを設定する。 何らかの子ウインドウをつくり出すと、イベントを発生させる。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* CreateNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window parent;	/* parent of the window */
	Window window;	/* window id of window created */
	int x, y;	/* window location */
	int width, height;	/* size of window */
	int border_width;	/* border width */
	Bool override_redirect;	/* creation should be overridden */
} XCreateWindowEvent;

parent メンバーは作成されたウインドウの親ウインドウに設定される。 window メンバーは作成されたウインドウに設定される。 x と y メンバーは作成されたウインドウのその親ウインドウの原点に対する 相対の座標が設定され、作成されたウインドウの左上角の外側の位置を示す。 width と height メンバーは作成されたウインドウの内側の大きさ (ボーダーを含まない)が設定され、必ずゼロ以外の値だ。 border_width メンバーは作成されたウインドウのボーダーの幅が設定され、 ピクセル値だ。 override_redirect メンバーはウインドウの override-redirect 属性に設定される。 ウインドウマネージャークライアントは、override_redirect メンバーが Trueであるこのウインドウを、通常無視するべきだ。

DestroyNotify Events

X サーバーはウインドウが破棄(destoroy)されると言う情報を要求するクライアントに DestroyNotifyイベントを通知する。 X サーバーは、クライアントアプリケーションが XDestroyWindowXDestroySubwindowsのいずれかを呼ぶ事でウインドウを破棄(destoroy)する時は必ず このイベントを発生する。

どんなウインドウにも、 DestroyNotifyイベントの順序は、 それ自身のウインドウで DestroyNotifyが発生させられる前にウインドウのすべての下位階層ウインドウで発生させられる。 X プロトコルは、兄弟ウインドウ間そしてサブ階層を跨って、順序を強制しない。

DestroyNotifyイベントを受け取るには、 ウインドウの event-mask 属性の StructureNotifyMaskビットを設定する、あるいはその親ウインドウの event-mask 属性の SubstructureNotifyMaskビットを設定する。 (このばあい、破棄(destoroy)される何らかの子ウインドウがイベントが発生する)。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* DestroyNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window event;
	Window window;
} XDestroyWindowEvent;

event メンバーは、 StructureNotifySubstructureNotifyのいずれが選択されているかによって、再構築されるウインドウか その親ウインドウのどちらかに設定される。 window メンバーは、破棄(destoroy)されたウインドウが設定される。

GravityNotify Events

X サーバーは、ウインドウがその親ウインドウのサイズが変わったために ウインドウが動かされると言う情報を要求するクライアントに GravityNotifyイベントを通知する。 X サーバーは、クライアントアプリケーションが XConfigureWindowXMoveResizeWindowXResizeWindowのいずれかを呼ぶ事でその親ウインドウのリサイズの結果として 子ウインドウが実際に動く時は必ずこのイベントを発生する。

GravityNotifyイベントを受け取るには、 ウインドウの event-mask 属性の StructureNotifyMaskビットを設定する、あるいはその親ウインドウの event-mask 属性の SubstructureNotifyMaskビットを設定する。 (このばあい、何らかの子ウインドウが、その親ウインドウがリサイズさ れるために移動されると、イベントが発生する)。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* GravityNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window event;
	Window window;
	int x, y;
} XGravityEvent;

event メンバーは、 StructureNotifySubstructureNotifyのいずれが選択されているかによって、移動されるウインドウか その親ウインドウのどちらかに設定される。 window メンバーは、移動されたウインドウが設定される。 x と y メンバーは親ウインドウの原点に対する相対座標が設定され、 ウインドウの左上角の外側の位置を示す。

MapNotify Events

X サーバーは、ウインドウがマップされたと言う情報を要求するクライアントに MapNotifyイベントを通知する。 X サーバーは、クライアントアプリケーションが XMapWindowXMapRaisedXMapSubwindowsXReparentWindowのいずれかを呼ぶ事で、あるいはセーブセットの処理の結果として ウインドウの状態をアンマップ(unmap)からマップ(map)へ変更する 時は必ずこのイベント型(type)を発生する。

MapNotifyイベントを受け取るには、 ウインドウの event-mask 属性の StructureNotifyMaskビットを設定する、あるいはその親ウインドウの event-mask 属性の SubstructureNotifyMaskビットを設定する。 (このばあい、マップ(map)される何らかの子ウインドウがイベントが発生する)。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* MapNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window event;
	Window window;
	Bool override_redirect;	/* boolean, is override set... */
} XMapEvent;

event メンバーは、 StructureNotifySubstructureNotifyのいずれが選択されているかによって、マップ(map)されたウインドウか その親ウインドウのどちらかに設定される。 window メンバーは、マップ(map)されたウインドウに設定される。 override_redirect メンバーはウインドウの override-redirect 属性に設定される。 ウインドウマネージャークライアントは、override_redirect メンバーが Trueであるこのウインドウを、通常無視するべきだ、 because these events usually are generated from pop-ups, which override structure control.

MappingNotify Events

X サーバーはすべてのクライアントに MappingNotifyイベントを通知する。 このイベントの通知を拒否する方法はない。 X サーバーはクライアントアプリケーションが以下の呼出しに成功した時は必ず このイベント型(type)を発生する:

XSetPointerMappingは、ポインターマッピングを変更する。

typedef struct {
	int type;	/* MappingNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;	/* unused */
	int request;	/* one of MappingModifier, MappingKeyboard,
		   MappingPointer */
	int first_keycode;	/* first keycode */
	int count;	/* defines range of change w. first_keycode*/
} XMappingEvent;

request メンバーは、どのマッピング変更が起こったかが設定され、 MappingModifierMappingKeyboardMappingPointerのいずれかである。 MappingModifierならば、モディファイア(modifier)マッピングが変更された。 MappingKeyboardならば、キーボードマッピングが変更された。 MappingPointerならば、ポインターボタンマッピングが変更された。 first_keycode と count メンバーは、 request メンバーが MappingKeyboardに設定された場合にのみ、設定される。 first_keycode の数は、変更されたマッピングの範囲の最初の数を表す。

クライアントアプリケーションのキーボードの情報を更新するために、 あなたは XRefreshKeyboardMappingを呼ぶべきだ。

ReparentNotify Events

X サーバーは、ウインドウの親ウインドウが変わったと言う情報を要求する クライアントに ReparentNotifyイベントを通知する。 X サーバーは、クライアントアプリケーションが XReparentWindow を呼び、実際にウインドウの親が変わる(reparent)時は必ずこのイベントを発生する。

ReparentNotifyイベントを受け取るには、 ウインドウの event-mask 属性の StructureNotifyMaskビットを設定する、あるいはその新旧いずれかの親ウインドウの event-mask 属性の SubstructureNotifyMaskビットを設定する。 (このばあい、親ウインドウが変更される(reparent)何らかの子ウインドウが イベントが発生する)。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* ReparentNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window event;
	Window window;
	Window parent;
	int x, y;
	Bool override_redirect;
} XReparentEvent;

event メンバーは、 StructureNotifySubstructureNotifyのいずれが選択されているかによって、ウインドウか その新旧いずれかの親ウインドウに設定される。 window メンバーは、親ウインドウが変更された(reparent)ウインドウに設定される。 parent メンバーは、新しい親ウインドウが設定される。 x と y メンバーは新しい親ウインドウの原点に対する相対座標が設定され、 ウインドウの左上角の外側の位置を示す。 override_redirect メンバーは window メンバーによって示されるウインドウの override-redirect 属性に設定される。 True .ウインドウマネージャークライアントは、override_redirect メンバーが Trueであるこのウインドウを、通常無視するべきだ。

UnmapNotify Events

X サーバーは、ウインドウがアンマップ(unmap)されたと言う情報を要求する クライアントに UnmapNotifyイベントを通知する。 X サーバーは、ウインドウの状態がマップ(map)からアンマップ(unmap)に 変化する時は必ずこのイベント型(type)を発生する。

UnmapNotifyイベントを受け取るには、 ウインドウの event-mask 属性の StructureNotifyMaskビットを設定する、あるいはその親ウインドウの event-mask 属性の SubstructureNotifyMaskビットを設定する。 (このばあい、アンマップ(unmap)される何らかの子ウインドウが イベントが発生する)。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* UnmapNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window event;
	Window window;
	Bool from_configure;
} XUnmapEvent;

event メンバーは、 StructureNotifySubstructureNotifyのいずれが選択されているかによって、アンマップ(unmap)されたウインドウか その親ウインドウのどちらかに設定される。 これは、X サーバーがイベントを通知するのに使われるウインドウだ。 window メンバーは、アンマップ(unmap)されたウインドウに設定される。 from_configure メンバーは、そのウィンドウ自身が .ZN UnmapGravity の win_gravity を持ち、イベントがウィンドウの親のリサイズ(resize)の結果として 発生されたならば、 .ZN True がセットされる。

VisibilityNotify Events

X サーバーは、指定されたウインドウの可視度(visibility)の何らかの変化に 関する情報を要求するクライアントに VisibilityNotifyイベントを通知する。 ウインドウの領域は、スクリーン上で実際に見る事が出来るのならば、 可視(visible)だ。 X サーバーは、可視度(visibility)が変化する時は必ずこのイベントを発生する。 しかしながら、このイベントはクラスが InputOnlyのウインドウには絶対に発生させられない。

階層構造の変化によるすべての VisibilityNotifyイベントは、その変化によって起こる階層構造イベント (UnmapNotifyMapNotifyConfigureNotifyGravityNotifyCirculateNotify )の後で発生する。 如何なるウインドウでの何らかの VisibilityNotifyイベントはウインドウ上での Expose イベントの前に発生させられる、しかしそれはすべてのウインドウでのすべての VisibilityNotifyイベントが、すべてのウインドウでのすべての Exposeイベントの前に発生させられる事を必要としない。 X プロトコルには、 FocusOutEnterNotifyLeaveNotifyイベントに対する VisibilityNotifyイベントの順序は含まれていない。

VisibilityNotifyイベントを受け取るには、 ウインドウの event-mask 属性の VisibilityChangeMaskビットを設定する。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* VisibilityNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;
	int state;
} XVisibilityEvent;

window メンバーは可視度(visibility)の状態が変化したウインドウが設定される。 state メンバーはウインドウの可視度(visibility)が設定され、 VisibilityUnobscuredVisibilityPartiallyObscuredVisibilityFullyObscuredのいずれかだ。 X サーバーは、ウインドウの可視度(visibility)を決める時と下記の物による VisibilityNotifyイベントの処理の時に、ウインドウのすべてのサブウインドウを無視する:

Structure Control Events

This section discusses:

CirculateRequest Events

X サーバーは、 他のクライアントが指定したウインドウでウインドウ循環(circulate) リクエストを起こす時にその情報を要求しているクライアントに CirculateRequestイベントを通知する。 X サーバーは、クライアントがウインドウとサブウインドウで 実際に再スタック(restack)する必要がある ウインドウ循環(circulate)リクエストを起こす時は必ず このイベント型(type)を発生する。 クライアントが、 XCirculateSubwindowsXCirculateSubwindowsUpXCirculateSubwindowsDownのいずれかを呼ぶ事でウインドウにウインドウ循環(circulate)リクエストを起こす。

CirculateRequestイベントを受け取るには、 ウインドウのイベントマスク属性の SubstructureRedirectMaskビットを設定する。 それから将来、 特定のウインドウでのウインドウ循環(circulate)リクエストは実行されない、 そして、このようにスタックの中の何らかのサブウインドウの位置は変更されない。 例えば、クライアントアプリケーションがサブウインドウをスタックの トップに上げるために XCirculateSubwindowsUpを呼ぶのを想像せよ。 あなたが SubstructureRedirectMaskを選択したウインドウを持っていると、 X サーバーはあなたにイベントを通知し、サブウインドウをスタックの トップに上げない。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* CirculateRequest */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window parent;
	Window window;
	int place;	/* PlaceOnTop, PlaceOnBottom */
} XCirculateRequestEvent;

parent メンバーは親ウインドウに設定される。 window メンバーは再スタックされたサブウインドウに設定される。 place メンバーはスタッッキングオーダーにおける新しい位置が設定され、 PlaceOnTopPlaceOnBottomのいずれかだ。 PlaceOnTopならば、サブウインドウはすべての兄弟ウインドウの上にあるべきだ。 PlaceOnBottomならば、サブウインドウはすべての兄弟ウインドウの下にあるべきだ。

ConfigureRequest Events

X サーバーは、異なるクライアントが特定のウインドウの何らかの子ウインドウ でウインドウ構築(configure)リクエストを起こす時にその情報を要求する クライアントに ConfigureRequestイベントを通知する。 ウインドウ構築(configure)リクエストは、ウインドウのサイズ、位置、 ボーダー、スタッッキングオーダーの再構築(reconfigure)を試みます。 X サーバーは、異なるクライアントが XConfigureWindowXLowerWindowXRaiseWindowXMapRaisedXMoveResizeWindowXMoveWindowXResizeWindowXRestackWindowsXSetWindowBorderWidthを呼ぶ事でウインドウ上でウインドウ構築リクエストを 起こす時は必ずこのイベントを発生する。

ConfigureRequestイベントを受け取るには、 ウインドウの event-mask 属性の SubstructureRedirectMaskビットを設定する。 ConfigureRequestイベントは、別のクライアントによって子ウインドウ上で ConfigureWindowプロトコルリクエストが出された時に発生する。 例えば、クライアントアプリケーションがウインドウを下げる XLowerWindowを呼ぶのを想像せよ。 あなたが SubstructureRedirectMaskを選択したウインドウを持ち そのウインドウの override-redirect 属性に Falseが設定されているならば、X サーバーはあなたに ConfigureRequestイベントを通知し、指定されたウインドウを下げない。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* ConfigureRequest */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window parent;
	Window window;
	int x, y;
	int width, height;
	int border_width;
	Window above;
	int detail;	/* Above, Below, TopIf, BottomIf, Opposite */
	unsigned long value_mask;
} XConfigureRequestEvent;

parent メンバーは親ウインドウに設定される。 window メンバーは、サイズ、位置、ボーダー幅、スタッッキングオーダーが 再構築(reconfigure)されたウインドウが設定される。 value_mask メンバーは、 ConfigureWindow プロトコルリクエストがどのメンバーを指定するのかを表す 対応する値はリクエストで与えられている物が通知される。 それらがリクエストで与えられないならば、 NoneAboveが通知される above(兄弟ウインドウ)と detail(スタックモード)の場合を除き、 残りの値は、現在のウインドウのジオメトリ(geometry)より与えられる。

MapRequest Events

X サーバーは、異なるクライアントがウインドウをマップ(map)しようとしている と言う情報を要求するクライアントに MapRequestイベントを通知する。 ウインドウは、ウインドウマップ(map)リクエストが完了した時、 マップ(map)されたと言える。 X サーバーは、異なるクライアントが Falseが設定されている override_redirect メンバーを持つアンマップ(unmap) ウインドウ上でウインドウマップ(map)リクエストを起こした時は必ず このイベントを発生する。 クライアントは XMapWindowXMapRaisedXMapSubwindowsのいずれかを呼ぶ事でウインドウマップ(map)リクエストを起こす。

MapRequestイベントを受け取るには、ウインドウの event-mask 属性の SubstructureRedirectMaskビットを設定する。 この方法で、他のクライアントがウインドウマップ(map)リクエスト機能を呼ぶ事で 子ウインドウをマップ(map)する試みを中断させ、あなたが代わりに MapRequestを送れる。 例えば、クライアントアプリケーションがウインドウをマップ(map)するために XMapWindowを呼ぶのを想像せよ。 あなたが(普通ウインドウマネージャ)親ウインドウで SubstructureRedirectMask を選択していて、そのウインドウの override-redirect 属性に Falseが設定されているのならば、X サーバーはあなたに MapRequestを通知して、指定されたウインドウはマップ(map)しない。 このイベントは、あなたのウインドウマネージャークライアントに サブウインドウの配置を制御する能力を与える。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* MapRequest */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window parent;
	Window window;
} XMapRequestEvent;

parent メンバーは親ウインドウに設定される。 window メンバーはマップ(map)されたサブウインドウに設定される。

ResizeRequest Events

X サーバーは、他のクライアントがウインドウのサイズを変更しようとしていると言う情報を要求するクライアントに ResizeRequestイベントを通知する。 X サーバーは、何か他のクライアントが XConfigureWindowXResizeWindowXMoveResizeWindowのいずれかを呼ぶ事で特定のウインドウのサイズを変更しようとする時は 必ずこのイベントを発生する。

ResizeRequestイベントを受け取るには、 ウインドウの event-mask 属性の ResizeRedirectビットを設定する。 他のクライアントによるサイズを変更しようとする何らかの試みは その時にリダイレクトされる。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* ResizeRequest */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;
	int width, height;
} XResizeRequestEvent;

window メンバーはサイズを他のクライアントが変えるように試みた ウインドウが設定される。 width と height メンバーはウインドウの内側のサイズが設定される、 ボーダーを除外する。

Colormap State Change Events

X サーバーは、カラーマップ(colormap)が変わると言う情報と カラーマップ(colormap)がインストールされるあるいはアンインストール されると言う情報を要求するクライアントに ColormapNotifyイベントを通知する。 X サーバーはクライアントアプリケーションが以下の事をする時はいつも このイベント型(type)を発生する:

ColormapNotify を受け取るにはウインドウの event-mask 属性の ColormapChangeMaskビットを設定する。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* ColormapNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;
	Colormap colormap;	/* colormap or None */
	Bool new;
	int state;	/* ColormapInstalled, ColormapUninstalled */
} XColormapEvent;

window メンバーは関連づけられたカラーマップ(colormap)が変更された、 インストールされた、アンインストールされたウインドウが設定される。 カラーマップ(colormap)が、変更される、インストールされる、 アンインストールされるのいずれかならば、colormap メンバーはそのウインドウに 関連づけられたそのカラーマップ(colormap)が設定される。 カラーマップ(colormap)が XFreeColormapを呼ぶ事で変更されたならば、colormap メンバーは Noneに設定される。 new メンバーは、指定したウインドウのカラーマップ(colormap)が変更、 インストール、アンインストールのいずれが行なわれたかを示すように設定され、 TrueFalseのいずれかだ。 Trueならば、カラーマップ(colormap)は変更された。 Falseならば、カラーマップ(colormap)はインストール、アンインストールの いずれかが行なわれた。 state メンバーは、カラーマップ(colormap)がインストール、アンインストールの いずれが行なわれたのかを示すように必ず設定され、 ColormapInstalledColormapUninstalledのいずれかだ。

Client Communication Events

This section discusses:

ClientMessage Events

X サーバーは、クライアントが XSendEvent機能を呼んだ時にのみ ClientMessageイベントを発生する。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* ClientMessage */
	unsigned long serial;		/* # of last request processed by server */
	Bool send_event;		/* true if this came from a SendEvent request */
	Display *display;		/* Display the event was read from */
	Window window;
	Atom message_type;
	int format;
	union {
		char b[20];
		short s[10];
		long l[5];
	        } data;
} XClientMessageEvent;

message_type メンバーはデータを受け取ったクライアントが どうすればいいかをを示すアトム(atom)が設定される。 format メンバーは 8、16、32 のいずれかに設定され、 データを byte、short、long のいずれのリストとして見るべきかを指示する。 data メンバーはメンバー b、s、l を含む共用体だ。 b、s、l メンバーは 20 個の 8 ビット、10 個の 16 ビット、5 個の 32 ビット のデータを表現している。 特定のメッセージ型(type)はこれらすべての値を使用しないだろう。 X サーバーはwindow、message_type、data メンバーの値の解釈を行なわない。

PropertyNotify Events

X サーバーは、指定したウインドウのプロパティー(property)の変化に ついての情報を要求するクライアントに PropertyNotifyイベントを通知する。

PropertyNotifyイベントを受け取るには、 を受け取るにはウインドウの event-mask 属性の PropertyChangeMaskビットを設定する。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* PropertyNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;
	Atom atom;
	Time time;
	int state;	/* PropertyNewValue or PropertyDelete */
} XPropertyEvent;

window メンバーは関連づけられたプロパティー(property)が変えられた ウインドウが設定される。 atom メンバーはプロパティー(property)のアトム(atom)が設定され、 どのプロパティー(property)が変えられあるいは望まれているかを示す。 time メンバーはプロパティー(property)が変更された時のサーバー時間が 設定される。 state メンバーはプロパティー(property)が、新しい値に変更、削除のいずれかを示すように設定され、 PropertyNewValuePropertyDeleteのいずれかだ。 state メンバーは、 XChangePropertyXRotateWindowPropertiesのいずれかを使ってウインドウのプロパティー(property)が変更された時と( XChangePropertyを使って長さがゼロのデータを追加した時でも)、 XChangePropertyXRotateWindowPropertiesを使って同じデータのすべてあるいは一部のプロパティー(property)を 置き換えた時に、 PropertyNewValueに設定される。 state メンバーは XDeletePropertyや、引数が TrueXGetWindowPropertyを使ってウインドウのプロパティー(property)を削除した場合に、 PropertyDeleteに設定される。

SelectionClear Events

X サーバーは、セレクション(selection)の所有権(ownership)を 失ったクライアントに、 SelectionClearイベントを通知する。 X サーバーは、他のクライアントが XSetSelectionOwnerを呼ぶ事でセレクション(selection)の所有権(ownership)を要求(assert) する時は必ずこのイベント型(type)を発生する。

このイベントのための構造体を以下に示す:

typedef struct {
	int type;	/* SelectionClear */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window window;
	Atom selection;
	Time time;
} XSelectionClearEvent;

selection メンバーはセレクション(selection)のアトム(atom)に設定される。 time メンバーはセレクション(selection)に記録されている最終変更時間が 設定される。 window メンバーは、現在の所有者(セレクション(selection)を失っている 所有者(owner))が XSetSelectionOwnerで指定したウィンドウに設定される。

SelectionRequest Events

X サーバーはセレクション(selection)の所有者(owner)に SelectionRequestイベントを通知する。 X サーバーは、クライアントが自身のセレクション(selection)を XConvertSelection を呼ぶ事で変換する事を要求する時は必ず XConvertSelection イベントを発生する。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* SelectionRequest */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window owner;
	Window requestor;
	Atom selection;
	Atom target;
	Atom property;
	Time time;
} XSelectionRequestEvent;

owner メンバーは、現在の所有者が .ZN XSetSelectionOwner の呼び出しにおいて指定したウィンドウが設定される。 requestor メンバーは、セレクション(selection)を要求しているウィンドウが 設定される。 selection メンバーは、セレクション(selection)を指定するアトム(atom)が 設定される。 例えば、PRIMARY はプライマリ(primary)セレクション(selection)を示すために 使われる。 target メンバーは、セレクション(selection) に求められている型(type)を指定するアトム(atom)が設定される。 property メンバーは、プロパティー(property)名あるいは .ZN None を設定できる。 time メンバーは、タイムスタンプあるいは .ZN ConvertSelection リクエストで得られた .ZN CurrentTime 値が設定される。

所有者(owner)は、指定された目標となる型(type)に基づいたセレクション (selection)に変換して、requestor に SelectionNotifyイベントを送り返すべきだ。 セレクション(selection)を使うための完全な規格は、X コンソーシアム規約 Inter-Client Communication Conventions Manual で与えられる。

SelectionNotify Events

ConvertSelection このイベントは、セレクション(selection)の所有者ではないクライアントの ConvertSelectionプロトコルリクエストへに答えて X サーバーによって発生される。 所有者(owner)がいるならば、 XSendEventを使ってセレクション(selection)の所有者(owner)によって発生される。 セレクション(selection)の所有者(owner)は、 セレクション(selection)が変換され、プロパティー(property)として保存された時、 あるいはセレクション(selection)の変換ができなかった (property メンバーに Noneを設定する事で示される)時に、 リクエストを起こしたクライアントにこのイベントを送るべきだ。

ConvertSelectionプロトコルリクエストでプロパティー(property)として Noneが指定されたなら、所有者(owner)がプロパティー(property)名を選び、 リクエスター(requestor)のウインドウで結果をプロパティー(property)として保存し、 実際のプロパティー(property)名を与える SelectionNotifyを送るべきだ。

このイベント型(type)のための構造体を以下に示す:

typedef struct {
	int type;	/* SelectionNotify */
	unsigned long serial;	/* # of last request processed by server */
	Bool send_event;	/* true if this came from a SendEvent request */
	Display *display;	/* Display the event was read from */
	Window requestor;
	Atom selection;
	Atom target;
	Atom property;	/* atom or None */
	Time time;
} XSelectionEvent;

requestor メンバーは、セレクション(selection)を要求したクライアントに 関連づけられたウィンドウが設定される。 The selection member is set to the atom that indicates the selection. selection メンバーは、セレクション(selection)を示すアトム(atom)が設定される。 例えば、PRIMARY はプライマリ(primary)セレクション(selection)のために使われる。 target メンバーは、変換される型を示すアトム(atom)が設定される。 例えば、PIXMAP はピックスマップのために使われる。 property メンバーは、結果がどのプロパティに保存されるのかを示すアトム(atom) が設定される。 変換に失敗したならば、property メンバーは Noneが設定される。 time メンバーは、変換が起こった時間が設定され、タイムスタンプか CurrentTimeだ。


目次に戻る