aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2019-08-03 12:38:54 +0200
committerDavid Robillard <d@drobilla.net>2019-09-03 08:32:16 +0200
commit9995566f3980ad6092428963b63558fb599bac8d (patch)
tree7ec0b555d700cb94e5ea427226bc483ebf7d10dc
parente83c2b421d140244a6b9edb051b3e0d4aacda332 (diff)
X11: Move atoms to world
-rw-r--r--pugl/detail/x11.c45
-rw-r--r--pugl/detail/x11.h21
2 files changed, 37 insertions, 29 deletions
diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c
index 1098f72..aef2476 100644
--- a/pugl/detail/x11.c
+++ b/pugl/detail/x11.c
@@ -73,6 +73,17 @@ puglInitWorldInternals(void)
impl->display = 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);
+
+ XFlush(display);
+
return impl;
}
@@ -86,20 +97,13 @@ int
puglCreateWindow(PuglView* view, const char* title)
{
PuglInternals* const impl = view->impl;
- Display* const display = view->world->impl->display;
+ PuglWorld* const world = view->world;
+ PuglX11Atoms* const atoms = &view->world->impl->atoms;
+ Display* const display = world->impl->display;
impl->display = display;
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);
-
if (!view->backend || !view->backend->configure) {
return 1;
} else if (view->backend->configure(view) || !impl->vi) {
@@ -151,13 +155,12 @@ 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,
+ XChangeProperty(display, win, atoms->NET_WM_NAME, atoms->UTF8_STRING, 8,
PropModeReplace, (const uint8_t*)title, strlen(title));
}
if (!view->parent) {
- XSetWMProtocols(display, win, &view->impl->atoms.WM_DELETE_WINDOW, 1);
+ XSetWMProtocols(display, win, &atoms->WM_DELETE_WINDOW, 1);
}
if (view->transient_parent) {
@@ -330,14 +333,16 @@ translateModifiers(const unsigned xstate)
static PuglEvent
translateEvent(PuglView* view, XEvent xevent)
{
+ const PuglX11Atoms* atoms = &view->world->impl->atoms;
+
PuglEvent event = {0};
event.any.flags = xevent.xany.send_event ? PUGL_IS_SEND_EVENT : 0;
switch (xevent.type) {
case ClientMessage:
- if (xevent.xclient.message_type == view->impl->atoms.WM_PROTOCOLS) {
+ if (xevent.xclient.message_type == atoms->WM_PROTOCOLS) {
const Atom protocol = (Atom)xevent.xclient.data.l[0];
- if (protocol == view->impl->atoms.WM_DELETE_WINDOW) {
+ if (protocol == atoms->WM_DELETE_WINDOW) {
event.type = PUGL_CLOSE;
}
}
@@ -475,14 +480,16 @@ puglHasFocus(const PuglView* view)
void
puglRequestAttention(PuglView* view)
{
- PuglInternals* const impl = view->impl;
- XEvent event = {0};
+ PuglInternals* const impl = view->impl;
+ const PuglX11Atoms* const atoms = &view->world->impl->atoms;
+ XEvent event = {0};
+
event.type = ClientMessage;
event.xclient.window = impl->win;
event.xclient.format = 32;
- event.xclient.message_type = impl->atoms.NET_WM_STATE;
+ event.xclient.message_type = atoms->NET_WM_STATE;
event.xclient.data.l[0] = WM_STATE_ADD;
- event.xclient.data.l[1] = impl->atoms.NET_WM_STATE_DEMANDS_ATTENTION;
+ event.xclient.data.l[1] = atoms->NET_WM_STATE_DEMANDS_ATTENTION;
event.xclient.data.l[2] = 0;
event.xclient.data.l[3] = 1;
event.xclient.data.l[4] = 0;
diff --git a/pugl/detail/x11.h b/pugl/detail/x11.h
index 6671a95..54881af 100644
--- a/pugl/detail/x11.h
+++ b/pugl/detail/x11.h
@@ -23,8 +23,18 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
+typedef 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;
+} PuglX11Atoms;
+
struct PuglWorldInternalsImpl {
- Display* display;
+ Display* display;
+ PuglX11Atoms atoms;
};
struct PuglInternalsImpl {
@@ -35,13 +45,4 @@ struct PuglInternalsImpl {
XIM xim;
XIC xic;
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;
};