2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997-2010 Sam Lantinga
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "SDL_config.h"
24 #include "SDL_syswm.h"
25 #include "../SDL_sysvideo.h"
26 #include "../../events/SDL_keyboard_c.h"
28 #include "SDL_DirectFB_video.h"
32 DirectFB_CreateWindow(_THIS, SDL_Window * window)
34 SDL_DFB_DEVICEDATA(_this);
35 SDL_DFB_DISPLAYDATA(_this, window);
36 DFB_WindowData *windata = NULL;
37 DFBWindowOptions wopts;
38 DFBWindowDescription desc;
42 SDL_DFB_CALLOC(window->driverdata, 1, sizeof(DFB_WindowData));
43 windata = (DFB_WindowData *) window->driverdata;
45 windata->is_managed = devdata->has_own_wm;
47 SDL_DFB_CHECKERR(devdata->dfb->SetCooperativeLevel(devdata->dfb,
49 SDL_DFB_CHECKERR(dispdata->layer->SetCooperativeLevel(dispdata->layer,
50 DLSCL_ADMINISTRATIVE));
52 /* Fill the window description. */
53 if (window->x == SDL_WINDOWPOS_CENTERED) {
54 x = (dispdata->cw - window->w) / 2;
55 } else if (window->x == SDL_WINDOWPOS_UNDEFINED) {
60 if (window->y == SDL_WINDOWPOS_CENTERED) {
61 y = (dispdata->ch - window->h) / 2;
62 } else if (window->y == SDL_WINDOWPOS_UNDEFINED) {
67 if (window->flags & SDL_WINDOW_FULLSCREEN) {
72 DirectFB_WM_AdjustWindowLayout(window);
76 DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_PIXELFORMAT | DWDESC_POSX
77 | DWDESC_POSY | DWDESC_SURFACE_CAPS;
80 desc.width = windata->size.w;
81 desc.height = windata->size.h;
82 desc.pixelformat = dispdata->pixelformat;
83 desc.surface_caps = DSCAPS_PREMULTIPLIED;
85 /* Create the window. */
86 SDL_DFB_CHECKERR(dispdata->layer->CreateWindow(dispdata->layer, &desc,
90 windata->window->GetOptions(windata->window, &wopts);
92 if (window->flags & SDL_WINDOW_RESIZABLE)
95 wopts |= DWOP_KEEP_SIZE;
97 if (window->flags & SDL_WINDOW_FULLSCREEN) {
98 wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE;
99 windata->window->SetStackingClass(windata->window, DWSC_UPPER);
101 windata->window->SetOptions(windata->window, wopts);
103 /* See what we got */
104 SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
105 (_this, window, &window->w, &window->h));
107 /* Get the window's surface. */
108 SDL_DFB_CHECKERR(windata->window->GetSurface(windata->window,
109 &windata->window_surface));
110 /* And get a subsurface for rendering */
111 SDL_DFB_CHECKERR(windata->window_surface->
112 GetSubSurface(windata->window_surface, &windata->client,
115 windata->window->SetOpacity(windata->window, 0xFF);
117 /* Create Eventbuffer */
118 SDL_DFB_CHECKERR(windata->window->CreateEventBuffer(windata->window,
121 SDL_DFB_CHECKERR(windata->window->
122 EnableEvents(windata->window, DWET_ALL));
125 /* FIXME: once during Video_Init */
126 if (windata->is_managed) {
127 DFBFontDescription fdesc;
129 fdesc.flags = DFDESC_HEIGHT;
130 fdesc.height = windata->theme.font_size;
132 SDL_DFB_CHECK(devdata->
133 dfb->CreateFont(devdata->dfb, windata->theme.font,
135 windata->window_surface->SetFont(windata->window_surface, font);
136 SDL_DFB_RELEASE(font);
139 /* Make it the top most window. */
140 windata->window->RaiseToTop(windata->window);
142 /* remember parent */
143 windata->sdl_window = window;
145 /* Add to list ... */
147 windata->next = devdata->firstwin;
148 windata->opacity = 0xFF;
149 devdata->firstwin = windata;
152 DirectFB_WM_RedrawLayout(window);
156 SDL_DFB_RELEASE(windata->window);
157 SDL_DFB_RELEASE(windata->surface);
162 DirectFB_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
169 DirectFB_SetWindowTitle(_THIS, SDL_Window * window)
171 SDL_DFB_WINDOWDATA(window);
173 if (windata->is_managed) {
174 windata->wm_needs_redraw = 1;
180 DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
182 SDL_DFB_DEVICEDATA(_this);
183 SDL_DFB_WINDOWDATA(window);
184 SDL_Surface *surface = NULL;
188 SDL_PixelFormat format;
189 DFBSurfaceDescription dsc;
194 /* Convert the icon to ARGB for modern window managers */
195 SDL_InitFormat(&format, 32, 0x00FF0000, 0x0000FF00, 0x000000FF,
197 surface = SDL_ConvertSurface(icon, &format, 0);
202 DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
203 dsc.caps = DSCAPS_VIDEOONLY;
204 dsc.width = surface->w;
205 dsc.height = surface->h;
206 dsc.pixelformat = DSPF_ARGB;
208 SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc,
211 SDL_DFB_CHECKERR(windata->icon->Lock(windata->icon, DSLF_WRITE,
212 (void *) &dest, &pitch));
215 for (i = 0; i < surface->h; i++)
216 memcpy((char *) dest + i * pitch,
217 (char *) p + i * surface->pitch, 4 * surface->w);
219 windata->icon->Unlock(windata->icon);
220 SDL_FreeSurface(surface);
222 SDL_DFB_RELEASE(windata->icon);
227 SDL_FreeSurface(surface);
228 SDL_DFB_RELEASE(windata->icon);
233 DirectFB_SetWindowPosition(_THIS, SDL_Window * window)
235 SDL_DFB_WINDOWDATA(window);
238 if (window->y == SDL_WINDOWPOS_UNDEFINED)
243 if (window->x == SDL_WINDOWPOS_UNDEFINED)
248 if (window->flags & SDL_WINDOW_FULLSCREEN) {
252 DirectFB_WM_AdjustWindowLayout(window);
253 windata->window->MoveTo(windata->window, x, y);
257 DirectFB_SetWindowSize(_THIS, SDL_Window * window)
259 SDL_DFB_DEVICEDATA(_this);
260 SDL_DFB_WINDOWDATA(window);
263 if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
267 /* Make sure all events are disabled for this operation ! */
268 SDL_DFB_CHECKERR(windata->window->DisableEvents(windata->window,
271 SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize(_this, window, &cw, &ch));
273 if (cw != window->w || ch != window->h) {
275 DirectFB_WM_AdjustWindowLayout(window);
276 SDL_DFB_CHECKERR(windata->window->Resize(windata->window,
281 SDL_DFB_CHECKERR(windata->window->EnableEvents(windata->window,
284 SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
285 (_this, window, &window->w, &window->h));
287 SDL_OnWindowResized(window);
291 windata->window->EnableEvents(windata->window, DWET_ALL);
296 DirectFB_ShowWindow(_THIS, SDL_Window * window)
298 SDL_DFB_WINDOWDATA(window);
300 windata->window->SetOpacity(windata->window, windata->opacity);
305 DirectFB_HideWindow(_THIS, SDL_Window * window)
307 SDL_DFB_WINDOWDATA(window);
309 windata->window->GetOpacity(windata->window, &windata->opacity);
310 windata->window->SetOpacity(windata->window, 0);
314 DirectFB_RaiseWindow(_THIS, SDL_Window * window)
316 SDL_DFB_WINDOWDATA(window);
318 windata->window->RaiseToTop(windata->window);
319 windata->window->RequestFocus(windata->window);
323 DirectFB_MaximizeWindow(_THIS, SDL_Window * window)
325 SDL_DFB_WINDOWDATA(window);
327 if (windata->is_managed) {
328 DirectFB_WM_MaximizeWindow(_this, window);
334 DirectFB_MinimizeWindow(_THIS, SDL_Window * window)
336 /* FIXME: Size to 32x32 ? */
342 DirectFB_RestoreWindow(_THIS, SDL_Window * window)
344 SDL_DFB_WINDOWDATA(window);
346 if (windata->is_managed) {
347 DirectFB_WM_RestoreWindow(_this, window);
353 DirectFB_SetWindowGrab(_THIS, SDL_Window * window)
355 SDL_DFB_WINDOWDATA(window);
357 if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) {
358 windata->window->GrabPointer(windata->window);
359 windata->window->GrabKeyboard(windata->window);
361 windata->window->UngrabPointer(windata->window);
362 windata->window->UngrabKeyboard(windata->window);
367 DirectFB_DestroyWindow(_THIS, SDL_Window * window)
369 SDL_DFB_DEVICEDATA(_this);
370 SDL_DFB_WINDOWDATA(window);
373 SDL_DFB_DEBUG("Trace\n");
376 windata->window->UngrabPointer(windata->window);
377 windata->window->UngrabKeyboard(windata->window);
379 windata->window_surface->SetFont(windata->window_surface, NULL);
380 SDL_DFB_RELEASE(windata->icon);
381 SDL_DFB_RELEASE(windata->eventbuffer);
382 SDL_DFB_RELEASE(windata->surface);
383 SDL_DFB_RELEASE(windata->window_surface);
385 SDL_DFB_RELEASE(windata->window);
387 /* Remove from list ... */
389 p = devdata->firstwin;
390 while (p && p->next != windata)
393 p->next = windata->next;
395 devdata->firstwin = windata->next;
401 DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
402 struct SDL_SysWMinfo * info)
409 DirectFB_AdjustWindowSurface(SDL_Window * window)
411 SDL_DFB_WINDOWDATA(window);
412 int adjust = windata->wm_needs_redraw;
416 DirectFB_WM_AdjustWindowLayout(window);
418 SDL_DFB_CHECKERR(windata->
419 window_surface->GetSize(windata->window_surface, &cw,
421 if (cw != windata->size.w || ch != windata->size.h) {
426 #if DFB_VERSION_ATLEAST(1,2,1)
427 SDL_DFB_CHECKERR(windata->window->ResizeSurface(windata->window,
430 SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface,
435 DFBWindowOptions opts;
437 SDL_DFB_CHECKERR(windata->window->GetOptions(windata->window, &opts));
438 /* recreate subsurface */
439 SDL_DFB_RELEASE(windata->surface);
441 if (opts & DWOP_SCALE)
442 SDL_DFB_CHECKERR(windata->window->ResizeSurface(windata->window,
445 SDL_DFB_CHECKERR(windata->window_surface->
446 GetSubSurface(windata->window_surface,
447 &windata->client, &windata->surface));
449 DirectFB_WM_RedrawLayout(window);