[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