Date: Sun, 20 Jul 2008 22:34:37 +0200

From: Couriersud
Subject: Updated DirectFB driver for SDL1.3

please find attached a patch for an updated directfb driver for SDL1.3.
It does now
- properly supported the new input api.
- send unicode text events
- support directfb windows
- support multiple screens
- support hardware YUV scaling for the first YUV texture created.
- support hardware scaling for textures.
- properly interpret streaming access
- support software opengl if one manages to install the mesa directfb
driver (broken/not broken in mesa svn)

Within bugzilla (http://bugzilla.libsdl.org/show_bug.cgi?id=603) there
is another patch which fixes a crash due to GL context creation.

Kind regards,

couriersud

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403172
This commit is contained in:
Sam Lantinga 2008-08-26 02:32:45 +00:00
parent a1b6c39a96
commit 1127f31992
6 changed files with 420 additions and 228 deletions

View File

@ -25,28 +25,55 @@
#include <directfb.h>
#include "SDL.h"
#include "../SDL_sysvideo.h"
#include "../../events/SDL_sysevents.h"
#include "../../events/SDL_events_c.h"
#include "../../events/SDL_keyboard_c.h"
#include "../../events/scancodes_linux.h"
#include "SDL_DirectFB_events.h"
/* The translation tables from a DirectFB keycode to a SDL keysym */
static SDLKey keymap[256];
static SDL_keysym *DirectFB_TranslateKey(DFBInputDeviceKeyIdentifier key_id,
DFBInputDeviceKeySymbol key_symbol,
DFBInputDeviceModifierMask key_mod,
static SDL_keysym *DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt,
SDL_keysym * keysym);
static void DirectFB_InitOSKeymap(_THIS);
static int DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button);
static void
DirectFB_SetContext(_THIS, SDL_WindowID id)
{
#if (DIRECTFB_MAJOR_VERSION >= 1)
/* FIXME: does not work on 1.0/1.2 with radeon driver
* the approach did work with the matrox driver
* Perhaps make this depending on env var, e.g. SDLDIRECTFB_SWITCHCONTEXT_SUPPORTED
*/
if (getenv("SDLDIRECTFB_SWITCHCONTEXT_SUPPORTED") != NULL) {
SDL_DFB_DEVICEDATA(_this);
SDL_Window *window = SDL_GetWindowFromID(id);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
if (dispdata->vidID >= 0 && dispdata->vidIDinuse) {
IDirectFBDisplayLayer *lay = NULL;
devdata->dfb->GetDisplayLayer(devdata->dfb, dispdata->vidID,
&lay);
if (lay)
lay->SwitchContext(lay, DFB_TRUE);
}
}
#endif
}
void
DirectFB_PumpEventsWindow(_THIS)
{
SDL_DFB_DEVICEDATA(_this);
DFB_WindowData *p;
DFBWindowEvent evt;
char text[5];
for (p = devdata->firstwin; p != NULL; p = p->next) {
while (p->eventbuffer->GetEvent(p->eventbuffer,
@ -67,16 +94,21 @@ DirectFB_PumpEventsWindow(_THIS)
SDL_SendMouseMotion(devdata->mouse, 0, evt.cx, evt.cy);
break;
case DWET_KEYDOWN:
DirectFB_TranslateKey(evt.key_id, evt.key_symbol,
evt.modifiers, &keysym);
DirectFB_TranslateKey(_this, &evt, &keysym);
SDL_SendKeyboardKey(devdata->keyboard, SDL_PRESSED,
keysym.scancode, keysym.sym);
keysym.scancode);
if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) {
SDL_memcpy(text, &keysym.unicode, 4);
text[4] = 0;
if (*text) {
SDL_SendKeyboardText(devdata->keyboard, text);
}
}
break;
case DWET_KEYUP:
DirectFB_TranslateKey(evt.key_id, evt.key_symbol,
evt.modifiers, &keysym);
DirectFB_TranslateKey(_this, &evt, &keysym);
SDL_SendKeyboardKey(devdata->keyboard, SDL_RELEASED,
keysym.scancode, keysym.sym);
keysym.scancode);
break;
case DWET_POSITION_SIZE:
SDL_SendWindowEvent(p->id, SDL_WINDOWEVENT_MOVED, evt.x,
@ -96,17 +128,23 @@ DirectFB_PumpEventsWindow(_THIS)
SDL_SendWindowEvent(p->id, SDL_WINDOWEVENT_CLOSE, 0, 0);
break;
case DWET_GOTFOCUS:
//TODO: Implement for yuv-overlay DirectFB_SwitchOverlayContext(this, evt.window_id);
DirectFB_SetContext(_this, p->id);
SDL_SetKeyboardFocus(devdata->keyboard, p->id);
SDL_SendWindowEvent(p->id, SDL_WINDOWEVENT_FOCUS_GAINED,
0, 0);
break;
case DWET_LOSTFOCUS:
SDL_SendWindowEvent(p->id, SDL_WINDOWEVENT_FOCUS_LOST, 0,
0);
SDL_SetKeyboardFocus(devdata->keyboard, 0);
break;
case DWET_ENTER:
//SDL_DirectFB_ReshowCursor(_this, 0);
SDL_SetMouseFocus(devdata->mouse, p->id);
SDL_SendWindowEvent(p->id, SDL_WINDOWEVENT_ENTER, 0, 0);
break;
case DWET_LEAVE:
SDL_SendWindowEvent(p->id, SDL_WINDOWEVENT_LEAVE, 0, 0);
SDL_SetMouseFocus(devdata->mouse, 0);
//SDL_DirectFB_ReshowCursor(_this, 1);
break;
@ -125,151 +163,149 @@ DirectFB_InitOSKeymap(_THIS)
/* Initialize the DirectFB key translation table */
for (i = 0; i < SDL_arraysize(keymap); ++i)
keymap[i] = SDLK_UNKNOWN;
keymap[i] = SDL_SCANCODE_UNKNOWN;
keymap[DIKI_A - DIKI_UNKNOWN] = SDLK_a;
keymap[DIKI_B - DIKI_UNKNOWN] = SDLK_b;
keymap[DIKI_C - DIKI_UNKNOWN] = SDLK_c;
keymap[DIKI_D - DIKI_UNKNOWN] = SDLK_d;
keymap[DIKI_E - DIKI_UNKNOWN] = SDLK_e;
keymap[DIKI_F - DIKI_UNKNOWN] = SDLK_f;
keymap[DIKI_G - DIKI_UNKNOWN] = SDLK_g;
keymap[DIKI_H - DIKI_UNKNOWN] = SDLK_h;
keymap[DIKI_I - DIKI_UNKNOWN] = SDLK_i;
keymap[DIKI_J - DIKI_UNKNOWN] = SDLK_j;
keymap[DIKI_K - DIKI_UNKNOWN] = SDLK_k;
keymap[DIKI_L - DIKI_UNKNOWN] = SDLK_l;
keymap[DIKI_M - DIKI_UNKNOWN] = SDLK_m;
keymap[DIKI_N - DIKI_UNKNOWN] = SDLK_n;
keymap[DIKI_O - DIKI_UNKNOWN] = SDLK_o;
keymap[DIKI_P - DIKI_UNKNOWN] = SDLK_p;
keymap[DIKI_Q - DIKI_UNKNOWN] = SDLK_q;
keymap[DIKI_R - DIKI_UNKNOWN] = SDLK_r;
keymap[DIKI_S - DIKI_UNKNOWN] = SDLK_s;
keymap[DIKI_T - DIKI_UNKNOWN] = SDLK_t;
keymap[DIKI_U - DIKI_UNKNOWN] = SDLK_u;
keymap[DIKI_V - DIKI_UNKNOWN] = SDLK_v;
keymap[DIKI_W - DIKI_UNKNOWN] = SDLK_w;
keymap[DIKI_X - DIKI_UNKNOWN] = SDLK_x;
keymap[DIKI_Y - DIKI_UNKNOWN] = SDLK_y;
keymap[DIKI_Z - DIKI_UNKNOWN] = SDLK_z;
keymap[DIKI_A - DIKI_UNKNOWN] = SDL_SCANCODE_A;
keymap[DIKI_B - DIKI_UNKNOWN] = SDL_SCANCODE_B;
keymap[DIKI_C - DIKI_UNKNOWN] = SDL_SCANCODE_C;
keymap[DIKI_D - DIKI_UNKNOWN] = SDL_SCANCODE_D;
keymap[DIKI_E - DIKI_UNKNOWN] = SDL_SCANCODE_E;
keymap[DIKI_F - DIKI_UNKNOWN] = SDL_SCANCODE_F;
keymap[DIKI_G - DIKI_UNKNOWN] = SDL_SCANCODE_G;
keymap[DIKI_H - DIKI_UNKNOWN] = SDL_SCANCODE_H;
keymap[DIKI_I - DIKI_UNKNOWN] = SDL_SCANCODE_I;
keymap[DIKI_J - DIKI_UNKNOWN] = SDL_SCANCODE_J;
keymap[DIKI_K - DIKI_UNKNOWN] = SDL_SCANCODE_K;
keymap[DIKI_L - DIKI_UNKNOWN] = SDL_SCANCODE_L;
keymap[DIKI_M - DIKI_UNKNOWN] = SDL_SCANCODE_M;
keymap[DIKI_N - DIKI_UNKNOWN] = SDL_SCANCODE_N;
keymap[DIKI_O - DIKI_UNKNOWN] = SDL_SCANCODE_O;
keymap[DIKI_P - DIKI_UNKNOWN] = SDL_SCANCODE_P;
keymap[DIKI_Q - DIKI_UNKNOWN] = SDL_SCANCODE_Q;
keymap[DIKI_R - DIKI_UNKNOWN] = SDL_SCANCODE_R;
keymap[DIKI_S - DIKI_UNKNOWN] = SDL_SCANCODE_S;
keymap[DIKI_T - DIKI_UNKNOWN] = SDL_SCANCODE_T;
keymap[DIKI_U - DIKI_UNKNOWN] = SDL_SCANCODE_U;
keymap[DIKI_V - DIKI_UNKNOWN] = SDL_SCANCODE_V;
keymap[DIKI_W - DIKI_UNKNOWN] = SDL_SCANCODE_W;
keymap[DIKI_X - DIKI_UNKNOWN] = SDL_SCANCODE_X;
keymap[DIKI_Y - DIKI_UNKNOWN] = SDL_SCANCODE_Y;
keymap[DIKI_Z - DIKI_UNKNOWN] = SDL_SCANCODE_Z;
keymap[DIKI_0 - DIKI_UNKNOWN] = SDLK_0;
keymap[DIKI_1 - DIKI_UNKNOWN] = SDLK_1;
keymap[DIKI_2 - DIKI_UNKNOWN] = SDLK_2;
keymap[DIKI_3 - DIKI_UNKNOWN] = SDLK_3;
keymap[DIKI_4 - DIKI_UNKNOWN] = SDLK_4;
keymap[DIKI_5 - DIKI_UNKNOWN] = SDLK_5;
keymap[DIKI_6 - DIKI_UNKNOWN] = SDLK_6;
keymap[DIKI_7 - DIKI_UNKNOWN] = SDLK_7;
keymap[DIKI_8 - DIKI_UNKNOWN] = SDLK_8;
keymap[DIKI_9 - DIKI_UNKNOWN] = SDLK_9;
keymap[DIKI_0 - DIKI_UNKNOWN] = SDL_SCANCODE_0;
keymap[DIKI_1 - DIKI_UNKNOWN] = SDL_SCANCODE_1;
keymap[DIKI_2 - DIKI_UNKNOWN] = SDL_SCANCODE_2;
keymap[DIKI_3 - DIKI_UNKNOWN] = SDL_SCANCODE_3;
keymap[DIKI_4 - DIKI_UNKNOWN] = SDL_SCANCODE_4;
keymap[DIKI_5 - DIKI_UNKNOWN] = SDL_SCANCODE_5;
keymap[DIKI_6 - DIKI_UNKNOWN] = SDL_SCANCODE_6;
keymap[DIKI_7 - DIKI_UNKNOWN] = SDL_SCANCODE_7;
keymap[DIKI_8 - DIKI_UNKNOWN] = SDL_SCANCODE_8;
keymap[DIKI_9 - DIKI_UNKNOWN] = SDL_SCANCODE_9;
keymap[DIKI_F1 - DIKI_UNKNOWN] = SDLK_F1;
keymap[DIKI_F2 - DIKI_UNKNOWN] = SDLK_F2;
keymap[DIKI_F3 - DIKI_UNKNOWN] = SDLK_F3;
keymap[DIKI_F4 - DIKI_UNKNOWN] = SDLK_F4;
keymap[DIKI_F5 - DIKI_UNKNOWN] = SDLK_F5;
keymap[DIKI_F6 - DIKI_UNKNOWN] = SDLK_F6;
keymap[DIKI_F7 - DIKI_UNKNOWN] = SDLK_F7;
keymap[DIKI_F8 - DIKI_UNKNOWN] = SDLK_F8;
keymap[DIKI_F9 - DIKI_UNKNOWN] = SDLK_F9;
keymap[DIKI_F10 - DIKI_UNKNOWN] = SDLK_F10;
keymap[DIKI_F11 - DIKI_UNKNOWN] = SDLK_F11;
keymap[DIKI_F12 - DIKI_UNKNOWN] = SDLK_F12;
keymap[DIKI_F1 - DIKI_UNKNOWN] = SDL_SCANCODE_F1;
keymap[DIKI_F2 - DIKI_UNKNOWN] = SDL_SCANCODE_F2;
keymap[DIKI_F3 - DIKI_UNKNOWN] = SDL_SCANCODE_F3;
keymap[DIKI_F4 - DIKI_UNKNOWN] = SDL_SCANCODE_F4;
keymap[DIKI_F5 - DIKI_UNKNOWN] = SDL_SCANCODE_F5;
keymap[DIKI_F6 - DIKI_UNKNOWN] = SDL_SCANCODE_F6;
keymap[DIKI_F7 - DIKI_UNKNOWN] = SDL_SCANCODE_F7;
keymap[DIKI_F8 - DIKI_UNKNOWN] = SDL_SCANCODE_F8;
keymap[DIKI_F9 - DIKI_UNKNOWN] = SDL_SCANCODE_F9;
keymap[DIKI_F10 - DIKI_UNKNOWN] = SDL_SCANCODE_F10;
keymap[DIKI_F11 - DIKI_UNKNOWN] = SDL_SCANCODE_F11;
keymap[DIKI_F12 - DIKI_UNKNOWN] = SDL_SCANCODE_F12;
keymap[DIKI_ESCAPE - DIKI_UNKNOWN] = SDLK_ESCAPE;
keymap[DIKI_LEFT - DIKI_UNKNOWN] = SDLK_LEFT;
keymap[DIKI_RIGHT - DIKI_UNKNOWN] = SDLK_RIGHT;
keymap[DIKI_UP - DIKI_UNKNOWN] = SDLK_UP;
keymap[DIKI_DOWN - DIKI_UNKNOWN] = SDLK_DOWN;
keymap[DIKI_CONTROL_L - DIKI_UNKNOWN] = SDLK_LCTRL;
keymap[DIKI_CONTROL_R - DIKI_UNKNOWN] = SDLK_RCTRL;
keymap[DIKI_SHIFT_L - DIKI_UNKNOWN] = SDLK_LSHIFT;
keymap[DIKI_SHIFT_R - DIKI_UNKNOWN] = SDLK_RSHIFT;
keymap[DIKI_ALT_L - DIKI_UNKNOWN] = SDLK_LALT;
keymap[DIKI_ALT_R - DIKI_UNKNOWN] = SDLK_RALT;
keymap[DIKI_TAB - DIKI_UNKNOWN] = SDLK_TAB;
keymap[DIKI_ENTER - DIKI_UNKNOWN] = SDLK_RETURN;
keymap[DIKI_SPACE - DIKI_UNKNOWN] = SDLK_SPACE;
keymap[DIKI_BACKSPACE - DIKI_UNKNOWN] = SDLK_BACKSPACE;
keymap[DIKI_INSERT - DIKI_UNKNOWN] = SDLK_INSERT;
keymap[DIKI_DELETE - DIKI_UNKNOWN] = SDLK_DELETE;
keymap[DIKI_HOME - DIKI_UNKNOWN] = SDLK_HOME;
keymap[DIKI_END - DIKI_UNKNOWN] = SDLK_END;
keymap[DIKI_PAGE_UP - DIKI_UNKNOWN] = SDLK_PAGEUP;
keymap[DIKI_PAGE_DOWN - DIKI_UNKNOWN] = SDLK_PAGEDOWN;
keymap[DIKI_CAPS_LOCK - DIKI_UNKNOWN] = SDLK_CAPSLOCK;
keymap[DIKI_NUM_LOCK - DIKI_UNKNOWN] = SDLK_NUMLOCK;
keymap[DIKI_SCROLL_LOCK - DIKI_UNKNOWN] = SDLK_SCROLLOCK;
keymap[DIKI_PRINT - DIKI_UNKNOWN] = SDLK_PRINT;
keymap[DIKI_PAUSE - DIKI_UNKNOWN] = SDLK_PAUSE;
keymap[DIKI_ESCAPE - DIKI_UNKNOWN] = SDL_SCANCODE_ESCAPE;
keymap[DIKI_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_LEFT;
keymap[DIKI_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_RIGHT;
keymap[DIKI_UP - DIKI_UNKNOWN] = SDL_SCANCODE_UP;
keymap[DIKI_DOWN - DIKI_UNKNOWN] = SDL_SCANCODE_DOWN;
keymap[DIKI_CONTROL_L - DIKI_UNKNOWN] = SDL_SCANCODE_LCTRL;
keymap[DIKI_CONTROL_R - DIKI_UNKNOWN] = SDL_SCANCODE_RCTRL;
keymap[DIKI_SHIFT_L - DIKI_UNKNOWN] = SDL_SCANCODE_LSHIFT;
keymap[DIKI_SHIFT_R - DIKI_UNKNOWN] = SDL_SCANCODE_RSHIFT;
keymap[DIKI_ALT_L - DIKI_UNKNOWN] = SDL_SCANCODE_LALT;
keymap[DIKI_ALT_R - DIKI_UNKNOWN] = SDL_SCANCODE_RALT;
keymap[DIKI_META_L - DIKI_UNKNOWN] = SDL_SCANCODE_LGUI;
keymap[DIKI_META_R - DIKI_UNKNOWN] = SDL_SCANCODE_RGUI;
keymap[DIKI_SUPER_L - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
keymap[DIKI_SUPER_R - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
//FIXME:Do we read hyper keys ?
//keymap[DIKI_HYPER_L - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
//keymap[DIKI_HYPER_R - DIKI_UNKNOWN] = SDL_SCANCODE_APPLICATION;
keymap[DIKI_TAB - DIKI_UNKNOWN] = SDL_SCANCODE_TAB;
keymap[DIKI_ENTER - DIKI_UNKNOWN] = SDL_SCANCODE_RETURN;
keymap[DIKI_SPACE - DIKI_UNKNOWN] = SDL_SCANCODE_SPACE;
keymap[DIKI_BACKSPACE - DIKI_UNKNOWN] = SDL_SCANCODE_BACKSPACE;
keymap[DIKI_INSERT - DIKI_UNKNOWN] = SDL_SCANCODE_INSERT;
keymap[DIKI_DELETE - DIKI_UNKNOWN] = SDL_SCANCODE_DELETE;
keymap[DIKI_HOME - DIKI_UNKNOWN] = SDL_SCANCODE_HOME;
keymap[DIKI_END - DIKI_UNKNOWN] = SDL_SCANCODE_END;
keymap[DIKI_PAGE_UP - DIKI_UNKNOWN] = SDL_SCANCODE_PAGEUP;
keymap[DIKI_PAGE_DOWN - DIKI_UNKNOWN] = SDL_SCANCODE_PAGEDOWN;
keymap[DIKI_CAPS_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_CAPSLOCK;
keymap[DIKI_NUM_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_NUMLOCKCLEAR;
keymap[DIKI_SCROLL_LOCK - DIKI_UNKNOWN] = SDL_SCANCODE_SCROLLLOCK;
keymap[DIKI_PRINT - DIKI_UNKNOWN] = SDL_SCANCODE_PRINTSCREEN;
keymap[DIKI_PAUSE - DIKI_UNKNOWN] = SDL_SCANCODE_PAUSE;
keymap[DIKI_KP_EQUAL - DIKI_UNKNOWN] = SDLK_KP_EQUALS;
keymap[DIKI_KP_DECIMAL - DIKI_UNKNOWN] = SDLK_KP_PERIOD;
keymap[DIKI_KP_0 - DIKI_UNKNOWN] = SDLK_KP0;
keymap[DIKI_KP_1 - DIKI_UNKNOWN] = SDLK_KP1;
keymap[DIKI_KP_2 - DIKI_UNKNOWN] = SDLK_KP2;
keymap[DIKI_KP_3 - DIKI_UNKNOWN] = SDLK_KP3;
keymap[DIKI_KP_4 - DIKI_UNKNOWN] = SDLK_KP4;
keymap[DIKI_KP_5 - DIKI_UNKNOWN] = SDLK_KP5;
keymap[DIKI_KP_6 - DIKI_UNKNOWN] = SDLK_KP6;
keymap[DIKI_KP_7 - DIKI_UNKNOWN] = SDLK_KP7;
keymap[DIKI_KP_8 - DIKI_UNKNOWN] = SDLK_KP8;
keymap[DIKI_KP_9 - DIKI_UNKNOWN] = SDLK_KP9;
keymap[DIKI_KP_DIV - DIKI_UNKNOWN] = SDLK_KP_DIVIDE;
keymap[DIKI_KP_MULT - DIKI_UNKNOWN] = SDLK_KP_MULTIPLY;
keymap[DIKI_KP_MINUS - DIKI_UNKNOWN] = SDLK_KP_MINUS;
keymap[DIKI_KP_PLUS - DIKI_UNKNOWN] = SDLK_KP_PLUS;
keymap[DIKI_KP_ENTER - DIKI_UNKNOWN] = SDLK_KP_ENTER;
keymap[DIKI_KP_EQUAL - DIKI_UNKNOWN] = SDL_SCANCODE_KP_EQUALS;
keymap[DIKI_KP_DECIMAL - DIKI_UNKNOWN] = SDL_SCANCODE_KP_PERIOD;
keymap[DIKI_KP_0 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_0;
keymap[DIKI_KP_1 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_1;
keymap[DIKI_KP_2 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_2;
keymap[DIKI_KP_3 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_3;
keymap[DIKI_KP_4 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_4;
keymap[DIKI_KP_5 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_5;
keymap[DIKI_KP_6 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_6;
keymap[DIKI_KP_7 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_7;
keymap[DIKI_KP_8 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_8;
keymap[DIKI_KP_9 - DIKI_UNKNOWN] = SDL_SCANCODE_KP_9;
keymap[DIKI_KP_DIV - DIKI_UNKNOWN] = SDL_SCANCODE_KP_DIVIDE;
keymap[DIKI_KP_MULT - DIKI_UNKNOWN] = SDL_SCANCODE_KP_MULTIPLY;
keymap[DIKI_KP_MINUS - DIKI_UNKNOWN] = SDL_SCANCODE_KP_MINUS;
keymap[DIKI_KP_PLUS - DIKI_UNKNOWN] = SDL_SCANCODE_KP_PLUS;
keymap[DIKI_KP_ENTER - DIKI_UNKNOWN] = SDL_SCANCODE_KP_ENTER;
keymap[DIKI_QUOTE_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_GRAVE; /* TLDE */
keymap[DIKI_MINUS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_MINUS; /* AE11 */
keymap[DIKI_EQUALS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_EQUALS; /* AE12 */
keymap[DIKI_BRACKET_LEFT - DIKI_UNKNOWN] = SDL_SCANCODE_RIGHTBRACKET; /* AD11 */
keymap[DIKI_BRACKET_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_LEFTBRACKET; /* AD12 */
keymap[DIKI_BACKSLASH - DIKI_UNKNOWN] = SDL_SCANCODE_BACKSLASH; /* BKSL */
keymap[DIKI_SEMICOLON - DIKI_UNKNOWN] = SDL_SCANCODE_SEMICOLON; /* AC10 */
keymap[DIKI_QUOTE_RIGHT - DIKI_UNKNOWN] = SDL_SCANCODE_APOSTROPHE; /* AC11 */
keymap[DIKI_COMMA - DIKI_UNKNOWN] = SDL_SCANCODE_COMMA; /* AB08 */
keymap[DIKI_PERIOD - DIKI_UNKNOWN] = SDL_SCANCODE_PERIOD; /* AB09 */
keymap[DIKI_SLASH - DIKI_UNKNOWN] = SDL_SCANCODE_SLASH; /* AB10 */
keymap[DIKI_LESS_SIGN - DIKI_UNKNOWN] = SDL_SCANCODE_NONUSBACKSLASH; /* 103rd */
keymap[DIKI_QUOTE_LEFT - DIKI_UNKNOWN] = SDLK_BACKQUOTE; /* TLDE */
keymap[DIKI_MINUS_SIGN - DIKI_UNKNOWN] = SDLK_MINUS; /* AE11 */
keymap[DIKI_EQUALS_SIGN - DIKI_UNKNOWN] = SDLK_EQUALS; /* AE12 */
keymap[DIKI_BRACKET_LEFT - DIKI_UNKNOWN] = SDLK_RIGHTBRACKET; /* AD11 */
keymap[DIKI_BRACKET_RIGHT - DIKI_UNKNOWN] = SDLK_LEFTBRACKET; /* AD12 */
keymap[DIKI_BACKSLASH - DIKI_UNKNOWN] = SDLK_BACKSLASH; /* BKSL */
keymap[DIKI_SEMICOLON - DIKI_UNKNOWN] = SDLK_SEMICOLON; /* AC10 */
keymap[DIKI_QUOTE_RIGHT - DIKI_UNKNOWN] = SDLK_QUOTE; /* AC11 */
keymap[DIKI_COMMA - DIKI_UNKNOWN] = SDLK_COMMA; /* AB08 */
keymap[DIKI_PERIOD - DIKI_UNKNOWN] = SDLK_PERIOD; /* AB09 */
keymap[DIKI_SLASH - DIKI_UNKNOWN] = SDLK_SLASH; /* AB10 */
keymap[DIKI_LESS_SIGN - DIKI_UNKNOWN] = SDLK_LESS; /* 103rd */
}
static SDL_keysym *
DirectFB_TranslateKey(DFBInputDeviceKeyIdentifier key_id,
DFBInputDeviceKeySymbol key_symbol,
DFBInputDeviceModifierMask key_mod, SDL_keysym * keysym)
DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt, SDL_keysym * keysym)
{
SDLMod mod = KMOD_NONE;
SDL_DFB_DEVICEDATA(_this);
/*
* Set modifier information
*/
if (key_mod & DIMM_SHIFT)
mod = mod | KMOD_LSHIFT;
if (key_mod & DIMM_CONTROL)
mod = mod | KMOD_LCTRL;
if (key_mod & DIMM_ALT)
mod = mod | KMOD_LALT;
if (key_mod & DIMM_ALTGR)
mod = mod | KMOD_RALT;
if (key_mod & DIMM_META)
mod = mod | KMOD_LMETA;
/* Set the keysym information */
keysym->scancode = key_id;
keysym->mod = mod;
keysym->unicode =
(DFB_KEY_TYPE(key_symbol) == DIKT_UNICODE) ? key_symbol : 0;
if (key_symbol > 0 && key_symbol < 255)
keysym->sym = key_symbol;
if (evt->key_code >= 0
&& evt->key_code < SDL_arraysize(linux_scancode_table))
keysym->scancode = linux_scancode_table[evt->key_code]; // key_id;
else
keysym->sym = keymap[key_id - DIKI_UNKNOWN];
keysym->scancode = SDL_SCANCODE_UNKNOWN;
if (keysym->scancode == SDL_SCANCODE_UNKNOWN || devdata->kbdgeneric) {
if (evt->key_id - DIKI_UNKNOWN < SDL_arraysize(keymap))
keysym->scancode = keymap[evt->key_id - DIKI_UNKNOWN];
else
keysym->scancode = SDL_SCANCODE_UNKNOWN;
}
keysym->unicode =
(DFB_KEY_TYPE(evt->key_symbol) == DIKT_UNICODE) ? evt->key_symbol : 0;
if (keysym->unicode == 0
&& (evt->key_symbol > 0 && evt->key_symbol < 255))
keysym->unicode = evt->key_symbol;
return keysym;
}
@ -289,7 +325,43 @@ DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button)
}
}
static DFBEnumerationResult
input_device_cb(DFBInputDeviceID device_id, DFBInputDeviceDescription desc,
void *callbackdata)
{
DFB_DeviceData *devdata = callbackdata;
SDL_Keyboard keyboard;
SDL_scancode scancode;
SDLKey keymap[SDL_NUM_SCANCODES];
if ((desc.caps & DIDTF_KEYBOARD) && device_id == DIDID_KEYBOARD) {
SDL_zero(keyboard);
devdata->keyboard = SDL_AddKeyboard(&keyboard, -1);
if (!strncmp("X11", desc.name, 3))
devdata->kbdgeneric = 1;
SDL_GetDefaultKeymap(keymap);
SDL_SetKeymap(devdata->keyboard, 0, keymap, SDL_NUM_SCANCODES);
}
return DFB_OK;
}
void
DirectFB_InitKeyboard(_THIS)
{
SDL_DFB_DEVICEDATA(_this);
int ret;
DirectFB_InitOSKeymap(_this);
devdata->kbdgeneric = 0;
SDL_DFB_CHECK(devdata->dfb->
EnumInputDevices(devdata->dfb, input_device_cb, devdata));
}
#if 0
/* FIXME: Remove once determined this is not needed in fullscreen mode */
void
DirectFB_PumpEvents(_THIS)
{

View File

@ -24,5 +24,6 @@
#include "SDL_DirectFB_video.h"
/* Functions to be exported */
extern void DirectFB_InitOSKeymap(_THIS);
extern void DirectFB_InitKeyboard(_THIS);
extern void DirectFB_PumpEventsWindow(_THIS);
extern SDLKey DirectFB_GetLayoutKey(_THIS, SDLKey physicalKey);

View File

@ -80,7 +80,7 @@ DirectFB_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
dsc.flags =
DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
dsc.caps = DSCAPS_NONE; //DSCAPS_SYSTEMONLY;
dsc.caps = DSCAPS_VIDEOONLY;
dsc.width = surface->w;
dsc.height = surface->h;
dsc.pixelformat = DSPF_ARGB;
@ -101,7 +101,6 @@ DirectFB_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
dest[i] = 0x00000000;
else
dest[i] = p[i];
//memcpy(dest, surface->pixels, surface->w * surface->h * 4);
curdata->surf->Unlock(curdata->surf);
return cursor;
error:
@ -112,7 +111,6 @@ DirectFB_CreateCursor(SDL_Surface * surface, int hot_x, int hot_y)
static int
DirectFB_ShowCursor(SDL_Cursor * cursor)
{
//FIXME check for null cursor here
SDL_DFB_CURSORDATA(cursor);
SDL_VideoDevice *dev = SDL_GetVideoDevice();
SDL_DFB_DEVICEDATA(dev);
@ -136,7 +134,6 @@ DirectFB_ShowCursor(SDL_Cursor * cursor)
SDL_DFB_CHECKERR(windata->window->
SetCursorShape(windata->window, curdata->surf,
curdata->hotx, curdata->hoty));
//FIXME: This is somehow a directfb issue
//TODO: Check administrative
SDL_DFB_CHECKERR(dispdata->layer->
SetCooperativeLevel(dispdata->layer,
@ -176,7 +173,6 @@ DirectFB_FreeCursor(SDL_Cursor * cursor)
static void
DirectFB_WarpMouse(SDL_Mouse * mouse, SDL_WindowID windowID, int x, int y)
{
// SDL_DFB_CURSORDATA(cursor);
SDL_Window *window = SDL_GetWindowFromID(windowID);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;

View File

@ -87,7 +87,8 @@ SDL_RenderDriver DirectFB_RenderDriver = {
(SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_COLOR |
SDL_TEXTUREMODULATE_ALPHA),
(SDL_TEXTUREBLENDMODE_NONE | SDL_TEXTUREBLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_MOD),
SDL_TEXTUREBLENDMODE_BLEND | SDL_TEXTUREBLENDMODE_ADD |
SDL_TEXTUREBLENDMODE_MOD),
(SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST),
14,
{
@ -124,16 +125,9 @@ typedef struct
void *pixels;
int pitch;
IDirectFBPalette *palette;
DFB_DisplayData *display;
} DirectFB_TextureData;
static void
UpdateYUVTextureData(SDL_Texture * texture)
{
/*
* Not needed - directfb supports yuv surfaces
*/
}
void
DirectFB_AddRenderDriver(_THIS)
{
@ -178,7 +172,7 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->DestroyTexture = DirectFB_DestroyTexture;
renderer->DestroyRenderer = DirectFB_DestroyRenderer;
renderer->info = DirectFB_RenderDriver.info;
renderer->window = window->id; // SDL window id
renderer->window = window->id; /* SDL window id */
renderer->driverdata = data;
renderer->info.flags =
@ -200,7 +194,7 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
else
renderer->info.flags |= SDL_RENDERER_SINGLEBUFFER;
data->isyuvdirect = 0;
data->isyuvdirect = 1; /* default is on! */
p = getenv("SDL_DIRECTFB_YUV_DIRECT");
if (p)
data->isyuvdirect = atoi(p);
@ -292,6 +286,55 @@ DirectFB_DisplayModeChanged(SDL_Renderer * renderer)
return -1;
}
static int
DirectFB_AcquireVidLayer(SDL_Renderer * renderer, SDL_Texture * texture)
{
SDL_DFB_RENDERERDATA(renderer);
SDL_Window *window = SDL_GetWindowFromID(renderer->window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
SDL_DFB_DEVICEDATA(display->device);
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
DirectFB_TextureData *data = texture->driverdata;
DFBDisplayLayerConfig layconf;
int ret;
if (renddata->isyuvdirect && (dispdata->vidID >= 0)
&& (!dispdata->vidIDinuse)
&& SDL_ISPIXELFORMAT_FOURCC(data->format)) {
layconf.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT;
layconf.width = texture->w;
layconf.height = texture->h;
layconf.pixelformat = SDLToDFBPixelFormat(data->format);
SDL_DFB_CHECKERR(devdata->dfb->
GetDisplayLayer(devdata->dfb, dispdata->vidID,
&data->vidlayer));
SDL_DFB_CHECKERR(data->vidlayer->
SetCooperativeLevel(data->vidlayer,
DLSCL_EXCLUSIVE));
SDL_DFB_CHECKERR(data->vidlayer->
SetConfiguration(data->vidlayer, &layconf));
SDL_DFB_CHECKERR(data->vidlayer->
GetSurface(data->vidlayer, &data->surface));
//SDL_DFB_CHECKERR(data->vidlayer->GetDescription(data->vidlayer, laydsc));
dispdata->vidIDinuse = 1;
data->display = dispdata;
SDL_DFB_DEBUG("Created HW YUV surface\n");
return 0;
}
return 1;
error:
if (data->vidlayer) {
SDL_DFB_RELEASE(data->surface);
SDL_DFB_CHECKERR(data->vidlayer->
SetCooperativeLevel(data->vidlayer,
DLSCL_ADMINISTRATIVE));
SDL_DFB_RELEASE(data->vidlayer);
}
return 1;
}
static int
DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
{
@ -300,7 +343,6 @@ DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
SDL_DFB_WINDOWDATA(window);
SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
SDL_DFB_DEVICEDATA(display->device);
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
DirectFB_TextureData *data;
DFBResult ret;
DFBSurfaceDescription dsc;
@ -313,37 +355,23 @@ DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
data->format = texture->format;
data->pitch = (texture->w * SDL_BYTESPERPIXEL(data->format));
data->vidlayer = NULL;
if (renddata->isyuvdirect && (dispdata->vidID >= 0)
&& SDL_ISPIXELFORMAT_FOURCC(data->format)) {
SDL_DFB_CHECKERR(devdata->dfb->
GetDisplayLayer(devdata->dfb, dispdata->vidID,
&data->vidlayer));
layconf.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_PIXELFORMAT;
layconf.width = texture->w;
layconf.height = texture->h;
layconf.pixelformat = SDLToDFBPixelFormat(data->format);
SDL_DFB_CHECKERR(data->vidlayer->
SetCooperativeLevel(data->vidlayer,
DLSCL_EXCLUSIVE));
SDL_DFB_CHECKERR(data->vidlayer->
SetConfiguration(data->vidlayer, &layconf));
SDL_DFB_CHECKERR(data->vidlayer->
GetSurface(data->vidlayer, &data->surface));
SDL_DFB_CHECKERR(data->vidlayer->
GetDescription(data->vidlayer, &laydsc));
SDL_DFB_DEBUG("Created HW YUV surface\n");
}
if (!data->vidlayer) {
if (DirectFB_AcquireVidLayer(renderer, texture) != 0) {
/* fill surface description */
dsc.flags =
DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
dsc.width = texture->w;
dsc.height = texture->h;
/* Never use DSCAPS_VIDEOONLY here. It kills performance
/* <1.2 Never use DSCAPS_VIDEOONLY here. It kills performance
* No DSCAPS_SYSTEMONLY either - let dfb decide
* 1.2: DSCAPS_SYSTEMONLY boosts performance by factor ~8
*/
dsc.caps = 0; //DSCAPS_PREMULTIPLIED;
dsc.caps = DSCAPS_PREMULTIPLIED;
if (texture->access == SDL_TEXTUREACCESS_STREAMING)
dsc.caps |= DSCAPS_SYSTEMONLY;
else
dsc.caps |= DSCAPS_VIDEOONLY;
/* find the right pixelformat */
@ -469,6 +497,7 @@ DirectFB_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
case SDL_TEXTUREBLENDMODE_NONE:
case SDL_TEXTUREBLENDMODE_MASK:
case SDL_TEXTUREBLENDMODE_BLEND:
case SDL_TEXTUREBLENDMODE_ADD:
case SDL_TEXTUREBLENDMODE_MOD:
return 0;
default:
@ -513,8 +542,8 @@ DirectFB_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
size_t length;
SDL_DFB_CHECKERR(data->surface->Lock(data->surface,
DSLF_WRITE | DSLF_READ, &dpixels,
&dpitch));
DSLF_WRITE | DSLF_READ,
((void **) &dpixels), &dpitch));
src = (Uint8 *) pixels;
dst =
(Uint8 *) dpixels + rect->y * dpitch +
@ -648,27 +677,52 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
if (texture->
modMode & (SDL_TEXTUREMODULATE_COLOR | SDL_TEXTUREMODULATE_ALPHA))
{
u8 alpha = 0xFF;
if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA)
Uint8 alpha = 0xFF;
if (texture->modMode & SDL_TEXTUREMODULATE_ALPHA) {
alpha = texture->a;
if (texture->modMode & SDL_TEXTUREMODULATE_COLOR)
flags |= DSBLIT_SRC_PREMULTCOLOR;
SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, 0xFF,
0xFF, 0xFF, alpha));
}
if (texture->modMode & SDL_TEXTUREMODULATE_COLOR) {
SDL_DFB_CHECKERR(data->surface->
SetColor(data->surface, texture->r,
texture->g, texture->b, alpha));
else
SDL_DFB_CHECKERR(data->surface->SetColor(data->surface, 0xFF,
0xFF, 0xFF, alpha));
// Only works together ....
flags |= DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR;
/* Only works together .... */
flags |= DSBLIT_COLORIZE | DSBLIT_SRC_PREMULTCOLOR;
}
}
if (texture->
blendMode & (SDL_TEXTUREBLENDMODE_MASK |
SDL_TEXTUREBLENDMODE_BLEND)) {
flags |= DSBLIT_BLEND_ALPHACHANNEL;
} else {
switch (texture->blendMode) {
case SDL_TEXTUREBLENDMODE_NONE: /**< No blending */
flags |= DSBLIT_NOFX;
data->surface->SetSrcBlendFunction(data->surface, DSBF_ONE);
data->surface->SetDstBlendFunction(data->surface, DSBF_ZERO);
break;
case SDL_TEXTUREBLENDMODE_MASK: /**< dst = A ? src : dst (alpha is mask) */
flags |= DSBLIT_BLEND_ALPHACHANNEL;
data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA);
data->surface->SetDstBlendFunction(data->surface,
DSBF_INVSRCALPHA);
break;
case SDL_TEXTUREBLENDMODE_BLEND:/**< dst = (src * A) + (dst * (1-A)) */
flags |= DSBLIT_BLEND_ALPHACHANNEL;
data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA);
data->surface->SetDstBlendFunction(data->surface,
DSBF_INVSRCALPHA);
break;
case SDL_TEXTUREBLENDMODE_ADD: /**< dst = (src * A) + dst */
flags |= DSBLIT_BLEND_ALPHACHANNEL;
data->surface->SetSrcBlendFunction(data->surface, DSBF_SRCALPHA);
data->surface->SetDstBlendFunction(data->surface, DSBF_ONE);
break;
case SDL_TEXTUREBLENDMODE_MOD: /**< dst = src * dst */
flags |= DSBLIT_BLEND_ALPHACHANNEL;
data->surface->SetSrcBlendFunction(data->surface, DSBF_DESTCOLOR);
data->surface->SetDstBlendFunction(data->surface, DSBF_ZERO);
break;
}
SDL_DFB_CHECKERR(data->surface->
SetBlittingFlags(data->surface, flags));
if (srcrect->w == dstrect->w && srcrect->h == dstrect->h) {
@ -720,6 +774,11 @@ DirectFB_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
}
SDL_DFB_RELEASE(data->palette);
SDL_DFB_RELEASE(data->surface);
if (data->display) {
data->display->vidIDinuse = 0;
data->vidlayer->SetCooperativeLevel(data->vidlayer,
DLSCL_ADMINISTRATIVE);
}
SDL_DFB_RELEASE(data->vidlayer);
SDL_free(data);
texture->driverdata = NULL;

View File

@ -23,11 +23,6 @@
*/
/* TODO: Various
* Add Mouse support from 1.2 directfb driver
* - Interface is defined in SDL_Mouse.c.h
* - Default Cursor automatically created
*/
#include "SDL_config.h"
@ -141,7 +136,6 @@ DirectFB_CreateDevice(int devindex)
device->GetDisplayGammaRamp = NULL;
#endif
device->PumpEvents = DirectFB_PumpEventsWindow;
device->CreateWindow = DirectFB_CreateWindow;
device->CreateWindowFrom = DirectFB_CreateWindowFrom;
device->SetWindowTitle = DirectFB_SetWindowTitle;
@ -299,14 +293,11 @@ DirectFB_VideoInit(_THIS)
DFB_DisplayData *dispdata;
DFB_DeviceData *devdata;
SDL_DisplayMode mode;
SDL_Keyboard keyboard;
int i;
DFBResult ret;
int tcw[DFB_MAX_SCREENS];
int tch[DFB_MAX_SCREENS];
SDL_zero(keyboard);
SDL_DFB_CHECKERR(DirectFBInit(NULL, NULL));
SDL_DFB_CHECKERR(DirectFBCreate(&dfb));
@ -325,7 +316,15 @@ DirectFB_VideoInit(_THIS)
devdata->aux = i;
SDL_DFB_CHECKERR(screen->
EnumDisplayLayers(screen, &cbLayers, devdata));
#if (DIRECTFB_MAJOR_VERSION >= 1)
screen->GetSize(screen, &tcw[i], &tch[i]);
#else
/* FIXME: this is only used to center windows
* Should be done otherwise, e.g. get surface from layer
*/
tcw[i] = 800;
tch[i] = 600;
#endif
screen->Release(screen);
}
@ -369,6 +368,7 @@ DirectFB_VideoInit(_THIS)
/* YUV - Video layer */
dispdata->vidID = devdata->vidlayer[i];
dispdata->vidIDinuse = 0;
SDL_zero(display);
@ -400,9 +400,8 @@ DirectFB_VideoInit(_THIS)
DirectFB_AddRenderDriver(_this);
DirectFB_InitMouse(_this);
DirectFB_InitKeyboard(_this);
//devdata->mouse = SDL_AddMouse(&mouse, -1);
devdata->keyboard = SDL_AddKeyboard(&keyboard, -1);
DirectFB_InitOSKeymap(_this);
return 0;
@ -453,8 +452,6 @@ DirectFB_VideoQuit(_THIS)
//SDL_free(dispdata);
}
//SDL_DFB_RELEASE(devdata->eventbuffer);
SDL_DFB_RELEASE(devdata->dfb);
SDL_DelMouse(devdata->mouse);
@ -579,12 +576,13 @@ DirectFB_SetDisplayMode(_THIS, SDL_DisplayMode * mode)
DFBDisplayLayerConfig config, rconfig;
DFBDisplayLayerConfigFlags fail = 0;
DFBResult ret;
DFB_WindowData *win;
SDL_DFB_CHECKERR(data->layer->
SetCooperativeLevel(data->layer, DLSCL_ADMINISTRATIVE));
SDL_DFB_CHECKERR(data->layer->GetConfiguration(data->layer, &config));
config.flags = DLCONF_WIDTH | DLCONF_HEIGHT | DLCONF_BUFFERMODE;
config.flags = DLCONF_WIDTH | DLCONF_HEIGHT; // | DLCONF_BUFFERMODE;
if (mode->format != SDL_PIXELFORMAT_UNKNOWN) {
config.flags |= DLCONF_PIXELFORMAT;
config.pixelformat = SDLToDFBPixelFormat(mode->format);
@ -593,7 +591,7 @@ DirectFB_SetDisplayMode(_THIS, SDL_DisplayMode * mode)
config.width = mode->w;
config.height = mode->h;
config.buffermode = DLBM_BACKVIDEO;
//config.buffermode = DLBM_BACKVIDEO;
//config.pixelformat = GetFormatForBpp (bpp, HIDDEN->layer);
@ -614,12 +612,35 @@ DirectFB_SetDisplayMode(_THIS, SDL_DisplayMode * mode)
if ((config.width != rconfig.width) ||
(config.height != rconfig.height) ||
(config.pixelformat != rconfig.pixelformat)) {
((mode->format != SDL_PIXELFORMAT_UNKNOWN)
&& (config.pixelformat != rconfig.pixelformat))) {
SDL_DFB_DEBUG("Error setting mode %dx%d-%x\n", mode->w, mode->h,
mode->format);
return -1;
}
data->pixelformat = rconfig.pixelformat;
data->cw = config.width;
data->ch = config.height;
SDL_CurrentDisplay.current_mode = *mode;
/*
* FIXME: video mode switch is currently broken
*
* DirectFB 1.2.0-rc1 even has a broken cursor after a switch
* The following code needs to be revisited whether it is still
* needed once the switch works again.
*/
win = devdata->firstwin;
while (win) {
SDL_DFB_RELEASE(win->surface);
SDL_DFB_CHECKERR(win->window->GetSurface(win->window, &win->surface));
win = win->next;
}
return 0;
error:
return -1;
@ -680,8 +701,16 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
}
desc.flags =
DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS | DWDESC_PIXELFORMAT |
DWDESC_WIDTH | DWDESC_HEIGHT /*| DWDESC_CAPS */ | DWDESC_PIXELFORMAT
|
DWDESC_SURFACE_CAPS;
#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 0)
/* Needed for 1.2 */
desc.flags |= DWDESC_POSX | DWDESC_POSY;
desc.posx = x;
desc.posy = y;
#else
if (!(window->flags & SDL_WINDOW_FULLSCREEN)
&& window->x != SDL_WINDOWPOS_UNDEFINED
&& window->y != SDL_WINDOWPOS_UNDEFINED) {
@ -689,12 +718,13 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
desc.posx = x;
desc.posy = y;
}
#endif
desc.width = window->w;
desc.height = window->h;
desc.pixelformat = dispdata->pixelformat;
desc.caps = 0; //DWCAPS_DOUBLEBUFFER;
desc.surface_caps = DSCAPS_DOUBLE | DSCAPS_TRIPLE; //| DSCAPS_PREMULTIPLIED;
desc.caps = 0; // DWCAPS_DOUBLEBUFFER;
desc.surface_caps = DSCAPS_DOUBLE | DSCAPS_TRIPLE / DSCAPS_PREMULTIPLIED;
/* Create the window. */
SDL_DFB_CHECKERR(dispdata->layer->
@ -790,21 +820,52 @@ DirectFB_SetWindowPosition(_THIS, SDL_Window * window)
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window);
SDL_DFB_DISPLAYDATA(_this, window);
int x, y;
if (!(window->flags & SDL_WINDOW_FULLSCREEN))
windata->window->MoveTo(windata->window, window->x, window->y);
if (window->y == SDL_WINDOWPOS_UNDEFINED)
y = 0;
else
y = window->y;
if (window->x == SDL_WINDOWPOS_UNDEFINED)
x = 0;
else
x = window->x;
if (window->flags & SDL_WINDOW_FULLSCREEN) {
x = 0;
y = 0;
}
//if (!(window->flags & SDL_WINDOW_FULLSCREEN))
windata->window->MoveTo(windata->window, x, y);
}
static void
DirectFB_SetWindowSize(_THIS, SDL_Window * window)
{
int ret;
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window);
SDL_DFB_DISPLAYDATA(_this, window);
if (!(window->flags & SDL_WINDOW_FULLSCREEN))
windata->window->Resize(windata->window, window->w, window->h);
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
int ch, cw;
// SDL_DFB_DEBUG("Resize %d %d %d %d\n", cw, ch, window->w, window->h);
#if (DIRECTFB_MAJOR_VERSION == 1) && (DIRECTFB_MINOR_VERSION >= 0)
SDL_DFB_CHECKERR(windata->window->
ResizeSurface(windata->window, window->w,
window->h));
#else
SDL_DFB_CHECKERR(windata->window->
Resize(windata->window, window->w, window->h));
#endif
SDL_DFB_CHECKERR(windata->window->GetSize(windata->window, &window->w, &window->h)); /* if a window manager should have decided otherwise */
}
error:
return;
}
static void
DirectFB_ShowWindow(_THIS, SDL_Window * window)
{

View File

@ -114,8 +114,11 @@ struct _DFB_DisplayData
{
IDirectFBDisplayLayer *layer;
DFBSurfacePixelFormat pixelformat;
//FIXME: support for multiple layer ...
DFBDisplayLayerID vidID;
int vidIDinuse;
int cw;
int ch;
@ -139,9 +142,9 @@ struct _DFB_WindowData
IDirectFBGL *gl_context;
IDirectFBEventBuffer *eventbuffer;
DFBWindowID windowID;
int id; // SDL window id
int id; /* SDL window id */
DFB_WindowData *next;
u8 opacity;
Uint8 opacity;
};
typedef struct _DFB_DeviceData DFB_DeviceData;
@ -152,6 +155,7 @@ struct _DFB_DeviceData
IDirectFB *dfb;
int mouse;
int keyboard;
int kbdgeneric;
DFB_WindowData *firstwin;
int numscreens;
@ -159,10 +163,9 @@ struct _DFB_DeviceData
DFBDisplayLayerID gralayer[DFB_MAX_SCREENS];
DFBDisplayLayerID vidlayer[DFB_MAX_SCREENS];
// auxiliary integer for callbacks
int aux;
int aux; /* auxiliary integer for callbacks */
// OpenGL
/* OpenGL */
void (*glFinish) (void);
void (*glFlush) (void);
};