diff options
author | David Robillard <d@drobilla.net> | 2019-08-03 10:38:34 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2019-09-03 08:32:16 +0200 |
commit | e148e8f3646ae756254879f2df015431bbd036ed (patch) | |
tree | 8dc20f5b1ce8be732c70a49eb50b663fa101c91e | |
parent | e3b2f305b98747c84fd87eb97e3fa8516acecbfb (diff) | |
download | pugl-e148e8f3646ae756254879f2df015431bbd036ed.tar.gz pugl-e148e8f3646ae756254879f2df015431bbd036ed.tar.bz2 pugl-e148e8f3646ae756254879f2df015431bbd036ed.zip |
Windows: Fix class registration for multiple views
-rw-r--r-- | pugl/detail/win.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/pugl/detail/win.c b/pugl/detail/win.c index 3a30814..42b9427 100644 --- a/pugl/detail/win.c +++ b/pugl/detail/win.c @@ -52,6 +52,9 @@ typedef BOOL (WINAPI *PFN_SetProcessDPIAware)(void); static const TCHAR* DEFAULT_CLASSNAME = "Pugl"; +LRESULT CALLBACK +wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + static wchar_t* puglUtf8ToWideChar(const char* const utf8) { @@ -65,8 +68,25 @@ puglUtf8ToWideChar(const char* const utf8) return NULL; } -LRESULT CALLBACK -wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); +static bool +puglRegisterWindowClass(const char* name) +{ + WNDCLASSEX wc = { 0 }; + if (GetClassInfoEx(GetModuleHandle(NULL), name, &wc)) { + return true; // Already registered + } + + wc.cbSize = sizeof(wc); + wc.style = CS_OWNDC; + wc.lpfnWndProc = wndProc; + wc.hInstance = GetModuleHandle(NULL); + wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + wc.lpszClassName = name; + + return RegisterClassEx(&wc); +} PuglInternals* puglInitInternals(void) @@ -104,18 +124,8 @@ puglCreateWindow(PuglView* view, const char* title) EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devMode); view->impl->refreshRate = devMode.dmDisplayFrequency; - // Register window class - WNDCLASSEX wc; - memset(&wc, 0, sizeof(wc)); - wc.cbSize = sizeof(wc); - wc.style = CS_OWNDC; - wc.lpfnWndProc = wndProc; - wc.hInstance = GetModuleHandle(NULL); - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // TODO: user-specified icon - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszClassName = className; - if (!RegisterClassEx(&wc)) { + // Register window class if necessary + if (!puglRegisterWindowClass(className)) { return 1; } |