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

Latest commit

 

History

History
522 lines (423 loc) · 16.1 KB

SDL_DirectFB_window.c

File metadata and controls

522 lines (423 loc) · 16.1 KB
 
1
/*
Apr 8, 2011
Apr 8, 2011
2
3
Simple DirectMedia Layer
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
4
Apr 8, 2011
Apr 8, 2011
5
6
7
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
8
Apr 8, 2011
Apr 8, 2011
9
10
11
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
12
Apr 8, 2011
Apr 8, 2011
13
14
15
16
17
18
19
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Feb 6, 2011
Feb 6, 2011
20
*/
21
22
#include "SDL_DirectFB_video.h"
Feb 6, 2011
Feb 6, 2011
23
24
25
26
#include "SDL_DirectFB_modes.h"
#include "SDL_DirectFB_window.h"
#include "SDL_DirectFB_shape.h"
Aug 16, 2010
Aug 16, 2010
27
28
29
#if SDL_DIRECTFB_OPENGL
#include "SDL_DirectFB_opengl.h"
#endif
30
Feb 6, 2011
Feb 6, 2011
31
32
33
#include "SDL_syswm.h"
#include "../SDL_pixels_c.h"
Jan 11, 2009
Jan 11, 2009
34
35
36
37
38
int
DirectFB_CreateWindow(_THIS, SDL_Window * window)
{
SDL_DFB_DEVICEDATA(_this);
Feb 6, 2011
Feb 6, 2011
39
SDL_DFB_DISPLAYDATA(window);
Jan 11, 2009
Jan 11, 2009
40
DFB_WindowData *windata = NULL;
41
42
DFBWindowOptions wopts;
DFBWindowDescription desc;
Aug 16, 2010
Aug 16, 2010
43
int x, y;
Feb 6, 2011
Feb 6, 2011
44
int bshaped = 0;
45
Feb 6, 2011
Feb 6, 2011
46
SDL_DFB_ALLOC_CLEAR(window->driverdata, sizeof(DFB_WindowData));
47
48
windata = (DFB_WindowData *) window->driverdata;
Jan 11, 2009
Jan 11, 2009
49
windata->is_managed = devdata->has_own_wm;
Feb 6, 2011
Feb 6, 2011
50
#if 1
Jan 11, 2009
Jan 11, 2009
51
52
53
54
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
55
56
57
58
59
#endif
/* FIXME ... ughh, ugly */
if (window->x == -1000 && window->y == -1000)
bshaped = 1;
60
/* Fill the window description. */
Mar 16, 2011
Mar 16, 2011
61
62
x = window->x;
y = window->y;
63
Aug 16, 2010
Aug 16, 2010
64
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
65
Jan 11, 2009
Jan 11, 2009
66
/* Create Window */
Feb 6, 2011
Feb 6, 2011
67
desc.caps = 0;
Jan 11, 2009
Jan 11, 2009
68
desc.flags =
Feb 6, 2011
Feb 6, 2011
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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;
83
84
desc.posx = x;
desc.posy = y;
Jan 11, 2009
Jan 11, 2009
85
86
desc.width = windata->size.w;
desc.height = windata->size.h;
87
88
desc.pixelformat = dispdata->pixelformat;
desc.surface_caps = DSCAPS_PREMULTIPLIED;
Feb 6, 2011
Feb 6, 2011
89
90
/* Create the window. */
Jan 11, 2009
Jan 11, 2009
91
SDL_DFB_CHECKERR(dispdata->layer->CreateWindow(dispdata->layer, &desc,
Feb 6, 2011
Feb 6, 2011
92
&windata->dfbwin));
93
Jan 11, 2009
Jan 11, 2009
94
/* Set Options */
Feb 6, 2011
Feb 6, 2011
95
SDL_DFB_CHECK(windata->dfbwin->GetOptions(windata->dfbwin, &wopts));
96
Feb 6, 2011
Feb 6, 2011
97
98
99
100
101
102
/* explicit rescaling of surface */
wopts |= DWOP_SCALE;
if (window->flags & SDL_WINDOW_RESIZABLE) {
wopts &= ~DWOP_KEEP_SIZE;
}
else {
103
wopts |= DWOP_KEEP_SIZE;
Feb 6, 2011
Feb 6, 2011
104
}
105
Jan 11, 2009
Jan 11, 2009
106
if (window->flags & SDL_WINDOW_FULLSCREEN) {
107
wopts |= DWOP_KEEP_POSITION | DWOP_KEEP_STACKING | DWOP_KEEP_SIZE;
Feb 6, 2011
Feb 6, 2011
108
109
110
111
112
113
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
114
}
Feb 6, 2011
Feb 6, 2011
115
116
SDL_DFB_CHECK(windata->dfbwin->SetOptions(windata->dfbwin, wopts));
Jan 11, 2009
Jan 11, 2009
117
118
/* See what we got */
Feb 6, 2011
Feb 6, 2011
119
SDL_DFB_CHECK(DirectFB_WM_GetClientSize
Jan 14, 2009
Jan 14, 2009
120
(_this, window, &window->w, &window->h));
Jan 11, 2009
Jan 11, 2009
121
122
/* Get the window's surface. */
Feb 6, 2011
Feb 6, 2011
123
SDL_DFB_CHECKERR(windata->dfbwin->GetSurface(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
124
&windata->window_surface));
Feb 6, 2011
Feb 6, 2011
125
Jan 11, 2009
Jan 11, 2009
126
127
128
129
130
/* 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
131
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0xFF));
132
Jan 11, 2009
Jan 11, 2009
133
/* Create Eventbuffer */
Feb 6, 2011
Feb 6, 2011
134
135
SDL_DFB_CHECKERR(windata->dfbwin->CreateEventBuffer(windata->dfbwin,
Jan 14, 2009
Jan 14, 2009
136
137
&windata->
eventbuffer));
Feb 6, 2011
Feb 6, 2011
138
139
SDL_DFB_CHECKERR(windata->dfbwin->
EnableEvents(windata->dfbwin, DWET_ALL));
Jan 11, 2009
Jan 11, 2009
140
141
142
/* Create a font */
/* FIXME: once during Video_Init */
Aug 16, 2010
Aug 16, 2010
143
windata->font = NULL;
Jan 11, 2009
Jan 11, 2009
144
145
/* Make it the top most window. */
Feb 6, 2011
Feb 6, 2011
146
SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
147
148
/* remember parent */
Feb 6, 2011
Feb 6, 2011
149
//windata->sdlwin = window;
150
151
152
153
154
/* Add to list ... */
windata->next = devdata->firstwin;
windata->opacity = 0xFF;
Feb 6, 2011
Feb 6, 2011
155
devdata->firstwin = window;
156
Jan 11, 2009
Jan 11, 2009
157
/* Draw Frame */
Aug 16, 2010
Aug 16, 2010
158
DirectFB_WM_RedrawLayout(_this, window);
Jan 11, 2009
Jan 11, 2009
159
160
161
return 0;
error:
Feb 6, 2011
Feb 6, 2011
162
163
SDL_DFB_RELEASE(windata->surface);
SDL_DFB_RELEASE(windata->dfbwin);
164
165
166
167
168
169
170
171
172
173
174
175
176
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
177
178
179
180
SDL_DFB_WINDOWDATA(window);
if (windata->is_managed) {
windata->wm_needs_redraw = 1;
Aug 16, 2010
Aug 16, 2010
181
DirectFB_WM_RedrawLayout(_this, window);
Jan 11, 2009
Jan 11, 2009
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
} 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
201
SDL_InitFormat(&format, SDL_PIXELFORMAT_ARGB8888);
Jan 11, 2009
Jan 11, 2009
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
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
224
SDL_DFB_CHECK(windata->icon->Unlock(windata->icon));
Jan 11, 2009
Jan 11, 2009
225
226
227
228
229
230
231
232
233
234
SDL_FreeSurface(surface);
} else {
SDL_DFB_RELEASE(windata->icon);
}
return;
error:
if (surface)
SDL_FreeSurface(surface);
SDL_DFB_RELEASE(windata->icon);
return;
235
236
237
238
239
240
241
242
}
void
DirectFB_SetWindowPosition(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
int x, y;
Mar 12, 2011
Mar 12, 2011
243
244
x = window->x;
y = window->y;
245
Aug 16, 2010
Aug 16, 2010
246
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
Feb 6, 2011
Feb 6, 2011
247
SDL_DFB_CHECK(windata->dfbwin->MoveTo(windata->dfbwin, x, y));
248
249
250
251
252
253
254
}
void
DirectFB_SetWindowSize(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
255
256
257
if(SDL_IsShapedWindow(window))
DirectFB_ResizeWindowShape(window);
258
259
260
261
262
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
263
SDL_DFB_CHECKERR(windata->dfbwin->DisableEvents(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
264
265
266
267
268
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
269
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
Feb 6, 2011
Feb 6, 2011
270
SDL_DFB_CHECKERR(windata->dfbwin->Resize(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
271
272
273
274
windata->size.w,
windata->size.h));
}
Aug 16, 2010
Aug 16, 2010
275
276
SDL_DFB_CHECKERR(DirectFB_WM_GetClientSize
(_this, window, &window->w, &window->h));
Feb 6, 2011
Feb 6, 2011
277
DirectFB_AdjustWindowSurface(window);
Aug 16, 2010
Aug 16, 2010
278
Feb 6, 2011
Feb 6, 2011
279
SDL_DFB_CHECKERR(windata->dfbwin->EnableEvents(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
280
281
DWET_ALL));
282
283
284
}
return;
error:
Feb 6, 2011
Feb 6, 2011
285
SDL_DFB_CHECK(windata->dfbwin->EnableEvents(windata->dfbwin, DWET_ALL));
286
287
288
289
290
291
292
293
return;
}
void
DirectFB_ShowWindow(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
294
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, windata->opacity));
295
296
297
298
299
300
301
302
}
void
DirectFB_HideWindow(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
303
304
SDL_DFB_CHECK(windata->dfbwin->GetOpacity(windata->dfbwin, &windata->opacity));
SDL_DFB_CHECK(windata->dfbwin->SetOpacity(windata->dfbwin, 0));
305
306
307
308
309
310
311
}
void
DirectFB_RaiseWindow(_THIS, SDL_Window * window)
{
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
312
313
SDL_DFB_CHECK(windata->dfbwin->RaiseToTop(windata->dfbwin));
SDL_DFB_CHECK(windata->dfbwin->RequestFocus(windata->dfbwin));
314
315
316
317
318
}
void
DirectFB_MaximizeWindow(_THIS, SDL_Window * window)
{
Jan 11, 2009
Jan 11, 2009
319
SDL_DFB_WINDOWDATA(window);
Feb 10, 2011
Feb 10, 2011
320
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
Feb 6, 2011
Feb 6, 2011
321
DFBWindowOptions wopts;
322
Feb 6, 2011
Feb 6, 2011
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
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));
338
339
340
341
342
343
344
345
346
347
348
349
350
}
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
351
SDL_DFB_WINDOWDATA(window);
Feb 6, 2011
Feb 6, 2011
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
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
374
375
376
377
378
379
}
void
DirectFB_SetWindowGrab(_THIS, SDL_Window * window)
{
Aug 16, 2010
Aug 16, 2010
380
SDL_DFB_DEVICEDATA(_this);
381
SDL_DFB_WINDOWDATA(window);
Aug 16, 2010
Aug 16, 2010
382
DFB_WindowData *gwindata = ((devdata->grabbed_window) ? (DFB_WindowData *) ((devdata->grabbed_window)->driverdata) : NULL);
383
Jan 11, 2009
Jan 11, 2009
384
if ((window->flags & SDL_WINDOW_INPUT_GRABBED)) {
Aug 16, 2010
Aug 16, 2010
385
386
if (gwindata != NULL)
{
Feb 6, 2011
Feb 6, 2011
387
388
SDL_DFB_CHECK(gwindata->dfbwin->UngrabPointer(gwindata->dfbwin));
SDL_DFB_CHECK(gwindata->dfbwin->UngrabKeyboard(gwindata->dfbwin));
Aug 16, 2010
Aug 16, 2010
389
}
Feb 6, 2011
Feb 6, 2011
390
391
SDL_DFB_CHECK(windata->dfbwin->GrabPointer(windata->dfbwin));
SDL_DFB_CHECK(windata->dfbwin->GrabKeyboard(windata->dfbwin));
Aug 16, 2010
Aug 16, 2010
392
devdata->grabbed_window = window;
393
} else {
Feb 6, 2011
Feb 6, 2011
394
395
SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
Aug 16, 2010
Aug 16, 2010
396
devdata->grabbed_window = NULL;
397
398
399
400
401
402
403
404
405
406
}
}
void
DirectFB_DestroyWindow(_THIS, SDL_Window * window)
{
SDL_DFB_DEVICEDATA(_this);
SDL_DFB_WINDOWDATA(window);
DFB_WindowData *p;
Jan 11, 2009
Jan 11, 2009
407
/* Some cleanups */
Feb 6, 2011
Feb 6, 2011
408
409
SDL_DFB_CHECK(windata->dfbwin->UngrabPointer(windata->dfbwin));
SDL_DFB_CHECK(windata->dfbwin->UngrabKeyboard(windata->dfbwin));
Jan 11, 2009
Jan 11, 2009
410
Aug 16, 2010
Aug 16, 2010
411
412
413
414
#if SDL_DIRECTFB_OPENGL
DirectFB_GL_DestroyWindowContexts(_this, window);
#endif
Feb 6, 2011
Feb 6, 2011
415
416
417
418
419
420
421
422
423
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
424
425
426
427
428
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);
429
430
SDL_DFB_RELEASE(windata->eventbuffer);
SDL_DFB_RELEASE(windata->surface);
Jan 11, 2009
Jan 11, 2009
431
432
SDL_DFB_RELEASE(windata->window_surface);
Feb 6, 2011
Feb 6, 2011
433
SDL_DFB_RELEASE(windata->dfbwin);
434
435
436
/* Remove from list ... */
Feb 6, 2011
Feb 6, 2011
437
438
439
440
p = devdata->firstwin->driverdata;
while (p && p->next != window)
p = (p->next ? p->next->driverdata : NULL);
441
442
443
444
445
446
447
448
449
450
451
452
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
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
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;
}
468
}
Jan 11, 2009
Jan 11, 2009
469
Feb 6, 2011
Feb 6, 2011
470
471
void
DirectFB_AdjustWindowSurface(SDL_Window * window)
Jan 11, 2009
Jan 11, 2009
472
473
474
475
476
{
SDL_DFB_WINDOWDATA(window);
int adjust = windata->wm_needs_redraw;
int cw, ch;
Aug 16, 2010
Aug 16, 2010
477
DirectFB_WM_AdjustWindowLayout(window, window->flags, window->w, window->h);
Jan 11, 2009
Jan 11, 2009
478
479
480
481
482
483
484
485
486
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
487
#if SDL_DIRECTFB_OPENGL
Feb 10, 2011
Feb 10, 2011
488
DirectFB_GL_FreeWindowContexts(SDL_GetVideoDevice(), window);
Aug 16, 2010
Aug 16, 2010
489
490
#endif
Feb 6, 2011
Feb 6, 2011
491
492
#if (DFB_VERSION_ATLEAST(1,2,1))
SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
Jan 11, 2009
Jan 11, 2009
493
494
windata->size.w,
windata->size.h));
Jan 14, 2009
Jan 14, 2009
495
SDL_DFB_CHECKERR(windata->surface->MakeSubSurface(windata->surface,
Jan 11, 2009
Jan 11, 2009
496
497
498
windata->
window_surface,
&windata->client));
Jan 13, 2009
Jan 13, 2009
499
#else
Jan 14, 2009
Jan 14, 2009
500
501
DFBWindowOptions opts;
Feb 6, 2011
Feb 6, 2011
502
SDL_DFB_CHECKERR(windata->dfbwin->GetOptions(windata->dfbwin, &opts));
Jan 14, 2009
Jan 14, 2009
503
504
505
506
/* recreate subsurface */
SDL_DFB_RELEASE(windata->surface);
if (opts & DWOP_SCALE)
Feb 6, 2011
Feb 6, 2011
507
SDL_DFB_CHECKERR(windata->dfbwin->ResizeSurface(windata->dfbwin,
Jan 14, 2009
Jan 14, 2009
508
509
510
511
512
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
513
#endif
Feb 10, 2011
Feb 10, 2011
514
DirectFB_WM_RedrawLayout(SDL_GetVideoDevice(), window);
Aug 16, 2010
Aug 16, 2010
515
516
#if SDL_DIRECTFB_OPENGL
Feb 10, 2011
Feb 10, 2011
517
DirectFB_GL_ReAllocWindowContexts(SDL_GetVideoDevice(), window);
Aug 16, 2010
Aug 16, 2010
518
519
#endif
}
Jan 11, 2009
Jan 11, 2009
520
521
522
error:
return;
}