Annotation of 43BSD/contrib/X/doc/Xlib/ch12e.t, revision 1.1

1.1     ! root        1: .NH 2
        !             2: When An Event?
        !             3: .PP
        !             4: The following discussion is meant to explain precisely when
        !             5: events are generated and precisely what information is contained in
        !             6: an event.
        !             7: The structures below are all contained in \fI<X/Xlib.h>\fP;
        !             8: the declarations below are for illustration only, 
        !             9: to explain the information in the structures.
        !            10: .IN "File" "<X/Xlib.h>"
        !            11: The \fIXlib.h\fP file is the final authority.
        !            12: .PP
        !            13: Events are often said to be generated on a window.
        !            14: What this really means is that the window system
        !            15: figures out which client to send the event to
        !            16: by looking for the smallest enclosing window for which
        !            17: a client program has selected input for that event type.
        !            18: If no program has selected input for that event type somewhere
        !            19: in the heirarchy, it will eventually be thrown away.
        !            20: Some client programs need to override this behavior, and
        !            21: may `grab' a button for some period of time under some circumstances.
        !            22: .PP
        !            23: .IN "Automatic Grabbing"
        !            24: .IN "Grabbing" "Temporarily Button"
        !            25: If both \fIButtonPressed\fP
        !            26: and \fIButtonReleased\fP are selected by a client on a window,
        !            27: then a \fIButtonPressed\fP event in that window will automatically `grab' the
        !            28: mouse until all buttons are released.
        !            29: .PP
        !            30: If the mouse has been grabbed, either from a button press as above, or
        !            31: .IN "XGrabMouse"
        !            32: .IN "XGrabButton"
        !            33: .IN "Grabbing" "Mouse"
        !            34: .IN "Grabbing" "Button"
        !            35: by a call to \fIXGrabMouse\fP or \fIXGrabButton\fP,
        !            36: then \fIButtonPressed\fP, \fIButtonReleased\fP,
        !            37: \fIMouseMoved\fP, \fIEnterWindow\fP,
        !            38: and \fILeaveWindow\fP events will only go to windows
        !            39: fo
        !            40: .IN "XSelectInput"
        !            41: which the grabbing client has called \fIXSelectInput\fP.
        !            42: If the client
        !            43: has not called \fIXSelectInput\fP on the window where the event would
        !            44: normally be sent, then the window where the original \fIButtonPressed\fP
        !            45: occurred will receive the event,
        !            46: provided the event has been selected in that window
        !            47: and the event is not \fIEnterWindow\fP or \fILeaveWindow\fP.
        !            48: .PP
        !            49: When an event is received,
        !            50: programs first have to determine what kind of event was generated.
        !            51: A generic event structure,
        !            52: \fIXEvent\fP has been defined in the library which contains
        !            53: information in common to all events.
        !            54: A user will normally switch on the event type to handle different
        !            55: events.
        !            56: .nf
        !            57: .DS
        !            58: .TA .5i 2.5i
        !            59: .ta .5i 2.5i
        !            60: /* Definition of a generic event.  It must be cast to a specific event
        !            61:  * type before one can read event-specific data */
        !            62: 
        !            63: typedef struct _XEvent {
        !            64:        unsigned long type;     /* of event (KeyPressed, ExposeWindow, etc.) */
        !            65:        Window window;  /* which selected this event */
        !            66:        long pad_l1, pad_l2;    /* event-specific data */
        !            67:        Window subwindow;       /* child window (if any) event actually happened in */
        !            68:        long pad_l4;    /* event-specific data */
        !            69: } XEvent;
        !            70: .DE
        !            71: .fi
        !            72: Only the type, window, and subwindow information is shared in common
        !            73: among different event types.
        !            74: .IN "Data Structures" "XEvent"
        !            75: .PP
        !            76: \fIKeyPressed\fP, \fIKeyReleased\fP, \fIButtonPressed\fP, 
        !            77: \fIButtonReleased\fP, \fIEnterWindow\fP,
        !            78: \fILeaveWindow\fP, and \fIMouseMoved\fP events contain the same information
        !            79: and have the following structure:
        !            80: .nf
        !            81: .DS
        !            82: .TA .5i 2.5i
        !            83: .ta .5i 2.5i
        !            84: struct _XKeyOrButtonEvent {
        !            85:        unsigned long type;     /* of event (KeyPressed, ButtonReleased, etc.) */
        !            86:        Window window;  /* which selected this event */
        !            87:        unsigned short time;    /* in 10 millisecond ticks */
        !            88:        short detail;   /* event-dependent data (key state, etc.) */
        !            89:        short x;        /* mouse x coordinate within event window */
        !            90:        short y;        /* mouse y coordinate within event window */
        !            91:        Window subwindow;       /* child window (if any) mouse was in */
        !            92:        Locator location;       /* absolute coordinates of mouse */
        !            93: };
        !            94: .IN "Data Structures" "XKeyEvent"
        !            95: .IN "Data Structures" "XKeyOrButtonEvent"
        !            96: .IN "Data Structures" "XKeyPressedEvent"
        !            97: .IN "Data Structures" "XKeyReleasedEvent"
        !            98: .IN "Data Structures" "XButtonPressedEvent"
        !            99: .IN "Data Structures" "XButtonReleasedEvent"
        !           100: .IN "Data Structures" "XButtonButtonEvent"
        !           101: typedef struct _XKeyOrButtonEvent XKeyEvent;
        !           102: typedef struct _XKeyOrButtonEvent XKeyOrButtonEvent;
        !           103: typedef struct _XKeyOrButtonEvent XKeyPressedEvent;
        !           104: typedef struct _XKeyOrButtonEvent XKeyReleasedEvent;
        !           105: 
        !           106: typedef struct _XKeyOrButtonEvent XButtonEvent;
        !           107: typedef struct _XKeyOrButtonEvent XButtonPressedEvent;
        !           108: typedef struct _XKeyOrButtonEvent XButtonReleasedEvent;
        !           109: .DE
        !           110: .DS
        !           111: .TA .5i 2.5i
        !           112: .ta .5i 2.5i
        !           113: struct _XMouseOrCrossingEvent {
        !           114:        unsigned long type;     /* EnterWindow, LeaveWindow, or MouseMoved */
        !           115:        Window window;  /* which selected this event */
        !           116:        short pad_s2;         
        !           117:        short detail;   /* event-dependent data (key state, etc. ) */
        !           118:        short x;        /* mouse x coordinate within event window */
        !           119:        short y;        /* mouse y coordinate within event window */
        !           120:        Window subwindow;       /* child window (if any) mouse was in */
        !           121:        Locator location;       /* absolute coordinates of mouse */
        !           122: };
        !           123: .IN "Data Structures" "XMouseOrCrossingEvent"
        !           124: .IN "Data Structures" "XEnterWindowEvent"
        !           125: .IN "Data Structures" "XLeaveWindowEvent"
        !           126: .IN "Data Structures" "XMouseMovedEvent"
        !           127: 
        !           128: typedef struct _XMouseOrCrossingEvent XMouseOrCrossingEvent;
        !           129: typedef struct _XMouseOrCrossingEvent XEnterWindowEvent;
        !           130: typedef struct _XMouseOrCrossingEvent XLeaveWindowEvent;
        !           131: typedef struct _XMouseOrCrossingEvent XMouseMovedEvent;
        !           132: .fi
        !           133: .DE
        !           134: .PP
        !           135: The coordinates of the mouse relative to the event window are reported, even
        !           136: if the mouse is not in the window (because of mouse grabbing or keyboard
        !           137: focusing).  
        !           138: If the mouse is also in a decendent of the event window, the sub window
        !           139: is set to that decendent, otherwise the sub window is 0.  The locator defines
        !           140: the mouse coordinates in absolute terms, and can be used as an argument
        !           141: .IN "XInterpretLocator"
        !           142: to \fIXInterpretLocator\fP to interpret
        !           143: the coordinates with respect to new window
        !           144: configurations.  
        !           145: The representation of the Locator is <x,,y> in absolute screen
        !           146: coordinates.
        !           147: .PP
        !           148: The time value is present only for \fIKeyPressed\fP, \fIKeyReleased\fP,
        !           149: \fIButtonPressed\fP, and \fIButtonReleased\fP events.
        !           150: Note that there are only 16 bits of time, which
        !           151: wraps after approximately 11 minutes, so only time differences between
        !           152: clustered events is interesting.
        !           153: .PP
        !           154: .IN "Event" "Detail"
        !           155: For all events containing details,
        !           156: the high bits of the detail encode the state of
        !           157: various keys and buttons just before the event:
        !           158: .IN "Key Mask"
        !           159: .IN "Button Mask"
        !           160: .KS
        !           161: .TS
        !           162: center;
        !           163: lcl.
        !           164: ControlMask    0x4000  Control key
        !           165: MetaMask       0x2000  Meta (Symbol) key
        !           166: ShiftMask      0x1000  Shift key
        !           167: ShiftLockMask  0x0800  ShiftLock key
        !           168: LeftMask       0x0400  Left button
        !           169: MiddleMask     0x0200  Middle button
        !           170: RightMask      0x0100  Right button
        !           171: .TE
        !           172: .KE
        !           173: For \fIKeyPressed\fP and \fIKeyReleased\fP,
        !           174: the low byte of the detail gives the keycode.
        !           175: This is not an ASCII character.
        !           176: .IN "File" "<X/Xkeyboard.h>"
        !           177: .IN "Keyboard" "Classification"
        !           178: .IN "Macros" "Keyboard"
        !           179: There are useful macros defined in the file \fI<X/Xkeyboard.h>\fP
        !           180: to classify keycodes.
        !           181: The tests \fIIsShiftKey()\fP, \fIIsCursorKey()\fP, \fIIsKeypadKey()\fP,
        !           182: \fIIsFunctionKey()\fP, \fIIsPFKey()\fP and \fIIsTypeWriterKey()\fP may be used
        !           183: with a key code to classify the key as to grouping.
        !           184: See the warning at the beginning of the section.
        !           185: .IN "XLookupMapping"
        !           186: Normally, however, a client will use the supplied \fIXLookupMapping\fP
        !           187: subroutine to determine what string (if any) is associated with the key.
        !           188: .LP
        !           189: For \fIButtonPressed\fP and \fIButtonReleased\fP events
        !           190: the low byte of the detail
        !           191: is one of:
        !           192: .IP
        !           193:        RightButton     0
        !           194: .br
        !           195:        MiddleButton    1
        !           196: .br
        !           197:        LeftButton      2
        !           198: .LP
        !           199: For \fIEnterWindow\fP and \fILeaveWindow\fP events,
        !           200: the low byte of the detail is either zero
        !           201: or one of:
        !           202: .IP
        !           203:        IntoOrFromSubwindow     1
        !           204: .br
        !           205:        VirtualCrossing         2
        !           206: .LP
        !           207: \fIEnterWindow\fP and \fILeaveWindow\fP events are generated as follows:
        !           208: .nf
        !           209:     When the mouse moves from window A to window B, and B is an ancestor of A:
        !           210:        A will get a \fILeaveWindow\fP with detail 0
        !           211:        windows between A and B exclusive that have \fILeaveWindow\fP selected
        !           212:                will get a \fILeaveWindow\fP with detail 2
        !           213:        B will get an \fIEnterWindow\fP with detail 1
        !           214: 
        !           215:     When the mouse moves from window A to window B, and B is a descendant of A:
        !           216:        A will get a \fILeaveWindow\fP with detail 1
        !           217:        windows between A and B exclusive that have \fIEnterWindow\fP selected
        !           218:                will get an \fIEnterWindow\fP with detail 2
        !           219:        B will get an \fIEnterWindow\fP with detail 0
        !           220: 
        !           221:     When the mouse moves from window A to window B, with window C being their
        !           222:     least common ancestor:
        !           223:        A will get a \fILeaveWindow\fP with detail 0
        !           224:        windows between A and C exclusive that have \fILeaveWindow\fP selected
        !           225:                will get a \fILeaveWindow\fP with detail 2
        !           226:        windows between C and B exclusive that have \fIEnterWindow\fP selected
        !           227:                will get an \fIEnterWindow\fP with detail 2
        !           228:        B will get an \fIEnterWindow\fP with detail 0
        !           229: 
        !           230:     At the start of a mouse grab, either automatically from a button press,
        !           231:     or from an \fIXGrabMouse\fP or \fIXGrabButton\fP, with the mouse in window A:
        !           232:        A will get a \fILeaveWindow\fP with detail 0 if the grabbing client has
        !           233:                not issued an \fIXSelectInput\fP command on A.
        !           234:        ancestors of A (not including the root) will get a \fILeaveWindow\fP with
        !           235:                detail 2 if the grabbing client has not issued an \fIXSelectInput\fP
        !           236:                on the window and the window has \fILeaveWindow\fP selected.
        !           237: 
        !           238:     At the end of a mouse grab, with the mouse in window A:
        !           239:        ancestors of A (not including the root) will get an \fIEnterWindow\fP with
        !           240:                detail 2 if the grabbing client has not issued an \fIXSelectInput\fP
        !           241:                on the window and the window has \fIEnterWindow\fP selected.
        !           242:        A will get an \fIEnterWindow\fP with detail 0 if the grabbing client has
        !           243:                not issued an \fIXSelectInput\fP command on A.
        !           244: .fi
        !           245: .LP
        !           246: Another way to look at this is:
        !           247: .nf
        !           248:    a detail of 0 means that the mouse entered this window from, or left
        !           249:       this window towards, some place outside the window's hierarchy.
        !           250:    a detail of 1 means that the mouse entered this window from, or left
        !           251:       this window towards, one of its descendents.
        !           252:    a detail of 2 means that the mouse moved from a descendent of the
        !           253:       window to a place outside the window's hierarchy, or vice versa.
        !           254: .fi
        !           255: \fIEnterWindow\fP and \fILeaveWindow\fP events with detail 0 or 1 will propagate
        !           256: to the smallest enclosing window that has actually selected the event.
        !           257: .PP
        !           258: There are a set of structure definitions
        !           259: outlining the information and type of each event in \fI<X/Xlib.h>\fP.
        !           260: Coordinates are relative to the inside of the window.
        !           261: .PP
        !           262: .IN "ExposeWindow Event"
        !           263: .IN "ExposeRegion Event"
        !           264: \fIExposeWindow\fP and \fIExposeRegion\fP
        !           265: events are triggered as (parts of) windows become
        !           266: exposed.
        !           267: When an entire window becomes exposed (as when a window is mapped or
        !           268: changes size), an \fIExposeWindow\fP event is sent.
        !           269: The width and height of the
        !           270: entire window is given, and the coordinates are (0, 0).
        !           271: When only parts of a
        !           272: window become exposed (as when an obscuring window is moved), 
        !           273: \fIExposeRegion\fP
        !           274: events are sent describing each newly exposed area.  However, if only
        !           275: \fIExposeWindow\fP has been selected,
        !           276: a single \fIExposeWindow\fP event will be sent instead.
        !           277: .IN "XCopyArea"
        !           278: .IN "XMoveArea"
        !           279: If the region exposure is the result of an \fIXCopyArea\fP
        !           280: or \fIXMoveArea\fP, then \fIExposeCopy\fP will
        !           281: be set in the detail word.  
        !           282: If the exposure is actually that of a child of the
        !           283: window selecting the event, the sub window is set to that child and the
        !           284: coordinates are actually for the sub window, otherwise the sub window is 0.
        !           285: For a given window exposure or \fIXCopyArea\fP
        !           286: or \fIXMoveArea\fP,
        !           287: all resulting \fIExposeRegion\fP events
        !           288: will be sent contiguously, with no other events interspersed.
        !           289: .PP
        !           290: \fIXExposeCopyEvent\fP
        !           291: are only sent to terminate a string of \fIExposeRegion\fP
        !           292: events
        !           293: that might be
        !           294: .IN "XCopyArea"
        !           295: .IN "XMoveArea"
        !           296: generated by \fIXCopyArea\fP or \fIXMoveArea\fP commands.
        !           297: Note that there is no information in the event as to what area was
        !           298: exposed, as this is just an acknowledgement that all side effects have
        !           299: been generated.
        !           300: .PP
        !           301: The structures for exposure events are given below:
        !           302: .sp
        !           303: .DS
        !           304: .TA .5i 2.5i
        !           305: .ta .5i 2.5i
        !           306: struct _XExposeEvent {
        !           307:        unsigned long type;     /* ExposeWindow or ExposeRegion */
        !           308:        Window window;  /* that selected this event */
        !           309:        short pad_s2;         
        !           310:        short detail;   /* 0 or ExposeCopy */
        !           311:        short width;    /* width of exposed area */
        !           312:        short height;   /* height of exposed area */
        !           313:        Window subwindow;       /* child window (if any) actually exposed */
        !           314:        short y;        /* top of exposed area (0 for ExposeWindow) */
        !           315:        short x;        /* left edge of exposed area (0 for ExposeWindow) */
        !           316: };
        !           317: .IN "Data Structures" "XExposeEvent"
        !           318: .IN "Data Structures" "XExposeWindowEvent"
        !           319: .IN "Data Structures" "XExposeCopyEvent"
        !           320: typedef struct _XExposeEvent XExposeEvent;
        !           321: typedef struct _XExposeEvent XExposeWindowEvent;
        !           322: typedef struct _XExposeEvent XExposeRegionEvent;
        !           323: .DE
        !           324: .DS
        !           325: .TA .5i 2.5i
        !           326: .ta .5i 2.5i
        !           327: typedef struct _XExposeCopyEvent {
        !           328:        unsigned long type;     /* ExposeCopy */
        !           329:        Window window;  /* that selected this event */
        !           330:        long pad_l1;
        !           331:        long pad_l2;          
        !           332:        Window subwindow;       /* child window (if any) actually exposed */
        !           333:        long pad_l4;          
        !           334: } XExposeCopyEvent;
        !           335: .DE
        !           336: .fi
        !           337: .sp
        !           338: .PP
        !           339: .IN "XCopyArea"
        !           340: If the XCopyArea was done in a child of the window selecting the event,
        !           341: the subwindow is set to that child, otherwise the subwindow is 0.
        !           342: .PP
        !           343: The X server always clears to the
        !           344: background color an exposed area before sending an exposure
        !           345: event to the client.
        !           346: Unfortunately, the client may have sent output to
        !           347: a window between the time it is cleared and the time he reads the
        !           348: exposure event off Xlib's queue.  This can lead to difficulty in two
        !           349: cases:
        !           350: .LP
        !           351: \(bu the exposure event was an \fIExposeWindow\fP with new window dimensions.
        !           352: The client probably wants output to go to a different place after a size
        !           353: change than before.
        !           354: .LP
        !           355: \(bu the client is using a display function which is not invertable;  that
        !           356: is, applying the function more than once does not have the same effect
        !           357: as applying it just once.  
        !           358: .IN "Display Functions"
        !           359: Seven of the 16 display functions are not
        !           360: invertable:  \fIGXandReverse\fP, \fIGXxor\fP, \fIGXnor\fP, \fIGXequiv\fP,
        !           361: \fIGXinvert\fP, \fIGXorReverse\fP,
        !           362: and \fIGXnand\fP.
        !           363: The most obvious example of an invertable function is \fIGXinvert\fP,
        !           364: which is a no-op if applied twice.
        !           365: .PP
        !           366: In both of these cases, the client should explicitly clear the exposed
        !           367: area (i.e. paint it with the background) upon receipt of an exposure
        !           368: event, BEFORE doing any repainting.
        !           369: Failure to do so will cause ugly
        !           370: glitches on the screen.
        !           371: .PP
        !           372: Unmap events have the following structure:
        !           373: .DS
        !           374: .TA .5i 2.5i
        !           375: .ta .5i 2.5i
        !           376: typedef struct _XUnmapEvent {
        !           377:        unsigned long type;     /* UnmapWindow */
        !           378:        Window window;  /* that selected this event */
        !           379:        long pad_l1;
        !           380:        long pad_l2;          
        !           381:        Window subwindow;       /* child window (if any) actually unmapped */
        !           382:        long pad_l4;          
        !           383: } XUnmapEvent;
        !           384: .DE
        !           385: .fi
        !           386: .sp
        !           387: .LP
        !           388: These events will be sent to clients that ask to be informed when
        !           389: they are unmapped from the screen.
        !           390: For example, both the clock and the load monitor program
        !           391: will stop updating themselves when turned into
        !           392: an icon (i.e. their main window is unmapped by a window manager).
        !           393: .PP
        !           394: To allow certain styles of user interfaces to be built,
        !           395: it is also possible to request to be informed if the
        !           396: input focus is set or removed from a window.
        !           397: The event has the following structure:
        !           398: .IN "Data Structures" "XFocusChangeEvent"
        !           399: .IN "Event Types" "FocusChange"
        !           400: .IN "FocusChange Event"
        !           401: .sp
        !           402: .DS
        !           403: .TA .5i 2.5i
        !           404: .ta .5i 2.5i
        !           405: typedef struct _XFocusChangeEvent {
        !           406:        unsigned long type;     /* FocusChange */
        !           407:        Window window;  /* that selected this event */
        !           408:        short pad_s2;
        !           409:        short detail;   /* EnterWindow or LeaveWindow */
        !           410:        long pad_l2;
        !           411:        Window subwindow;       /* child window (if any) of actual focus change*/
        !           412:        long pad_l4;          
        !           413: } XFocusChangeEvent;
        !           414: .DE
        !           415: .sp

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.