diff options
author | David Robillard <d@drobilla.net> | 2020-03-16 16:13:50 +0100 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-03-16 16:13:50 +0100 |
commit | 67b7970697011bbd26fbf4175eb2e5ebd1b00939 (patch) | |
tree | 4c76fdb48e2280b3caa81b3647b3ea22989b7e12 | |
parent | ab7df6c8f3dfd820331ef96c217c0fc477972835 (diff) |
Factor out dispatching configure events in the drawing context
The updates here need to happen whenever a configure is dispatched, even
outside puglDispatchEvent(). This removes the last remaining direct calls to
the event callback so the common implementation can always do the right thing.
-rw-r--r-- | pugl/detail/implementation.c | 25 | ||||
-rw-r--r-- | pugl/detail/implementation.h | 3 | ||||
-rw-r--r-- | pugl/detail/mac.m | 2 | ||||
-rw-r--r-- | pugl/detail/x11.c | 4 |
4 files changed, 25 insertions, 9 deletions
diff --git a/pugl/detail/implementation.c b/pugl/detail/implementation.c index d7e7058..4e1b3de 100644 --- a/pugl/detail/implementation.c +++ b/pugl/detail/implementation.c @@ -388,6 +388,24 @@ puglDispatchSimpleEvent(PuglView* view, const PuglEventType type) } void +puglDispatchEventInContext(PuglView* view, const PuglEvent* event) +{ + if (event->type == PUGL_CONFIGURE) { + view->frame.x = event->configure.x; + view->frame.y = event->configure.y; + view->frame.width = event->configure.width; + view->frame.height = event->configure.height; + + if (puglMustConfigure(view, &event->configure)) { + view->eventFunc(view, event); + view->configured = true; + } + } else { + view->eventFunc(view, event); + } +} + +void puglDispatchEvent(PuglView* view, const PuglEvent* event) { switch (event->type) { @@ -401,13 +419,8 @@ puglDispatchEvent(PuglView* view, const PuglEvent* event) break; case PUGL_CONFIGURE: if (puglMustConfigure(view, &event->configure)) { - view->frame.x = event->configure.x; - view->frame.y = event->configure.y; - view->frame.width = event->configure.width; - view->frame.height = event->configure.height; - view->backend->enter(view, NULL); - view->eventFunc(view, event); + puglDispatchEventInContext(view, event); view->backend->leave(view, NULL); } break; diff --git a/pugl/detail/implementation.h b/pugl/detail/implementation.h index 2ad3f65..bcecd85 100644 --- a/pugl/detail/implementation.h +++ b/pugl/detail/implementation.h @@ -54,6 +54,9 @@ uint32_t puglDecodeUTF8(const uint8_t* buf); /** Dispatch an event with a simple `type` to `view`. */ void puglDispatchSimpleEvent(PuglView* view, PuglEventType type); +/** Dispatch `event` to `view` while already in the graphics context. */ +void puglDispatchEventInContext(PuglView* view, const PuglEvent* event); + /** Dispatch `event` to `view`, entering graphics context if necessary. */ void puglDispatchEvent(PuglView* view, const PuglEvent* event); diff --git a/pugl/detail/mac.m b/pugl/detail/mac.m index 2ec4345..6b02c75 100644 --- a/pugl/detail/mac.m +++ b/pugl/detail/mac.m @@ -969,7 +969,7 @@ dispatchClientEvent(PuglWorld* world, NSEvent* ev) [ev data1], [ev data2]}; - view->eventFunc(view, (const PuglEvent*)&event); + puglDispatchEvent(view, (const PuglEvent*)&event); } } } diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c index 5fc769d..72dcf59 100644 --- a/pugl/detail/x11.c +++ b/pugl/detail/x11.c @@ -755,8 +755,8 @@ flushExposures(PuglWorld* world) if (configure->type || expose->type) { view->backend->enter(view, expose->type ? &expose->expose : NULL); - view->eventFunc(view, configure); - view->eventFunc(view, expose); + puglDispatchEventInContext(view, configure); + puglDispatchEventInContext(view, expose); view->backend->leave(view, expose->type ? &expose->expose : NULL); configure->type = 0; |