[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