[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