1 /************************************************************
2 
3 Copyright 1987, 1998  The Open Group
4 
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
9 documentation.
10 
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13 
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 
21 Except as contained in this notice, the name of The Open Group shall not be
22 used in advertising or otherwise to promote the sale, use or other dealings
23 in this Software without prior written authorization from The Open Group.
24 
25 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
26 
27                         All Rights Reserved
28 
29 Permission to use, copy, modify, and distribute this software and its
30 documentation for any purpose and without fee is hereby granted,
31 provided that the above copyright notice appear in all copies and that
32 both that copyright notice and this permission notice appear in
33 supporting documentation, and that the name of Digital not be
34 used in advertising or publicity pertaining to distribution of the
35 software without specific, written prior permission.
36 
37 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43 SOFTWARE.
44 
45 ********************************************************/
46 
47 #ifndef INPUT_H
48 #define INPUT_H
49 
50 #include "misc.h"
51 #include "screenint.h"
52 #include <X11/Xmd.h>
53 #include <X11/Xproto.h>
54 #include <stdint.h>
55 #include "window.h"             /* for WindowPtr */
56 #include "xkbrules.h"
57 #include "events.h"
58 #include "list.h"
59 #include "os.h"
60 #include <X11/extensions/XI2.h>
61 
62 #define DEVICE_INIT	0
63 #define DEVICE_ON	1
64 #define DEVICE_OFF	2
65 #define DEVICE_CLOSE	3
66 #define DEVICE_ABORT	4
67 
68 #define POINTER_RELATIVE	(1 << 1)
69 #define POINTER_ABSOLUTE	(1 << 2)
70 #define POINTER_ACCELERATE	(1 << 3)
71 #define POINTER_SCREEN		(1 << 4)        /* Data in screen coordinates */
72 #define POINTER_NORAW		(1 << 5)        /* Don't generate RawEvents */
73 #define POINTER_EMULATED	(1 << 6)        /* Event was emulated from another event */
74 #define POINTER_DESKTOP		(1 << 7)        /* Data in desktop coordinates */
75 
76 /* GetTouchEvent flags */
77 #define TOUCH_ACCEPT            (1 << 0)
78 #define TOUCH_REJECT            (1 << 1)
79 #define TOUCH_PENDING_END       (1 << 2)
80 #define TOUCH_CLIENT_ID         (1 << 3)        /* touch ID is the client-visible id */
81 #define TOUCH_REPLAYING         (1 << 4)        /* event is being replayed */
82 #define TOUCH_POINTER_EMULATED  (1 << 5)        /* touch event may be pointer emulated */
83 #define TOUCH_END               (1 << 6)        /* really end this touch now */
84 
85 /*int constants for pointer acceleration schemes*/
86 #define PtrAccelNoOp            0
87 #define PtrAccelPredictable     1
88 #define PtrAccelLightweight     2
89 #define PtrAccelDefault         PtrAccelPredictable
90 
91 #define MAX_VALUATORS 36
92 /* Maximum number of valuators, divided by six, rounded up, to get number
93  * of events. */
94 #define MAX_VALUATOR_EVENTS 6
95 #define MAX_BUTTONS 256         /* completely arbitrarily chosen */
96 
97 #define NO_AXIS_LIMITS -1
98 
99 #define MAP_LENGTH	MAX_BUTTONS
100 #define DOWN_LENGTH	(MAX_BUTTONS/8)      /* 256/8 => number of bytes to hold 256 bits */
101 #define NullGrab ((GrabPtr)NULL)
102 #define PointerRootWin ((WindowPtr)PointerRoot)
103 #define NoneWin ((WindowPtr)None)
104 #define NullDevice ((DevicePtr)NULL)
105 
106 #ifndef FollowKeyboard
107 #define FollowKeyboard 		3
108 #endif
109 #ifndef FollowKeyboardWin
110 #define FollowKeyboardWin  ((WindowPtr) FollowKeyboard)
111 #endif
112 #ifndef RevertToFollowKeyboard
113 #define RevertToFollowKeyboard	3
114 #endif
115 
116 enum InputLevel {
117     CORE = 1,
118     XI = 2,
119     XI2 = 3,
120 };
121 
122 typedef unsigned long Leds;
123 typedef struct _OtherClients *OtherClientsPtr;
124 typedef struct _InputClients *InputClientsPtr;
125 typedef struct _DeviceIntRec *DeviceIntPtr;
126 typedef struct _ValuatorClassRec *ValuatorClassPtr;
127 typedef struct _ClassesRec *ClassesPtr;
128 typedef struct _SpriteRec *SpritePtr;
129 typedef struct _TouchClassRec *TouchClassPtr;
130 typedef struct _TouchPointInfo *TouchPointInfoPtr;
131 typedef struct _DDXTouchPointInfo *DDXTouchPointInfoPtr;
132 typedef union _GrabMask GrabMask;
133 
134 typedef struct _ValuatorMask ValuatorMask;
135 
136 /* The DIX stores incoming input events in this list */
137 extern InternalEvent *InputEventList;
138 
139 typedef int (*DeviceProc) (DeviceIntPtr /*device */ ,
140                            int /*what */ );
141 
142 typedef void (*ProcessInputProc) (InternalEvent * /*event */ ,
143                                   DeviceIntPtr /*device */ );
144 
145 typedef Bool (*DeviceHandleProc) (DeviceIntPtr /*device */ ,
146                                   void *        /*data */
147     );
148 
149 typedef void (*DeviceUnwrapProc) (DeviceIntPtr /*device */ ,
150                                   DeviceHandleProc /*proc */ ,
151                                   void *        /*data */
152     );
153 
154 /* pointer acceleration handling */
155 typedef void (*PointerAccelSchemeProc) (DeviceIntPtr /*device */ ,
156                                         ValuatorMask * /*valuators */ ,
157                                         CARD32 /*evtime */ );
158 
159 typedef void (*DeviceCallbackProc) (DeviceIntPtr /*pDev */ );
160 
161 struct _ValuatorAccelerationRec;
162 typedef Bool (*PointerAccelSchemeInitProc) (DeviceIntPtr /*dev */ ,
163                                             struct _ValuatorAccelerationRec *
164                                             /*protoScheme */ );
165 
166 typedef struct _DeviceRec {
167     void *devicePrivate;
168     ProcessInputProc processInputProc;  /* current */
169     ProcessInputProc realInputProc;     /* deliver */
170     ProcessInputProc enqueueInputProc;  /* enqueue */
171     Bool on;                    /* used by DDX to keep state */
172 } DeviceRec, *DevicePtr;
173 
174 typedef struct {
175     int click, bell, bell_pitch, bell_duration;
176     Bool autoRepeat;
177     unsigned char autoRepeats[32];
178     Leds leds;
179     unsigned char id;
180 } KeybdCtrl;
181 
182 typedef struct {
183     KeySym *map;
184     KeyCode minKeyCode, maxKeyCode;
185     int mapWidth;
186 } KeySymsRec, *KeySymsPtr;
187 
188 typedef struct {
189     int num, den, threshold;
190     unsigned char id;
191 } PtrCtrl;
192 
193 typedef struct {
194     int resolution, min_value, max_value;
195     int integer_displayed;
196     unsigned char id;
197 } IntegerCtrl;
198 
199 typedef struct {
200     int max_symbols, num_symbols_supported;
201     int num_symbols_displayed;
202     KeySym *symbols_supported;
203     KeySym *symbols_displayed;
204     unsigned char id;
205 } StringCtrl;
206 
207 typedef struct {
208     int percent, pitch, duration;
209     unsigned char id;
210 } BellCtrl;
211 
212 typedef struct {
213     Leds led_values;
214     Mask led_mask;
215     unsigned char id;
216 } LedCtrl;
217 
218 extern _X_EXPORT KeybdCtrl defaultKeyboardControl;
219 extern _X_EXPORT PtrCtrl defaultPointerControl;
220 
221 typedef struct _InputOption InputOption;
222 typedef struct _XI2Mask XI2Mask;
223 
224 typedef struct _InputAttributes {
225     char *product;
226     char *vendor;
227     char *device;
228     char *pnp_id;
229     char *usb_id;
230     char **tags;                /* null-terminated */
231     uint32_t flags;
232 } InputAttributes;
233 
234 #define ATTR_KEYBOARD (1<<0)
235 #define ATTR_POINTER (1<<1)
236 #define ATTR_JOYSTICK (1<<2)
237 #define ATTR_TABLET (1<<3)
238 #define ATTR_TOUCHPAD (1<<4)
239 #define ATTR_TOUCHSCREEN (1<<5)
240 #define ATTR_KEY (1<<6)
241 #define ATTR_TABLET_PAD (1<<7)
242 
243 /* Key/Button has been run through all input processing and events sent to clients. */
244 #define KEY_PROCESSED 1
245 #define BUTTON_PROCESSED 1
246 /* Key/Button has not been fully processed, no events have been sent. */
247 #define KEY_POSTED 2
248 #define BUTTON_POSTED 2
249 
250 extern _X_EXPORT void set_key_down(DeviceIntPtr pDev, int key_code, int type);
251 extern _X_EXPORT void set_key_up(DeviceIntPtr pDev, int key_code, int type);
252 extern _X_EXPORT int key_is_down(DeviceIntPtr pDev, int key_code, int type);
253 extern _X_EXPORT void set_button_down(DeviceIntPtr pDev, int button, int type);
254 extern _X_EXPORT void set_button_up(DeviceIntPtr pDev, int button, int type);
255 extern _X_EXPORT int button_is_down(DeviceIntPtr pDev, int button, int type);
256 
257 extern void InitCoreDevices(void);
258 extern void InitXTestDevices(void);
259 
260 extern _X_EXPORT DeviceIntPtr AddInputDevice(ClientPtr /*client */ ,
261                                              DeviceProc /*deviceProc */ ,
262                                              Bool /*autoStart */ );
263 
264 extern _X_EXPORT Bool EnableDevice(DeviceIntPtr /*device */ ,
265                                    BOOL /* sendevent */ );
266 
267 extern _X_EXPORT Bool ActivateDevice(DeviceIntPtr /*device */ ,
268                                      BOOL /* sendevent */ );
269 
270 extern _X_EXPORT Bool DisableDevice(DeviceIntPtr /*device */ ,
271                                     BOOL /* sendevent */ );
272 extern void DisableAllDevices(void);
273 extern int InitAndStartDevices(void);
274 
275 extern void CloseDownDevices(void);
276 extern void AbortDevices(void);
277 
278 extern void UndisplayDevices(void);
279 
280 extern _X_EXPORT int RemoveDevice(DeviceIntPtr /*dev */ ,
281                                   BOOL /* sendevent */ );
282 
283 extern _X_EXPORT int NumMotionEvents(void);
284 
285 extern _X_EXPORT int dixLookupDevice(DeviceIntPtr * /* dev */ ,
286                                      int /* id */ ,
287                                      ClientPtr /* client */ ,
288                                      Mask /* access_mode */ );
289 
290 extern _X_EXPORT void QueryMinMaxKeyCodes(KeyCode * /*minCode */ ,
291                                           KeyCode * /*maxCode */ );
292 
293 extern _X_EXPORT Bool InitButtonClassDeviceStruct(DeviceIntPtr /*device */ ,
294                                                   int /*numButtons */ ,
295                                                   Atom * /* labels */ ,
296                                                   CARD8 * /*map */ );
297 
298 extern _X_INTERNAL ValuatorClassPtr AllocValuatorClass(ValuatorClassPtr src,
299                                                        int numAxes);
300 
301 extern _X_EXPORT Bool InitValuatorClassDeviceStruct(DeviceIntPtr /*device */ ,
302                                                     int /*numAxes */ ,
303                                                     Atom * /* labels */ ,
304                                                     int /*numMotionEvents */ ,
305                                                     int /*mode */ );
306 
307 extern _X_EXPORT Bool InitPointerAccelerationScheme(DeviceIntPtr /*dev */ ,
308                                                     int /*scheme */ );
309 
310 extern _X_EXPORT Bool InitFocusClassDeviceStruct(DeviceIntPtr /*device */ );
311 
312 extern _X_EXPORT Bool InitTouchClassDeviceStruct(DeviceIntPtr /*device */ ,
313                                                  unsigned int /*max_touches */ ,
314                                                  unsigned int /*mode */ ,
315                                                  unsigned int /*numAxes */ );
316 
317 typedef void (*BellProcPtr) (int percent,
318                              DeviceIntPtr device,
319                              void *ctrl,
320                              int feedbackClass);
321 
322 typedef void (*KbdCtrlProcPtr) (DeviceIntPtr /*device */ ,
323                                 KeybdCtrl * /*ctrl */ );
324 
325 typedef void (*PtrCtrlProcPtr) (DeviceIntPtr /*device */ ,
326                                 PtrCtrl * /*ctrl */ );
327 
328 extern _X_EXPORT Bool InitPtrFeedbackClassDeviceStruct(DeviceIntPtr /*device */
329                                                        ,
330                                                        PtrCtrlProcPtr
331                                                        /*controlProc */ );
332 
333 typedef void (*StringCtrlProcPtr) (DeviceIntPtr /*device */ ,
334                                    StringCtrl * /*ctrl */ );
335 
336 extern _X_EXPORT Bool InitStringFeedbackClassDeviceStruct(DeviceIntPtr
337                                                           /*device */ ,
338                                                           StringCtrlProcPtr
339                                                           /*controlProc */ ,
340                                                           int /*max_symbols */ ,
341                                                           int
342                                                           /*num_symbols_supported */
343                                                           ,
344                                                           KeySym * /*symbols */
345                                                           );
346 
347 typedef void (*BellCtrlProcPtr) (DeviceIntPtr /*device */ ,
348                                  BellCtrl * /*ctrl */ );
349 
350 extern _X_EXPORT Bool InitBellFeedbackClassDeviceStruct(DeviceIntPtr /*device */
351                                                         ,
352                                                         BellProcPtr
353                                                         /*bellProc */ ,
354                                                         BellCtrlProcPtr
355                                                         /*controlProc */ );
356 
357 typedef void (*LedCtrlProcPtr) (DeviceIntPtr /*device */ ,
358                                 LedCtrl * /*ctrl */ );
359 
360 extern _X_EXPORT Bool InitLedFeedbackClassDeviceStruct(DeviceIntPtr /*device */
361                                                        ,
362                                                        LedCtrlProcPtr
363                                                        /*controlProc */ );
364 
365 typedef void (*IntegerCtrlProcPtr) (DeviceIntPtr /*device */ ,
366                                     IntegerCtrl * /*ctrl */ );
367 
368 extern _X_EXPORT Bool InitIntegerFeedbackClassDeviceStruct(DeviceIntPtr
369                                                            /*device */ ,
370                                                            IntegerCtrlProcPtr
371                                                            /*controlProc */ );
372 
373 extern _X_EXPORT Bool InitPointerDeviceStruct(DevicePtr /*device */ ,
374                                               CARD8 * /*map */ ,
375                                               int /*numButtons */ ,
376                                               Atom * /* btn_labels */ ,
377                                               PtrCtrlProcPtr /*controlProc */ ,
378                                               int /*numMotionEvents */ ,
379                                               int /*numAxes */ ,
380                                               Atom * /* axes_labels */ );
381 
382 extern _X_EXPORT Bool InitKeyboardDeviceStruct(DeviceIntPtr /*device */ ,
383                                                XkbRMLVOSet * /*rmlvo */ ,
384                                                BellProcPtr /*bellProc */ ,
385                                                KbdCtrlProcPtr /*controlProc */
386                                                );
387 
388 extern _X_EXPORT Bool InitKeyboardDeviceStructFromString(DeviceIntPtr dev,
389 							 const char *keymap,
390 							 int keymap_length,
391 							 BellProcPtr bell_func,
392 							 KbdCtrlProcPtr ctrl_func);
393 
394 extern int ApplyPointerMapping(DeviceIntPtr /* pDev */ ,
395                                CARD8 * /* map */ ,
396                                int /* len */ ,
397                                ClientPtr /* client */ );
398 
399 extern Bool BadDeviceMap(BYTE * /*buff */ ,
400                          int /*length */ ,
401                          unsigned /*low */ ,
402                          unsigned /*high */ ,
403                          XID * /*errval */ );
404 
405 extern void NoteLedState(DeviceIntPtr /*keybd */ ,
406                          int /*led */ ,
407                          Bool /*on */ );
408 
409 extern void MaybeStopHint(DeviceIntPtr /*device */ ,
410                           ClientPtr /*client */ );
411 
412 extern void ProcessPointerEvent(InternalEvent * /* ev */ ,
413                                 DeviceIntPtr /*mouse */ );
414 
415 extern void ProcessKeyboardEvent(InternalEvent * /*ev */ ,
416                                  DeviceIntPtr /*keybd */ );
417 
418 extern Bool LegalModifier(unsigned int /*key */ ,
419                           DeviceIntPtr /*pDev */ );
420 
421 extern _X_EXPORT void ProcessInputEvents(void);
422 
423 extern _X_EXPORT void InitInput(int /*argc */ ,
424                                 char ** /*argv */ );
425 extern _X_EXPORT void CloseInput(void);
426 
427 extern _X_EXPORT int GetMaximumEventsNum(void);
428 
429 extern _X_EXPORT InternalEvent *InitEventList(int num_events);
430 extern _X_EXPORT void FreeEventList(InternalEvent *list, int num_events);
431 
432 extern void CreateClassesChangedEvent(InternalEvent *event,
433                                       DeviceIntPtr master,
434                                       DeviceIntPtr slave, int flags);
435 
436 extern InternalEvent *UpdateFromMaster(InternalEvent *events,
437                                        DeviceIntPtr pDev,
438                                        int type, int *num_events);
439 
440 extern _X_EXPORT int GetPointerEvents(InternalEvent *events,
441                                       DeviceIntPtr pDev,
442                                       int type,
443                                       int buttons,
444                                       int flags, const ValuatorMask *mask);
445 
446 extern _X_EXPORT void QueuePointerEvents(DeviceIntPtr pDev,
447                                          int type,
448                                          int buttons,
449                                          int flags, const ValuatorMask *mask);
450 
451 extern _X_EXPORT int GetKeyboardEvents(InternalEvent *events,
452                                        DeviceIntPtr pDev,
453                                        int type,
454                                        int key_code);
455 
456 extern _X_EXPORT void QueueKeyboardEvents(DeviceIntPtr pDev,
457                                           int type,
458                                           int key_code);
459 
460 extern int GetTouchEvents(InternalEvent *events,
461                           DeviceIntPtr pDev,
462                           uint32_t ddx_touchid,
463                           uint16_t type,
464                           uint32_t flags, const ValuatorMask *mask);
465 
466 void QueueTouchEvents(DeviceIntPtr device,
467                       int type,
468                       uint32_t ddx_touchid,
469                       int flags, const ValuatorMask *mask);
470 
471 extern int GetTouchOwnershipEvents(InternalEvent *events,
472                                    DeviceIntPtr pDev,
473                                    TouchPointInfoPtr ti,
474                                    uint8_t mode, XID resource, uint32_t flags);
475 
476 extern void GetDixTouchEnd(InternalEvent *ievent,
477                            DeviceIntPtr dev,
478                            TouchPointInfoPtr ti,
479                            uint32_t flags);
480 
481 extern _X_EXPORT int GetProximityEvents(InternalEvent *events,
482                                         DeviceIntPtr pDev,
483                                         int type, const ValuatorMask *mask);
484 
485 extern _X_EXPORT void QueueProximityEvents(DeviceIntPtr pDev,
486                                            int type, const ValuatorMask *mask);
487 
488 #ifdef PANORAMIX
489 _X_EXPORT
490 #endif
491 extern void PostSyntheticMotion(DeviceIntPtr pDev,
492                                 int x, int y, int screen, unsigned long time);
493 
494 extern _X_EXPORT int GetMotionHistorySize(void);
495 
496 extern _X_EXPORT void AllocateMotionHistory(DeviceIntPtr pDev);
497 
498 extern _X_EXPORT int GetMotionHistory(DeviceIntPtr pDev,
499                                       xTimecoord ** buff,
500                                       unsigned long start,
501                                       unsigned long stop,
502                                       ScreenPtr pScreen, BOOL core);
503 
504 extern void ReleaseButtonsAndKeys(DeviceIntPtr dev);
505 
506 extern int AttachDevice(ClientPtr client,
507                         DeviceIntPtr slave, DeviceIntPtr master);
508 
509 extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd);
510 extern _X_EXPORT DeviceIntPtr GetMaster(DeviceIntPtr dev, int type);
511 
512 extern _X_EXPORT int AllocDevicePair(ClientPtr client,
513                                      const char *name,
514                                      DeviceIntPtr *ptr,
515                                      DeviceIntPtr *keybd,
516                                      DeviceProc ptr_proc,
517                                      DeviceProc keybd_proc, Bool master);
518 extern void DeepCopyDeviceClasses(DeviceIntPtr from,
519                                   DeviceIntPtr to, DeviceChangedEvent *dce);
520 
521 /* Helper functions. */
522 extern _X_EXPORT int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
523                                         KeyCode **modkeymap,
524                                         int *max_keys_per_mod);
525 extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map,
526                          int max_keys_per_mod);
527 extern int AllocXTestDevice(ClientPtr client, const char *name,
528                             DeviceIntPtr *ptr, DeviceIntPtr *keybd,
529                             DeviceIntPtr master_ptr, DeviceIntPtr master_keybd);
530 extern BOOL IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master);
531 extern DeviceIntPtr GetXTestDevice(DeviceIntPtr master);
532 extern void SendDevicePresenceEvent(int deviceid, int type);
533 extern _X_EXPORT InputAttributes *DuplicateInputAttributes(InputAttributes *
534                                                            attrs);
535 extern _X_EXPORT void FreeInputAttributes(InputAttributes * attrs);
536 
537 enum TouchListenerState {
538     LISTENER_AWAITING_BEGIN = 0,   /**< Waiting for a TouchBegin event */
539     LISTENER_AWAITING_OWNER,       /**< Waiting for a TouchOwnership event */
540     LISTENER_EARLY_ACCEPT,         /**< Waiting for ownership, has already
541                                         accepted */
542     LISTENER_IS_OWNER,             /**< Is the current owner, hasn't accepted */
543     LISTENER_HAS_ACCEPTED,         /**< Is the current owner, has accepted */
544     LISTENER_HAS_END,              /**< Has already received the end event */
545 };
546 
547 enum TouchListenerType {
548     LISTENER_GRAB,
549     LISTENER_POINTER_GRAB,
550     LISTENER_REGULAR,
551     LISTENER_POINTER_REGULAR,
552 };
553 
554 extern void TouchInitDDXTouchPoint(DeviceIntPtr dev,
555                                    DDXTouchPointInfoPtr ddxtouch);
556 extern DDXTouchPointInfoPtr TouchBeginDDXTouch(DeviceIntPtr dev,
557                                                uint32_t ddx_id);
558 extern void TouchEndDDXTouch(DeviceIntPtr dev, DDXTouchPointInfoPtr ti);
559 extern DDXTouchPointInfoPtr TouchFindByDDXID(DeviceIntPtr dev,
560                                              uint32_t ddx_id, Bool create);
561 extern Bool TouchInitTouchPoint(TouchClassPtr touch, ValuatorClassPtr v,
562                                 int index);
563 extern void TouchFreeTouchPoint(DeviceIntPtr dev, int index);
564 extern TouchPointInfoPtr TouchBeginTouch(DeviceIntPtr dev, int sourceid,
565                                          uint32_t touchid,
566                                          Bool emulate_pointer);
567 extern TouchPointInfoPtr TouchFindByClientID(DeviceIntPtr dev,
568                                              uint32_t client_id);
569 extern void TouchEndTouch(DeviceIntPtr dev, TouchPointInfoPtr ti);
570 extern Bool TouchEventHistoryAllocate(TouchPointInfoPtr ti);
571 extern void TouchEventHistoryFree(TouchPointInfoPtr ti);
572 extern void TouchEventHistoryPush(TouchPointInfoPtr ti, const DeviceEvent *ev);
573 extern void TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev,
574                                     XID resource);
575 extern Bool TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource);
576 extern void TouchAddListener(TouchPointInfoPtr ti, XID resource, int resource_type,
577                              enum InputLevel level, enum TouchListenerType type,
578                              enum TouchListenerState state, WindowPtr window, GrabPtr grab);
579 extern Bool TouchRemoveListener(TouchPointInfoPtr ti, XID resource);
580 extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti,
581                                 InternalEvent *ev);
582 extern Bool TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
583                              InternalEvent *ev);
584 extern Bool TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite);
585 extern int TouchConvertToPointerEvent(const InternalEvent *ev,
586                                       InternalEvent *motion,
587                                       InternalEvent *button);
588 extern int TouchGetPointerEventType(const InternalEvent *ev);
589 extern void TouchRemovePointerGrab(DeviceIntPtr dev);
590 extern void TouchListenerGone(XID resource);
591 extern int TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti,
592                                      int listener, int mode);
593 extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
594                              uint32_t touchid, Window grab_window, XID *error);
595 extern void TouchEndPhysicallyActiveTouches(DeviceIntPtr dev);
596 extern void TouchDeliverDeviceClassesChangedEvent(TouchPointInfoPtr ti,
597                                                   Time time, XID resource);
598 extern void TouchEmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resource);
599 extern void TouchAcceptAndEnd(DeviceIntPtr dev, int touchid);
600 
601 /* misc event helpers */
602 extern Mask GetEventMask(DeviceIntPtr dev, xEvent *ev, InputClientsPtr clients);
603 extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
604 extern Bool WindowXI2MaskIsset(DeviceIntPtr dev, WindowPtr win, xEvent *ev);
605 extern int GetXI2MaskByte(XI2Mask *mask, DeviceIntPtr dev, int event_type);
606 void FixUpEventFromWindow(SpritePtr pSprite,
607                           xEvent *xE,
608                           WindowPtr pWin, Window child, Bool calcChild);
609 extern Bool PointInBorderSize(WindowPtr pWin, int x, int y);
610 extern WindowPtr XYToWindow(SpritePtr pSprite, int x, int y);
611 extern int EventIsDeliverable(DeviceIntPtr dev, int evtype, WindowPtr win);
612 extern Bool ActivatePassiveGrab(DeviceIntPtr dev, GrabPtr grab,
613                                 InternalEvent *ev, InternalEvent *real_event);
614 /**
615  * Masks specifying the type of event to deliver for an InternalEvent; used
616  * by EventIsDeliverable.
617  * @defgroup EventIsDeliverable return flags
618  * @{
619  */
620 #define EVENT_XI1_MASK                (1 << 0) /**< XI1.x event */
621 #define EVENT_CORE_MASK               (1 << 1) /**< Core event */
622 #define EVENT_DONT_PROPAGATE_MASK     (1 << 2) /**< DontPropagate mask set */
623 #define EVENT_XI2_MASK                (1 << 3) /**< XI2 mask set on window */
624 /* @} */
625 
626 enum EventDeliveryState {
627     EVENT_DELIVERED,     /**< Event has been delivered to a client  */
628     EVENT_NOT_DELIVERED, /**< Event was not delivered to any client */
629     EVENT_SKIP,          /**< Event can be discarded by the caller  */
630     EVENT_REJECTED,      /**< Event was rejected for delivery to the client */
631 };
632 
633 /* Implemented by the DDX. */
634 extern _X_EXPORT int NewInputDeviceRequest(InputOption *options,
635                                            InputAttributes * attrs,
636                                            DeviceIntPtr *dev);
637 extern _X_EXPORT void DeleteInputDeviceRequest(DeviceIntPtr dev);
638 extern _X_EXPORT void RemoveInputDeviceTraces(const char *config_info);
639 
640 extern _X_EXPORT void DDXRingBell(int volume, int pitch, int duration);
641 
642 #define VALUATOR_MODE_ALL_AXES -1
643 extern _X_HIDDEN int valuator_get_mode(DeviceIntPtr dev, int axis);
644 extern _X_HIDDEN void valuator_set_mode(DeviceIntPtr dev, int axis, int mode);
645 
646 /* Set to TRUE by default - os/utils.c sets it to FALSE on user request,
647    xfixes/cursor.c uses it to determine if the cursor is enabled */
648 extern Bool EnableCursor;
649 
650 /* Set to FALSE by default - ChangeWindowAttributes sets it to TRUE on
651  * CWCursor, xfixes/cursor.c uses it to determine if the cursor is enabled
652  */
653 extern Bool CursorVisible;
654 
655 extern _X_EXPORT ValuatorMask *valuator_mask_new(int num_valuators);
656 extern _X_EXPORT void valuator_mask_free(ValuatorMask **mask);
657 extern _X_EXPORT void valuator_mask_set_range(ValuatorMask *mask,
658                                               int first_valuator,
659                                               int num_valuators,
660                                               const int *valuators);
661 extern _X_EXPORT void valuator_mask_set(ValuatorMask *mask, int valuator,
662                                         int data);
663 extern _X_EXPORT void valuator_mask_set_double(ValuatorMask *mask, int valuator,
664                                                double data);
665 extern _X_EXPORT void valuator_mask_zero(ValuatorMask *mask);
666 extern _X_EXPORT int valuator_mask_size(const ValuatorMask *mask);
667 extern _X_EXPORT int valuator_mask_isset(const ValuatorMask *mask, int bit);
668 extern _X_EXPORT void valuator_mask_unset(ValuatorMask *mask, int bit);
669 extern _X_EXPORT int valuator_mask_num_valuators(const ValuatorMask *mask);
670 extern _X_EXPORT void valuator_mask_copy(ValuatorMask *dest,
671                                          const ValuatorMask *src);
672 extern _X_EXPORT int valuator_mask_get(const ValuatorMask *mask, int valnum);
673 extern _X_EXPORT double valuator_mask_get_double(const ValuatorMask *mask,
674                                                  int valnum);
675 extern _X_EXPORT Bool valuator_mask_fetch(const ValuatorMask *mask,
676                                           int valnum, int *val);
677 extern _X_EXPORT Bool valuator_mask_fetch_double(const ValuatorMask *mask,
678                                                  int valnum, double *val);
679 extern _X_EXPORT Bool valuator_mask_has_unaccelerated(const ValuatorMask *mask);
680 extern _X_EXPORT void valuator_mask_set_unaccelerated(ValuatorMask *mask,
681                                                       int valuator,
682                                                       double accel,
683                                                       double unaccel);
684 extern _X_EXPORT void valuator_mask_set_absolute_unaccelerated(ValuatorMask *mask,
685                                                                int valuator,
686                                                                int absolute,
687                                                                double unaccel);
688 extern _X_EXPORT double valuator_mask_get_accelerated(const ValuatorMask *mask,
689                                                       int valuator);
690 extern _X_EXPORT double valuator_mask_get_unaccelerated(const ValuatorMask *mask,
691                                                         int valuator);
692 extern _X_EXPORT Bool valuator_mask_fetch_unaccelerated(const ValuatorMask *mask,
693                                                         int valuator,
694                                                         double *accel,
695                                                         double *unaccel);
696 extern _X_HIDDEN void valuator_mask_drop_unaccelerated(ValuatorMask *mask);
697 
698 /* InputOption handling interface */
699 extern _X_EXPORT InputOption *input_option_new(InputOption *list,
700                                                const char *key,
701                                                const char *value);
702 extern _X_EXPORT void input_option_free_list(InputOption **opt);
703 extern _X_EXPORT InputOption *input_option_free_element(InputOption *opt,
704                                                         const char *key);
705 extern _X_EXPORT InputOption *input_option_find(InputOption *list,
706                                                 const char *key);
707 extern _X_EXPORT const char *input_option_get_key(const InputOption *opt);
708 extern _X_EXPORT const char *input_option_get_value(const InputOption *opt);
709 extern _X_EXPORT void input_option_set_key(InputOption *opt, const char *key);
710 extern _X_EXPORT void input_option_set_value(InputOption *opt,
711                                              const char *value);
712 
713 extern _X_HIDDEN Bool point_on_screen(ScreenPtr pScreen, int x, int y);
714 extern _X_HIDDEN void update_desktop_dimensions(void);
715 
716 extern _X_HIDDEN void input_constrain_cursor(DeviceIntPtr pDev, ScreenPtr screen,
717                                              int current_x, int current_y,
718                                              int dest_x, int dest_y,
719                                              int *out_x, int *out_y,
720                                              int *nevents, InternalEvent* events);
721 
722 extern _X_EXPORT void input_lock(void);
723 extern _X_EXPORT void input_unlock(void);
724 extern _X_EXPORT void input_force_unlock(void);
725 extern _X_EXPORT int in_input_thread(void);
726 
727 extern void InputThreadPreInit(void);
728 extern void InputThreadInit(void);
729 extern void InputThreadFini(void);
730 
731 extern int InputThreadRegisterDev(int fd,
732                                   NotifyFdProcPtr readInputProc,
733                                   void *readInputArgs);
734 
735 extern int InputThreadUnregisterDev(int fd);
736 
737 extern _X_EXPORT Bool InputThreadEnable;
738 
739 #endif                          /* INPUT_H */
740