summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkgeometry-x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdk/x11/gdkgeometry-x11.c')
-rw-r--r--gdk/x11/gdkgeometry-x11.c181
1 files changed, 0 insertions, 181 deletions
diff --git a/gdk/x11/gdkgeometry-x11.c b/gdk/x11/gdkgeometry-x11.c
index 268f852fc7..74601ebf0a 100644
--- a/gdk/x11/gdkgeometry-x11.c
+++ b/gdk/x11/gdkgeometry-x11.c
@@ -17,196 +17,15 @@
#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);