Annotation of 43BSDTahoe/new/X/doc/Xlib/ch12a.t, revision 1.1

1.1     ! root        1: .NH
        !             2: Input Event Handling
        !             3: .XS
        !             4: Input Event Handling
        !             5: .XE
        !             6: .PP
        !             7: .IN "Input Control"
        !             8: .IN "Output" "Control"
        !             9: Input from the window system is asynchronous, but the window
        !            10: system never gives you information you did not ask for.
        !            11: .IN "Definitions" "Event"
        !            12: This input comes in the form of `events'.
        !            13: There are keyboard, mouse button, window crossing, mouse motion,
        !            14: exposure, unmap and focus change events.
        !            15: .IN "File" "<X/Xlib.h>"
        !            16: There are structures defined for these events in \fI<X/Xlib.h>\fP.
        !            17: These may arrive at any time in the input stream even between the
        !            18: time you send a command and get a reply.
        !            19: Accordingly, the library queues any events received while waiting for
        !            20: a reply for later use.
        !            21: .PP
        !            22: Only the type and window fields are defined for all types of events.
        !            23: .IN "Definitions" "XEvent"
        !            24: There is a generic structure declared called \fIXEvent\fP defined in
        !            25: .IN "File" "<X/Xlib.h>"
        !            26: \fI<X/Xlib.h>\fP.
        !            27: Once the type has been determined, future references to the event structure
        !            28: should be made using the structures declared in the library.
        !            29: .FD
        !            30: .IN "Definitions" "XCompressEvents"
        !            31: .IN "XCompressEvents"
        !            32: .IN "Definitions" "XExpandEvents"
        !            33: .IN "XExpandEvents"
        !            34: XCompressEvents()
        !            35: .sp
        !            36: XExpandEvents()
        !            37: .FN
        !            38: .PP
        !            39: .IN "Event Compression"
        !            40: If the X server sends multiple \fIMouseMoved\fP events without any other
        !            41: intervening events or replies, the X library by default suppresses all but
        !            42: the last such event.
        !            43: .PP
        !            44: If you want to see all events, you can call \fIXExpandEvents\fP
        !            45: and the library
        !            46: will supply all events without compression.
        !            47: .NH 2
        !            48: Event Handling
        !            49: .PP
        !            50: Before the window system will send an event, you must
        !            51: request it.
        !            52: You can request events in particular circumstances,
        !            53: for example,
        !            54: mouse motion when a mouse button is held down.
        !            55: In this example,
        !            56: mouse motion events are generated;
        !            57: X does not distinguish between different types of mouse events,
        !            58: even though you can request them under different circumstances.
        !            59: .IN "Event" "Types"
        !            60: .FD
        !            61: .IN "Definitions" "XSelectInput"
        !            62: .IN "XSelectInput"
        !            63: XSelectInput (w, mask)
        !            64:        Window w;
        !            65:        int mask;       /* event mask */
        !            66: .FN    
        !            67: \fIXSelectInput\fP defines which input events the window is interested in.  If
        !            68: a window is not interested in an event, it usually will propagate up to
        !            69: the closest ancestor that is interested.
        !            70: .IN "Event" "Propagation"
        !            71: The bits of the mask are
        !            72: .IN "File" "<X/X.h>"
        !            73: defined in \fI<X/X.h>\fP:
        !            74: .IN "Event Types" "EnterWindow"
        !            75: .IN "Event Types" "LeaveWindow"
        !            76: .IN "Event Types" "MouseMoved"
        !            77: .IN "Event Types" "ExposeWindow"
        !            78: .IN "Event Types" "ExposeRegion"
        !            79: .IN "Event Types" "ExposeCopy"
        !            80: .IN "Event Types" "ExposeRegion"
        !            81: .IN "Event Types" "MouseMoved"
        !            82: .IN "Event Types" "FocusChange"
        !            83: .IN "Event Types" "UnmapWindow"
        !            84: .IN "Event Types" "Keyboard"
        !            85: .IN "Event Types" "Button"
        !            86: .IN "Key Event"
        !            87: .IN "Button Event"
        !            88: .IN "EnterWindow Event"
        !            89: .IN "LeaveWindow Event"
        !            90: .IN "MouseMoved Event"
        !            91: .IN "ExposeWindow Event"
        !            92: .IN "ExposeRegion Event"
        !            93: .IN "ExposeCopy Event"
        !            94: .IN "MouseMoved Event"
        !            95: .IN "Mouse" "Event"
        !            96: .IN "FocusChange Event"
        !            97: .in "UnmapWindow Event"
        !            98: .LP
        !            99: .TS
        !           100: center,box;
        !           101: c c c
        !           102: ___
        !           103: l c l.
        !           104: Request        Hex Code        Circumstances
        !           105: KeyPressed     0x0001  keyboard key pressed
        !           106: KeyReleased    0x0002  keyboard key released
        !           107: ButtonPressed  0x0004  mouse button pressed
        !           108: ButtonReleased 0x0008  mouse button released
        !           109: EnterWindow    0x0010  mouse entering window
        !           110: LeaveWindow    0x0020  mouse leaving window
        !           111: MouseMoved     0x0040  mouse moves within window
        !           112: ExposeWindow   0x0080  full window changed and/or exposed
        !           113: ExposeRegion   0x0100  region of window exposed
        !           114: ExposeCopy     0x0200  region exposed by XCopyArea
        !           115: RightDownMotion        0x0400  mouse moves with right button down
        !           116: MiddleDownMotion       0x0800  mouse moves with middle button down
        !           117: LeftDownMotion 0x1000  mouse moves with left button down
        !           118: UnmapWindow    0x2000  window is unmapped
        !           119: FocusChange    0x4000  keyboard focus changed
        !           120: .TE
        !           121: Selecting \fIExposeRegion\fP also selects \fIExposeWindow\fP.
        !           122: .PP
        !           123: .IN "XSelectInput"
        !           124: A call on \fIXSelectInput\fP overrides any previous call on \fIXSelectInput\fP
        !           125: for the
        !           126: same window, whether from the same client or a different one.
        !           127: It is not
        !           128: possible for two clients to each select events simultaneously
        !           129: from the same window.
        !           130: Initially,
        !           131: no events will be generated on a window.
        !           132: .PP
        !           133: If a window has both \fIButtonPressed\fP and \fIButtonReleased\fP selected,
        !           134: then
        !           135: a \fIButtonPressed\fP event in that window will automatically `grab' the
        !           136: mouse until all buttons are released, with events sent to windows as
        !           137: .IN "XGrabMouse"
        !           138: described for \fIXGrabMouse\fP.
        !           139: This ensures that a window will see the release event
        !           140: corresponding to the pressed event,
        !           141: even though the mouse may have exited the window in the meantime.
        !           142: .PP
        !           143: If \fIMouseMoved\fP is selected, events will be sent independent of the state
        !           144: of the mouse buttons.  If instead, one or more of \fIRightDownMotion\fP,
        !           145: \fIMiddleDownMotion\fP, \fILeftDownMotion\fP is selected,
        !           146: \fIMouseMoved\fP events will be
        !           147: generated only when one or more of the specified buttons is depressed.
        !           148: (There are NO events of type \fIRightDownMotion\fP, \fIMiddleDownMotion\fP, or
        !           149: \fILeftDownMotion\fP; 
        !           150: these are ways to request \fIMouseMoved\fP events only when particular buttons
        !           151: are held down).
        !           152: .FD
        !           153: .IN "Definitions" "XFlush"
        !           154: .IN "XFlush"
        !           155: XFlush ()
        !           156: .FN
        !           157: \fIXFlush\fP sends (`flushes') all output requests that have been buffered but
        !           158: not yet sent.
        !           159: Flushing is done automatically the next time input is
        !           160: .IN "XPending"
        !           161: .IN "XNextEvent"
        !           162: .IN "XWindowEvent"
        !           163: read (with \fIXPending\fP, \fIXNextEvent\fP, or \fIXWindowEvent\fP),
        !           164: so most clients
        !           165: should not need to use this subroutine.
        !           166: .FD
        !           167: .IN "Definitions" "XSync"
        !           168: .IN "XSync"
        !           169: XSync (discard)
        !           170:        int discard;    /* 0 or 1 */
        !           171: .FN
        !           172: \fIXSync\fP flushes the output buffer, then waits until all events and errors
        !           173: resulting from previous calls have been received and processed by
        !           174: the X server.
        !           175: Events are placed on
        !           176: the input queue.
        !           177: .IN "XError"
        !           178: The client's \fIXError\fP subroutine is called once for EACH
        !           179: error received. 
        !           180: .IN "XFlush"
        !           181: Even fewer clients need to use this subroutine than \fIXFlush\fP.
        !           182: .PP
        !           183: If discard is true, \fIXSync\fP then discards all events on the input queue
        !           184: (including those events that were on the queue before \fIXSync\fP was called).
        !           185: .FD
        !           186: .IN "Definitions" "XPending"
        !           187: .IN "XPending"
        !           188: int XPending ()
        !           189: .FN    
        !           190: \fIXPending\fP flushes the output buffer, then returns the number of input
        !           191: events that have been received from the server, but not yet removed from
        !           192: .IN "XNextEvent"
        !           193: .IN "XWindowEvent"
        !           194: the queue. (Events are removed from the queue by calling \fIXNextEvent\fP or
        !           195: \fIXWindowEvent\fP, described below.)
        !           196: .PP
        !           197: .IN "XPending"
        !           198: .IN "Unix System Call" "select"
        !           199: You should always call \fIXPending\fP before doing a select(2) on the
        !           200: file descriptor contained in the display structure.
        !           201: The input you are trying to wait for may have already arrived and be
        !           202: sitting in Xlib's queue.
        !           203: .IN "XFlush"
        !           204: Another strategy might be to call \fIXFlush\fP after
        !           205: finding out if there are any unprocessed events on the queue by
        !           206: .IN "Macro" "QLength"
        !           207: using the \fIQLength()\fP macro before calling \fIselect(2)\fP.
        !           208: .FD
        !           209: .IN "Definitions" "XNextEvent"
        !           210: XNextEvent (rep)
        !           211:        XEvent *rep;    /* RETURN */
        !           212: .FN
        !           213: \fIXNextEvent\fP flushes the output buffer, then removes an input event from
        !           214: .IN "XEvent"
        !           215: the head of the queue and copies it into an \fIXEvent\fP
        !           216: supplied by the caller.
        !           217: If the queue is empty, \fIXNextEvent\fP blocks until an event is received.
        !           218: .FD
        !           219: .IN "Definitions" "XPutBackEvent"
        !           220: .IN "XPutBackEvent"
        !           221: XPutBackEvent(event)
        !           222:        XEvent *event;
        !           223: .FN
        !           224: \fIXPutBackEvent\fP pushes an event back onto the head of the current
        !           225: display's input queue.
        !           226: This can be useful if you have read an event and then decide that you'd
        !           227: rather deal with it later.
        !           228: .FD
        !           229: .IN "Definitions" "XPeekEvent"
        !           230: .IN "XPeekEvent"
        !           231: XPeekEvent (rep)
        !           232:        XEvent *rep;    /* RETURN */
        !           233: .FN
        !           234: \fIXPeekEvent\fP flushes the output buffer, then peeks at an input event from
        !           235: the head of the queue and copies it into an 
        !           236: \fIXEvent\fP supplied by the caller,
        !           237: without removing it from the input queue.
        !           238: If the queue is empty, \fIXPeekEvent\fP blocks until an event is received.
        !           239: .IN "Macro" "QLength()"
        !           240: You can use the \fIQLength()\fP macro to determine if there are any
        !           241: events to peek at.
        !           242: .PP
        !           243: Note:  We may add more specialized peek functions later as the need arises.
        !           244: .FD
        !           245: .IN "Definitions" "XWindowEvent"
        !           246: .IN "XWindowEvent"
        !           247: XWindowEvent (w, mask, rep)
        !           248:        Window w;
        !           249:        int mask;       /* event mask */
        !           250:        XEvent *rep;    /* RETURN */
        !           251: .FN
        !           252: This subroutine is used to look for specific events from specific windows.
        !           253: \fIXWindowEvent\fP flushes the output buffer, then removes the next event in
        !           254: the queue which matches both the passed window and the passed \fImask\fP.
        !           255: The
        !           256: .IN "XEvent"
        !           257: event is copied into an \fIXEvent\fP supplied by the caller.
        !           258: Events earlier in
        !           259: the queue are not discarded.  If no such event has been queued,
        !           260: \fIXWindowEvent\fP blocks until one is received.
        !           261: .FD
        !           262: .IN "Definitions" "XMaskEvent"
        !           263: .IN "XMaskEvent"
        !           264: XMaskEvent (mask, rep)
        !           265:        int mask;       /* event mask */
        !           266:        XEvent *rep;    /* RETURN */
        !           267: .FN
        !           268: This subroutine is used to look for specific events.
        !           269: \fIXMaskEvent\fP flushes the output buffer, then removes the next event in
        !           270: the queue which matches the passed mask.  The
        !           271: event is copied into an \fIXEvent\fP supplied by the caller.  Events earlier in
        !           272: the queue are not discarded.  If no such event has been queued,
        !           273: \fIXMaskEvent\fP blocks until one is received.
        !           274: .FD
        !           275: .IN "Definitions" "XCheckWindowEvent"
        !           276: .IN "XCheckWindowEvent"
        !           277: int XCheckWindowEvent (w, mask, rep)
        !           278:        Window w;
        !           279:        int mask;       /* event mask */
        !           280:        XEvent *rep;    /* RETURN */
        !           281: .FN
        !           282: This subroutine is used to look for specific events from specific windows.
        !           283: XCheckWindowEvent flushes the output buffer, then removes the next event in
        !           284: the queue which matches both the passed window and the passed mask.  The
        !           285: .IN "XEvent"
        !           286: event is copied into an XEvent supplied by the caller and XCheckWindowEvent
        !           287: returns 1.  Events earlier in the queue are not discarded.  If no such
        !           288: event has been queued, XCheckWindowEvent immediately returns 0.
        !           289: .FD
        !           290: .IN "Definitions" "XCheckMaskEvent"
        !           291: .IN "XCheckMaskEvent"
        !           292: int XCheckMaskEvent (mask, rep)
        !           293:        int mask;       /* event mask */
        !           294:        XEvent *rep;    /* RETURN */
        !           295: .FN
        !           296: This subroutine is used to look for specific events.
        !           297: XCheckMaskEvent flushes the output buffer, then removes the next event in
        !           298: the queue which matches the passed mask.  The
        !           299: event is copied into an XEvent supplied by the caller and
        !           300: XCheckMaskEvent returns 1.  Events earlier in
        !           301: the queue are not discarded.  If no such event has been queued,
        !           302: XCheckMaskEvent immediately returns 0.
        !           303: 

unix.superglobalmegacorp.com

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