RetroArch/deps/libui/win32/utilwin.cpp

88 lines
2.4 KiB
C++
Raw Normal View History

2017-07-03 09:33:29 +02:00
/* 14 may 2015 */
2017-07-03 06:34:21 +02:00
#include "uipriv_windows.hpp"
2017-07-03 20:07:23 +02:00
#include "../../verbosity.h"
2017-07-03 06:34:21 +02:00
2017-07-03 09:33:29 +02:00
/* The utility window is a special window that performs certain tasks internal to libui.
* It is not a message-only window, and it is always hidden and disabled.
* Its roles:
* - It is the initial parent of all controls. When a control loses its parent, it also becomes that control's parent.
* - It handles WM_QUERYENDSESSION and console end session requests.
* - It handles WM_WININICHANGE and forwards the message to any child windows that request it.
* - It handles executing functions queued to run by uiQueueMain().
*/
2017-07-03 06:34:21 +02:00
#define utilWindowClass L"libui_utilWindowClass"
HWND utilWindow;
static LRESULT CALLBACK utilWindowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
void (*qf)(void *);
LRESULT lResult;
if (handleParentMessages(hwnd, uMsg, wParam, lParam, &lResult) != FALSE)
return lResult;
switch (uMsg)
{
case WM_QUERYENDSESSION:
/* TODO block handler */
if (shouldQuit())
{
uiQuit();
return TRUE;
}
return FALSE;
case WM_WININICHANGE:
issueWM_WININICHANGE(wParam, lParam);
return 0;
case msgQueued:
qf = (void (*)(void *)) wParam;
(*qf)((void *) lParam);
return 0;
}
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
const char *initUtilWindow(HICON hDefaultIcon, HCURSOR hDefaultCursor)
{
WNDCLASSW wc;
ZeroMemory(&wc, sizeof (WNDCLASSW));
wc.lpszClassName = utilWindowClass;
wc.lpfnWndProc = utilWindowWndProc;
wc.hInstance = hInstance;
wc.hIcon = hDefaultIcon;
wc.hCursor = hDefaultCursor;
wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
if (RegisterClass(&wc) == 0)
2017-07-03 20:07:23 +02:00
{
RARCH_ERR("Cannot register class.\n");
2017-07-03 09:33:29 +02:00
/* see init.cpp for an explanation of the =s */
2017-07-03 06:34:21 +02:00
return "=registering utility window class";
2017-07-03 20:07:23 +02:00
}
2017-07-03 06:34:21 +02:00
utilWindow = CreateWindowExW(0,
utilWindowClass, L"libui utility window",
WS_OVERLAPPEDWINDOW,
0, 0, 100, 100,
NULL, NULL, hInstance, NULL);
if (utilWindow == NULL)
2017-07-03 20:07:23 +02:00
{
RARCH_ERR("Cannot create window.\n");
2017-07-03 06:34:21 +02:00
return "=creating utility window";
2017-07-03 20:07:23 +02:00
}
2017-07-03 09:33:29 +02:00
/* and just to be safe */
2017-07-03 06:34:21 +02:00
EnableWindow(utilWindow, FALSE);
return NULL;
}
void uninitUtilWindow(void)
{
if (DestroyWindow(utilWindow) == 0)
logLastError(L"error destroying utility window");
if (UnregisterClass(utilWindowClass, hInstance) == 0)
logLastError(L"error unregistering utility window class");
}