[Swfdec-commits] swfdec-gtk/swfdec_gtk_player.c swfdec-gtk/swfdec_gtk_widget.c

Benjamin Otte company at kemper.freedesktop.org
Thu Apr 10 01:34:27 PDT 2008


 swfdec-gtk/swfdec_gtk_player.c |    1 
 swfdec-gtk/swfdec_gtk_widget.c |   86 ++++++++++++++++++++++++++++++++++++-----
 2 files changed, 78 insertions(+), 9 deletions(-)

New commits:
commit 623924e28549c6f8a0cbc548873db24b02eb110f
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Apr 10 10:33:40 2008 +0200

    change priorities
    
    This changed is outlined at
    http://lists.freedesktop.org/archives/swfdec/2008-March/001306.html
    priority for iterating is GDK_PRIORITY_REDRAW - 5.
    priority for queueing redraws due to iterations is GDK_PRIORITY_REDRAW - 10.
    
    You need to update swfdec-mozilla after applying this change, or your browsing
    will become less pleasant.

diff --git a/swfdec-gtk/swfdec_gtk_player.c b/swfdec-gtk/swfdec_gtk_player.c
index aefb464..34bc8a2 100644
--- a/swfdec-gtk/swfdec_gtk_player.c
+++ b/swfdec-gtk/swfdec_gtk_player.c
@@ -304,6 +304,7 @@ swfdec_gtk_player_set_playing (SwfdecGtkPlayer *player, gboolean playing)
   priv = player->priv;
   if (playing && priv->source == NULL) {
     priv->source = swfdec_iterate_source_new (SWFDEC_PLAYER (player), priv->speed);
+    g_source_set_priority (priv->source, GDK_PRIORITY_REDRAW - 5);
     g_source_attach (priv->source, NULL);
   } else if (!playing && priv->source != NULL) {
     g_source_destroy (priv->source);
diff --git a/swfdec-gtk/swfdec_gtk_widget.c b/swfdec-gtk/swfdec_gtk_widget.c
index 5830681..b10621f 100644
--- a/swfdec-gtk/swfdec_gtk_widget.c
+++ b/swfdec-gtk/swfdec_gtk_widget.c
@@ -32,8 +32,10 @@ struct _SwfdecGtkWidgetPrivate
 
   gboolean		renderer_set;	/* TRUE if a special renderer has been set */
   cairo_surface_type_t	renderer_type;	/* the renderer that was set */
-  gboolean		interactive;	/* TRUE if this widget propagates keyboard and mouse events */
   SwfdecRenderer *	renderer;	/* renderer in use */
+  gboolean		interactive;	/* TRUE if this widget propagates keyboard and mouse events */
+  GdkRegion *		invalid;	/* invalid regions we didn't yet repaint */
+  guint			invalidator;	/* GSource used for invalidating window contents */
 };
 
 enum {
@@ -208,6 +210,21 @@ swfdec_gtk_widget_focus (GtkWidget *gtkwidget, GtkDirectionType direction)
   return GTK_WIDGET_CLASS (swfdec_gtk_widget_parent_class)->focus (gtkwidget, direction);
 }
 
+static void
+swfdec_gtk_widget_clear_invalidations (SwfdecGtkWidget *widget)
+{
+  SwfdecGtkWidgetPrivate *priv = widget->priv;
+
+  if (priv->invalidator) {
+    g_source_remove (priv->invalidator);
+    priv->invalidator = 0;
+    gdk_region_destroy (priv->invalid);
+    priv->invalid = gdk_region_new ();
+  } else {
+    g_assert (gdk_region_empty (priv->invalid));
+  }
+}
+
 static cairo_surface_t *
 swfdec_gtk_widget_create_renderer (cairo_surface_type_t type, int width, int height)
 {
@@ -231,6 +248,10 @@ swfdec_gtk_widget_expose (GtkWidget *gtkwidget, GdkEventExpose *event)
   if (priv->player == NULL)
     return FALSE;
 
+  /* FIXME: This might be ugly */
+  gdk_region_union (event->region, priv->invalid);
+  gdk_window_begin_paint_region (event->window, event->region);
+
   if (!priv->renderer_set ||
       (surface = swfdec_gtk_widget_create_renderer (priv->renderer_type, 
 	      event->area.width, event->area.height)) == NULL) {
@@ -252,6 +273,8 @@ swfdec_gtk_widget_expose (GtkWidget *gtkwidget, GdkEventExpose *event)
     cairo_surface_destroy (surface);
   }
 
+  swfdec_gtk_widget_clear_invalidations (widget);
+  gdk_window_end_paint (event->window);
   return FALSE;
 }
 
@@ -314,10 +337,16 @@ static void
 swfdec_gtk_widget_dispose (GObject *object)
 {
   SwfdecGtkWidget *widget = SWFDEC_GTK_WIDGET (object);
+  SwfdecGtkWidgetPrivate *priv = widget->priv;
 
   swfdec_gtk_widget_set_player (widget, NULL);
 
-  g_assert (widget->priv->renderer == NULL);
+  g_assert (priv->renderer == NULL);
+  if (priv->invalid) {
+    gdk_region_destroy (priv->invalid);
+    priv->invalid = NULL;
+  }
+  g_assert (priv->invalidator == 0);
 
   G_OBJECT_CLASS (swfdec_gtk_widget_parent_class)->dispose (object);
 }
@@ -483,6 +512,26 @@ swfdec_gtk_widget_unrealize (GtkWidget *widget)
 }
 
 static void
+swfdec_gtk_widget_map (GtkWidget *gtkwidget)
+{
+  SwfdecGtkWidgetPrivate *priv = SWFDEC_GTK_WIDGET (gtkwidget)->priv;
+
+  g_assert (gdk_region_empty (priv->invalid));
+
+  GTK_WIDGET_CLASS (swfdec_gtk_widget_parent_class)->map (gtkwidget);
+}
+
+static void
+swfdec_gtk_widget_unmap (GtkWidget *gtkwidget)
+{
+  SwfdecGtkWidget *widget = SWFDEC_GTK_WIDGET (gtkwidget);
+
+  GTK_WIDGET_CLASS (swfdec_gtk_widget_parent_class)->unmap (gtkwidget);
+
+  swfdec_gtk_widget_clear_invalidations (widget);
+}
+
+static void
 swfdec_gtk_widget_class_init (SwfdecGtkWidgetClass * g_class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (g_class);
@@ -508,6 +557,8 @@ swfdec_gtk_widget_class_init (SwfdecGtkWidgetClass * g_class)
 
   widget_class->realize = swfdec_gtk_widget_realize;
   widget_class->unrealize = swfdec_gtk_widget_unrealize;
+  widget_class->map = swfdec_gtk_widget_map;
+  widget_class->unmap = swfdec_gtk_widget_unmap;
   widget_class->size_request = swfdec_gtk_widget_size_request;
   widget_class->size_allocate = swfdec_gtk_widget_size_allocate;
   widget_class->expose_event = swfdec_gtk_widget_expose;
@@ -525,7 +576,7 @@ swfdec_gtk_widget_class_init (SwfdecGtkWidgetClass * g_class)
 }
 
 static void
-swfdec_gtk_widget_init (SwfdecGtkWidget * widget)
+swfdec_gtk_widget_init (SwfdecGtkWidget *widget)
 {
   SwfdecGtkWidgetPrivate *priv;
   
@@ -533,26 +584,43 @@ swfdec_gtk_widget_init (SwfdecGtkWidget * widget)
 
   priv->interactive = TRUE;
   priv->renderer_type = CAIRO_SURFACE_TYPE_IMAGE;
+  priv->invalid = gdk_region_new ();
+
+  gtk_widget_set_double_buffered (GTK_WIDGET (widget), FALSE);
 
   GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
 }
 
+static gboolean
+swfdec_gtk_widget_do_invalidate (gpointer widgetp)
+{
+  SwfdecGtkWidget *widget = widgetp;
+  SwfdecGtkWidgetPrivate *priv = widget->priv;
+
+  g_assert (GTK_WIDGET_REALIZED (widget));
+
+  gdk_window_invalidate_region (GTK_WIDGET (widget)->window, priv->invalid, FALSE);
+  swfdec_gtk_widget_clear_invalidations (widget);
+  return FALSE;
+}
+
 static void
 swfdec_gtk_widget_invalidate_cb (SwfdecPlayer *player, const SwfdecRectangle *extents,
     const SwfdecRectangle *rect, guint n_rects, SwfdecGtkWidget *widget)
 {
-  GdkRegion *region;
+  SwfdecGtkWidgetPrivate *priv = widget->priv;
   guint i;
 
-  if (!GTK_WIDGET_REALIZED (widget))
+  if (!GTK_WIDGET_MAPPED (widget))
     return;
 
-  region = gdk_region_new ();
   for (i = 0; i < n_rects; i++) {
-    gdk_region_union_with_rect (region, (GdkRectangle *) &rect[i]);
+    gdk_region_union_with_rect (priv->invalid, (GdkRectangle *) &rect[i]);
+  }
+  if (priv->invalidator == 0) {
+    priv->invalidator = g_idle_add_full (GDK_PRIORITY_REDRAW - 10,
+	swfdec_gtk_widget_do_invalidate, widget, NULL);
   }
-  gdk_window_invalidate_region (GTK_WIDGET (widget)->window, region, FALSE);
-  gdk_region_destroy (region);
 }
 
 static void


More information about the Swfdec-commits mailing list