[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[freetype2-demos] master 6b4f6bc: [graph/x11] Ignore redundant Expose fr
From: |
Alexei Podtelezhnikov |
Subject: |
[freetype2-demos] master 6b4f6bc: [graph/x11] Ignore redundant Expose from resizing. |
Date: |
Wed, 17 Jun 2020 21:48:59 -0400 (EDT) |
branch: master
commit 6b4f6bc4a6d4ff2ffd2ea3755b2adc5c85a639a0
Author: Alexei Podtelezhnikov <apodtele@gmail.com>
Commit: Alexei Podtelezhnikov <apodtele@gmail.com>
[graph/x11] Ignore redundant Expose from resizing.
* graph/x11/grx11.c (gr_x11_surface_init): Enable VisibilityNotify.
(gr_x11_surface_listen_event): Track recent Expose events and ignore
redundant ones.
---
ChangeLog | 8 +++++++
graph/x11/grx11.c | 65 +++++++++++++++++++++++++++++++++++++++----------------
2 files changed, 54 insertions(+), 19 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 00a068a..64e4e2f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2020-06-17 Alexei Podtelezhnikov <apodtele@gmail.com>
+
+ [graph/x11] Ignore redundant Expose from resizing.
+
+ * graph/x11/grx11.c (gr_x11_surface_init): Enable VisibilityNotify.
+ (gr_x11_surface_listen_event): Track recent Expose events and ignore
+ redundant ones.
+
2020-06-16 Alexei Podtelezhnikov <apodtele@gmail.com>
[graph/x11] Miscellaneous clean-ups.
diff --git a/graph/x11/grx11.c b/graph/x11/grx11.c
index abc7df1..c116581 100644
--- a/graph/x11/grx11.c
+++ b/graph/x11/grx11.c
@@ -1162,17 +1162,21 @@ typedef unsigned long uint32;
int event_mask,
grEvent* grevent )
{
- XEvent x_event;
- KeySym key;
- Display* display = surface->display;
+ Display* display = surface->display;
+ XEvent x_event;
+ XExposeEvent exposed;
+ KeySym key;
- int num;
- grKey grkey;
+ int num;
+ grKey grkey;
/* XXX: for now, ignore the event mask, and only exit when */
/* a key is pressed */
(void)event_mask;
+ /* reset exposed area */
+ exposed.x = exposed.y = exposed.width = exposed.height = 0;
+
XDefineCursor( display, surface->win, x11dev.idle );
while ( surface->key_cursor >= surface->key_number )
@@ -1234,20 +1238,42 @@ typedef unsigned long uint32;
}
break;
+ case VisibilityNotify:
+ /* reset exposed area */
+ exposed.x = exposed.y = exposed.width = exposed.height = 0;
+ break;
+
case Expose:
- LOG(( "Expose (%lu): %dx%d\n", x_event.xexpose.serial,
- x_event.xexpose.width, x_event.xexpose.height ));
-
- XPutImage( surface->display,
- surface->win,
- surface->gc,
- surface->ximage,
- x_event.xexpose.x,
- x_event.xexpose.y,
- x_event.xexpose.x,
- x_event.xexpose.y,
- (unsigned int)x_event.xexpose.width,
- (unsigned int)x_event.xexpose.height );
+ LOG(( "Expose (%lu,%d): %dx%d ",
+ x_event.xexpose.serial, x_event.xexpose.count,
+ x_event.xexpose.width, x_event.xexpose.height ));
+
+ /* paint only newly exposed areas */
+ if ( x_event.xexpose.x < exposed.x ||
+ x_event.xexpose.y < exposed.y ||
+ x_event.xexpose.x + x_event.xexpose.width
+ > exposed.x + exposed.width ||
+ x_event.xexpose.y + x_event.xexpose.height
+ > exposed.y + exposed.height )
+ {
+ XPutImage( surface->display,
+ surface->win,
+ surface->gc,
+ surface->ximage,
+ x_event.xexpose.x,
+ x_event.xexpose.y,
+ x_event.xexpose.x,
+ x_event.xexpose.y,
+ (unsigned int)x_event.xexpose.width,
+ (unsigned int)x_event.xexpose.height );
+
+ exposed = x_event.xexpose;
+ LOG(( "painted\n" ));
+ }
+ else
+ {
+ LOG(( "ignored\n" ));
+ }
break;
/* You should add more cases to handle mouse events, etc. */
@@ -1342,7 +1368,8 @@ typedef unsigned long uint32;
xswa.cursor = x11dev.busy;
- xswa.event_mask = ExposureMask | KeyPressMask | StructureNotifyMask ;
+ xswa.event_mask = ExposureMask | VisibilityChangeMask |
+ KeyPressMask | StructureNotifyMask ;
if ( surface->visual == DefaultVisual( display, screen ) )
surface->colormap = DefaultColormap( display, screen );
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] master 6b4f6bc: [graph/x11] Ignore redundant Expose from resizing.,
Alexei Podtelezhnikov <=