surface: Remove queue_antiexpose()
authorBenjamin Otte <otte@redhat.com>
Tue, 20 Mar 2018 21:53:13 +0000 (22:53 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Mar 2018 23:43:28 +0000 (00:43 +0100)
... and its implementation in the X11 backend.

GDK does lots of work trying to reduce the region in expose events
so that when the server sends multiple expose events, touching the
same area we can make sure to only redraw stuff once. However:
(1) this is only relevant of there's tons of delay and multiple
    expose events get sent
(2) we coalesce multiple events into a single expose event anyway
(3) we do this on the frame clock

But most importantly:
(4) Since the invention of compositing, servers caches all contents
    anyway

gdk/gdksurface.c
gdk/gdksurfaceimpl.h
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkdisplay-x11.h
gdk/x11/gdkgeometry-x11.c
gdk/x11/gdkprivate-x11.h
gdk/x11/gdksurface-x11.c

index 365d715fb5c4c7ec6a8c58d272df099b613c528a..84a4c86352d7a5a2810d742af1c4ecb6d7434746 100644 (file)
@@ -2415,9 +2415,6 @@ gdk_surface_process_updates_internal (GdkSurface *surface)
          /* Clip to part visible in impl surface */
          cairo_region_intersect (expose_region, surface->clip_region);
 
-          if (impl_class->queue_antiexpose)
-            impl_class->queue_antiexpose (surface, expose_region);
-
           impl_class->process_updates_recurse (surface, expose_region);
 
           gdk_surface_append_old_updated_area (surface, surface->active_update_area);
index 4617a7d2fb96488331e2a59332e3ebac45866b82..9eb005424c859947e0b09795a5746114fba997b7 100644 (file)
@@ -112,13 +112,6 @@ struct _GdkSurfaceImplClass
                                               gint             offset_x,
                                               gint             offset_y);
 
-  /* Called before processing updates for a surface. This gives the windowing
-   * layer a chance to save the region for later use in avoiding duplicate
-   * exposes.
-   */
-  void     (* queue_antiexpose)     (GdkSurface       *surface,
-                                     cairo_region_t  *update_area);
-
 /* Called to do the windowing system specific part of gdk_surface_destroy(),
  *
  * surface: The window being destroyed
index 4432a3efe4ac9905da629a1c8c90410ecaa9735c..844c14f02f38f4883598e807680f42ff7c159767 100644 (file)
@@ -1966,9 +1966,6 @@ gdk_x11_display_finalize (GObject *object)
 
   _gdk_x11_cursor_display_finalize (GDK_DISPLAY (display_x11));
 
-  /* Empty the event queue */
-  _gdk_x11_display_free_translate_queue (GDK_DISPLAY (display_x11));
-
   /* Get rid of pending streams */
   g_slist_free_full (display_x11->streams, g_object_unref);
 
index 0625c7d395c22d6c47e55140afeb849398659cda..7e636a33f834c2b1d301e9458c279d3c25ef1bda 100644 (file)
@@ -105,9 +105,6 @@ struct _GdkX11Display
   /* X ID hashtable */
   GHashTable *xid_ht;
 
-  /* translation queue */
-  GQueue *translate_queue;
-
   /* streams reading selections */
   GSList *streams;
 
index 268f852fc7e7f95c96abdfb60e260e3c9a408b1b..74601ebf0a8e597733a847a7f4f4dcbbb5bfc16d 100644 (file)
 
 #include "config.h"
 
-#include "gdkinternals.h"
-#include "gdkrectangle.h"
-#include "gdkprivate-x11.h"
-#include "gdkscreen-x11.h"
-#include "gdkdisplay-x11.h"
 #include "gdksurface-x11.h"
 
 
-typedef struct _GdkSurfaceQueueItem GdkSurfaceQueueItem;
-typedef struct _GdkSurfaceParentPos GdkSurfaceParentPos;
-
-struct _GdkSurfaceQueueItem
-{
-  GdkSurface *surface;
-  gulong serial;
-  cairo_region_t *antiexpose_area;
-};
-
-static Bool
-expose_serial_predicate (Display *xdisplay,
-                        XEvent  *xev,
-                        XPointer arg)
-{
-  gulong *serial = (gulong *)arg;
-
-  if (xev->xany.type == Expose || xev->xany.type == GraphicsExpose)
-    *serial = MIN (*serial, xev->xany.serial);
-
-  return False;
-}
-
-/* Find oldest possible serial for an outstanding expose event
- */
-static gulong
-find_current_serial (Display *xdisplay)
-{
-  XEvent xev;
-  gulong serial = NextRequest (xdisplay);
-  
-  XSync (xdisplay, False);
-
-  XCheckIfEvent (xdisplay, &xev, expose_serial_predicate, (XPointer)&serial);
-
-  return serial;
-}
-
-static void
-queue_delete_link (GQueue *queue,
-                  GList  *link)
-{
-  if (queue->tail == link)
-    queue->tail = link->prev;
-  
-  queue->head = g_list_remove_link (queue->head, link);
-  g_list_free_1 (link);
-  queue->length--;
-}
-
-static void
-queue_item_free (GdkSurfaceQueueItem *item)
-{
-  if (item->surface)
-    {
-      g_object_remove_weak_pointer (G_OBJECT (item->surface),
-                                   (gpointer *)&(item->surface));
-    }
-  
-  cairo_region_destroy (item->antiexpose_area);
-  g_free (item);
-}
-
-void
-_gdk_x11_display_free_translate_queue (GdkDisplay *display)
-{
-  GdkX11Display *display_x11 = GDK_X11_DISPLAY (display);
-
-  if (display_x11->translate_queue)
-    {
-      g_queue_foreach (display_x11->translate_queue, (GFunc)queue_item_free, NULL);
-      g_queue_free (display_x11->translate_queue);
-      display_x11->translate_queue = NULL;
-    }
-}
-
-static void
-gdk_surface_queue (GdkSurface          *surface,
-                 GdkSurfaceQueueItem *new_item)
-{
-  GdkX11Display *display_x11 = GDK_X11_DISPLAY (GDK_SURFACE_DISPLAY (surface));
-  
-  if (!display_x11->translate_queue)
-    display_x11->translate_queue = g_queue_new ();
-
-  /* Keep length of queue finite by, if it grows too long,
-   * figuring out the latest relevant serial and discarding
-   * irrelevant queue items.
-   */
-  if (display_x11->translate_queue->length >= 64)
-    {
-      gulong serial = find_current_serial (GDK_SURFACE_XDISPLAY (surface));
-      GList *tmp_list = display_x11->translate_queue->head;
-      
-      while (tmp_list)
-       {
-         GdkSurfaceQueueItem *item = tmp_list->data;
-         GList *next = tmp_list->next;
-         
-         /* an overflow-safe (item->serial < serial) */
-         if (item->serial - serial > (gulong) G_MAXLONG)
-           {
-             queue_delete_link (display_x11->translate_queue, tmp_list);
-             queue_item_free (item);
-           }
-
-         tmp_list = next;
-       }
-    }
-
-  /* Catch the case where someone isn't processing events and there
-   * is an event stuck in the event queue with an old serial:
-   * If we can't reduce the queue length by the above method,
-   * discard anti-expose items. (We can't discard translate
-   * items 
-   */
-  if (display_x11->translate_queue->length >= 64)
-    {
-      GList *tmp_list = display_x11->translate_queue->head;
-      
-      while (tmp_list)
-       {
-         GdkSurfaceQueueItem *item = tmp_list->data;
-         GList *next = tmp_list->next;
-         
-         queue_delete_link (display_x11->translate_queue, tmp_list);
-         queue_item_free (item);
-
-         tmp_list = next;
-       }
-    }
-
-  new_item->surface = surface;
-  new_item->serial = NextRequest (GDK_SURFACE_XDISPLAY (surface));
-  
-  g_object_add_weak_pointer (G_OBJECT (surface),
-                            (gpointer *)&(new_item->surface));
-
-  g_queue_push_tail (display_x11->translate_queue, new_item);
-}
-
-void
-_gdk_x11_surface_queue_antiexpose (GdkSurface *surface,
-                                 cairo_region_t *area)
-{
-  GdkSurfaceQueueItem *item = g_new (GdkSurfaceQueueItem, 1);
-  item->antiexpose_area = cairo_region_reference (area);
-
-  gdk_surface_queue (surface, item);
-}
-
 void
 _gdk_x11_surface_process_expose (GdkSurface    *surface,
                                 gulong        serial,
                                 GdkRectangle *area)
 {
   cairo_region_t *invalidate_region = cairo_region_create_rectangle (area);
-  GdkX11Display *display_x11 = GDK_X11_DISPLAY (GDK_SURFACE_DISPLAY (surface));
-
-  if (display_x11->translate_queue)
-    {
-      GList *tmp_list = display_x11->translate_queue->head;
-
-      while (tmp_list)
-        {
-          GdkSurfaceQueueItem *item = tmp_list->data;
-          GList *next = tmp_list->next;
-
-          /* an overflow-safe (serial < item->serial) */
-          if (serial - item->serial > (gulong) G_MAXLONG)
-            {
-              if (item->surface == surface)
-               cairo_region_subtract (invalidate_region, item->antiexpose_area);
-            }
-          else
-            {
-              queue_delete_link (display_x11->translate_queue, tmp_list);
-              queue_item_free (item);
-            }
-          tmp_list = next;
-        }
-    }
 
   if (!cairo_region_is_empty (invalidate_region))
     _gdk_surface_invalidate_for_expose (surface, invalidate_region);
index c55b0b3fc9060a2e386ca1681f64c0ea8dc5b671..e89e64732dfb218607f000d88682611a37ef45c3 100644 (file)
@@ -83,15 +83,6 @@ void _gdk_x11_surface_process_expose    (GdkSurface     *window,
                                         gulong         serial,
                                         GdkRectangle  *area);
 
-void     _gdk_x11_surface_queue_antiexpose  (GdkSurface *window,
-                                            cairo_region_t *area);
-void     _gdk_x11_surface_translate         (GdkSurface *window,
-                                            cairo_region_t *area,
-                                            gint       dx,
-                                            gint       dy);
-
-void     _gdk_x11_display_free_translate_queue (GdkDisplay *display);
-
 cairo_region_t* _gdk_x11_xwindow_get_shape  (Display *xdisplay,
                                              Window   window,
                                              gint     scale,
index 17a51c3fa67428e7399f7e191c8564cb199fa11f..ef914c19301f391866240d059f3ae49f758612b7 100644 (file)
@@ -4894,7 +4894,6 @@ gdk_surface_impl_x11_class_init (GdkSurfaceImplX11Class *klass)
   impl_class->get_device_state = gdk_surface_x11_get_device_state;
   impl_class->shape_combine_region = gdk_surface_x11_shape_combine_region;
   impl_class->input_shape_combine_region = gdk_surface_x11_input_shape_combine_region;
-  impl_class->queue_antiexpose = _gdk_x11_surface_queue_antiexpose;
   impl_class->destroy = gdk_x11_surface_destroy;
   impl_class->beep = gdk_x11_surface_beep;