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_ */
 |