| 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 <X11/extensions/XI2.h> |
| 60 | |
| 61 | #define DEVICE_INIT 0 |
| 62 | #define DEVICE_ON 1 |
| 63 | #define DEVICE_OFF 2 |
| 64 | #define DEVICE_CLOSE 3 |
| 65 | #define DEVICE_ABORT 4 |
| 66 | |
| 67 | #define POINTER_RELATIVE (1 << 1) |
| 68 | #define POINTER_ABSOLUTE (1 << 2) |
| 69 | #define POINTER_ACCELERATE (1 << 3) |
| 70 | #define POINTER_SCREEN (1 << 4) /* Data in screen coordinates */ |
| 71 | #define POINTER_NORAW (1 << 5) /* Don't generate RawEvents */ |
| 72 | #define POINTER_EMULATED (1 << 6) /* Event was emulated from another event */ |
| 73 | #define POINTER_DESKTOP (1 << 7) /* Data in desktop coordinates */ |
| 74 | |
| 75 | /* GetTouchEvent flags */ |
| 76 | #define TOUCH_ACCEPT (1 << 0) |
| 77 | #define TOUCH_REJECT (1 << 1) |
| 78 | #define TOUCH_PENDING_END (1 << 2) |
| 79 | #define TOUCH_CLIENT_ID (1 << 3) /* touch ID is the client-visible id */ |
| 80 | #define TOUCH_REPLAYING (1 << 4) /* event is being replayed */ |
| 81 | #define TOUCH_POINTER_EMULATED (1 << 5) /* touch event may be pointer emulated */ |
| 82 | #define TOUCH_END (1 << 6) /* really end this touch now */ |
| 83 | |
| 84 | /*int constants for pointer acceleration schemes*/ |
| 85 | #define PtrAccelNoOp 0 |
| 86 | #define PtrAccelPredictable 1 |
| 87 | #define PtrAccelLightweight 2 |
| 88 | #define PtrAccelDefault PtrAccelPredictable |
| 89 | |
| 90 | #define MAX_VALUATORS 36 |
| 91 | /* Maximum number of valuators, divided by six, rounded up, to get number |
| 92 | * of events. */ |
| 93 | #define MAX_VALUATOR_EVENTS 6 |
| 94 | #define MAX_BUTTONS 256 /* completely arbitrarily chosen */ |
| 95 | |
| 96 | #define NO_AXIS_LIMITS -1 |
| 97 | |
| 98 | #define MAP_LENGTH 256 |
| 99 | #define DOWN_LENGTH 32 /* 256/8 => number of bytes to hold 256 bits */ |
| 100 | #define NullGrab ((GrabPtr)NULL) |
| 101 | #define PointerRootWin ((WindowPtr)PointerRoot) |
| 102 | #define NoneWin ((WindowPtr)None) |
| 103 | #define NullDevice ((DevicePtr)NULL) |
| 104 | |
| 105 | #ifndef FollowKeyboard |
| 106 | #define FollowKeyboard 3 |
| 107 | #endif |
| 108 | #ifndef FollowKeyboardWin |
| 109 | #define FollowKeyboardWin ((WindowPtr) FollowKeyboard) |
| 110 | #endif |
| 111 | #ifndef RevertToFollowKeyboard |
| 112 | #define RevertToFollowKeyboard 3 |
| 113 | #endif |
| 114 | |
| 115 | enum InputLevel { |
| 116 | CORE = 1, |
| 117 | XI = 2, |
| 118 | XI2 = 3, |
| 119 | }; |
| 120 | |
| 121 | typedef unsigned long Leds; |
| 122 | typedef struct _OtherClients *OtherClientsPtr; |
| 123 | typedef struct _InputClients *InputClientsPtr; |
| 124 | typedef struct _DeviceIntRec *DeviceIntPtr; |
| 125 | typedef struct _ValuatorClassRec *ValuatorClassPtr; |
| 126 | typedef struct _ClassesRec *ClassesPtr; |
| 127 | typedef struct _SpriteRec *SpritePtr; |
| 128 | typedef struct _TouchClassRec *TouchClassPtr; |
| 129 | typedef struct _TouchPointInfo *TouchPointInfoPtr; |
| 130 | typedef struct _DDXTouchPointInfo *DDXTouchPointInfoPtr; |
| 131 | typedef union _GrabMask GrabMask; |
| 132 | |
| 133 | typedef struct _ValuatorMask ValuatorMask; |
| 134 | |
| 135 | /* The DIX stores incoming input events in this list */ |
| 136 | extern InternalEvent *InputEventList; |
| 137 | |
| 138 | typedef int (*DeviceProc) (DeviceIntPtr /*device */ , |
| 139 | int /*what */ ); |
| 140 | |
| 141 | typedef void (*ProcessInputProc) (InternalEvent * /*event */ , |
| 142 | DeviceIntPtr /*device */ ); |
| 143 | |
| 144 | typedef Bool (*DeviceHandleProc) (DeviceIntPtr /*device */ , |
| 145 | void * /*data */ |
| 146 | ); |
| 147 | |
| 148 | typedef void (*DeviceUnwrapProc) (DeviceIntPtr /*device */ , |
| 149 | DeviceHandleProc /*proc */ , |
| 150 | void * /*data */ |
| 151 | ); |
| 152 | |
| 153 | /* pointer acceleration handling */ |
| 154 | typedef void (*PointerAccelSchemeProc) (DeviceIntPtr /*device */ , |
| 155 | ValuatorMask * /*valuators */ , |
| 156 | CARD32 /*evtime */ ); |
| 157 | |
| 158 | typedef void (*DeviceCallbackProc) (DeviceIntPtr /*pDev */ ); |
| 159 | |
| 160 | struct _ValuatorAccelerationRec; |
| 161 | typedef Bool (*PointerAccelSchemeInitProc) (DeviceIntPtr /*dev */ , |
| 162 | struct _ValuatorAccelerationRec * |
| 163 | /*protoScheme */ ); |
| 164 | |
| 165 | typedef struct _DeviceRec { |
| 166 | pointer devicePrivate; |
| 167 | ProcessInputProc processInputProc; /* current */ |
| 168 | ProcessInputProc realInputProc; /* deliver */ |
| 169 | ProcessInputProc enqueueInputProc; /* enqueue */ |
| 170 | Bool on; /* used by DDX to keep state */ |
| 171 | } DeviceRec, *DevicePtr; |
| 172 | |
| 173 | typedef struct { |
| 174 | int click, bell, bell_pitch, bell_duration; |
| 175 | Bool autoRepeat; |
| 176 | unsigned char autoRepeats[32]; |
| 177 | Leds leds; |
| 178 | unsigned char id; |
| 179 | } KeybdCtrl; |
| 180 | |
| 181 | typedef struct { |
| 182 | KeySym *map; |
| 183 | KeyCode minKeyCode, maxKeyCode; |
| 184 | int mapWidth; |
| 185 | } KeySymsRec, *KeySymsPtr; |
| 186 | |
| 187 | typedef struct { |
| 188 | int num, den, threshold; |
| 189 | unsigned char id; |
| 190 | } PtrCtrl; |
| 191 | |
| 192 | typedef struct { |
| 193 | int resolution, min_value, max_value; |
| 194 | int integer_displayed; |
| 195 | unsigned char id; |
| 196 | } IntegerCtrl; |
| 197 | |
| 198 | typedef struct { |
| 199 | int max_symbols, num_symbols_supported; |
| 200 | int num_symbols_displayed; |
| 201 | KeySym *symbols_supported; |
| 202 | KeySym *symbols_displayed; |
| 203 | unsigned char id; |
| 204 | } StringCtrl; |
| 205 | |
| 206 | typedef struct { |
| 207 | int percent, pitch, duration; |
| 208 | unsigned char id; |
| 209 | } BellCtrl; |
| 210 | |
| 211 | typedef struct { |
| 212 | Leds led_values; |
| 213 | Mask led_mask; |
| 214 | unsigned char id; |
| 215 | } LedCtrl; |
| 216 | |
| 217 | extern _X_EXPORT KeybdCtrl defaultKeyboardControl; |
| 218 | extern _X_EXPORT PtrCtrl defaultPointerControl; |
| 219 | |
| 220 | typedef struct _InputOption InputOption; |
| 221 | typedef struct _XI2Mask XI2Mask; |
| 222 | |
| 223 | typedef struct _InputAttributes { |
| 224 | char *product; |
| 225 | char *vendor; |
| 226 | char *device; |
| 227 | char *pnp_id; |
| 228 | char *usb_id; |
| 229 | char **tags; /* null-terminated */ |
| 230 | uint32_t flags; |
| 231 | } InputAttributes; |
| 232 | |
| 233 | #define ATTR_KEYBOARD (1<<0) |
| 234 | #define ATTR_POINTER (1<<1) |
| 235 | #define ATTR_JOYSTICK (1<<2) |
| 236 | #define ATTR_TABLET (1<<3) |
| 237 | #define ATTR_TOUCHPAD (1<<4) |
| 238 | #define ATTR_TOUCHSCREEN (1<<5) |
| 239 | |
| 240 | /* Key/Button has been run through all input processing and events sent to clients. */ |
| 241 | #define KEY_PROCESSED 1 |
| 242 | #define BUTTON_PROCESSED 1 |
| 243 | /* Key/Button has not been fully processed, no events have been sent. */ |
| 244 | #define KEY_POSTED 2 |
| 245 | #define BUTTON_POSTED 2 |
| 246 | |
| 247 | extern _X_EXPORT void set_key_down(DeviceIntPtr pDev, int key_code, int type); |
| 248 | extern _X_EXPORT void set_key_up(DeviceIntPtr pDev, int key_code, int type); |
| 249 | extern _X_EXPORT int key_is_down(DeviceIntPtr pDev, int key_code, int type); |
| 250 | extern _X_EXPORT void set_button_down(DeviceIntPtr pDev, int button, int type); |
| 251 | extern _X_EXPORT void set_button_up(DeviceIntPtr pDev, int button, int type); |
| 252 | extern _X_EXPORT int button_is_down(DeviceIntPtr pDev, int button, int type); |
| 253 | |
| 254 | extern void InitCoreDevices(void); |
| 255 | extern void InitXTestDevices(void); |
| 256 | |
| 257 | extern _X_EXPORT DeviceIntPtr AddInputDevice(ClientPtr /*client */ , |
| 258 | DeviceProc /*deviceProc */ , |
| 259 | Bool /*autoStart */ ); |
| 260 | |
| 261 | extern _X_EXPORT Bool EnableDevice(DeviceIntPtr /*device */ , |
| 262 | BOOL /* sendevent */ ); |
| 263 | |
| 264 | extern _X_EXPORT Bool ActivateDevice(DeviceIntPtr /*device */ , |
| 265 | BOOL /* sendevent */ ); |
| 266 | |
| 267 | extern _X_EXPORT Bool DisableDevice(DeviceIntPtr /*device */ , |
| 268 | BOOL /* sendevent */ ); |
| 269 | extern void DisableAllDevices(void); |
| 270 | extern int InitAndStartDevices(void); |
| 271 | |
| 272 | extern void CloseDownDevices(void); |
| 273 | extern void AbortDevices(void); |
| 274 | |
| 275 | extern void UndisplayDevices(void); |
| 276 | |
| 277 | extern _X_EXPORT int RemoveDevice(DeviceIntPtr /*dev */ , |
| 278 | BOOL /* sendevent */ ); |
| 279 | |
| 280 | extern _X_EXPORT int NumMotionEvents(void); |
| 281 | |
| 282 | extern _X_EXPORT int dixLookupDevice(DeviceIntPtr * /* dev */ , |
| 283 | int /* id */ , |
| 284 | ClientPtr /* client */ , |
| 285 | Mask /* access_mode */ ); |
| 286 | |
| 287 | extern _X_EXPORT void QueryMinMaxKeyCodes(KeyCode * /*minCode */ , |
| 288 | KeyCode * /*maxCode */ ); |
| 289 | |
| 290 | extern _X_EXPORT Bool SetKeySymsMap(KeySymsPtr /*dst */ , |
| 291 | KeySymsPtr /*src */ ); |
| 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 | pointer /*ctrl */ , |
| 320 | int); |
| 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 int ApplyPointerMapping(DeviceIntPtr /* pDev */ , |
| 389 | CARD8 * /* map */ , |
| 390 | int /* len */ , |
| 391 | ClientPtr /* client */ ); |
| 392 | |
| 393 | extern Bool BadDeviceMap(BYTE * /*buff */ , |
| 394 | int /*length */ , |
| 395 | unsigned /*low */ , |
| 396 | unsigned /*high */ , |
| 397 | XID * /*errval */ ); |
| 398 | |
| 399 | extern void NoteLedState(DeviceIntPtr /*keybd */ , |
| 400 | int /*led */ , |
| 401 | Bool /*on */ ); |
| 402 | |
| 403 | extern void MaybeStopHint(DeviceIntPtr /*device */ , |
| 404 | ClientPtr /*client */ ); |
| 405 | |
| 406 | extern void ProcessPointerEvent(InternalEvent * /* ev */ , |
| 407 | DeviceIntPtr /*mouse */ ); |
| 408 | |
| 409 | extern void ProcessKeyboardEvent(InternalEvent * /*ev */ , |
| 410 | DeviceIntPtr /*keybd */ ); |
| 411 | |
| 412 | extern Bool LegalModifier(unsigned int /*key */ , |
| 413 | DeviceIntPtr /*pDev */ ); |
| 414 | |
| 415 | extern _X_EXPORT void ProcessInputEvents(void); |
| 416 | |
| 417 | extern _X_EXPORT void InitInput(int /*argc */ , |
| 418 | char ** /*argv */ ); |
| 419 | extern _X_EXPORT void CloseInput(void); |
| 420 | |
| 421 | extern _X_EXPORT int GetMaximumEventsNum(void); |
| 422 | |
| 423 | extern _X_EXPORT InternalEvent *InitEventList(int num_events); |
| 424 | extern _X_EXPORT void FreeEventList(InternalEvent *list, int num_events); |
| 425 | |
| 426 | extern void CreateClassesChangedEvent(InternalEvent *event, |
| 427 | DeviceIntPtr master, |
| 428 | DeviceIntPtr slave, int flags); |
| 429 | |
| 430 | extern InternalEvent *UpdateFromMaster(InternalEvent *events, |
| 431 | DeviceIntPtr pDev, |
| 432 | int type, int *num_events); |
| 433 | |
| 434 | extern _X_EXPORT int GetPointerEvents(InternalEvent *events, |
| 435 | DeviceIntPtr pDev, |
| 436 | int type, |
| 437 | int buttons, |
| 438 | int flags, const ValuatorMask *mask); |
| 439 | |
| 440 | extern _X_EXPORT void QueuePointerEvents(DeviceIntPtr pDev, |
| 441 | int type, |
| 442 | int buttons, |
| 443 | int flags, const ValuatorMask *mask); |
| 444 | |
| 445 | extern _X_EXPORT int GetKeyboardEvents(InternalEvent *events, |
| 446 | DeviceIntPtr pDev, |
| 447 | int type, |
| 448 | int key_code, const ValuatorMask *mask); |
| 449 | |
| 450 | extern _X_EXPORT void QueueKeyboardEvents(DeviceIntPtr pDev, |
| 451 | int type, |
| 452 | int key_code, |
| 453 | const ValuatorMask *mask); |
| 454 | |
| 455 | extern int GetTouchEvents(InternalEvent *events, |
| 456 | DeviceIntPtr pDev, |
| 457 | uint32_t ddx_touchid, |
| 458 | uint16_t type, |
| 459 | uint32_t flags, const ValuatorMask *mask); |
| 460 | |
| 461 | void QueueTouchEvents(DeviceIntPtr device, |
| 462 | int type, |
| 463 | uint32_t ddx_touchid, |
| 464 | int flags, const ValuatorMask *mask); |
| 465 | |
| 466 | extern int GetTouchOwnershipEvents(InternalEvent *events, |
| 467 | DeviceIntPtr pDev, |
| 468 | TouchPointInfoPtr ti, |
| 469 | uint8_t mode, XID resource, uint32_t flags); |
| 470 | |
| 471 | extern void GetDixTouchEnd(InternalEvent *ievent, |
| 472 | DeviceIntPtr dev, |
| 473 | TouchPointInfoPtr ti, |
| 474 | uint32_t flags); |
| 475 | |
| 476 | extern _X_EXPORT int GetProximityEvents(InternalEvent *events, |
| 477 | DeviceIntPtr pDev, |
| 478 | int type, const ValuatorMask *mask); |
| 479 | |
| 480 | extern _X_EXPORT void QueueProximityEvents(DeviceIntPtr pDev, |
| 481 | int type, const ValuatorMask *mask); |
| 482 | |
| 483 | #ifdef PANORAMIX |
| 484 | _X_EXPORT |
| 485 | #endif |
| 486 | extern void PostSyntheticMotion(DeviceIntPtr pDev, |
| 487 | int x, int y, int screen, unsigned long time); |
| 488 | |
| 489 | extern _X_EXPORT int GetMotionHistorySize(void); |
| 490 | |
| 491 | extern _X_EXPORT void AllocateMotionHistory(DeviceIntPtr pDev); |
| 492 | |
| 493 | extern _X_EXPORT int GetMotionHistory(DeviceIntPtr pDev, |
| 494 | xTimecoord ** buff, |
| 495 | unsigned long start, |
| 496 | unsigned long stop, |
| 497 | ScreenPtr pScreen, BOOL core); |
| 498 | |
| 499 | extern void ReleaseButtonsAndKeys(DeviceIntPtr dev); |
| 500 | |
| 501 | extern int AttachDevice(ClientPtr client, |
| 502 | DeviceIntPtr slave, DeviceIntPtr master); |
| 503 | |
| 504 | extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd); |
| 505 | extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type); |
| 506 | |
| 507 | extern _X_EXPORT int AllocDevicePair(ClientPtr client, |
| 508 | const char *name, |
| 509 | DeviceIntPtr *ptr, |
| 510 | DeviceIntPtr *keybd, |
| 511 | DeviceProc ptr_proc, |
| 512 | DeviceProc keybd_proc, Bool master); |
| 513 | extern void DeepCopyDeviceClasses(DeviceIntPtr from, |
| 514 | DeviceIntPtr to, DeviceChangedEvent *dce); |
| 515 | |
| 516 | /* Helper functions. */ |
| 517 | extern _X_EXPORT int generate_modkeymap(ClientPtr client, DeviceIntPtr dev, |
| 518 | KeyCode **modkeymap, |
| 519 | int *max_keys_per_mod); |
| 520 | extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map, |
| 521 | int max_keys_per_mod); |
| 522 | extern int AllocXTestDevice(ClientPtr client, const char *name, |
| 523 | DeviceIntPtr *ptr, DeviceIntPtr *keybd, |
| 524 | DeviceIntPtr master_ptr, DeviceIntPtr master_keybd); |
| 525 | extern BOOL IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master); |
| 526 | extern DeviceIntPtr GetXTestDevice(DeviceIntPtr master); |
| 527 | extern void SendDevicePresenceEvent(int deviceid, int type); |
| 528 | extern _X_EXPORT InputAttributes *DuplicateInputAttributes(InputAttributes * |
| 529 | attrs); |
| 530 | extern _X_EXPORT void FreeInputAttributes(InputAttributes * attrs); |
| 531 | |
| 532 | enum TouchListenerState { |
| 533 | LISTENER_AWAITING_BEGIN = 0, /**< Waiting for a TouchBegin event */ |
| 534 | LISTENER_AWAITING_OWNER, /**< Waiting for a TouchOwnership event */ |
| 535 | LISTENER_EARLY_ACCEPT, /**< Waiting for ownership, has already |
| 536 | accepted */ |
| 537 | LISTENER_IS_OWNER, /**< Is the current owner, hasn't accepted */ |
| 538 | LISTENER_HAS_ACCEPTED, /**< Is the current owner, has accepted */ |
| 539 | LISTENER_HAS_END, /**< Has already received the end event */ |
| 540 | }; |
| 541 | |
| 542 | enum TouchListenerType { |
| 543 | LISTENER_GRAB, |
| 544 | LISTENER_POINTER_GRAB, |
| 545 | LISTENER_REGULAR, |
| 546 | LISTENER_POINTER_REGULAR, |
| 547 | }; |
| 548 | |
| 549 | extern void TouchInitDDXTouchPoint(DeviceIntPtr dev, |
| 550 | DDXTouchPointInfoPtr ddxtouch); |
| 551 | extern DDXTouchPointInfoPtr TouchBeginDDXTouch(DeviceIntPtr dev, |
| 552 | uint32_t ddx_id); |
| 553 | extern void TouchEndDDXTouch(DeviceIntPtr dev, DDXTouchPointInfoPtr ti); |
| 554 | extern DDXTouchPointInfoPtr TouchFindByDDXID(DeviceIntPtr dev, |
| 555 | uint32_t ddx_id, Bool create); |
| 556 | extern Bool TouchInitTouchPoint(TouchClassPtr touch, ValuatorClassPtr v, |
| 557 | int index); |
| 558 | extern void TouchFreeTouchPoint(DeviceIntPtr dev, int index); |
| 559 | extern TouchPointInfoPtr TouchBeginTouch(DeviceIntPtr dev, int sourceid, |
| 560 | uint32_t touchid, |
| 561 | Bool emulate_pointer); |
| 562 | extern TouchPointInfoPtr TouchFindByClientID(DeviceIntPtr dev, |
| 563 | uint32_t client_id); |
| 564 | extern void TouchEndTouch(DeviceIntPtr dev, TouchPointInfoPtr ti); |
| 565 | extern Bool TouchEventHistoryAllocate(TouchPointInfoPtr ti); |
| 566 | extern void TouchEventHistoryFree(TouchPointInfoPtr ti); |
| 567 | extern void TouchEventHistoryPush(TouchPointInfoPtr ti, const DeviceEvent *ev); |
| 568 | extern void TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, |
| 569 | XID resource); |
| 570 | extern Bool TouchResourceIsOwner(TouchPointInfoPtr ti, XID resource); |
| 571 | extern void TouchAddListener(TouchPointInfoPtr ti, XID resource, int resource_type, |
| 572 | enum InputLevel level, enum TouchListenerType type, |
| 573 | enum TouchListenerState state, WindowPtr window, GrabPtr grab); |
| 574 | extern Bool TouchRemoveListener(TouchPointInfoPtr ti, XID resource); |
| 575 | extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, |
| 576 | InternalEvent *ev); |
| 577 | extern Bool TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, |
| 578 | InternalEvent *ev); |
| 579 | extern Bool TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite); |
| 580 | extern int TouchConvertToPointerEvent(const InternalEvent *ev, |
| 581 | InternalEvent *motion, |
| 582 | InternalEvent *button); |
| 583 | extern int TouchGetPointerEventType(const InternalEvent *ev); |
| 584 | extern void TouchRemovePointerGrab(DeviceIntPtr dev); |
| 585 | extern void TouchListenerGone(XID resource); |
| 586 | extern int TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti, |
| 587 | int listener, int mode); |
| 588 | extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, |
| 589 | uint32_t touchid, Window grab_window, XID *error); |
| 590 | extern void TouchEndPhysicallyActiveTouches(DeviceIntPtr dev); |
| 591 | extern void TouchDeliverDeviceClassesChangedEvent(TouchPointInfoPtr ti, |
| 592 | Time time, XID resource); |
| 593 | extern void TouchEmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resource); |
| 594 | extern void TouchAcceptAndEnd(DeviceIntPtr dev, int touchid); |
| 595 | |
| 596 | /* misc event helpers */ |
| 597 | extern Mask GetEventMask(DeviceIntPtr dev, xEvent *ev, InputClientsPtr clients); |
| 598 | extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event); |
| 599 | extern Bool WindowXI2MaskIsset(DeviceIntPtr dev, WindowPtr win, xEvent *ev); |
| 600 | extern int GetXI2MaskByte(XI2Mask *mask, DeviceIntPtr dev, int event_type); |
| 601 | void FixUpEventFromWindow(SpritePtr pSprite, |
| 602 | xEvent *xE, |
| 603 | WindowPtr pWin, Window child, Bool calcChild); |
| 604 | extern WindowPtr XYToWindow(SpritePtr pSprite, int x, int y); |
| 605 | extern int EventIsDeliverable(DeviceIntPtr dev, int evtype, WindowPtr win); |
| 606 | extern Bool ActivatePassiveGrab(DeviceIntPtr dev, GrabPtr grab, |
| 607 | InternalEvent *ev, InternalEvent *real_event); |
| 608 | /** |
| 609 | * Masks specifying the type of event to deliver for an InternalEvent; used |
| 610 | * by EventIsDeliverable. |
| 611 | * @defgroup EventIsDeliverable return flags |
| 612 | * @{ |
| 613 | */ |
| 614 | #define EVENT_XI1_MASK (1 << 0) /**< XI1.x event */ |
| 615 | #define EVENT_CORE_MASK (1 << 1) /**< Core event */ |
| 616 | #define EVENT_DONT_PROPAGATE_MASK (1 << 2) /**< DontPropagate mask set */ |
| 617 | #define EVENT_XI2_MASK (1 << 3) /**< XI2 mask set on window */ |
| 618 | /* @} */ |
| 619 | |
| 620 | enum EventDeliveryState { |
| 621 | EVENT_DELIVERED, /**< Event has been delivered to a client */ |
| 622 | EVENT_NOT_DELIVERED, /**< Event was not delivered to any client */ |
| 623 | EVENT_SKIP, /**< Event can be discarded by the caller */ |
| 624 | EVENT_REJECTED, /**< Event was rejected for delivery to the client */ |
| 625 | }; |
| 626 | |
| 627 | /* Implemented by the DDX. */ |
| 628 | extern _X_EXPORT int NewInputDeviceRequest(InputOption *options, |
| 629 | InputAttributes * attrs, |
| 630 | DeviceIntPtr *dev); |
| 631 | extern _X_EXPORT void DeleteInputDeviceRequest(DeviceIntPtr dev); |
| 632 | |
| 633 | extern _X_EXPORT void DDXRingBell(int volume, int pitch, int duration); |
| 634 | |
| 635 | #define VALUATOR_MODE_ALL_AXES -1 |
| 636 | extern _X_HIDDEN int valuator_get_mode(DeviceIntPtr dev, int axis); |
| 637 | extern _X_HIDDEN void valuator_set_mode(DeviceIntPtr dev, int axis, int mode); |
| 638 | |
| 639 | /* Set to TRUE by default - os/utils.c sets it to FALSE on user request, |
| 640 | xfixes/cursor.c uses it to determine if the cursor is enabled */ |
| 641 | extern Bool EnableCursor; |
| 642 | |
| 643 | /* Set to FALSE by default - ChangeWindowAttributes sets it to TRUE on |
| 644 | * CWCursor, xfixes/cursor.c uses it to determine if the cursor is enabled |
| 645 | */ |
| 646 | extern Bool CursorVisible; |
| 647 | |
| 648 | extern _X_EXPORT ValuatorMask *valuator_mask_new(int num_valuators); |
| 649 | extern _X_EXPORT void valuator_mask_free(ValuatorMask **mask); |
| 650 | extern _X_EXPORT void valuator_mask_set_range(ValuatorMask *mask, |
| 651 | int first_valuator, |
| 652 | int num_valuators, |
| 653 | const int *valuators); |
| 654 | extern _X_EXPORT void valuator_mask_set(ValuatorMask *mask, int valuator, |
| 655 | int data); |
| 656 | extern _X_EXPORT void valuator_mask_set_double(ValuatorMask *mask, int valuator, |
| 657 | double data); |
| 658 | extern _X_EXPORT void valuator_mask_zero(ValuatorMask *mask); |
| 659 | extern _X_EXPORT int valuator_mask_size(const ValuatorMask *mask); |
| 660 | extern _X_EXPORT int valuator_mask_isset(const ValuatorMask *mask, int bit); |
| 661 | extern _X_EXPORT void valuator_mask_unset(ValuatorMask *mask, int bit); |
| 662 | extern _X_EXPORT int valuator_mask_num_valuators(const ValuatorMask *mask); |
| 663 | extern _X_EXPORT void valuator_mask_copy(ValuatorMask *dest, |
| 664 | const ValuatorMask *src); |
| 665 | extern _X_EXPORT int valuator_mask_get(const ValuatorMask *mask, int valnum); |
| 666 | extern _X_EXPORT double valuator_mask_get_double(const ValuatorMask *mask, |
| 667 | int valnum); |
| 668 | extern _X_EXPORT Bool valuator_mask_fetch(const ValuatorMask *mask, |
| 669 | int valnum, int *val); |
| 670 | extern _X_EXPORT Bool valuator_mask_fetch_double(const ValuatorMask *mask, |
| 671 | int valnum, double *val); |
| 672 | |
| 673 | /* InputOption handling interface */ |
| 674 | extern _X_EXPORT InputOption *input_option_new(InputOption *list, |
| 675 | const char *key, |
| 676 | const char *value); |
| 677 | extern _X_EXPORT void input_option_free_list(InputOption **opt); |
| 678 | extern _X_EXPORT InputOption *input_option_free_element(InputOption *opt, |
| 679 | const char *key); |
| 680 | extern _X_EXPORT InputOption *input_option_find(InputOption *list, |
| 681 | const char *key); |
| 682 | extern _X_EXPORT const char *input_option_get_key(const InputOption *opt); |
| 683 | extern _X_EXPORT const char *input_option_get_value(const InputOption *opt); |
| 684 | extern _X_EXPORT void input_option_set_key(InputOption *opt, const char *key); |
| 685 | extern _X_EXPORT void input_option_set_value(InputOption *opt, |
| 686 | const char *value); |
| 687 | |
| 688 | extern _X_HIDDEN Bool point_on_screen(ScreenPtr pScreen, int x, int y); |
| 689 | extern _X_HIDDEN void update_desktop_dimensions(void); |
| 690 | |
| 691 | extern _X_HIDDEN void input_constrain_cursor(DeviceIntPtr pDev, ScreenPtr screen, |
| 692 | int current_x, int current_y, |
| 693 | int dest_x, int dest_y, |
| 694 | int *out_x, int *out_y, |
| 695 | int *nevents, InternalEvent* events); |
| 696 | |
| 697 | #endif /* INPUT_H */ |