aboutsummaryrefslogtreecommitdiffstats
path: root/embed/ephy-embed.c
diff options
context:
space:
mode:
Diffstat (limited to 'embed/ephy-embed.c')
-rw-r--r--embed/ephy-embed.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index 3a8d531c0..46366b4bf 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -68,6 +68,8 @@ struct _EphyEmbedPrivate
GSList *destroy_on_transition_list;
GtkWidget *floating_bar;
GtkWidget *progress;
+ GtkWidget *fullscreen_message_label;
+ char *fullscreen_string;
GSList *messages;
GSList *keys;
@@ -78,6 +80,8 @@ struct _EphyEmbedPrivate
guint tab_message_id;
guint pop_statusbar_later_source_id;
+ guint fullscreen_message_id;
+
guint clear_progress_source_id;
gulong status_handler_id;
@@ -280,6 +284,38 @@ ephy_embed_grab_focus (GtkWidget *widget)
gtk_widget_grab_focus (child);
}
+
+static gboolean
+fullscreen_message_label_hide (EphyEmbed *embed)
+{
+ if (embed->priv->fullscreen_message_id) {
+ gtk_widget_hide (embed->priv->fullscreen_message_label);
+ g_source_remove (embed->priv->fullscreen_message_id);
+ embed->priv->fullscreen_message_id = 0;
+ }
+
+ return FALSE;
+}
+
+void
+ephy_embed_entering_fullscreen (EphyEmbed *embed)
+{
+ gtk_widget_show (embed->priv->fullscreen_message_label);
+
+ if (embed->priv->fullscreen_message_id)
+ g_source_remove (embed->priv->fullscreen_message_id);
+
+ embed->priv->fullscreen_message_id = g_timeout_add_seconds (5,
+ (GSourceFunc)fullscreen_message_label_hide,
+ embed);
+}
+
+void
+ephy_embed_leaving_fullscreen (EphyEmbed *embed)
+{
+ fullscreen_message_label_hide (embed);
+}
+
static void
ephy_embed_dispose (GObject *object)
{
@@ -325,6 +361,11 @@ ephy_embed_dispose (GObject *object)
priv->progress_update_handler_id = 0;
}
+ if (priv->fullscreen_message_id) {
+ g_source_remove (priv->fullscreen_message_id);
+ priv->fullscreen_message_id = 0;
+ }
+
G_OBJECT_CLASS (ephy_embed_parent_class)->dispose (object);
}
@@ -359,6 +400,8 @@ ephy_embed_finalize (GObject *object)
g_slist_free (priv->keys);
priv->keys = NULL;
+ g_free (embed->priv->fullscreen_string);
+
G_OBJECT_CLASS (ephy_embed_parent_class)->finalize (object);
}
@@ -497,6 +540,40 @@ download_requested_cb (WebKitWebView *web_view,
return TRUE;
}
+static void
+ephy_embed_set_fullscreen_message (EphyEmbed *embed,
+ gboolean is_html5_fullscreen)
+{
+ char *message;
+
+ if (G_UNLIKELY (embed->priv->fullscreen_string == NULL))
+ embed->priv->fullscreen_string = g_strdup (_("Press %s to exit fullscreen"));
+
+ /* Translators: 'ESC' and 'F11' are keyboard keys. */
+ message = g_strdup_printf (embed->priv->fullscreen_string, is_html5_fullscreen ? _("ESC") : _("F11"));
+ gtk_label_set_text (GTK_LABEL (embed->priv->fullscreen_message_label),
+ message);
+ g_free (message);
+}
+
+static gboolean
+entering_fullscreen_cb (WebKitWebView *web_view,
+ GObject *element,
+ EphyEmbed *embed)
+{
+ ephy_embed_set_fullscreen_message (embed, TRUE);
+ return FALSE;
+}
+
+static gboolean
+leaving_fullscreen_cb (WebKitWebView *web_view,
+ GObject *element,
+ EphyEmbed *embed)
+{
+ ephy_embed_set_fullscreen_message (embed, FALSE);
+ return FALSE;
+}
+
static gboolean
pop_statusbar_later_cb (gpointer data)
{
@@ -621,11 +698,21 @@ ephy_embed_constructed (GObject *object)
overlay = gtk_overlay_new ();
gtk_style_context_add_class (gtk_widget_get_style_context (overlay),
GTK_STYLE_CLASS_OSD);
+
gtk_widget_add_events (overlay,
GDK_ENTER_NOTIFY_MASK |
GDK_LEAVE_NOTIFY_MASK);
gtk_container_add (GTK_CONTAINER (overlay), scrolled_window);
+ /* Floating message popup for fullscreen mode. */
+ priv->fullscreen_message_label = gtk_label_new (NULL);
+ gtk_widget_set_name (priv->fullscreen_message_label, "fullscreen-popup");
+ gtk_widget_set_halign (priv->fullscreen_message_label, GTK_ALIGN_CENTER);
+ gtk_widget_set_valign (priv->fullscreen_message_label, GTK_ALIGN_CENTER);
+ gtk_widget_set_no_show_all (priv->fullscreen_message_label, TRUE);
+ gtk_overlay_add_overlay (GTK_OVERLAY (overlay), priv->fullscreen_message_label);
+ ephy_embed_set_fullscreen_message (embed, FALSE);
+
/* statusbar is hidden by default */
priv->floating_bar = nautilus_floating_bar_new (NULL, FALSE);
gtk_widget_set_halign (priv->floating_bar, GTK_ALIGN_START);
@@ -663,6 +750,8 @@ ephy_embed_constructed (GObject *object)
"signal::notify::load-status", G_CALLBACK (load_status_changed_cb), embed,
"signal::resource-request-starting", G_CALLBACK (resource_request_starting_cb), embed,
"signal::download-requested", G_CALLBACK (download_requested_cb), embed,
+ "signal::entering-fullscreen", G_CALLBACK (entering_fullscreen_cb), embed,
+ "signal::leaving-fullscreen", G_CALLBACK (leaving_fullscreen_cb), embed,
NULL);
priv->status_handler_id = g_signal_connect (web_view, "notify::status-message",