[clutter/multi-backend: 8/22] Remove the X11-specific bit in ClutterStageCogl



commit 30de02cb7eb18a730e88c4a3cbdee1c19559b36b
Author: Emmanuele Bassi <ebassi linux intel com>
Date:   Fri Sep 30 13:58:40 2011 +0100

    Remove the X11-specific bit in ClutterStageCogl
    
    Let's use a new virtual function in ClutterStageWindow to check whether
    a platform-specific implementation does support clipped redraws.

 clutter/clutter-stage-window.c    |   14 ++++++++++++++
 clutter/clutter-stage-window.h    |    4 ++++
 clutter/cogl/clutter-stage-cogl.c |   21 +++------------------
 clutter/gdk/clutter-stage-gdk.c   |   24 ++++++++++--------------
 clutter/x11/clutter-stage-x11.c   |   13 +++++++++++++
 5 files changed, 44 insertions(+), 32 deletions(-)
---
diff --git a/clutter/clutter-stage-window.c b/clutter/clutter-stage-window.c
index 1b61a1d..7ca171e 100644
--- a/clutter/clutter-stage-window.c
+++ b/clutter/clutter-stage-window.c
@@ -234,3 +234,17 @@ _clutter_stage_window_get_active_framebuffer (ClutterStageWindow *window)
   else
     return NULL;
 }
+
+gboolean
+_clutter_stage_window_can_clip_redraws (ClutterStageWindow *window)
+{
+  ClutterStageWindowIface *iface;
+
+  g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
+
+  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
+  if (iface->can_clip_redraws != NULL)
+    return iface->can_clip_redraws (window);
+
+  return FALSE;
+}
diff --git a/clutter/clutter-stage-window.h b/clutter/clutter-stage-window.h
index 8fa0ddf..a715ecd 100644
--- a/clutter/clutter-stage-window.h
+++ b/clutter/clutter-stage-window.h
@@ -75,6 +75,8 @@ struct _ClutterStageWindowIface
   void              (* redraw)                  (ClutterStageWindow *stage_window);
 
   CoglFramebuffer  *(* get_active_framebuffer)  (ClutterStageWindow *stage_window);
+
+  gboolean          (* can_clip_redraws)        (ClutterStageWindow *stage_window);
 };
 
 GType clutter_stage_window_get_type (void) G_GNUC_CONST;
@@ -118,6 +120,8 @@ void              _clutter_stage_window_redraw                  (ClutterStageWin
 
 CoglFramebuffer  *_clutter_stage_window_get_active_framebuffer  (ClutterStageWindow *window);
 
+gboolean          _clutter_stage_window_can_clip_redraws        (ClutterStageWindow *window);
+
 G_END_DECLS
 
 #endif /* __CLUTTER_STAGE_WINDOW_H__ */
diff --git a/clutter/cogl/clutter-stage-cogl.c b/clutter/cogl/clutter-stage-cogl.c
index 9f6ea6c..8080144 100644
--- a/clutter/cogl/clutter-stage-cogl.c
+++ b/clutter/cogl/clutter-stage-cogl.c
@@ -45,11 +45,6 @@
 #include "clutter-stage-private.h"
 #include "clutter-util.h"
 
-#ifdef CLUTTER_WINDOWING_X11
-/* FIXME: needed for a small check in redraw(), needs to be moved */
-#include "x11/clutter-stage-x11.h"
-#endif
-
 static void clutter_stage_window_iface_init (ClutterStageWindowIface *iface);
 
 G_DEFINE_TYPE_WITH_CODE (ClutterStageCogl,
@@ -354,25 +349,15 @@ clutter_stage_cogl_redraw (ClutterStageWindow *stage_window)
   CLUTTER_TIMER_START (_clutter_uprof_context, painting_timer);
 
   may_use_clipped_redraw = FALSE;
-  if (G_LIKELY (backend_cogl->can_blit_sub_buffer) &&
+  if (_clutter_stage_window_can_clip_redraws (stage_window) &&
+      G_LIKELY (backend_cogl->can_blit_sub_buffer) &&
       /* NB: a zero width redraw clip == full stage redraw */
       stage_cogl->bounding_redraw_clip.width != 0 &&
       /* some drivers struggle to get going and produce some junk
        * frames when starting up... */
       G_LIKELY (stage_cogl->frame_count > 3))
     {
-#if defined(CLUTTER_WINDOWING_X11)
-      /* FIXME - move this to a StageWindow vfunc */
-
-      /* While resizing a window clipped redraws are disabled to avoid
-       * artefacts. See clutter-event-x11.c:event_translate for a
-       * detailed explanation */
-      if (CLUTTER_IS_STAGE_X11 (stage_cogl) &&
-          (CLUTTER_STAGE_X11 (stage_cogl)->clipped_redraws_cool_off == 0))
-        {
-          may_use_clipped_redraw = TRUE;
-        }
-#endif
+      may_use_clipped_redraw = TRUE;
     }
 
   if (may_use_clipped_redraw &&
diff --git a/clutter/gdk/clutter-stage-gdk.c b/clutter/gdk/clutter-stage-gdk.c
index db25a64..28c95e3 100644
--- a/clutter/gdk/clutter-stage-gdk.c
+++ b/clutter/gdk/clutter-stage-gdk.c
@@ -406,6 +406,12 @@ clutter_stage_gdk_hide (ClutterStageWindow *stage_window)
   gdk_window_hide (stage_gdk->window);
 }
 
+static gboolean
+clutter_stage_gdk_can_clip_redraws (ClutterStageWindow *stage_window)
+{
+  return TRUE;
+}
+
 static void
 clutter_stage_gdk_dispose (GObject *gobject)
 {
@@ -461,6 +467,7 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
   iface->get_geometry = clutter_stage_gdk_get_geometry;
   iface->realize = clutter_stage_gdk_realize;
   iface->unrealize = clutter_stage_gdk_unrealize;
+  iface->can_clip_redraws = clutter_stage_gdk_can_clip_redraws;
 }
 
 /**
@@ -471,7 +478,7 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
  *
  * Return value: (transfer none): A GdkWindow* for the stage window.
  *
- * Since: 0.4
+ * Since: 1.10
  */
 GdkWindow *
 clutter_gdk_get_stage_window (ClutterStage *stage)
@@ -499,7 +506,7 @@ clutter_gdk_get_stage_window (ClutterStage *stage)
  * Return value: (transfer none): A #ClutterStage, or% NULL if a stage
  *   does not exist for the window
  *
- * Since: 0.8
+ * Since: 1.10
  */
 ClutterStage *
 clutter_gdk_get_stage_from_window (GdkWindow *window)
@@ -544,7 +551,7 @@ set_foreign_window_callback (ClutterActor *actor,
  *
  * Return value: %TRUE if foreign window is valid
  *
- * Since: 0.4
+ * Since: 1.10
  */
 gboolean
 clutter_gdk_set_stage_foreign (ClutterStage *stage,
@@ -554,7 +561,6 @@ clutter_gdk_set_stage_foreign (ClutterStage *stage,
   ClutterStageGdk *stage_gdk;
   ClutterStageWindow *impl;
   ClutterActor *actor;
-  gpointer gtk_data = NULL;
 
   g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE);
   g_return_val_if_fail (!CLUTTER_ACTOR_IN_DESTRUCTION (stage), FALSE);
@@ -575,16 +581,6 @@ clutter_gdk_set_stage_foreign (ClutterStage *stage,
       return FALSE;
     }
 
-#if 0
-  gdk_window_get_user_data (window, &gtk_data);
-  if (gtk_data != NULL)
-    {
-      g_critical ("The provided GdkWindow is already in use by a GtkWidget. "
-		  "Use a child GdkWindow for embedding instead");
-      return FALSE;
-    }
-#endif
-
   closure.stage_gdk = stage_gdk;
   closure.window = g_object_ref (window);
 
diff --git a/clutter/x11/clutter-stage-x11.c b/clutter/x11/clutter-stage-x11.c
index b2ac9df..ac84639 100644
--- a/clutter/x11/clutter-stage-x11.c
+++ b/clutter/x11/clutter-stage-x11.c
@@ -759,6 +759,18 @@ clutter_stage_x11_hide (ClutterStageWindow *stage_window)
     }
 }
 
+static gboolean
+clutter_stage_x11_can_clip_redraws (ClutterStageWindow *stage_window)
+{
+  ClutterStageX11 *stage_x11 = CLUTTER_STAGE_X11 (stage_window);
+
+  /* while resizing a window, clipped redraws are disabled in order to
+   * avoid artefacts. see clutter-event-x11.c:event_translate for a more
+   * detailed explanation
+   */
+  return stage_x11->clipped_redraws_cool_off == 0;
+}
+
 static void
 clutter_stage_x11_finalize (GObject *gobject)
 {
@@ -823,6 +835,7 @@ clutter_stage_window_iface_init (ClutterStageWindowIface *iface)
   iface->get_geometry = clutter_stage_x11_get_geometry;
   iface->realize = clutter_stage_x11_realize;
   iface->unrealize = clutter_stage_x11_unrealize;
+  iface->can_clip_redraws = clutter_stage_x11_can_clip_redraws;
 }
 
 static inline void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]