aboutsummaryrefslogtreecommitdiffstats
path: root/pugl/detail/x11.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2019-11-03 19:15:05 +0100
committerDavid Robillard <d@drobilla.net>2019-11-03 21:03:18 +0100
commitbe838db18af13390cb9f705d36ab83396d2dd1e6 (patch)
treeb79ae242205607374132f3f9463c35783485d67e /pugl/detail/x11.c
parentd9239872c71d117f78ce6c109cd9ab42e2d80c6b (diff)
downloadpugl-be838db18af13390cb9f705d36ab83396d2dd1e6.tar.gz
pugl-be838db18af13390cb9f705d36ab83396d2dd1e6.tar.bz2
pugl-be838db18af13390cb9f705d36ab83396d2dd1e6.zip
Remove redisplay flag and add puglPostRedisplayRect()
Diffstat (limited to 'pugl/detail/x11.c')
-rw-r--r--pugl/detail/x11.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/pugl/detail/x11.c b/pugl/detail/x11.c
index 871c16b..37280cd 100644
--- a/pugl/detail/x11.c
+++ b/pugl/detail/x11.c
@@ -38,6 +38,7 @@
#include <sys/time.h>
#include <limits.h>
+#include <math.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
@@ -615,16 +616,6 @@ mergeExposeEvents(PuglEvent* dst, const PuglEvent* src)
}
static void
-sendRedisplayEvent(PuglView* view)
-{
- XExposeEvent ev = { Expose, 0, True, view->impl->display, view->impl->win,
- 0, 0, (int)view->frame.width, (int)view->frame.height,
- 0 };
-
- XSendEvent(view->impl->display, view->impl->win, False, 0, (XEvent*)&ev);
-}
-
-static void
flushPendingConfigure(PuglView* view)
{
PuglEvent* const configure = &view->impl->pendingConfigure;
@@ -649,14 +640,6 @@ puglDispatchEvents(PuglWorld* world)
{
const PuglX11Atoms* const atoms = &world->impl->atoms;
- // Send expose events for any views with pending redisplays
- for (size_t i = 0; i < world->numViews; ++i) {
- if (world->views[i]->redisplay) {
- sendRedisplayEvent(world->views[i]);
- world->views[i]->redisplay = false;
- }
- }
-
// Flush just once at the start to fill event queue
Display* display = world->impl->display;
XFlush(display);
@@ -806,7 +789,27 @@ puglGetTime(const PuglWorld* world)
PuglStatus
puglPostRedisplay(PuglView* view)
{
- view->redisplay = true;
+ const PuglRect rect = { 0, 0, view->frame.width, view->frame.height };
+
+ return puglPostRedisplayRect(view, rect);
+}
+
+PuglStatus
+puglPostRedisplayRect(PuglView* view, PuglRect rect)
+{
+ const int x = (int)floor(rect.x);
+ const int y = (int)floor(rect.y);
+ const int w = (int)ceil(rect.x + rect.width) - x;
+ const int h = (int)ceil(rect.y + rect.height) - y;
+
+ XExposeEvent ev = {Expose, 0, True,
+ view->impl->display, view->impl->win,
+ x, y,
+ w, h,
+ 0};
+
+ XSendEvent(view->impl->display, view->impl->win, False, 0, (XEvent*)&ev);
+
return PUGL_SUCCESS;
}