[Swfdec-commits] swfdec-gtk/swfdec_gtk_widget.c swfdec/swfdec_marshal.list swfdec/swfdec_player.c swfdec/swfdec_player.h

Benjamin Otte company at kemper.freedesktop.org
Thu Sep 4 15:06:16 PDT 2008


 swfdec-gtk/swfdec_gtk_widget.c |   41 +++++++++++++++++++----
 swfdec/swfdec_marshal.list     |    1 
 swfdec/swfdec_player.c         |   73 +++++++++++++++++++++++++++++++++--------
 swfdec/swfdec_player.h         |    4 ++
 4 files changed, 98 insertions(+), 21 deletions(-)

New commits:
commit cfb69056cd87356784feb232e70114aa13361c70
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Sep 5 00:02:47 2008 +0200

    rewrite how fullscreen is handled (fixes #16530)
    
    We now emit a signal for querying the proper size when
    (un)fullscreening.
    The code even looks cleaner and it works better.

diff --git a/swfdec-gtk/swfdec_gtk_widget.c b/swfdec-gtk/swfdec_gtk_widget.c
index 925ef7f..41acca1 100644
--- a/swfdec-gtk/swfdec_gtk_widget.c
+++ b/swfdec-gtk/swfdec_gtk_widget.c
@@ -382,7 +382,7 @@ swfdec_gtk_widget_size_allocate (GtkWidget *gtkwidget, GtkAllocation *allocation
 
   gtkwidget->allocation = *allocation;
 
-  if (priv->player && swfdec_player_is_initialized (priv->player) && !priv->fullscreen_mode)
+  if (priv->player && swfdec_player_is_initialized (priv->player))
     swfdec_player_set_size (priv->player, allocation->width, allocation->height);
   if (GTK_WIDGET_REALIZED (gtkwidget)) {
     gdk_window_move_resize (gtkwidget->window, 
@@ -398,12 +398,6 @@ swfdec_gtk_widget_size_request (GtkWidget *gtkwidget, GtkRequisition *req)
 
   if (priv->player == NULL) {
     req->width = req->height = 0;
-#if 0
-  } else if (priv->fullscreen_mode) {
-    GdkScreen *screen = gtk_widget_has_screen (gtkwidget) ? gtk_widget_get_screen (gtkwidget) : NULL;
-    req->width = screen ? gdk_screen_get_width (screen) : 0;
-    req->height = screen ? gdk_screen_get_height (screen) : 0;
-#endif
   } else {
     guint w, h;
     swfdec_player_get_default_size (priv->player, &w, &h);
@@ -754,6 +748,37 @@ swfdec_gtk_widget_notify_cb (SwfdecPlayer *player, GParamSpec *pspec, SwfdecGtkW
   }
 }
 
+static gboolean
+swfdec_gtk_widget_query_size_cb (SwfdecPlayer *player, gboolean fullscreen,
+    int *width, int *height, SwfdecGtkWidget *widget)
+{
+  SwfdecGtkWidgetPrivate *priv = widget->priv;
+
+  /* don't connect to this signal in fullscreen mode, it reports wrong sizes */
+  if (priv->fullscreen_mode)
+    return FALSE;
+
+  if (fullscreen) {
+    GdkWindow *window = GTK_WIDGET (widget)->window;
+    GdkScreen *screen;
+    GdkRectangle rect;
+    int monitor;
+
+    if (window == NULL)
+      return FALSE;
+    screen = gdk_drawable_get_screen (GDK_DRAWABLE (window));
+    monitor = gdk_screen_get_monitor_at_window (screen, window);
+    gdk_screen_get_monitor_geometry (screen, monitor, &rect);
+    *width = rect.width;
+    *height = rect.height;
+  } else {
+    GtkWidget *gtkwidget = GTK_WIDGET (widget);
+    *width = gtkwidget->allocation.width;
+    *height = gtkwidget->allocation.height;
+  }
+  return TRUE;
+}
+
 /*** PUBLIC API ***/
 
 /**
@@ -779,6 +804,7 @@ swfdec_gtk_widget_set_player (SwfdecGtkWidget *widget, SwfdecPlayer *player)
   if (player) {
     g_signal_connect (player, "invalidate", G_CALLBACK (swfdec_gtk_widget_invalidate_cb), widget);
     g_signal_connect (player, "notify", G_CALLBACK (swfdec_gtk_widget_notify_cb), widget);
+    g_signal_connect (player, "query-size", G_CALLBACK (swfdec_gtk_widget_query_size_cb), widget);
     g_object_ref (player);
     swfdec_gtk_widget_update_cursor (widget);
     swfdec_player_set_focus (player, GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (widget)));
@@ -789,6 +815,7 @@ swfdec_gtk_widget_set_player (SwfdecGtkWidget *widget, SwfdecPlayer *player)
   if (priv->player) {
     g_signal_handlers_disconnect_by_func (priv->player, swfdec_gtk_widget_invalidate_cb, widget);
     g_signal_handlers_disconnect_by_func (priv->player, swfdec_gtk_widget_notify_cb, widget);
+    g_signal_handlers_disconnect_by_func (priv->player, swfdec_gtk_widget_query_size_cb, widget);
     g_object_unref (priv->player);
   }
   priv->player = player;
diff --git a/swfdec/swfdec_marshal.list b/swfdec/swfdec_marshal.list
index f7b96b7..04ea6d1 100644
--- a/swfdec/swfdec_marshal.list
+++ b/swfdec/swfdec_marshal.list
@@ -1,3 +1,4 @@
+BOOLEAN:BOOLEAN,POINTER,POINTER
 BOOLEAN:DOUBLE,DOUBLE,INT
 BOOLEAN:UINT,UINT,BOOLEAN
 VOID:POINTER,UINT
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index f86103c..6515189 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -642,6 +642,7 @@ enum {
   LAUNCH,
   FSCOMMAND,
   MISSING_PLUGINS,
+  QUERY_SIZE,
   LAST_SIGNAL
 };
 
@@ -865,13 +866,8 @@ swfdec_player_update_scale (SwfdecPlayer *player)
   double scale_x, scale_y;
   GList *walk;
 
-  if (priv->fullscreen) {
-    priv->stage.width = priv->system->screen_width;
-    priv->stage.height = priv->system->screen_height;
-  } else {
-    priv->stage.width = priv->stage_width >= 0 ? priv->stage_width : (int) priv->width;
-    priv->stage.height = priv->stage_height >= 0 ? priv->stage_height : (int) priv->height;
-  }
+  priv->stage.width = priv->stage_width >= 0 ? priv->stage_width : (int) priv->width;
+  priv->stage.height = priv->stage_height >= 0 ? priv->stage_height : (int) priv->height;
 
   if (priv->stage.height == 0 || priv->stage.width == 0) {
     cairo_matrix_init_scale (&priv->stage_to_global, 
@@ -2044,6 +2040,15 @@ swfdec_accumulate_or (GSignalInvocationHint *ihint, GValue *return_accu,
   return TRUE;
 }
 
+static gboolean
+swfdec_accumulate_quit (GSignalInvocationHint *ihint, GValue *return_accu, 
+    const GValue *handler_return, gpointer data)
+{
+  if (g_value_get_boolean (handler_return))
+    g_value_set_boolean (return_accu, TRUE);
+  return FALSE;
+}
+
 static void
 swfdec_player_mark_string_object (gpointer key, gpointer value, gpointer data)
 {
@@ -2088,6 +2093,21 @@ swfdec_player_check_continue (SwfdecAsContext *context)
   return g_timer_elapsed (priv->runtime, NULL) * 1000 <= priv->max_runtime;
 }
 
+static gboolean
+swfdec_player_do_query_size (SwfdecPlayer *player, gboolean fullscreen,
+    int *width, int *height)
+{
+  if (fullscreen) {
+    SwfdecPlayerPrivate *priv = player->priv;
+    *width = priv->system->screen_width;
+    *height = priv->system->screen_height;
+  } else {
+    *width = -1;
+    *height = -1;
+  }
+  return TRUE;
+}
+
 static void
 swfdec_player_class_init (SwfdecPlayerClass *klass)
 {
@@ -2333,6 +2353,30 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
       NULL, NULL, g_cclosure_marshal_VOID__BOXED,
       G_TYPE_NONE, 1, G_TYPE_STRV);
 
+  /**
+   * SwfdecPlayer::query-size:
+   * @player: the #SwfdecPlayer that resizes
+   * @fullscreen: %TRUE if the player queries the fullscreen size, %FALSE for 
+   *              the default size
+   * @width: pointer to an integer that takes the width to use
+   * @height: pointer to an integer that takes the height to use
+   *
+   * This signals is emitted whenever the player is (un)fullscreened. In this 
+   * case it requests the new size the Flash file will be displayed in 
+   * immediately. If you want to provide values, connect to this signal. The
+   * values don't have to be exact, you can still call swfdec_player_set_size()
+   * later on. However, it will look visually nicer if your values here are 
+   * correct. By default, the screen resolution values will be used for 
+   * fullscreen and the default size will be used otherwise.
+   *
+   * Returns: TRUE if this handler properly sets @width and @height and no 
+   *          other handlers should be invoked.
+   */
+  signals[QUERY_SIZE] = g_signal_new ("query-size", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (SwfdecPlayerClass, query_size),
+      swfdec_accumulate_quit, NULL, swfdec_marshal_BOOLEAN__BOOLEAN_POINTER_POINTER,
+      G_TYPE_BOOLEAN, 3, G_TYPE_BOOLEAN, G_TYPE_POINTER, G_TYPE_POINTER);
+
   context_class->mark = swfdec_player_mark;
   context_class->get_time = swfdec_player_get_time;
   context_class->check_continue = swfdec_player_check_continue;
@@ -2340,6 +2384,7 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
   klass->advance = swfdec_player_do_advance;
   klass->handle_key = swfdec_player_do_handle_key;
   klass->handle_mouse = swfdec_player_do_handle_mouse;
+  klass->query_size = swfdec_player_do_query_size;
 }
 
 static void
@@ -2786,13 +2831,8 @@ swfdec_player_update_size (gpointer playerp, gpointer unused)
   SwfdecPlayer *player = playerp;
   SwfdecPlayerPrivate *priv = player->priv;
 
-  if (priv->fullscreen) {
-    priv->internal_width = priv->system->screen_width;
-    priv->internal_height = priv->system->screen_height;
-  } else {
-    priv->internal_width = priv->stage_width >=0 ? (guint) priv->stage_width : priv->width;
-    priv->internal_height = priv->stage_height >=0 ? (guint) priv->stage_height : priv->height;
-  }
+  priv->internal_width = priv->stage_width >=0 ? (guint) priv->stage_width : priv->width;
+  priv->internal_height = priv->stage_height >=0 ? (guint) priv->stage_height : priv->height;
 
   if (priv->scale_mode != SWFDEC_SCALE_NONE)
     return;
@@ -2812,6 +2852,7 @@ swfdec_player_set_fullscreen (SwfdecPlayer *player, gboolean fullscreen)
 {
   SwfdecPlayerPrivate *priv;
   SwfdecAsValue val;
+  gboolean result;
 
   g_return_if_fail (SWFDEC_IS_PLAYER (player));
 
@@ -2824,6 +2865,10 @@ swfdec_player_set_fullscreen (SwfdecPlayer *player, gboolean fullscreen)
     return;
   }
 
+  result = FALSE;
+  g_signal_emit (player, signals[QUERY_SIZE], 0, fullscreen, 
+      &priv->stage_width, &priv->stage_height, &result);
+
   priv->fullscreen = fullscreen;
   g_object_notify (G_OBJECT (player), "fullscreen");
   SWFDEC_AS_VALUE_SET_BOOLEAN (&val, fullscreen);
diff --git a/swfdec/swfdec_player.h b/swfdec/swfdec_player.h
index 26703ac..62be022 100644
--- a/swfdec/swfdec_player.h
+++ b/swfdec/swfdec_player.h
@@ -95,6 +95,10 @@ struct _SwfdecPlayerClass
 						 int			button);
   void			(* missing_plugins)	(SwfdecPlayer *		player,
 						 const char **		details);
+  gboolean		(* query_size)		(SwfdecPlayer *		player,
+						 gboolean		fullscreen,
+						 int *			width,
+						 int *			height);
 };
 
 void		swfdec_init			(void);


More information about the Swfdec-commits mailing list