[evince] shell: Use a GtkHeaderBar instead of a GtkToolbar and window decorations



commit 279070fcbd2f390fd0a56f228d8b763e6d3ad468
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sat May 10 11:03:10 2014 +0200

    shell: Use a GtkHeaderBar instead of a GtkToolbar and window decorations
    
    Based on patch by Yosef Or Boczko.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=711078

 libmisc/ev-page-action-widget.c |   25 +++++++++-
 shell/ev-toolbar.c              |   91 ++++++++++++++++----------------------
 shell/ev-toolbar.h              |    4 +-
 shell/ev-window.c               |   78 +++++++++++++++++++--------------
 4 files changed, 106 insertions(+), 92 deletions(-)
---
diff --git a/libmisc/ev-page-action-widget.c b/libmisc/ev-page-action-widget.c
index 1839ee9..f6a5a89 100644
--- a/libmisc/ev-page-action-widget.c
+++ b/libmisc/ev-page-action-widget.c
@@ -329,11 +329,30 @@ ev_page_action_widget_finalize (GObject *object)
 }
 
 static void
-ev_page_action_widget_class_init (EvPageActionWidgetClass *class)
+ev_page_action_widget_get_preferred_width (GtkWidget *widget,
+                                           gint      *minimum_width,
+                                           gint      *natural_width)
 {
-       GObjectClass *object_class = G_OBJECT_CLASS (class);
+        GtkWidget *child;
+
+        *minimum_width = *natural_width = 0;
+
+        child = gtk_bin_get_child (GTK_BIN (widget));
+        if (!child || !gtk_widget_get_visible (child))
+                return;
+
+        gtk_widget_get_preferred_width (child, minimum_width, natural_width);
+        *natural_width = *minimum_width;
+}
+
+static void
+ev_page_action_widget_class_init (EvPageActionWidgetClass *klass)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
        object_class->finalize = ev_page_action_widget_finalize;
+        widget_class->get_preferred_width = ev_page_action_widget_get_preferred_width;
 
        widget_signals[WIDGET_ACTIVATE_LINK] =
                g_signal_new ("activate_link",
@@ -521,7 +540,7 @@ ev_page_action_widget_update_links_model (EvPageActionWidget *proxy, GtkTreeMode
        GtkEntryCompletion *completion;
        GtkCellRenderer *renderer;
 
-       if (!model)
+       if (!model || model == proxy->model)
                return;
 
        /* Magik */
diff --git a/shell/ev-toolbar.c b/shell/ev-toolbar.c
index 31e4089..11a651a 100644
--- a/shell/ev-toolbar.c
+++ b/shell/ev-toolbar.c
@@ -51,7 +51,7 @@ struct _EvToolbarPrivate {
         GMenu *bookmarks_section;
 };
 
-G_DEFINE_TYPE (EvToolbar, ev_toolbar, GTK_TYPE_TOOLBAR)
+G_DEFINE_TYPE (EvToolbar, ev_toolbar, GTK_TYPE_HEADER_BAR)
 
 static void
 ev_toolbar_set_property (GObject      *object,
@@ -146,7 +146,7 @@ ev_toolbar_create_button_group (EvToolbar *ev_toolbar)
         GtkStyleContext *style_context;
         GtkWidget *box;
 
-        box = gtk_box_new (gtk_orientable_get_orientation (GTK_ORIENTABLE (ev_toolbar)), 0);
+        box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
         style_context = gtk_widget_get_style_context (box);
         gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_RAISED);
@@ -209,11 +209,6 @@ ev_toolbar_constructed (GObject *object)
 
         rtl = gtk_widget_get_direction (GTK_WIDGET (ev_toolbar)) == GTK_TEXT_DIR_RTL;
 
-        /* Set the MENUBAR style class so it's possible to drag the app
-         * using the toolbar. */
-        gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (ev_toolbar)),
-                                     GTK_STYLE_CLASS_MENUBAR);
-
         builder = gtk_builder_new_from_resource ("/org/gnome/evince/shell/ui/menus.ui");
 
         /* Navigation */
@@ -231,13 +226,13 @@ ev_toolbar_constructed (GObject *object)
 
         tool_item = GTK_WIDGET (gtk_tool_item_new ());
         if (rtl)
-                gtk_widget_set_margin_left (tool_item, 12);
+                gtk_widget_set_margin_left (tool_item, 6);
         else
-                gtk_widget_set_margin_right (tool_item, 12);
+                gtk_widget_set_margin_right (tool_item, 6);
         gtk_container_add (GTK_CONTAINER (tool_item), hbox);
         gtk_widget_show (hbox);
 
-        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+        gtk_header_bar_pack_start (GTK_HEADER_BAR (ev_toolbar), tool_item);
         gtk_widget_show (tool_item);
 
         /* Page selector */
@@ -247,10 +242,10 @@ ev_toolbar_constructed (GObject *object)
         ev_page_action_widget_set_model (EV_PAGE_ACTION_WIDGET (tool_item),
                                          ev_window_get_document_model (ev_toolbar->priv->window));
         if (rtl)
-                gtk_widget_set_margin_left (tool_item, 12);
+                gtk_widget_set_margin_left (tool_item, 6);
         else
-                gtk_widget_set_margin_right (tool_item, 12);
-        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+                gtk_widget_set_margin_right (tool_item, 6);
+        gtk_header_bar_pack_start (GTK_HEADER_BAR (ev_toolbar), tool_item);
         gtk_widget_show (tool_item);
 
         /* History */
@@ -258,13 +253,13 @@ ev_toolbar_constructed (GObject *object)
         ev_toolbar->priv->history_action = hbox;
         tool_item = GTK_WIDGET (gtk_tool_item_new ());
         if (rtl)
-                gtk_widget_set_margin_left (tool_item, 12);
+                gtk_widget_set_margin_left (tool_item, 6);
         else
-                gtk_widget_set_margin_right (tool_item, 12);
+                gtk_widget_set_margin_right (tool_item, 6);
         gtk_container_add (GTK_CONTAINER (tool_item), hbox);
         gtk_widget_show (hbox);
 
-        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+        gtk_header_bar_pack_start (GTK_HEADER_BAR (ev_toolbar), tool_item);
         gtk_widget_show (tool_item);
 
         /* Find */
@@ -274,34 +269,23 @@ ev_toolbar_constructed (GObject *object)
         gtk_container_add (GTK_CONTAINER (tool_item), button);
         gtk_widget_show (button);
         if (rtl)
-                gtk_widget_set_margin_left (tool_item, 12);
+                gtk_widget_set_margin_left (tool_item, 6);
         else
-                gtk_widget_set_margin_right (tool_item, 12);
-        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
-        gtk_widget_show (tool_item);
-
-        /* Separator */
-        tool_item = GTK_WIDGET (gtk_tool_item_new ());
-        gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE);
-        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+                gtk_widget_set_margin_right (tool_item, 6);
+        gtk_header_bar_pack_start (GTK_HEADER_BAR (ev_toolbar), tool_item);
         gtk_widget_show (tool_item);
 
-        /* Zoom selector */
-        vbox = ev_zoom_action_new (ev_window_get_document_model (ev_toolbar->priv->window),
-                                   G_MENU (gtk_builder_get_object (builder, "zoom-menu")));
-        ev_toolbar->priv->zoom_action = vbox;
-        g_signal_connect (vbox, "activated",
-                          G_CALLBACK (zoom_selector_activated),
-                          ev_toolbar);
+        /* Action Menu */
+        menu = G_MENU_MODEL (gtk_builder_get_object (builder, "action-menu"));
+        button = ev_toolbar_create_menu_button (ev_toolbar, "emblem-system-symbolic",
+                                                menu, GTK_ALIGN_END);
+        gtk_widget_set_tooltip_text (button, _("File options"));
+        ev_toolbar->priv->action_menu_button = button;
         tool_item = GTK_WIDGET (gtk_tool_item_new ());
-        if (rtl)
-                gtk_widget_set_margin_left (tool_item, 12);
-        else
-                gtk_widget_set_margin_right (tool_item, 12);
-        gtk_container_add (GTK_CONTAINER (tool_item), vbox);
-        gtk_widget_show (vbox);
+        gtk_container_add (GTK_CONTAINER (tool_item), button);
+        gtk_widget_show (button);
 
-        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+        gtk_header_bar_pack_end (GTK_HEADER_BAR (ev_toolbar), tool_item);
         gtk_widget_show (tool_item);
 
         /* View Menu */
@@ -313,25 +297,26 @@ ev_toolbar_constructed (GObject *object)
         tool_item = GTK_WIDGET (gtk_tool_item_new ());
         gtk_container_add (GTK_CONTAINER (tool_item), button);
         gtk_widget_show (button);
-        if (rtl)
-                gtk_widget_set_margin_left (tool_item, 6);
-        else
-                gtk_widget_set_margin_right (tool_item, 6);
 
-        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+        gtk_header_bar_pack_end (GTK_HEADER_BAR (ev_toolbar), tool_item);
         gtk_widget_show (tool_item);
 
-        /* Action Menu */
-        menu = G_MENU_MODEL (gtk_builder_get_object (builder, "action-menu"));
-        button = ev_toolbar_create_menu_button (ev_toolbar, "emblem-system-symbolic",
-                                                menu, GTK_ALIGN_END);
-        gtk_widget_set_tooltip_text (button, _("File options"));
-        ev_toolbar->priv->action_menu_button = button;
+        /* Zoom selector */
+        vbox = ev_zoom_action_new (ev_window_get_document_model (ev_toolbar->priv->window),
+                                   G_MENU (gtk_builder_get_object (builder, "zoom-menu")));
+        ev_toolbar->priv->zoom_action = vbox;
+        g_signal_connect (vbox, "activated",
+                          G_CALLBACK (zoom_selector_activated),
+                          ev_toolbar);
         tool_item = GTK_WIDGET (gtk_tool_item_new ());
-        gtk_container_add (GTK_CONTAINER (tool_item), button);
-        gtk_widget_show (button);
+        if (rtl)
+                gtk_widget_set_margin_left (tool_item, 6);
+        else
+                gtk_widget_set_margin_right (tool_item, 6);
+        gtk_container_add (GTK_CONTAINER (tool_item), vbox);
+        gtk_widget_show (vbox);
 
-        gtk_container_add (GTK_CONTAINER (ev_toolbar), tool_item);
+        gtk_header_bar_pack_end (GTK_HEADER_BAR (ev_toolbar), tool_item);
         gtk_widget_show (tool_item);
 
         recent_menu_model = ev_recent_menu_model_new (gtk_recent_manager_get_default (),
diff --git a/shell/ev-toolbar.h b/shell/ev-toolbar.h
index 0220b22..8eba914 100644
--- a/shell/ev-toolbar.h
+++ b/shell/ev-toolbar.h
@@ -38,13 +38,13 @@ typedef struct _EvToolbarClass   EvToolbarClass;
 typedef struct _EvToolbarPrivate EvToolbarPrivate;
 
 struct _EvToolbar {
-        GtkToolbar base_instance;
+        GtkHeaderBar base_instance;
 
         EvToolbarPrivate *priv;
 };
 
 struct _EvToolbarClass {
-        GtkToolbarClass base_class;
+        GtkHeaderBarClass base_class;
 };
 
 GType      ev_toolbar_get_type           (void);
diff --git a/shell/ev-window.c b/shell/ev-window.c
index accb918..ad7ee6a 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -157,6 +157,7 @@ struct _EvWindowPrivate {
        GtkWidget *fs_overlay;
        GtkWidget *fs_eventbox;
        GtkWidget *fs_revealer;
+       GtkWidget *fs_toolbar;
        gboolean   fs_pointer_on_toolbar;
        guint      fs_timeout_id;
 
@@ -340,6 +341,9 @@ static void ev_attachment_popup_cmd_save_attachment_as (GtkAction     *action,
 static void    view_handle_link_cb                     (EvView           *view, 
                                                         EvLink           *link, 
                                                         EvWindow         *window);
+static void     activate_link_cb                        (GObject          *object,
+                                                        EvLink           *link,
+                                                        EvWindow         *window);
 static void     ev_window_update_find_status_message    (EvWindow         *ev_window);
 static void     find_bar_search_changed_cb              (EggFindBar       *find_bar,
                                                         GParamSpec       *param,
@@ -3637,11 +3641,13 @@ ev_window_cmd_focus_page_selector (GSimpleAction *action,
 {
        EvWindow *window = user_data;
        GtkWidget *page_selector;
+       EvToolbar *toolbar;
 
        update_chrome_flag (window, EV_CHROME_RAISE_TOOLBAR, TRUE);
        update_chrome_visibility (window);
 
-       page_selector = ev_toolbar_get_page_selector (EV_TOOLBAR (window->priv->toolbar));
+       toolbar = window->priv->fs_toolbar ? EV_TOOLBAR (window->priv->fs_toolbar) : EV_TOOLBAR 
(window->priv->toolbar);
+       page_selector = ev_toolbar_get_page_selector (toolbar);
        ev_page_action_widget_grab_focus (EV_PAGE_ACTION_WIDGET (page_selector));
 }
 
@@ -3874,6 +3880,25 @@ ev_window_sidebar_position_change_cb (GObject    *object,
 }
 
 static void
+ev_window_update_links_model (EvWindow *window)
+{
+       GtkTreeModel *model;
+       GtkWidget *page_selector;
+
+       g_object_get (window->priv->sidebar_links,
+                     "model", &model,
+                     NULL);
+
+       page_selector = ev_toolbar_get_page_selector (EV_TOOLBAR (window->priv->toolbar));
+       ev_page_action_widget_update_links_model (EV_PAGE_ACTION_WIDGET (page_selector), model);
+       if (window->priv->fs_toolbar) {
+               page_selector = ev_toolbar_get_page_selector (EV_TOOLBAR (window->priv->fs_toolbar));
+               ev_page_action_widget_update_links_model (EV_PAGE_ACTION_WIDGET (page_selector), model);
+       }
+       g_object_unref (model);
+}
+
+static void
 ev_window_update_fullscreen_action (EvWindow *window)
 {
        GAction *action;
@@ -3887,7 +3912,7 @@ ev_window_update_fullscreen_action (EvWindow *window)
 static void
 ev_window_fullscreen_hide_toolbar (EvWindow *window)
 {
-       if (!ev_toolbar_has_visible_popups (EV_TOOLBAR (window->priv->toolbar)))
+       if (!ev_toolbar_has_visible_popups (EV_TOOLBAR (window->priv->fs_toolbar)))
                gtk_revealer_set_reveal_child (GTK_REVEALER (window->priv->fs_revealer), FALSE);
 }
 
@@ -3988,13 +4013,15 @@ ev_window_run_fullscreen (EvWindow *window)
                           window->priv->main_box);
        g_object_unref (window->priv->main_box);
 
-
-       g_object_ref (window->priv->toolbar);
-       gtk_container_remove (GTK_CONTAINER (window->priv->main_box),
-                             window->priv->toolbar);
+       window->priv->fs_toolbar = ev_toolbar_new (window);
+       ev_window_update_links_model (window);
+       g_signal_connect (ev_toolbar_get_page_selector (EV_TOOLBAR (window->priv->fs_toolbar)),
+                         "activate-link",
+                         G_CALLBACK (activate_link_cb),
+                         window);
        gtk_container_add (GTK_CONTAINER (window->priv->fs_revealer),
-                          window->priv->toolbar);
-       g_object_unref (window->priv->toolbar);
+                          window->priv->fs_toolbar);
+       gtk_widget_show (window->priv->fs_toolbar);
 
        gtk_container_add (GTK_CONTAINER (window->priv->fs_eventbox),
                           window->priv->fs_revealer);
@@ -4030,19 +4057,13 @@ ev_window_stop_fullscreen (EvWindow *window,
        if (!ev_document_model_get_fullscreen (window->priv->model))
                return;
 
-       g_object_ref (window->priv->toolbar);
        gtk_container_remove (GTK_CONTAINER (window->priv->fs_revealer),
-                             window->priv->toolbar);
+                             window->priv->fs_toolbar);
+       window->priv->fs_toolbar = NULL;
        gtk_container_remove (GTK_CONTAINER (window->priv->fs_eventbox),
                              window->priv->fs_revealer);
        gtk_container_remove (GTK_CONTAINER (window->priv->fs_overlay),
                              window->priv->fs_eventbox);
-       gtk_box_pack_start (GTK_BOX (window->priv->main_box),
-                           window->priv->toolbar,
-                           FALSE, TRUE, 0);
-       gtk_box_reorder_child (GTK_BOX (window->priv->main_box),
-                              window->priv->toolbar, 0);
-       g_object_unref (window->priv->toolbar);
 
        g_object_ref (window->priv->main_box);
        gtk_container_remove (GTK_CONTAINER (window->priv->fs_overlay),
@@ -4053,7 +4074,6 @@ ev_window_stop_fullscreen (EvWindow *window,
        g_object_unref (window->priv->main_box);
 
        ev_window_remove_fullscreen_timeout (window);
-       gtk_widget_show (window->priv->toolbar);
 
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_IN,
@@ -4752,9 +4772,11 @@ ev_window_cmd_action_menu (GSimpleAction *action,
                           GVariant      *parameter,
                           gpointer       user_data)
 {
-       EvWindow *ev_window = user_data;
+       EvWindow  *ev_window = user_data;
+       EvToolbar *toolbar;
 
-       ev_toolbar_action_menu_popup (EV_TOOLBAR (ev_window->priv->toolbar));
+       toolbar = ev_window->priv->fs_toolbar ? EV_TOOLBAR (ev_window->priv->fs_toolbar) : EV_TOOLBAR 
(ev_window->priv->toolbar);
+       ev_toolbar_action_menu_popup (toolbar);
 }
 
 static void
@@ -5782,16 +5804,7 @@ sidebar_widget_model_set (EvSidebarLinks *ev_sidebar_links,
                          GParamSpec     *pspec,
                          EvWindow       *ev_window)
 {
-       GtkTreeModel *model;
-       GtkWidget *page_selector;
-
-       g_object_get (G_OBJECT (ev_sidebar_links),
-                     "model", &model,
-                     NULL);
-
-       page_selector = ev_toolbar_get_page_selector (EV_TOOLBAR (ev_window->priv->toolbar));
-       ev_page_action_widget_update_links_model (EV_PAGE_ACTION_WIDGET (page_selector), model);
-       g_object_unref (model);
+       ev_window_update_links_model (ev_window);
 }
 
 static gboolean
@@ -6766,11 +6779,8 @@ ev_window_init (EvWindow *ev_window)
 
        ev_window->priv->toolbar = ev_toolbar_new (ev_window);
        gtk_widget_set_no_show_all (ev_window->priv->toolbar, TRUE);
-       gtk_widget_set_halign (ev_window->priv->toolbar, GTK_ALIGN_FILL);
-       gtk_widget_set_valign (ev_window->priv->toolbar, GTK_ALIGN_START);
-       gtk_box_pack_start (GTK_BOX (ev_window->priv->main_box),
-                           ev_window->priv->toolbar,
-                           FALSE, TRUE, 0);
+       gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (ev_window->priv->toolbar), TRUE);
+       gtk_window_set_titlebar (GTK_WINDOW (ev_window), ev_window->priv->toolbar);
        gtk_widget_show (ev_window->priv->toolbar);
 
        g_signal_connect (ev_toolbar_get_page_selector (EV_TOOLBAR (ev_window->priv->toolbar)),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]