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