typedef struct { int type; unsigned long serial; /* 最後にサーバに処理されたリクエストの番号 */ Bool send_event; /* SendEvent リクエストから送られてきた場合に真 */ Display *display; /* イベントが読み出されたディスプレイ */ Window window; } XAnyEvent;
type メンバには、イベントの型を一意に識別する定数名が設定される。 例えば、X サーバがクライアントアプリケーションに GraphicsExpose イベントを通知するとき、X サーバは type メンバに GraphicsExpose を設定した XGraphicsExposeEvent 構造体を送る。 display メンバには、イベントが読み出されたディスプレイへのポインタが 設定される。 send_event メンバには、このイベント自身が SendEvent プロトコルリクエストから送られてきた場合に True が設定される。 serial メンバはプロトコルで通知されたシリアル番号を基に設定される。 ただし、最少桁の16ビットから完全32ビットの値に拡張される。 window メンバには、ツールキットのディスパッチャが最も有効に使えるウィ ンドウが設定される。
XEvent 構造体は、各イベント型のために宣言した個別の構造体の共用体である。
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 構造体の最初のエントリは常に type メンバである。 これにはイベントの型が設定される。 2番目のメンバは常に serial メンバであり、これはイベントを生成したプロ トコルリクエストのシリアル番号である。 3番目のメンバは常に send_event である。 これはイベントが他のクライアントから送られてきたかどうかを示す真偽値で ある。 4番目のメンバは常に display である。 これはイベントが読み出されたディスプレイである。 keymap イベントを除くと、5番目のメンバは常に window である。 これはツールキットのディスパッチャにとって便利なように注意深く選ばれる。 ツールキットを破綻させないために、これら最初の5つのエントリの順序は変 更してはならない。 多くのイベントは time メンバを持つ。 これはイベントが発生した時刻である。 さらに、汎用イベントへのポインタは、構造体の他の要素にアクセスする前に キャストされなければならない。