aboutsummaryrefslogtreecommitdiff
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
parent075c5c5927e511dd03d9608a285ed58ef395120b (diff)
Add puglSetClassName()
-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
-rw-r--r--pugl/pugl.h27
-rw-r--r--test/pugl_cairo_test.c2
-rw-r--r--test/pugl_test.c4
8 files changed, 50 insertions, 29 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,
diff --git a/pugl/pugl.h b/pugl/pugl.h
index 017338c..112b11b 100644
--- a/pugl/pugl.h
+++ b/pugl/pugl.h
@@ -454,6 +454,18 @@ PUGL_API void
puglFreeWorld(PuglWorld* world);
/**
+ Set the class name of the application.
+
+ This is a stable identifier for the application, used as the window
+ class/instance name on X11 and Windows. It is not displayed to the user,
+ but can be used in scripts and by window managers, so it should be the same
+ for every instance of the application, but different from other
+ applications.
+*/
+PUGL_API PuglStatus
+puglSetClassName(PuglWorld* world, const char* name);
+
+/**
Return the time in seconds.
This is a monotonically increasing clock with high resolution. The returned
@@ -523,12 +535,6 @@ PUGL_API void
puglInitWindowHint(PuglView* view, PuglWindowHint hint, int value);
/**
- Set the window class name before creating a window.
-*/
-PUGL_API void
-puglInitWindowClass(PuglView* view, const char* name);
-
-/**
Set the parent window before creating a window (for embedding).
*/
PUGL_API void
@@ -797,6 +803,15 @@ puglDestroy(PuglView* view)
}
/**
+ Set the window class name before creating a window.
+*/
+static inline PUGL_DEPRECATED_BY("puglSetClassName") void
+puglInitWindowClass(PuglView* view, const char* name)
+{
+ puglSetClassName(puglGetWorld(view), name);
+}
+
+/**
Set the window size before creating a window.
@deprecated Use puglSetFrame().
diff --git a/test/pugl_cairo_test.c b/test/pugl_cairo_test.c
index c396dad..52cbbbd 100644
--- a/test/pugl_cairo_test.c
+++ b/test/pugl_cairo_test.c
@@ -206,10 +206,10 @@ main(int argc, char** argv)
}
world = puglNewWorld();
+ puglSetClassName(world, "PuglCairoTest");
PuglRect frame = { 0, 0, 512, 512 };
PuglView* view = puglNewView(world);
- puglInitWindowClass(view, "PuglCairoTest");
puglSetFrame(view, frame);
puglSetMinSize(view, 256, 256);
puglInitWindowHint(view, PUGL_RESIZABLE, resizable);
diff --git a/test/pugl_test.c b/test/pugl_test.c
index 285c5d9..e291df7 100644
--- a/test/pugl_test.c
+++ b/test/pugl_test.c
@@ -314,8 +314,9 @@ main(int argc, char** argv)
app.parent = puglNewView(app.world);
app.child = puglNewView(app.world);
+ puglSetClassName(app.world, "Pugl Test");
+
const PuglRect parentFrame = { 0, 0, 512, 512 };
- puglInitWindowClass(app.parent, "PuglTest");
puglSetFrame(app.parent, parentFrame);
puglSetMinSize(app.parent, borderWidth * 3, borderWidth * 3);
puglSetAspectRatio(app.parent, 1, 1, 16, 9);
@@ -336,7 +337,6 @@ main(int argc, char** argv)
return 1;
}
- puglInitWindowClass(app.child, "PuglTest");
puglSetFrame(app.child, getChildFrame(parentFrame));
puglInitWindowParent(app.child, puglGetNativeWindow(app.parent));