Commit 819cc951 authored by Sam Lantinga's avatar Sam Lantinga

Couriersud to Sam

Hi Sam,

20100815_1.diff contains updates for the directfb driver:

- more documentation, mainly on software OpenGL in README.directfb
- Revised error handling leading to leaner code
- Improved/fixed OpenGL handling of multiple contexts.
- Made the built-in simple window manager handle OpenGL windows.
- Rewrote pixelformat mapping - this was quite ugly before.

Well, all software GL, but working :-)
parent f0de16c6
...@@ -65,10 +65,26 @@ you need to have the following font installed: ...@@ -65,10 +65,26 @@ you need to have the following font installed:
OPENGL Support OPENGL Support
============== ==============
As of this writing 20070810 you need to pull Mesa from git and do the following: The following instructions will give you *software* opengl. However this
works at least on all directfb supported platforms.
As of this writing 20100802 you need to pull Mesa from git and do the following:
------------------------ ------------------------
git checkout 2c9fdaf7292423c157fc79b5ce43f0f199dd753a
cd mesa cd mesa
git clone git://anongit.freedesktop.org/git/mesa/mesa
------------------------
Edit configs/linux-directfb so that the Directories-section looks like
------------------------
# Directories
SRC_DIRS = mesa glu
GLU_DIRS = sgi
DRIVER_DIRS = directfb
PROGRAM_DIRS =
------------------------
make linux-directfb make linux-directfb
make make
...@@ -87,3 +103,4 @@ export LD_LIBRARY_PATH=/usr/local/dfb_GL/lib ...@@ -87,3 +103,4 @@ export LD_LIBRARY_PATH=/usr/local/dfb_GL/lib
export LD_PRELOAD=/usr/local/dfb_GL/libGL.so.7 export LD_PRELOAD=/usr/local/dfb_GL/libGL.so.7
./testgl ./testgl
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
#include "SDL_DirectFB_video.h" #include "SDL_DirectFB_video.h"
#include "../../events/SDL_windowevents_c.h"
#define COLOR_EXPAND(col) col.r, col.g, col.b, col.a #define COLOR_EXPAND(col) col.r, col.g, col.b, col.a
static DFB_Theme theme_std = { static DFB_Theme theme_std = {
...@@ -52,7 +54,7 @@ static DFB_Theme theme_none = { ...@@ -52,7 +54,7 @@ static DFB_Theme theme_none = {
}; };
static void static void
DrTriangle(IDirectFBSurface * s, int down, int x, int y, int w) DrawTriangle(IDirectFBSurface * s, int down, int x, int y, int w)
{ {
int x1, x2, x3; int x1, x2, x3;
int y1, y2, y3; int y1, y2, y3;
...@@ -76,7 +78,33 @@ DrTriangle(IDirectFBSurface * s, int down, int x, int y, int w) ...@@ -76,7 +78,33 @@ DrTriangle(IDirectFBSurface * s, int down, int x, int y, int w)
} }
static void static void
DrCaption(IDirectFBSurface * s, int x, int y, char *text) LoadFont(_THIS, SDL_Window * window)
{
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window);
if (windata->font != NULL) {
SDL_DFB_RELEASE(windata->font);
windata->font = NULL;
SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, windata->font));
}
if (windata->theme.font != NULL)
{
DFBFontDescription fdesc;
SDL_zero(fdesc);
fdesc.flags = DFDESC_HEIGHT;
fdesc.height = windata->theme.font_size;
SDL_DFB_CHECK(devdata->
dfb->CreateFont(devdata->dfb, windata->theme.font,
&fdesc, &windata->font));
SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, windata->font));
}
}
static void
DrawCraption(_THIS, IDirectFBSurface * s, int x, int y, char *text)
{ {
DFBSurfaceTextFlags flags; DFBSurfaceTextFlags flags;
...@@ -86,7 +114,7 @@ DrCaption(IDirectFBSurface * s, int x, int y, char *text) ...@@ -86,7 +114,7 @@ DrCaption(IDirectFBSurface * s, int x, int y, char *text)
} }
void void
DirectFB_WM_RedrawLayout(SDL_Window * window) DirectFB_WM_RedrawLayout(_THIS, SDL_Window * window)
{ {
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
IDirectFBSurface *s = windata->window_surface; IDirectFBSurface *s = windata->window_surface;
...@@ -99,6 +127,7 @@ DirectFB_WM_RedrawLayout(SDL_Window * window) ...@@ -99,6 +127,7 @@ DirectFB_WM_RedrawLayout(SDL_Window * window)
if (!windata->is_managed || (window->flags & SDL_WINDOW_FULLSCREEN)) if (!windata->is_managed || (window->flags & SDL_WINDOW_FULLSCREEN))
return; return;
LoadFont(_this, window);
//s->SetDrawingFlags(s, DSDRAW_BLEND); //s->SetDrawingFlags(s, DSDRAW_BLEND);
s->SetColor(s, COLOR_EXPAND(t->frame_color)); s->SetColor(s, COLOR_EXPAND(t->frame_color));
/* top */ /* top */
...@@ -122,16 +151,16 @@ DirectFB_WM_RedrawLayout(SDL_Window * window) ...@@ -122,16 +151,16 @@ DirectFB_WM_RedrawLayout(SDL_Window * window)
x = windata->size.w - t->right_size - w + d; x = windata->size.w - t->right_size - w + d;
y = t->top_size + d; y = t->top_size + d;
s->SetColor(s, COLOR_EXPAND(t->close_color)); s->SetColor(s, COLOR_EXPAND(t->close_color));
DrTriangle(s, 1, x, y, w - 2 * d); DrawTriangle(s, 1, x, y, w - 2 * d);
/* Max Button */ /* Max Button */
s->SetColor(s, COLOR_EXPAND(t->max_color)); s->SetColor(s, COLOR_EXPAND(t->max_color));
DrTriangle(s, window->flags & SDL_WINDOW_MAXIMIZED ? 1 : 0, x - w, DrawTriangle(s, window->flags & SDL_WINDOW_MAXIMIZED ? 1 : 0, x - w,
y, w - 2 * d); y, w - 2 * d);
/* Caption */ /* Caption */
if (window->title) { if (window->title) {
s->SetColor(s, COLOR_EXPAND(t->font_color)); s->SetColor(s, COLOR_EXPAND(t->font_color));
DrCaption(s, (x - w) / 2, t->top_size + d, window->title); DrawCraption(_this, s, (x - w) / 2, t->top_size + d, window->title);
} }
/* Icon */ /* Icon */
if (windata->icon) { if (windata->icon) {
...@@ -152,26 +181,25 @@ DFBResult ...@@ -152,26 +181,25 @@ DFBResult
DirectFB_WM_GetClientSize(_THIS, SDL_Window * window, int *cw, int *ch) DirectFB_WM_GetClientSize(_THIS, SDL_Window * window, int *cw, int *ch)
{ {
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
DFBResult ret;
ret = windata->window->GetSize(windata->window, cw, ch); SDL_DFB_CHECK(windata->window->GetSize(windata->window, cw, ch));
*cw -= windata->theme.left_size + windata->theme.right_size; *cw -= windata->theme.left_size + windata->theme.right_size;
*ch -= *ch -=
windata->theme.top_size + windata->theme.caption_size + windata->theme.top_size + windata->theme.caption_size +
windata->theme.bottom_size; windata->theme.bottom_size;
return ret; return DFB_OK;
} }
void void
DirectFB_WM_AdjustWindowLayout(SDL_Window * window) DirectFB_WM_AdjustWindowLayout(SDL_Window * window, int flags, int w, int h)
{ {
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
if (!windata->is_managed) if (!windata->is_managed)
windata->theme = theme_none; windata->theme = theme_none;
else if (window->flags & SDL_WINDOW_FULLSCREEN) { else if (flags & SDL_WINDOW_FULLSCREEN) {
windata->theme = theme_none; windata->theme = theme_none;
} else if (window->flags & SDL_WINDOW_MAXIMIZED) { } else if (flags & SDL_WINDOW_MAXIMIZED) {
windata->theme = theme_std; windata->theme = theme_std;
windata->theme.left_size = 0; windata->theme.left_size = 0;
windata->theme.right_size = 0; windata->theme.right_size = 0;
...@@ -183,12 +211,12 @@ DirectFB_WM_AdjustWindowLayout(SDL_Window * window) ...@@ -183,12 +211,12 @@ DirectFB_WM_AdjustWindowLayout(SDL_Window * window)
windata->client.x = windata->theme.left_size; windata->client.x = windata->theme.left_size;
windata->client.y = windata->theme.top_size + windata->theme.caption_size; windata->client.y = windata->theme.top_size + windata->theme.caption_size;
windata->client.w = window->w; windata->client.w = w;
windata->client.h = window->h; windata->client.h = h;
windata->size.w = windata->size.w =
window->w + windata->theme.left_size + windata->theme.right_size; w + windata->theme.left_size + windata->theme.right_size;
windata->size.h = windata->size.h =
window->h + windata->theme.top_size + h + windata->theme.top_size +
windata->theme.caption_size + windata->theme.bottom_size; windata->theme.caption_size + windata->theme.bottom_size;
} }
...@@ -198,19 +226,16 @@ DirectFB_WM_MaximizeWindow(_THIS, SDL_Window * window) ...@@ -198,19 +226,16 @@ DirectFB_WM_MaximizeWindow(_THIS, SDL_Window * window)
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
SDL_VideoDisplay *display = window->display; SDL_VideoDisplay *display = window->display;
windata->window->GetPosition(windata->window, SDL_DFB_CHECK(windata->window->GetPosition(windata->window,
&windata->restore.x, &windata->restore.y); &windata->restore.x, &windata->restore.y));
windata->window->GetSize(windata->window, &windata->restore.w, SDL_DFB_CHECK(windata->window->GetSize(windata->window, &windata->restore.w,
&windata->restore.h); &windata->restore.h));
/* Do this already here */ DirectFB_WM_AdjustWindowLayout(window, window->flags | SDL_WINDOW_MAXIMIZED, display->current_mode.w, display->current_mode.h) ;
window->flags |= SDL_WINDOW_MAXIMIZED;
DirectFB_WM_AdjustWindowLayout(window);
windata->window->MoveTo(windata->window, 0, 0); SDL_DFB_CHECK(windata->window->MoveTo(windata->window, 0, 0));
windata->window->Resize(windata->window, SDL_DFB_CHECK(windata->window->Resize(windata->window,
display->current_mode.w, display->current_mode.h); display->current_mode.w, display->current_mode.h));
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MAXIMIZED, 0, 0);
} }
void void
...@@ -218,15 +243,13 @@ DirectFB_WM_RestoreWindow(_THIS, SDL_Window * window) ...@@ -218,15 +243,13 @@ DirectFB_WM_RestoreWindow(_THIS, SDL_Window * window)
{ {
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
/* Do this already here */ DirectFB_WM_AdjustWindowLayout(window, window->flags & ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED),
//window->flags &= ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED); windata->restore.w, windata->restore.h);
DirectFB_WM_AdjustWindowLayout(window); SDL_DFB_CHECK(windata->window->Resize(windata->window, windata->restore.w,
windata->window->MoveTo(windata->window, windata->restore.x, windata->restore.h));
windata->restore.y); SDL_DFB_CHECK(windata->window->MoveTo(windata->window, windata->restore.x,
windata->window->Resize(windata->window, windata->restore.w, windata->restore.y));
windata->restore.h);
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0);
} }
enum enum
...@@ -291,7 +314,9 @@ static int wm_lasty; ...@@ -291,7 +314,9 @@ static int wm_lasty;
int int
DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, DFBWindowEvent * evt) DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, DFBWindowEvent * evt)
{ {
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL);
if (!windata->is_managed) if (!windata->is_managed)
return 0; return 0;
...@@ -304,19 +329,26 @@ DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, DFBWindowEvent * evt) ...@@ -304,19 +329,26 @@ DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, DFBWindowEvent * evt)
case WM_POS_NONE: case WM_POS_NONE:
return 0; return 0;
case WM_POS_CLOSE: case WM_POS_CLOSE:
wm_grab = WM_POS_NONE;
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_CLOSE, 0, SDL_SendWindowEvent(window, SDL_WINDOWEVENT_CLOSE, 0,
0); 0);
return 1; return 1;
case WM_POS_MAX: case WM_POS_MAX:
wm_grab = WM_POS_NONE;
if (window->flags & SDL_WINDOW_MAXIMIZED) { if (window->flags & SDL_WINDOW_MAXIMIZED) {
DirectFB_WM_RestoreWindow(_this, window); SDL_RestoreWindow(window);
} else { } else {
DirectFB_WM_MaximizeWindow(_this, window); SDL_MaximizeWindow(window);
} }
return 1; return 1;
case WM_POS_CAPTION:
DirectFB_RaiseWindow(_this, window);
/* fall through */
default: default:
wm_grab = pos; wm_grab = pos;
windata->window->GrabPointer(windata->window); if (gwindata != NULL)
SDL_DFB_CHECK(gwindata->window->UngrabPointer(gwindata->window));
SDL_DFB_CHECK(windata->window->GrabPointer(windata->window));
wm_lastx = evt->cx; wm_lastx = evt->cx;
wm_lasty = evt->cy; wm_lasty = evt->cy;
} }
...@@ -333,20 +365,22 @@ DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, DFBWindowEvent * evt) ...@@ -333,20 +365,22 @@ DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, DFBWindowEvent * evt)
int cw, ch; int cw, ch;
if (wm_grab & WM_POS_CAPTION) if (wm_grab & WM_POS_CAPTION)
windata->window->Move(windata->window, dx, dy); SDL_DFB_CHECK(windata->window->Move(windata->window, dx, dy));
if (wm_grab & WM_POS_RIGHT) { if (wm_grab & (WM_POS_RIGHT | WM_POS_BOTTOM)) {
windata->window->GetSize(windata->window, &cw, &ch); if ((wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_BOTTOM)
windata->window->Resize(windata->window, cw + dx, ch); dx = 0;
} else if ((wm_grab & (WM_POS_BOTTOM | WM_POS_RIGHT)) == WM_POS_RIGHT)
if (wm_grab & WM_POS_BOTTOM) { dy = 0;
windata->window->GetSize(windata->window, &cw, &ch); SDL_DFB_CHECK(windata->window->GetSize(windata->window, &cw, &ch));
windata->window->Resize(windata->window, cw, ch + dy); SDL_DFB_CHECK(windata->window->Resize(windata->window, cw + dx, ch + dy));
} }
wm_lastx = evt->cx; wm_lastx = evt->cx;
wm_lasty = evt->cy; wm_lasty = evt->cy;
return 1; return 1;
} }
windata->window->UngrabPointer(windata->window); SDL_DFB_CHECK(windata->window->UngrabPointer(windata->window));
if (gwindata != NULL)
SDL_DFB_CHECK(gwindata->window->GrabPointer(gwindata->window));
wm_grab = WM_POS_NONE; wm_grab = WM_POS_NONE;
break; break;
case DWET_KEYDOWN: case DWET_KEYDOWN:
......
...@@ -41,10 +41,10 @@ struct _DFB_Theme ...@@ -41,10 +41,10 @@ struct _DFB_Theme
DFBColor max_color; DFBColor max_color;
}; };
extern void DirectFB_WM_AdjustWindowLayout(SDL_Window * window); extern void DirectFB_WM_AdjustWindowLayout(SDL_Window * window, int flags, int w, int h);
extern void DirectFB_WM_MaximizeWindow(_THIS, SDL_Window * window); extern void DirectFB_WM_MaximizeWindow(_THIS, SDL_Window * window);
extern void DirectFB_WM_RestoreWindow(_THIS, SDL_Window * window); extern void DirectFB_WM_RestoreWindow(_THIS, SDL_Window * window);
extern void DirectFB_WM_RedrawLayout(SDL_Window * window); extern void DirectFB_WM_RedrawLayout(_THIS, SDL_Window * window);
extern int DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window, extern int DirectFB_WM_ProcessEvent(_THIS, SDL_Window * window,
DFBWindowEvent * evt); DFBWindowEvent * evt);
......
...@@ -31,7 +31,8 @@ ...@@ -31,7 +31,8 @@
#define DFB_SYM(ret, name, args, al, func) ret (*name) args; #define DFB_SYM(ret, name, args, al, func) ret (*name) args;
static struct _SDL_DirectFB_Symbols static struct _SDL_DirectFB_Symbols
{ {
DFB_SYMS const unsigned int *directfb_major_version; DFB_SYMS
const unsigned int *directfb_major_version;
const unsigned int *directfb_minor_version; const unsigned int *directfb_minor_version;
const unsigned int *directfb_micro_version; const unsigned int *directfb_micro_version;
} SDL_DirectFB_Symbols; } SDL_DirectFB_Symbols;
......
...@@ -33,21 +33,28 @@ ...@@ -33,21 +33,28 @@
#include "SDL_DirectFB_events.h" #include "SDL_DirectFB_events.h"
#if USE_MULTI_API #if USE_MULTI_API
#define SDL_SendMouseMotion_ex(id, relative, x, y, p) SDL_SendMouseMotion(id, relative, x, y, p) #define SDL_SendMouseMotion_ex(w, id, relative, x, y, p) SDL_SendMouseMotion(id, relative, x, y, p)
#define SDL_SendMouseButton_ex(id, state, button) SDL_SendMouseButton(id, state, button) #define SDL_SendMouseButton_ex(w, id, state, button) SDL_SendMouseButton(id, state, button)
#define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(id, state, scancode) #define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(id, state, scancode)
#define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(id, text) #define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(id, text)
#else #else
#define SDL_SendMouseMotion_ex(id, relative, x, y, p) SDL_SendMouseMotion(relative, x, y) #define SDL_SendMouseMotion_ex(w, id, relative, x, y, p) SDL_SendMouseMotion(w, relative, x, y)
#define SDL_SendMouseButton_ex(id, state, button) SDL_SendMouseButton(state, button) #define SDL_SendMouseButton_ex(w, id, state, button) SDL_SendMouseButton(w, state, button)
#define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(state, scancode) #define SDL_SendKeyboardKey_ex(id, state, scancode) SDL_SendKeyboardKey(state, scancode)
#define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(text) #define SDL_SendKeyboardText_ex(id, text) SDL_SendKeyboardText(text)
#endif #endif
typedef struct _cb_data cb_data;
struct _cb_data
{
DFB_DeviceData *devdata;
int sys_ids;
int sys_kbd;
};
/* The translation tables from a DirectFB keycode to a SDL keysym */ /* The translation tables from a DirectFB keycode to a SDL keysym */
static SDLKey oskeymap[256]; static SDLKey oskeymap[256];
static int sys_ids;
static SDL_keysym *DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt, static SDL_keysym *DirectFB_TranslateKey(_THIS, DFBWindowEvent * evt,
SDL_keysym * keysym); SDL_keysym * keysym);
...@@ -69,14 +76,11 @@ DirectFB_SetContext(_THIS, SDL_Window *window) ...@@ -69,14 +76,11 @@ DirectFB_SetContext(_THIS, SDL_Window *window)
SDL_VideoDisplay *display = window->display; SDL_VideoDisplay *display = window->display;
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
int ret;
/* FIXME: should we handle the error */
if (dispdata->vidIDinuse) if (dispdata->vidIDinuse)
SDL_DFB_CHECKERR(dispdata->vidlayer->SwitchContext(dispdata->vidlayer, SDL_DFB_CHECK(dispdata->vidlayer->SwitchContext(dispdata->vidlayer,
DFB_TRUE)); DFB_TRUE));
error:
return;
#endif #endif
} }
...@@ -172,9 +176,9 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags, ...@@ -172,9 +176,9 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags,
case DWET_BUTTONDOWN: case DWET_BUTTONDOWN:
if (ClientXY(p, &evt->x, &evt->y)) { if (ClientXY(p, &evt->x, &evt->y)) {
if (!devdata->use_linux_input) { if (!devdata->use_linux_input) {
SDL_SendMouseMotion_ex(devdata->mouse_id[0], 0, evt->x, SDL_SendMouseMotion_ex(p->sdl_window, devdata->mouse_id[0], 0, evt->x,
evt->y, 0); evt->y, 0);
SDL_SendMouseButton_ex(devdata->mouse_id[0], SDL_SendMouseButton_ex(p->sdl_window, devdata->mouse_id[0],
SDL_PRESSED, SDL_PRESSED,
DirectFB_TranslateButton DirectFB_TranslateButton
(evt->button)); (evt->button));
...@@ -186,9 +190,9 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags, ...@@ -186,9 +190,9 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags,
case DWET_BUTTONUP: case DWET_BUTTONUP:
if (ClientXY(p, &evt->x, &evt->y)) { if (ClientXY(p, &evt->x, &evt->y)) {
if (!devdata->use_linux_input) { if (!devdata->use_linux_input) {
SDL_SendMouseMotion_ex(devdata->mouse_id[0], 0, evt->x, SDL_SendMouseMotion_ex(p->sdl_window, devdata->mouse_id[0], 0, evt->x,
evt->y, 0); evt->y, 0);
SDL_SendMouseButton_ex(devdata->mouse_id[0], SDL_SendMouseButton_ex(p->sdl_window, devdata->mouse_id[0],
SDL_RELEASED, SDL_RELEASED,
DirectFB_TranslateButton DirectFB_TranslateButton
(evt->button)); (evt->button));
...@@ -202,7 +206,7 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags, ...@@ -202,7 +206,7 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags,
SDL_Window *window = p->sdl_window; SDL_Window *window = p->sdl_window;
if (!devdata->use_linux_input) { if (!devdata->use_linux_input) {
if (!(flags & SDL_WINDOW_INPUT_GRABBED)) if (!(flags & SDL_WINDOW_INPUT_GRABBED))
SDL_SendMouseMotion_ex(devdata->mouse_id[0], 0, SDL_SendMouseMotion_ex(p->sdl_window, devdata->mouse_id[0], 0,
evt->x, evt->y, 0); evt->x, evt->y, 0);
} else { } else {
/* relative movements are not exact! /* relative movements are not exact!
...@@ -215,7 +219,7 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags, ...@@ -215,7 +219,7 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags,
} }
} }
if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS)) if (!(window->flags & SDL_WINDOW_MOUSE_FOCUS))
SDL_SendWindowEvent(p->window, SDL_WINDOWEVENT_ENTER, 0, SDL_SendWindowEvent(p->sdl_window, SDL_WINDOWEVENT_ENTER, 0,
0); 0);
} }
break; break;
...@@ -293,7 +297,7 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags, ...@@ -293,7 +297,7 @@ ProcessWindowEvent(_THIS, DFB_WindowData * p, Uint32 flags,
} }
static void static void
ProcessInputEvent(_THIS, SDL_Window *grabbed_window, DFBInputEvent * ievt) ProcessInputEvent(_THIS, DFBInputEvent * ievt)
{ {
SDL_DFB_DEVICEDATA(_this); SDL_DFB_DEVICEDATA(_this);
SDL_keysym keysym; SDL_keysym keysym;
...@@ -302,17 +306,16 @@ ProcessInputEvent(_THIS, SDL_Window *grabbed_window, DFBInputEvent * ievt) ...@@ -302,17 +306,16 @@ ProcessInputEvent(_THIS, SDL_Window *grabbed_window, DFBInputEvent * ievt)
if (!devdata->use_linux_input) { if (!devdata->use_linux_input) {
if (ievt->type == DIET_AXISMOTION) { if (ievt->type == DIET_AXISMOTION) {
if ((grabbed_window != NULL) && (ievt->flags & DIEF_AXISREL)) { if ((devdata->grabbed_window != NULL) && (ievt->flags & DIEF_AXISREL)) {
if (ievt->axis == DIAI_X) if (ievt->axis == DIAI_X)
SDL_SendMouseMotion_ex(ievt->device_id, 1, SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1,
ievt->axisrel, 0, 0); ievt->axisrel, 0, 0);
else if (ievt->axis == DIAI_Y) else if (ievt->axis == DIAI_Y)
SDL_SendMouseMotion_ex(ievt->device_id, 1, 0, SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, 0,
ievt->axisrel, 0); ievt->axisrel, 0);
} }
} }
} else { } else {
#if USE_MULTI_API
static int last_x, last_y; static int last_x, last_y;
switch (ievt->type) { switch (ievt->type) {
...@@ -323,30 +326,34 @@ ProcessInputEvent(_THIS, SDL_Window *grabbed_window, DFBInputEvent * ievt) ...@@ -323,30 +326,34 @@ ProcessInputEvent(_THIS, SDL_Window *grabbed_window, DFBInputEvent * ievt)
else if (ievt->axis == DIAI_Y) else if (ievt->axis == DIAI_Y)
last_y = ievt->axisabs; last_y = ievt->axisabs;
if (!(ievt->flags & DIEF_FOLLOW)) { if (!(ievt->flags & DIEF_FOLLOW)) {
#if USE_MULTI_API
SDL_Mouse *mouse = SDL_GetMouse(ievt->device_id); SDL_Mouse *mouse = SDL_GetMouse(ievt->device_id);
SDL_Window *window = SDL_GetWindowFromID(mouse->focus); SDL_Window *window = SDL_GetWindowFromID(mouse->focus);
#else
SDL_Window *window = devdata->grabbed_window;
#endif
if (window) { if (window) {
DFB_WindowData *windata = DFB_WindowData *windata =
(DFB_WindowData *) window->driverdata; (DFB_WindowData *) window->driverdata;
int x, y; int x, y;
windata->window->GetPosition(windata->window, &x, &y); windata->window->GetPosition(windata->window, &x, &y);
SDL_SendMouseMotion_ex(ievt->device_id, 0, SDL_SendMouseMotion_ex(window, ievt->device_id, 0,
last_x - (x + last_x - (x +
windata->client.x), windata->client.x),
last_y - (y + last_y - (y +
windata->client.y), 0); windata->client.y), 0);
} else { } else {
SDL_SendMouseMotion_ex(ievt->device_id, 0, last_x, SDL_SendMouseMotion_ex(window, ievt->device_id, 0, last_x,
last_y, 0); last_y, 0);
} }
} }
} else if (ievt->flags & DIEF_AXISREL) { } else if (ievt->flags & DIEF_AXISREL) {
if (ievt->axis == DIAI_X) if (ievt->axis == DIAI_X)
SDL_SendMouseMotion_ex(ievt->device_id, 1, SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1,
ievt->axisrel, 0, 0); ievt->axisrel, 0, 0);
else if (ievt->axis == DIAI_Y) else if (ievt->axis == DIAI_Y)
SDL_SendMouseMotion_ex(ievt->device_id, 1, 0, SDL_SendMouseMotion_ex(devdata->grabbed_window, ievt->device_id, 1, 0,
ievt->axisrel, 0); ievt->axisrel, 0);
} }
break; break;
...@@ -365,28 +372,27 @@ ProcessInputEvent(_THIS, SDL_Window *grabbed_window, DFBInputEvent * ievt) ...@@ -365,28 +372,27 @@ ProcessInputEvent(_THIS, SDL_Window *grabbed_window, DFBInputEvent * ievt)
case DIET_KEYRELEASE: case DIET_KEYRELEASE:
kbd_idx = KbdIndex(_this, ievt->device_id); kbd_idx = KbdIndex(_this, ievt->device_id);
DirectFB_TranslateKeyInputEvent(_this, kbd_idx, ievt, &keysym); DirectFB_TranslateKeyInputEvent(_this, kbd_idx, ievt, &keysym);
SDL_SendKeyboardKey(kbd_idx, SDL_RELEASED, keysym.scancode); SDL_SendKeyboardKey_ex(kbd_idx, SDL_RELEASED, keysym.scancode);
break; break;
case DIET_BUTTONPRESS: case DIET_BUTTONPRESS:
if (ievt->buttons & DIBM_LEFT) if (ievt->buttons & DIBM_LEFT)
SDL_SendMouseButton(ievt->device_id, SDL_PRESSED, 1); SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 1);
if (ievt->buttons & DIBM_MIDDLE) if (ievt->buttons & DIBM_MIDDLE)
SDL_SendMouseButton(ievt->device_id, SDL_PRESSED, 2); SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 2);
if (ievt->buttons & DIBM_RIGHT) if (ievt->buttons & DIBM_RIGHT)
SDL_SendMouseButton(ievt->device_id, SDL_PRESSED, 3); SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_PRESSED, 3);
break; break;
case DIET_BUTTONRELEASE: case DIET_BUTTONRELEASE:
if (!(ievt->buttons & DIBM_LEFT)) if (!(ievt->buttons & DIBM_LEFT))
SDL_SendMouseButton(ievt->device_id, SDL_RELEASED, 1); SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 1);
if (!(ievt->buttons & DIBM_MIDDLE)) if (!(ievt->buttons & DIBM_MIDDLE))
SDL_SendMouseButton(ievt->device_id, SDL_RELEASED, 2); SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 2);
if (!(ievt->buttons & DIBM_RIGHT)) if (!(ievt->buttons & DIBM_RIGHT))
SDL_SendMouseButton(ievt->device_id, SDL_RELEASED, 3); SDL_SendMouseButton_ex(devdata->grabbed_window, ievt->device_id, SDL_RELEASED, 3);
break; break;
default: default:
break; /* please gcc */ break; /* please gcc */
} }
#endif
} }
} }
...@@ -396,18 +402,11 @@ DirectFB_PumpEventsWindow(_THIS) ...@@ -396,18 +402,11 @@ DirectFB_PumpEventsWindow(_THIS)
SDL_DFB_DEVICEDATA(_this); SDL_DFB_DEVICEDATA(_this);
DFB_WindowData *p; DFB_WindowData *p;
DFBInputEvent ievt; DFBInputEvent ievt;
SDL_Window *grabbed_window;
grabbed_window = NULL;
for (p = devdata->firstwin; p != NULL; p = p->next) { for (p = devdata->firstwin; p != NULL; p = p->next) {
DFBWindowEvent evt; DFBWindowEvent evt;
SDL_Window *w = p->sdl_window; SDL_Window *w = p->sdl_window;
if (w->flags & SDL_WINDOW_INPUT_GRABBED) {
grabbed_window = w;
}
while (p->eventbuffer->GetEvent(p->eventbuffer, while (p->eventbuffer->GetEvent(p->eventbuffer,
DFB_EVENT(&evt)) == DFB_OK) { DFB_EVENT(&evt)) == DFB_OK) {
if (!DirectFB_WM_ProcessEvent(_this, w, &evt)) if (!DirectFB_WM_ProcessEvent(_this, w, &evt))
...@@ -418,7 +417,7 @@ DirectFB_PumpEventsWindow(_THIS) ...@@ -418,7 +417,7 @@ DirectFB_PumpEventsWindow(_THIS)
/* Now get relative events in case we need them */ /* Now get relative events in case we need them */
while (devdata->events->GetEvent(devdata->events, while (devdata->events->GetEvent(devdata->events,
DFB_EVENT(&ievt)) == DFB_OK) { DFB_EVENT(&ievt)) == DFB_OK) {
ProcessInputEvent(_this, grabbed_window, &ievt); ProcessInputEvent(_this, &ievt);
} }
} }
...@@ -623,105 +622,87 @@ DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button) ...@@ -623,105 +622,87 @@ DirectFB_TranslateButton(DFBInputDeviceButtonIdentifier button)
} }
static DFBEnumerationResult static DFBEnumerationResult
input_device_cb(DFBInputDeviceID device_id, EnumKeyboards(DFBInputDeviceID device_id,
DFBInputDeviceDescription desc, void *callbackdata) DFBInputDeviceDescription desc, void *callbackdata)
{ {
DFB_DeviceData *devdata = callbackdata; cb_data *cb = callbackdata;
DFB_DeviceData *devdata = cb->devdata;
#if USE_MULTI_API #if USE_MULTI_API
SDL_Keyboard keyboard; SDL_Keyboard keyboard;
#endif #endif
SDLKey keymap[SDL_NUM_SCANCODES]; SDLKey keymap[SDL_NUM_SCANCODES];
if ((desc.caps & DIDTF_KEYBOARD) && device_id == DIDID_KEYBOARD) { if (!cb->sys_kbd) {
if (cb->sys_ids) {
if (device_id >= 0x10)
return DFENUM_OK;
} else {
if (device_id < 0x10)
return DFENUM_OK;
}
} else {
if (device_id != DIDID_KEYBOARD)
return DFENUM_OK;
}
if ((desc.caps & DIDTF_KEYBOARD)) {
#if USE_MULTI_API #if USE_MULTI_API
SDL_zero(keyboard); SDL_zero(keyboard);
SDL_AddKeyboard(&keyboard, 0); SDL_AddKeyboard(&keyboard, devdata->num_keyboard);
#endif #endif
devdata->keyboard[0].id = device_id; devdata->keyboard[devdata->num_keyboard].id = device_id;
devdata->keyboard[0].is_generic = 0; devdata->keyboard[devdata->num_keyboard].is_generic = 0;
if (!strncmp("X11", desc.name, 3)) if (!strncmp("X11", desc.name, 3))
devdata->keyboard[0].is_generic = 1; devdata->keyboard[devdata->num_keyboard].is_generic = 1;
SDL_GetDefaultKeymap(keymap); SDL_GetDefaultKeymap(keymap);
#if USE_MULTI_API #if USE_MULTI_API
SDL_SetKeymap(0, 0, keymap, SDL_NUM_SCANCODES); SDL_SetKeymap(devdata->num_keyboard, 0, keymap, SDL_NUM_SCANCODES);
#else #else
SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES);
#endif #endif
devdata->num_keyboard++; devdata->num_keyboard++;
return DFENUM_CANCEL; if (cb->sys_kbd)
} return DFENUM_CANCEL;
return DFENUM_OK;
}
#if USE_MULTI_API
static DFBEnumerationResult
EnumKeyboards(DFBInputDeviceID device_id,
DFBInputDeviceDescription desc, void *callbackdata)
{
DFB_DeviceData *devdata = callbackdata;
SDL_Keyboard keyboard;
SDLKey keymap[SDL_NUM_SCANCODES];
if (sys_ids) {
if (device_id >= 0x10)
return DFENUM_OK;
} else {
if (device_id < 0x10)
return DFENUM_OK;
}
if ((desc.caps & DIDTF_KEYBOARD)) {
SDL_zero(keyboard);
SDL_AddKeyboard(&keyboard, devdata->num_keyboard);
devdata->keyboard[devdata->num_keyboard].id = device_id;
devdata->keyboard[devdata->num_keyboard].is_generic = 0;
if (!strncmp("X11", desc.name, 3))
devdata->keyboard[devdata->num_keyboard].is_generic = 1;
SDL_GetDefaultKeymap(keymap);
SDL_SetKeymap(devdata->num_keyboard, 0, keymap, SDL_NUM_SCANCODES);
devdata->num_keyboard++;
} }
return DFENUM_OK; return DFENUM_OK;
} }
#endif
void void
DirectFB_InitKeyboard(_THIS) DirectFB_InitKeyboard(_THIS)
{ {
SDL_DFB_DEVICEDATA(_this); SDL_DFB_DEVICEDATA(_this);
int ret; cb_data cb;
DirectFB_InitOSKeymap(_this, &oskeymap[0], SDL_arraysize(oskeymap)); DirectFB_InitOSKeymap(_this, &oskeymap[0], SDL_arraysize(oskeymap));
devdata->num_keyboard = 0; devdata->num_keyboard = 0;
#if USE_MULTI_API cb.devdata = devdata;
if (devdata->use_linux_input) { if (devdata->use_linux_input) {
sys_ids = 0; cb.sys_kbd = 0;
cb.sys_ids = 0;
SDL_DFB_CHECK(devdata->dfb-> SDL_DFB_CHECK(devdata->dfb->
EnumInputDevices(devdata->dfb, EnumKeyboards, devdata)); EnumInputDevices(devdata->dfb, EnumKeyboards, &cb));
if (devdata->num_keyboard == 0) { if (devdata->num_keyboard == 0) {
sys_ids = 1; cb.sys_ids = 1;
SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb, SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb,
EnumKeyboards, EnumKeyboards,
devdata)); &cb));
} }
} else } else {
#else cb.sys_kbd = 1;
{
SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb, SDL_DFB_CHECK(devdata->dfb->EnumInputDevices(devdata->dfb,
input_device_cb, EnumKeyboards,
devdata)); &cb));
} }
#endif
} }
void void
DirectFB_QuitKeyboard(_THIS) DirectFB_QuitKeyboard(_THIS)
{ {
SDL_DFB_DEVICEDATA(_this); //SDL_DFB_DEVICEDATA(_this);
int ret;
SDL_KeyboardQuit(); SDL_KeyboardQuit();
......
...@@ -40,112 +40,101 @@ struct modes_callback_t ...@@ -40,112 +40,101 @@ struct modes_callback_t
SDL_DisplayMode *modelist; SDL_DisplayMode *modelist;
}; };
static int static const struct {
DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat, Uint32 * fmt) DFBSurfacePixelFormat dfb;
Uint32 sdl;
} pixelformat_tab[] =
{ {
switch (pixelformat) { { DSPF_LUT8, SDL_PIXELFORMAT_INDEX8 }, /* 8 bit LUT (8 bit color and alpha lookup from palette) */
case DSPF_ALUT44: { DSPF_RGB332, SDL_PIXELFORMAT_RGB332 }, /* 8 bit RGB (1 byte, red 3@5, green 3@2, blue 2@0) */
*fmt = SDL_PIXELFORMAT_INDEX4LSB; { DSPF_ARGB4444, SDL_PIXELFORMAT_ARGB4444 }, /* 16 bit ARGB (2 byte, alpha 4@12, red 4@8, green 4@4, blue 4@0) */
break; { DSPF_ARGB1555, SDL_PIXELFORMAT_ARGB1555 }, /* 16 bit ARGB (2 byte, alpha 1@15, red 5@10, green 5@5, blue 5@0) */
case DSPF_LUT8: { DSPF_RGB16, SDL_PIXELFORMAT_RGB565 }, /* 16 bit RGB (2 byte, red 5@11, green 6@5, blue 5@0) */
*fmt = SDL_PIXELFORMAT_INDEX8; { DSPF_RGB24, SDL_PIXELFORMAT_RGB24 }, /* 24 bit RGB (3 byte, red 8@16, green 8@8, blue 8@0) */
break; { DSPF_RGB32, SDL_PIXELFORMAT_RGB888 }, /* 24 bit RGB (4 byte, nothing@24, red 8@16, green 8@8, blue 8@0) */
case DSPF_RGB332: { DSPF_ARGB, SDL_PIXELFORMAT_ARGB8888 }, /* 32 bit ARGB (4 byte, alpha 8@24, red 8@16, green 8@8, blue 8@0) */
*fmt = SDL_PIXELFORMAT_RGB332; { DSPF_RGB444, SDL_PIXELFORMAT_RGB444 }, /* 16 bit RGB (2 byte, nothing @12, red 4@8, green 4@4, blue 4@0) */
break; { DSPF_YV12, SDL_PIXELFORMAT_YV12 }, /* 12 bit YUV (8 bit Y plane followed by 8 bit quarter size V/U planes) */
case DSPF_ARGB4444: { DSPF_I420,SDL_PIXELFORMAT_IYUV }, /* 12 bit YUV (8 bit Y plane followed by 8 bit quarter size U/V planes) */
*fmt = SDL_PIXELFORMAT_ARGB4444; { DSPF_YUY2, SDL_PIXELFORMAT_YUY2 }, /* 16 bit YUV (4 byte/ 2 pixel, macropixel contains CbYCrY [31:0]) */
break; { DSPF_UYVY, SDL_PIXELFORMAT_UYVY }, /* 16 bit YUV (4 byte/ 2 pixel, macropixel contains YCbYCr [31:0]) */
case SDL_PIXELFORMAT_ARGB1555: { DSPF_RGB555, SDL_PIXELFORMAT_RGB555 }, /* 16 bit RGB (2 byte, nothing @15, red 5@10, green 5@5, blue 5@0) */
*fmt = SDL_PIXELFORMAT_ARGB1555;
break; #if (DFB_VERSION_ATLEAST(1,2,0))
case DSPF_RGB16: { DSPF_BGR555, SDL_PIXELFORMAT_BGR555 }, /* 16 bit BGR (2 byte, nothing @15, blue 5@10, green 5@5, red 5@0) */
*fmt = SDL_PIXELFORMAT_RGB565; #else
break; { DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR555 },
case DSPF_RGB24: #endif
*fmt = SDL_PIXELFORMAT_RGB24;
break; /* Pfff ... nonmatching formats follow */
case DSPF_RGB32:
*fmt = SDL_PIXELFORMAT_RGB888; { DSPF_ALUT44, SDL_PIXELFORMAT_UNKNOWN }, /* 8 bit ALUT (1 byte, alpha 4@4, color lookup 4@0) */
break; { DSPF_A8, SDL_PIXELFORMAT_UNKNOWN }, /* 8 bit alpha (1 byte, alpha 8@0), e.g. anti-aliased glyphs */
case DSPF_ARGB: { DSPF_AiRGB, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit ARGB (4 byte, inv. alpha 8@24, red 8@16, green 8@8, blue 8@0) */
*fmt = SDL_PIXELFORMAT_ARGB8888; { DSPF_A1, SDL_PIXELFORMAT_UNKNOWN }, /* 1 bit alpha (1 byte/ 8 pixel, most significant bit used first) */
break; { DSPF_NV12, SDL_PIXELFORMAT_UNKNOWN }, /* 12 bit YUV (8 bit Y plane followed by one 16 bit quarter size CbCr [15:0] plane) */
case DSPF_YV12: { DSPF_NV16, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit YUV (8 bit Y plane followed by one 16 bit half width CbCr [15:0] plane) */
*fmt = SDL_PIXELFORMAT_YV12; { DSPF_ARGB2554, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit ARGB (2 byte, alpha 2@14, red 5@9, green 5@4, blue 4@0) */
break; /* Planar mode: Y + V + U (3 planes) */ { DSPF_NV21, SDL_PIXELFORMAT_UNKNOWN }, /* 12 bit YUV (8 bit Y plane followed by one 16 bit quarter size CrCb [15:0] plane) */
case DSPF_I420: { DSPF_AYUV, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit AYUV (4 byte, alpha 8@24, Y 8@16, Cb 8@8, Cr 8@0) */
*fmt = SDL_PIXELFORMAT_IYUV; { DSPF_A4, SDL_PIXELFORMAT_UNKNOWN }, /* 4 bit alpha (1 byte/ 2 pixel, more significant nibble used first) */
break; /* Planar mode: Y + U + V (3 planes) */ { DSPF_ARGB1666, SDL_PIXELFORMAT_UNKNOWN }, /* 1 bit alpha (3 byte/ alpha 1@18, red 6@16, green 6@6, blue 6@0) */
case DSPF_YUY2: { DSPF_ARGB6666, SDL_PIXELFORMAT_UNKNOWN }, /* 6 bit alpha (3 byte/ alpha 6@18, red 6@16, green 6@6, blue 6@0) */
*fmt = SDL_PIXELFORMAT_YUY2; { DSPF_RGB18, SDL_PIXELFORMAT_UNKNOWN }, /* 6 bit RGB (3 byte/ red 6@16, green 6@6, blue 6@0) */
break; /* Packed mode: Y0+U0+Y1+V0 (1 plane) */ { DSPF_LUT2, SDL_PIXELFORMAT_UNKNOWN }, /* 2 bit LUT (1 byte/ 4 pixel, 2 bit color and alpha lookup from palette) */
case DSPF_UYVY:
*fmt = SDL_PIXELFORMAT_UYVY; #if (DFB_VERSION_ATLEAST(1,3,0))
break; /* Packed mode: U0+Y0+V0+Y1 (1 plane) */ { DSPF_RGBA4444, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit RGBA (2 byte, red 4@12, green 4@8, blue 4@4, alpha 4@0) */
default: #endif
return -1;
} #if (DFB_VERSION_ATLEAST(1,4,0))
return 0; { DSPF_RGBA5551, SDL_PIXELFORMAT_UNKNOWN }, /* 16 bit RGBA (2 byte, red 5@11, green 5@6, blue 5@1, alpha 1@0) */
{ DSPF_YUV444P, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit full YUV planar (8 bit Y plane followed by an 8 bit Cb and an 8 bit Cr plane) */
{ DSPF_ARGB8565, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit ARGB (3 byte, alpha 8@16, red 5@11, green 6@5, blue 5@0) */
{ DSPF_AVYU, SDL_PIXELFORMAT_UNKNOWN }, /* 32 bit AVYU 4:4:4 (4 byte, alpha 8@24, Cr 8@16, Y 8@8, Cb 8@0) */
{ DSPF_VYU, SDL_PIXELFORMAT_UNKNOWN }, /* 24 bit VYU 4:4:4 (3 byte, Cr 8@16, Y 8@8, Cb 8@0) */
#endif
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX1LSB },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX1MSB },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX4LSB },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_INDEX4MSB },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR24 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR888 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_RGBA8888 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR8888 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGRA8888 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_ARGB2101010 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR4444 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_ABGR1555 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_BGR565 },
{ DSPF_UNKNOWN, SDL_PIXELFORMAT_YVYU }, /**< Packed mode: Y0+V0+Y1+U0 (1 pla */
};
static Uint32
DFBToSDLPixelFormat(DFBSurfacePixelFormat pixelformat)
{
int i;
for (i=0; pixelformat_tab[i].dfb != DSPF_UNKNOWN; i++)
if (pixelformat_tab[i].dfb == pixelformat)
{
return pixelformat_tab[i].sdl;
}
return SDL_PIXELFORMAT_UNKNOWN;
} }
static DFBSurfacePixelFormat static DFBSurfacePixelFormat
SDLToDFBPixelFormat(Uint32 format) SDLToDFBPixelFormat(Uint32 format)
{ {
switch (format) { int i;
case SDL_PIXELFORMAT_INDEX4LSB:
return DSPF_ALUT44; for (i=0; pixelformat_tab[i].dfb != DSPF_UNKNOWN; i++)
case SDL_PIXELFORMAT_INDEX8: if (pixelformat_tab[i].sdl == format)
return DSPF_LUT8; {
case SDL_PIXELFORMAT_RGB332: return pixelformat_tab[i].dfb;
return DSPF_RGB332; }
case SDL_PIXELFORMAT_RGB555: return DSPF_UNKNOWN;
return DSPF_ARGB1555;
case SDL_PIXELFORMAT_ARGB4444:
return DSPF_ARGB4444;
case SDL_PIXELFORMAT_ARGB1555:
return DSPF_ARGB1555;
case SDL_PIXELFORMAT_RGB565:
return DSPF_RGB16;
case SDL_PIXELFORMAT_RGB24:
return DSPF_RGB24;
case SDL_PIXELFORMAT_RGB888:
return DSPF_RGB32;
case SDL_PIXELFORMAT_ARGB8888:
return DSPF_ARGB;
case SDL_PIXELFORMAT_YV12:
return DSPF_YV12; /* Planar mode: Y + V + U (3 planes) */
case SDL_PIXELFORMAT_IYUV:
return DSPF_I420; /* Planar mode: Y + U + V (3 planes) */
case SDL_PIXELFORMAT_YUY2:
return DSPF_YUY2; /* Packed mode: Y0+U0+Y1+V0 (1 plane) */
case SDL_PIXELFORMAT_UYVY:
return DSPF_UYVY; /* Packed mode: U0+Y0+V0+Y1 (1 plane) */
case SDL_PIXELFORMAT_YVYU:
return DSPF_UNKNOWN; /* Packed mode: Y0+V0+Y1+U0 (1 plane) */
case SDL_PIXELFORMAT_INDEX1LSB:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_INDEX1MSB:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_INDEX4MSB:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_RGB444:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_BGR24:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_BGR888:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_RGBA8888:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_ABGR8888:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_BGRA8888:
return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_ARGB2101010:
return DSPF_UNKNOWN;
default:
return DSPF_UNKNOWN;
}
} }
static DFBEnumerationResult static DFBEnumerationResult
...@@ -164,7 +153,6 @@ EnumModesCallback(int width, int height, int bpp, void *data) ...@@ -164,7 +153,6 @@ EnumModesCallback(int width, int height, int bpp, void *data)
modedata->modelist[modedata->nummodes++] = mode; modedata->modelist[modedata->nummodes++] = mode;
} }
SDL_DFB_DEBUG("w %d h %d bpp %d\n", width, height, bpp);
return DFENUM_OK; return DFENUM_OK;
} }
...@@ -202,7 +190,6 @@ CheckSetDisplayMode(_THIS, SDL_VideoDisplay * display, DFB_DisplayData * data, S ...@@ -202,7 +190,6 @@ CheckSetDisplayMode(_THIS, SDL_VideoDisplay * display, DFB_DisplayData * data, S
SDL_DFB_DEVICEDATA(_this); SDL_DFB_DEVICEDATA(_this);
DFBDisplayLayerConfig config; DFBDisplayLayerConfig config;
DFBDisplayLayerConfigFlags failed; DFBDisplayLayerConfigFlags failed;
int ret;
SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer, SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer,
DLSCL_ADMINISTRATIVE)); DLSCL_ADMINISTRATIVE));
...@@ -221,7 +208,7 @@ CheckSetDisplayMode(_THIS, SDL_VideoDisplay * display, DFB_DisplayData * data, S ...@@ -221,7 +208,7 @@ CheckSetDisplayMode(_THIS, SDL_VideoDisplay * display, DFB_DisplayData * data, S
if (failed == 0) if (failed == 0)
SDL_AddDisplayMode(display, mode); SDL_AddDisplayMode(display, mode);
else else
SDL_DFB_DEBUG("Mode %d x %d not available: %x\n", mode->w, SDL_DFB_ERR("Mode %d x %d not available: %x\n", mode->w,
mode->h, failed); mode->h, failed);
return; return;
...@@ -295,19 +282,21 @@ DirectFB_InitModes(_THIS) ...@@ -295,19 +282,21 @@ DirectFB_InitModes(_THIS)
dlc.pixelformat = DSPF_ARGB; dlc.pixelformat = DSPF_ARGB;
dlc.options = DLOP_ALPHACHANNEL; dlc.options = DLOP_ALPHACHANNEL;
ret = layer->SetConfiguration(layer, &dlc); ret = SDL_DFB_CHECK(layer->SetConfiguration(layer, &dlc));
if (ret) { if (ret != DFB_OK) {
/* try AiRGB if the previous failed */ /* try AiRGB if the previous failed */
dlc.pixelformat = DSPF_AiRGB; dlc.pixelformat = DSPF_AiRGB;
ret = layer->SetConfiguration(layer, &dlc); SDL_DFB_CHECKERR(layer->SetConfiguration(layer, &dlc));
} }
} }
/* Query layer configuration to determine the current mode and pixelformat */ /* Query layer configuration to determine the current mode and pixelformat */
dlc.flags = DLCONF_ALL; dlc.flags = DLCONF_ALL;
layer->GetConfiguration(layer, &dlc); SDL_DFB_CHECKERR(layer->GetConfiguration(layer, &dlc));
if (DFBToSDLPixelFormat(dlc.pixelformat, &mode.format) != 0) { mode.format = DFBToSDLPixelFormat(dlc.pixelformat);
if (mode.format == SDL_PIXELFORMAT_UNKNOWN) {
SDL_DFB_ERR("Unknown dfb pixelformat %x !\n", dlc.pixelformat); SDL_DFB_ERR("Unknown dfb pixelformat %x !\n", dlc.pixelformat);
goto error; goto error;
} }
...@@ -363,7 +352,6 @@ DirectFB_GetDisplayModes(_THIS, SDL_VideoDisplay * display) ...@@ -363,7 +352,6 @@ DirectFB_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
SDL_DisplayMode mode; SDL_DisplayMode mode;
struct modes_callback_t data; struct modes_callback_t data;
int i; int i;
int ret;
data.nummodes = 0; data.nummodes = 0;
/* Enumerate the available fullscreen modes */ /* Enumerate the available fullscreen modes */
...@@ -403,7 +391,6 @@ DirectFB_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mod ...@@ -403,7 +391,6 @@ DirectFB_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mod
DFB_DisplayData *data = (DFB_DisplayData *) display->driverdata; DFB_DisplayData *data = (DFB_DisplayData *) display->driverdata;
DFBDisplayLayerConfig config, rconfig; DFBDisplayLayerConfig config, rconfig;
DFBDisplayLayerConfigFlags fail = 0; DFBDisplayLayerConfigFlags fail = 0;
DFBResult ret;
SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer, SDL_DFB_CHECKERR(data->layer->SetCooperativeLevel(data->layer,
DLSCL_ADMINISTRATIVE)); DLSCL_ADMINISTRATIVE));
...@@ -469,7 +456,6 @@ DirectFB_QuitModes(_THIS) ...@@ -469,7 +456,6 @@ DirectFB_QuitModes(_THIS)
{ {
//DFB_DeviceData *devdata = (DFB_DeviceData *) _this->driverdata; //DFB_DeviceData *devdata = (DFB_DeviceData *) _this->driverdata;
SDL_DisplayMode tmode; SDL_DisplayMode tmode;
DFBResult ret;
int i; int i;
for (i = 0; i < _this->num_displays; ++i) { for (i = 0; i < _this->num_displays; ++i) {
......
...@@ -253,7 +253,7 @@ DirectFB_InitMouse(_THIS) ...@@ -253,7 +253,7 @@ DirectFB_InitMouse(_THIS)
void void
DirectFB_QuitMouse(_THIS) DirectFB_QuitMouse(_THIS)
{ {
SDL_DFB_DEVICEDATA(_this); //SDL_DFB_DEVICEDATA(_this);
} }
......
...@@ -30,6 +30,10 @@ struct SDL_GLDriverData ...@@ -30,6 +30,10 @@ struct SDL_GLDriverData
int gl_active; /* to stop switching drivers while we have a valid context */ int gl_active; /* to stop switching drivers while we have a valid context */
int initialized; int initialized;
DirectFB_GLContext *firstgl; /* linked list */ DirectFB_GLContext *firstgl; /* linked list */
/* OpenGL */
void (*glFinish) (void);
void (*glFlush) (void);
}; };
#define OPENGL_REQUIRS_DLOPEN #define OPENGL_REQUIRS_DLOPEN
...@@ -94,7 +98,7 @@ DirectFB_GL_Shutdown(_THIS) ...@@ -94,7 +98,7 @@ DirectFB_GL_Shutdown(_THIS)
int int
DirectFB_GL_LoadLibrary(_THIS, const char *path) DirectFB_GL_LoadLibrary(_THIS, const char *path)
{ {
SDL_DFB_DEVICEDATA(_this); //SDL_DFB_DEVICEDATA(_this);
void *handle = NULL; void *handle = NULL;
...@@ -122,9 +126,6 @@ DirectFB_GL_LoadLibrary(_THIS, const char *path) ...@@ -122,9 +126,6 @@ DirectFB_GL_LoadLibrary(_THIS, const char *path)
SDL_DFB_DEBUG("Loaded library: %s\n", path); SDL_DFB_DEBUG("Loaded library: %s\n", path);
/* Unload the old driver and reset the pointers */
DirectFB_GL_UnloadLibrary(_this);
_this->gl_config.dll_handle = handle; _this->gl_config.dll_handle = handle;
_this->gl_config.driver_loaded = 1; _this->gl_config.driver_loaded = 1;
if (path) { if (path) {
...@@ -134,8 +135,8 @@ DirectFB_GL_LoadLibrary(_THIS, const char *path) ...@@ -134,8 +135,8 @@ DirectFB_GL_LoadLibrary(_THIS, const char *path)
*_this->gl_config.driver_path = '\0'; *_this->gl_config.driver_path = '\0';
} }
devdata->glFinish = DirectFB_GL_GetProcAddress(_this, "glFinish"); _this->gl_data->glFinish = DirectFB_GL_GetProcAddress(_this, "glFinish");
devdata->glFlush = DirectFB_GL_GetProcAddress(_this, "glFlush"); _this->gl_data->glFlush = DirectFB_GL_GetProcAddress(_this, "glFlush");
return 0; return 0;
} }
...@@ -143,6 +144,7 @@ DirectFB_GL_LoadLibrary(_THIS, const char *path) ...@@ -143,6 +144,7 @@ DirectFB_GL_LoadLibrary(_THIS, const char *path)
static void static void
DirectFB_GL_UnloadLibrary(_THIS) DirectFB_GL_UnloadLibrary(_THIS)
{ {
#if 0
int ret; int ret;
if (_this->gl_config.driver_loaded) { if (_this->gl_config.driver_loaded) {
...@@ -153,6 +155,10 @@ DirectFB_GL_UnloadLibrary(_THIS) ...@@ -153,6 +155,10 @@ DirectFB_GL_UnloadLibrary(_THIS)
_this->gl_config.dll_handle = NULL; _this->gl_config.dll_handle = NULL;
_this->gl_config.driver_loaded = 0; _this->gl_config.driver_loaded = 0;
} }
#endif
/* Free OpenGL memory */
SDL_free(_this->gl_data);
_this->gl_data = NULL;
} }
void * void *
...@@ -167,11 +173,11 @@ DirectFB_GL_GetProcAddress(_THIS, const char *proc) ...@@ -167,11 +173,11 @@ DirectFB_GL_GetProcAddress(_THIS, const char *proc)
SDL_GLContext SDL_GLContext
DirectFB_GL_CreateContext(_THIS, SDL_Window * window) DirectFB_GL_CreateContext(_THIS, SDL_Window * window)
{ {
//SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
DirectFB_GLContext *context; DirectFB_GLContext *context;
int ret;
SDL_DFB_CALLOC(context, 1, sizeof(*context)); SDL_DFB_CALLOC(context, 1, sizeof(DirectFB_GLContext));
SDL_DFB_CHECKERR(windata->surface->GetGL(windata->surface, SDL_DFB_CHECKERR(windata->surface->GetGL(windata->surface,
&context->context)); &context->context));
...@@ -179,11 +185,14 @@ DirectFB_GL_CreateContext(_THIS, SDL_Window * window) ...@@ -179,11 +185,14 @@ DirectFB_GL_CreateContext(_THIS, SDL_Window * window)
if (!context->context) if (!context->context)
return NULL; return NULL;
SDL_DFB_CHECKERR(context->context->Unlock(context->context)); context->is_locked = 0;
context->sdl_window = window;
context->next = _this->gl_data->firstgl; context->next = _this->gl_data->firstgl;
_this->gl_data->firstgl = context; _this->gl_data->firstgl = context;
SDL_DFB_CHECK(context->context->Unlock(context->context));
if (DirectFB_GL_MakeCurrent(_this, window, context) < 0) { if (DirectFB_GL_MakeCurrent(_this, window, context) < 0) {
DirectFB_GL_DeleteContext(_this, context); DirectFB_GL_DeleteContext(_this, context);
return NULL; return NULL;
...@@ -198,28 +207,24 @@ DirectFB_GL_CreateContext(_THIS, SDL_Window * window) ...@@ -198,28 +207,24 @@ DirectFB_GL_CreateContext(_THIS, SDL_Window * window)
int int
DirectFB_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) DirectFB_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
{ {
SDL_DFB_WINDOWDATA(window); //SDL_DFB_WINDOWDATA(window);
DirectFB_GLContext *ctx = (DirectFB_GLContext *) context; DirectFB_GLContext *ctx = (DirectFB_GLContext *) context;
DirectFB_GLContext *p; DirectFB_GLContext *p;
int ret;
for (p = _this->gl_data->firstgl; p; p = p->next) for (p = _this->gl_data->firstgl; p; p = p->next)
p->context->Unlock(p->context); {
if (p->is_locked) {
if (windata) { SDL_DFB_CHECKERR(p->context->Unlock(p->context));
windata->gl_context = NULL; p->is_locked = 0;
/* Everything is unlocked, check for a resize */ }
DirectFB_AdjustWindowSurface(window);
} }
if (ctx != NULL) { if (ctx != NULL) {
SDL_DFB_CHECKERR(ctx->context->Lock(ctx->context)); SDL_DFB_CHECKERR(ctx->context->Lock(ctx->context));
ctx->is_locked = 1;
} }
if (windata)
windata->gl_context = ctx;
return 0; return 0;
error: error:
return -1; return -1;
...@@ -242,28 +247,36 @@ DirectFB_GL_GetSwapInterval(_THIS) ...@@ -242,28 +247,36 @@ DirectFB_GL_GetSwapInterval(_THIS)
void void
DirectFB_GL_SwapWindow(_THIS, SDL_Window * window) DirectFB_GL_SwapWindow(_THIS, SDL_Window * window)
{ {
SDL_DFB_DEVICEDATA(_this); //SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
int ret;
DFBRegion region; DFBRegion region;
DirectFB_GLContext *p;
region.x1 = 0; region.x1 = 0;
region.y1 = 0; region.y1 = 0;
region.x2 = window->w; region.x2 = window->w;
region.y2 = window->h; region.y2 = window->h;
#if 0
if (devdata->glFinish) if (devdata->glFinish)
devdata->glFinish(); devdata->glFinish();
else if (devdata->glFlush) else if (devdata->glFlush)
devdata->glFlush(); devdata->glFlush();
#endif
if (1 || windata->gl_context) { for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
/* SDL_DFB_CHECKERR(windata->gl_context->context->Unlock(windata->gl_context->context)); */ if (p->sdl_window == window && p->is_locked)
SDL_DFB_CHECKERR(windata->surface->Flip(windata->surface, &region, {
DSFLIP_ONSYNC)); SDL_DFB_CHECKERR(p->context->Unlock(p->context));
/* SDL_DFB_CHECKERR(windata->gl_context->context->Lock(windata->gl_context->context)); */ p->is_locked = 0;
}
} SDL_DFB_CHECKERR(windata->window_surface->Flip(windata->window_surface,NULL, DSFLIP_PIPELINE |DSFLIP_BLIT | DSFLIP_ONSYNC ));
//if (windata->gl_context) {
//SDL_DFB_CHECKERR(windata->surface->Flip(windata->surface,NULL, DSFLIP_ONSYNC));
//SDL_DFB_CHECKERR(windata->gl_context->context->Lock(windata->gl_context->context));
//}
return; return;
error: error:
...@@ -276,19 +289,58 @@ DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context) ...@@ -276,19 +289,58 @@ DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context)
DirectFB_GLContext *ctx = (DirectFB_GLContext *) context; DirectFB_GLContext *ctx = (DirectFB_GLContext *) context;
DirectFB_GLContext *p; DirectFB_GLContext *p;
ctx->context->Unlock(ctx->context); if (ctx->is_locked)
ctx->context->Release(ctx->context); SDL_DFB_CHECK(ctx->context->Unlock(ctx->context));
SDL_DFB_RELEASE(ctx->context);
p = _this->gl_data->firstgl; for (p = _this->gl_data->firstgl; p && p->next != ctx; p = p->next)
while (p && p->next != ctx) ;
p = p->next;
if (p) if (p)
p->next = ctx->next; p->next = ctx->next;
else else
_this->gl_data->firstgl = ctx->next; _this->gl_data->firstgl = ctx->next;
SDL_DFB_FREE(ctx); SDL_DFB_FREE(ctx);
}
void
DirectFB_GL_FreeWindowContexts(_THIS, SDL_Window * window)
{
DirectFB_GLContext *p;
for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
if (p->sdl_window == window)
{
if (p->is_locked)
SDL_DFB_CHECK(p->context->Unlock(p->context));
SDL_DFB_RELEASE(p->context);
}
}
void
DirectFB_GL_ReAllocWindowContexts(_THIS, SDL_Window * window)
{
DirectFB_GLContext *p;
for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
if (p->sdl_window == window)
{
SDL_DFB_WINDOWDATA(window);
SDL_DFB_CHECK(windata->surface->GetGL(windata->surface,
&p->context));
if (p->is_locked)
SDL_DFB_CHECK(p->context->Lock(p->context));
}
}
void
DirectFB_GL_DestroyWindowContexts(_THIS, SDL_Window * window)
{
DirectFB_GLContext *p;
for (p = _this->gl_data->firstgl; p != NULL; p = p->next)
if (p->sdl_window == window)
DirectFB_GL_DeleteContext(_this, p);
} }
#endif #endif
......
...@@ -32,6 +32,9 @@ struct _DirectFB_GLContext ...@@ -32,6 +32,9 @@ struct _DirectFB_GLContext
{ {
IDirectFBGL *context; IDirectFBGL *context;
DirectFB_GLContext *next; DirectFB_GLContext *next;
SDL_Window *sdl_window;
int is_locked;
}; };
/* OpenGL functions */ /* OpenGL functions */
...@@ -48,6 +51,10 @@ extern int DirectFB_GL_GetSwapInterval(_THIS); ...@@ -48,6 +51,10 @@ extern int DirectFB_GL_GetSwapInterval(_THIS);
extern void DirectFB_GL_SwapWindow(_THIS, SDL_Window * window); extern void DirectFB_GL_SwapWindow(_THIS, SDL_Window * window);
extern void DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context); extern void DirectFB_GL_DeleteContext(_THIS, SDL_GLContext context);
extern void DirectFB_GL_FreeWindowContexts(_THIS, SDL_Window * window);
extern void DirectFB_GL_ReAllocWindowContexts(_THIS, SDL_Window * window);
extern void DirectFB_GL_DestroyWindowContexts(_THIS, SDL_Window * window);
#endif /* SDL_DIRECTFB_OPENGL */ #endif /* SDL_DIRECTFB_OPENGL */
#endif /* _SDL_directfb_opengl_h */ #endif /* _SDL_directfb_opengl_h */
......
...@@ -72,6 +72,7 @@ static void DirectFB_UnlockTexture(SDL_Renderer * renderer, ...@@ -72,6 +72,7 @@ static void DirectFB_UnlockTexture(SDL_Renderer * renderer,
static void DirectFB_DirtyTexture(SDL_Renderer * renderer, static void DirectFB_DirtyTexture(SDL_Renderer * renderer,
SDL_Texture * texture, int numrects, SDL_Texture * texture, int numrects,
const SDL_Rect * rects); const SDL_Rect * rects);
static int DirectFB_SetDrawBlendMode(SDL_Renderer * renderer);
static int DirectFB_RenderDrawPoints(SDL_Renderer * renderer, static int DirectFB_RenderDrawPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count); const SDL_Point * points, int count);
static int DirectFB_RenderDrawLines(SDL_Renderer * renderer, static int DirectFB_RenderDrawLines(SDL_Renderer * renderer,
...@@ -194,20 +195,20 @@ SetBlendMode(DirectFB_RenderData * data, int blendMode, ...@@ -194,20 +195,20 @@ SetBlendMode(DirectFB_RenderData * data, int blendMode,
/**< No blending */ /**< No blending */
data->blitFlags = DSBLIT_NOFX; data->blitFlags = DSBLIT_NOFX;
data->drawFlags = DSDRAW_NOFX; data->drawFlags = DSDRAW_NOFX;
destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE); SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE));
destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO); SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO));
break; break;
case SDL_BLENDMODE_MASK: case SDL_BLENDMODE_MASK:
data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
data->drawFlags = DSDRAW_BLEND; data->drawFlags = DSDRAW_BLEND;
destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA); SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA));
destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA); SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA));
break; break;
case SDL_BLENDMODE_BLEND: case SDL_BLENDMODE_BLEND:
data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
data->drawFlags = DSDRAW_BLEND; data->drawFlags = DSDRAW_BLEND;
destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA); SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA));
destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA); SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_INVSRCALPHA));
break; break;
case SDL_BLENDMODE_ADD: case SDL_BLENDMODE_ADD:
data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
...@@ -216,16 +217,16 @@ SetBlendMode(DirectFB_RenderData * data, int blendMode, ...@@ -216,16 +217,16 @@ SetBlendMode(DirectFB_RenderData * data, int blendMode,
// It will be cheaper to copy the surface to // It will be cheaper to copy the surface to
// a temporay surface and premultiply // a temporay surface and premultiply
if (source && TextureHasAlpha(source)) if (source && TextureHasAlpha(source))
destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA); SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_SRCALPHA));
else else
destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE); SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_ONE));
destsurf->SetDstBlendFunction(destsurf, DSBF_ONE); SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_ONE));
break; break;
case SDL_BLENDMODE_MOD: case SDL_BLENDMODE_MOD:
data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL; data->blitFlags = DSBLIT_BLEND_ALPHACHANNEL;
data->drawFlags = DSDRAW_BLEND; data->drawFlags = DSDRAW_BLEND;
destsurf->SetSrcBlendFunction(destsurf, DSBF_DESTCOLOR); SDL_DFB_CHECK(destsurf->SetSrcBlendFunction(destsurf, DSBF_DESTCOLOR));
destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO); SDL_DFB_CHECK(destsurf->SetDstBlendFunction(destsurf, DSBF_ZERO));
break; break;
} }
data->lastBlendMode = blendMode; data->lastBlendMode = blendMode;
...@@ -250,7 +251,6 @@ DisplayPaletteChanged(void *userdata, SDL_Palette * palette) ...@@ -250,7 +251,6 @@ DisplayPaletteChanged(void *userdata, SDL_Palette * palette)
SDL_DFB_WINDOWSURFACE(data->window); SDL_DFB_WINDOWSURFACE(data->window);
IDirectFBPalette *surfpal; IDirectFBPalette *surfpal;
int ret;
int i; int i;
int ncolors; int ncolors;
DFBColor entries[256]; DFBColor entries[256];
...@@ -283,7 +283,6 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -283,7 +283,6 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
SDL_VideoDisplay *display = window->display; SDL_VideoDisplay *display = window->display;
SDL_Renderer *renderer = NULL; SDL_Renderer *renderer = NULL;
DirectFB_RenderData *data = NULL; DirectFB_RenderData *data = NULL;
DFBResult ret;
DFBSurfaceCapabilities scaps; DFBSurfaceCapabilities scaps;
char *p; char *p;
...@@ -306,10 +305,16 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -306,10 +305,16 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->DirtyTexture = DirectFB_DirtyTexture; renderer->DirtyTexture = DirectFB_DirtyTexture;
renderer->RenderDrawPoints = DirectFB_RenderDrawPoints; renderer->RenderDrawPoints = DirectFB_RenderDrawPoints;
renderer->RenderDrawLines = DirectFB_RenderDrawLines; renderer->RenderDrawLines = DirectFB_RenderDrawLines;
/* SetDrawColor - no needed */
renderer->SetDrawBlendMode = DirectFB_SetDrawBlendMode;
renderer->RenderFillRects = DirectFB_RenderFillRects; renderer->RenderFillRects = DirectFB_RenderFillRects;
renderer->RenderDrawRects = DirectFB_RenderDrawRects; renderer->RenderDrawRects = DirectFB_RenderDrawRects;
/* RenderDrawEllipse - no reference implementation yet */
/* RenderFillEllipse - no reference implementation yet */
renderer->RenderCopy = DirectFB_RenderCopy; renderer->RenderCopy = DirectFB_RenderCopy;
renderer->RenderPresent = DirectFB_RenderPresent; renderer->RenderPresent = DirectFB_RenderPresent;
/* RenderReadPixels is difficult to implement */
/* RenderWritePixels is difficult to implement */
renderer->DestroyTexture = DirectFB_DestroyTexture; renderer->DestroyTexture = DirectFB_DestroyTexture;
renderer->DestroyRenderer = DirectFB_DestroyRenderer; renderer->DestroyRenderer = DirectFB_DestroyRenderer;
renderer->info = DirectFB_RenderDriver.info; renderer->info = DirectFB_RenderDriver.info;
...@@ -324,7 +329,7 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -324,7 +329,7 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
data->flipflags = DSFLIP_PIPELINE | DSFLIP_BLIT; data->flipflags = DSFLIP_PIPELINE | DSFLIP_BLIT;
if (flags & SDL_RENDERER_PRESENTVSYNC) { if (flags & SDL_RENDERER_PRESENTVSYNC) {
data->flipflags |= DSFLIP_WAITFORSYNC; data->flipflags |= DSFLIP_WAITFORSYNC | DSFLIP_ONSYNC;
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
} else } else
data->flipflags |= DSFLIP_ONSYNC; data->flipflags |= DSFLIP_ONSYNC;
...@@ -396,11 +401,9 @@ SDLToDFBPixelFormat(Uint32 format) ...@@ -396,11 +401,9 @@ SDLToDFBPixelFormat(Uint32 format)
return DSPF_UNKNOWN; return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_INDEX4MSB: case SDL_PIXELFORMAT_INDEX4MSB:
return DSPF_UNKNOWN; return DSPF_UNKNOWN;
case SDL_PIXELFORMAT_RGB444:
#if (DFB_VERSION_ATLEAST(1,2,0)) #if (DFB_VERSION_ATLEAST(1,2,0))
case SDL_PIXELFORMAT_RGB444:
return DSPF_RGB444; return DSPF_RGB444;
#else
return DSPF_UNKNOWN;
#endif #endif
case SDL_PIXELFORMAT_BGR24: case SDL_PIXELFORMAT_BGR24:
return DSPF_UNKNOWN; return DSPF_UNKNOWN;
...@@ -427,7 +430,7 @@ DirectFB_ActivateRenderer(SDL_Renderer * renderer) ...@@ -427,7 +430,7 @@ DirectFB_ActivateRenderer(SDL_Renderer * renderer)
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
if (renddata->size_changed || windata->wm_needs_redraw) { if (renddata->size_changed || windata->wm_needs_redraw) {
DirectFB_AdjustWindowSurface(window); // DirectFB_AdjustWindowSurface(window);
} }
return 0; return 0;
} }
...@@ -451,7 +454,7 @@ DirectFB_AcquireVidLayer(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -451,7 +454,7 @@ DirectFB_AcquireVidLayer(SDL_Renderer * renderer, SDL_Texture * texture)
DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata; DFB_DisplayData *dispdata = (DFB_DisplayData *) display->driverdata;
DirectFB_TextureData *data = texture->driverdata; DirectFB_TextureData *data = texture->driverdata;
DFBDisplayLayerConfig layconf; DFBDisplayLayerConfig layconf;
int ret; DFBResult ret;
if (renddata->isyuvdirect && (dispdata->vidID >= 0) if (renddata->isyuvdirect && (dispdata->vidID >= 0)
&& (!dispdata->vidIDinuse) && (!dispdata->vidIDinuse)
...@@ -472,7 +475,7 @@ DirectFB_AcquireVidLayer(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -472,7 +475,7 @@ DirectFB_AcquireVidLayer(SDL_Renderer * renderer, SDL_Texture * texture)
DLSCL_EXCLUSIVE)); DLSCL_EXCLUSIVE));
if (devdata->use_yuv_underlays) { if (devdata->use_yuv_underlays) {
ret = dispdata->vidlayer->SetLevel(dispdata->vidlayer, -1); ret = SDL_DFB_CHECK(dispdata->vidlayer->SetLevel(dispdata->vidlayer, -1));
if (ret != DFB_OK) if (ret != DFB_OK)
SDL_DFB_DEBUG("Underlay Setlevel not supported\n"); SDL_DFB_DEBUG("Underlay Setlevel not supported\n");
} }
...@@ -505,7 +508,6 @@ DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -505,7 +508,6 @@ DirectFB_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
SDL_VideoDisplay *display = window->display; SDL_VideoDisplay *display = window->display;
SDL_DFB_DEVICEDATA(display->device); SDL_DFB_DEVICEDATA(display->device);
DirectFB_TextureData *data; DirectFB_TextureData *data;
DFBResult ret;
DFBSurfaceDescription dsc; DFBSurfaceDescription dsc;
DFBSurfacePixelFormat pixelformat; DFBSurfacePixelFormat pixelformat;
...@@ -600,8 +602,7 @@ DirectFB_SetTexturePalette(SDL_Renderer * renderer, ...@@ -600,8 +602,7 @@ DirectFB_SetTexturePalette(SDL_Renderer * renderer,
int ncolors) int ncolors)
{ {
DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata;
DFBResult ret;
if (SDL_ISPIXELFORMAT_INDEXED(data->format) if (SDL_ISPIXELFORMAT_INDEXED(data->format)
&& !SDL_ISPIXELFORMAT_FOURCC(data->format)) { && !SDL_ISPIXELFORMAT_FOURCC(data->format)) {
DFBColor entries[256]; DFBColor entries[256];
...@@ -631,7 +632,6 @@ DirectFB_GetTexturePalette(SDL_Renderer * renderer, ...@@ -631,7 +632,6 @@ DirectFB_GetTexturePalette(SDL_Renderer * renderer,
int firstcolor, int ncolors) int firstcolor, int ncolors)
{ {
DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata;
DFBResult ret;
if (SDL_ISPIXELFORMAT_INDEXED(data->format) if (SDL_ISPIXELFORMAT_INDEXED(data->format)
&& !SDL_ISPIXELFORMAT_FOURCC(data->format)) { && !SDL_ISPIXELFORMAT_FOURCC(data->format)) {
...@@ -686,6 +686,23 @@ DirectFB_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -686,6 +686,23 @@ DirectFB_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture)
} }
} }
static int
DirectFB_SetDrawBlendMode(SDL_Renderer * renderer)
{
switch (renderer->blendMode) {
case SDL_BLENDMODE_NONE:
case SDL_BLENDMODE_MASK:
case SDL_BLENDMODE_BLEND:
case SDL_BLENDMODE_ADD:
case SDL_BLENDMODE_MOD:
return 0;
default:
SDL_Unsupported();
renderer->blendMode = SDL_BLENDMODE_NONE;
return -1;
}
}
static int static int
DirectFB_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture) DirectFB_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture)
{ {
...@@ -720,7 +737,6 @@ DirectFB_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -720,7 +737,6 @@ DirectFB_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, const void *pixels, int pitch) const SDL_Rect * rect, const void *pixels, int pitch)
{ {
DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata; DirectFB_TextureData *data = (DirectFB_TextureData *) texture->driverdata;
DFBResult ret;
Uint8 *dpixels; Uint8 *dpixels;
int dpitch; int dpitch;
Uint8 *src, *dst; Uint8 *src, *dst;
...@@ -772,7 +788,6 @@ DirectFB_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -772,7 +788,6 @@ DirectFB_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
{ {
DirectFB_TextureData *texturedata = DirectFB_TextureData *texturedata =
(DirectFB_TextureData *) texture->driverdata; (DirectFB_TextureData *) texture->driverdata;
DFBResult ret;
if (markDirty) { if (markDirty) {
SDL_AddDirtyRect(&texturedata->dirty, rect); SDL_AddDirtyRect(&texturedata->dirty, rect);
...@@ -807,7 +822,7 @@ DirectFB_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -807,7 +822,7 @@ DirectFB_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
(DirectFB_TextureData *) texture->driverdata; (DirectFB_TextureData *) texture->driverdata;
if (texturedata->display) { if (texturedata->display) {
texturedata->surface->Unlock(texturedata->surface); SDL_DFB_CHECK(texturedata->surface->Unlock(texturedata->surface));
texturedata->pixels = NULL; texturedata->pixels = NULL;
} }
} }
...@@ -830,7 +845,6 @@ PrepareDraw(SDL_Renderer * renderer) ...@@ -830,7 +845,6 @@ PrepareDraw(SDL_Renderer * renderer)
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
SDL_DFB_WINDOWSURFACE(data->window); SDL_DFB_WINDOWSURFACE(data->window);
DFBResult ret;
Uint8 r, g, b, a; Uint8 r, g, b, a;
r = renderer->r; r = renderer->r;
...@@ -866,7 +880,6 @@ static int DirectFB_RenderDrawPoints(SDL_Renderer * renderer, ...@@ -866,7 +880,6 @@ static int DirectFB_RenderDrawPoints(SDL_Renderer * renderer,
{ {
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
SDL_DFB_WINDOWSURFACE(data->window); SDL_DFB_WINDOWSURFACE(data->window);
DFBResult ret;
int i; int i;
PrepareDraw(renderer); PrepareDraw(renderer);
...@@ -882,7 +895,6 @@ static int DirectFB_RenderDrawLines(SDL_Renderer * renderer, ...@@ -882,7 +895,6 @@ static int DirectFB_RenderDrawLines(SDL_Renderer * renderer,
{ {
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
SDL_DFB_WINDOWSURFACE(data->window); SDL_DFB_WINDOWSURFACE(data->window);
DFBResult ret;
int i; int i;
PrepareDraw(renderer); PrepareDraw(renderer);
...@@ -904,7 +916,6 @@ DirectFB_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int c ...@@ -904,7 +916,6 @@ DirectFB_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int c
{ {
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
SDL_DFB_WINDOWSURFACE(data->window); SDL_DFB_WINDOWSURFACE(data->window);
DFBResult ret;
int i; int i;
PrepareDraw(renderer); PrepareDraw(renderer);
...@@ -923,7 +934,6 @@ DirectFB_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int c ...@@ -923,7 +934,6 @@ DirectFB_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int c
{ {
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata; DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
SDL_DFB_WINDOWSURFACE(data->window); SDL_DFB_WINDOWSURFACE(data->window);
DFBResult ret;
int i; int i;
PrepareDraw(renderer); PrepareDraw(renderer);
...@@ -946,7 +956,6 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -946,7 +956,6 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
DirectFB_TextureData *texturedata = DirectFB_TextureData *texturedata =
(DirectFB_TextureData *) texture->driverdata; (DirectFB_TextureData *) texture->driverdata;
Uint8 alpha = 0xFF; Uint8 alpha = 0xFF;
DFBResult ret;
if (texturedata->display) { if (texturedata->display) {
int px, py; int px, py;
...@@ -960,7 +969,7 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -960,7 +969,7 @@ DirectFB_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
srcrect->x, srcrect->y, srcrect->x, srcrect->y,
srcrect->w, srcrect->w,
srcrect->h)); srcrect->h));
windata->window->GetPosition(windata->window, &px, &py); SDL_DFB_CHECK(windata->window->GetPosition(windata->window, &px, &py));
px += windata->client.x; px += windata->client.x;
py += windata->client.y; py += windata->client.y;
SDL_DFB_CHECKERR(dispdata-> SDL_DFB_CHECKERR(dispdata->
...@@ -1052,7 +1061,6 @@ DirectFB_RenderPresent(SDL_Renderer * renderer) ...@@ -1052,7 +1061,6 @@ DirectFB_RenderPresent(SDL_Renderer * renderer)
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
DFBRectangle sr; DFBRectangle sr;
DFBResult ret;
sr.x = 0; sr.x = 0;
sr.y = 0; sr.y = 0;
...@@ -1078,8 +1086,9 @@ DirectFB_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -1078,8 +1086,9 @@ DirectFB_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture)
DFB_DisplayData *dispdata = DFB_DisplayData *dispdata =
(DFB_DisplayData *) data->display->driverdata; (DFB_DisplayData *) data->display->driverdata;
dispdata->vidIDinuse = 0; dispdata->vidIDinuse = 0;
dispdata->vidlayer->SetCooperativeLevel(dispdata->vidlayer, /* FIXME: Shouldn't we reset the cooperative level */
DLSCL_ADMINISTRATIVE); SDL_DFB_CHECK(dispdata->vidlayer->SetCooperativeLevel(dispdata->vidlayer,
DLSCL_ADMINISTRATIVE));
SDL_DFB_RELEASE(dispdata->vidlayer); SDL_DFB_RELEASE(dispdata->vidlayer);
} }
SDL_FreeDirtyRects(&data->dirty); SDL_FreeDirtyRects(&data->dirty);
......
...@@ -209,14 +209,11 @@ DirectFB_VideoInit(_THIS) ...@@ -209,14 +209,11 @@ DirectFB_VideoInit(_THIS)
DirectFBSetOption("disable-module", "x11input"); DirectFBSetOption("disable-module", "x11input");
} }
#if USE_MULTI_API /* FIXME: Reenable as default once multi kbd/mouse interface is sorted out */
devdata->use_linux_input = 1; /* default: on */ devdata->use_linux_input = 0; /* default: on */
stemp = SDL_getenv(DFBENV_USE_LINUX_INPUT); stemp = SDL_getenv(DFBENV_USE_LINUX_INPUT);
if (stemp) if (stemp)
devdata->use_linux_input = atoi(stemp); devdata->use_linux_input = atoi(stemp);
#else
devdata->use_linux_input = 0; /* no way to support this ... */
#endif
if (!devdata->use_linux_input) if (!devdata->use_linux_input)
DirectFBSetOption("disable-module", "linux_input"); DirectFBSetOption("disable-module", "linux_input");
...@@ -253,6 +250,7 @@ DirectFB_VideoInit(_THIS) ...@@ -253,6 +250,7 @@ DirectFB_VideoInit(_THIS)
devdata->dfb = dfb; devdata->dfb = dfb;
devdata->firstwin = NULL; devdata->firstwin = NULL;
devdata->grabbed_window = NULL;
_this->driverdata = devdata; _this->driverdata = devdata;
......
...@@ -78,49 +78,38 @@ ...@@ -78,49 +78,38 @@
#define DFBENV_USE_LINUX_INPUT "SDL_DIRECTFB_LINUX_INPUT" /* Default: on */ #define DFBENV_USE_LINUX_INPUT "SDL_DIRECTFB_LINUX_INPUT" /* Default: on */
#define DFBENV_USE_WM "SDL_DIRECTFB_WM" /* Default: off */ #define DFBENV_USE_WM "SDL_DIRECTFB_WM" /* Default: off */
#define SDL_DFB_RELEASE(x) do { if ( (x) != NULL ) { x->Release(x); x = NULL; } } while (0) #define SDL_DFB_RELEASE(x) do { if ( (x) != NULL ) { SDL_DFB_CHECK(x->Release(x)); x = NULL; } } while (0)
#define SDL_DFB_FREE(x) do { if ( (x) != NULL ) { SDL_free(x); x = NULL; } } while (0) #define SDL_DFB_FREE(x) do { if ( (x) != NULL ) { SDL_free(x); x = NULL; } } while (0)
#define SDL_DFB_UNLOCK(x) do { if ( (x) != NULL ) { x->Unlock(x); } } while (0) #define SDL_DFB_UNLOCK(x) do { if ( (x) != NULL ) { x->Unlock(x); } } while (0)
#if DEBUG #if DEBUG
#define SDL_DFB_DEBUG(x...) do { fprintf(LOG_CHANNEL, "%s:", __FUNCTION__); fprintf(LOG_CHANNEL, x); } while (0) /* FIXME: do something with DEBUG */
#define SDL_DFB_DEBUGC(x...) do { fprintf(LOG_CHANNEL, x); } while (0)
#else
#define SDL_DFB_DEBUG(x...) do { } while (0)
#define SDL_DFB_DEBUGC(x...) do { } while (0)
#endif #endif
#define SDL_DFB_CONTEXT "SDL_DirectFB" #define SDL_DFB_CONTEXT "SDL_DirectFB"
#define SDL_DFB_ERR(x...) \ static inline DFBResult sdl_dfb_check(DFBResult ret, const char *src_file, int src_line, const char *src_code) {
if (ret != DFB_OK) {
fprintf(LOG_CHANNEL, "%s <%d>:\n\t", src_file, src_line );
fprintf(LOG_CHANNEL, "\t%s\n", src_code );
fprintf(LOG_CHANNEL, "\t%s\n", DirectFBErrorString (ret) );
SDL_SetError( src_code, DirectFBErrorString (ret) );
}
return ret;
}
#define SDL_DFB_CHECK(x...) sdl_dfb_check( x, __FILE__, __LINE__, #x )
#define SDL_DFB_CHECKERR(x...) if ( sdl_dfb_check( x, __FILE__, __LINE__, #x ) != DFB_OK ) goto error
#define SDL_DFB_DEBUG(x...) \
do { \ do { \
fprintf(LOG_CHANNEL, "%s: %s <%d>:\n\t", \ fprintf(LOG_CHANNEL, "%s: %s <%d>:\n\t", \
SDL_DFB_CONTEXT, __FILE__, __LINE__ ); \ SDL_DFB_CONTEXT, __FILE__, __LINE__ ); \
fprintf(LOG_CHANNEL, x ); \ fprintf(LOG_CHANNEL, x ); \
} while (0) } while (0)
#define SDL_DFB_CHECK(x...) \ #define SDL_DFB_ERR(x...) SDL_DFB_DEBUG( x )
do { \
ret = x; \
if (ret != DFB_OK) { \
fprintf(LOG_CHANNEL, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
fprintf(LOG_CHANNEL, "\t%s\n", #x ); \
fprintf(LOG_CHANNEL, "\t%s\n", DirectFBErrorString (ret) ); \
SDL_SetError( #x, DirectFBErrorString (ret) ); \
} \
} while (0)
#define SDL_DFB_CHECKERR(x...) \
do { \
ret = x; \
if (ret != DFB_OK) { \
fprintf(LOG_CHANNEL, "%s <%d>:\n", __FILE__, __LINE__ ); \
fprintf(LOG_CHANNEL, "\t%s\n", #x ); \
fprintf(LOG_CHANNEL, "\t%s\n", DirectFBErrorString (ret) ); \
SDL_SetError( #x, DirectFBErrorString (ret) ); \
goto error; \
} \
} while (0)
#define SDL_DFB_CALLOC(r, n, s) \ #define SDL_DFB_CALLOC(r, n, s) \
do { \ do { \
...@@ -158,9 +147,8 @@ struct _DFB_DeviceData ...@@ -158,9 +147,8 @@ struct _DFB_DeviceData
int use_linux_input; int use_linux_input;
int has_own_wm; int has_own_wm;
/* OpenGL */ /* window grab */
void (*glFinish) (void); SDL_Window *grabbed_window;
void (*glFlush) (void);
/* global events */ /* global events */
IDirectFBEventBuffer *events; IDirectFBEventBuffer *events;
......
...@@ -24,9 +24,14 @@ ...@@ -24,9 +24,14 @@
#include "SDL_syswm.h" #include "SDL_syswm.h"
#include "../SDL_sysvideo.h" #include "../SDL_sysvideo.h"
#include "../../events/SDL_keyboard_c.h" #include "../../events/SDL_keyboard_c.h"
#include "../../video/SDL_pixels_c.h"
#include "SDL_DirectFB_video.h" #include "SDL_DirectFB_video.h"
#if SDL_DIRECTFB_OPENGL
#include "SDL_DirectFB_opengl.h"
#endif
static void DirectFB_AdjustWindowSurface(_THIS, SDL_Window * window);
int int
DirectFB_CreateWindow(_THIS, SDL_Window * window) DirectFB_CreateWindow(_THIS, SDL_Window * window)
...@@ -36,8 +41,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window) ...@@ -36,8 +41,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
DFB_WindowData *windata = NULL; DFB_WindowData *windata = NULL;
DFBWindowOptions wopts; DFBWindowOptions wopts;
DFBWindowDescription desc; DFBWindowDescription desc;
IDirectFBFont *font; int x, y;
int ret, x, y;
SDL_DFB_CALLOC(window->driverdata, 1, sizeof(DFB_WindowData)); SDL_DFB_CALLOC(window->driverdata, 1, sizeof(DFB_WindowData));
windata = (DFB_WindowData *) window->driverdata; windata = (DFB_WindowData *) window->driverdata;
...@@ -69,7 +73,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window) ...@@ -69,7 +73,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
y = 0; y = 0;
} }
DirectFB_WM_AdjustWindowLayout(window); DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
/* Create Window */ /* Create Window */
desc.flags = desc.flags =
...@@ -87,7 +91,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window) ...@@ -87,7 +91,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
&windata->window)); &windata->window));
/* Set Options */ /* Set Options */
windata->window->GetOptions(windata->window, &wopts); SDL_DFB_CHECK(windata->window->GetOptions(windata->window, &wopts));
if (window->flags & SDL_WINDOW_RESIZABLE) if (window->flags & SDL_WINDOW_RESIZABLE)
wopts |= DWOP_SCALE; wopts |= DWOP_SCALE;
...@@ -96,9 +100,9 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window) ...@@ -96,9 +100,9 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
if (window->flags & SDL_WINDOW_FULLSCREEN) { if (window->flags & SDL_WINDOW_FULLSCREEN) {
wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE; wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE;
windata->window->SetStackingClass(windata->window, DWSC_UPPER); SDL_DFB_CHECK(windata->window->SetStackingClass(windata->window, DWSC_UPPER));
} }
windata->window->SetOptions(windata->window, wopts); SDL_DFB_CHECK(windata->window->SetOptions(windata->window, wopts));
/* See what we got */ /* See what we got */
SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
...@@ -112,7 +116,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window) ...@@ -112,7 +116,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
GetSubSurface(windata->window_surface, &windata->client, GetSubSurface(windata->window_surface, &windata->client,
&windata->surface)); &windata->surface));
windata->window->SetOpacity(windata->window, 0xFF); SDL_DFB_CHECK(windata->window->SetOpacity(windata->window, 0xFF));
/* Create Eventbuffer */ /* Create Eventbuffer */
SDL_DFB_CHECKERR(windata->window->CreateEventBuffer(windata->window, SDL_DFB_CHECKERR(windata->window->CreateEventBuffer(windata->window,
...@@ -123,21 +127,10 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window) ...@@ -123,21 +127,10 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
/* Create a font */ /* Create a font */
/* FIXME: once during Video_Init */ /* FIXME: once during Video_Init */
if (windata->is_managed) { windata->font = NULL;
DFBFontDescription fdesc;
fdesc.flags = DFDESC_HEIGHT;
fdesc.height = windata->theme.font_size;
font = NULL;
SDL_DFB_CHECK(devdata->
dfb->CreateFont(devdata->dfb, windata->theme.font,
&fdesc, &font));
windata->window_surface->SetFont(windata->window_surface, font);
SDL_DFB_RELEASE(font);
}
/* Make it the top most window. */ /* Make it the top most window. */
windata->window->RaiseToTop(windata->window); SDL_DFB_CHECK(windata->window->RaiseToTop(windata->window));
/* remember parent */ /* remember parent */
windata->sdl_window = window; windata->sdl_window = window;
...@@ -149,7 +142,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window) ...@@ -149,7 +142,7 @@ DirectFB_CreateWindow(_THIS, SDL_Window * window)
devdata->firstwin = windata; devdata->firstwin = windata;
/* Draw Frame */ /* Draw Frame */
DirectFB_WM_RedrawLayout(window); DirectFB_WM_RedrawLayout(_this, window);
return 0; return 0;
error: error:
...@@ -172,6 +165,7 @@ DirectFB_SetWindowTitle(_THIS, SDL_Window * window) ...@@ -172,6 +165,7 @@ DirectFB_SetWindowTitle(_THIS, SDL_Window * window)
if (windata->is_managed) { if (windata->is_managed) {
windata->wm_needs_redraw = 1; windata->wm_needs_redraw = 1;
DirectFB_WM_RedrawLayout(_this, window);
} else } else
SDL_Unsupported(); SDL_Unsupported();
} }
...@@ -182,7 +176,6 @@ DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) ...@@ -182,7 +176,6 @@ DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
SDL_DFB_DEVICEDATA(_this); SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
SDL_Surface *surface = NULL; SDL_Surface *surface = NULL;
DFBResult ret;
if (icon) { if (icon) {
SDL_PixelFormat format; SDL_PixelFormat format;
...@@ -216,7 +209,7 @@ DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon) ...@@ -216,7 +209,7 @@ DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
memcpy((char *) dest + i * pitch, memcpy((char *) dest + i * pitch,
(char *) p + i * surface->pitch, 4 * surface->w); (char *) p + i * surface->pitch, 4 * surface->w);
windata->icon->Unlock(windata->icon); SDL_DFB_CHECK(windata->icon->Unlock(windata->icon));
SDL_FreeSurface(surface); SDL_FreeSurface(surface);
} else { } else {
SDL_DFB_RELEASE(windata->icon); SDL_DFB_RELEASE(windata->icon);
...@@ -249,16 +242,15 @@ DirectFB_SetWindowPosition(_THIS, SDL_Window * window) ...@@ -249,16 +242,15 @@ DirectFB_SetWindowPosition(_THIS, SDL_Window * window)
x = 0; x = 0;
y = 0; y = 0;
} }
DirectFB_WM_AdjustWindowLayout(window); DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
windata->window->MoveTo(windata->window, x, y); SDL_DFB_CHECK(windata->window->MoveTo(windata->window, x, y));
} }
void void
DirectFB_SetWindowSize(_THIS, SDL_Window * window) DirectFB_SetWindowSize(_THIS, SDL_Window * window)
{ {
SDL_DFB_DEVICEDATA(_this); //SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
int ret;
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) { if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
int cw; int cw;
...@@ -272,23 +264,23 @@ DirectFB_SetWindowSize(_THIS, SDL_Window * window) ...@@ -272,23 +264,23 @@ DirectFB_SetWindowSize(_THIS, SDL_Window * window)
if (cw != window->w || ch != window->h) { if (cw != window->w || ch != window->h) {
DirectFB_WM_AdjustWindowLayout(window); DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
SDL_DFB_CHECKERR(windata->window->Resize(windata->window, SDL_DFB_CHECKERR(windata->window->Resize(windata->window,
windata->size.w, windata->size.w,
windata->size.h)); windata->size.h));
} }
SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
(_this, window, &window->w, &window->h));
DirectFB_AdjustWindowSurface(_this, window);
SDL_DFB_CHECKERR(windata->window->EnableEvents(windata->window, SDL_DFB_CHECKERR(windata->window->EnableEvents(windata->window,
DWET_ALL)); DWET_ALL));
SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
(_this, window, &window->w, &window->h));
SDL_OnWindowResized(window);
} }
return; return;
error: error:
windata->window->EnableEvents(windata->window, DWET_ALL); SDL_DFB_CHECK(windata->window->EnableEvents(windata->window, DWET_ALL));
return; return;
} }
...@@ -297,7 +289,7 @@ DirectFB_ShowWindow(_THIS, SDL_Window * window) ...@@ -297,7 +289,7 @@ DirectFB_ShowWindow(_THIS, SDL_Window * window)
{ {
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
windata->window->SetOpacity(windata->window, windata->opacity); SDL_DFB_CHECK(windata->window->SetOpacity(windata->window, windata->opacity));
} }
...@@ -306,8 +298,8 @@ DirectFB_HideWindow(_THIS, SDL_Window * window) ...@@ -306,8 +298,8 @@ DirectFB_HideWindow(_THIS, SDL_Window * window)
{ {
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
windata->window->GetOpacity(windata->window, &windata->opacity); SDL_DFB_CHECK(windata->window->GetOpacity(windata->window, &windata->opacity));
windata->window->SetOpacity(windata->window, 0); SDL_DFB_CHECK(windata->window->SetOpacity(windata->window, 0));
} }
void void
...@@ -315,8 +307,8 @@ DirectFB_RaiseWindow(_THIS, SDL_Window * window) ...@@ -315,8 +307,8 @@ DirectFB_RaiseWindow(_THIS, SDL_Window * window)
{ {
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
windata->window->RaiseToTop(windata->window); SDL_DFB_CHECK(windata->window->RaiseToTop(windata->window));
windata->window->RequestFocus(windata->window); SDL_DFB_CHECK(windata->window->RequestFocus(windata->window));
} }
void void
...@@ -352,14 +344,23 @@ DirectFB_RestoreWindow(_THIS, SDL_Window * window) ...@@ -352,14 +344,23 @@ DirectFB_RestoreWindow(_THIS, SDL_Window * window)
void void
DirectFB_SetWindowGrab(_THIS, SDL_Window * window) DirectFB_SetWindowGrab(_THIS, SDL_Window * window)
{ {
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL);
if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) { if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) {
windata->window->GrabPointer(windata->window); if (gwindata != NULL)
windata->window->GrabKeyboard(windata->window); {
SDL_DFB_CHECK(gwindata->window->UngrabPointer(gwindata->window));
SDL_DFB_CHECK(gwindata->window->UngrabKeyboard(gwindata->window));
}
SDL_DFB_CHECK(windata->window->GrabPointer(windata->window));
SDL_DFB_CHECK(windata->window->GrabKeyboard(windata->window));
devdata->grabbed_window = window;
} else { } else {
windata->window->UngrabPointer(windata->window); SDL_DFB_CHECK(windata->window->UngrabPointer(windata->window));
windata->window->UngrabKeyboard(windata->window); SDL_DFB_CHECK(windata->window->UngrabKeyboard(windata->window));
devdata->grabbed_window = NULL;
} }
} }
...@@ -370,14 +371,19 @@ DirectFB_DestroyWindow(_THIS, SDL_Window * window) ...@@ -370,14 +371,19 @@ DirectFB_DestroyWindow(_THIS, SDL_Window * window)
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
DFB_WindowData *p; DFB_WindowData *p;
SDL_DFB_DEBUG("Trace\n");
/* Some cleanups */ /* Some cleanups */
windata->window->UngrabPointer(windata->window); SDL_DFB_CHECK(windata->window->UngrabPointer(windata->window));
windata->window->UngrabKeyboard(windata->window); SDL_DFB_CHECK(windata->window->UngrabKeyboard(windata->window));
windata->window_surface->SetFont(windata->window_surface, NULL); #if SDL_DIRECTFB_OPENGL
SDL_DFB_RELEASE(windata->icon); DirectFB_GL_DestroyWindowContexts(_this, window);
#endif
SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, NULL));
SDL_DFB_CHECK(windata->surface->ReleaseSource(windata->surface));
SDL_DFB_CHECK(windata->window_surface->ReleaseSource(windata->window_surface));
SDL_DFB_RELEASE(windata->icon);
SDL_DFB_RELEASE(windata->font);
SDL_DFB_RELEASE(windata->eventbuffer); SDL_DFB_RELEASE(windata->eventbuffer);
SDL_DFB_RELEASE(windata->surface); SDL_DFB_RELEASE(windata->surface);
SDL_DFB_RELEASE(windata->window_surface); SDL_DFB_RELEASE(windata->window_surface);
...@@ -405,15 +411,14 @@ DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window, ...@@ -405,15 +411,14 @@ DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
return SDL_FALSE; return SDL_FALSE;
} }
void static void
DirectFB_AdjustWindowSurface(SDL_Window * window) DirectFB_AdjustWindowSurface(_THIS, SDL_Window * window)
{ {
SDL_DFB_WINDOWDATA(window); SDL_DFB_WINDOWDATA(window);
int adjust = windata->wm_needs_redraw; int adjust = windata->wm_needs_redraw;
int cw, ch; int cw, ch;
int ret;
DirectFB_WM_AdjustWindowLayout(window); DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
SDL_DFB_CHECKERR(windata-> SDL_DFB_CHECKERR(windata->
window_surface->GetSize(windata->window_surface, &cw, window_surface->GetSize(windata->window_surface, &cw,
...@@ -423,6 +428,10 @@ DirectFB_AdjustWindowSurface(SDL_Window * window) ...@@ -423,6 +428,10 @@ DirectFB_AdjustWindowSurface(SDL_Window * window)
} }
if (adjust) { if (adjust) {
#if SDL_DIRECTFB_OPENGL
DirectFB_GL_FreeWindowContexts(_this, window);
#endif
#if DFB_VERSION_ATLEAST(1,2,1) #if DFB_VERSION_ATLEAST(1,2,1)
SDL_DFB_CHECKERR(windata->window->ResizeSurface(windata->window, SDL_DFB_CHECKERR(windata->window->ResizeSurface(windata->window,
windata->size.w, windata->size.w,
...@@ -446,8 +455,12 @@ DirectFB_AdjustWindowSurface(SDL_Window * window) ...@@ -446,8 +455,12 @@ DirectFB_AdjustWindowSurface(SDL_Window * window)
GetSubSurface(windata->window_surface, GetSubSurface(windata->window_surface,
&windata->client, &windata->surface)); &windata->client, &windata->surface));
#endif #endif
DirectFB_WM_RedrawLayout(window); DirectFB_WM_RedrawLayout(_this, window);
}
#if SDL_DIRECTFB_OPENGL
DirectFB_GL_ReAllocWindowContexts(_this, window);
#endif
}
error: error:
return; return;
} }
...@@ -34,7 +34,6 @@ struct _DFB_WindowData ...@@ -34,7 +34,6 @@ struct _DFB_WindowData
IDirectFBSurface *surface; IDirectFBSurface *surface;
IDirectFBSurface *window_surface; /* only used with has_own_wm */ IDirectFBSurface *window_surface; /* only used with has_own_wm */
IDirectFBWindow *window; IDirectFBWindow *window;
DirectFB_GLContext *gl_context;
IDirectFBEventBuffer *eventbuffer; IDirectFBEventBuffer *eventbuffer;
SDL_Window *sdl_window; SDL_Window *sdl_window;
DFB_WindowData *next; DFB_WindowData *next;
...@@ -46,6 +45,7 @@ struct _DFB_WindowData ...@@ -46,6 +45,7 @@ struct _DFB_WindowData
int is_managed; int is_managed;
int wm_needs_redraw; int wm_needs_redraw;
IDirectFBSurface *icon; IDirectFBSurface *icon;
IDirectFBFont *font;
DFB_Theme theme; DFB_Theme theme;
}; };
...@@ -69,7 +69,7 @@ extern void DirectFB_DestroyWindow(_THIS, SDL_Window * window); ...@@ -69,7 +69,7 @@ extern void DirectFB_DestroyWindow(_THIS, SDL_Window * window);
extern SDL_bool DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window, extern SDL_bool DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
struct SDL_SysWMinfo *info); struct SDL_SysWMinfo *info);
extern void DirectFB_AdjustWindowSurface(SDL_Window * window); //extern void DirectFB_AdjustWindowSurface(_THIS, SDL_Window * window);
#endif /* _SDL_directfb_window_h */ #endif /* _SDL_directfb_window_h */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment