input.h revision 706f2543
1/************************************************************ 2 3Copyright 1987, 1998 The Open Group 4 5Permission to use, copy, modify, distribute, and sell this software and its 6documentation for any purpose is hereby granted without fee, provided that 7the above copyright notice appear in all copies and that both that 8copyright notice and this permission notice appear in supporting 9documentation. 10 11The above copyright notice and this permission notice shall be included in 12all copies or substantial portions of the Software. 13 14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 21Except as contained in this notice, the name of The Open Group shall not be 22used in advertising or otherwise to promote the sale, use or other dealings 23in this Software without prior written authorization from The Open Group. 24 25 26Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. 27 28 All Rights Reserved 29 30Permission to use, copy, modify, and distribute this software and its 31documentation for any purpose and without fee is hereby granted, 32provided that the above copyright notice appear in all copies and that 33both that copyright notice and this permission notice appear in 34supporting documentation, and that the name of Digital not be 35used in advertising or publicity pertaining to distribution of the 36software without specific, written prior permission. 37 38DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 39ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 40DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 41ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 42WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 43ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 44SOFTWARE. 45 46********************************************************/ 47 48#ifndef INPUT_H 49#define INPUT_H 50 51#include "misc.h" 52#include "screenint.h" 53#include <X11/Xmd.h> 54#include <X11/Xproto.h> 55#include <stdint.h> 56#include "window.h" /* for WindowPtr */ 57#include "xkbrules.h" 58#include "events.h" 59 60#define DEVICE_INIT 0 61#define DEVICE_ON 1 62#define DEVICE_OFF 2 63#define DEVICE_CLOSE 3 64 65#define POINTER_RELATIVE (1 << 1) 66#define POINTER_ABSOLUTE (1 << 2) 67#define POINTER_ACCELERATE (1 << 3) 68#define POINTER_SCREEN (1 << 4) /* Data in screen coordinates */ 69#define POINTER_NORAW (1 << 5) /* Don't generate RawEvents */ 70 71/*int constants for pointer acceleration schemes*/ 72#define PtrAccelNoOp 0 73#define PtrAccelPredictable 1 74#define PtrAccelLightweight 2 75#define PtrAccelDefault PtrAccelPredictable 76 77#define MAX_VALUATORS 36 78/* Maximum number of valuators, divided by six, rounded up, to get number 79 * of events. */ 80#define MAX_VALUATOR_EVENTS 6 81#define MAX_BUTTONS 256 /* completely arbitrarily chosen */ 82 83#define NO_AXIS_LIMITS -1 84 85#define MAP_LENGTH 256 86#define DOWN_LENGTH 32 /* 256/8 => number of bytes to hold 256 bits */ 87#define NullGrab ((GrabPtr)NULL) 88#define PointerRootWin ((WindowPtr)PointerRoot) 89#define NoneWin ((WindowPtr)None) 90#define NullDevice ((DevicePtr)NULL) 91 92#ifndef FollowKeyboard 93#define FollowKeyboard 3 94#endif 95#ifndef FollowKeyboardWin 96#define FollowKeyboardWin ((WindowPtr) FollowKeyboard) 97#endif 98#ifndef RevertToFollowKeyboard 99#define RevertToFollowKeyboard 3 100#endif 101 102typedef unsigned long Leds; 103typedef struct _OtherClients *OtherClientsPtr; 104typedef struct _InputClients *InputClientsPtr; 105typedef struct _DeviceIntRec *DeviceIntPtr; 106typedef struct _ValuatorClassRec *ValuatorClassPtr; 107typedef struct _ClassesRec *ClassesPtr; 108typedef struct _SpriteRec *SpritePtr; 109typedef union _GrabMask GrabMask; 110 111typedef struct _EventList { 112 xEvent* event; 113 int evlen; /* length of allocated memory for event in bytes. This is not 114 the actual length of the event. The event's actual length is 115 32 for standard events or 32 + 116 ((xGenericEvent*)event)->length * 4 for GenericEvents. 117 For events in the EQ, the length is 118 ((InternalEvent*)event)->u.any.length */ 119} EventList, *EventListPtr; 120 121/* The DIX stores incoming input events in this list */ 122extern EventListPtr InputEventList; 123extern int InputEventListLen; 124 125typedef int (*DeviceProc)( 126 DeviceIntPtr /*device*/, 127 int /*what*/); 128 129typedef void (*ProcessInputProc)( 130 InternalEvent * /*event*/, 131 DeviceIntPtr /*device*/); 132 133typedef Bool (*DeviceHandleProc)( 134 DeviceIntPtr /*device*/, 135 void* /*data*/ 136 ); 137 138typedef void (*DeviceUnwrapProc)( 139 DeviceIntPtr /*device*/, 140 DeviceHandleProc /*proc*/, 141 void* /*data*/ 142 ); 143 144/* pointer acceleration handling */ 145typedef void (*PointerAccelSchemeProc)( 146 DeviceIntPtr /*pDev*/, 147 int /*first_valuator*/, 148 int /*num_valuators*/, 149 int* /*valuators*/, 150 int /*evtime*/); 151 152typedef void (*DeviceCallbackProc)( 153 DeviceIntPtr /*pDev*/); 154 155typedef struct _DeviceRec { 156 pointer devicePrivate; 157 ProcessInputProc processInputProc; /* current */ 158 ProcessInputProc realInputProc; /* deliver */ 159 ProcessInputProc enqueueInputProc; /* enqueue */ 160 Bool on; /* used by DDX to keep state */ 161} DeviceRec, *DevicePtr; 162 163typedef struct _ValuatorMask ValuatorMask; 164 165typedef struct { 166 int click, bell, bell_pitch, bell_duration; 167 Bool autoRepeat; 168 unsigned char autoRepeats[32]; 169 Leds leds; 170 unsigned char id; 171} KeybdCtrl; 172 173typedef struct { 174 KeySym *map; 175 KeyCode minKeyCode, 176 maxKeyCode; 177 int mapWidth; 178} KeySymsRec, *KeySymsPtr; 179 180typedef struct { 181 int num, den, threshold; 182 unsigned char id; 183} PtrCtrl; 184 185typedef struct { 186 int resolution, min_value, max_value; 187 int integer_displayed; 188 unsigned char id; 189} IntegerCtrl; 190 191typedef struct { 192 int max_symbols, num_symbols_supported; 193 int num_symbols_displayed; 194 KeySym *symbols_supported; 195 KeySym *symbols_displayed; 196 unsigned char id; 197} StringCtrl; 198 199typedef struct { 200 int percent, pitch, duration; 201 unsigned char id; 202} BellCtrl; 203 204typedef struct { 205 Leds led_values; 206 Mask led_mask; 207 unsigned char id; 208} LedCtrl; 209 210extern _X_EXPORT KeybdCtrl defaultKeyboardControl; 211extern _X_EXPORT PtrCtrl defaultPointerControl; 212 213typedef struct _InputOption { 214 char *key; 215 char *value; 216 struct _InputOption *next; 217} InputOption; 218 219typedef struct _InputAttributes { 220 char *product; 221 char *vendor; 222 char *device; 223 char *pnp_id; 224 char *usb_id; 225 char **tags; /* null-terminated */ 226 uint32_t flags; 227} InputAttributes; 228 229#define ATTR_KEYBOARD (1<<0) 230#define ATTR_POINTER (1<<1) 231#define ATTR_JOYSTICK (1<<2) 232#define ATTR_TABLET (1<<3) 233#define ATTR_TOUCHPAD (1<<4) 234#define ATTR_TOUCHSCREEN (1<<5) 235 236/* Key/Button has been run through all input processing and events sent to clients. */ 237#define KEY_PROCESSED 1 238#define BUTTON_PROCESSED 1 239/* Key/Button has not been fully processed, no events have been sent. */ 240#define KEY_POSTED 2 241#define BUTTON_POSTED 2 242 243extern void set_key_down(DeviceIntPtr pDev, int key_code, int type); 244extern void set_key_up(DeviceIntPtr pDev, int key_code, int type); 245extern int key_is_down(DeviceIntPtr pDev, int key_code, int type); 246extern void set_button_down(DeviceIntPtr pDev, int button, int type); 247extern void set_button_up(DeviceIntPtr pDev, int button, int type); 248extern int button_is_down(DeviceIntPtr pDev, int button, int type); 249 250extern void InitCoreDevices(void); 251extern void InitXTestDevices(void); 252 253extern _X_EXPORT DeviceIntPtr AddInputDevice( 254 ClientPtr /*client*/, 255 DeviceProc /*deviceProc*/, 256 Bool /*autoStart*/); 257 258extern _X_EXPORT Bool EnableDevice( 259 DeviceIntPtr /*device*/, 260 BOOL /* sendevent */); 261 262extern _X_EXPORT Bool ActivateDevice( 263 DeviceIntPtr /*device*/, 264 BOOL /* sendevent */); 265 266extern _X_EXPORT Bool DisableDevice( 267 DeviceIntPtr /*device*/, 268 BOOL /* sendevent */); 269 270extern int InitAndStartDevices(void); 271 272extern void CloseDownDevices(void); 273 274extern void UndisplayDevices(void); 275 276extern _X_EXPORT int RemoveDevice( 277 DeviceIntPtr /*dev*/, 278 BOOL /* sendevent */); 279 280extern _X_EXPORT int NumMotionEvents(void); 281 282extern _X_EXPORT int dixLookupDevice( 283 DeviceIntPtr * /* dev */, 284 int /* id */, 285 ClientPtr /* client */, 286 Mask /* access_mode */); 287 288extern _X_EXPORT void QueryMinMaxKeyCodes( 289 KeyCode* /*minCode*/, 290 KeyCode* /*maxCode*/); 291 292extern _X_EXPORT Bool SetKeySymsMap( 293 KeySymsPtr /*dst*/, 294 KeySymsPtr /*src*/); 295 296extern _X_EXPORT Bool InitButtonClassDeviceStruct( 297 DeviceIntPtr /*device*/, 298 int /*numButtons*/, 299 Atom* /* labels */, 300 CARD8* /*map*/); 301 302extern _X_INTERNAL ValuatorClassPtr AllocValuatorClass( 303 ValuatorClassPtr src, 304 int numAxes); 305 306extern _X_EXPORT Bool InitValuatorClassDeviceStruct( 307 DeviceIntPtr /*device*/, 308 int /*numAxes*/, 309 Atom* /* labels */, 310 int /*numMotionEvents*/, 311 int /*mode*/); 312 313extern _X_EXPORT Bool InitPointerAccelerationScheme( 314 DeviceIntPtr /*dev*/, 315 int /*scheme*/); 316 317extern _X_EXPORT Bool InitAbsoluteClassDeviceStruct( 318 DeviceIntPtr /*device*/); 319 320extern _X_EXPORT Bool InitFocusClassDeviceStruct( 321 DeviceIntPtr /*device*/); 322 323typedef void (*BellProcPtr)( 324 int /*percent*/, 325 DeviceIntPtr /*device*/, 326 pointer /*ctrl*/, 327 int); 328 329typedef void (*KbdCtrlProcPtr)( 330 DeviceIntPtr /*device*/, 331 KeybdCtrl * /*ctrl*/); 332 333typedef void (*PtrCtrlProcPtr)( 334 DeviceIntPtr /*device*/, 335 PtrCtrl * /*ctrl*/); 336 337extern _X_EXPORT Bool InitPtrFeedbackClassDeviceStruct( 338 DeviceIntPtr /*device*/, 339 PtrCtrlProcPtr /*controlProc*/); 340 341typedef void (*StringCtrlProcPtr)( 342 DeviceIntPtr /*device*/, 343 StringCtrl * /*ctrl*/); 344 345extern _X_EXPORT Bool InitStringFeedbackClassDeviceStruct( 346 DeviceIntPtr /*device*/, 347 StringCtrlProcPtr /*controlProc*/, 348 int /*max_symbols*/, 349 int /*num_symbols_supported*/, 350 KeySym* /*symbols*/); 351 352typedef void (*BellCtrlProcPtr)( 353 DeviceIntPtr /*device*/, 354 BellCtrl * /*ctrl*/); 355 356extern _X_EXPORT Bool InitBellFeedbackClassDeviceStruct( 357 DeviceIntPtr /*device*/, 358 BellProcPtr /*bellProc*/, 359 BellCtrlProcPtr /*controlProc*/); 360 361typedef void (*LedCtrlProcPtr)( 362 DeviceIntPtr /*device*/, 363 LedCtrl * /*ctrl*/); 364 365extern _X_EXPORT Bool InitLedFeedbackClassDeviceStruct( 366 DeviceIntPtr /*device*/, 367 LedCtrlProcPtr /*controlProc*/); 368 369typedef void (*IntegerCtrlProcPtr)( 370 DeviceIntPtr /*device*/, 371 IntegerCtrl * /*ctrl*/); 372 373 374extern _X_EXPORT Bool InitIntegerFeedbackClassDeviceStruct( 375 DeviceIntPtr /*device*/, 376 IntegerCtrlProcPtr /*controlProc*/); 377 378extern _X_EXPORT Bool InitPointerDeviceStruct( 379 DevicePtr /*device*/, 380 CARD8* /*map*/, 381 int /*numButtons*/, 382 Atom* /* btn_labels */, 383 PtrCtrlProcPtr /*controlProc*/, 384 int /*numMotionEvents*/, 385 int /*numAxes*/, 386 Atom* /* axes_labels */); 387 388extern _X_EXPORT Bool InitKeyboardDeviceStruct( 389 DeviceIntPtr /*device*/, 390 XkbRMLVOSet * /*rmlvo*/, 391 BellProcPtr /*bellProc*/, 392 KbdCtrlProcPtr /*controlProc*/); 393 394extern int ApplyPointerMapping( 395 DeviceIntPtr /* pDev */, 396 CARD8 * /* map */, 397 int /* len */, 398 ClientPtr /* client */); 399 400extern Bool BadDeviceMap( 401 BYTE* /*buff*/, 402 int /*length*/, 403 unsigned /*low*/, 404 unsigned /*high*/, 405 XID* /*errval*/); 406 407extern void NoteLedState( 408 DeviceIntPtr /*keybd*/, 409 int /*led*/, 410 Bool /*on*/); 411 412extern void MaybeStopHint( 413 DeviceIntPtr /*device*/, 414 ClientPtr /*client*/); 415 416extern void ProcessPointerEvent( 417 InternalEvent* /* ev */, 418 DeviceIntPtr /*mouse*/); 419 420extern void ProcessKeyboardEvent( 421 InternalEvent* /*ev*/, 422 DeviceIntPtr /*keybd*/); 423 424extern Bool LegalModifier( 425 unsigned int /*key*/, 426 DeviceIntPtr /*pDev*/); 427 428extern _X_EXPORT void ProcessInputEvents(void); 429 430extern _X_EXPORT void InitInput( 431 int /*argc*/, 432 char ** /*argv*/); 433extern _X_EXPORT void CloseInput(void); 434 435extern _X_EXPORT int GetMaximumEventsNum(void); 436 437extern _X_EXPORT int GetEventList(EventListPtr* list); 438extern _X_EXPORT EventListPtr InitEventList(int num_events); 439extern _X_EXPORT void FreeEventList(EventListPtr list, int num_events); 440 441extern void CreateClassesChangedEvent(EventListPtr event, 442 DeviceIntPtr master, 443 DeviceIntPtr slave, 444 int type); 445extern EventListPtr UpdateFromMaster( 446 EventListPtr events, 447 DeviceIntPtr pDev, 448 int type, 449 int *num_events); 450 451extern _X_EXPORT int GetPointerEvents( 452 EventListPtr events, 453 DeviceIntPtr pDev, 454 int type, 455 int buttons, 456 int flags, 457 const ValuatorMask *mask); 458 459extern _X_EXPORT int GetKeyboardEvents( 460 EventListPtr events, 461 DeviceIntPtr pDev, 462 int type, 463 int key_code); 464 465extern int GetKeyboardValuatorEvents( 466 EventListPtr events, 467 DeviceIntPtr pDev, 468 int type, 469 int key_code, 470 const ValuatorMask *mask); 471 472extern int GetProximityEvents( 473 EventListPtr events, 474 DeviceIntPtr pDev, 475 int type, 476 const ValuatorMask *mask); 477 478extern void PostSyntheticMotion( 479 DeviceIntPtr pDev, 480 int x, 481 int y, 482 int screen, 483 unsigned long time); 484 485extern _X_EXPORT int GetMotionHistorySize( 486 void); 487 488extern _X_EXPORT void AllocateMotionHistory( 489 DeviceIntPtr pDev); 490 491extern _X_EXPORT int GetMotionHistory( 492 DeviceIntPtr pDev, 493 xTimecoord **buff, 494 unsigned long start, 495 unsigned long stop, 496 ScreenPtr pScreen, 497 BOOL core); 498 499extern void ReleaseButtonsAndKeys(DeviceIntPtr dev); 500 501extern int AttachDevice(ClientPtr client, 502 DeviceIntPtr slave, 503 DeviceIntPtr master); 504 505extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd); 506extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type); 507 508extern _X_EXPORT int AllocDevicePair(ClientPtr client, 509 char* name, 510 DeviceIntPtr* ptr, 511 DeviceIntPtr* keybd, 512 DeviceProc ptr_proc, 513 DeviceProc keybd_proc, 514 Bool master); 515extern void DeepCopyDeviceClasses(DeviceIntPtr from, 516 DeviceIntPtr to, 517 DeviceChangedEvent *dce); 518 519/* Helper functions. */ 520extern _X_EXPORT int generate_modkeymap(ClientPtr client, DeviceIntPtr dev, 521 KeyCode **modkeymap, int *max_keys_per_mod); 522extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map, 523 int max_keys_per_mod); 524extern int AllocXTestDevice(ClientPtr client, 525 char* name, 526 DeviceIntPtr* ptr, 527 DeviceIntPtr* keybd, 528 DeviceIntPtr master_ptr, 529 DeviceIntPtr master_keybd); 530extern BOOL IsXTestDevice(DeviceIntPtr dev, DeviceIntPtr master); 531extern DeviceIntPtr GetXTestDevice(DeviceIntPtr master); 532extern void SendDevicePresenceEvent(int deviceid, int type); 533extern _X_EXPORT InputAttributes *DuplicateInputAttributes(InputAttributes *attrs); 534extern _X_EXPORT void FreeInputAttributes(InputAttributes *attrs); 535 536/* misc event helpers */ 537extern Mask GetEventMask(DeviceIntPtr dev, xEvent* ev, InputClientsPtr clients); 538extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event); 539extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev); 540void FixUpEventFromWindow(SpritePtr pSprite, 541 xEvent *xE, 542 WindowPtr pWin, 543 Window child, 544 Bool calcChild); 545extern WindowPtr XYToWindow(SpritePtr pSprite, int x, int y); 546extern int EventIsDeliverable(DeviceIntPtr dev, InternalEvent* event, 547 WindowPtr win); 548/** 549 * Return masks for EventIsDeliverable. 550 * @defgroup EventIsDeliverable return flags 551 * @{ 552 */ 553#define XI_MASK (1 << 0) /**< XI mask set on window */ 554#define CORE_MASK (1 << 1) /**< Core mask set on window */ 555#define DONT_PROPAGATE_MASK (1 << 2) /**< DontPropagate mask set on window */ 556#define XI2_MASK (1 << 3) /**< XI2 mask set on window */ 557/* @} */ 558 559/* Implemented by the DDX. */ 560extern _X_EXPORT int NewInputDeviceRequest( 561 InputOption *options, 562 InputAttributes *attrs, 563 DeviceIntPtr *dev); 564extern _X_EXPORT void DeleteInputDeviceRequest( 565 DeviceIntPtr dev); 566 567extern _X_EXPORT void DDXRingBell( 568 int volume, 569 int pitch, 570 int duration); 571 572#define VALUATOR_MODE_ALL_AXES -1 573extern _X_HIDDEN int valuator_get_mode(DeviceIntPtr dev, int axis); 574extern _X_HIDDEN void valuator_set_mode(DeviceIntPtr dev, int axis, int mode); 575 576/* Set to TRUE by default - os/utils.c sets it to FALSE on user request, 577 xfixes/cursor.c uses it to determine if the cursor is enabled */ 578extern Bool EnableCursor; 579 580extern _X_EXPORT ValuatorMask *valuator_mask_new(int num_valuators); 581extern _X_EXPORT void valuator_mask_free(ValuatorMask **mask); 582extern _X_EXPORT void valuator_mask_set_range(ValuatorMask *mask, 583 int first_valuator, int num_valuators, 584 const int* valuators); 585extern _X_EXPORT void valuator_mask_set(ValuatorMask *mask, 586 int valuator, 587 int data); 588extern _X_EXPORT void valuator_mask_zero(ValuatorMask *mask); 589extern _X_EXPORT int valuator_mask_size(const ValuatorMask *mask); 590extern _X_EXPORT int valuator_mask_isset(const ValuatorMask *mask, int bit); 591extern _X_EXPORT void valuator_mask_unset(ValuatorMask *mask, int bit); 592extern _X_EXPORT int valuator_mask_num_valuators(const ValuatorMask *mask); 593extern _X_EXPORT void valuator_mask_copy(ValuatorMask *dest, 594 const ValuatorMask *src); 595extern _X_EXPORT int valuator_mask_get(const ValuatorMask *mask, int valnum); 596 597#endif /* INPUT_H */ 598