1 /*
2  * Copyright © 1999 Keith Packard
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and its
5  * documentation for any purpose is hereby granted without fee, provided that
6  * the above copyright notice appear in all copies and that both that
7  * copyright notice and this permission notice appear in supporting
8  * documentation, and that the name of Keith Packard not be used in
9  * advertising or publicity pertaining to distribution of the software without
10  * specific, written prior permission.  Keith Packard makes no
11  * representations about the suitability of this software for any purpose.  It
12  * is provided "as is" without express or implied warranty.
13  *
14  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20  * PERFORMANCE OF THIS SOFTWARE.
21  */
22 
23 #ifndef _KDRIVE_H_
24 #define _KDRIVE_H_
25 
26 #include <stdio.h>
27 #include <string.h>
28 #include <X11/X.h>
29 #include <X11/Xproto.h>
30 #include <X11/Xos.h>
31 #include "scrnintstr.h"
32 #include "pixmapstr.h"
33 #include "windowstr.h"
34 #include "servermd.h"
35 #include "colormapst.h"
36 #include "gcstruct.h"
37 #include "input.h"
38 #include "mipointer.h"
39 #include "mi.h"
40 #include "dix.h"
41 #include "fb.h"
42 #include "fboverlay.h"
43 #include "shadow.h"
44 #include "randrstr.h"
45 #include "globals.h"
46 
47 #include "xkbstr.h"
48 
49 #define KD_DPMS_NORMAL	    0
50 #define KD_DPMS_STANDBY	    1
51 #define KD_DPMS_SUSPEND	    2
52 #define KD_DPMS_POWERDOWN   3
53 #define KD_DPMS_MAX	    KD_DPMS_POWERDOWN
54 
55 #define Status int
56 
57 typedef struct _KdCardInfo {
58     struct _KdCardFuncs *cfuncs;
59     void *closure;
60     void *driver;
61     struct _KdScreenInfo *screenList;
62     int selected;
63     struct _KdCardInfo *next;
64 } KdCardInfo;
65 
66 extern KdCardInfo *kdCardInfo;
67 
68 /*
69  * Configuration information per X screen
70  */
71 typedef struct _KdFrameBuffer {
72     CARD8 *frameBuffer;
73     int depth;
74     int bitsPerPixel;
75     int pixelStride;
76     int byteStride;
77     Bool shadow;
78     unsigned long visuals;
79     Pixel redMask, greenMask, blueMask;
80     void *closure;
81 } KdFrameBuffer;
82 
83 #define RR_Rotate_All	(RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270)
84 #define RR_Reflect_All	(RR_Reflect_X|RR_Reflect_Y)
85 
86 typedef struct _KdScreenInfo {
87     struct _KdScreenInfo *next;
88     KdCardInfo *card;
89     ScreenPtr pScreen;
90     void *driver;
91     Rotation randr;             /* rotation and reflection */
92     int x;
93     int y;
94     int width;
95     int height;
96     int rate;
97     int width_mm;
98     int height_mm;
99     int subpixel_order;
100     Bool dumb;
101     Bool softCursor;
102     int mynum;
103     DDXPointRec origin;
104     KdFrameBuffer fb;
105 } KdScreenInfo;
106 
107 typedef struct _KdCardFuncs {
108     Bool (*cardinit) (KdCardInfo *);    /* detect and map device */
109     Bool (*scrinit) (KdScreenInfo *);   /* initialize screen information */
110     Bool (*initScreen) (ScreenPtr);     /* initialize ScreenRec */
111     Bool (*finishInitScreen) (ScreenPtr pScreen);
112     Bool (*createRes) (ScreenPtr);      /* create screen resources */
113     void (*scrfini) (KdScreenInfo *);   /* close down screen */
114     void (*cardfini) (KdCardInfo *);    /* close down */
115 
116     Bool (*initCursor) (ScreenPtr);     /* detect and map cursor */
117 
118     Bool (*initAccel) (ScreenPtr);
119     void (*enableAccel) (ScreenPtr);
120     void (*disableAccel) (ScreenPtr);
121     void (*finiAccel) (ScreenPtr);
122 
123     void (*getColors) (ScreenPtr, int, xColorItem *);
124     void (*putColors) (ScreenPtr, int, xColorItem *);
125 
126     void (*closeScreen) (ScreenPtr);    /* close ScreenRec */
127 } KdCardFuncs;
128 
129 #define KD_MAX_PSEUDO_DEPTH 8
130 #define KD_MAX_PSEUDO_SIZE	    (1 << KD_MAX_PSEUDO_DEPTH)
131 
132 typedef struct {
133     KdScreenInfo *screen;
134     KdCardInfo *card;
135 
136     Bool enabled;
137     Bool closed;
138     int bytesPerPixel;
139 
140     int dpmsState;
141 
142     ColormapPtr pInstalledmap;  /* current colormap */
143     xColorItem systemPalette[KD_MAX_PSEUDO_SIZE];       /* saved windows colors */
144 
145     CreateScreenResourcesProcPtr CreateScreenResources;
146     CloseScreenProcPtr CloseScreen;
147 } KdPrivScreenRec, *KdPrivScreenPtr;
148 
149 typedef enum _kdPointerState {
150     start,
151     button_1_pend,
152     button_1_down,
153     button_2_down,
154     button_3_pend,
155     button_3_down,
156     synth_2_down_13,
157     synth_2_down_3,
158     synth_2_down_1,
159     num_input_states
160 } KdPointerState;
161 
162 #define KD_MAX_BUTTON  32
163 
164 #define KD_KEYBOARD 1
165 #define KD_MOUSE 2
166 #define KD_TOUCHSCREEN 3
167 
168 typedef struct _KdPointerInfo KdPointerInfo;
169 
170 typedef struct _KdPointerDriver {
171     const char *name;
172      Status(*Init) (KdPointerInfo *);
173      Status(*Enable) (KdPointerInfo *);
174     void (*Disable) (KdPointerInfo *);
175     void (*Fini) (KdPointerInfo *);
176     struct _KdPointerDriver *next;
177 } KdPointerDriver;
178 
179 struct _KdPointerInfo {
180     DeviceIntPtr dixdev;
181     char *name;
182     char *path;
183     char *protocol;
184     InputOption *options;
185     int inputClass;
186 
187     CARD8 map[KD_MAX_BUTTON + 1];
188     int nButtons;
189     int nAxes;
190 
191     Bool emulateMiddleButton;
192     unsigned long emulationTimeout;
193     int emulationDx, emulationDy;
194 
195     Bool timeoutPending;
196     KdPointerState mouseState;
197     Bool eventHeld;
198     struct {
199         int type;
200         int x;
201         int y;
202         int z;
203         int flags;
204         int absrel;
205     } heldEvent;
206     unsigned char buttonState;
207     Bool transformCoordinates;
208     int pressureThreshold;
209 
210     KdPointerDriver *driver;
211     void *driverPrivate;
212 
213     struct _KdPointerInfo *next;
214 };
215 
216 void KdAddPointerDriver(KdPointerDriver * driver);
217 void KdRemovePointerDriver(KdPointerDriver * driver);
218 KdPointerInfo *KdNewPointer(void);
219 void KdFreePointer(KdPointerInfo *);
220 int KdAddPointer(KdPointerInfo * ki);
221 int KdAddConfigPointer(char *pointer);
222 void KdRemovePointer(KdPointerInfo * ki);
223 
224 #define KD_KEY_COUNT 248
225 #define KD_MIN_KEYCODE  8
226 #define KD_MAX_KEYCODE  255
227 #define KD_MAX_WIDTH    4
228 #define KD_MAX_LENGTH   (KD_MAX_KEYCODE - KD_MIN_KEYCODE + 1)
229 
230 typedef struct {
231     KeySym modsym;
232     int modbit;
233 } KdKeySymModsRec;
234 
235 typedef struct _KdKeyboardInfo KdKeyboardInfo;
236 
237 typedef struct _KdKeyboardDriver {
238     const char *name;
239     Bool (*Init) (KdKeyboardInfo *);
240     Bool (*Enable) (KdKeyboardInfo *);
241     void (*Leds) (KdKeyboardInfo *, int);
242     void (*Bell) (KdKeyboardInfo *, int, int, int);
243     void (*Disable) (KdKeyboardInfo *);
244     void (*Fini) (KdKeyboardInfo *);
245     struct _KdKeyboardDriver *next;
246 } KdKeyboardDriver;
247 
248 struct _KdKeyboardInfo {
249     struct _KdKeyboardInfo *next;
250     DeviceIntPtr dixdev;
251     void *closure;
252     char *name;
253     char *path;
254     int inputClass;
255     char *xkbRules;
256     char *xkbModel;
257     char *xkbLayout;
258     char *xkbVariant;
259     char *xkbOptions;
260     int LockLed;
261 
262     int minScanCode;
263     int maxScanCode;
264 
265     int leds;
266     int bellPitch;
267     int bellDuration;
268     InputOption *options;
269 
270     KdKeyboardDriver *driver;
271     void *driverPrivate;
272 };
273 
274 void KdAddKeyboardDriver(KdKeyboardDriver * driver);
275 void KdRemoveKeyboardDriver(KdKeyboardDriver * driver);
276 KdKeyboardInfo *KdNewKeyboard(void);
277 void KdFreeKeyboard(KdKeyboardInfo * ki);
278 int KdAddConfigKeyboard(char *pointer);
279 int KdAddKeyboard(KdKeyboardInfo * ki);
280 void KdRemoveKeyboard(KdKeyboardInfo * ki);
281 
282 typedef struct _KdPointerMatrix {
283     int matrix[2][3];
284 } KdPointerMatrix;
285 
286 extern DevPrivateKeyRec kdScreenPrivateKeyRec;
287 
288 #define kdScreenPrivateKey (&kdScreenPrivateKeyRec)
289 
290 extern Bool kdEmulateMiddleButton;
291 extern Bool kdDisableZaphod;
292 
293 #define KdGetScreenPriv(pScreen) ((KdPrivScreenPtr) \
294     dixLookupPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey))
295 #define KdSetScreenPriv(pScreen,v) \
296     dixSetPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey, v)
297 #define KdScreenPriv(pScreen) KdPrivScreenPtr pScreenPriv = KdGetScreenPriv(pScreen)
298 
299 /* kcmap.c */
300 void
301  KdEnableColormap(ScreenPtr pScreen);
302 
303 void
304  KdDisableColormap(ScreenPtr pScreen);
305 
306 void
307  KdInstallColormap(ColormapPtr pCmap);
308 
309 void
310  KdUninstallColormap(ColormapPtr pCmap);
311 
312 int
313  KdListInstalledColormaps(ScreenPtr pScreen, Colormap * pCmaps);
314 
315 void
316  KdStoreColors(ColormapPtr pCmap, int ndef, xColorItem * pdefs);
317 
318 /* kdrive.c */
319 extern miPointerScreenFuncRec kdPointerScreenFuncs;
320 
321 void
322  KdDisableScreen(ScreenPtr pScreen);
323 
324 Bool
325  KdEnableScreen(ScreenPtr pScreen);
326 
327 void
328  KdEnableScreens(void);
329 
330 void
331  KdProcessSwitch(void);
332 
333 Rotation KdAddRotation(Rotation a, Rotation b);
334 
335 Rotation KdSubRotation(Rotation a, Rotation b);
336 
337 void
338  KdParseScreen(KdScreenInfo * screen, const char *arg);
339 
340 const char *
341 KdParseFindNext(const char *cur, const char *delim, char *save, char *last);
342 
343 void
344  KdUseMsg(void);
345 
346 int
347  KdProcessArgument(int argc, char **argv, int i);
348 
349 void
350  KdOsAddInputDrivers(void);
351 
352 void
353  KdInitCard(ScreenInfo * pScreenInfo, KdCardInfo * card, int argc, char **argv);
354 
355 void
356  KdInitOutput(ScreenInfo * pScreenInfo, int argc, char **argv);
357 
358 void
359  KdSetSubpixelOrder(ScreenPtr pScreen, Rotation randr);
360 
361 void
362  KdBacktrace(int signum);
363 
364 /* kinfo.c */
365 KdCardInfo *KdCardInfoAdd(KdCardFuncs * funcs, void *closure);
366 
367 KdCardInfo *KdCardInfoLast(void);
368 
369 void
370  KdCardInfoDispose(KdCardInfo * ci);
371 
372 KdScreenInfo *KdScreenInfoAdd(KdCardInfo * ci);
373 
374 void
375  KdScreenInfoDispose(KdScreenInfo * si);
376 
377 /* kinput.c */
378 void
379  KdInitInput(void);
380 void
381  KdCloseInput(void);
382 
383 void
384 KdEnqueueKeyboardEvent(KdKeyboardInfo * ki, unsigned char scan_code,
385                        unsigned char is_up);
386 
387 #define KD_BUTTON_1	0x01
388 #define KD_BUTTON_2	0x02
389 #define KD_BUTTON_3	0x04
390 #define KD_BUTTON_4	0x08
391 #define KD_BUTTON_5	0x10
392 #define KD_BUTTON_8	0x80
393 #define KD_POINTER_DESKTOP 0x40000000
394 #define KD_MOUSE_DELTA	0x80000000
395 
396 void
397 KdEnqueuePointerEvent(KdPointerInfo * pi, unsigned long flags, int rx, int ry,
398                       int rz);
399 
400 void
401  KdSetPointerMatrix(KdPointerMatrix *pointer);
402 
403 void
404 KdComputePointerMatrix(KdPointerMatrix *pointer, Rotation randr, int width,
405                        int height);
406 
407 void
408 KdBlockHandler(ScreenPtr pScreen, void *timeout);
409 
410 void
411 KdWakeupHandler(ScreenPtr pScreen, int result);
412 
413 void
414  KdDisableInput(void);
415 
416 void
417  KdEnableInput(void);
418 
419 /* kshadow.c */
420 Bool
421  KdShadowFbAlloc(KdScreenInfo * screen, Bool rotate);
422 
423 void
424  KdShadowFbFree(KdScreenInfo * screen);
425 
426 Bool
427 
428 KdShadowSet(ScreenPtr pScreen, int randr, ShadowUpdateProc update,
429             ShadowWindowProc window);
430 
431 void
432  KdShadowUnset(ScreenPtr pScreen);
433 
434 /* function prototypes to be implemented by the drivers */
435 void
436  InitCard(char *name);
437 
438 #endif                          /* _KDRIVE_H_ */
439