X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=inline;f=shell%2Fev-window.c;h=72a7d960cfa35096ed78531ff1f43e442ed1068c;hb=a723507bfa4d3fef78bb27aea0a56b44d93c1fb1;hp=27adfb10ed15d07289184fb31b48b1d7470a4139;hpb=02f2ad25a6a29756518aa91774df9dbb90a990cf;p=evince.git
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 27adfb10..72a7d960 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -56,7 +56,6 @@
#include "ev-document-fonts.h"
#include "ev-document-images.h"
#include "ev-document-links.h"
-#include "ev-document-thumbnails.h"
#include "ev-document-annotations.h"
#include "ev-document-type-builtins.h"
#include "ev-document-misc.h"
@@ -76,6 +75,7 @@
#include "ev-properties-dialog.h"
#include "ev-sidebar-annotations.h"
#include "ev-sidebar-attachments.h"
+#include "ev-sidebar-bookmarks.h"
#include "ev-sidebar.h"
#include "ev-sidebar-links.h"
#include "ev-sidebar-page.h"
@@ -92,6 +92,8 @@
#include "ev-print-operation.h"
#include "ev-progress-message-area.h"
#include "ev-annotation-properties-dialog.h"
+#include "ev-bookmarks.h"
+#include "ev-bookmark-action.h"
#ifdef ENABLE_DBUS
#include "ev-media-player-keys.h"
@@ -139,6 +141,7 @@ struct _EvWindowPrivate {
GtkWidget *sidebar_attachments;
GtkWidget *sidebar_layers;
GtkWidget *sidebar_annots;
+ GtkWidget *sidebar_bookmarks;
/* Settings */
GSettings *settings;
@@ -164,6 +167,8 @@ struct _EvWindowPrivate {
GtkRecentManager *recent_manager;
GtkActionGroup *recent_action_group;
guint recent_ui_id;
+ GtkActionGroup *bookmarks_action_group;
+ guint bookmarks_ui_id;
GtkUIManager *ui_manager;
/* Fullscreen mode */
@@ -193,6 +198,7 @@ struct _EvWindowPrivate {
EvWindowPageMode page_mode;
EvWindowTitle *title;
EvMetadata *metadata;
+ EvBookmarks *bookmarks;
gboolean is_new_doc;
/* Load params */
@@ -247,6 +253,7 @@ struct _EvWindowPrivate {
#define ATTACHMENTS_SIDEBAR_ID "attachments"
#define LAYERS_SIDEBAR_ID "layers"
#define ANNOTS_SIDEBAR_ID "annotations"
+#define BOOKMARKS_SIDEBAR_ID "bookmarks"
#define EV_PRINT_SETTINGS_FILE "print-settings"
#define EV_PRINT_SETTINGS_GROUP "Print Settings"
@@ -344,7 +351,9 @@ static void ev_window_media_player_key_pressed (EvWindow *windo
static void ev_window_update_max_min_scale (EvWindow *window);
#ifdef ENABLE_DBUS
static void ev_window_emit_closed (EvWindow *window);
+static void ev_window_emit_doc_loaded (EvWindow *window);
#endif
+static void ev_window_setup_bookmarks (EvWindow *window);
static guint ev_window_n_copies = 0;
@@ -448,6 +457,10 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
ev_window_set_action_sensitive (ev_window, "ViewAutoscroll", has_pages);
ev_window_set_action_sensitive (ev_window, "ViewInvertedColors", has_pages);
+ /* Bookmarks menu */
+ ev_window_set_action_sensitive (ev_window, "BookmarksAdd",
+ has_pages && ev_window->priv->bookmarks);
+
/* Toolbar-specific actions: */
ev_window_set_action_sensitive (ev_window, PAGE_SELECTOR_ACTION, has_pages);
ev_window_set_action_sensitive (ev_window, ZOOM_CONTROL_ACTION, has_pages);
@@ -784,18 +797,17 @@ ev_window_warning_message (EvWindow *window,
ev_window_set_message_area (window, area);
}
-typedef struct _FindTask {
+typedef struct _PageTitleData {
const gchar *page_label;
- gchar *chapter;
-} FindTask;
+ gchar *page_title;
+} PageTitleData;
static gboolean
-ev_window_find_chapter (GtkTreeModel *tree_model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer data)
+ev_window_find_page_title (GtkTreeModel *tree_model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ PageTitleData *data)
{
- FindTask *task = (FindTask *)data;
gchar *page_string;
gtk_tree_model_get (tree_model, iter,
@@ -805,9 +817,9 @@ ev_window_find_chapter (GtkTreeModel *tree_model,
if (!page_string)
return FALSE;
- if (!strcmp (page_string, task->page_label)) {
+ if (!strcmp (page_string, data->page_label)) {
gtk_tree_model_get (tree_model, iter,
- EV_DOCUMENT_LINKS_COLUMN_MARKUP, &task->chapter,
+ EV_DOCUMENT_LINKS_COLUMN_MARKUP, &data->page_title,
-1);
g_free (page_string);
return TRUE;
@@ -817,12 +829,41 @@ ev_window_find_chapter (GtkTreeModel *tree_model,
return FALSE;
}
+static gchar *
+ev_window_get_page_title (EvWindow *window,
+ const gchar *page_label)
+{
+ if (EV_IS_DOCUMENT_LINKS (window->priv->document) &&
+ ev_document_links_has_document_links (EV_DOCUMENT_LINKS (window->priv->document))) {
+ PageTitleData data;
+ GtkTreeModel *model;
+
+ data.page_label = page_label;
+ data.page_title = NULL;
+
+ g_object_get (G_OBJECT (window->priv->sidebar_links),
+ "model", &model,
+ NULL);
+ if (model) {
+ gtk_tree_model_foreach (model,
+ (GtkTreeModelForeachFunc)ev_window_find_page_title,
+ &data);
+
+ g_object_unref (model);
+ }
+
+ return data.page_title;
+ }
+
+ return NULL;
+}
+
static void
ev_window_add_history (EvWindow *window, gint page, EvLink *link)
{
gchar *page_label = NULL;
+ gchar *page_title;
gchar *link_title;
- FindTask find_task;
EvLink *real_link;
EvLinkAction *action;
EvLinkDest *dest;
@@ -845,34 +886,19 @@ ev_window_add_history (EvWindow *window, gint page, EvLink *link)
if (!page_label)
return;
-
- find_task.page_label = page_label;
- find_task.chapter = NULL;
-
- if (ev_document_links_has_document_links (EV_DOCUMENT_LINKS (window->priv->document))) {
- GtkTreeModel *model;
-
- g_object_get (G_OBJECT (window->priv->sidebar_links), "model", &model, NULL);
-
- if (model) {
- gtk_tree_model_foreach (model,
- ev_window_find_chapter,
- &find_task);
-
- g_object_unref (model);
- }
- }
- if (find_task.chapter)
- link_title = g_strdup_printf (_("Page %s â %s"), page_label, find_task.chapter);
- else
+ page_title = ev_window_get_page_title (window, page_label);
+ if (page_title) {
+ link_title = g_strdup_printf (_("Page %s â %s"), page_label, page_title);
+ g_free (page_title);
+ } else {
link_title = g_strdup_printf (_("Page %s"), page_label);
-
+ }
+
real_link = ev_link_new (link_title, action);
ev_history_add_link (window->priv->history, real_link);
- g_free (find_task.chapter);
g_free (link_title);
g_free (page_label);
g_object_unref (real_link);
@@ -895,6 +921,13 @@ view_selection_changed_cb (EvView *view,
ev_view_get_has_selection (view));
}
+static void
+view_layers_changed_cb (EvView *view,
+ EvWindow *window)
+{
+ ev_sidebar_layers_update_layers_state (EV_SIDEBAR_LAYERS (window->priv->sidebar_layers));
+}
+
static void
ev_window_page_changed_cb (EvWindow *ev_window,
gint old_page,
@@ -934,6 +967,8 @@ ev_window_sidebar_get_current_page_id (EvWindow *ev_window)
id = LAYERS_SIDEBAR_ID;
} else if (current_page == ev_window->priv->sidebar_annots) {
id = ANNOTS_SIDEBAR_ID;
+ } else if (current_page == ev_window->priv->sidebar_bookmarks) {
+ id = BOOKMARKS_SIDEBAR_ID;
} else {
g_assert_not_reached();
}
@@ -954,6 +989,7 @@ ev_window_sidebar_set_current_page (EvWindow *window,
GtkWidget *attachments = window->priv->sidebar_attachments;
GtkWidget *annots = window->priv->sidebar_annots;
GtkWidget *layers = window->priv->sidebar_layers;
+ GtkWidget *bookmarks = window->priv->sidebar_bookmarks;
if (strcmp (page_id, LINKS_SIDEBAR_ID) == 0 &&
ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (links), document)) {
@@ -970,6 +1006,9 @@ ev_window_sidebar_set_current_page (EvWindow *window,
} else if (strcmp (page_id, ANNOTS_SIDEBAR_ID) == 0 &&
ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (annots), document)) {
ev_sidebar_set_page (sidebar, annots);
+ } else if (strcmp (page_id, BOOKMARKS_SIDEBAR_ID) == 0 &&
+ ev_sidebar_page_support_document (EV_SIDEBAR_PAGE (bookmarks), document)) {
+ ev_sidebar_set_page (sidebar, bookmarks);
}
}
@@ -1310,8 +1349,7 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window)
gint rotation;
EvDocument *document = ev_window->priv->document;
- if (!EV_IS_DOCUMENT_THUMBNAILS (document) ||
- ev_document_get_n_pages (document) <= 0 ||
+ if (ev_document_get_n_pages (document) <= 0 ||
!ev_document_check_dimensions (document)) {
return;
}
@@ -1531,6 +1569,9 @@ ev_window_load_job_cb (EvJob *job,
if (!ev_job_is_failed (job)) {
ev_document_model_set_document (ev_window->priv->model, document);
+#ifdef ENABLE_DBUS
+ ev_window_emit_doc_loaded (ev_window);
+#endif
setup_chrome_from_metadata (ev_window);
update_chrome_actions (ev_window);
setup_document_from_metadata (ev_window);
@@ -1999,6 +2040,8 @@ ev_window_open_uri (EvWindow *ev_window,
if (ev_window->priv->metadata)
g_object_unref (ev_window->priv->metadata);
+ if (ev_window->priv->bookmarks)
+ g_object_unref (ev_window->priv->bookmarks);
source_file = g_file_new_for_uri (uri);
if (!ev_file_is_temp (source_file) && ev_is_metadata_supported_for_file (source_file)) {
@@ -2008,6 +2051,17 @@ ev_window_open_uri (EvWindow *ev_window,
ev_window->priv->metadata = NULL;
}
+ if (ev_window->priv->metadata) {
+ ev_window->priv->bookmarks = ev_bookmarks_new (ev_window->priv->metadata);
+ ev_sidebar_bookmarks_set_bookmarks (EV_SIDEBAR_BOOKMARKS (ev_window->priv->sidebar_bookmarks),
+ ev_window->priv->bookmarks);
+ g_signal_connect_swapped (ev_window->priv->bookmarks, "changed",
+ G_CALLBACK (ev_window_setup_bookmarks),
+ ev_window);
+ } else {
+ ev_window->priv->bookmarks = NULL;
+ }
+
if (ev_window->priv->search_string)
g_free (ev_window->priv->search_string);
ev_window->priv->search_string = search_string ?
@@ -2019,6 +2073,7 @@ ev_window_open_uri (EvWindow *ev_window,
setup_size_from_metadata (ev_window);
setup_model_from_metadata (ev_window);
+ ev_window_setup_bookmarks (ev_window);
ev_window->priv->load_job = ev_job_load_new (uri);
g_signal_connect (ev_window->priv->load_job,
@@ -2864,6 +2919,48 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
gtk_widget_show (fc);
}
+static void
+ev_window_cmd_open_containing_folder (GtkAction *action, EvWindow *ev_window)
+{
+ GtkWidget *ev_window_widget;
+ GFile *file;
+ GFile *parent;
+
+ ev_window_widget = GTK_WIDGET (ev_window);
+
+ file = g_file_new_for_uri (ev_window->priv->uri);
+ parent = g_file_get_parent (file);
+
+ if (parent) {
+ char *parent_uri;
+
+ parent_uri = g_file_get_uri (parent);
+ if (parent_uri) {
+ GdkScreen *screen;
+ guint32 timestamp;
+ GError *error;
+
+ screen = gtk_widget_get_screen (ev_window_widget);
+ timestamp = gtk_get_current_event_time ();
+
+ error = NULL;
+ if (!gtk_show_uri (screen, parent_uri, timestamp, &error)) {
+ ev_window_error_message (ev_window, error, _("Could not open the containing folder"));
+ g_error_free (error);
+ }
+
+ g_free (parent_uri);
+ }
+ }
+
+ if (file)
+ g_object_unref (file);
+
+ if (parent)
+ g_object_unref (parent);
+
+}
+
static GKeyFile *
get_print_settings_file (void)
{
@@ -3366,6 +3463,91 @@ ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window)
ev_document_fc_mutex_unlock ();
}
+static void
+document_modified_confirmation_dialog_response (GtkDialog *dialog,
+ gint response,
+ EvWindow *ev_window)
+{
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ switch (response) {
+ case GTK_RESPONSE_YES:
+ ev_window_cmd_save_as (NULL, ev_window);
+ break;
+ case GTK_RESPONSE_NO:
+ gtk_widget_destroy (GTK_WIDGET (ev_window));
+ break;
+ case GTK_RESPONSE_CANCEL:
+ default:
+ break;
+ }
+}
+
+static gboolean
+ev_window_check_document_modified (EvWindow *ev_window)
+{
+ EvDocument *document = ev_window->priv->document;
+ GtkWidget *dialog;
+ gchar *text, *markup;
+ const gchar *secondary_text;
+
+ if (!document)
+ return FALSE;
+
+ if (EV_IS_DOCUMENT_FORMS (document) &&
+ ev_document_forms_document_is_modified (EV_DOCUMENT_FORMS (document))) {
+ secondary_text = _("Document contains form fields that have been filled out. "
+ "If you don't save a copy, changes will be permanently lost.");
+ } else if (EV_IS_DOCUMENT_ANNOTATIONS (document) &&
+ ev_document_annotations_document_is_modified (EV_DOCUMENT_ANNOTATIONS (document))) {
+ secondary_text = _("Document contains new or modified annotations. "
+ "If you don't save a copy, changes will be permanently lost.");
+ } else {
+ return FALSE;
+ }
+
+
+ text = g_markup_printf_escaped (_("Save a copy of document â%sâ before closing?"),
+ gtk_window_get_title (GTK_WINDOW (ev_window)));
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW (ev_window),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ NULL);
+
+ markup = g_strdup_printf ("%s", text);
+ g_free (text);
+
+ gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), markup);
+ g_free (markup);
+
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", secondary_text);
+
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ _("Close _without Saving"),
+ GTK_RESPONSE_NO,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ _("Save a _Copy"),
+ GTK_RESPONSE_YES,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+ GTK_RESPONSE_YES,
+ GTK_RESPONSE_NO,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (document_modified_confirmation_dialog_response),
+ ev_window);
+ gtk_widget_show (dialog);
+
+ return TRUE;
+}
+
static void
print_jobs_confirmation_dialog_response (GtkDialog *dialog,
gint response,
@@ -3475,6 +3657,9 @@ ev_window_close (EvWindow *ev_window)
ev_document_model_set_page (ev_window->priv->model, current_page);
}
+ if (ev_window_check_document_modified (ev_window))
+ return FALSE;
+
if (ev_window_check_print_queue (ev_window))
return FALSE;
@@ -4072,7 +4257,6 @@ ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window)
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)), 5);
gtk_box_set_spacing (GTK_BOX (content_area), 2);
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400);
toolbar = EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar);
@@ -4200,6 +4384,92 @@ ev_window_cmd_go_backward (GtkAction *action, EvWindow *ev_window)
}
}
+static void
+ev_window_cmd_bookmark_activate (GtkAction *action,
+ EvWindow *window)
+{
+ guint page = ev_bookmark_action_get_page (EV_BOOKMARK_ACTION (action));
+
+ ev_document_model_set_page (window->priv->model, page);
+}
+
+static gint
+compare_bookmarks (EvBookmark *a,
+ EvBookmark *b)
+{
+ return strcmp (a->title, b->title);
+}
+
+static void
+ev_window_setup_bookmarks (EvWindow *window)
+{
+ GList *items, *l;
+
+ if (!window->priv->bookmarks)
+ return;
+
+ if (window->priv->bookmarks_ui_id > 0) {
+ gtk_ui_manager_remove_ui (window->priv->ui_manager,
+ window->priv->bookmarks_ui_id);
+ gtk_ui_manager_ensure_update (window->priv->ui_manager);
+ }
+ window->priv->bookmarks_ui_id = gtk_ui_manager_new_merge_id (window->priv->ui_manager);
+
+ if (window->priv->bookmarks_action_group) {
+ gtk_ui_manager_remove_action_group (window->priv->ui_manager,
+ window->priv->bookmarks_action_group);
+ g_object_unref (window->priv->bookmarks_action_group);
+ }
+ window->priv->bookmarks_action_group = gtk_action_group_new ("BookmarksActions");
+ gtk_ui_manager_insert_action_group (window->priv->ui_manager,
+ window->priv->bookmarks_action_group, -1);
+
+ items = ev_bookmarks_get_bookmarks (window->priv->bookmarks);
+ items = g_list_sort (items, (GCompareFunc)compare_bookmarks);
+
+ for (l = items; l && l->data; l = g_list_next (l)) {
+ EvBookmark *bm = (EvBookmark *)l->data;
+ GtkAction *action;
+
+ action = ev_bookmark_action_new (bm);
+ g_signal_connect (action, "activate",
+ G_CALLBACK (ev_window_cmd_bookmark_activate),
+ window);
+ gtk_action_group_add_action (window->priv->bookmarks_action_group,
+ action);
+
+ gtk_ui_manager_add_ui (window->priv->ui_manager,
+ window->priv->bookmarks_ui_id,
+ "/MainMenu/BookmarksMenu/BookmarksItems",
+ gtk_action_get_label (action),
+ gtk_action_get_name (action),
+ GTK_UI_MANAGER_MENUITEM,
+ FALSE);
+
+ g_object_unref (action);
+ }
+
+ g_list_free (items);
+}
+
+static void
+ev_window_cmd_bookmarks_add (GtkAction *action,
+ EvWindow *window)
+{
+ EvBookmark bm;
+ gchar *page_label;
+ gchar *page_title;
+
+ bm.page = ev_document_model_get_page (window->priv->model);
+ page_label = ev_document_get_page_label (window->priv->document, bm.page);
+ page_title = ev_window_get_page_title (window, page_label);
+ bm.title = page_title ? page_title : g_strdup_printf (_("Page %s"), page_label);
+ g_free (page_label);
+
+ /* EvBookmarks takes ownership of bookmark */
+ ev_bookmarks_add (window->priv->bookmarks, &bm);
+}
+
static void
ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window)
{
@@ -4508,7 +4778,7 @@ ev_window_cmd_help_about (GtkAction *action, EvWindow *ev_window)
"name", _("Evince"),
"version", VERSION,
"copyright",
- _("© 1996â2009 The Evince authors"),
+ _("© 1996â2010 The Evince authors"),
"license", license_trans,
"website", "http://www.gnome.org/projects/evince",
"comments", comments,
@@ -4770,17 +5040,23 @@ ev_window_update_find_status_message (EvWindow *ev_window)
return;
if (ev_job_is_finished (ev_window->priv->find_job)) {
- gint n_results;
-
- n_results = ev_job_find_get_n_results (EV_JOB_FIND (ev_window->priv->find_job),
- ev_document_model_get_page (ev_window->priv->model));
- /* TRANS: Sometimes this could be better translated as
- "%d hit(s) on this page". Therefore this string
- contains plural cases. */
- message = g_strdup_printf (ngettext ("%d found on this page",
- "%d found on this page",
- n_results),
- n_results);
+ EvJobFind *job_find = EV_JOB_FIND (ev_window->priv->find_job);
+
+ if (ev_job_find_has_results (job_find)) {
+ gint n_results;
+
+ n_results = ev_job_find_get_n_results (job_find,
+ ev_document_model_get_page (ev_window->priv->model));
+ /* TRANS: Sometimes this could be better translated as
+ "%d hit(s) on this page". Therefore this string
+ contains plural cases. */
+ message = g_strdup_printf (ngettext ("%d found on this page",
+ "%d found on this page",
+ n_results),
+ n_results);
+ } else {
+ message = g_strdup (_("Not found"));
+ }
} else {
gdouble percent;
@@ -5028,6 +5304,11 @@ ev_window_dispose (GObject *object)
}
#endif /* ENABLE_DBUS */
+ if (priv->bookmarks) {
+ g_object_unref (priv->bookmarks);
+ priv->bookmarks = NULL;
+ }
+
if (priv->metadata) {
g_object_unref (priv->metadata);
priv->metadata = NULL;
@@ -5073,6 +5354,11 @@ ev_window_dispose (GObject *object)
priv->recent_action_group = NULL;
}
+ if (priv->bookmarks_action_group) {
+ g_object_unref (priv->bookmarks_action_group);
+ priv->bookmarks_action_group = NULL;
+ }
+
if (priv->recent_manager) {
g_signal_handlers_disconnect_by_func (priv->recent_manager,
ev_window_setup_recent,
@@ -5302,6 +5588,7 @@ static const GtkActionEntry entries[] = {
{ "Edit", NULL, N_("_Edit") },
{ "View", NULL, N_("_View") },
{ "Go", NULL, N_("_Go") },
+ { "Bookmarks", NULL, N_("_Bookmarks") },
{ "Help", NULL, N_("_Help") },
/* File menu */
@@ -5314,6 +5601,9 @@ static const GtkActionEntry entries[] = {
{ "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copyâ¦"), "S",
N_("Save a copy of the current document"),
G_CALLBACK (ev_window_cmd_save_as) },
+ { "FileOpenContainingFolder", GTK_STOCK_DIRECTORY, N_("Open Containing _Folder"), NULL,
+ N_("Show the folder which contains this file in the file manager"),
+ G_CALLBACK (ev_window_cmd_open_containing_folder) },
{ "FilePrint", GTK_STOCK_PRINT, N_("_Printâ¦"), "P",
N_("Print this document"),
G_CALLBACK (ev_window_cmd_file_print) },
@@ -5372,6 +5662,11 @@ static const GtkActionEntry entries[] = {
N_("Go to the last page"),
G_CALLBACK (ev_window_cmd_go_last_page) },
+ /* Bookmarks menu */
+ { "BookmarksAdd", GTK_STOCK_ADD, N_("_Add Bookmark"), "D",
+ N_("Add a bookmark for the current page"),
+ G_CALLBACK (ev_window_cmd_bookmarks_add) },
+
/* Help menu */
{ "HelpContents", GTK_STOCK_HELP, N_("_Contents"), "F1", NULL,
G_CALLBACK (ev_window_cmd_help_contents) },
@@ -5559,6 +5854,13 @@ sidebar_annots_annot_add_cancelled (EvSidebarAnnotations *sidebar_annots,
ev_view_cancel_add_annotation (EV_VIEW (window->priv->view));
}
+static void
+sidebar_bookmarks_add_bookmark (EvSidebarBookmarks *sidebar_bookmarks,
+ EvWindow *window)
+{
+ ev_window_cmd_bookmarks_add (NULL, window);
+}
+
static void
register_custom_actions (EvWindow *window, GtkActionGroup *group)
{
@@ -5624,6 +5926,10 @@ set_action_properties (GtkActionGroup *action_group)
{
GtkAction *action;
+ action = gtk_action_group_get_action (action_group, "FileOpenContainingFolder");
+ /*translators: this is the label for toolbar button*/
+ g_object_set (action, "short_label", _("Open Folder"), NULL);
+
action = gtk_action_group_get_action (action_group, "GoPreviousPage");
g_object_set (action, "is-important", TRUE, NULL);
/*translators: this is the label for toolbar button*/
@@ -6444,6 +6750,9 @@ ev_window_sync_source (EvWindow *window,
{
GDBusConnection *connection;
GError *error = NULL;
+ guint32 timestamp;
+ gchar *uri_input;
+ GFile *input_gfile;
if (window->priv->dbus_object_id <= 0)
return;
@@ -6452,16 +6761,41 @@ ev_window_sync_source (EvWindow *window,
if (!connection)
return;
+ timestamp = gtk_get_current_event_time ();
+ if (g_path_is_absolute (link->filename)) {
+ input_gfile = g_file_new_for_path (link->filename);
+ } else {
+ GFile *gfile, *parent_gfile;
+
+ gfile = g_file_new_for_uri (window->priv->uri);
+ parent_gfile = g_file_get_parent (gfile);
+
+ /* parent_gfile should never be NULL */
+ if (parent_gfile == NULL) {
+ g_printerr ("Document URI is '/'\n");
+ return;
+ }
+
+ input_gfile = g_file_get_child (parent_gfile, link->filename);
+ g_object_unref (parent_gfile);
+ g_object_unref (gfile);
+ }
+
+ uri_input = g_file_get_uri (input_gfile);
+ g_object_unref (input_gfile);
+
g_dbus_connection_emit_signal (connection,
NULL,
window->priv->dbus_object_path,
EV_WINDOW_DBUS_INTERFACE,
"SyncSource",
- g_variant_new ("(s(ii))",
- link->filename,
+ g_variant_new ("(s(ii)u)",
+ uri_input,
link->line,
- link->col),
+ link->col,
+ timestamp),
&error);
+ g_free (uri_input);
if (error) {
g_printerr ("Failed to emit DBus signal SyncSource: %s\n",
error->message);
@@ -6504,6 +6838,35 @@ ev_window_emit_closed (EvWindow *window)
g_dbus_connection_flush_sync (connection, NULL, NULL);
}
+static void
+ev_window_emit_doc_loaded (EvWindow *window)
+{
+ GDBusConnection *connection;
+ GError *error = NULL;
+
+ if (window->priv->dbus_object_id <= 0)
+ return;
+
+ connection = ev_application_get_dbus_connection (EV_APP);
+ if (!connection)
+ return;
+
+ g_dbus_connection_emit_signal (connection,
+ NULL,
+ window->priv->dbus_object_path,
+ EV_WINDOW_DBUS_INTERFACE,
+ "DocumentLoaded",
+ g_variant_new("(s)", window->priv->uri),
+ &error);
+ if (error) {
+ g_printerr ("Failed to emit DBus signal DocumentLoaded: %s\n",
+ error->message);
+ g_error_free (error);
+
+ return;
+ }
+}
+
static void
method_call_cb (GDBusConnection *connection,
const gchar *sender,
@@ -6521,10 +6884,11 @@ method_call_cb (GDBusConnection *connection,
if (window->priv->document && ev_document_has_synctex (window->priv->document)) {
EvSourceLink link;
+ guint32 timestamp;
- g_variant_get (parameters, "(&s(ii))", &link.filename, &link.line, &link.col);
+ g_variant_get (parameters, "(&s(ii)u)", &link.filename, &link.line, &link.col, ×tamp);
ev_view_highlight_forward_search (EV_VIEW (window->priv->view), &link);
- gtk_window_present (GTK_WINDOW (window));
+ gtk_window_present_with_time (GTK_WINDOW (window), timestamp);
}
g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
@@ -6536,12 +6900,17 @@ static const char introspection_xml[] =
""
""
""
+ ""
""
""
""
""
+ ""
""
""
+ ""
+ ""
+ ""
""
"";
@@ -6702,7 +7071,7 @@ ev_window_init (EvWindow *ev_window)
gtk_widget_show (ev_window->priv->toolbar);
/* Add the main area */
- ev_window->priv->hpaned = gtk_hpaned_new ();
+ ev_window->priv->hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
g_signal_connect (ev_window->priv->hpaned,
"notify::position",
G_CALLBACK (ev_window_sidebar_position_change_cb),
@@ -6786,6 +7155,16 @@ ev_window_init (EvWindow *ev_window)
ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar),
sidebar_widget);
+ sidebar_widget = ev_sidebar_bookmarks_new ();
+ ev_window->priv->sidebar_bookmarks = sidebar_widget;
+ g_signal_connect (sidebar_widget,
+ "add-bookmark",
+ G_CALLBACK (sidebar_bookmarks_add_bookmark),
+ ev_window);
+ gtk_widget_show (sidebar_widget);
+ ev_sidebar_add_page (EV_SIDEBAR (ev_window->priv->sidebar),
+ sidebar_widget);
+
ev_window->priv->view_box = gtk_vbox_new (FALSE, 0);
ev_window->priv->scrolled_window =
GTK_WIDGET (g_object_new (GTK_TYPE_SCROLLED_WINDOW,
@@ -6830,6 +7209,9 @@ ev_window_init (EvWindow *ev_window)
g_signal_connect_object (ev_window->priv->view, "annot-added",
G_CALLBACK (view_annot_added),
ev_window, 0);
+ g_signal_connect_object (ev_window->priv->view, "layers-changed",
+ G_CALLBACK (view_layers_changed_cb),
+ ev_window, 0);
#ifdef ENABLE_DBUS
g_signal_connect_swapped (ev_window->priv->view, "sync-source",
G_CALLBACK (ev_window_sync_source),