21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_DIRECTFB
30 #if SDL_DIRECTFB_OPENGL
36 #include "../SDL_pixels_c.h"
43 DFB_WindowData *windata =
NULL;
44 DFBWindowOptions wopts;
45 DFBWindowDescription desc;
50 SDL_memset(&desc, 0,
sizeof(DFBWindowDescription));
51 windata = (DFB_WindowData *)
window->driverdata;
53 windata->is_managed = devdata->has_own_wm;
58 DLSCL_ADMINISTRATIVE));
73 DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_POSX | DWDESC_POSY | DWDESC_SURFACE_CAPS;
76 desc.flags |= DWDESC_CAPS;
77 desc.caps |= DWCAPS_ALPHACHANNEL;
81 desc.flags |= DWDESC_PIXELFORMAT;
85 desc.caps |= DWCAPS_NODECORATION;
89 desc.width = windata->size.w;
90 desc.height = windata->size.h;
91 desc.pixelformat = dispdata->pixelformat;
92 desc.surface_caps = DSCAPS_PREMULTIPLIED;
93 #if DIRECTFB_MAJOR_VERSION == 1 && DIRECTFB_MINOR_VERSION >= 6
95 desc.surface_caps |= DSCAPS_GL;
104 SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
109 wopts &= ~DWOP_KEEP_SIZE;
112 wopts |= DWOP_KEEP_SIZE;
116 wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE;
117 SDL_DFB_CHECK(windata->dfbwin->SetStackingClass(windata->dfbwin, DWSC_UPPER));
121 wopts |= DWOP_SHAPED | DWOP_ALPHACHANNEL;
122 wopts &= ~DWOP_OPAQUE_REGION;
125 SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
133 &windata->window_surface));
137 GetSubSurface(windata->window_surface, &windata->client,
140 SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0xFF));
148 EnableEvents(windata->dfbwin, DWET_ALL));
152 windata->font =
NULL;
162 windata->next = devdata->firstwin;
163 windata->opacity = 0xFF;
164 devdata->firstwin =
window;
187 if (windata->is_managed) {
188 windata->wm_needs_redraw = 1;
204 DFBSurfaceDescription dsc;
216 DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
217 dsc.caps = DSCAPS_VIDEOONLY;
220 dsc.pixelformat = DSPF_ARGB;
226 (
void *) &dest, &pitch));
230 memcpy((
char *) dest +
i * pitch,
293 SDL_DFB_CHECK(windata->dfbwin->EnableEvents(windata->dfbwin, DWET_ALL));
302 SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, windata->opacity));
311 SDL_DFB_CHECK(windata->dfbwin->GetOpacity(windata->dfbwin, &windata->opacity));
312 SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0));
321 SDL_DFB_CHECK(windata->dfbwin->RequestFocus(windata->dfbwin));
329 DFBWindowOptions wopts;
332 &windata->restore.x, &windata->restore.y));
333 SDL_DFB_CHECK(windata->dfbwin->GetSize(windata->dfbwin, &windata->restore.w,
334 &windata->restore.h));
338 SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, 0, 0));
343 SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
344 wopts |= DWOP_KEEP_SIZE | DWOP_KEEP_POSITION;
345 SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
360 DFBWindowOptions wopts;
363 SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
364 wopts &= ~(DWOP_KEEP_SIZE | DWOP_KEEP_POSITION);
365 SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
369 windata->restore.w, windata->restore.h);
370 SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin, windata->restore.w,
371 windata->restore.h));
372 SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, windata->restore.x,
373 windata->restore.y));
376 wopts |= DWOP_KEEP_SIZE;
379 wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_SIZE;
380 SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
390 DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) :
NULL);
393 if (gwindata !=
NULL)
395 SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin));
396 SDL_DFB_CHECK(gwindata->dfbwin->UngrabKeyboard(gwindata->dfbwin));
398 SDL_DFB_CHECK(windata->dfbwin->GrabPointer(windata->dfbwin));
399 SDL_DFB_CHECK(windata->dfbwin->GrabKeyboard(windata->dfbwin));
400 devdata->grabbed_window =
window;
402 SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
403 SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
404 devdata->grabbed_window =
NULL;
416 SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
417 SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
419 #if SDL_DIRECTFB_OPENGL
433 SDL_DFB_CHECK(windata->surface->ReleaseSource(windata->surface));
434 SDL_DFB_CHECK(windata->window_surface->ReleaseSource(windata->window_surface));
445 p = devdata->firstwin->driverdata;
448 p = (
p->next ?
p->next->driverdata :
NULL);
450 p->next = windata->next;
452 devdata->firstwin = windata->next;
478 if (version < 2000006) {
487 info->
info.dfb.dfb = devdata->dfb;
489 info->
info.dfb.surface = windata->surface;
502 int adjust = windata->wm_needs_redraw;
508 window_surface->GetSize(windata->window_surface, &cw,
510 if (cw != windata->size.w || ch != windata->size.h) {
515 #if SDL_DIRECTFB_OPENGL
519 #if (DFB_VERSION_ATLEAST(1,2,1))
528 DFBWindowOptions opts;
534 if (opts & DWOP_SCALE)
539 GetSubSurface(windata->window_surface,
540 &windata->client, &windata->surface));
544 #if SDL_DIRECTFB_OPENGL
558 windata->opacity =
alpha;