aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJP Cimalando <jp-dev@inbox.ru>2019-07-30 00:18:05 +0200
committerDavid Robillard <d@drobilla.net>2019-07-31 21:18:17 +0200
commitbb0834637c7620870d784180436c90492c89db9b (patch)
treef8b25b86bb1a5d6f6606b86ca4b8f41f6ac54a61
parent568d40cd8454ae20bb47cfb06d14d644ba82711d (diff)
downloadpugl-bb0834637c7620870d784180436c90492c89db9b.tar.gz
pugl-bb0834637c7620870d784180436c90492c89db9b.tar.bz2
pugl-bb0834637c7620870d784180436c90492c89db9b.zip
X11: Support UTF8 in window titles
It's possible that this does bad things if a UTF8 string is used on a system that does not support it (because XStoreName is still called), but I have no idea how likely this scenario is. Leaving it this way because it means the ASCII case will still work everywhere, and it's easy enough to avoid if this is a problem.
-rw-r--r--pugl/detail/x11.c5
-rw-r--r--pugl/detail/x11.h2
-rw-r--r--test/pugl_test.c4
3 files changed, 10 insertions, 1 deletions
diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c
index a076d6f..32f1393 100644
--- a/pugl/detail/x11.c
+++ b/pugl/detail/x11.c
@@ -75,8 +75,10 @@ puglCreateWindow(PuglView* view, const char* title)
impl->screen = DefaultScreen(display);
// Intern the various atoms we will need
+ impl->atoms.UTF8_STRING = XInternAtom(display, "UTF8_STRING", 0);
impl->atoms.WM_PROTOCOLS = XInternAtom(display, "WM_PROTOCOLS", 0);
impl->atoms.WM_DELETE_WINDOW = XInternAtom(display, "WM_DELETE_WINDOW", 0);
+ impl->atoms.NET_WM_NAME = XInternAtom(display, "_NET_WM_NAME", 0);
impl->atoms.NET_WM_STATE = XInternAtom(display, "_NET_WM_STATE", 0);
impl->atoms.NET_WM_STATE_DEMANDS_ATTENTION =
XInternAtom(display, "_NET_WM_STATE_DEMANDS_ATTENTION", 0);
@@ -132,6 +134,9 @@ puglCreateWindow(PuglView* view, const char* title)
if (title) {
XStoreName(display, win, title);
+ XChangeProperty(display, win,
+ impl->atoms.NET_WM_NAME, impl->atoms.UTF8_STRING, 8,
+ PropModeReplace, (const uint8_t*)title, strlen(title));
}
if (!view->parent) {
diff --git a/pugl/detail/x11.h b/pugl/detail/x11.h
index 98f42b0..1ead119 100644
--- a/pugl/detail/x11.h
+++ b/pugl/detail/x11.h
@@ -33,8 +33,10 @@ struct PuglInternalsImpl {
PuglSurface* surface;
struct {
+ Atom UTF8_STRING;
Atom WM_PROTOCOLS;
Atom WM_DELETE_WINDOW;
+ Atom NET_WM_NAME;
Atom NET_WM_STATE;
Atom NET_WM_STATE_DEMANDS_ATTENTION;
} atoms;
diff --git a/test/pugl_test.c b/test/pugl_test.c
index f81cf99..af93caf 100644
--- a/test/pugl_test.c
+++ b/test/pugl_test.c
@@ -182,7 +182,9 @@ main(int argc, char** argv)
puglIgnoreKeyRepeat(view, ignoreKeyRepeat);
puglSetEventFunc(view, onEvent);
- if (puglCreateWindow(view, "Pugl Test")) {
+ const uint8_t title[] = { 'P', 'u', 'g', 'l', ' ',
+ 'P', 'r', 0xC3, 0xBC, 'f', 'u', 'n', 'g' };
+ if (puglCreateWindow(view, (const char*)title)) {
return 1;
}