diff options
author | David Robillard <d@drobilla.net> | 2019-08-04 20:19:01 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2019-09-03 08:34:39 +0200 |
commit | b0ac6dcb492b68404d800fe8ed0c7393d487fa4b (patch) | |
tree | 41d0050ef6d33bfe9f2186195168e36f8a8b8f3a | |
parent | 075c5c5927e511dd03d9608a285ed58ef395120b (diff) |
Add puglSetClassName()
-rw-r--r-- | pugl/detail/implementation.c | 29 | ||||
-rw-r--r-- | pugl/detail/types.h | 2 | ||||
-rw-r--r-- | pugl/detail/win.c | 10 | ||||
-rw-r--r-- | pugl/detail/win.h | 2 | ||||
-rw-r--r-- | pugl/detail/x11.c | 3 | ||||
-rw-r--r-- | pugl/pugl.h | 27 | ||||
-rw-r--r-- | test/pugl_cairo_test.c | 2 | ||||
-rw-r--r-- | test/pugl_test.c | 4 |
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)); |