2 * Copyright © 2004 PillowElephantBadgerBankPond
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 PillowElephantBadgerBankPond not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. PillowElephantBadgerBankPond makes no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
14 * PillowElephantBadgerBankPond DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL PillowElephantBadgerBankPond 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.
22 * It's really not my fault - see it was the elephants!!
27 #include "kdrive-config.h"
31 #include <X11/keysym.h>
33 static void xsdlFini(void);
34 static Bool
sdlScreenInit(KdScreenInfo
*screen
);
35 static Bool
sdlFinishInitScreen(ScreenPtr pScreen
);
36 static Bool
sdlCreateRes(ScreenPtr pScreen
);
38 static void sdlKeyboardFini(KdKeyboardInfo
*ki
);
39 static Bool
sdlKeyboardInit(KdKeyboardInfo
*ki
);
41 static Bool
sdlMouseInit(KdPointerInfo
*pi
);
42 static void sdlMouseFini(KdPointerInfo
*pi
);
44 void *sdlShadowWindow (ScreenPtr pScreen
, CARD32 row
, CARD32 offset
, int mode
, CARD32
*size
, void *closure
);
45 void sdlShadowUpdate (ScreenPtr pScreen
, shadowBufPtr pBuf
);
49 KdKeyboardInfo
*sdlKeyboard
= NULL
;
50 KdPointerInfo
*sdlPointer
= NULL
;
55 XK_Escape
, NoSymbol
, /* escape */
66 XK_minus
, XK_underscore
,
68 XK_BackSpace
, NoSymbol
, /* backspace */
80 XK_bracketleft
, XK_braceleft
, /* [, { */
81 XK_bracketright
, XK_braceright
, /* ]. } */
83 XK_Control_L
, NoSymbol
,
93 XK_semicolon
, XK_colon
,
94 XK_apostrophe
, XK_quotedbl
,
95 XK_grave
, XK_asciitilde
,
106 XK_period
, XK_greater
,
107 XK_slash
, XK_question
,
108 XK_Shift_R
, NoSymbol
,
109 XK_KP_Multiply
, NoSymbol
,
112 XK_Caps_Lock
, NoSymbol
,
123 XK_Num_Lock
, NoSymbol
,
124 XK_Scroll_Lock
, NoSymbol
,
127 XK_KP_Page_Up
, XK_KP_9
,
128 XK_KP_Subtract
, NoSymbol
,
131 XK_KP_Right
, XK_KP_6
,
135 XK_KP_Page_Down
, XK_KP_3
,
136 XK_KP_Insert
, XK_KP_0
,
137 XK_KP_Delete
, XK_KP_Decimal
,
138 NoSymbol
, NoSymbol
, /* 92 */
139 NoSymbol
, NoSymbol
, /* 93 */
140 NoSymbol
, NoSymbol
, /* 94 */
141 XK_F11
, NoSymbol
, /* 95 */
142 XK_F12
, NoSymbol
, /* 96 */
143 XK_Home
, NoSymbol
, /* 97 */
144 XK_Up
, NoSymbol
, /* 98 */
145 XK_Page_Up
, NoSymbol
, /* 99 */
146 XK_Left
, NoSymbol
, /* 100 */
147 NoSymbol
, NoSymbol
, /* 101 */
148 XK_Right
, NoSymbol
, /* 102 */
149 NoSymbol
, NoSymbol
, /* 103 */
150 XK_Down
, NoSymbol
, /* 104 */
151 XK_Page_Down
, NoSymbol
, /* 105 */
152 XK_Insert
, NoSymbol
, /* 106 */
153 NoSymbol
, NoSymbol
, /* 107 */
154 NoSymbol
, NoSymbol
, /* 108 */
155 XK_Meta_R
, XK_Alt_R
, /* 109 */
156 XK_Pause
, XK_Break
, /* 110 */
157 XK_Sys_Req
, XK_Print
, /* 111 */
158 NoSymbol
, NoSymbol
, /* 112 */
159 XK_Control_R
, NoSymbol
, /* 113 */
160 NoSymbol
, NoSymbol
, /* 114 */
161 XK_Super_L
, NoSymbol
, /* 115 */
162 XK_Super_R
, NoSymbol
, /* 116 */
163 XK_Menu
, NoSymbol
, /* 117 */
164 NoSymbol
, NoSymbol
/* 118 */
167 KdKeyboardDriver sdlKeyboardDriver
= {
169 .Init
= sdlKeyboardInit
,
170 .Fini
= sdlKeyboardFini
,
173 KdPointerDriver sdlMouseDriver
= {
175 .Init
= sdlMouseInit
,
176 .Fini
= sdlMouseFini
,
180 KdCardFuncs sdlFuncs
= {
181 .scrinit
= sdlScreenInit
, /* scrinit */
182 .finishInitScreen
= sdlFinishInitScreen
, /* finishInitScreen */
183 .createRes
= sdlCreateRes
, /* createRes */
195 static Bool
sdlScreenInit(KdScreenInfo
*screen
)
197 struct SdlDriver
*sdlDriver
=calloc(1, sizeof(struct SdlDriver
));
199 printf("sdlScreenInit()\n");
201 if (!screen
->width
|| !screen
->height
)
204 screen
->height
= 480;
206 if (!screen
->fb
[0].depth
)
207 screen
->fb
[0].depth
= 4;
209 printf("Attempting for %dx%d/%dbpp mode\n", screen
->width
, screen
->height
, screen
->fb
[0].depth
);
211 sdlDriver
->screen
=SDL_SetVideoMode(screen
->width
, screen
->height
, screen
->fb
[0].depth
, 0);
212 if(sdlDriver
->screen
==NULL
)
215 printf("Set %dx%d/%dbpp mode\n", sdlDriver
->screen
->w
, sdlDriver
->screen
->h
, sdlDriver
->screen
->format
->BitsPerPixel
);
217 screen
->width
=sdlDriver
->screen
->w
;
218 screen
->height
=sdlDriver
->screen
->h
;
219 screen
->fb
[0].depth
=sdlDriver
->screen
->format
->BitsPerPixel
;
220 screen
->fb
[0].visuals
=(1<<TrueColor
);
221 screen
->fb
[0].redMask
=sdlDriver
->screen
->format
->Rmask
;
222 screen
->fb
[0].greenMask
=sdlDriver
->screen
->format
->Gmask
;
223 screen
->fb
[0].blueMask
=sdlDriver
->screen
->format
->Bmask
;
224 screen
->fb
[0].bitsPerPixel
=sdlDriver
->screen
->format
->BitsPerPixel
;
226 screen
->memory_base
=(CARD8
*)sdlDriver
->screen
->pixels
;
227 screen
->memory_size
=0;
228 screen
->off_screen_base
=0;
229 screen
->driver
=sdlDriver
;
230 screen
->fb
[0].byteStride
=(sdlDriver
->screen
->w
*sdlDriver
->screen
->format
->BitsPerPixel
)/8;
231 screen
->fb
[0].pixelStride
=sdlDriver
->screen
->w
;
232 screen
->fb
[0].frameBuffer
=(CARD8
*)sdlDriver
->screen
->pixels
;
233 SDL_WM_SetCaption("Freedesktop.org X server (SDL)", NULL
);
237 void sdlShadowUpdate (ScreenPtr pScreen
, shadowBufPtr pBuf
)
239 KdScreenPriv(pScreen
);
240 KdScreenInfo
*screen
= pScreenPriv
->screen
;
241 struct SdlDriver
*sdlDriver
=screen
->driver
;
243 printf("Shadow update()\n");
245 if(SDL_MUSTLOCK(sdlDriver
->screen
))
247 if(SDL_LockSurface(sdlDriver
->screen
)<0)
250 printf("Couldn't lock SDL surface - d'oh!\n");
256 if(SDL_MUSTLOCK(sdlDriver
->screen
))
257 SDL_UnlockSurface(sdlDriver
->screen
);
258 SDL_UpdateRect(sdlDriver
->screen
, 0, 0, sdlDriver
->screen
->w
, sdlDriver
->screen
->h
);
262 void *sdlShadowWindow (ScreenPtr pScreen
, CARD32 row
, CARD32 offset
, int mode
, CARD32
*size
, void *closure
)
264 KdScreenPriv(pScreen
);
265 KdScreenInfo
*screen
= pScreenPriv
->screen
;
266 struct SdlDriver
*sdlDriver
=screen
->driver
;
267 *size
=(sdlDriver
->screen
->w
*sdlDriver
->screen
->format
->BitsPerPixel
)/8;
269 printf("Shadow window()\n");
271 return (void *)((CARD8
*)sdlDriver
->screen
->pixels
+ row
* (*size
) + offset
);
275 static Bool
sdlCreateRes(ScreenPtr pScreen
)
277 KdScreenPriv(pScreen
);
278 KdScreenInfo
*screen
= pScreenPriv
->screen
;
279 KdShadowFbAlloc(screen
, 0, FALSE
);
280 KdShadowSet(pScreen
, RR_Rotate_0
, sdlShadowUpdate
, sdlShadowWindow
);
284 static Bool
sdlFinishInitScreen(ScreenPtr pScreen
)
286 if (!shadowSetup (pScreen
))
291 if (!sdlRandRInit (pScreen))
298 static void sdlKeyboardFini(KdKeyboardInfo
*ki
)
303 static Bool
sdlKeyboardInit(KdKeyboardInfo
*ki
)
306 ki
->maxScanCode
= 255;
307 ki
->keySyms
.minKeyCode
= 8;
308 ki
->keySyms
.maxKeyCode
= 255;
309 ki
->keySyms
.mapWidth
= 2;
310 memcpy(ki
->keySyms
.map
, sdlKeymap
, sizeof(sdlKeymap
));
317 static Bool
sdlMouseInit (KdPointerInfo
*pi
)
323 static void sdlMouseFini(KdPointerInfo
*pi
)
329 void InitCard(char *name
)
332 KdCardInfoAdd (&sdlFuncs
, &attr
, 0);
334 printf("InitCard: %s\n", name
);
338 void InitOutput(ScreenInfo
*pScreenInfo
, int argc
, char **argv
)
340 KdInitOutput(pScreenInfo
, argc
, argv
);
342 printf("InitOutput()\n");
346 void InitInput(int argc
, char **argv
)
351 KdAddKeyboardDriver(&sdlKeyboardDriver
);
352 KdAddPointerDriver(&sdlMouseDriver
);
354 ki
= KdParseKeyboard("keyboard");
356 pi
= KdParsePointer("mouse");
367 int ddxProcessArgument(int argc
, char **argv
, int i
)
369 return KdProcessArgument(argc
, argv
, i
);
374 static int buttonState
=0;
376 SDL_ShowCursor(FALSE
);
377 /* get the mouse state */
378 while ( SDL_PollEvent(&event
) ) {
379 switch (event
.type
) {
380 case SDL_MOUSEMOTION
:
381 KdEnqueuePointerEvent(sdlPointer
, mouseState
, event
.motion
.x
, event
.motion
.y
, 0);
383 case SDL_MOUSEBUTTONDOWN
:
384 switch(event
.button
.button
)
387 buttonState
=KD_BUTTON_1
;
390 buttonState
=KD_BUTTON_2
;
393 buttonState
=KD_BUTTON_3
;
396 mouseState
|=buttonState
;
397 KdEnqueuePointerEvent(sdlPointer
, mouseState
|KD_MOUSE_DELTA
, 0, 0, 0);
399 case SDL_MOUSEBUTTONUP
:
400 switch(event
.button
.button
)
403 buttonState
=KD_BUTTON_1
;
406 buttonState
=KD_BUTTON_2
;
409 buttonState
=KD_BUTTON_3
;
412 mouseState
&= ~buttonState
;
413 KdEnqueuePointerEvent(sdlPointer
, mouseState
|KD_MOUSE_DELTA
, 0, 0, 0);
418 printf("Keycode: %d\n", event
.key
.keysym
.scancode
);
420 KdEnqueueKeyboardEvent (sdlKeyboard
, event
.key
.keysym
.scancode
, event
.type
==SDL_KEYUP
);
424 /* this should never happen */
430 static int xsdlInit(void)
433 printf("Calling SDL_Init()\n");
435 return SDL_Init(SDL_INIT_VIDEO
| SDL_INIT_TIMER
);
439 static void xsdlFini(void)
444 KdOsFuncs sdlOsFuncs
={
447 .pollEvents
= sdlTimer
,
450 void OsVendorInit (void)
452 KdOsInit (&sdlOsFuncs
);