diff options
-rw-r--r-- | hw/kdrive/Makefile.am | 4 | ||||
-rw-r--r-- | hw/kdrive/sdl/Makefile.am | 19 | ||||
-rw-r--r-- | hw/kdrive/sdl/sdl.c | 498 |
3 files changed, 520 insertions, 1 deletions
diff --git a/hw/kdrive/Makefile.am b/hw/kdrive/Makefile.am index b43d6c948..89da28b46 100644 --- a/hw/kdrive/Makefile.am +++ b/hw/kdrive/Makefile.am @@ -6,10 +6,12 @@ if KDRIVEFBDEV FBDEV_SUBDIRS = fbdev endif +XSDL_SUBDIRS=@XSDL_DIRS@ + SUBDIRS = \ src \ linux \ + $(XSDL_SUBDIRS) \ $(FBDEV_SUBDIRS) \ $(VESA_SUBDIRS) \ ati - diff --git a/hw/kdrive/sdl/Makefile.am b/hw/kdrive/sdl/Makefile.am new file mode 100644 index 000000000..c8252d7c2 --- /dev/null +++ b/hw/kdrive/sdl/Makefile.am @@ -0,0 +1,19 @@ +INCLUDES = \ + @KDRIVE_PURE_INCS@ \ + @XSERVER_CFLAGS@ \ + @XSDL_INCS@ + +bin_PROGRAMS = Xsdl + +if TSLIB +TSLIB_FLAG = -lts +endif + +Xsdl_SOURCES = sdl.c + +Xsdl_LDADD = @KDRIVE_PURE_LIBS@ \ + @XSERVER_LIBS@ \ + $(TSLIB_FLAG) \ + @XSDL_LIBS@ + +Xsdl_DEPENDENCIES = @KDRIVE_LIBS@ diff --git a/hw/kdrive/sdl/sdl.c b/hw/kdrive/sdl/sdl.c new file mode 100644 index 000000000..327359199 --- /dev/null +++ b/hw/kdrive/sdl/sdl.c @@ -0,0 +1,498 @@ +/* + * $Id$ + * + * Copyright © 2004 PillowElephantBadgerBankPond + + * 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 PillowElephantBadgerBankPond not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. PillowElephantBadgerBankPond makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * PillowElephantBadgerBankPond DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL PillowElephantBadgerBankPond 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. + * + * It's really not my fault - see it was the elephants!! + * - jaymz + * + */ +/* $Header$ */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "kdrive.h" +#include "kkeymap.h" +#include <SDL/SDL.h> +#include <X11/keysym.h> + +static void xsdlFini(void); +static Bool sdlScreenInit(KdScreenInfo *screen); +static Bool sdlFinishInitScreen(ScreenPtr pScreen); +static Bool sdlCreateRes(ScreenPtr pScreen); + +static void sdlKeyboardBell (int volume, int pitch, int duration); +static void sdlKeyboardLeds (int leds); +static void sdlKeyboardFini(void); +static void sdlKeyboardLoad (void); +static Bool sdlKeyboardInit(void); + +static Bool sdlMouseInit(void); +static void sdlMouseFini(void); + +void *sdlShadowWindow (ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure); +void sdlShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf); + +void sdlTimer(void); + +KeySym sdlKeymap[]={ + 0, /* 8 */ + 0, + XK_Escape, NoSymbol, /* escape */ + XK_1, XK_exclam, + XK_2, XK_at, + XK_3, XK_numbersign, + XK_4, XK_dollar, + XK_5, XK_percent, + XK_6, XK_asciicircum, + XK_7, XK_ampersand, + XK_8, XK_asterisk, + XK_9, XK_parenleft, + XK_0, XK_parenright, + XK_minus, XK_underscore, + XK_equal, XK_plus, + XK_BackSpace, NoSymbol, /* backspace */ + XK_Tab, NoSymbol, + XK_q, XK_Q, + XK_w, XK_W, + XK_e, XK_E, + XK_r, XK_R, + XK_t, XK_T, + XK_y, XK_Y, + XK_u, XK_U, + XK_i, XK_I, + XK_o, XK_O, + XK_p, XK_P, + XK_bracketleft, XK_braceleft, /* [, { */ + XK_bracketright, XK_braceright, /* ]. } */ + XK_Return, NoSymbol, + XK_Control_L, NoSymbol, + XK_a, XK_A, + XK_s, XK_S, + XK_d, XK_D, + XK_f, XK_F, + XK_g, XK_G, + XK_h, XK_H, + XK_j, XK_J, + XK_k, XK_K, + XK_l, XK_L, + XK_semicolon, XK_colon, + XK_apostrophe, XK_quotedbl, + XK_grave, XK_asciitilde, + XK_Shift_L, NoSymbol, + XK_backslash, XK_bar, + XK_z, XK_z, + XK_x, XK_X, + XK_c, XK_C, + XK_v, XK_V, + XK_b, XK_B, + XK_n, XK_N, + XK_m, XK_M, + XK_comma, XK_less, + XK_period, XK_greater, + XK_slash, XK_question, + XK_Shift_R, NoSymbol, + XK_KP_Multiply, NoSymbol, + XK_Meta_L, XK_Alt_L, + XK_space, NoSymbol, + XK_Caps_Lock, NoSymbol, + XK_F1, NoSymbol, + XK_F2, NoSymbol, + XK_F3, NoSymbol, + XK_F4, NoSymbol, + XK_F5, NoSymbol, + XK_F6, NoSymbol, + XK_F7, NoSymbol, + XK_F8, NoSymbol, + XK_F9, NoSymbol, + XK_F10, NoSymbol, + XK_Num_Lock, NoSymbol, + XK_Scroll_Lock, NoSymbol, + XK_KP_Home, XK_KP_7, + XK_KP_Up, XK_KP_8, + XK_KP_Page_Up, XK_KP_9, + XK_KP_Subtract, NoSymbol, + XK_KP_Left, XK_KP_4, + XK_KP_5, NoSymbol, + XK_KP_Right, XK_KP_6, + XK_KP_Add, NoSymbol, + XK_KP_End, XK_KP_1, + XK_KP_Down, XK_KP_2, + XK_KP_Page_Down, XK_KP_3, + XK_KP_Insert, XK_KP_0, + XK_KP_Delete, XK_KP_Decimal, + NoSymbol, NoSymbol, /* 92 */ + NoSymbol, NoSymbol, /* 93 */ + NoSymbol, NoSymbol, /* 94 */ + XK_F11, NoSymbol, /* 95 */ + XK_F12, NoSymbol, /* 96 */ + XK_Home, NoSymbol, /* 97 */ + XK_Up, NoSymbol, /* 98 */ + XK_Page_Up, NoSymbol, /* 99 */ + XK_Left, NoSymbol, /* 100 */ + NoSymbol, NoSymbol, /* 101 */ + XK_Right, NoSymbol, /* 102 */ + NoSymbol, NoSymbol, /* 103 */ + XK_Down, NoSymbol, /* 104 */ + XK_Page_Down, NoSymbol, /* 105 */ + XK_Insert, NoSymbol, /* 106 */ + NoSymbol, NoSymbol, /* 107 */ + NoSymbol, NoSymbol, /* 108 */ + XK_Meta_R, XK_Alt_R, /* 109 */ + XK_Pause, XK_Break, /* 110 */ + XK_Sys_Req, XK_Print, /* 111 */ + NoSymbol, NoSymbol, /* 112 */ + XK_Control_R, NoSymbol, /* 113 */ + NoSymbol, NoSymbol, /* 114 */ + XK_Super_L, NoSymbol, /* 115 */ + XK_Super_R, NoSymbol, /* 116 */ + XK_Menu, NoSymbol, /* 117 */ + NoSymbol, NoSymbol /* 118 */ +}; + +//KdMouseInfo *kdMouseInfo; + +KdKeyboardFuncs sdlKeyboardFuncs = { + sdlKeyboardLoad, + sdlKeyboardInit, + sdlKeyboardLeds, + sdlKeyboardBell, + sdlKeyboardFini, + 3, +}; + +KdMouseFuncs sdlMouseFuncs = { + sdlMouseInit, + sdlMouseFini, +}; + + +KdCardFuncs sdlFuncs = { + 0, /* cardinit */ + sdlScreenInit, /* scrinit */ + 0, /* initScreen */ + sdlFinishInitScreen, /* finishInitScreen */ + sdlCreateRes, /* createRes */ + 0, /* preserve */ + 0, /* enable */ + 0, /* dpms */ + 0, /* disable */ + 0, /* restore */ + 0, /* scrfini */ + 0, /* cardfini */ + + 0, /* initCursor */ + 0, /* enableCursor */ + 0, /* disableCursor */ + 0, /* finiCursor */ + 0, /* recolorCursor */ + + 0, /* initAccel */ + 0, /* enableAccel */ + 0, /* syncAccel */ + 0, /* disableAccel */ + 0, /* finiAccel */ + + 0, /* getColors */ + 0 /* putColors */ +}; + +int mouseState=0; + +struct SdlDriver +{ + SDL_Surface *screen; +}; + + + +static Bool sdlScreenInit(KdScreenInfo *screen) +{ + struct SdlDriver *sdlDriver=calloc(1, sizeof(struct SdlDriver)); +#ifdef DEBUG + printf("sdlScreenInit()\n"); +#endif + if (!screen->width || !screen->height) + { + screen->width = 640; + screen->height = 480; + } + if (!screen->fb[0].depth) + screen->fb[0].depth = 4; +#ifdef DEBUG + printf("Attempting for %dx%d/%dbpp mode\n", screen->width, screen->height, screen->fb[0].depth); +#endif + sdlDriver->screen=SDL_SetVideoMode(screen->width, screen->height, screen->fb[0].depth, 0); + if(sdlDriver->screen==NULL) + return FALSE; +#ifdef DEBUG + printf("Set %dx%d/%dbpp mode\n", sdlDriver->screen->w, sdlDriver->screen->h, sdlDriver->screen->format->BitsPerPixel); +#endif + screen->width=sdlDriver->screen->w; + screen->height=sdlDriver->screen->h; + screen->fb[0].depth=sdlDriver->screen->format->BitsPerPixel; + screen->fb[0].visuals=(1<<TrueColor); + screen->fb[0].redMask=sdlDriver->screen->format->Rmask; + screen->fb[0].greenMask=sdlDriver->screen->format->Gmask; + screen->fb[0].blueMask=sdlDriver->screen->format->Bmask; + screen->fb[0].bitsPerPixel=sdlDriver->screen->format->BitsPerPixel; + screen->rate=60; + screen->memory_base=(CARD8 *)sdlDriver->screen->pixels; + screen->memory_size=0; + screen->off_screen_base=0; + screen->driver=sdlDriver; + screen->fb[0].byteStride=(sdlDriver->screen->w*sdlDriver->screen->format->BitsPerPixel)/8; + screen->fb[0].pixelStride=sdlDriver->screen->w; + screen->fb[0].frameBuffer=(CARD8 *)sdlDriver->screen->pixels; + SDL_WM_SetCaption("Freedesktop.org X server (SDL)", NULL); + return TRUE; +} + +void sdlShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf) +{ + KdScreenPriv(pScreen); + KdScreenInfo *screen = pScreenPriv->screen; + struct SdlDriver *sdlDriver=screen->driver; +#ifdef DEBUG + printf("Shadow update()\n"); +#endif + if(SDL_MUSTLOCK(sdlDriver->screen)) + { + if(SDL_LockSurface(sdlDriver->screen)<0) + { +#ifdef DEBUG + printf("Couldn't lock SDL surface - d'oh!\n"); +#endif + return; + } + } + + if(SDL_MUSTLOCK(sdlDriver->screen)) + SDL_UnlockSurface(sdlDriver->screen); + SDL_UpdateRect(sdlDriver->screen, 0, 0, sdlDriver->screen->w, sdlDriver->screen->h); +} + + +void *sdlShadowWindow (ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure) +{ + KdScreenPriv(pScreen); + KdScreenInfo *screen = pScreenPriv->screen; + struct SdlDriver *sdlDriver=screen->driver; + *size=(sdlDriver->screen->w*sdlDriver->screen->format->BitsPerPixel)/8; +#ifdef DEBUG + printf("Shadow window()\n"); +#endif + return (void *)((CARD8 *)sdlDriver->screen->pixels + row * (*size) + offset); +} + + +static Bool sdlCreateRes(ScreenPtr pScreen) +{ + KdScreenPriv(pScreen); + KdScreenInfo *screen = pScreenPriv->screen; + KdShadowFbAlloc(screen, 0, FALSE); + KdShadowSet(pScreen, RR_Rotate_0, sdlShadowUpdate, sdlShadowWindow); + return TRUE; +} + +static Bool sdlFinishInitScreen(ScreenPtr pScreen) +{ + if (!shadowSetup (pScreen)) + return FALSE; + +/* +#ifdef RANDR + if (!sdlRandRInit (pScreen)) + return FALSE; +#endif +*/ + return TRUE; +} + +static void sdlKeyboardBell (int volume, int pitch, int duration) +{ +#ifdef DEBUG + printf("a bell would go here\n"); +#endif +} + +static void sdlKeyboardLeds (int leds) +{ +#ifdef DEBUG + printf("Leds: %d\n", leds); +#endif +} + +static void sdlKeyboardLoad(void) +{ + int x; + kdMinScanCode = 8; + kdMaxScanCode = 255; + kdMinKeyCode = 8; + kdMaxKeyCode = 255; + kdKeymapWidth = 2; + + memcpy(kdKeymap, sdlKeymap, sizeof(sdlKeymap)); +} + +static void sdlKeyboardFini(void) +{ + +} + +static Bool sdlKeyboardInit(void) +{ + return TRUE; +} + +static Bool sdlMouseInit (void) +{ +#ifdef DEBUG + printf("kdMouseInfo: 0x%x\n", kdMouseInfo); +#endif + return TRUE; +} + +static void sdlMouseFini(void) +{ +} + + +void InitCard(char *name) +{ + KdCardAttr attr; + KdCardInfoAdd (&sdlFuncs, &attr, 0); +#ifdef DEBUG + printf("InitCard: %s\n", name); +#endif +} + +void InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv) +{ + KdInitOutput(pScreenInfo, argc, argv); +#ifdef DEBUG + printf("InitOutput()\n"); +#endif +} + +void InitInput(int argc, char **argv) +{ + /* FIXME: change this to use SDL key/mouse funcs */ + KdInitInput(&sdlMouseFuncs, &sdlKeyboardFuncs); +} + +void ddxUseMsg(void) +{ + KdUseMsg(); +} + +int ddxProcessArgument(int argc, char **argv, int i) +{ + return KdProcessArgument(argc, argv, i); +} + +void sdlTimer(void) +{ + static int buttonState=0; + SDL_Event event; + SDL_ShowCursor(FALSE); + /* get the mouse state */ + while ( SDL_PollEvent(&event) ) { + switch (event.type) { + case SDL_MOUSEMOTION: + KdEnqueueMouseEvent(kdMouseInfo, mouseState, event.motion.x, event.motion.y); + break; + case SDL_MOUSEBUTTONDOWN: + switch(event.button.button) + { + case 1: + buttonState=KD_BUTTON_1; + break; + case 2: + buttonState=KD_BUTTON_2; + break; + case 3: + buttonState=KD_BUTTON_3; + break; + } + mouseState|=buttonState; + KdEnqueueMouseEvent(kdMouseInfo, mouseState|KD_MOUSE_DELTA, 0, 0); + break; + case SDL_MOUSEBUTTONUP: + switch(event.button.button) + { + case 1: + buttonState=KD_BUTTON_1; + break; + case 2: + buttonState=KD_BUTTON_2; + break; + case 3: + buttonState=KD_BUTTON_3; + break; + } + mouseState &= ~buttonState; + KdEnqueueMouseEvent(kdMouseInfo, mouseState|KD_MOUSE_DELTA, 0, 0); + break; + case SDL_KEYDOWN: + case SDL_KEYUP: +#ifdef DEBUG + printf("Keycode: %d\n", event.key.keysym.scancode); +#endif + KdEnqueueKeyboardEvent (event.key.keysym.scancode, event.type==SDL_KEYUP); + break; + + case SDL_QUIT: + /* this should never happen */ + SDL_Quit(); + } + } +} + +static int xsdlInit(void) +{ +#ifdef DEBUG + printf("Calling SDL_Init()\n"); +#endif + return SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); +} + + +static void xsdlFini(void) +{ + SDL_Quit(); +} + +KdOsFuncs sdlOsFuncs={ + xsdlInit, + 0, + 0, + 0, + xsdlFini, + sdlTimer +}; + +void OsVendorInit (void) +{ + KdOsInit (&sdlOsFuncs); +} + + |