]> Pileus Git - ~andy/gtk/blobdiff - gdk/x11/gdkdisplay-x11.c
x11: Get rid of XSettingsClient object
[~andy/gtk] / gdk / x11 / gdkdisplay-x11.c
index ae4aaafb0f5cc47c79b1f2b9e14052b42994ed06..dd0a2de4e771b871856d69dbd1b291784ab2452f 100644 (file)
@@ -26,6 +26,7 @@
 #include "gdkdisplay.h"
 #include "gdkeventsource.h"
 #include "gdkeventtranslator.h"
+#include "gdkframeclockprivate.h"
 #include "gdkinternals.h"
 #include "gdkscreen.h"
 #include "gdkinternals.h"
@@ -685,7 +686,7 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
               window_impl->toplevel->frame_pending)
             {
               window_impl->toplevel->frame_pending = FALSE;
-              gdk_frame_clock_thaw (gdk_window_get_frame_clock (event->any.window));
+              _gdk_frame_clock_thaw (gdk_window_get_frame_clock (event->any.window));
             }
 
          if (toplevel)
@@ -763,6 +764,7 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
       if (!is_substructure && toplevel && display_x11->use_sync && toplevel->pending_counter_value != 0)
        {
          toplevel->configure_counter_value = toplevel->pending_counter_value;
+         toplevel->configure_counter_value_is_extended = toplevel->pending_counter_value_is_extended;
          toplevel->pending_counter_value = 0;
        }
 #endif
@@ -1060,16 +1062,15 @@ static GdkFrameTimings *
 find_frame_timings (GdkFrameClock *clock,
                     guint64        serial)
 {
-  GdkFrameHistory *history = gdk_frame_clock_get_history (clock);
   gint64 start_frame, end_frame, i;
 
-  start_frame = gdk_frame_history_get_start (history);
-  end_frame = gdk_frame_history_get_frame_counter (history);
+  start_frame = gdk_frame_clock_get_history_start (clock);
+  end_frame = gdk_frame_clock_get_frame_counter (clock);
   for (i = end_frame; i >= start_frame; i--)
     {
-      GdkFrameTimings *timings = gdk_frame_history_get_timings (history, i);
+      GdkFrameTimings *timings = gdk_frame_clock_get_timings (clock, i);
 
-      if (gdk_frame_timings_get_cookie (timings) == serial)
+      if (timings->cookie == serial)
         return timings;
     }
 
@@ -1086,7 +1087,7 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
   GdkDisplay *display;
   Atom atom;
 
-  if (!GDK_IS_X11_WINDOW (win))
+  if (!GDK_IS_X11_WINDOW (win) || GDK_WINDOW_DESTROYED (win))
     return GDK_FILTER_CONTINUE;
 
   if (xevent->type != ClientMessage)
@@ -1099,7 +1100,7 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
   if (xevent->xclient.message_type == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_FRAME_DRAWN"))
     {
       GdkWindowImplX11 *window_impl;
-      window_impl = GDK_WINDOW_IMPL_X11 (event->any.window->impl);
+      window_impl = GDK_WINDOW_IMPL_X11 (win->impl);
       if (window_impl->toplevel)
         {
           guint32 d0 = xevent->xclient.data.l[0];
@@ -1107,19 +1108,28 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
           guint32 d2 = xevent->xclient.data.l[2];
           guint32 d3 = xevent->xclient.data.l[3];
 
-          guint64 serial = ((guint64)d0 << 32) | d1;
+          guint64 serial = ((guint64)d1 << 32) | d0;
+          gint64 frame_drawn_time = ((guint64)d3 << 32) | d2;
+          gint64 refresh_interval, presentation_time;
 
-          GdkFrameClock *clock = gdk_window_get_frame_clock (event->any.window);
+          GdkFrameClock *clock = gdk_window_get_frame_clock (win);
           GdkFrameTimings *timings = find_frame_timings (clock, serial);
 
           if (timings)
-            gdk_frame_timings_set_drawn_time (timings, ((guint64)d2 << 32) | d3);
+            timings->drawn_time = frame_drawn_time;
 
           if (window_impl->toplevel->frame_pending)
             {
               window_impl->toplevel->frame_pending = FALSE;
-              gdk_frame_clock_thaw (clock);
+              _gdk_frame_clock_thaw (clock);
             }
+
+          gdk_frame_clock_get_refresh_info (clock,
+                                            frame_drawn_time,
+                                            &refresh_interval,
+                                            &presentation_time);
+          if (presentation_time != 0)
+            window_impl->toplevel->throttled_presentation_time = presentation_time + refresh_interval;
         }
 
       return GDK_FILTER_REMOVE;
@@ -1128,7 +1138,7 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
   if (xevent->xclient.message_type == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_FRAME_TIMINGS"))
     {
       GdkWindowImplX11 *window_impl;
-      window_impl = GDK_WINDOW_IMPL_X11 (event->any.window->impl);
+      window_impl = GDK_WINDOW_IMPL_X11 (win->impl);
       if (window_impl->toplevel)
         {
           guint32 d0 = xevent->xclient.data.l[0];
@@ -1136,25 +1146,27 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
           guint32 d2 = xevent->xclient.data.l[2];
           guint32 d3 = xevent->xclient.data.l[3];
 
-          guint64 serial = ((guint64)d0 << 32) | d1;
+          guint64 serial = ((guint64)d1 << 32) | d0;
 
-          GdkFrameClock *clock = gdk_window_get_frame_clock (event->any.window);
+          GdkFrameClock *clock = gdk_window_get_frame_clock (win);
           GdkFrameTimings *timings = find_frame_timings (clock, serial);
 
           if (timings)
             {
-              gint64 drawn_time = gdk_frame_timings_get_drawn_time (timings);
               gint32 presentation_time_offset = (gint32)d2;
               gint32 refresh_interval = d3;
 
-              if (drawn_time && presentation_time_offset)
-                gdk_frame_timings_set_presentation_time (timings,
-                                                         drawn_time + presentation_time_offset);
+              if (timings->drawn_time && presentation_time_offset)
+                timings->presentation_time = timings->drawn_time + presentation_time_offset;
 
               if (refresh_interval)
-                gdk_frame_timings_set_refresh_interval (timings, refresh_interval);
+                timings->refresh_interval = refresh_interval;
 
-              gdk_frame_timings_set_complete (timings, TRUE);
+              timings->complete = TRUE;
+#ifdef G_ENABLE_DEBUG
+              if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0)
+                _gdk_frame_clock_debug_print_timings (clock, timings);
+#endif /* G_ENABLE_DEBUG */
             }
         }
     }
@@ -1186,7 +1198,7 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
     }
   else if (atom == gdk_x11_get_xatom_by_name_for_display (display, "WM_TAKE_FOCUS"))
     {
-      GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (event->any.window);
+      GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (win);
 
       /* There is no way of knowing reliably whether we are viewable;
        * so trap errors asynchronously around the XSetInputFocus call
@@ -1220,11 +1232,12 @@ _gdk_wm_protocols_filter (GdkXEvent *xev,
   else if (atom == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_SYNC_REQUEST") &&
           GDK_X11_DISPLAY (display)->use_sync)
     {
-      GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (event->any.window);
+      GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (win);
       if (toplevel)
        {
 #ifdef HAVE_XSYNC
          toplevel->pending_counter_value = xevent->xclient.data.l[2] + ((gint64)xevent->xclient.data.l[3] << 32);
+         toplevel->pending_counter_value_is_extended = xevent->xclient.data.l[4] != 0;
 #endif
        }
       return GDK_FILTER_REMOVE;
@@ -1381,7 +1394,7 @@ _gdk_x11_display_open (const gchar *display_name)
    * structures in places
    */
   for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
-    _gdk_x11_screen_init_events (display_x11->screens[i]);
+    _gdk_x11_xsettings_init (GDK_X11_SCREEN (display_x11->screens[i]));
 
   /*set the default screen */
   display_x11->default_screen = display_x11->screens[DefaultScreen (display_x11->xdisplay)];