From b0ac6dcb492b68404d800fe8ed0c7393d487fa4b Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 4 Aug 2019 20:19:01 +0200 Subject: Add puglSetClassName() --- pugl/detail/implementation.c | 29 ++++++++++++++++++----------- pugl/detail/types.h | 2 +- pugl/detail/win.c | 10 +++------- pugl/detail/win.h | 2 +- pugl/detail/x11.c | 3 +++ pugl/pugl.h | 27 +++++++++++++++++++++------ 6 files changed, 47 insertions(+), 26 deletions(-) (limited to 'pugl') 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 @@ -25,6 +25,15 @@ #include #include +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) { @@ -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); } @@ -127,16 +144,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) { 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 @@ -453,6 +453,18 @@ puglNewWorld(void); 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. @@ -522,12 +534,6 @@ puglGetWorld(PuglView* view); 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). */ @@ -796,6 +802,15 @@ puglDestroy(PuglView* view) puglFreeWorld(world); } +/** + 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. -- cgit v1.2.1