[Swfdec-commits] 13 commits - swfdec-gtk/swfdec_gtk_widget.c swfdec-gtk/swfdec_gtk_widget.h swfdec/swfdec_as_strings.c swfdec/swfdec_net_stream.c swfdec/swfdec_player.c swfdec/swfdec_player.h swfdec/swfdec_player_internal.h swfdec/swfdec_stage_as.c test/swfdec_test_plugin.c test/trace

Benjamin Otte company at kemper.freedesktop.org
Mon Apr 14 04:40:37 PDT 2008


 swfdec-gtk/swfdec_gtk_widget.c          |  118 +++++++++++++++++---
 swfdec-gtk/swfdec_gtk_widget.h          |    1 
 swfdec/swfdec_as_strings.c              |    2 
 swfdec/swfdec_net_stream.c              |    3 
 swfdec/swfdec_player.c                  |  184 ++++++++++++++++++++++++++------
 swfdec/swfdec_player.h                  |    6 +
 swfdec/swfdec_player_internal.h         |    4 
 swfdec/swfdec_stage_as.c                |   33 ++++-
 test/swfdec_test_plugin.c               |    2 
 test/trace/Makefile.am                  |    5 
 test/trace/stage-fullscreen-7.swf       |binary
 test/trace/stage-fullscreen-7.swf.trace |   85 ++++++++++++++
 test/trace/stage-fullscreen-8.swf       |binary
 test/trace/stage-fullscreen-8.swf.trace |   85 ++++++++++++++
 test/trace/stage-fullscreen.as          |   39 ++++++
 15 files changed, 515 insertions(+), 52 deletions(-)

New commits:
commit 260ce59509ce0a505ad735ab5ad9834f05d8492e
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 13:39:51 2008 +0200

    add a fullscreen test
    
    The version 5 test was omitted because it doesn't do anything.
    The version 6 test is so weird, I couldn't make it work.

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index efed79e..75c3e24 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -2868,6 +2868,11 @@ EXTRA_DIST = \
 	stage-align-7.swf.trace \
 	stage-align-8.swf \
 	stage-align-8.swf.trace \
+	stage-fullscreen-7.swf \
+	stage-fullscreen-7.swf.trace \
+	stage-fullscreen-8.swf \
+	stage-fullscreen-8.swf.trace \
+	stage-fullscreen.as \
 	stage-size.as \
 	stage-size-5.swf \
 	stage-size-5.swf.trace \
diff --git a/test/trace/stage-fullscreen-7.swf b/test/trace/stage-fullscreen-7.swf
new file mode 100644
index 0000000..f109bec
Binary files /dev/null and b/test/trace/stage-fullscreen-7.swf differ
diff --git a/test/trace/stage-fullscreen-7.swf.trace b/test/trace/stage-fullscreen-7.swf.trace
new file mode 100644
index 0000000..4a783d6
--- /dev/null
+++ b/test/trace/stage-fullscreen-7.swf.trace
@@ -0,0 +1,85 @@
+>>> before setting fullscreen
+normal
+showAll
+200
+150
+>>> fullscreen: true
+fullScreen
+showAll
+200
+150
+>>> after setting fullscreen
+fullScreen
+showAll
+200
+150
+>>> before Stage.displayState = "normal"
+fullScreen
+showAll
+200
+150
+>>> fullscreen: false
+normal
+showAll
+200
+150
+>>> after Stage.displayState = "normal"
+normal
+showAll
+200
+150
+>>> before Stage.scaleMode = "noScale"
+normal
+showAll
+200
+150
+>>> before Stage.displayState = "fullScreen"
+normal
+noScale
+200
+150
+>>> onResize
+fullScreen
+noScale
+1024
+768
+>>> fullscreen: true
+fullScreen
+noScale
+1024
+768
+>>> after Stage.displayState = "fullScreen"
+fullScreen
+noScale
+1024
+768
+>>> before Stage.displayState = "normal"
+fullScreen
+noScale
+1024
+768
+>>> onResize
+normal
+noScale
+200
+150
+>>> fullscreen: false
+normal
+noScale
+200
+150
+>>> after Stage.displayState = "normal"
+normal
+noScale
+200
+150
+>>> before Stage.scaleMode = "showAll"
+normal
+noScale
+200
+150
+>>> when quitting
+normal
+showAll
+200
+150
diff --git a/test/trace/stage-fullscreen-8.swf b/test/trace/stage-fullscreen-8.swf
new file mode 100644
index 0000000..5ecd514
Binary files /dev/null and b/test/trace/stage-fullscreen-8.swf differ
diff --git a/test/trace/stage-fullscreen-8.swf.trace b/test/trace/stage-fullscreen-8.swf.trace
new file mode 100644
index 0000000..4a783d6
--- /dev/null
+++ b/test/trace/stage-fullscreen-8.swf.trace
@@ -0,0 +1,85 @@
+>>> before setting fullscreen
+normal
+showAll
+200
+150
+>>> fullscreen: true
+fullScreen
+showAll
+200
+150
+>>> after setting fullscreen
+fullScreen
+showAll
+200
+150
+>>> before Stage.displayState = "normal"
+fullScreen
+showAll
+200
+150
+>>> fullscreen: false
+normal
+showAll
+200
+150
+>>> after Stage.displayState = "normal"
+normal
+showAll
+200
+150
+>>> before Stage.scaleMode = "noScale"
+normal
+showAll
+200
+150
+>>> before Stage.displayState = "fullScreen"
+normal
+noScale
+200
+150
+>>> onResize
+fullScreen
+noScale
+1024
+768
+>>> fullscreen: true
+fullScreen
+noScale
+1024
+768
+>>> after Stage.displayState = "fullScreen"
+fullScreen
+noScale
+1024
+768
+>>> before Stage.displayState = "normal"
+fullScreen
+noScale
+1024
+768
+>>> onResize
+normal
+noScale
+200
+150
+>>> fullscreen: false
+normal
+noScale
+200
+150
+>>> after Stage.displayState = "normal"
+normal
+noScale
+200
+150
+>>> before Stage.scaleMode = "showAll"
+normal
+noScale
+200
+150
+>>> when quitting
+normal
+showAll
+200
+150
diff --git a/test/trace/stage-fullscreen.as b/test/trace/stage-fullscreen.as
new file mode 100644
index 0000000..be1cfdf
--- /dev/null
+++ b/test/trace/stage-fullscreen.as
@@ -0,0 +1,39 @@
+// makeswf -v 7 -s 200x150 -r 1 -o stage-fullscreen.swf stage-fullscreen.as
+
+function print (stuff) {
+  trace (">>> " + stuff);
+  trace (Stage.displayState);
+  trace (Stage.scaleMode);
+  trace (Stage.width);
+  trace (Stage.height);
+};
+
+Stage.addListener ({ onResize: function () { print ("onResize"); } });
+Stage.addListener ({ onFullScreen: function (is_fs) { print ("fullscreen: " + is_fs); } });
+
+onEnterFrame = function () {
+  if (!work_around_stupid_size_bug) {
+    /* wine or adobe's player don't set the correct window size when
+       fullscreening before the window is shown */
+    print ("before setting fullscreen");
+    Stage.displayState = "fullscreen";
+    print ("after setting fullscreen");
+    work_around_stupid_size_bug = 1;
+  } else if (Stage.displayState == "fullScreen") {
+    print ("before Stage.displayState = \"normal\"");
+    Stage.displayState = "normal";
+    print ("after Stage.displayState = \"normal\"");
+  } else if (Stage.scaleMode != "noScale") {
+    print ("before Stage.scaleMode = \"noScale\"");
+    Stage.scaleMode = "noScale";
+    print ("before Stage.displayState = \"fullScreen\"");
+    Stage.displayState = "fullScreen";
+    print ("after Stage.displayState = \"fullScreen\"");
+  } else {
+    print ("before Stage.scaleMode = \"showAll\"");
+    Stage.scaleMode = "showAll";
+    print ("when quitting");
+    getURL ("fscommand:quit", "");
+  }
+};
+
commit 9dd4424f401849374ff2ddc905d98f0e853f0187
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 13:39:33 2008 +0200

    allow going ullscreen during tests

diff --git a/test/swfdec_test_plugin.c b/test/swfdec_test_plugin.c
index a021c57..3bcee26 100644
--- a/test/swfdec_test_plugin.c
+++ b/test/swfdec_test_plugin.c
@@ -135,7 +135,7 @@ swfdec_test_plugin_swfdec_new (SwfdecTestPlugin *plugin)
   plugin->finish = swfdec_test_plugin_swfdec_finish;
   plugin->data = player = g_object_new (SWFDEC_TYPE_PLAYER, "random-seed", 0,
       "loader-type", SWFDEC_TYPE_FILE_LOADER, "socket-type", SWFDEC_TYPE_TEST_SWFDEC_SOCKET,
-      "max-runtime", 0, "start-time", &the_beginning,
+      "max-runtime", 0, "start-time", &the_beginning, "allow-fullscreen", TRUE,
       NULL);
 
   g_object_set_data (G_OBJECT (player), "plugin", plugin);
commit eba04d3bc7212cd83e338f287dd23ff2a3b2fb3d
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 13:17:00 2008 +0200

    implement spawning a fullscreen window when the player goes into fullscreen

diff --git a/swfdec-gtk/swfdec_gtk_widget.c b/swfdec-gtk/swfdec_gtk_widget.c
index af6351c..1ac6196 100644
--- a/swfdec-gtk/swfdec_gtk_widget.c
+++ b/swfdec-gtk/swfdec_gtk_widget.c
@@ -37,12 +37,15 @@ struct _SwfdecGtkWidgetPrivate
   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 */
+  GtkWidget *		fullscreen_window;/* the window we use for displaying fullscreen */
+  gboolean		fullscreen_mode;/* TRUE if we're a fullscreen widget */
 };
 
 enum {
   PROP_0,
-  PROP_PLAYER,
+  PROP_FULLSCREEN_MODE,
   PROP_INTERACTIVE,
+  PROP_PLAYER,
   PROP_RENDERER_SET,
   PROP_RENDERER
 };
@@ -107,9 +110,10 @@ swfdec_gtk_widget_button_press (GtkWidget *gtkwidget, GdkEventButton *event)
   SwfdecGtkWidgetPrivate *priv = widget->priv;
 
   if (event->type == GDK_BUTTON_PRESS && event->button <= 32 && priv->interactive && priv->player) {
-    swfdec_player_set_allow_fullscreen (priv->player, TRUE);
-    swfdec_player_mouse_press (priv->player, event->x, event->y, event->button);
-    swfdec_player_set_allow_fullscreen (priv->player, FALSE);
+    SwfdecPlayer *player = priv->player;
+    swfdec_player_set_allow_fullscreen (player, TRUE);
+    swfdec_player_mouse_press (player, event->x, event->y, event->button);
+    swfdec_player_set_allow_fullscreen (player, FALSE);
   }
   return FALSE;
 }
@@ -121,9 +125,10 @@ swfdec_gtk_widget_button_release (GtkWidget *gtkwidget, GdkEventButton *event)
   SwfdecGtkWidgetPrivate *priv = widget->priv;
 
   if (event->button <= 32 && priv->interactive && priv->player) {
-    swfdec_player_set_allow_fullscreen (priv->player, TRUE);
-    swfdec_player_mouse_release (priv->player, event->x, event->y, event->button);
-    swfdec_player_set_allow_fullscreen (priv->player, FALSE);
+    SwfdecPlayer *player = priv->player;
+    swfdec_player_set_allow_fullscreen (player, TRUE);
+    swfdec_player_mouse_release (player, event->x, event->y, event->button);
+    swfdec_player_set_allow_fullscreen (player, FALSE);
   }
   return FALSE;
 }
@@ -164,10 +169,11 @@ swfdec_gtk_widget_key_press (GtkWidget *gtkwidget, GdkEventKey *event)
   if (priv->interactive && priv->player) {
     guint keycode = swfdec_gtk_event_to_keycode (event);
     if (keycode != 0) {
-      swfdec_player_set_allow_fullscreen (priv->player, TRUE);
-      swfdec_player_key_press (priv->player, keycode, 
+      SwfdecPlayer *player = priv->player;
+      swfdec_player_set_allow_fullscreen (player, TRUE);
+      swfdec_player_key_press (player, keycode, 
 	  gdk_keyval_to_unicode (event->keyval));
-      swfdec_player_set_allow_fullscreen (priv->player, FALSE);
+      swfdec_player_set_allow_fullscreen (player, FALSE);
     }
     return TRUE;
   }
@@ -184,10 +190,11 @@ swfdec_gtk_widget_key_release (GtkWidget *gtkwidget, GdkEventKey *event)
   if (priv->interactive && priv->player) {
     guint keycode = swfdec_gtk_event_to_keycode (event);
     if (keycode != 0) {
-      swfdec_player_set_allow_fullscreen (priv->player, TRUE);
-      swfdec_player_key_release (priv->player, keycode, 
+      SwfdecPlayer *player = priv->player;
+      swfdec_player_set_allow_fullscreen (player, TRUE);
+      swfdec_player_key_release (player, keycode, 
 	  gdk_keyval_to_unicode (event->keyval));
-      swfdec_player_set_allow_fullscreen (priv->player, FALSE);
+      swfdec_player_set_allow_fullscreen (player, FALSE);
     }
     return TRUE;
   }
@@ -252,9 +259,9 @@ swfdec_gtk_widget_expose (GtkWidget *gtkwidget, GdkEventExpose *event)
   cairo_t *cr;
   cairo_surface_t *surface = NULL;
 
-  if (event->window != gtkwidget->window)
-    return FALSE;
-  if (priv->player == NULL)
+  if (event->window != gtkwidget->window ||
+      priv->player == NULL ||
+      priv->fullscreen_window != NULL)
     return FALSE;
 
   /* FIXME: This might be ugly */
@@ -321,12 +328,15 @@ swfdec_gtk_widget_set_property (GObject *object, guint param_id, const GValue *v
   SwfdecGtkWidgetPrivate *priv = widget->priv;
   
   switch (param_id) {
-    case PROP_PLAYER:
-      swfdec_gtk_widget_set_player (widget, g_value_get_object (value));
+    case PROP_FULLSCREEN_MODE:
+      priv->fullscreen_mode = g_value_get_boolean (value);
       break;
     case PROP_INTERACTIVE:
       swfdec_gtk_widget_set_interactive (widget, g_value_get_boolean (value));
       break;
+    case PROP_PLAYER:
+      swfdec_gtk_widget_set_player (widget, g_value_get_object (value));
+      break;
     case PROP_RENDERER_SET:
       priv->renderer_set = g_value_get_boolean (value);
       gtk_widget_queue_draw (GTK_WIDGET (widget));
@@ -368,7 +378,7 @@ swfdec_gtk_widget_size_allocate (GtkWidget *gtkwidget, GtkAllocation *allocation
 
   gtkwidget->allocation = *allocation;
 
-  if (priv->player && swfdec_player_is_initialized (priv->player))
+  if (priv->player && swfdec_player_is_initialized (priv->player) && !priv->fullscreen_mode)
     swfdec_player_set_size (priv->player, allocation->width, allocation->height);
   if (GTK_WIDGET_REALIZED (gtkwidget)) {
     gdk_window_move_resize (gtkwidget->window, 
@@ -384,6 +394,12 @@ 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);
@@ -550,12 +566,15 @@ swfdec_gtk_widget_class_init (SwfdecGtkWidgetClass * g_class)
   object_class->get_property = swfdec_gtk_widget_get_property;
   object_class->set_property = swfdec_gtk_widget_set_property;
 
-  g_object_class_install_property (object_class, PROP_PLAYER,
-      g_param_spec_object ("player", "player", "player that is displayed",
-	  SWFDEC_TYPE_PLAYER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+  g_object_class_install_property (object_class, PROP_FULLSCREEN_MODE,
+      g_param_spec_boolean ("fullscreen-mode", "fullscreen mode", "special mode for fullscreen display",
+	  FALSE, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
   g_object_class_install_property (object_class, PROP_INTERACTIVE,
       g_param_spec_boolean ("interactive", "interactive", "if mouse events are processed",
 	  TRUE, G_PARAM_READWRITE));
+  g_object_class_install_property (object_class, PROP_PLAYER,
+      g_param_spec_object ("player", "player", "player that is displayed",
+	  SWFDEC_TYPE_PLAYER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
   g_object_class_install_property (object_class, PROP_RENDERER_SET,
       g_param_spec_boolean ("renderer-set", "renderer set", "if an intermediate renderer should be used",
 	  TRUE, G_PARAM_READWRITE));
@@ -620,7 +639,8 @@ swfdec_gtk_widget_invalidate_cb (SwfdecPlayer *player, const SwfdecRectangle *ex
   SwfdecGtkWidgetPrivate *priv = widget->priv;
   guint i;
 
-  if (!GTK_WIDGET_MAPPED (widget))
+  if (!GTK_WIDGET_MAPPED (widget) ||
+      priv->fullscreen_window != NULL)
     return;
 
   for (i = 0; i < n_rects; i++) {
@@ -633,12 +653,41 @@ swfdec_gtk_widget_invalidate_cb (SwfdecPlayer *player, const SwfdecRectangle *ex
 }
 
 static void
+swfdec_gtk_widget_do_fullscreen (SwfdecGtkWidget *widget, gboolean fullscreen)
+{
+  SwfdecGtkWidgetPrivate *priv = widget->priv;
+
+  if (priv->fullscreen_mode)
+    return;
+
+  if (fullscreen && priv->fullscreen_window == NULL) {
+    GtkWidget *window, *child;
+    
+    priv->fullscreen_window = window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    child = swfdec_gtk_widget_new_fullscreen (priv->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 && priv->fullscreen_window != NULL) {
+    gtk_widget_destroy (priv->fullscreen_window);
+    g_object_unref (priv->fullscreen_window);
+    priv->fullscreen_window = NULL;
+  }
+  swfdec_gtk_widget_clear_invalidations (widget);
+  gtk_widget_queue_draw (GTK_WIDGET (widget));
+}
+
+static void
 swfdec_gtk_widget_notify_cb (SwfdecPlayer *player, GParamSpec *pspec, SwfdecGtkWidget *widget)
 {
   if (g_str_equal (pspec->name, "mouse-cursor")) {
     swfdec_gtk_widget_update_cursor (widget);
   } else if (g_str_equal (pspec->name, "initialized")) {
     gtk_widget_queue_resize (GTK_WIDGET (widget));
+  } else if (g_str_equal (pspec->name, "fullscreen")) {
+    swfdec_gtk_widget_do_fullscreen (widget, swfdec_player_get_fullscreen (player));
   }
 }
 
@@ -654,11 +703,16 @@ swfdec_gtk_widget_notify_cb (SwfdecPlayer *player, GParamSpec *pspec, SwfdecGtkW
 void
 swfdec_gtk_widget_set_player (SwfdecGtkWidget *widget, SwfdecPlayer *player)
 {
-  SwfdecGtkWidgetPrivate *priv = widget->priv;
+  SwfdecGtkWidgetPrivate *priv;
 
   g_return_if_fail (SWFDEC_IS_GTK_WIDGET (widget));
   g_return_if_fail (player == NULL || SWFDEC_IS_PLAYER (player));
   
+  priv = widget->priv;
+  if (priv->player == player)
+    return;
+
+  swfdec_gtk_widget_clear_invalidations (widget);
   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);
@@ -678,6 +732,7 @@ swfdec_gtk_widget_set_player (SwfdecGtkWidget *widget, SwfdecPlayer *player)
   gtk_widget_queue_resize (GTK_WIDGET (widget));
   g_object_notify (G_OBJECT (widget), "player");
   swfdec_gtk_widget_update_renderer (widget);
+  swfdec_gtk_widget_do_fullscreen (widget, player ? swfdec_player_get_fullscreen (player) : FALSE);
 }
 
 /**
@@ -717,6 +772,29 @@ swfdec_gtk_widget_new (SwfdecPlayer *player)
 }
 
 /**
+ * swfdec_gtk_widget_new_fullscreen:
+ * @player: a #SwfdecPlayer
+ *
+ * Creates a new #SwfdecGtkWidget to display @player inside a fullscreen 
+ * window.
+ *
+ * Returns: the new widget that displays @player in fullscreen mode.
+ **/
+GtkWidget *
+swfdec_gtk_widget_new_fullscreen (SwfdecPlayer *player)
+{
+  SwfdecGtkWidget *widget;
+  
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL);
+
+  /* NB: We must set fullscreen mode before setting the player, or we 
+   * get inf-loops when setting the player creates fullscreen windows */
+  widget = g_object_new (SWFDEC_TYPE_GTK_WIDGET, "fullscreen-mode", TRUE, "player", player, NULL);
+
+  return GTK_WIDGET (widget);
+}
+
+/**
  * swfdec_gtk_widget_set_interactive:
  * @widget: a #SwfdecGtkWidget
  * @interactive: %TRUE to make the widget interactive
diff --git a/swfdec-gtk/swfdec_gtk_widget.h b/swfdec-gtk/swfdec_gtk_widget.h
index 370fc20..4351640 100644
--- a/swfdec-gtk/swfdec_gtk_widget.h
+++ b/swfdec-gtk/swfdec_gtk_widget.h
@@ -51,6 +51,7 @@ struct _SwfdecGtkWidgetClass
 GType		swfdec_gtk_widget_get_type		(void);
 
 GtkWidget *	swfdec_gtk_widget_new			(SwfdecPlayer *		player);
+GtkWidget *	swfdec_gtk_widget_new_fullscreen	(SwfdecPlayer *		player);
 
 void		swfdec_gtk_widget_set_player		(SwfdecGtkWidget *	widget,
 							 SwfdecPlayer *		player);
commit 0154de03e28c9c139c57711d4268ec0e59b65f9a
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 13:16:36 2008 +0200

    report correct stage width and height

diff --git a/swfdec/swfdec_stage_as.c b/swfdec/swfdec_stage_as.c
index 858628c..88f82d2 100644
--- a/swfdec/swfdec_stage_as.c
+++ b/swfdec/swfdec_stage_as.c
@@ -136,9 +136,12 @@ void
 get_width (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SwfdecPlayer *player = SWFDEC_PLAYER (cx);
+  SwfdecPlayerPrivate *priv = SWFDEC_PLAYER (cx)->priv;
 
-  SWFDEC_AS_VALUE_SET_INT (ret, player->priv->internal_width);
+  if (priv->scale_mode == SWFDEC_SCALE_NONE)
+    SWFDEC_AS_VALUE_SET_INT (ret, priv->internal_width);
+  else
+    SWFDEC_AS_VALUE_SET_INT (ret, priv->width);
 }
 
 SWFDEC_AS_NATIVE (666, 7, get_height)
@@ -146,9 +149,12 @@ void
 get_height (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SwfdecPlayer *player = SWFDEC_PLAYER (cx);
+  SwfdecPlayerPrivate *priv = SWFDEC_PLAYER (cx)->priv;
 
-  SWFDEC_AS_VALUE_SET_INT (ret, player->priv->internal_height);
+  if (priv->scale_mode == SWFDEC_SCALE_NONE)
+    SWFDEC_AS_VALUE_SET_INT (ret, priv->internal_height);
+  else
+    SWFDEC_AS_VALUE_SET_INT (ret, priv->height);
 }
 
 /* FIXME: do this smarter */
commit 83831e7a61681517dbfd6d7b0500ca06288d47e2
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 13:16:17 2008 +0200

    properly emit an onResize event when going into/out of fullscreen

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index a40880b..ada8aa2 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2603,6 +2603,33 @@ swfdec_player_add_missing_plugin (SwfdecPlayer *player, const char *detail)
   priv->missing_plugins = g_slist_prepend (priv->missing_plugins, g_strdup (detail));
 }
 
+static void
+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;
+  }
+
+  if (priv->scale_mode != SWFDEC_SCALE_NONE)
+    return;
+
+  /* only broadcast once */
+  if (priv->internal_width == priv->broadcasted_width &&
+      priv->internal_height == priv->broadcasted_height)
+    return;
+
+  priv->broadcasted_width = priv->internal_width;
+  priv->broadcasted_height = priv->internal_height;
+  swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onResize, 0, NULL);
+}
+
 void
 swfdec_player_set_fullscreen (SwfdecPlayer *player, gboolean fullscreen)
 {
@@ -2623,15 +2650,17 @@ swfdec_player_set_fullscreen (SwfdecPlayer *player, gboolean fullscreen)
   priv->fullscreen = fullscreen;
   g_object_notify (G_OBJECT (player), "fullscreen");
   SWFDEC_AS_VALUE_SET_BOOLEAN (&val, fullscreen);
+  swfdec_player_update_scale (player);
   if (SWFDEC_AS_CONTEXT (player)->global) {
     SwfdecSandbox *sandbox = SWFDEC_SANDBOX (SWFDEC_AS_CONTEXT (player)->global);
     swfdec_sandbox_unuse (sandbox);
+    swfdec_player_update_size (player, NULL);
     swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onFullScreen, 1, &val);
     swfdec_sandbox_use (sandbox);
   } else {
+    swfdec_player_update_size (player, NULL);
     swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onFullScreen, 1, &val);
   }
-  swfdec_player_update_scale (player);
 }
 
 /** PUBLIC API ***/
@@ -3100,29 +3129,6 @@ swfdec_player_get_size (SwfdecPlayer *player, int *width, int *height)
     *height = player->priv->stage_height;
 }
 
-static void
-swfdec_player_update_size (gpointer playerp, gpointer unused)
-{
-  SwfdecPlayer *player = playerp;
-  SwfdecPlayerPrivate *priv = player->priv;
-
-  /* FIXME: only update if not fullscreen */
-  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;
-
-  /* only broadcast once */
-  if (priv->internal_width == priv->broadcasted_width &&
-      priv->internal_height == priv->broadcasted_height)
-    return;
-
-  priv->broadcasted_width = priv->internal_width;
-  priv->broadcasted_height = priv->internal_height;
-  swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onResize, 0, NULL);
-}
-
 /**
  * swfdec_player_set_size:
  * @player: a #SwfdecPlayer
commit 8f02998132edd98416499ffda1ff5d85342a6a0d
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 12:39:34 2008 +0200

    unref the correct renderer

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index cc73066..a40880b 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -3457,7 +3457,7 @@ swfdec_player_set_renderer (SwfdecPlayer *player, SwfdecRenderer *renderer)
     renderer = swfdec_renderer_new_default (player);
   }
   if (priv->renderer)
-    g_object_unref (renderer);
+    g_object_unref (priv->renderer);
   priv->renderer = renderer;
   g_object_notify (G_OBJECT (player), "renderer");
 }
commit d1e6a3b941552fe36f02a53e3e0c66eee73660fe
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 12:39:10 2008 +0200

    don't return an image if we have no image
    
    fixes warnings that sometimes appear upon youtube start

diff --git a/swfdec/swfdec_net_stream.c b/swfdec/swfdec_net_stream.c
index 60cc20b..bc19bbf 100644
--- a/swfdec/swfdec_net_stream.c
+++ b/swfdec/swfdec_net_stream.c
@@ -342,6 +342,9 @@ swfdec_net_stream_video_provider_get_image (SwfdecVideoProvider *provider,
     return swfdec_cached_video_get_surface (cached);
   }
 
+  if (stream->flvdecoder == NULL)
+    return NULL;
+
   if (stream->decoder != NULL &&
       (stream->decoder_time >= stream->current_time)) {
     swfdec_video_decoder_free (stream->decoder);
commit 3a4b36482ba64eac946a87cc624f7b7c7e0a705c
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 11:59:43 2008 +0200

    allow fullscreen on mouse clicks or key presses

diff --git a/swfdec-gtk/swfdec_gtk_widget.c b/swfdec-gtk/swfdec_gtk_widget.c
index 017e170..af6351c 100644
--- a/swfdec-gtk/swfdec_gtk_widget.c
+++ b/swfdec-gtk/swfdec_gtk_widget.c
@@ -107,7 +107,9 @@ swfdec_gtk_widget_button_press (GtkWidget *gtkwidget, GdkEventButton *event)
   SwfdecGtkWidgetPrivate *priv = widget->priv;
 
   if (event->type == GDK_BUTTON_PRESS && event->button <= 32 && priv->interactive && priv->player) {
+    swfdec_player_set_allow_fullscreen (priv->player, TRUE);
     swfdec_player_mouse_press (priv->player, event->x, event->y, event->button);
+    swfdec_player_set_allow_fullscreen (priv->player, FALSE);
   }
   return FALSE;
 }
@@ -119,7 +121,9 @@ swfdec_gtk_widget_button_release (GtkWidget *gtkwidget, GdkEventButton *event)
   SwfdecGtkWidgetPrivate *priv = widget->priv;
 
   if (event->button <= 32 && priv->interactive && priv->player) {
+    swfdec_player_set_allow_fullscreen (priv->player, TRUE);
     swfdec_player_mouse_release (priv->player, event->x, event->y, event->button);
+    swfdec_player_set_allow_fullscreen (priv->player, FALSE);
   }
   return FALSE;
 }
@@ -160,8 +164,10 @@ swfdec_gtk_widget_key_press (GtkWidget *gtkwidget, GdkEventKey *event)
   if (priv->interactive && priv->player) {
     guint keycode = swfdec_gtk_event_to_keycode (event);
     if (keycode != 0) {
+      swfdec_player_set_allow_fullscreen (priv->player, TRUE);
       swfdec_player_key_press (priv->player, keycode, 
 	  gdk_keyval_to_unicode (event->keyval));
+      swfdec_player_set_allow_fullscreen (priv->player, FALSE);
     }
     return TRUE;
   }
@@ -178,8 +184,10 @@ swfdec_gtk_widget_key_release (GtkWidget *gtkwidget, GdkEventKey *event)
   if (priv->interactive && priv->player) {
     guint keycode = swfdec_gtk_event_to_keycode (event);
     if (keycode != 0) {
+      swfdec_player_set_allow_fullscreen (priv->player, TRUE);
       swfdec_player_key_release (priv->player, keycode, 
 	  gdk_keyval_to_unicode (event->keyval));
+      swfdec_player_set_allow_fullscreen (priv->player, FALSE);
     }
     return TRUE;
   }
commit 982d29edcb1189d92d8ce3af395e5e8f09657180
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 11:52:04 2008 +0200

    unset the sandbox during onFullScreen signal

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 26879f6..cc73066 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -2623,7 +2623,14 @@ swfdec_player_set_fullscreen (SwfdecPlayer *player, gboolean fullscreen)
   priv->fullscreen = fullscreen;
   g_object_notify (G_OBJECT (player), "fullscreen");
   SWFDEC_AS_VALUE_SET_BOOLEAN (&val, fullscreen);
-  swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onFullScreen, 1, &val);
+  if (SWFDEC_AS_CONTEXT (player)->global) {
+    SwfdecSandbox *sandbox = SWFDEC_SANDBOX (SWFDEC_AS_CONTEXT (player)->global);
+    swfdec_sandbox_unuse (sandbox);
+    swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onFullScreen, 1, &val);
+    swfdec_sandbox_use (sandbox);
+  } else {
+    swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onFullScreen, 1, &val);
+  }
   swfdec_player_update_scale (player);
 }
 
commit 99324833b1e99750893fd8e1f436a46754c6d9ac
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 11:47:10 2008 +0200

    handle fullscreen in auto-scale

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index bfc0df5..26879f6 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -809,8 +809,14 @@ swfdec_player_update_scale (SwfdecPlayer *player)
   int width, height;
   double scale_x, scale_y;
 
-  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->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;
+  }
+
   if (priv->stage.height == 0 || priv->stage.width == 0) {
     priv->scale_x = 1.0;
     priv->scale_y = 1.0;
@@ -2618,6 +2624,7 @@ swfdec_player_set_fullscreen (SwfdecPlayer *player, gboolean fullscreen)
   g_object_notify (G_OBJECT (player), "fullscreen");
   SWFDEC_AS_VALUE_SET_BOOLEAN (&val, fullscreen);
   swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onFullScreen, 1, &val);
+  swfdec_player_update_scale (player);
 }
 
 /** PUBLIC API ***/
commit 3fffbc3c7b9f547b7a74cd38e73dc17923351006
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 11:45:04 2008 +0200

    reported Stage.displayState the wrong way

diff --git a/swfdec/swfdec_stage_as.c b/swfdec/swfdec_stage_as.c
index f53b8de..858628c 100644
--- a/swfdec/swfdec_stage_as.c
+++ b/swfdec/swfdec_stage_as.c
@@ -190,9 +190,9 @@ swfdec_stage_get_displayState (SwfdecAsContext *cx, SwfdecAsObject *object,
   SwfdecPlayerPrivate *priv = SWFDEC_PLAYER (cx)->priv;
 
   if (priv->fullscreen)
-    SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_normal);
-  else
     SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_fullScreen);
+  else
+    SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_normal);
 }
 
 SWFDEC_AS_NATIVE (666, 12, swfdec_stage_set_displayState)
commit cae80031b0024f727a0bef9f1f02b7b5e7b91a36
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 11:18:02 2008 +0200

    implement fullscreen

diff --git a/swfdec/swfdec_as_strings.c b/swfdec/swfdec_as_strings.c
index b7bf838..6285a6b 100644
--- a/swfdec/swfdec_as_strings.c
+++ b/swfdec/swfdec_as_strings.c
@@ -503,5 +503,7 @@ const char swfdec_as_strings[] =
   SWFDEC_AS_CONSTANT_STRING ("tabChildren")
   SWFDEC_AS_CONSTANT_STRING ("tabIndex")
   SWFDEC_AS_CONSTANT_STRING ("onChanged")
+  SWFDEC_AS_CONSTANT_STRING ("fullScreen")
+  SWFDEC_AS_CONSTANT_STRING ("onFullScreen")
   /* add more here */
 ;
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 58422c8..bfc0df5 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -1538,7 +1538,15 @@ swfdec_player_handle_tab (SwfdecPlayer *player, gboolean forward)
 }
 
 static void
-swfdec_player_handle_special_keys (SwfdecPlayer *player, guint key)
+swfdec_player_handle_special_keys_before (SwfdecPlayer *player, guint key)
+{
+  if (key == SWFDEC_KEY_ESCAPE) {
+    swfdec_player_set_fullscreen (player, FALSE);
+  }
+}
+
+static void
+swfdec_player_handle_special_keys_after (SwfdecPlayer *player, guint key)
 {
   if (key == SWFDEC_KEY_TAB) {
     gboolean forward = swfdec_player_is_key_pressed (player, SWFDEC_KEY_SHIFT);
@@ -1562,6 +1570,8 @@ swfdec_player_do_handle_key (SwfdecPlayer *player, guint keycode, guint characte
   } else {
     priv->key_pressed[keycode / 8] &= ~(1 << keycode % 8);
   }
+  if (down)
+    swfdec_player_handle_special_keys_before (player, keycode);
   swfdec_player_broadcast (player, SWFDEC_AS_STR_Key, 
       down ? SWFDEC_AS_STR_onKeyDown : SWFDEC_AS_STR_onKeyUp, 0, NULL);
   if (priv->focus) {
@@ -1575,7 +1585,7 @@ swfdec_player_do_handle_key (SwfdecPlayer *player, guint keycode, guint characte
     }
   }
   if (down)
-    swfdec_player_handle_special_keys (player, keycode);
+    swfdec_player_handle_special_keys_after (player, keycode);
   swfdec_player_perform_actions (player);
   swfdec_player_unlock (player);
 
@@ -2587,6 +2597,29 @@ swfdec_player_add_missing_plugin (SwfdecPlayer *player, const char *detail)
   priv->missing_plugins = g_slist_prepend (priv->missing_plugins, g_strdup (detail));
 }
 
+void
+swfdec_player_set_fullscreen (SwfdecPlayer *player, gboolean fullscreen)
+{
+  SwfdecPlayerPrivate *priv;
+  SwfdecAsValue val;
+
+  g_return_if_fail (SWFDEC_IS_PLAYER (player));
+
+  priv = player->priv;
+  if (priv->fullscreen == fullscreen)
+    return;
+
+  if (fullscreen && !priv->allow_fullscreen) {
+    SWFDEC_INFO ("going fullscreen not allowed");
+    return;
+  }
+
+  priv->fullscreen = fullscreen;
+  g_object_notify (G_OBJECT (player), "fullscreen");
+  SWFDEC_AS_VALUE_SET_BOOLEAN (&val, fullscreen);
+  swfdec_player_broadcast (player, SWFDEC_AS_STR_Stage, SWFDEC_AS_STR_onFullScreen, 1, &val);
+}
+
 /** PUBLIC API ***/
 
 /**
diff --git a/swfdec/swfdec_player_internal.h b/swfdec/swfdec_player_internal.h
index 87294f8..bafcaf7 100644
--- a/swfdec/swfdec_player_internal.h
+++ b/swfdec/swfdec_player_internal.h
@@ -223,6 +223,8 @@ void		swfdec_player_add_action_script	(SwfdecPlayer *		player,
 void		swfdec_player_remove_all_actions (SwfdecPlayer *      	player,
 						 SwfdecActor *		actor);
 
+void		swfdec_player_set_fullscreen	(SwfdecPlayer *		player,
+						 gboolean		fullscreen);
 void		swfdec_player_set_drag_movie	(SwfdecPlayer *		player,
 						 SwfdecActor *		drag,
 						 gboolean		center,
diff --git a/swfdec/swfdec_stage_as.c b/swfdec/swfdec_stage_as.c
index 87ced97..f53b8de 100644
--- a/swfdec/swfdec_stage_as.c
+++ b/swfdec/swfdec_stage_as.c
@@ -23,6 +23,7 @@
 
 #include <string.h>
 #include "swfdec_as_internal.h"
+#include "swfdec_as_native_function.h"
 #include "swfdec_as_strings.h"
 #include "swfdec_debug.h"
 #include "swfdec_player_internal.h"
@@ -186,7 +187,12 @@ void
 swfdec_stage_get_displayState (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("Stage.displayState (get)");
+  SwfdecPlayerPrivate *priv = SWFDEC_PLAYER (cx)->priv;
+
+  if (priv->fullscreen)
+    SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_normal);
+  else
+    SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_fullScreen);
 }
 
 SWFDEC_AS_NATIVE (666, 12, swfdec_stage_set_displayState)
@@ -194,7 +200,16 @@ void
 swfdec_stage_set_displayState (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("Stage.displayState (set)");
+  SwfdecPlayer *player = SWFDEC_PLAYER (cx);
+  const char *s;
+
+  SWFDEC_AS_CHECK (0, NULL, "s", &s);
+
+  if (g_ascii_strcasecmp (s, SWFDEC_AS_STR_normal) == 0) {
+    swfdec_player_set_fullscreen (player, FALSE);
+  } else if (g_ascii_strcasecmp (s, SWFDEC_AS_STR_fullScreen) == 0) {
+    swfdec_player_set_fullscreen (player, TRUE);
+  }
 }
 
 SWFDEC_AS_NATIVE (666, 100, swfdec_stage_get_fullScreenSourceRect)
commit d7f23adad9ebfcb2abb520e510f259cda9fb98ab
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Apr 14 10:43:18 2008 +0200

    add API for goint fullscreen

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 92f4480..58422c8 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -665,7 +665,9 @@ enum {
   PROP_VARIABLES,
   PROP_START_TIME,
   PROP_FOCUS,
-  PROP_RENDERER
+  PROP_RENDERER,
+  PROP_FULLSCREEN,
+  PROP_ALLOW_FULLSCREEN
 };
 
 G_DEFINE_TYPE (SwfdecPlayer, swfdec_player, SWFDEC_TYPE_AS_CONTEXT)
@@ -788,6 +790,12 @@ swfdec_player_get_property (GObject *object, guint param_id, GValue *value,
     case PROP_RENDERER:
       g_value_set_object (value, priv->renderer);
       break;
+    case PROP_FULLSCREEN:
+      g_value_set_boolean (value, priv->fullscreen);
+      break;
+    case PROP_ALLOW_FULLSCREEN:
+      g_value_set_boolean (value, priv->allow_fullscreen);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
       break;
@@ -932,6 +940,9 @@ swfdec_player_set_property (GObject *object, guint param_id, const GValue *value
     case PROP_RENDERER:
       swfdec_player_set_renderer (player, g_value_get_object (value));
       break;
+    case PROP_ALLOW_FULLSCREEN:
+      swfdec_player_set_allow_fullscreen (player, g_value_get_boolean (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
       break;
@@ -2011,6 +2022,13 @@ swfdec_player_class_init (SwfdecPlayerClass *klass)
   g_object_class_install_property (object_class, PROP_RENDERER,
       g_param_spec_object ("renderer", "renderer", "the renderer used by this player",
 	  SWFDEC_TYPE_RENDERER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+  g_object_class_install_property (object_class, PROP_FULLSCREEN,
+      g_param_spec_boolean ("fullscreen", "fullscreen", "if the player is in fullscreen mode",
+	  FALSE, G_PARAM_READABLE));
+  g_object_class_install_property (object_class, PROP_ALLOW_FULLSCREEN,
+      g_param_spec_boolean ("allow-fullscreen", "allow fullscreen", 
+	  "if the player is allowed to change into fullscreen mode",
+	  FALSE, G_PARAM_READWRITE));
 
   /**
    * SwfdecPlayer::invalidate:
@@ -3548,3 +3566,58 @@ swfdec_player_set_variables (SwfdecPlayer *player, const char *variables)
   g_object_notify (G_OBJECT (player), "variables");
 }
 
+/**
+ * swfdec_player_get_fullscreen:
+ * @player: the player
+ *
+ * CHecks if the player is in fullscreen mode currently. If the player is
+ * in fullscreen mode, it assumes it occupies the whole screen. A player will
+ * only ever go into fullscreen, if you have allowed it by calling 
+ * swfdec_player_set_allow_fullscreen().
+ *
+ * Returns: %TRUE if the player is in fullscreen mode currently
+ **/
+gboolean
+swfdec_player_get_fullscreen (SwfdecPlayer *player)
+{
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE);
+
+  return player->priv->fullscreen;
+}
+
+/**
+ * swfdec_player_get_allow_fullscreen:
+ * @player: the player
+ *
+ * Checks if the player is allowed to go fullscreen. See 
+ * swfdec_player_set_allow_fullscreen() for details.
+ *
+ * Returns: %TRUE if the player is allowed to go fullscreen
+ **/
+gboolean
+swfdec_player_get_allow_fullscreen (SwfdecPlayer *player)
+{
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE);
+
+  return player->priv->allow_fullscreen;
+}
+
+/**
+ * swfdec_player_set_allow_fullscreen:
+ * @player: the player
+ * @allow: if the player should be allowed to go fullscreen
+ *
+ * Sets if the player is allowed to go fullscreen. If a player is allowed to go
+ * fullscreen, it may set the SwfdecPlayer::fullscreen property to %TRUE. 
+ * Players are not allowed to go fullscreen by default. Usually applications 
+ * only want to allow going fullscreen in response to mouse or keyboard events.
+ **/
+void
+swfdec_player_set_allow_fullscreen (SwfdecPlayer *player, gboolean allow)
+{
+  g_return_if_fail (SWFDEC_IS_PLAYER (player));
+
+  player->priv->allow_fullscreen = allow;
+  g_object_notify (G_OBJECT (player), "allow-fullscreen");
+}
+
diff --git a/swfdec/swfdec_player.h b/swfdec/swfdec_player.h
index c259895..c6656bf 100644
--- a/swfdec/swfdec_player.h
+++ b/swfdec/swfdec_player.h
@@ -147,6 +147,12 @@ void		swfdec_player_set_focus		(SwfdecPlayer *		player,
 SwfdecRenderer *swfdec_player_get_renderer	(SwfdecPlayer *		player);
 void		swfdec_player_set_renderer	(SwfdecPlayer *		player,
 						 SwfdecRenderer *	renderer);
+gboolean	swfdec_player_get_fullscreen	(SwfdecPlayer *		player);
+gboolean	swfdec_player_get_allow_fullscreen
+						(SwfdecPlayer *		player);
+void		swfdec_player_set_allow_fullscreen
+						(SwfdecPlayer *		player,
+						 gboolean		allow);
 					 
 void		swfdec_player_render		(SwfdecPlayer *		player,
 						 cairo_t *		cr,
diff --git a/swfdec/swfdec_player_internal.h b/swfdec/swfdec_player_internal.h
index 94b9a98..87294f8 100644
--- a/swfdec/swfdec_player_internal.h
+++ b/swfdec/swfdec_player_internal.h
@@ -80,6 +80,7 @@ struct _SwfdecPlayerPrivate
   GType			loader_type;		/* type to use for creating sockets */
   GType			socket_type;		/* type to use for creating sockets */
   gboolean		has_focus;		/* TRUE if this movie is given focus */
+  gboolean		allow_fullscreen;	/* TRUE if this movie may go fullscreen */
   /* stage properties */
   guint			internal_width;		/* width used by the scripting engine */
   guint			internal_height;	/* height used by the scripting engine */
@@ -107,6 +108,7 @@ struct _SwfdecPlayerPrivate
   SwfdecRectangle     	invalid_extents;      	/* extents of area that needs a redraw in global coordinates */
   GArray *		invalidations;		/* fine-grained areas in need of redraw */
   GSList *		invalid_pending;	/* pending invalidations due to invalidate_last */
+  gboolean		fullscreen;		/* TRUE if the player has gone fullscreen */
 
   /* mouse */
   gboolean		mouse_visible;	  	/* show the mouse (actionscriptable) */


More information about the Swfdec-commits mailing list