[Swfdec-commits] 3 commits - src/swfmoz_player.c src/swfmoz_player.h

Benjamin Otte company at kemper.freedesktop.org
Mon Apr 28 12:39:39 PDT 2008


 src/swfmoz_player.c |   92 ++++++++++++++++++++++++++++++++++++++++++----------
 src/swfmoz_player.h |    4 +-
 2 files changed, 78 insertions(+), 18 deletions(-)

New commits:
commit 91f1bd502ddf220e6516ac79ce1140104eb5d901
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 28 21:38:08 2008 +0200

    add renderer handling
    
    This should improve performance for most cases (read: at least Youtube)

diff --git a/src/swfmoz_player.c b/src/swfmoz_player.c
index 513c3ef..21da07c 100644
--- a/src/swfmoz_player.c
+++ b/src/swfmoz_player.c
@@ -563,24 +563,36 @@ swfmoz_player_set_target (SwfmozPlayer *player, GdkWindow *target,
   g_return_if_fail (SWFMOZ_IS_PLAYER (player));
   g_return_if_fail (target == NULL || GDK_IS_WINDOW (target));
 
-  if (player->target) {
-    g_object_unref (player->target);
+  if (target != player->target) {
+    if (player->target) {
+      g_object_unref (player->target);
+    }
+    player->target = target;
+    if (target) {
+      cairo_t *cr;
+      SwfdecRenderer *renderer;
+
+      g_object_ref (target);
+      cr = gdk_cairo_create (target);
+      renderer = swfdec_renderer_new_for_player (cairo_get_target (cr), 
+	  SWFDEC_PLAYER (player));
+      swfdec_player_set_renderer (SWFDEC_PLAYER (player), renderer);
+      g_object_unref (renderer);
+      cairo_destroy (cr);
+
+      swfdec_gtk_player_set_missing_plugins_window (SWFDEC_GTK_PLAYER (player), 
+	  gdk_window_get_toplevel (target));
+      swfmoz_player_update_cursor (player);
+    } else {
+      swfdec_gtk_player_set_missing_plugins_window (SWFDEC_GTK_PLAYER (player), 
+	  NULL);
+    }
   }
-  player->target = target;
   player->target_rect.x = x;
   player->target_rect.y = y;
   player->target_rect.width = width;
   player->target_rect.height = height;
   swfdec_player_set_size (SWFDEC_PLAYER (player), width, height);
-  if (target) {
-    g_object_ref (target);
-    swfdec_gtk_player_set_missing_plugins_window (SWFDEC_GTK_PLAYER (player), 
-	gdk_window_get_toplevel (target));
-    swfmoz_player_update_cursor (player);
-  } else {
-    swfdec_gtk_player_set_missing_plugins_window (SWFDEC_GTK_PLAYER (player), 
-	NULL);
-  }
 }
 
 static void
commit 05ab29972a5168e64eabcc70b62e11739090c3d1
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 28 21:37:41 2008 +0200

    more updates to fullscreen handling
    
    In particular, don't crash on weird fullscreen window destruction paths

diff --git a/src/swfmoz_player.c b/src/swfmoz_player.c
index bba49e6..513c3ef 100644
--- a/src/swfmoz_player.c
+++ b/src/swfmoz_player.c
@@ -290,6 +290,17 @@ swfmoz_player_update_cursor (SwfmozPlayer *player)
 }
 
 static void
+swfmoz_player_fullscreen_destroyed (GtkWidget *widget, SwfmozPlayer *player)
+{
+  player->fullscreen = NULL;
+  if (swfdec_player_get_fullscreen (SWFDEC_PLAYER (player))) {
+    swfdec_player_set_focus (SWFDEC_PLAYER (player), TRUE);
+    swfdec_player_key_press (SWFDEC_PLAYER (player), SWFDEC_KEY_ESCAPE, 0);
+  }
+  swfmoz_player_invalidate (player);
+}
+
+static void
 swfmoz_player_notify (SwfmozPlayer *player, GParamSpec *pspec, gpointer unused)
 {
   if (g_str_equal (pspec->name, "playing")) {
@@ -307,12 +318,12 @@ swfmoz_player_notify (SwfmozPlayer *player, GParamSpec *pspec, gpointer unused)
       gtk_container_add (GTK_CONTAINER (window), child);
       gtk_widget_show_all (window);
       gtk_window_fullscreen (GTK_WINDOW (window));
+      g_signal_connect (window, "destroy", 
+	  G_CALLBACK (swfmoz_player_fullscreen_destroyed), player);
       gtk_widget_grab_focus (child);
-      g_object_ref (window);
     } else if (!fullscreen && player->fullscreen != NULL) {
       gtk_widget_destroy (player->fullscreen);
-      g_object_unref (player->fullscreen);
-      player->fullscreen = NULL;
+      g_assert (player->fullscreen == NULL);
     }
   }
 }
@@ -348,6 +359,12 @@ swfmoz_player_dispose (GObject *object)
 {
   SwfmozPlayer *player = SWFMOZ_PLAYER (object);
 
+  /* do this first or we'll get unhappy */
+  if (player->fullscreen != NULL) {
+    gtk_widget_destroy (player->fullscreen);
+    g_assert (player->fullscreen == NULL);
+  }
+
   if (player->menu) {
     g_signal_handlers_disconnect_matched (player, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, 
 	swfmoz_player_menu_notify_playing, NULL);
@@ -379,11 +396,6 @@ swfmoz_player_dispose (GObject *object)
     g_object_unref (player->loaders);
     player->loaders = NULL;
   }
-  if (player->fullscreen != NULL) {
-    gtk_widget_destroy (player->fullscreen);
-    g_object_unref (player->fullscreen);
-    player->fullscreen = NULL;
-  }
 
   g_object_unref (player->config);
   player->config = NULL;
@@ -661,7 +673,7 @@ swfmoz_player_render (SwfmozPlayer *player, cairo_t *cr, GdkRegion *region)
   }
 
   /* second, check if we have anything to draw */
-  if (player->target == NULL)
+  if (player->target == NULL || player->fullscreen)
     return;
 
   if (!has_cr) {
commit 256fa7f5797f51903c4f00e76ccb19de01d64211
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 28 21:05:59 2008 +0200

    implement fullscreen support

diff --git a/src/swfmoz_player.c b/src/swfmoz_player.c
index ee81c7a..bba49e6 100644
--- a/src/swfmoz_player.c
+++ b/src/swfmoz_player.c
@@ -297,6 +297,23 @@ swfmoz_player_notify (SwfmozPlayer *player, GParamSpec *pspec, gpointer unused)
     swfmoz_player_invalidate (player);
   } else if (g_str_equal (pspec->name, "mouse-cursor")) {
     swfmoz_player_update_cursor (player);
+  } else if (g_str_equal (pspec->name, "fullscreen")) {
+    gboolean fullscreen = swfdec_player_get_fullscreen (SWFDEC_PLAYER (player));
+    if (fullscreen && player->fullscreen == NULL) {
+      GtkWidget *window, *child;
+      
+      player->fullscreen = window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      child = swfdec_gtk_widget_new_fullscreen (SWFDEC_PLAYER (player));
+      gtk_container_add (GTK_CONTAINER (window), child);
+      gtk_widget_show_all (window);
+      gtk_window_fullscreen (GTK_WINDOW (window));
+      gtk_widget_grab_focus (child);
+      g_object_ref (window);
+    } else if (!fullscreen && player->fullscreen != NULL) {
+      gtk_widget_destroy (player->fullscreen);
+      g_object_unref (player->fullscreen);
+      player->fullscreen = NULL;
+    }
   }
 }
 
@@ -362,6 +379,11 @@ swfmoz_player_dispose (GObject *object)
     g_object_unref (player->loaders);
     player->loaders = NULL;
   }
+  if (player->fullscreen != NULL) {
+    gtk_widget_destroy (player->fullscreen);
+    g_object_unref (player->fullscreen);
+    player->fullscreen = NULL;
+  }
 
   g_object_unref (player->config);
   player->config = NULL;
@@ -680,6 +702,18 @@ swfmoz_player_render (SwfmozPlayer *player, cairo_t *cr, GdkRegion *region)
   }
 }
 
+void
+swfmoz_player_set_allow_popups (SwfmozPlayer *player, gboolean allow)
+{
+  g_return_if_fail (SWFMOZ_IS_PLAYER (player));
+
+  swfdec_player_set_allow_fullscreen (SWFDEC_PLAYER (player), allow);
+  if (allow)
+    plugin_push_allow_popups (player->instance, TRUE);
+  else
+    plugin_pop_allow_popups (player->instance);
+}
+
 gboolean
 swfmoz_player_mouse_press (SwfmozPlayer *player, int x, int y, guint button)
 {
@@ -697,9 +731,9 @@ swfmoz_player_mouse_press (SwfmozPlayer *player, int x, int y, guint button)
     return FALSE;
 
   if (swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (player))) {
-    plugin_push_allow_popups (player->instance, TRUE);
+    swfmoz_player_set_allow_popups (player, TRUE);
     ret = swfdec_player_mouse_press (SWFDEC_PLAYER (player), x, y, button);
-    plugin_pop_allow_popups (player->instance);
+    swfmoz_player_set_allow_popups (player, FALSE);
   }
   return ret;
 }
@@ -720,9 +754,9 @@ swfmoz_player_mouse_release (SwfmozPlayer *player, int x, int y, guint button)
     return FALSE;
 
   if (swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (player))) {
-    plugin_push_allow_popups (player->instance, TRUE);
+    swfmoz_player_set_allow_popups (player, TRUE);
     ret = swfdec_player_mouse_release (SWFDEC_PLAYER (player), x, y, button);
-    plugin_pop_allow_popups (player->instance);
+    swfmoz_player_set_allow_popups (player, FALSE);
   } else {
     if (button == 1) {
       swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (player), TRUE);
diff --git a/src/swfmoz_player.h b/src/swfmoz_player.h
index f65a87e..1e89995 100644
--- a/src/swfmoz_player.h
+++ b/src/swfmoz_player.h
@@ -60,7 +60,6 @@ struct _SwfmozPlayer {
   GdkWindow *		target;			/* what we draw to */
   GdkRectangle		target_rect;		/* area in target that this plugin occupies */
 
-  /* for windowed operation */
   GSource *		repaint_source;		/* set when repaint is necessary */
   GdkRegion *		repaint;		/* area to repaint or NULL if none */
 
@@ -69,6 +68,7 @@ struct _SwfmozPlayer {
   GtkMenu *		menu;			/* right-click menu */
   GtkTreeModel *	loaders;		/* loaders used in this players */
   SwfmozConfig *	config;			/* autoplay configuration */
+  GtkWidget *		fullscreen;		/* fullscreen widget */
 };
 
 struct _SwfmozPlayerClass {
@@ -92,6 +92,8 @@ void		swfmoz_player_set_target	(SwfmozPlayer *		player,
 						 int			y,
 						 int			width,
 						 int			height);
+void		swfmoz_player_set_allow_popups	(SwfmozPlayer *		player,
+						 gboolean		allow);
 void		swfmoz_player_render		(SwfmozPlayer *		player,
 						 cairo_t *		cr,
 						 GdkRegion *		region);


More information about the Swfdec-commits mailing list