[evince] shell: Use a GtkHeaderBar instead of a GtkToolbar and window decorations
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] shell: Use a GtkHeaderBar instead of a GtkToolbar and window decorations
- Date: Sun, 22 Jun 2014 10:23:31 +0000 (UTC)
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]