From 80208a260e2c657753a03869b2693f3c0cb94efe Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Mon, 30 Nov 2015 23:29:36 +0000 Subject: backend: embed the fullscreen top header bar in the video widget On wayland the video has its own subsurface. It is directly painted by the compositor on top of Totem's main window. As a result on wayland the top header bar is not visible in fullscreen mode. To solve this issue, we can embed the top header bar in the video widget. This solves this issue nicely by having the same behavior on X11 and Wayland. https://bugzilla.gnome.org/show_bug.cgi?id=758876 --- src/totem-object.c | 67 ++++++++++-------------------------------------------- 1 file changed, 12 insertions(+), 55 deletions(-) (limited to 'src/totem-object.c') diff --git a/src/totem-object.c b/src/totem-object.c index f41962058..fcb5c4acc 100644 --- a/src/totem-object.c +++ b/src/totem-object.c @@ -1635,30 +1635,6 @@ totem_object_pause (TotemObject *totem) } } -static void -update_toolbar_visibility (TotemObject *totem, - gboolean animate) -{ - gboolean visible; - guint duration; - - if (totem->controls_visibility != TOTEM_CONTROLS_FULLSCREEN) { - visible = FALSE; - duration = 0; - } else { - g_object_get (G_OBJECT (totem->bvw), "reveal-controls", &visible, NULL); - duration = animate ? 250 : 0; - } - - if (visible) - gtk_widget_show (totem->revealer); - - /* We don't change the transition type, because it causes - * a queue resize, and it might short-circuit the animation */ - gtk_revealer_set_transition_duration (GTK_REVEALER (totem->revealer), duration); - gtk_revealer_set_reveal_child (GTK_REVEALER (totem->revealer), visible); -} - gboolean window_state_event_cb (GtkWidget *window, GdkEventWindowState *event, @@ -1682,7 +1658,8 @@ window_state_event_cb (GtkWidget *window, show_controls (totem, TRUE); } - update_toolbar_visibility (totem, FALSE); + bacon_video_widget_set_fullscreen (totem->bvw, + totem->controls_visibility == TOTEM_CONTROLS_FULLSCREEN); action = g_action_map_lookup_action (G_ACTION_MAP (totem), "fullscreen"); g_simple_action_set_state (G_SIMPLE_ACTION (action), @@ -2472,14 +2449,6 @@ update_fill (TotemObject *totem, gdouble level) } } -static void -on_reveal_controls_changed (GObject *gobject, - GParamSpec *pspec, - TotemObject *totem) -{ - update_toolbar_visibility (totem, TRUE); -} - static void update_seekable (TotemObject *totem) { @@ -3959,25 +3928,14 @@ grilo_widget_setup (TotemObject *totem) gtk_stack_set_visible_child_name (GTK_STACK (totem->stack), "grilo"); } -static void -child_revealed_changed_cb (GObject *object, - GParamSpec *pspec, - gpointer user_data) -{ - gboolean val; - - g_object_get (object, "child-revealed", &val, NULL); - if (!val) - gtk_widget_hide (GTK_WIDGET (object)); -} - static void add_fullscreen_toolbar (TotemObject *totem) { - GtkWidget *item; + GtkWidget *container, *item; GMenuModel *menu; - totem->revealer = GTK_WIDGET (gtk_builder_get_object (totem->xml, "toolbar-revealer")); + container = GTK_WIDGET (bacon_video_widget_get_header_controls_object (totem->bvw)); + totem->fullscreen_header = g_object_new (TOTEM_TYPE_MAIN_TOOLBAR, "show-search-button", FALSE, "show-select-button", FALSE, @@ -4010,11 +3968,8 @@ add_fullscreen_toolbar (TotemObject *totem) G_CALLBACK (popup_menu_shown_cb), totem); totem->fullscreen_gear_button = item; - gtk_container_add (GTK_CONTAINER (totem->revealer), totem->fullscreen_header); + gtk_container_add (GTK_CONTAINER (container), totem->fullscreen_header); gtk_widget_show_all (totem->fullscreen_header); - - g_signal_connect (totem->revealer, "notify::child-revealed", - G_CALLBACK (child_revealed_changed_cb), NULL); } void @@ -4023,6 +3978,8 @@ video_widget_create (TotemObject *totem) GError *err = NULL; GtkContainer *container; BaconVideoWidget **bvw; + GdkWindow *window; + gboolean fullscreen; totem->bvw = BACON_VIDEO_WIDGET (bacon_video_widget_new (&err)); @@ -4032,6 +3989,10 @@ video_widget_create (TotemObject *totem) g_error_free (err); } + fullscreen = window && ((gdk_window_get_state (window) & GDK_WINDOW_STATE_FULLSCREEN) != 0); + + window = gtk_widget_get_window (totem->win); + bacon_video_widget_set_fullscreen (totem->bvw, fullscreen); totem->controls = bacon_video_widget_get_controls_object (totem->bvw); g_signal_connect_after (G_OBJECT (totem->bvw), @@ -4070,10 +4031,6 @@ video_widget_create (TotemObject *totem) "error", G_CALLBACK (on_error_event), totem); - g_signal_connect (G_OBJECT (totem->bvw), - "notify::reveal-controls", - G_CALLBACK (on_reveal_controls_changed), - totem); g_signal_connect (G_OBJECT (totem->bvw), "seek-requested", G_CALLBACK (on_seek_requested_event), -- cgit v1.2.1