This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_windowswindow.c
683 lines (602 loc) · 18.8 KB
1
2
/*
SDL - Simple DirectMedia Layer
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
22
23
24
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
*/
#include "SDL_config.h"
#include "../SDL_sysvideo.h"
25
#include "../SDL_pixels_c.h"
26
27
#include "../../events/SDL_keyboard_c.h"
28
29
#include "SDL_windowsvideo.h"
#include "SDL_windowswindow.h"
30
31
/* This is included after SDL_windowsvideo.h, which includes windows.h */
32
33
#include "SDL_syswm.h"
34
35
36
37
/* Windows CE compatibility */
#ifndef SWP_NOCOPYBITS
#define SWP_NOCOPYBITS 0
#endif
38
39
40
/* Fake window to help with DirectInput events. */
HWND SDL_HelperWindow = NULL;
41
42
static WCHAR *SDL_HelperWindowClassName = TEXT("SDLHelperWindowInputCatcher");
static WCHAR *SDL_HelperWindowName = TEXT("SDLHelperWindowInputMsgWindow");
43
44
static ATOM SDL_HelperWindowClass = 0;
45
static int
46
SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created)
47
{
48
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
49
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
50
51
52
53
54
55
56
57
SDL_WindowData *data;
/* Allocate the window data */
data = (SDL_WindowData *) SDL_malloc(sizeof(*data));
if (!data) {
SDL_OutOfMemory();
return -1;
}
58
data->window = window;
59
data->hwnd = hwnd;
60
data->hdc = GetDC(hwnd);
61
62
data->created = created;
data->mouse_pressed = SDL_FALSE;
63
data->videodata = videodata;
64
65
66
/* Associate the data with the window */
if (!SetProp(hwnd, TEXT("SDL_WindowData"), data)) {
67
ReleaseDC(hwnd, data->hdc);
68
69
70
71
72
73
SDL_free(data);
WIN_SetError("SetProp() failed");
return -1;
}
/* Set up the window proc function */
74
#ifdef GWLP_WNDPROC
75
data->wndproc = (WNDPROC) GetWindowLongPtr(hwnd, GWLP_WNDPROC);
76
if (data->wndproc == WIN_WindowProc) {
77
data->wndproc = NULL;
78
} else {
79
80
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) WIN_WindowProc);
}
81
82
83
84
85
86
87
88
#else
data->wndproc = (WNDPROC) GetWindowLong(hwnd, GWL_WNDPROC);
if (data->wndproc == WIN_WindowProc) {
data->wndproc = NULL;
} else {
SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR) WIN_WindowProc);
}
#endif
89
90
91
92
93
94
95
/* Fill in the SDL window with the window data */
{
POINT point;
point.x = 0;
point.y = 0;
if (ClientToScreen(hwnd, &point)) {
96
97
window->x = point.x;
window->y = point.y;
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
}
}
{
RECT rect;
if (GetClientRect(hwnd, &rect)) {
window->w = rect.right;
window->h = rect.bottom;
}
}
{
DWORD style = GetWindowLong(hwnd, GWL_STYLE);
if (style & WS_VISIBLE) {
window->flags |= SDL_WINDOW_SHOWN;
} else {
window->flags &= ~SDL_WINDOW_SHOWN;
}
if (style & (WS_BORDER | WS_THICKFRAME)) {
window->flags &= ~SDL_WINDOW_BORDERLESS;
} else {
window->flags |= SDL_WINDOW_BORDERLESS;
}
if (style & WS_THICKFRAME) {
window->flags |= SDL_WINDOW_RESIZABLE;
} else {
window->flags &= ~SDL_WINDOW_RESIZABLE;
}
124
#ifdef WS_MAXIMIZE
125
126
if (style & WS_MAXIMIZE) {
window->flags |= SDL_WINDOW_MAXIMIZED;
127
128
129
} else
#endif
{
130
131
window->flags &= ~SDL_WINDOW_MAXIMIZED;
}
132
#ifdef WS_MINIMIZE
133
134
if (style & WS_MINIMIZE) {
window->flags |= SDL_WINDOW_MINIMIZED;
135
136
137
} else
#endif
{
138
139
140
141
142
window->flags &= ~SDL_WINDOW_MINIMIZED;
}
}
if (GetFocus() == hwnd) {
window->flags |= SDL_WINDOW_INPUT_FOCUS;
143
SDL_SetKeyboardFocus(data->window);
144
145
146
147
148
149
150
151
152
153
if (window->flags & SDL_WINDOW_INPUT_GRABBED) {
RECT rect;
GetClientRect(hwnd, &rect);
ClientToScreen(hwnd, (LPPOINT) & rect);
ClientToScreen(hwnd, (LPPOINT) & rect + 1);
ClipCursor(&rect);
}
}
154
/* Enable multi-touch */
155
156
157
if (videodata->RegisterTouchWindow) {
videodata->RegisterTouchWindow(hwnd, (TWF_FINETOUCH|TWF_WANTPALM));
}
158
159
160
161
162
163
164
165
166
/* All done! */
window->driverdata = data;
return 0;
}
int
WIN_CreateWindow(_THIS, SDL_Window * window)
{
167
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
168
169
HWND hwnd;
RECT rect;
170
SDL_Rect bounds;
171
DWORD style = (WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
172
173
174
int x, y;
int w, h;
175
if (window->flags & (SDL_WINDOW_BORDERLESS | SDL_WINDOW_FULLSCREEN)) {
176
177
178
179
style |= WS_POPUP;
} else {
style |= (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX);
}
180
181
if ((window->flags & SDL_WINDOW_RESIZABLE)
&& !(window->flags & SDL_WINDOW_FULLSCREEN)) {
182
183
184
185
186
187
188
189
190
191
192
193
style |= (WS_THICKFRAME | WS_MAXIMIZEBOX);
}
/* Figure out what the window area will be */
rect.left = 0;
rect.top = 0;
rect.right = window->w;
rect.bottom = window->h;
AdjustWindowRectEx(&rect, style, FALSE, 0);
w = (rect.right - rect.left);
h = (rect.bottom - rect.top);
194
WIN_GetDisplayBounds(_this, display, &bounds);
195
196
197
198
199
200
201
202
if (window->flags & SDL_WINDOW_FULLSCREEN) {
/* The bounds when this window is visible is the fullscreen mode */
SDL_DisplayMode fullscreen_mode;
if (SDL_GetWindowDisplayMode(window, &fullscreen_mode) == 0) {
bounds.w = fullscreen_mode.w;
bounds.h = fullscreen_mode.h;
}
}
203
if ((window->flags & SDL_WINDOW_FULLSCREEN)
204
|| SDL_WINDOWPOS_ISCENTERED(window->x)) {
205
x = bounds.x + (bounds.w - w) / 2;
206
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->x)) {
207
208
209
210
211
if (bounds.x == 0) {
x = CW_USEDEFAULT;
} else {
x = bounds.x;
}
212
} else {
213
x = window->x + rect.left;
214
}
215
if ((window->flags & SDL_WINDOW_FULLSCREEN)
216
|| SDL_WINDOWPOS_ISCENTERED(window->y)) {
217
y = bounds.y + (bounds.h - h) / 2;
218
} else if (SDL_WINDOWPOS_ISUNDEFINED(window->x)) {
219
220
221
222
223
if (bounds.x == 0) {
y = CW_USEDEFAULT;
} else {
y = bounds.y;
}
224
} else {
225
y = window->y + rect.top;
226
227
}
228
229
230
hwnd =
CreateWindow(SDL_Appname, TEXT(""), style, x, y, w, h, NULL, NULL,
SDL_Instance, NULL);
231
232
233
234
if (!hwnd) {
WIN_SetError("Couldn't create window");
return -1;
}
235
//RegisterTouchWindow(hwnd, 0);
236
237
238
WIN_PumpEvents(_this);
239
if (SetupWindowData(_this, window, hwnd, SDL_TRUE) < 0) {
240
241
242
DestroyWindow(hwnd);
return -1;
}
243
#if SDL_VIDEO_OPENGL_WGL
244
245
246
247
248
249
250
if (window->flags & SDL_WINDOW_OPENGL) {
if (WIN_GL_SetupWindow(_this, window) < 0) {
WIN_DestroyWindow(_this, window);
return -1;
}
}
#endif
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
return 0;
}
int
WIN_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
{
HWND hwnd = (HWND) data;
LPTSTR title;
int titleLen;
/* Query the title from the existing window */
titleLen = GetWindowTextLength(hwnd);
title = SDL_stack_alloc(TCHAR, titleLen + 1);
if (title) {
titleLen = GetWindowText(hwnd, title, titleLen);
} else {
titleLen = 0;
}
if (titleLen > 0) {
window->title = WIN_StringToUTF8(title);
}
if (title) {
SDL_stack_free(title);
}
276
if (SetupWindowData(_this, window, hwnd, SDL_FALSE) < 0) {
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
return -1;
}
return 0;
}
void
WIN_SetWindowTitle(_THIS, SDL_Window * window)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
LPTSTR title;
if (window->title) {
title = WIN_UTF8ToString(window->title);
} else {
title = NULL;
}
SetWindowText(hwnd, title ? title : TEXT(""));
if (title) {
SDL_free(title);
}
}
299
300
301
302
303
304
void
WIN_SetWindowIcon(_THIS, SDL_Window * window, SDL_Surface * icon)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
HICON hicon = NULL;
305
if (icon) {
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
BYTE *icon_bmp;
int icon_len;
SDL_RWops *dst;
SDL_PixelFormat format;
SDL_Surface *surface;
/* Create temporary bitmap buffer */
icon_len = 40 + icon->h * icon->w * 4;
icon_bmp = SDL_stack_alloc(BYTE, icon_len);
dst = SDL_RWFromMem(icon_bmp, icon_len);
if (!dst) {
SDL_stack_free(icon_bmp);
return;
}
/* Write the BITMAPINFO header */
SDL_WriteLE32(dst, 40);
SDL_WriteLE32(dst, icon->w);
324
SDL_WriteLE32(dst, icon->h * 2);
325
326
327
328
329
330
331
332
333
334
SDL_WriteLE16(dst, 1);
SDL_WriteLE16(dst, 32);
SDL_WriteLE32(dst, BI_RGB);
SDL_WriteLE32(dst, icon->h * icon->w * 4);
SDL_WriteLE32(dst, 0);
SDL_WriteLE32(dst, 0);
SDL_WriteLE32(dst, 0);
SDL_WriteLE32(dst, 0);
/* Convert the icon to a 32-bit surface with alpha channel */
335
SDL_InitFormat(&format, SDL_PIXELFORMAT_ARGB8888);
336
337
338
339
340
surface = SDL_ConvertSurface(icon, &format, 0);
if (surface) {
/* Write the pixels upside down into the bitmap buffer */
int y = surface->h;
while (y--) {
341
Uint8 *src = (Uint8 *) surface->pixels + y * surface->pitch;
342
343
344
345
SDL_RWwrite(dst, src, surface->pitch, 1);
}
SDL_FreeSurface(surface);
346
347
/* TODO: create the icon in WinCE (CreateIconFromResource isn't available) */
#ifndef _WIN32_WCE
348
349
hicon =
CreateIconFromResource(icon_bmp, icon_len, TRUE, 0x00030000);
350
#endif
351
352
353
354
355
}
SDL_RWclose(dst);
SDL_stack_free(icon_bmp);
}
356
/* Set the icon for the window */
357
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM) hicon);
358
359
/* Set the icon in the task manager (should we do this?) */
360
SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM) hicon);
361
362
}
363
364
365
void
WIN_SetWindowPosition(_THIS, SDL_Window * window)
{
366
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
367
368
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
RECT rect;
369
SDL_Rect bounds;
370
371
DWORD style;
HWND top;
372
BOOL menu;
373
int x, y;
374
int w, h;
375
376
377
378
379
380
381
382
383
384
385
386
/* Figure out what the window area will be */
if (window->flags & SDL_WINDOW_FULLSCREEN) {
top = HWND_TOPMOST;
} else {
top = HWND_NOTOPMOST;
}
style = GetWindowLong(hwnd, GWL_STYLE);
rect.left = 0;
rect.top = 0;
rect.right = window->w;
rect.bottom = window->h;
387
388
389
390
391
392
#ifdef _WIN32_WCE
menu = FALSE;
#else
menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL);
#endif
AdjustWindowRectEx(&rect, style, menu, 0);
393
394
w = (rect.right - rect.left);
h = (rect.bottom - rect.top);
395
396
WIN_GetDisplayBounds(_this, display, &bounds);
397
398
399
400
401
402
403
404
if (window->flags & SDL_WINDOW_FULLSCREEN) {
/* The bounds when this window is visible is the fullscreen mode */
SDL_DisplayMode fullscreen_mode;
if (SDL_GetWindowDisplayMode(window, &fullscreen_mode) == 0) {
bounds.w = fullscreen_mode.w;
bounds.h = fullscreen_mode.h;
}
}
405
if ((window->flags & SDL_WINDOW_FULLSCREEN)
406
|| SDL_WINDOWPOS_ISCENTERED(window->x)) {
407
x = bounds.x + (bounds.w - w) / 2;
408
} else {
409
x = window->x + rect.left;
410
}
411
if ((window->flags & SDL_WINDOW_FULLSCREEN)
412
|| SDL_WINDOWPOS_ISCENTERED(window->y)) {
413
y = bounds.y + (bounds.h - h) / 2;
414
} else {
415
y = window->y + rect.top;
416
}
417
418
SetWindowPos(hwnd, top, x, y, 0, 0, (SWP_NOCOPYBITS | SWP_NOSIZE));
419
420
421
422
423
424
425
426
427
}
void
WIN_SetWindowSize(_THIS, SDL_Window * window)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
RECT rect;
DWORD style;
HWND top;
428
BOOL menu;
429
430
431
432
433
434
435
436
437
438
439
440
441
int w, h;
/* Figure out what the window area will be */
if (window->flags & SDL_WINDOW_FULLSCREEN) {
top = HWND_TOPMOST;
} else {
top = HWND_NOTOPMOST;
}
style = GetWindowLong(hwnd, GWL_STYLE);
rect.left = 0;
rect.top = 0;
rect.right = window->w;
rect.bottom = window->h;
442
443
444
445
446
447
#ifdef _WIN32_WCE
menu = FALSE;
#else
menu = (style & WS_CHILDWINDOW) ? FALSE : (GetMenu(hwnd) != NULL);
#endif
AdjustWindowRectEx(&rect, style, menu, 0);
448
449
450
w = (rect.right - rect.left);
h = (rect.bottom - rect.top);
451
SetWindowPos(hwnd, top, 0, 0, w, h, (SWP_NOCOPYBITS | SWP_NOMOVE));
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
}
#ifdef _WIN32_WCE
void WINCE_ShowWindow(_THIS, SDL_Window* window, int visible)
{
SDL_WindowData* windowdata = (SDL_WindowData*) window->driverdata;
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
if(visible) {
if(window->flags & SDL_WINDOW_FULLSCREEN) {
if(videodata->SHFullScreen)
videodata->SHFullScreen(windowdata->hwnd, SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON);
ShowWindow(FindWindow(TEXT("HHTaskBar"), NULL), SW_HIDE);
}
ShowWindow(windowdata->hwnd, SW_SHOW);
SetForegroundWindow(windowdata->hwnd);
} else {
ShowWindow(windowdata->hwnd, SW_HIDE);
if(window->flags & SDL_WINDOW_FULLSCREEN) {
if(videodata->SHFullScreen)
videodata->SHFullScreen(windowdata->hwnd, SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON | SHFS_SHOWSIPBUTTON);
ShowWindow(FindWindow(TEXT("HHTaskBar"), NULL), SW_SHOW);
}
}
481
}
482
#endif /* _WIN32_WCE */
483
484
485
486
void
WIN_ShowWindow(_THIS, SDL_Window * window)
{
487
488
489
#ifdef _WIN32_WCE
WINCE_ShowWindow(_this, window, 1);
#else
490
491
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
ShowWindow(hwnd, SW_SHOW);
492
#endif
493
494
495
496
497
}
void
WIN_HideWindow(_THIS, SDL_Window * window)
{
498
499
500
#ifdef _WIN32_WCE
WINCE_ShowWindow(_this, window, 0);
#else
501
502
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
ShowWindow(hwnd, SW_HIDE);
503
#endif
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
}
void
WIN_RaiseWindow(_THIS, SDL_Window * window)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
HWND top;
if (window->flags & SDL_WINDOW_FULLSCREEN) {
top = HWND_TOPMOST;
} else {
top = HWND_NOTOPMOST;
}
SetWindowPos(hwnd, top, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE));
}
void
WIN_MaximizeWindow(_THIS, SDL_Window * window)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
524
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
525
526
#ifdef _WIN32_WCE
527
528
if((window->flags & SDL_WINDOW_FULLSCREEN) && videodata->SHFullScreen)
videodata->SHFullScreen(hwnd, SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON);
529
#endif
530
531
ShowWindow(hwnd, SW_MAXIMIZE);
532
533
534
535
536
537
}
void
WIN_MinimizeWindow(_THIS, SDL_Window * window)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
538
SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
539
540
ShowWindow(hwnd, SW_MINIMIZE);
541
542
#ifdef _WIN32_WCE
543
544
if((window->flags & SDL_WINDOW_FULLSCREEN) && videodata->SHFullScreen)
videodata->SHFullScreen(hwnd, SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON | SHFS_SHOWSIPBUTTON);
545
#endif
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
}
void
WIN_RestoreWindow(_THIS, SDL_Window * window)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
ShowWindow(hwnd, SW_RESTORE);
}
void
WIN_SetWindowGrab(_THIS, SDL_Window * window)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
561
562
if ((window->flags & (SDL_WINDOW_INPUT_GRABBED | SDL_WINDOW_FULLSCREEN))
&& (window->flags & SDL_WINDOW_INPUT_FOCUS)) {
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
RECT rect;
GetClientRect(hwnd, &rect);
ClientToScreen(hwnd, (LPPOINT) & rect);
ClientToScreen(hwnd, (LPPOINT) & rect + 1);
ClipCursor(&rect);
} else {
ClipCursor(NULL);
}
}
void
WIN_DestroyWindow(_THIS, SDL_Window * window)
{
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if (data) {
579
580
581
#ifdef _WIN32_WCE
WINCE_ShowWindow(_this, window, 0);
#endif
582
ReleaseDC(data->hwnd, data->hdc);
583
584
585
586
587
588
589
590
591
592
593
594
if (data->created) {
DestroyWindow(data->hwnd);
}
SDL_free(data);
}
}
SDL_bool
WIN_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
{
HWND hwnd = ((SDL_WindowData *) window->driverdata)->hwnd;
if (info->version.major <= SDL_MAJOR_VERSION) {
595
info->subsystem = SDL_SYSWM_WINDOWS;
596
info->info.win.window = hwnd;
597
598
599
600
601
602
603
604
return SDL_TRUE;
} else {
SDL_SetError("Application not compiled with SDL %d.%d\n",
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
return SDL_FALSE;
}
}
605
606
607
608
609
610
611
/*
* Creates a HelperWindow used for DirectInput events.
*/
int
SDL_HelperWindowCreate(void)
{
612
613
HINSTANCE hInstance = GetModuleHandle(NULL);
WNDCLASS wce;
614
HWND hWndParent = NULL;
615
616
617
618
619
620
/* Make sure window isn't created twice. */
if (SDL_HelperWindow != NULL) {
return 0;
}
621
/* Create the class. */
622
SDL_zero(wce);
623
wce.lpfnWndProc = DefWindowProc;
624
625
626
627
wce.lpszClassName = (LPCWSTR) SDL_HelperWindowClassName;
wce.hInstance = hInstance;
/* Register the class. */
628
SDL_HelperWindowClass = RegisterClass(&wce);
629
if (SDL_HelperWindowClass == 0) {
630
WIN_SetError("Unable to create Helper Window Class");
631
632
633
return -1;
}
634
635
636
637
638
#ifndef _WIN32_WCE
/* WinCE doesn't have HWND_MESSAGE */
hWndParent = HWND_MESSAGE;
#endif
639
/* Create the window. */
640
641
SDL_HelperWindow = CreateWindowEx(0, SDL_HelperWindowClassName,
SDL_HelperWindowName,
642
WS_OVERLAPPED, CW_USEDEFAULT,
643
CW_USEDEFAULT, CW_USEDEFAULT,
644
CW_USEDEFAULT, hWndParent, NULL,
645
hInstance, NULL);
646
if (SDL_HelperWindow == NULL) {
647
UnregisterClass(SDL_HelperWindowClassName, hInstance);
648
WIN_SetError("Unable to create Helper Window");
649
650
651
652
653
654
655
656
657
658
659
660
661
return -1;
}
return 0;
}
/*
* Destroys the HelperWindow previously created with SDL_HelperWindowCreate.
*/
void
SDL_HelperWindowDestroy(void)
{
662
HINSTANCE hInstance = GetModuleHandle(NULL);
663
664
/* Destroy the window. */
665
666
if (SDL_HelperWindow != NULL) {
if (DestroyWindow(SDL_HelperWindow) == 0) {
667
WIN_SetError("Unable to destroy Helper Window");
668
return;
669
}
670
671
672
673
SDL_HelperWindow = NULL;
}
/* Unregister the class. */
674
675
if (SDL_HelperWindowClass != 0) {
if ((UnregisterClass(SDL_HelperWindowClassName, hInstance)) == 0) {
676
WIN_SetError("Unable to destroy Helper Window Class");
677
return;
678
}
679
680
681
682
SDL_HelperWindowClass = 0;
}
}
683
/* vi: set ts=4 sw=4 expandtab: */