diff options
author | David Robillard <d@drobilla.net> | 2020-03-09 21:49:58 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-03-09 22:17:44 +0100 |
commit | 9be7bab7cf3c63cafa07e5a70d6c59559ffdc1de (patch) | |
tree | db882f9d08f5b91b31271cd2844cae11f64bf1dd /pugl/detail/x11.c | |
parent | a303b9374dbb9eeef1a31dcad3cb0a4e9b7fd5a3 (diff) | |
download | pugl-9be7bab7cf3c63cafa07e5a70d6c59559ffdc1de.tar.gz pugl-9be7bab7cf3c63cafa07e5a70d6c59559ffdc1de.tar.bz2 pugl-9be7bab7cf3c63cafa07e5a70d6c59559ffdc1de.zip |
Add PuglEventClient and puglSendEvent()
This event makes it possible to send an arbitrary event to a view, which is
useful for many things. In particular, this method of communication with views
will wake up the event loop, unlike hacks in applications that share data in
some other way.
Diffstat (limited to 'pugl/detail/x11.c')
-rw-r--r-- | pugl/detail/x11.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c index 9c9fdfa..ae00f73 100644 --- a/pugl/detail/x11.c +++ b/pugl/detail/x11.c @@ -84,6 +84,7 @@ puglInitWorldInternals(void) 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.PUGL_CLIENT_MSG = XInternAtom(display, "_PUGL_CLIENT_MSG", 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 = @@ -429,6 +430,10 @@ translateEvent(PuglView* view, XEvent xevent) if (protocol == atoms->WM_DELETE_WINDOW) { event.type = PUGL_CLOSE; } + } else if (xevent.xclient.message_type == atoms->PUGL_CLIENT_MSG) { + event.type = PUGL_CLIENT; + event.client.data1 = xevent.xclient.data.l[0]; + event.client.data2 = xevent.xclient.data.l[1]; } break; case VisibilityNotify: @@ -613,6 +618,18 @@ puglEventToX(PuglView* view, const PuglEvent* event) break; } + case PUGL_CLIENT: + xev.xclient.type = ClientMessage; + xev.xclient.serial = 0; + xev.xclient.send_event = True; + xev.xclient.display = view->impl->display; + xev.xclient.window = view->impl->win; + xev.xclient.message_type = view->world->impl->atoms.PUGL_CLIENT_MSG; + xev.xclient.format = 32; + xev.xclient.data.l[0] = event->client.data1; + xev.xclient.data.l[1] = event->client.data2; + break; + default: break; } @@ -620,7 +637,7 @@ puglEventToX(PuglView* view, const PuglEvent* event) return xev; } -static PuglStatus +PuglStatus puglSendEvent(PuglView* view, const PuglEvent* event) { XEvent xev = puglEventToX(view, event); |