summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Mikhaylenko <alexm@gnome.org>2021-03-23 18:52:05 +0500
committerAlexander Mikhaylenko <alexm@gnome.org>2021-03-24 17:10:26 +0500
commit0549ac463e3f38fed0c111730242ea9196b745cf (patch)
tree299c46e3fe707610286d1054ba53696d75920211
parent184cdf797c9f78ae600a2873c7df0ed4b705a54f (diff)
downloadepiphany-wip/exalm/fullscreen.tar.gz
header-bar: Hide menu popover when fullscreeningwip/exalm/fullscreen
Since the focus after pressing the fullscreen button is inside the popover, neither it nor header bar would hide on their own. We want them to hide though, so hide the popover first, then header bar will hide properly.
-rw-r--r--src/ephy-header-bar.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/src/ephy-header-bar.c b/src/ephy-header-bar.c
index 104374628..4d8e41176 100644
--- a/src/ephy-header-bar.c
+++ b/src/ephy-header-bar.c
@@ -38,6 +38,8 @@
#include <glib/gi18n.h>
#include <handy.h>
+#define POPOVER_HIDE_DELAY 300
+
enum {
PROP_0,
PROP_WINDOW,
@@ -63,6 +65,9 @@ struct _EphyHeaderBar {
GtkWidget *restore_button;
GtkWidget *combined_stop_reload_button;
GtkWidget *combined_stop_reload_image;
+ GtkWidget *page_menu_popover;
+
+ guint popover_hide_timeout_id;
};
G_DEFINE_TYPE (EphyHeaderBar, ephy_header_bar, GTK_TYPE_HEADER_BAR)
@@ -116,6 +121,16 @@ sync_chromes_visibility (EphyHeaderBar *header_bar)
gtk_widget_set_visible (header_bar->page_menu_button, chrome & EPHY_WINDOW_CHROME_MENU);
}
+static gboolean
+hide_timeout_cb (EphyHeaderBar *header_bar)
+{
+ gtk_popover_popdown (GTK_POPOVER (header_bar->page_menu_popover));
+
+ header_bar->popover_hide_timeout_id = 0;
+
+ return G_SOURCE_REMOVE;
+}
+
void
fullscreen_changed_cb (EphyHeaderBar *header_bar)
{
@@ -126,6 +141,13 @@ fullscreen_changed_cb (EphyHeaderBar *header_bar)
gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (header_bar), !fullscreen);
gtk_widget_set_visible (header_bar->restore_button, fullscreen);
ephy_action_bar_set_is_fullscreen (header_bar->action_bar_start, fullscreen);
+
+ if (fullscreen) {
+ g_clear_handle_id (&header_bar->popover_hide_timeout_id, g_source_remove);
+
+ header_bar->popover_hide_timeout_id =
+ g_timeout_add (POPOVER_HIDE_DELAY, (GSourceFunc)hide_timeout_cb, header_bar);
+ }
}
static void
@@ -168,7 +190,6 @@ ephy_header_bar_constructed (GObject *object)
{
EphyHeaderBar *header_bar = EPHY_HEADER_BAR (object);
GtkWidget *button;
- GtkWidget *page_menu_popover;
GtkWidget *event_box;
GtkBuilder *builder;
EphyEmbedShell *embed_shell;
@@ -263,7 +284,7 @@ ephy_header_bar_constructed (GObject *object)
gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
g_type_ensure (G_TYPE_THEMED_ICON);
builder = gtk_builder_new_from_resource ("/org/gnome/epiphany/gtk/page-menu-popover.ui");
- page_menu_popover = GTK_WIDGET (gtk_builder_get_object (builder, "page-menu-popover"));
+ header_bar->page_menu_popover = GTK_WIDGET (gtk_builder_get_object (builder, "page-menu-popover"));
header_bar->zoom_level_label = GTK_WIDGET (gtk_builder_get_object (builder, "zoom-level"));
if (ephy_embed_shell_get_mode (embed_shell) == EPHY_EMBED_SHELL_MODE_APPLICATION) {
gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "new-window-separator")));
@@ -306,7 +327,7 @@ ephy_header_bar_constructed (GObject *object)
}
g_settings_bind (EPHY_SETTINGS_WEB, EPHY_PREFS_WEB_ENABLE_WEBEXTENSIONS, gtk_builder_get_object (builder, "extensions-button"), "visible", G_SETTINGS_BIND_DEFAULT);
- gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), page_menu_popover);
+ gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), header_bar->page_menu_popover);
g_object_unref (builder);
gtk_header_bar_pack_end (GTK_HEADER_BAR (header_bar), button);
@@ -341,6 +362,16 @@ ephy_header_bar_constructed (GObject *object)
}
static void
+ephy_header_bar_dispose (GObject *object)
+{
+ EphyHeaderBar *header_bar = EPHY_HEADER_BAR (object);
+
+ g_clear_handle_id (&header_bar->popover_hide_timeout_id, g_source_remove);
+
+ G_OBJECT_CLASS (ephy_header_bar_parent_class)->dispose (object);
+}
+
+static void
ephy_header_bar_init (EphyHeaderBar *header_bar)
{
}
@@ -353,6 +384,7 @@ ephy_header_bar_class_init (EphyHeaderBarClass *klass)
gobject_class->set_property = ephy_header_bar_set_property;
gobject_class->get_property = ephy_header_bar_get_property;
gobject_class->constructed = ephy_header_bar_constructed;
+ gobject_class->dispose = ephy_header_bar_dispose;
object_properties[PROP_WINDOW] =
g_param_spec_object ("window",