Fixed bug 2374 - Update copyright for 2014...
Is it that time already??
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_DIRECTFB
25 #include "SDL_DirectFB_video.h"
26 #include "SDL_DirectFB_modes.h"
27 #include "SDL_DirectFB_window.h"
28 #include "SDL_DirectFB_shape.h"
30 #if SDL_DIRECTFB_OPENGL
31 #include "SDL_DirectFB_opengl.h"
34 #include "SDL_syswm.h"
36 #include "../SDL_pixels_c.h"
39 DirectFB_CreateWindow(_THIS, SDL_Window * window)
41 SDL_DFB_DEVICEDATA(_this);
42 SDL_DFB_DISPLAYDATA(window);
43 DFB_WindowData *windata = NULL;
44 DFBWindowOptions wopts;
45 DFBWindowDescription desc;
49 SDL_DFB_ALLOC_CLEAR(window->driverdata, sizeof(DFB_WindowData));
50 SDL_memset(&desc, 0, sizeof(DFBWindowDescription));
51 windata = (DFB_WindowData *) window->driverdata;
53 windata->is_managed = devdata->has_own_wm;
55 SDL_DFB_CHECKERR(devdata->dfb->SetCooperativeLevel(devdata->dfb,
57 SDL_DFB_CHECKERR(dispdata->layer->SetCooperativeLevel(dispdata->layer,
58 DLSCL_ADMINISTRATIVE));
60 /* FIXME ... ughh, ugly */
61 if (window->x == -1000 && window->y == -1000)
64 /* Fill the window description. */
68 DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
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;
84 if (!(window->flags & SDL_WINDOW_BORDERLESS))
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 >= 4
94 if (window->flags & SDL_WINDOW_OPENGL) {
95 desc.surface_caps |= DSCAPS_GL;
99 /* Create the window. */
100 SDL_DFB_CHECKERR(dispdata->layer->CreateWindow(dispdata->layer, &desc,
104 SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
106 /* explicit rescaling of surface */
108 if (window->flags & SDL_WINDOW_RESIZABLE) {
109 wopts &= ~DWOP_KEEP_SIZE;
112 wopts |= DWOP_KEEP_SIZE;
115 if (window->flags & SDL_WINDOW_FULLSCREEN) {
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));
127 /* See what we got */
128 SDL_DFB_CHECK(DirectFB_WM_GetClientSize
129 (_this, window, &window->w, &window->h));
131 /* Get the window's surface. */
132 SDL_DFB_CHECKERR(windata->dfbwin->GetSurface(windata->dfbwin,
133 &windata->window_surface));
135 /* And get a subsurface for rendering */
136 SDL_DFB_CHECKERR(windata->window_surface->
137 GetSubSurface(windata->window_surface, &windata->client,
140 SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0xFF));
142 /* Create Eventbuffer */
144 SDL_DFB_CHECKERR(windata->dfbwin->CreateEventBuffer(windata->dfbwin,
147 SDL_DFB_CHECKERR(windata->dfbwin->
148 EnableEvents(windata->dfbwin, DWET_ALL));
151 /* FIXME: once during Video_Init */
152 windata->font = NULL;
154 /* Make it the top most window. */
155 SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
157 /* remember parent */
158 /* windata->sdlwin = window; */
160 /* Add to list ... */
162 windata->next = devdata->firstwin;
163 windata->opacity = 0xFF;
164 devdata->firstwin = window;
167 DirectFB_WM_RedrawLayout(_this, window);
171 SDL_DFB_RELEASE(windata->surface);
172 SDL_DFB_RELEASE(windata->dfbwin);
177 DirectFB_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
179 return SDL_Unsupported();
183 DirectFB_SetWindowTitle(_THIS, SDL_Window * window)
185 SDL_DFB_WINDOWDATA(window);
187 if (windata->is_managed) {
188 windata->wm_needs_redraw = 1;
189 DirectFB_WM_RedrawLayout(_this, window);
196 DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
198 SDL_DFB_DEVICEDATA(_this);
199 SDL_DFB_WINDOWDATA(window);
200 SDL_Surface *surface = NULL;
203 SDL_PixelFormat format;
204 DFBSurfaceDescription dsc;
209 /* Convert the icon to ARGB for modern window managers */
210 SDL_InitFormat(&format, SDL_PIXELFORMAT_ARGB8888);
211 surface = SDL_ConvertSurface(icon, &format, 0);
216 DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
217 dsc.caps = DSCAPS_VIDEOONLY;
218 dsc.width = surface->w;
219 dsc.height = surface->h;
220 dsc.pixelformat = DSPF_ARGB;
222 SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc,
225 SDL_DFB_CHECKERR(windata->icon->Lock(windata->icon, DSLF_WRITE,
226 (void *) &dest, &pitch));
229 for (i = 0; i < surface->h; i++)
230 memcpy((char *) dest + i * pitch,
231 (char *) p + i * surface->pitch, 4 * surface->w);
233 SDL_DFB_CHECK(windata->icon->Unlock(windata->icon));
234 SDL_FreeSurface(surface);
236 SDL_DFB_RELEASE(windata->icon);
240 SDL_FreeSurface(surface);
241 SDL_DFB_RELEASE(windata->icon);
246 DirectFB_SetWindowPosition(_THIS, SDL_Window * window)
248 SDL_DFB_WINDOWDATA(window);
254 DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
255 SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, x, y));
259 DirectFB_SetWindowSize(_THIS, SDL_Window * window)
261 SDL_DFB_WINDOWDATA(window);
263 if(SDL_IsShapedWindow(window))
264 DirectFB_ResizeWindowShape(window);
266 if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
270 /* Make sure all events are disabled for this operation ! */
271 SDL_DFB_CHECKERR(windata->dfbwin->DisableEvents(windata->dfbwin,
273 SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize(_this, window, &cw, &ch));
275 if (cw != window->w || ch != window->h) {
277 DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
278 SDL_DFB_CHECKERR(windata->dfbwin->Resize(windata->dfbwin,
283 SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
284 (_this, window, &window->w, &window->h));
285 DirectFB_AdjustWindowSurface(window);
287 SDL_DFB_CHECKERR(windata->dfbwin->EnableEvents(windata->dfbwin,
293 SDL_DFB_CHECK(windata->dfbwin->EnableEvents(windata->dfbwin, DWET_ALL));
298 DirectFB_ShowWindow(_THIS, SDL_Window * window)
300 SDL_DFB_WINDOWDATA(window);
302 SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, windata->opacity));
307 DirectFB_HideWindow(_THIS, SDL_Window * window)
309 SDL_DFB_WINDOWDATA(window);
311 SDL_DFB_CHECK(windata->dfbwin->GetOpacity(windata->dfbwin, &windata->opacity));
312 SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0));
316 DirectFB_RaiseWindow(_THIS, SDL_Window * window)
318 SDL_DFB_WINDOWDATA(window);
320 SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
321 SDL_DFB_CHECK(windata->dfbwin->RequestFocus(windata->dfbwin));
325 DirectFB_MaximizeWindow(_THIS, SDL_Window * window)
327 SDL_DFB_WINDOWDATA(window);
328 SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
329 DFBWindowOptions wopts;
331 SDL_DFB_CHECK(windata->dfbwin->GetPosition(windata->dfbwin,
332 &windata->restore.x, &windata->restore.y));
333 SDL_DFB_CHECK(windata->dfbwin->GetSize(windata->dfbwin, &windata->restore.w,
334 &windata->restore.h));
336 DirectFB_WM_AdjustWindowLayout(window, window->flags | SDL_WINDOW_MAXIMIZED, display->current_mode.w, display->current_mode.h) ;
338 SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, 0, 0));
339 SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin,
340 display->current_mode.w, display->current_mode.h));
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));
349 DirectFB_MinimizeWindow(_THIS, SDL_Window * window)
351 /* FIXME: Size to 32x32 ? */
357 DirectFB_RestoreWindow(_THIS, SDL_Window * window)
359 SDL_DFB_WINDOWDATA(window);
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));
368 DirectFB_WM_AdjustWindowLayout(window, window->flags & ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED),
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));
375 if (!(window->flags & SDL_WINDOW_RESIZABLE))
376 wopts |= DWOP_KEEP_SIZE;
378 if (window->flags & SDL_WINDOW_FULLSCREEN)
379 wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_SIZE;
380 SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
386 DirectFB_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
388 SDL_DFB_DEVICEDATA(_this);
389 SDL_DFB_WINDOWDATA(window);
390 DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL);
392 if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) {
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;
409 DirectFB_DestroyWindow(_THIS, SDL_Window * window)
411 SDL_DFB_DEVICEDATA(_this);
412 SDL_DFB_WINDOWDATA(window);
416 SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
417 SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
419 #if SDL_DIRECTFB_OPENGL
420 DirectFB_GL_DestroyWindowContexts(_this, window);
425 SDL_ShapeData *data = window->shaper->driverdata;
426 SDL_DFB_CHECK(data->surface->ReleaseSource(data->surface));
427 SDL_DFB_RELEASE(data->surface);
429 SDL_DFB_FREE(window->shaper);
432 SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, NULL));
433 SDL_DFB_CHECK(windata->surface->ReleaseSource(windata->surface));
434 SDL_DFB_CHECK(windata->window_surface->ReleaseSource(windata->window_surface));
435 SDL_DFB_RELEASE(windata->icon);
436 SDL_DFB_RELEASE(windata->font);
437 SDL_DFB_RELEASE(windata->eventbuffer);
438 SDL_DFB_RELEASE(windata->surface);
439 SDL_DFB_RELEASE(windata->window_surface);
441 SDL_DFB_RELEASE(windata->dfbwin);
443 /* Remove from list ... */
445 p = devdata->firstwin->driverdata;
447 while (p && p->next != window)
448 p = (p->next ? p->next->driverdata : NULL);
450 p->next = windata->next;
452 devdata->firstwin = windata->next;
458 DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
459 struct SDL_SysWMinfo * info)
461 SDL_DFB_DEVICEDATA(_this);
462 SDL_DFB_WINDOWDATA(window);
464 if (info->version.major == SDL_MAJOR_VERSION &&
465 info->version.minor == SDL_MINOR_VERSION) {
466 info->subsystem = SDL_SYSWM_DIRECTFB;
467 info->info.dfb.dfb = devdata->dfb;
468 info->info.dfb.window = windata->dfbwin;
469 info->info.dfb.surface = windata->surface;
472 SDL_SetError("Application not compiled with SDL %d.%d\n",
473 SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
479 DirectFB_AdjustWindowSurface(SDL_Window * window)
481 SDL_DFB_WINDOWDATA(window);
482 int adjust = windata->wm_needs_redraw;
485 DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
487 SDL_DFB_CHECKERR(windata->
488 window_surface->GetSize(windata->window_surface, &cw,
490 if (cw != windata->size.w || ch != windata->size.h) {
495 #if SDL_DIRECTFB_OPENGL
496 DirectFB_GL_FreeWindowContexts(SDL_GetVideoDevice(), window);
499 #if (DFB_VERSION_ATLEAST(1,2,1))
500 SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
503 SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface,
508 DFBWindowOptions opts;
510 SDL_DFB_CHECKERR(windata->dfbwin->GetOptions(windata->dfbwin, &opts));
511 /* recreate subsurface */
512 SDL_DFB_RELEASE(windata->surface);
514 if (opts & DWOP_SCALE)
515 SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
518 SDL_DFB_CHECKERR(windata->window_surface->
519 GetSubSurface(windata->window_surface,
520 &windata->client, &windata->surface));
522 DirectFB_WM_RedrawLayout(SDL_GetVideoDevice(), window);
524 #if SDL_DIRECTFB_OPENGL
525 DirectFB_GL_ReAllocWindowContexts(SDL_GetVideoDevice(), window);
532 #endif /* SDL_VIDEO_DRIVER_DIRECTFB */