From be838db18af13390cb9f705d36ab83396d2dd1e6 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 3 Nov 2019 19:15:05 +0100 Subject: Remove redisplay flag and add puglPostRedisplayRect() --- pugl/detail/mac.m | 9 +++++++++ pugl/detail/types.h | 1 - pugl/detail/win.c | 24 +++++++++++++++--------- pugl/detail/x11.c | 41 ++++++++++++++++++++++------------------- 4 files changed, 46 insertions(+), 29 deletions(-) (limited to 'pugl/detail') diff --git a/pugl/detail/mac.m b/pugl/detail/mac.m index f530c2e..9378d6e 100644 --- a/pugl/detail/mac.m +++ b/pugl/detail/mac.m @@ -957,6 +957,15 @@ puglPostRedisplay(PuglView* view) return PUGL_SUCCESS; } +PuglStatus +puglPostRedisplayRect(PuglView* view, const PuglRect rect) +{ + [view->impl->drawView setNeedsDisplayInRect: + CGRectMake(rect.x, rect.y, rect.width, rect.height)]; + + return PUGL_SUCCESS; +} + PuglNativeWindow puglGetNativeWindow(PuglView* view) { diff --git a/pugl/detail/types.h b/pugl/detail/types.h index d018be5..7b2934f 100644 --- a/pugl/detail/types.h +++ b/pugl/detail/types.h @@ -71,7 +71,6 @@ struct PuglViewImpl { int maxAspectX; int maxAspectY; bool visible; - bool redisplay; }; /** Cross-platform world definition. */ diff --git a/pugl/detail/win.c b/pugl/detail/win.c index ee7eb01..d7026ae 100644 --- a/pugl/detail/win.c +++ b/pugl/detail/win.c @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -719,15 +720,8 @@ puglWaitForEvent(PuglView* PUGL_UNUSED(view)) } PUGL_API PuglStatus -puglDispatchEvents(PuglWorld* world) +puglDispatchEvents(PuglWorld* PUGL_UNUSED(world)) { - for (size_t i = 0; i < world->numViews; ++i) { - if (world->views[i]->redisplay) { - UpdateWindow(world->views[i]->impl->hwnd); - world->views[i]->redisplay = false; - } - } - /* Windows has no facility to process only currently queued messages, which causes the event loop to run forever in cases like mouse movement where the queue is constantly being filled with new messages. To work around @@ -795,7 +789,19 @@ PuglStatus puglPostRedisplay(PuglView* view) { InvalidateRect(view->impl->hwnd, NULL, false); - view->redisplay = true; + return PUGL_SUCCESS; +} + +PuglStatus +puglPostRedisplayRect(PuglView* view, const PuglRect rect) +{ + const RECT r = {(long)floor(rect.x), + (long)floor(rect.y), + (long)ceil(rect.x + rect.width), + (long)ceil(rect.y + rect.height)}; + + InvalidateRect(view->impl->hwnd, &r, false); + return PUGL_SUCCESS; } 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 #include +#include #include #include #include @@ -614,16 +615,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) { @@ -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; } -- cgit v1.2.1