1 /*
2  * Copyright 2002 Red Hat Inc., Durham, North Carolina.
3  *
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation on the rights to use, copy, modify, merge,
10  * publish, distribute, sublicense, and/or sell copies of the Software,
11  * and to permit persons to whom the Software is furnished to do so,
12  * subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial
16  * portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21  * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
22  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25  * SOFTWARE.
26  */
27 
28 /*
29  * Authors:
30  *   Rickard E. (Rik) Faith <faith@redhat.com>
31  *
32  */
33 
34 /** \file
35  * Interface for low-level input support.  \see dmxinputinit.c */
36 
37 #ifndef _DMXINPUTINIT_H_
38 #define _DMXINPUTINIT_H_
39 
40 #include "dmx.h"
41 #include "dmxinput.h"
42 #include "dmxlog.h"
43 
44 #define DMX_LOCAL_DEFAULT_KEYBOARD "kbd"
45 #define DMX_LOCAL_DEFAULT_POINTER  "ps2"
46 #define DMX_MAX_BUTTONS            256
47 #define DMX_MOTION_SIZE            256
48 #define DMX_MAX_VALUATORS          32
49 #define DMX_MAX_AXES               32
50 #define DMX_MAX_XINPUT_EVENT_TYPES 100
51 #define DMX_MAP_ENTRIES            16   /* Must be a power of 2 */
52 #define DMX_MAP_MASK               (DMX_MAP_ENTRIES - 1)
53 
54 typedef enum {
55     DMX_FUNCTION_GRAB,
56     DMX_FUNCTION_TERMINATE,
57     DMX_FUNCTION_FINE
58 } DMXFunctionType;
59 
60 typedef enum {
61     DMX_LOCAL_HIGHLEVEL,
62     DMX_LOCAL_KEYBOARD,
63     DMX_LOCAL_MOUSE,
64     DMX_LOCAL_OTHER
65 } DMXLocalInputType;
66 
67 typedef enum {
68     DMX_LOCAL_TYPE_LOCAL,
69     DMX_LOCAL_TYPE_CONSOLE,
70     DMX_LOCAL_TYPE_BACKEND,
71     DMX_LOCAL_TYPE_COMMON
72 } DMXLocalInputExtType;
73 
74 typedef enum {
75     DMX_RELATIVE,
76     DMX_ABSOLUTE,
77     DMX_ABSOLUTE_CONFINED
78 } DMXMotionType;
79 
80 /** Stores information from low-level device that is used to initialize
81  * the device at the dix level. */
82 typedef struct _DMXLocalInitInfo {
83     int keyboard;                  /**< Non-zero if the device is a keyboard */
84 
85     int keyClass;                  /**< Non-zero if keys are present */
86     KeySymsRec keySyms;            /**< Key symbols */
87     int freemap;                   /**< If non-zero, free keySyms.map */
88     CARD8 modMap[MAP_LENGTH];                /**< Modifier map */
89     XkbDescPtr xkb;                 /**< XKB description */
90     XkbComponentNamesRec names;     /**< XKB component names */
91     int freenames;                  /**< Non-zero if names should be free'd */
92     int force;                      /**< Do not allow command line override */
93 
94     int buttonClass;                  /**< Non-zero if buttons are present */
95     int numButtons;                   /**< Number of buttons */
96     unsigned char map[DMX_MAX_BUTTONS];        /**< Button map */
97 
98     int valuatorClass;                  /**< Non-zero if valuators are
99                                          * present */
100     int numRelAxes;                     /**< Number of relative axes */
101     int numAbsAxes;                     /**< Number of absolute axes */
102     int minval[DMX_MAX_AXES];                  /**< Minimum values */
103     int maxval[DMX_MAX_AXES];                  /**< Maximum values */
104     int res[DMX_MAX_AXES];                     /**< Resolution */
105     int minres[DMX_MAX_AXES];                  /**< Minimum resolutions */
106     int maxres[DMX_MAX_AXES];                  /**< Maximum resolutions */
107 
108     int focusClass;                        /**< Non-zero if device can
109                                             * cause focus */
110     int proximityClass;                    /**< Non-zero if device
111                                             * causes proximity events */
112     int kbdFeedbackClass;                  /**< Non-zero if device has
113                                             * keyboard feedback */
114     int ptrFeedbackClass;                  /**< Non-zero if device has
115                                             * pointer feedback */
116     int ledFeedbackClass;                  /**< Non-zero if device has
117                                             * LED indicators */
118     int belFeedbackClass;                  /**< Non-zero if device has a
119                                             * bell */
120     int intFeedbackClass;                  /**< Non-zero if device has
121                                             * integer feedback */
122     int strFeedbackClass;                  /**< Non-zero if device has
123                                             * string feedback */
124 
125     int maxSymbols;                           /**< Maximum symbols */
126     int maxSymbolsSupported;                  /**< Maximum symbols supported */
127     KeySym *symbols;                          /**< Key symbols */
128 } DMXLocalInitInfo, *DMXLocalInitInfoPtr;
129 
130 typedef void *(*dmxCreatePrivateProcPtr) (DeviceIntPtr);
131 typedef void (*dmxDestroyPrivateProcPtr) (void *);
132 
133 typedef void (*dmxInitProcPtr) (DevicePtr);
134 typedef void (*dmxReInitProcPtr) (DevicePtr);
135 typedef void (*dmxLateReInitProcPtr) (DevicePtr);
136 typedef void (*dmxGetInfoProcPtr) (DevicePtr, DMXLocalInitInfoPtr);
137 typedef int (*dmxOnProcPtr) (DevicePtr);
138 typedef void (*dmxOffProcPtr) (DevicePtr);
139 typedef void (*dmxUpdatePositionProcPtr) (void *, int x, int y);
140 
141 typedef void (*dmxVTPreSwitchProcPtr) (void *);        /* Turn I/O Off */
142 typedef void (*dmxVTPostSwitchProcPtr) (void *);       /* Turn I/O On */
143 typedef void (*dmxVTSwitchReturnProcPtr) (void *);
144 typedef int (*dmxVTSwitchProcPtr) (void *, int vt,
145                                    dmxVTSwitchReturnProcPtr, void *);
146 
147 typedef void (*dmxMotionProcPtr) (DevicePtr,
148                                   int *valuators,
149                                   int firstAxis,
150                                   int axesCount,
151                                   DMXMotionType type, DMXBlockType block);
152 typedef void (*dmxEnqueueProcPtr) (DevicePtr, int type, int detail,
153                                    KeySym keySym, XEvent * e,
154                                    DMXBlockType block);
155 typedef int (*dmxCheckSpecialProcPtr) (DevicePtr, KeySym keySym);
156 typedef void (*dmxCollectEventsProcPtr) (DevicePtr,
157                                          dmxMotionProcPtr,
158                                          dmxEnqueueProcPtr,
159                                          dmxCheckSpecialProcPtr, DMXBlockType);
160 typedef void (*dmxProcessInputProcPtr) (void *);
161 typedef void (*dmxUpdateInfoProcPtr) (void *, DMXUpdateType, WindowPtr);
162 typedef int (*dmxFunctionsProcPtr) (void *, DMXFunctionType);
163 
164 typedef void (*dmxKBCtrlProcPtr) (DevicePtr, KeybdCtrl * ctrl);
165 typedef void (*dmxMCtrlProcPtr) (DevicePtr, PtrCtrl * ctrl);
166 typedef void (*dmxKBBellProcPtr) (DevicePtr, int percent,
167                                   int volume, int pitch, int duration);
168 
169 /** Stores a mapping between the device id on the remote X server and
170  * the id on the DMX server */
171 typedef struct _DMXEventMap {
172     int remote;                 /**< Event number on remote X server */
173     int server;                 /**< Event number (unbiased) on DMX server */
174 } DMXEventMap;
175 
176 /** This is the device-independent structure used by the low-level input
177  * routines.  The contents are not exposed to top-level .c files (except
178  * dmxextensions.c).  \see dmxinput.h \see dmxextensions.c */
179 typedef struct _DMXLocalInputInfo {
180     const char *name;                 /**< Device name */
181     DMXLocalInputType type;           /**< Device type  */
182     DMXLocalInputExtType extType;     /**< Extended device type */
183     int binding;                      /**< Count of how many consecutive
184                                        * structs are bound to the same
185                                        * device */
186 
187     /* Low-level (e.g., keyboard/mouse drivers) */
188 
189     dmxCreatePrivateProcPtr create_private;   /**< Create
190                                                * device-dependent
191                                                * private */
192     dmxDestroyPrivateProcPtr destroy_private; /**< Destroy
193                                                * device-dependent
194                                                * private */
195     dmxInitProcPtr init;                      /**< Initialize device  */
196     dmxReInitProcPtr reinit;                  /**< Reinitialize device
197                                                * (during a
198                                                * reconfiguration) */
199     dmxLateReInitProcPtr latereinit;          /**< Reinitialize a device
200                                                * (called very late
201                                                * during a
202                                                * reconfiguration) */
203     dmxGetInfoProcPtr get_info;               /**< Get device information */
204     dmxOnProcPtr on;                          /**< Turn device on */
205     dmxOffProcPtr off;                        /**< Turn device off */
206     dmxUpdatePositionProcPtr update_position; /**< Called when another
207                                                * device updates the
208                                                * cursor position */
209     dmxVTPreSwitchProcPtr vt_pre_switch;      /**< Called before a VT switch */
210     dmxVTPostSwitchProcPtr vt_post_switch;    /**< Called after a VT switch */
211     dmxVTSwitchProcPtr vt_switch;             /**< Causes a VT switch */
212 
213     dmxCollectEventsProcPtr collect_events;   /**< Collect and enqueue
214                                                * events from the
215                                                * device*/
216     dmxProcessInputProcPtr process_input;     /**< Process event (from
217                                                * queue)  */
218     dmxFunctionsProcPtr functions;
219     dmxUpdateInfoProcPtr update_info;         /**< Update window layout
220                                                * information */
221 
222     dmxMCtrlProcPtr mCtrl;                    /**< Pointer control */
223     dmxKBCtrlProcPtr kCtrl;                   /**< Keyboard control */
224     dmxKBBellProcPtr kBell;                   /**< Bell control */
225 
226     void *private;                            /**< Device-dependent private  */
227     int isCore;                               /**< Is a DMX core device  */
228     int sendsCore;                            /**< Sends DMX core events */
229     KeybdCtrl kctrl;                          /**< Keyboard control */
230     PtrCtrl mctrl;                            /**< Pointer control */
231 
232     DeviceIntPtr pDevice;                     /**< X-level device  */
233     int inputIdx;                             /**< High-level index */
234     int lastX, lastY;                         /**< Last known position;
235                                                * for XInput in
236                                                * dmxevents.c */
237 
238     int head;                                 /**< XInput motion history
239                                                * head */
240     int tail;                                 /**< XInput motion history
241                                                * tail */
242     unsigned long *history;                   /**< XInput motion history */
243     int *valuators;                           /**< Cache of previous values */
244 
245     /* for XInput ChangePointerDevice */
246     int (*savedMotionProc) (DeviceIntPtr,
247                             xTimecoord *,
248                             unsigned long, unsigned long, ScreenPtr);
249     int savedMotionEvents;                      /**< Saved motion events */
250     int savedSendsCore;                         /**< Saved sends-core flag */
251 
252     DMXEventMap map[DMX_MAP_ENTRIES];              /**< XInput device id map */
253     int mapOptimize;                               /**< XInput device id
254                                                     * map
255                                                     * optimization */
256 
257     long deviceId;                        /**< device id on remote side,
258                                            * if any */
259     const char *deviceName;               /**< devive name on remote
260                                            * side, if any */
261 } DMXLocalInputInfoRec;
262 
263 extern DMXLocalInputInfoPtr dmxLocalCorePointer, dmxLocalCoreKeyboard;
264 
265 extern void dmxLocalInitInput(DMXInputInfo * dmxInput);
266 extern DMXLocalInputInfoPtr dmxInputCopyLocal(DMXInputInfo * dmxInput,
267                                               DMXLocalInputInfoPtr s);
268 
269 extern void dmxChangePointerControl(DeviceIntPtr pDevice, PtrCtrl * ctrl);
270 extern void dmxKeyboardKbdCtrlProc(DeviceIntPtr pDevice, KeybdCtrl * ctrl);
271 extern void dmxKeyboardBellProc(int percent, DeviceIntPtr pDevice,
272                                 void *ctrl, int unknown);
273 
274 extern int dmxInputExtensionErrorHandler(Display * dsp, _Xconst char *name,
275                                          _Xconst char *reason);
276 
277 extern int dmxInputDetach(DMXInputInfo * dmxInput);
278 extern void dmxInputDetachAll(DMXScreenInfo * dmxScreen);
279 extern int dmxInputDetachId(int id);
280 extern DMXInputInfo *dmxInputLocateId(int id);
281 extern int dmxInputAttachConsole(const char *name, int isCore, int *id);
282 extern int dmxInputAttachBackend(int physicalScreen, int isCore, int *id);
283 
284 #endif
285