Make SDL_SetError and friends unconditionally return -1.
This lets us change things like this...
if (Failed) {
SDL_SetError("We failed");
return -1;
}
...into this...
if (Failed) {
return SDL_SetError("We failed");
}
Fixes Bugzilla #1778.
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2013 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_config.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);
241 SDL_FreeSurface(surface);
242 SDL_DFB_RELEASE(windata->icon);
247 DirectFB_SetWindowPosition(_THIS, SDL_Window * window)
249 SDL_DFB_WINDOWDATA(window);
255 DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
256 SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, x, y));
260 DirectFB_SetWindowSize(_THIS, SDL_Window * window)
262 SDL_DFB_WINDOWDATA(window);
264 if(SDL_IsShapedWindow(window))
265 DirectFB_ResizeWindowShape(window);
267 if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
271 /* Make sure all events are disabled for this operation ! */
272 SDL_DFB_CHECKERR(windata->dfbwin->DisableEvents(windata->dfbwin,
274 SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize(_this, window, &cw, &ch));
276 if (cw != window->w || ch != window->h) {
278 DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
279 SDL_DFB_CHECKERR(windata->dfbwin->Resize(windata->dfbwin,
284 SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
285 (_this, window, &window->w, &window->h));
286 DirectFB_AdjustWindowSurface(window);
288 SDL_DFB_CHECKERR(windata->dfbwin->EnableEvents(windata->dfbwin,
294 SDL_DFB_CHECK(windata->dfbwin->EnableEvents(windata->dfbwin, DWET_ALL));
299 DirectFB_ShowWindow(_THIS, SDL_Window * window)
301 SDL_DFB_WINDOWDATA(window);
303 SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, windata->opacity));
308 DirectFB_HideWindow(_THIS, SDL_Window * window)
310 SDL_DFB_WINDOWDATA(window);
312 SDL_DFB_CHECK(windata->dfbwin->GetOpacity(windata->dfbwin, &windata->opacity));
313 SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0));
317 DirectFB_RaiseWindow(_THIS, SDL_Window * window)
319 SDL_DFB_WINDOWDATA(window);
321 SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
322 SDL_DFB_CHECK(windata->dfbwin->RequestFocus(windata->dfbwin));
326 DirectFB_MaximizeWindow(_THIS, SDL_Window * window)
328 SDL_DFB_WINDOWDATA(window);
329 SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
330 DFBWindowOptions wopts;
332 SDL_DFB_CHECK(windata->dfbwin->GetPosition(windata->dfbwin,
333 &windata->restore.x, &windata->restore.y));
334 SDL_DFB_CHECK(windata->dfbwin->GetSize(windata->dfbwin, &windata->restore.w,
335 &windata->restore.h));
337 DirectFB_WM_AdjustWindowLayout(window, window->flags | SDL_WINDOW_MAXIMIZED, display->current_mode.w, display->current_mode.h) ;
339 SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, 0, 0));
340 SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin,
341 display->current_mode.w, display->current_mode.h));
344 SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
345 wopts |= DWOP_KEEP_SIZE | DWOP_KEEP_POSITION;
346 SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
350 DirectFB_MinimizeWindow(_THIS, SDL_Window * window)
352 /* FIXME: Size to 32x32 ? */
358 DirectFB_RestoreWindow(_THIS, SDL_Window * window)
360 SDL_DFB_WINDOWDATA(window);
361 DFBWindowOptions wopts;
364 SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
365 wopts &= ~(DWOP_KEEP_SIZE | DWOP_KEEP_POSITION);
366 SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
369 DirectFB_WM_AdjustWindowLayout(window, window->flags & ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED),
370 windata->restore.w, windata->restore.h);
371 SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin, windata->restore.w,
372 windata->restore.h));
373 SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, windata->restore.x,
374 windata->restore.y));
376 if (!(window->flags & SDL_WINDOW_RESIZABLE))
377 wopts |= DWOP_KEEP_SIZE;
379 if (window->flags & SDL_WINDOW_FULLSCREEN)
380 wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_SIZE;
381 SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
387 DirectFB_SetWindowGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
389 SDL_DFB_DEVICEDATA(_this);
390 SDL_DFB_WINDOWDATA(window);
391 DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL);
393 if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) {
394 if (gwindata != NULL)
396 SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin));
397 SDL_DFB_CHECK(gwindata->dfbwin->UngrabKeyboard(gwindata->dfbwin));
399 SDL_DFB_CHECK(windata->dfbwin->GrabPointer(windata->dfbwin));
400 SDL_DFB_CHECK(windata->dfbwin->GrabKeyboard(windata->dfbwin));
401 devdata->grabbed_window = window;
403 SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
404 SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
405 devdata->grabbed_window = NULL;
410 DirectFB_DestroyWindow(_THIS, SDL_Window * window)
412 SDL_DFB_DEVICEDATA(_this);
413 SDL_DFB_WINDOWDATA(window);
417 SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
418 SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
420 #if SDL_DIRECTFB_OPENGL
421 DirectFB_GL_DestroyWindowContexts(_this, window);
426 SDL_ShapeData *data = window->shaper->driverdata;
427 SDL_DFB_CHECK(data->surface->ReleaseSource(data->surface));
428 SDL_DFB_RELEASE(data->surface);
430 SDL_DFB_FREE(window->shaper);
433 SDL_DFB_CHECK(windata->window_surface->SetFont(windata->window_surface, NULL));
434 SDL_DFB_CHECK(windata->surface->ReleaseSource(windata->surface));
435 SDL_DFB_CHECK(windata->window_surface->ReleaseSource(windata->window_surface));
436 SDL_DFB_RELEASE(windata->icon);
437 SDL_DFB_RELEASE(windata->font);
438 SDL_DFB_RELEASE(windata->eventbuffer);
439 SDL_DFB_RELEASE(windata->surface);
440 SDL_DFB_RELEASE(windata->window_surface);
442 SDL_DFB_RELEASE(windata->dfbwin);
444 /* Remove from list ... */
446 p = devdata->firstwin->driverdata;
448 while (p && p->next != window)
449 p = (p->next ? p->next->driverdata : NULL);
451 p->next = windata->next;
453 devdata->firstwin = windata->next;
459 DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
460 struct SDL_SysWMinfo * info)
462 SDL_DFB_DEVICEDATA(_this);
463 SDL_DFB_WINDOWDATA(window);
465 if (info->version.major == SDL_MAJOR_VERSION &&
466 info->version.minor == SDL_MINOR_VERSION) {
467 info->subsystem = SDL_SYSWM_DIRECTFB;
468 info->info.dfb.dfb = devdata->dfb;
469 info->info.dfb.window = windata->dfbwin;
470 info->info.dfb.surface = windata->surface;
473 SDL_SetError("Application not compiled with SDL %d.%d\n",
474 SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
480 DirectFB_AdjustWindowSurface(SDL_Window * window)
482 SDL_DFB_WINDOWDATA(window);
483 int adjust = windata->wm_needs_redraw;
486 DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
488 SDL_DFB_CHECKERR(windata->
489 window_surface->GetSize(windata->window_surface, &cw,
491 if (cw != windata->size.w || ch != windata->size.h) {
496 #if SDL_DIRECTFB_OPENGL
497 DirectFB_GL_FreeWindowContexts(SDL_GetVideoDevice(), window);
500 #if (DFB_VERSION_ATLEAST(1,2,1))
501 SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
504 SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface,
509 DFBWindowOptions opts;
511 SDL_DFB_CHECKERR(windata->dfbwin->GetOptions(windata->dfbwin, &opts));
512 /* recreate subsurface */
513 SDL_DFB_RELEASE(windata->surface);
515 if (opts & DWOP_SCALE)
516 SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
519 SDL_DFB_CHECKERR(windata->window_surface->
520 GetSubSurface(windata->window_surface,
521 &windata->client, &windata->surface));
523 DirectFB_WM_RedrawLayout(SDL_GetVideoDevice(), window);
525 #if SDL_DIRECTFB_OPENGL
526 DirectFB_GL_ReAllocWindowContexts(SDL_GetVideoDevice(), window);
533 #endif /* SDL_VIDEO_DRIVER_DIRECTFB */