Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
544 lines (440 loc) · 16.5 KB

SDL_DirectFB_window.c

File metadata and controls

544 lines (440 loc) · 16.5 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Feb 12, 2011
Feb 12, 2011
3
Copyright (C) 1997-2011 Sam Lantinga
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
Feb 6, 2011
Feb 6, 2011
22
23
24
SDL1.3 DirectFB driver by couriersud@arcor.de
*/
25
26
#include "SDL_DirectFB_video.h"
Feb 6, 2011
Feb 6, 2011
27
28
29
30
#include "SDL_DirectFB_modes.h"
#include "SDL_DirectFB_window.h"
#include "SDL_DirectFB_shape.h"
Aug 16, 2010
Aug 16, 2010
31
32
33
#if SDL_DIRECTFB_OPENGL
#include "SDL_DirectFB_opengl.h"
#endif
34
Feb 6, 2011
Feb 6, 2011
35
36
37
#include "SDL_syswm.h"
#include "../SDL_pixels_c.h"
Jan 11, 2009
Jan 11, 2009
38
39
40
41
42
int
DirectFB_CreateWindow(_THIS, SDL_Window * window)
{
SDL_DFB_DEVICEDATA(_this);
Feb 6, 2011
Feb 6, 2011
43
SDL_DFB_DISPLAYDATA(window);
Jan 11, 2009
Jan 11, 2009
44
DFB_WindowData *windata = NULL;
45
46
DFBWindowOptions wopts;
DFBWindowDescription desc;
Aug 16, 2010
Aug 16, 2010
47
int x, y;
Feb 6, 2011
Feb 6, 2011
48
int bshaped = 0;
49
Feb 6, 2011
Feb 6, 2011
50
SDL_DFB_ALLOC_CLEAR(window->driverdata, sizeof(DFB_WindowData));
51
52
windata = (DFB_WindowData *) window->driverdata;
Jan 11, 2009
Jan 11, 2009
53
windata->is_managed = devdata->has_own_wm;
Feb 6, 2011
Feb 6, 2011
54
#if 1
Jan 11, 2009
Jan 11, 2009
55
56
57
58
SDL_DFB_CHECKERR(devdata->dfb->SetCooperativeLevel(devdata->dfb,
DFSCL_NORMAL));
SDL_DFB_CHECKERR(dispdata->layer->SetCooperativeLevel(dispdata->layer,
DLSCL_ADMINISTRATIVE));
Feb 6, 2011
Feb 6, 2011
59
60
61
62
63
#endif
/* FIXME ... ughh, ugly */
if (window->x == -1000 && window->y == -1000)
bshaped = 1;
64
/* Fill the window description. */
Feb 10, 2011
Feb 10, 2011
65
if (SDL_WINDOWPOS_ISCENTERED(window->x)) {
66
x = (dispdata->cw - window->w) / 2;
Feb 10, 2011
Feb 10, 2011
67
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->x)) {
68
69
70
71
x = 0;
} else {
x = window->x;
}
Feb 6, 2011
Feb 6, 2011
72
Feb 10, 2011
Feb 10, 2011
73
if (SDL_WINDOWPOS_ISCENTERED(window->y)) {
74
y = (dispdata->ch - window->h) / 2;
Feb 10, 2011
Feb 10, 2011
75
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->y)) {
76
77
78
79
y = 0;
} else {
y = window->y;
}
Feb 6, 2011
Feb 6, 2011
80
81
82
83
84
85
if (window->flags & SDL_WINDOW_FULLSCREEN) {
x = 0;
y = 0;
}
Aug 16, 2010
Aug 16, 2010
86
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
87
Jan 11, 2009
Jan 11, 2009
88
/* Create Window */
Feb 6, 2011
Feb 6, 2011
89
desc.caps = 0;
Jan 11, 2009
Jan 11, 2009
90
desc.flags =
Feb 6, 2011
Feb 6, 2011
91
92
93
94
95
96
97
98
99
100
101
102
103
104
DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_POSX | DWDESC_POSY | DWDESC_SURFACE_CAPS;
if (bshaped) {
desc.flags |= DWDESC_CAPS;
desc.caps |= DWCAPS_ALPHACHANNEL;
}
else
{
desc.flags |= DWDESC_PIXELFORMAT;
}
if (!(window->flags & SDL_WINDOW_BORDERLESS))
desc.caps |= DWCAPS_NODECORATION;
105
106
desc.posx = x;
desc.posy = y;
Jan 11, 2009
Jan 11, 2009
107
108
desc.width = windata->size.w;
desc.height = windata->size.h;
109
110
desc.pixelformat = dispdata->pixelformat;
desc.surface_caps = DSCAPS_PREMULTIPLIED;
Feb 6, 2011
Feb 6, 2011
111
112
/* Create the window. */
Jan 11, 2009
Jan 11, 2009
113
SDL_DFB_CHECKERR(dispdata->layer->CreateWindow(dispdata->layer, &desc,
Feb 6, 2011
Feb 6, 2011
114
&windata->dfbwin));
115
Jan 11, 2009
Jan 11, 2009
116
/* Set Options */
Feb 6, 2011
Feb 6, 2011
117
SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
118
Feb 6, 2011
Feb 6, 2011
119
120
121
122
123
124
/* explicit rescaling of surface */
wopts |= DWOP_SCALE;
if (window->flags & SDL_WINDOW_RESIZABLE) {
wopts &= ~DWOP_KEEP_SIZE;
}
else {
125
wopts |= DWOP_KEEP_SIZE;
Feb 6, 2011
Feb 6, 2011
126
}
127
Jan 11, 2009
Jan 11, 2009
128
if (window->flags & SDL_WINDOW_FULLSCREEN) {
129
wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE;
Feb 6, 2011
Feb 6, 2011
130
131
132
133
134
135
SDL_DFB_CHECK(windata->dfbwin->SetStackingClass(windata->dfbwin, DWSC_UPPER));
}
if (bshaped) {
wopts |= DWOP_SHAPED | DWOP_ALPHACHANNEL;
wopts &= ~DWOP_OPAQUE_REGION;
Jan 11, 2009
Jan 11, 2009
136
}
Feb 6, 2011
Feb 6, 2011
137
138
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
Jan 11, 2009
Jan 11, 2009
139
140
/* See what we got */
Feb 6, 2011
Feb 6, 2011
141
SDL_DFB_CHECK(DirectFB_WM_GetClientSize
Jan 14, 2009
Jan 14, 2009
142
(_this, window, &window->w, &window->h));
Jan 11, 2009
Jan 11, 2009
143
144
/* Get the window's surface. */
Feb 6, 2011
Feb 6, 2011
145
SDL_DFB_CHECKERR(windata->dfbwin->GetSurface(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
146
&windata->window_surface));
Feb 6, 2011
Feb 6, 2011
147
Jan 11, 2009
Jan 11, 2009
148
149
150
151
152
/* And get a subsurface for rendering */
SDL_DFB_CHECKERR(windata->window_surface->
GetSubSurface(windata->window_surface, &windata->client,
&windata->surface));
Feb 6, 2011
Feb 6, 2011
153
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0xFF));
154
Jan 11, 2009
Jan 11, 2009
155
/* Create Eventbuffer */
Feb 6, 2011
Feb 6, 2011
156
157
SDL_DFB_CHECKERR(windata->dfbwin->CreateEventBuffer(windata->dfbwin,
Jan 14, 2009
Jan 14, 2009
158
159
&windata->
eventbuffer));
Feb 6, 2011
Feb 6, 2011
160
161
SDL_DFB_CHECKERR(windata->dfbwin->
EnableEvents(windata->dfbwin, DWET_ALL));
Jan 11, 2009
Jan 11, 2009
162
163
164
/* Create a font */
/* FIXME: once during Video_Init */
Aug 16, 2010
Aug 16, 2010
165
windata->font = NULL;
Jan 11, 2009
Jan 11, 2009
166
167
/* Make it the top most window. */
Feb 6, 2011
Feb 6, 2011
168
SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
169
170
/* remember parent */
Feb 6, 2011
Feb 6, 2011
171
//windata->sdlwin = window;
172
173
174
175
176
/* Add to list ... */
windata->next = devdata->firstwin;
windata->opacity = 0xFF;
Feb 6, 2011
Feb 6, 2011
177
devdata->firstwin = window;
178
Jan 11, 2009
Jan 11, 2009
179
/* Draw Frame */
Aug 16, 2010
Aug 16, 2010
180
DirectFB_WM_RedrawLayout(_this, window);
Jan 11, 2009
Jan 11, 2009
181
182
183
return 0;
error:
Feb 6, 2011
Feb 6, 2011
184
185
SDL_DFB_RELEASE(windata->surface);
SDL_DFB_RELEASE(windata->dfbwin);
186
187
188
189
190
191
192
193
194
195
196
197
198
return -1;
}
int
DirectFB_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
{
SDL_Unsupported();
return -1;
}
void
DirectFB_SetWindowTitle(_THIS, SDL_Window * window)
{
Jan 11, 2009
Jan 11, 2009
199
200
201
202
SDL_DFB_WINDOWDATA(window);
if (windata->is_managed) {
windata->wm_needs_redraw = 1;
Aug 16, 2010
Aug 16, 2010
203
DirectFB_WM_RedrawLayout(_this, window);
Jan 11, 2009
Jan 11, 2009
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
} else
SDL_Unsupported();
}
void
DirectFB_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
{
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window);
SDL_Surface *surface = NULL;
if (icon) {
SDL_PixelFormat format;
DFBSurfaceDescription dsc;
Uint32 *dest;
Uint32 *p;
int pitch, i;
/* Convert the icon to ARGB for modern window managers */
Feb 13, 2011
Feb 13, 2011
223
SDL_InitFormat(&format, SDL_PIXELFORMAT_ARGB8888);
Jan 11, 2009
Jan 11, 2009
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
surface = SDL_ConvertSurface(icon, &format, 0);
if (!surface) {
return;
}
dsc.flags =
DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_CAPS;
dsc.caps = DSCAPS_VIDEOONLY;
dsc.width = surface->w;
dsc.height = surface->h;
dsc.pixelformat = DSPF_ARGB;
SDL_DFB_CHECKERR(devdata->dfb->CreateSurface(devdata->dfb, &dsc,
&windata->icon));
SDL_DFB_CHECKERR(windata->icon->Lock(windata->icon, DSLF_WRITE,
(void *) &dest, &pitch));
p = surface->pixels;
for (i = 0; i < surface->h; i++)
memcpy((char *) dest + i * pitch,
(char *) p + i * surface->pitch, 4 * surface->w);
Aug 16, 2010
Aug 16, 2010
246
SDL_DFB_CHECK(windata->icon->Unlock(windata->icon));
Jan 11, 2009
Jan 11, 2009
247
248
249
250
251
252
253
254
255
256
SDL_FreeSurface(surface);
} else {
SDL_DFB_RELEASE(windata->icon);
}
return;
error:
if (surface)
SDL_FreeSurface(surface);
SDL_DFB_RELEASE(windata->icon);
return;
257
258
259
260
261
262
263
264
}
void
DirectFB_SetWindowPosition(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
int x, y;
Mar 12, 2011
Mar 12, 2011
265
266
x = window->x;
y = window->y;
267
Aug 16, 2010
Aug 16, 2010
268
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
Feb 6, 2011
Feb 6, 2011
269
SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, x, y));
270
271
272
273
274
275
276
}
void
DirectFB_SetWindowSize(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
277
278
279
if(SDL_IsShapedWindow(window))
DirectFB_ResizeWindowShape(window);
280
281
282
283
284
if (!(window->flags & SDL_WINDOW_FULLSCREEN)) {
int cw;
int ch;
/* Make sure all events are disabled for this operation ! */
Feb 6, 2011
Feb 6, 2011
285
SDL_DFB_CHECKERR(windata->dfbwin->DisableEvents(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
286
287
288
289
290
DWET_ALL));
SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize(_this, window, &cw, &ch));
if (cw != window->w || ch != window->h) {
Aug 16, 2010
Aug 16, 2010
291
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
Feb 6, 2011
Feb 6, 2011
292
SDL_DFB_CHECKERR(windata->dfbwin->Resize(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
293
294
295
296
windata->size.w,
windata->size.h));
}
Aug 16, 2010
Aug 16, 2010
297
298
SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
(_this, window, &window->w, &window->h));
Feb 6, 2011
Feb 6, 2011
299
DirectFB_AdjustWindowSurface(window);
Aug 16, 2010
Aug 16, 2010
300
Feb 6, 2011
Feb 6, 2011
301
SDL_DFB_CHECKERR(windata->dfbwin->EnableEvents(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
302
303
DWET_ALL));
304
305
306
}
return;
error:
Feb 6, 2011
Feb 6, 2011
307
SDL_DFB_CHECK(windata->dfbwin->EnableEvents(windata->dfbwin, DWET_ALL));
308
309
310
311
312
313
314
315
return;
}
void
DirectFB_ShowWindow(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
316
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, windata->opacity));
317
318
319
320
321
322
323
324
}
void
DirectFB_HideWindow(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
325
326
SDL_DFB_CHECK(windata->dfbwin->GetOpacity(windata->dfbwin, &windata->opacity));
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0));
327
328
329
330
331
332
333
}
void
DirectFB_RaiseWindow(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
334
335
SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
SDL_DFB_CHECK(windata->dfbwin->RequestFocus(windata->dfbwin));
336
337
338
339
340
}
void
DirectFB_MaximizeWindow(_THIS, SDL_Window * window)
{
Jan 11, 2009
Jan 11, 2009
341
SDL_DFB_WINDOWDATA(window);
Feb 10, 2011
Feb 10, 2011
342
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
Feb 6, 2011
Feb 6, 2011
343
DFBWindowOptions wopts;
344
Feb 6, 2011
Feb 6, 2011
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
SDL_DFB_CHECK(windata->dfbwin->GetPosition(windata->dfbwin,
&windata->restore.x, &windata->restore.y));
SDL_DFB_CHECK(windata->dfbwin->GetSize(windata->dfbwin, &windata->restore.w,
&windata->restore.h));
DirectFB_WM_AdjustWindowLayout(window, window->flags | SDL_WINDOW_MAXIMIZED, display->current_mode.w, display->current_mode.h) ;
SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, 0, 0));
SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin,
display->current_mode.w, display->current_mode.h));
/* Set Options */
SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
wopts |= DWOP_KEEP_SIZE | DWOP_KEEP_POSITION;
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
360
361
362
363
364
365
366
367
368
369
370
371
372
}
void
DirectFB_MinimizeWindow(_THIS, SDL_Window * window)
{
/* FIXME: Size to 32x32 ? */
SDL_Unsupported();
}
void
DirectFB_RestoreWindow(_THIS, SDL_Window * window)
{
Jan 11, 2009
Jan 11, 2009
373
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
DFBWindowOptions wopts;
/* Set Options */
SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
wopts &= ~(DWOP_KEEP_SIZE | DWOP_KEEP_POSITION);
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
/* Window layout */
DirectFB_WM_AdjustWindowLayout(window, window->flags & ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED),
windata->restore.w, windata->restore.h);
SDL_DFB_CHECK(windata->dfbwin->Resize(windata->dfbwin, windata->restore.w,
windata->restore.h));
SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, windata->restore.x,
windata->restore.y));
if (!(window->flags & SDL_WINDOW_RESIZABLE))
wopts |= DWOP_KEEP_SIZE;
if (window->flags & SDL_WINDOW_FULLSCREEN)
wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_SIZE;
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
Jan 11, 2009
Jan 11, 2009
396
397
398
399
400
401
}
void
DirectFB_SetWindowGrab(_THIS, SDL_Window * window)
{
Aug 16, 2010
Aug 16, 2010
402
SDL_DFB_DEVICEDATA(_this);
403
SDL_DFB_WINDOWDATA(window);
Aug 16, 2010
Aug 16, 2010
404
DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL);
405
Jan 11, 2009
Jan 11, 2009
406
if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) {
Aug 16, 2010
Aug 16, 2010
407
408
if (gwindata != NULL)
{
Feb 6, 2011
Feb 6, 2011
409
410
SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin));
SDL_DFB_CHECK(gwindata->dfbwin->UngrabKeyboard(gwindata->dfbwin));
Aug 16, 2010
Aug 16, 2010
411
}
Feb 6, 2011
Feb 6, 2011
412
413
SDL_DFB_CHECK(windata->dfbwin->GrabPointer(windata->dfbwin));
SDL_DFB_CHECK(windata->dfbwin->GrabKeyboard(windata->dfbwin));
Aug 16, 2010
Aug 16, 2010
414
devdata->grabbed_window = window;
415
} else {
Feb 6, 2011
Feb 6, 2011
416
417
SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
Aug 16, 2010
Aug 16, 2010
418
devdata->grabbed_window = NULL;
419
420
421
422
423
424
425
426
427
428
}
}
void
DirectFB_DestroyWindow(_THIS, SDL_Window * window)
{
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window);
DFB_WindowData *p;
Jan 11, 2009
Jan 11, 2009
429
/* Some cleanups */
Feb 6, 2011
Feb 6, 2011
430
431
SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
Jan 11, 2009
Jan 11, 2009
432
Aug 16, 2010
Aug 16, 2010
433
434
435
436
#if SDL_DIRECTFB_OPENGL
DirectFB_GL_DestroyWindowContexts(_this, window);
#endif
Feb 6, 2011
Feb 6, 2011
437
438
439
440
441
442
443
444
445
if (window->shaper)
{
SDL_ShapeData *data = window->shaper->driverdata;
SDL_DFB_CHECK(data->surface->ReleaseSource(data->surface));
SDL_DFB_RELEASE(data->surface);
SDL_DFB_FREE(data);
SDL_DFB_FREE(window->shaper);
}
Aug 16, 2010
Aug 16, 2010
446
447
448
449
450
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);
451
452
SDL_DFB_RELEASE(windata->eventbuffer);
SDL_DFB_RELEASE(windata->surface);
Jan 11, 2009
Jan 11, 2009
453
454
SDL_DFB_RELEASE(windata->window_surface);
Feb 6, 2011
Feb 6, 2011
455
SDL_DFB_RELEASE(windata->dfbwin);
456
457
458
/* Remove from list ... */
Feb 6, 2011
Feb 6, 2011
459
460
461
462
p = devdata->firstwin->driverdata;
while (p && p->next != window)
p = (p->next ? p->next->driverdata : NULL);
463
464
465
466
467
468
469
470
471
472
473
474
if (p)
p->next = windata->next;
else
devdata->firstwin = windata->next;
SDL_free(windata);
return;
}
SDL_bool
DirectFB_GetWindowWMInfo(_THIS, SDL_Window * window,
struct SDL_SysWMinfo * info)
{
Feb 6, 2011
Feb 6, 2011
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window);
if (info->version.major == SDL_MAJOR_VERSION &&
info->version.minor == SDL_MINOR_VERSION) {
info->subsystem = SDL_SYSWM_DIRECTFB;
info->info.dfb.dfb = devdata->dfb;
info->info.dfb.window = windata->dfbwin;
info->info.dfb.surface = windata->surface;
return SDL_TRUE;
} else {
SDL_SetError("Application not compiled with SDL %d.%d\n",
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
return SDL_FALSE;
}
490
}
Jan 11, 2009
Jan 11, 2009
491
Feb 6, 2011
Feb 6, 2011
492
493
void
DirectFB_AdjustWindowSurface(SDL_Window * window)
Jan 11, 2009
Jan 11, 2009
494
495
496
497
498
{
SDL_DFB_WINDOWDATA(window);
int adjust = windata->wm_needs_redraw;
int cw, ch;
Aug 16, 2010
Aug 16, 2010
499
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
Jan 11, 2009
Jan 11, 2009
500
501
502
503
504
505
506
507
508
SDL_DFB_CHECKERR(windata->
window_surface->GetSize(windata->window_surface, &cw,
&ch));
if (cw != windata->size.w || ch != windata->size.h) {
adjust = 1;
}
if (adjust) {
Aug 16, 2010
Aug 16, 2010
509
#if SDL_DIRECTFB_OPENGL
Feb 10, 2011
Feb 10, 2011
510
DirectFB_GL_FreeWindowContexts(SDL_GetVideoDevice(), window);
Aug 16, 2010
Aug 16, 2010
511
512
#endif
Feb 6, 2011
Feb 6, 2011
513
514
#if (DFB_VERSION_ATLEAST(1,2,1))
SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
515
516
windata->size.w,
windata->size.h));
Jan 14, 2009
Jan 14, 2009
517
SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface,
Jan 11, 2009
Jan 11, 2009
518
519
520
windata->
window_surface,
&windata->client));
Jan 13, 2009
Jan 13, 2009
521
#else
Jan 14, 2009
Jan 14, 2009
522
523
DFBWindowOptions opts;
Feb 6, 2011
Feb 6, 2011
524
SDL_DFB_CHECKERR(windata->dfbwin->GetOptions(windata->dfbwin, &opts));
Jan 14, 2009
Jan 14, 2009
525
526
527
528
/* recreate subsurface */
SDL_DFB_RELEASE(windata->surface);
if (opts & DWOP_SCALE)
Feb 6, 2011
Feb 6, 2011
529
SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
Jan 14, 2009
Jan 14, 2009
530
531
532
533
534
windata->size.w,
windata->size.h));
SDL_DFB_CHECKERR(windata->window_surface->
GetSubSurface(windata->window_surface,
&windata->client, &windata->surface));
Jan 13, 2009
Jan 13, 2009
535
#endif
Feb 10, 2011
Feb 10, 2011
536
DirectFB_WM_RedrawLayout(SDL_GetVideoDevice(), window);
Aug 16, 2010
Aug 16, 2010
537
538
#if SDL_DIRECTFB_OPENGL
Feb 10, 2011
Feb 10, 2011
539
DirectFB_GL_ReAllocWindowContexts(SDL_GetVideoDevice(), window);
Aug 16, 2010
Aug 16, 2010
540
541
#endif
}
Jan 11, 2009
Jan 11, 2009
542
543
544
error:
return;
}