aboutsummaryrefslogtreecommitdiffstats
path: root/pugl/detail
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2019-08-04 20:19:01 +0200
committerDavid Robillard <d@drobilla.net>2019-09-03 08:34:39 +0200
commitb0ac6dcb492b68404d800fe8ed0c7393d487fa4b (patch)
tree41d0050ef6d33bfe9f2186195168e36f8a8b8f3a /pugl/detail
parent075c5c5927e511dd03d9608a285ed58ef395120b (diff)
downloadpugl-b0ac6dcb492b68404d800fe8ed0c7393d487fa4b.tar.gz
pugl-b0ac6dcb492b68404d800fe8ed0c7393d487fa4b.tar.bz2
pugl-b0ac6dcb492b68404d800fe8ed0c7393d487fa4b.zip
Add puglSetClassName()
Diffstat (limited to 'pugl/detail')
-rw-r--r--pugl/detail/implementation.c29
-rw-r--r--pugl/detail/types.h2
-rw-r--r--pugl/detail/win.c10
-rw-r--r--pugl/detail/win.h2
-rw-r--r--pugl/detail/x11.c3
5 files changed, 26 insertions, 20 deletions
diff --git a/pugl/detail/implementation.c b/pugl/detail/implementation.c
index a64e6fd..1f027a9 100644
--- a/pugl/detail/implementation.c
+++ b/pugl/detail/implementation.c
@@ -26,6 +26,15 @@
#include <string.h>
static void
+puglSetString(char** dest, const char* string)
+{
+ const size_t len = strlen(string);
+
+ *dest = (char*)realloc(*dest, len + 1);
+ strncpy(*dest, string, len + 1);
+}
+
+static void
puglSetDefaultHints(PuglHints hints)
{
hints[PUGL_USE_COMPAT_PROFILE] = PUGL_TRUE;
@@ -54,6 +63,7 @@ puglNewWorld(void)
}
world->startTime = puglGetTime(world);
+ puglSetString(&world->className, "Pugl");
return world;
}
@@ -62,10 +72,18 @@ void
puglFreeWorld(PuglWorld* const world)
{
puglFreeWorldInternals(world);
+ free(world->className);
free(world->views);
free(world);
}
+PuglStatus
+puglSetClassName(PuglWorld* const world, const char* const name)
+{
+ puglSetString(&world->className, name);
+ return PUGL_SUCCESS;
+}
+
PuglView*
puglNewView(PuglWorld* const world)
{
@@ -109,7 +127,6 @@ puglFreeView(PuglView* view)
}
puglFreeViewInternals(view);
- free(view->windowClass);
free(view);
}
@@ -128,16 +145,6 @@ puglInitWindowHint(PuglView* view, PuglWindowHint hint, int value)
}
void
-puglInitWindowClass(PuglView* view, const char* name)
-{
- const size_t len = strlen(name);
-
- free(view->windowClass);
- view->windowClass = (char*)calloc(1, len + 1);
- memcpy(view->windowClass, name, len);
-}
-
-void
puglInitWindowParent(PuglView* view, PuglNativeWindow parent)
{
view->parent = parent;
diff --git a/pugl/detail/types.h b/pugl/detail/types.h
index 24cf219..a413848 100644
--- a/pugl/detail/types.h
+++ b/pugl/detail/types.h
@@ -52,7 +52,6 @@ struct PuglViewImpl {
PuglInternals* impl;
PuglHandle handle;
PuglEventFunc eventFunc;
- char* windowClass;
PuglNativeWindow parent;
uintptr_t transientParent;
PuglHints hints;
@@ -70,6 +69,7 @@ struct PuglViewImpl {
/** Cross-platform world definition. */
struct PuglWorldImpl {
PuglWorldInternals* impl;
+ char* className;
double startTime;
size_t numViews;
PuglView** views;
diff --git a/pugl/detail/win.c b/pugl/detail/win.c
index 96642cc..efd6070 100644
--- a/pugl/detail/win.c
+++ b/pugl/detail/win.c
@@ -51,8 +51,6 @@
typedef BOOL (WINAPI *PFN_SetProcessDPIAware)(void);
-static const TCHAR* DEFAULT_CLASSNAME = "Pugl";
-
LRESULT CALLBACK
wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
@@ -140,9 +138,7 @@ puglCreateWindow(PuglView* view, const char* title)
{
PuglInternals* impl = view->impl;
- const char* className = view->windowClass ? view->windowClass : DEFAULT_CLASSNAME;
-
- title = title ? title : "Window";
+ title = title ? title : view->world->className;
// Get refresh rate for resize draw timer
DEVMODEA devMode = {0};
@@ -150,7 +146,7 @@ puglCreateWindow(PuglView* view, const char* title)
view->impl->refreshRate = devMode.dmDisplayFrequency;
// Register window class if necessary
- if (!puglRegisterWindowClass(className)) {
+ if (!puglRegisterWindowClass(view->world->className)) {
return 1;
}
@@ -202,7 +198,6 @@ puglFreeViewInternals(PuglView* view)
view->backend->destroy(view);
ReleaseDC(view->impl->hwnd, view->impl->hdc);
DestroyWindow(view->impl->hwnd);
- UnregisterClass(view->windowClass ? view->windowClass : DEFAULT_CLASSNAME, NULL);
free(view->impl);
}
}
@@ -210,6 +205,7 @@ puglFreeViewInternals(PuglView* view)
void
puglFreeWorldInternals(PuglWorld* world)
{
+ UnregisterClass(world->className, NULL);
free(world->impl);
}
diff --git a/pugl/detail/win.h b/pugl/detail/win.h
index 8d6ce12..b9e554c 100644
--- a/pugl/detail/win.h
+++ b/pugl/detail/win.h
@@ -90,7 +90,7 @@ puglWinCreateWindow(const PuglView* const view,
HWND* const hwnd,
HDC* const hdc)
{
- const char* className = view->windowClass ? view->windowClass : "Pugl";
+ const char* className = (const char*)view->world->className;
const unsigned winFlags = puglWinGetWindowFlags(view);
const unsigned winExFlags = puglWinGetWindowExFlags(view);
diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c
index ea8367c..f000b02 100644
--- a/pugl/detail/x11.c
+++ b/pugl/detail/x11.c
@@ -211,6 +211,9 @@ puglCreateWindow(PuglView* view, const char* title)
XSizeHints sizeHints = getSizeHints(view);
XSetNormalHints(display, win, &sizeHints);
+ XClassHint classHint = { world->className, world->className };
+ XSetClassHint(display, win, &classHint);
+
if (title) {
XStoreName(display, win, title);
XChangeProperty(display, win, atoms->NET_WM_NAME,