420 lines
10 KiB
C
420 lines
10 KiB
C
|
/*
|
|||
|
*
|
|||
|
* Copyright <EFBFBD> 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"
|
|||
|
|
|||
|
#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
|
|||
|
|
|||
|
#ifndef KD_MAX_CARD_ADDRESS
|
|||
|
#define KD_MAX_CARD_ADDRESS 8
|
|||
|
#endif
|
|||
|
|
|||
|
typedef struct _KdCardInfo {
|
|||
|
const struct _KdCardFuncs *cfuncs;
|
|||
|
void *closure;
|
|||
|
void *driver;
|
|||
|
struct _KdScreenInfo *screenList;
|
|||
|
int selected;
|
|||
|
struct _KdCardInfo *next;
|
|||
|
|
|||
|
Bool needSync;
|
|||
|
int lastMarker;
|
|||
|
} 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 width;
|
|||
|
int height;
|
|||
|
int rate;
|
|||
|
int width_mm;
|
|||
|
int height_mm;
|
|||
|
int subpixel_order;
|
|||
|
Bool dumb;
|
|||
|
Bool softCursor;
|
|||
|
int mynum;
|
|||
|
DDXPointRec origin;
|
|||
|
KdFrameBuffer fb;
|
|||
|
CARD8 *memory_base;
|
|||
|
unsigned long memory_size;
|
|||
|
unsigned long off_screen_base;
|
|||
|
} 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 (*preserve) (KdCardInfo *); /* save graphics card state */
|
|||
|
Bool(*enable) (ScreenPtr); /* set up for rendering */
|
|||
|
Bool(*dpms) (ScreenPtr, int); /* set DPMS screen saver */
|
|||
|
void (*disable) (ScreenPtr); /* turn off rendering */
|
|||
|
void (*restore) (KdCardInfo *); /* restore graphics card state */
|
|||
|
void (*scrfini) (KdScreenInfo *); /* close down screen */
|
|||
|
void (*cardfini) (KdCardInfo *); /* close down */
|
|||
|
|
|||
|
Bool(*initCursor) (ScreenPtr); /* detect and map cursor */
|
|||
|
void (*enableCursor) (ScreenPtr); /* enable cursor */
|
|||
|
void (*disableCursor) (ScreenPtr); /* disable cursor */
|
|||
|
void (*finiCursor) (ScreenPtr); /* close down */
|
|||
|
void (*recolorCursor) (ScreenPtr, int, xColorItem *);
|
|||
|
|
|||
|
Bool(*initAccel) (ScreenPtr);
|
|||
|
void (*enableAccel) (ScreenPtr);
|
|||
|
void (*disableAccel) (ScreenPtr);
|
|||
|
void (*finiAccel) (ScreenPtr);
|
|||
|
|
|||
|
void (*getColors) (ScreenPtr, int, xColorItem *);
|
|||
|
void (*putColors) (ScreenPtr, int, xColorItem *);
|
|||
|
|
|||
|
} 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 _kdMouseState {
|
|||
|
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
|
|||
|
} KdMouseState;
|
|||
|
|
|||
|
#define KD_MAX_BUTTON 7
|
|||
|
|
|||
|
typedef struct _KdMouseInfo {
|
|||
|
struct _KdMouseInfo *next;
|
|||
|
void *driver;
|
|||
|
void *closure;
|
|||
|
char *name;
|
|||
|
char *prot;
|
|||
|
char map[KD_MAX_BUTTON];
|
|||
|
int nbutton;
|
|||
|
Bool emulateMiddleButton;
|
|||
|
unsigned long emulationTimeout;
|
|||
|
Bool timeoutPending;
|
|||
|
KdMouseState mouseState;
|
|||
|
Bool eventHeld;
|
|||
|
xEvent heldEvent;
|
|||
|
unsigned char buttonState;
|
|||
|
int emulationDx, emulationDy;
|
|||
|
int inputType;
|
|||
|
Bool transformCoordinates;
|
|||
|
} KdMouseInfo;
|
|||
|
|
|||
|
extern KdMouseInfo *kdMouseInfo;
|
|||
|
|
|||
|
KdMouseInfo *KdMouseInfoAdd(void);
|
|||
|
|
|||
|
void KdParseMouse(const char *);
|
|||
|
|
|||
|
typedef struct _KdMouseFuncs {
|
|||
|
Bool(*Init) (void);
|
|||
|
void (*Fini) (void);
|
|||
|
} KdMouseFuncs;
|
|||
|
|
|||
|
typedef struct _KdKeyboardFuncs {
|
|||
|
void (*Load) (void);
|
|||
|
int (*Init) (void);
|
|||
|
void (*Leds) (int);
|
|||
|
void (*Bell) (int, int, int);
|
|||
|
void (*Fini) (void);
|
|||
|
int LockLed;
|
|||
|
} KdKeyboardFuncs;
|
|||
|
|
|||
|
typedef struct _KdOsFuncs {
|
|||
|
int (*Init) (void);
|
|||
|
void (*Enable) (void);
|
|||
|
Bool(*SpecialKey) (KeySym);
|
|||
|
void (*Disable) (void);
|
|||
|
void (*Fini) (void);
|
|||
|
void (*pollEvents) (void);
|
|||
|
} KdOsFuncs;
|
|||
|
|
|||
|
typedef enum _KdSyncPolarity {
|
|||
|
KdSyncNegative, KdSyncPositive
|
|||
|
} KdSyncPolarity;
|
|||
|
|
|||
|
typedef struct _KdMonitorTiming {
|
|||
|
/* label */
|
|||
|
int horizontal;
|
|||
|
int vertical;
|
|||
|
int rate;
|
|||
|
/* pixel clock */
|
|||
|
int clock; /* in KHz */
|
|||
|
/* horizontal timing */
|
|||
|
int hfp; /* front porch */
|
|||
|
int hbp; /* back porch */
|
|||
|
int hblank; /* blanking */
|
|||
|
KdSyncPolarity hpol; /* polarity */
|
|||
|
/* vertical timing */
|
|||
|
int vfp; /* front porch */
|
|||
|
int vbp; /* back porch */
|
|||
|
int vblank; /* blanking */
|
|||
|
KdSyncPolarity vpol; /* polarity */
|
|||
|
} KdMonitorTiming;
|
|||
|
|
|||
|
typedef struct _KdMouseMatrix {
|
|||
|
int matrix[2][3];
|
|||
|
} KdMouseMatrix;
|
|||
|
|
|||
|
/*
|
|||
|
* This is the only completely portable way to
|
|||
|
* compute this info.
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef BitsPerPixel
|
|||
|
#define BitsPerPixel(d) (\
|
|||
|
PixmapWidthPaddingInfo[d].notPower2 ? \
|
|||
|
(PixmapWidthPaddingInfo[d].bytesPerPixel * 8) : \
|
|||
|
((1 << PixmapWidthPaddingInfo[d].padBytesLog2) * 8 / \
|
|||
|
(PixmapWidthPaddingInfo[d].padRoundUp+1)))
|
|||
|
#endif
|
|||
|
|
|||
|
extern int kdScreenPrivateIndex;
|
|||
|
extern Bool kdSwitchPending;
|
|||
|
extern Bool kdDisableZaphod;
|
|||
|
extern Bool kdDontZap;
|
|||
|
extern int kdVirtualTerminal;
|
|||
|
extern const KdOsFuncs *kdOsFuncs;
|
|||
|
|
|||
|
#define KdGetScreenPriv(pScreen) ((KdPrivScreenPtr) \
|
|||
|
(pScreen)->devPrivates[kdScreenPrivateIndex].ptr)
|
|||
|
#define KdSetScreenPriv(pScreen,v) ((pScreen)->devPrivates[kdScreenPrivateIndex].ptr = \
|
|||
|
(pointer) 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 KdSuspend(void);
|
|||
|
|
|||
|
void KdResume(void);
|
|||
|
|
|||
|
void KdProcessSwitch(void);
|
|||
|
|
|||
|
Rotation KdAddRotation(Rotation a, Rotation b);
|
|||
|
|
|||
|
Rotation KdSubRotation(Rotation a, Rotation b);
|
|||
|
|
|||
|
void KdUseMsg(void);
|
|||
|
|
|||
|
int KdProcessArgument(int argc, char **argv, int i);
|
|||
|
|
|||
|
void KdOsInit(const KdOsFuncs * const pOsFuncs);
|
|||
|
|
|||
|
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 kdVersion(const char name[]);
|
|||
|
|
|||
|
/* kinfo.c */
|
|||
|
KdCardInfo *KdCardInfoAdd(const KdCardFuncs * const funcs, void *closure);
|
|||
|
|
|||
|
KdCardInfo *KdCardInfoLast(void);
|
|||
|
|
|||
|
KdScreenInfo *KdScreenInfoAdd(KdCardInfo * ci);
|
|||
|
|
|||
|
/* kinput.c */
|
|||
|
void KdInitInput(const KdMouseFuncs *, const KdKeyboardFuncs *);
|
|||
|
|
|||
|
int KdAllocInputType(void);
|
|||
|
|
|||
|
Bool
|
|||
|
KdRegisterFd(int type, int fd, void (*read) (int fd, void *closure),
|
|||
|
void *closure);
|
|||
|
|
|||
|
void
|
|||
|
KdRegisterFdEnableDisable(int fd,
|
|||
|
int (*enable) (int fd, void *closure),
|
|||
|
void (*disable) (int fd, void *closure));
|
|||
|
|
|||
|
void KdUnregisterFds(int type, Bool do_close);
|
|||
|
|
|||
|
void KdEnqueueKeyboardEvent(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_MOUSE_DELTA 0x80000000
|
|||
|
|
|||
|
void KdEnqueueMouseEvent(KdMouseInfo * mi, unsigned long flags, int x, int y);
|
|||
|
|
|||
|
void KdEnqueueMotionEvent(KdMouseInfo * mi, int x, int y);
|
|||
|
|
|||
|
void KdReleaseAllKeys(void);
|
|||
|
|
|||
|
void KdSetLed(int led, Bool on);
|
|||
|
|
|||
|
void KdSetMouseMatrix(KdMouseMatrix * matrix);
|
|||
|
|
|||
|
void
|
|||
|
KdComputeMouseMatrix(KdMouseMatrix * matrix, Rotation randr, int width,
|
|||
|
int height);
|
|||
|
|
|||
|
void
|
|||
|
KdBlockHandler(int screen,
|
|||
|
pointer blockData, pointer timeout, pointer readmask);
|
|||
|
|
|||
|
void
|
|||
|
KdWakeupHandler(int screen,
|
|||
|
pointer data, unsigned long result, pointer readmask);
|
|||
|
|
|||
|
void KdDisableInput(void);
|
|||
|
|
|||
|
void KdEnableInput(void);
|
|||
|
|
|||
|
void ProcessInputEvents(void);
|
|||
|
|
|||
|
extern const KdMouseFuncs LinuxMouseFuncs;
|
|||
|
extern const KdKeyboardFuncs LinuxKeyboardFuncs;
|
|||
|
|
|||
|
/* kmap.c */
|
|||
|
|
|||
|
#define KD_MAPPED_MODE_REGISTERS 0
|
|||
|
#define KD_MAPPED_MODE_FRAMEBUFFER 1
|
|||
|
|
|||
|
void *KdMapDevice(CARD32 addr, CARD32 size);
|
|||
|
|
|||
|
void KdUnmapDevice(void *addr, CARD32 size);
|
|||
|
|
|||
|
void KdSetMappedMode(CARD32 addr, CARD32 size, int mode);
|
|||
|
|
|||
|
void KdResetMappedMode(CARD32 addr, CARD32 size, int mode);
|
|||
|
|
|||
|
/* kmode.c */
|
|||
|
const KdMonitorTiming *KdFindMode(KdScreenInfo * screen,
|
|||
|
Bool(*supported) (KdScreenInfo *,
|
|||
|
const KdMonitorTiming *));
|
|||
|
|
|||
|
/* 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_ */
|