freetype-commit
[Top][All Lists]
Advanced

[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 );



reply via email to

[Prev in Thread] Current Thread [Next in Thread]