439 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			439 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright © 1999 Keith Packard
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software and its
 | |
|  * documentation for any purpose is hereby granted without fee, provided that
 | |
|  * the above copyright notice appear in all copies and that both that
 | |
|  * copyright notice and this permission notice appear in supporting
 | |
|  * documentation, and that the name of Keith Packard not be used in
 | |
|  * advertising or publicity pertaining to distribution of the software without
 | |
|  * specific, written prior permission.  Keith Packard makes no
 | |
|  * representations about the suitability of this software for any purpose.  It
 | |
|  * is provided "as is" without express or implied warranty.
 | |
|  *
 | |
|  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | |
|  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | |
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | |
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | |
|  * PERFORMANCE OF THIS SOFTWARE.
 | |
|  */
 | |
| 
 | |
| #ifndef _KDRIVE_H_
 | |
| #define _KDRIVE_H_
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include <X11/X.h>
 | |
| #include <X11/Xproto.h>
 | |
| #include <X11/Xos.h>
 | |
| #include "scrnintstr.h"
 | |
| #include "pixmapstr.h"
 | |
| #include "windowstr.h"
 | |
| #include "servermd.h"
 | |
| #include "colormapst.h"
 | |
| #include "gcstruct.h"
 | |
| #include "input.h"
 | |
| #include "mipointer.h"
 | |
| #include "mi.h"
 | |
| #include "dix.h"
 | |
| #include "fb.h"
 | |
| #include "fboverlay.h"
 | |
| #include "shadow.h"
 | |
| #include "randrstr.h"
 | |
| #include "globals.h"
 | |
| 
 | |
| #include "xkbstr.h"
 | |
| 
 | |
| #define KD_DPMS_NORMAL	    0
 | |
| #define KD_DPMS_STANDBY	    1
 | |
| #define KD_DPMS_SUSPEND	    2
 | |
| #define KD_DPMS_POWERDOWN   3
 | |
| #define KD_DPMS_MAX	    KD_DPMS_POWERDOWN
 | |
| 
 | |
| #define Status int
 | |
| 
 | |
| typedef struct _KdCardInfo {
 | |
|     struct _KdCardFuncs *cfuncs;
 | |
|     void *closure;
 | |
|     void *driver;
 | |
|     struct _KdScreenInfo *screenList;
 | |
|     int selected;
 | |
|     struct _KdCardInfo *next;
 | |
| } KdCardInfo;
 | |
| 
 | |
| extern KdCardInfo *kdCardInfo;
 | |
| 
 | |
| /*
 | |
|  * Configuration information per X screen
 | |
|  */
 | |
| typedef struct _KdFrameBuffer {
 | |
|     CARD8 *frameBuffer;
 | |
|     int depth;
 | |
|     int bitsPerPixel;
 | |
|     int pixelStride;
 | |
|     int byteStride;
 | |
|     Bool shadow;
 | |
|     unsigned long visuals;
 | |
|     Pixel redMask, greenMask, blueMask;
 | |
|     void *closure;
 | |
| } KdFrameBuffer;
 | |
| 
 | |
| #define RR_Rotate_All	(RR_Rotate_0|RR_Rotate_90|RR_Rotate_180|RR_Rotate_270)
 | |
| #define RR_Reflect_All	(RR_Reflect_X|RR_Reflect_Y)
 | |
| 
 | |
| typedef struct _KdScreenInfo {
 | |
|     struct _KdScreenInfo *next;
 | |
|     KdCardInfo *card;
 | |
|     ScreenPtr pScreen;
 | |
|     void *driver;
 | |
|     Rotation randr;             /* rotation and reflection */
 | |
|     int x;
 | |
|     int y;
 | |
|     int width;
 | |
|     int height;
 | |
|     int rate;
 | |
|     int width_mm;
 | |
|     int height_mm;
 | |
|     int subpixel_order;
 | |
|     Bool dumb;
 | |
|     Bool softCursor;
 | |
|     int mynum;
 | |
|     DDXPointRec origin;
 | |
|     KdFrameBuffer fb;
 | |
| } KdScreenInfo;
 | |
| 
 | |
| typedef struct _KdCardFuncs {
 | |
|     Bool (*cardinit) (KdCardInfo *);    /* detect and map device */
 | |
|     Bool (*scrinit) (KdScreenInfo *);   /* initialize screen information */
 | |
|     Bool (*initScreen) (ScreenPtr);     /* initialize ScreenRec */
 | |
|     Bool (*finishInitScreen) (ScreenPtr pScreen);
 | |
|     Bool (*createRes) (ScreenPtr);      /* create screen resources */
 | |
|     void (*scrfini) (KdScreenInfo *);   /* close down screen */
 | |
|     void (*cardfini) (KdCardInfo *);    /* close down */
 | |
| 
 | |
|     Bool (*initCursor) (ScreenPtr);     /* detect and map cursor */
 | |
| 
 | |
|     Bool (*initAccel) (ScreenPtr);
 | |
|     void (*enableAccel) (ScreenPtr);
 | |
|     void (*disableAccel) (ScreenPtr);
 | |
|     void (*finiAccel) (ScreenPtr);
 | |
| 
 | |
|     void (*getColors) (ScreenPtr, int, xColorItem *);
 | |
|     void (*putColors) (ScreenPtr, int, xColorItem *);
 | |
| 
 | |
|     void (*closeScreen) (ScreenPtr);    /* close ScreenRec */
 | |
| } KdCardFuncs;
 | |
| 
 | |
| #define KD_MAX_PSEUDO_DEPTH 8
 | |
| #define KD_MAX_PSEUDO_SIZE	    (1 << KD_MAX_PSEUDO_DEPTH)
 | |
| 
 | |
| typedef struct {
 | |
|     KdScreenInfo *screen;
 | |
|     KdCardInfo *card;
 | |
| 
 | |
|     Bool enabled;
 | |
|     Bool closed;
 | |
|     int bytesPerPixel;
 | |
| 
 | |
|     int dpmsState;
 | |
| 
 | |
|     ColormapPtr pInstalledmap;  /* current colormap */
 | |
|     xColorItem systemPalette[KD_MAX_PSEUDO_SIZE];       /* saved windows colors */
 | |
| 
 | |
|     CreateScreenResourcesProcPtr CreateScreenResources;
 | |
|     CloseScreenProcPtr CloseScreen;
 | |
| } KdPrivScreenRec, *KdPrivScreenPtr;
 | |
| 
 | |
| typedef enum _kdPointerState {
 | |
|     start,
 | |
|     button_1_pend,
 | |
|     button_1_down,
 | |
|     button_2_down,
 | |
|     button_3_pend,
 | |
|     button_3_down,
 | |
|     synth_2_down_13,
 | |
|     synth_2_down_3,
 | |
|     synth_2_down_1,
 | |
|     num_input_states
 | |
| } KdPointerState;
 | |
| 
 | |
| #define KD_MAX_BUTTON  32
 | |
| 
 | |
| #define KD_KEYBOARD 1
 | |
| #define KD_MOUSE 2
 | |
| #define KD_TOUCHSCREEN 3
 | |
| 
 | |
| typedef struct _KdPointerInfo KdPointerInfo;
 | |
| 
 | |
| typedef struct _KdPointerDriver {
 | |
|     const char *name;
 | |
|      Status(*Init) (KdPointerInfo *);
 | |
|      Status(*Enable) (KdPointerInfo *);
 | |
|     void (*Disable) (KdPointerInfo *);
 | |
|     void (*Fini) (KdPointerInfo *);
 | |
|     struct _KdPointerDriver *next;
 | |
| } KdPointerDriver;
 | |
| 
 | |
| struct _KdPointerInfo {
 | |
|     DeviceIntPtr dixdev;
 | |
|     char *name;
 | |
|     char *path;
 | |
|     char *protocol;
 | |
|     InputOption *options;
 | |
|     int inputClass;
 | |
| 
 | |
|     CARD8 map[KD_MAX_BUTTON + 1];
 | |
|     int nButtons;
 | |
|     int nAxes;
 | |
| 
 | |
|     Bool emulateMiddleButton;
 | |
|     unsigned long emulationTimeout;
 | |
|     int emulationDx, emulationDy;
 | |
| 
 | |
|     Bool timeoutPending;
 | |
|     KdPointerState mouseState;
 | |
|     Bool eventHeld;
 | |
|     struct {
 | |
|         int type;
 | |
|         int x;
 | |
|         int y;
 | |
|         int z;
 | |
|         int flags;
 | |
|         int absrel;
 | |
|     } heldEvent;
 | |
|     unsigned char buttonState;
 | |
|     Bool transformCoordinates;
 | |
|     int pressureThreshold;
 | |
| 
 | |
|     KdPointerDriver *driver;
 | |
|     void *driverPrivate;
 | |
| 
 | |
|     struct _KdPointerInfo *next;
 | |
| };
 | |
| 
 | |
| void KdAddPointerDriver(KdPointerDriver * driver);
 | |
| void KdRemovePointerDriver(KdPointerDriver * driver);
 | |
| KdPointerInfo *KdNewPointer(void);
 | |
| void KdFreePointer(KdPointerInfo *);
 | |
| int KdAddPointer(KdPointerInfo * ki);
 | |
| int KdAddConfigPointer(char *pointer);
 | |
| void KdRemovePointer(KdPointerInfo * ki);
 | |
| 
 | |
| #define KD_KEY_COUNT 248
 | |
| #define KD_MIN_KEYCODE  8
 | |
| #define KD_MAX_KEYCODE  255
 | |
| #define KD_MAX_WIDTH    4
 | |
| #define KD_MAX_LENGTH   (KD_MAX_KEYCODE - KD_MIN_KEYCODE + 1)
 | |
| 
 | |
| typedef struct {
 | |
|     KeySym modsym;
 | |
|     int modbit;
 | |
| } KdKeySymModsRec;
 | |
| 
 | |
| typedef struct _KdKeyboardInfo KdKeyboardInfo;
 | |
| 
 | |
| typedef struct _KdKeyboardDriver {
 | |
|     const char *name;
 | |
|     Bool (*Init) (KdKeyboardInfo *);
 | |
|     Bool (*Enable) (KdKeyboardInfo *);
 | |
|     void (*Leds) (KdKeyboardInfo *, int);
 | |
|     void (*Bell) (KdKeyboardInfo *, int, int, int);
 | |
|     void (*Disable) (KdKeyboardInfo *);
 | |
|     void (*Fini) (KdKeyboardInfo *);
 | |
|     struct _KdKeyboardDriver *next;
 | |
| } KdKeyboardDriver;
 | |
| 
 | |
| struct _KdKeyboardInfo {
 | |
|     struct _KdKeyboardInfo *next;
 | |
|     DeviceIntPtr dixdev;
 | |
|     void *closure;
 | |
|     char *name;
 | |
|     char *path;
 | |
|     int inputClass;
 | |
|     char *xkbRules;
 | |
|     char *xkbModel;
 | |
|     char *xkbLayout;
 | |
|     char *xkbVariant;
 | |
|     char *xkbOptions;
 | |
|     int LockLed;
 | |
| 
 | |
|     int minScanCode;
 | |
|     int maxScanCode;
 | |
| 
 | |
|     int leds;
 | |
|     int bellPitch;
 | |
|     int bellDuration;
 | |
|     InputOption *options;
 | |
| 
 | |
|     KdKeyboardDriver *driver;
 | |
|     void *driverPrivate;
 | |
| };
 | |
| 
 | |
| void KdAddKeyboardDriver(KdKeyboardDriver * driver);
 | |
| void KdRemoveKeyboardDriver(KdKeyboardDriver * driver);
 | |
| KdKeyboardInfo *KdNewKeyboard(void);
 | |
| void KdFreeKeyboard(KdKeyboardInfo * ki);
 | |
| int KdAddConfigKeyboard(char *pointer);
 | |
| int KdAddKeyboard(KdKeyboardInfo * ki);
 | |
| void KdRemoveKeyboard(KdKeyboardInfo * ki);
 | |
| 
 | |
| typedef struct _KdPointerMatrix {
 | |
|     int matrix[2][3];
 | |
| } KdPointerMatrix;
 | |
| 
 | |
| extern DevPrivateKeyRec kdScreenPrivateKeyRec;
 | |
| 
 | |
| #define kdScreenPrivateKey (&kdScreenPrivateKeyRec)
 | |
| 
 | |
| extern Bool kdEmulateMiddleButton;
 | |
| extern Bool kdDisableZaphod;
 | |
| 
 | |
| #define KdGetScreenPriv(pScreen) ((KdPrivScreenPtr) \
 | |
|     dixLookupPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey))
 | |
| #define KdSetScreenPriv(pScreen,v) \
 | |
|     dixSetPrivate(&(pScreen)->devPrivates, kdScreenPrivateKey, v)
 | |
| #define KdScreenPriv(pScreen) KdPrivScreenPtr pScreenPriv = KdGetScreenPriv(pScreen)
 | |
| 
 | |
| /* kcmap.c */
 | |
| void
 | |
|  KdEnableColormap(ScreenPtr pScreen);
 | |
| 
 | |
| void
 | |
|  KdDisableColormap(ScreenPtr pScreen);
 | |
| 
 | |
| void
 | |
|  KdInstallColormap(ColormapPtr pCmap);
 | |
| 
 | |
| void
 | |
|  KdUninstallColormap(ColormapPtr pCmap);
 | |
| 
 | |
| int
 | |
|  KdListInstalledColormaps(ScreenPtr pScreen, Colormap * pCmaps);
 | |
| 
 | |
| void
 | |
|  KdStoreColors(ColormapPtr pCmap, int ndef, xColorItem * pdefs);
 | |
| 
 | |
| /* kdrive.c */
 | |
| extern miPointerScreenFuncRec kdPointerScreenFuncs;
 | |
| 
 | |
| void
 | |
|  KdDisableScreen(ScreenPtr pScreen);
 | |
| 
 | |
| Bool
 | |
|  KdEnableScreen(ScreenPtr pScreen);
 | |
| 
 | |
| void
 | |
|  KdEnableScreens(void);
 | |
| 
 | |
| void
 | |
|  KdProcessSwitch(void);
 | |
| 
 | |
| Rotation KdAddRotation(Rotation a, Rotation b);
 | |
| 
 | |
| Rotation KdSubRotation(Rotation a, Rotation b);
 | |
| 
 | |
| void
 | |
|  KdParseScreen(KdScreenInfo * screen, const char *arg);
 | |
| 
 | |
| const char *
 | |
| KdParseFindNext(const char *cur, const char *delim, char *save, char *last);
 | |
| 
 | |
| void
 | |
|  KdUseMsg(void);
 | |
| 
 | |
| int
 | |
|  KdProcessArgument(int argc, char **argv, int i);
 | |
| 
 | |
| void
 | |
|  KdOsAddInputDrivers(void);
 | |
| 
 | |
| void
 | |
|  KdInitCard(ScreenInfo * pScreenInfo, KdCardInfo * card, int argc, char **argv);
 | |
| 
 | |
| void
 | |
|  KdInitOutput(ScreenInfo * pScreenInfo, int argc, char **argv);
 | |
| 
 | |
| void
 | |
|  KdSetSubpixelOrder(ScreenPtr pScreen, Rotation randr);
 | |
| 
 | |
| void
 | |
|  KdBacktrace(int signum);
 | |
| 
 | |
| /* kinfo.c */
 | |
| KdCardInfo *KdCardInfoAdd(KdCardFuncs * funcs, void *closure);
 | |
| 
 | |
| KdCardInfo *KdCardInfoLast(void);
 | |
| 
 | |
| void
 | |
|  KdCardInfoDispose(KdCardInfo * ci);
 | |
| 
 | |
| KdScreenInfo *KdScreenInfoAdd(KdCardInfo * ci);
 | |
| 
 | |
| void
 | |
|  KdScreenInfoDispose(KdScreenInfo * si);
 | |
| 
 | |
| /* kinput.c */
 | |
| void
 | |
|  KdInitInput(void);
 | |
| void
 | |
|  KdCloseInput(void);
 | |
| 
 | |
| void
 | |
| KdEnqueueKeyboardEvent(KdKeyboardInfo * ki, unsigned char scan_code,
 | |
|                        unsigned char is_up);
 | |
| 
 | |
| #define KD_BUTTON_1	0x01
 | |
| #define KD_BUTTON_2	0x02
 | |
| #define KD_BUTTON_3	0x04
 | |
| #define KD_BUTTON_4	0x08
 | |
| #define KD_BUTTON_5	0x10
 | |
| #define KD_BUTTON_8	0x80
 | |
| #define KD_POINTER_DESKTOP 0x40000000
 | |
| #define KD_MOUSE_DELTA	0x80000000
 | |
| 
 | |
| void
 | |
| KdEnqueuePointerEvent(KdPointerInfo * pi, unsigned long flags, int rx, int ry,
 | |
|                       int rz);
 | |
| 
 | |
| void
 | |
|  KdSetPointerMatrix(KdPointerMatrix *pointer);
 | |
| 
 | |
| void
 | |
| KdComputePointerMatrix(KdPointerMatrix *pointer, Rotation randr, int width,
 | |
|                        int height);
 | |
| 
 | |
| void
 | |
| KdBlockHandler(ScreenPtr pScreen, void *timeout);
 | |
| 
 | |
| void
 | |
| KdWakeupHandler(ScreenPtr pScreen, int result);
 | |
| 
 | |
| void
 | |
|  KdDisableInput(void);
 | |
| 
 | |
| void
 | |
|  KdEnableInput(void);
 | |
| 
 | |
| /* kshadow.c */
 | |
| Bool
 | |
|  KdShadowFbAlloc(KdScreenInfo * screen, Bool rotate);
 | |
| 
 | |
| void
 | |
|  KdShadowFbFree(KdScreenInfo * screen);
 | |
| 
 | |
| Bool
 | |
| 
 | |
| KdShadowSet(ScreenPtr pScreen, int randr, ShadowUpdateProc update,
 | |
|             ShadowWindowProc window);
 | |
| 
 | |
| void
 | |
|  KdShadowUnset(ScreenPtr pScreen);
 | |
| 
 | |
| /* function prototypes to be implemented by the drivers */
 | |
| void
 | |
|  InitCard(char *name);
 | |
| 
 | |
| #endif                          /* _KDRIVE_H_ */
 |