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