+ } else {
+ ev_window_n_copies--;
+ }
+}
+
+static void
+ev_window_dispose (GObject *object)
+{
+ EvWindow *window = EV_WINDOW (object);
+ EvWindowPrivate *priv = window->priv;
+ GObject *mpkeys = ev_application_get_media_keys (EV_APP);
+
+ if (mpkeys) {
+ g_signal_handlers_disconnect_by_func (mpkeys,
+ ev_window_media_player_key_pressed,
+ window);
+ }
+
+#ifdef ENABLE_DBUS
+ if (priv->dbus_object_id > 0) {
+ ev_window_emit_closed (window);
+ g_dbus_connection_unregister_object (ev_application_get_dbus_connection (EV_APP),
+ priv->dbus_object_id);
+ priv->dbus_object_id = 0;
+ }
+
+ if (priv->dbus_object_path) {
+ g_free (priv->dbus_object_path);
+ priv->dbus_object_path = NULL;
+ }
+#endif /* ENABLE_DBUS */
+
+ if (priv->metadata) {
+ g_object_unref (priv->metadata);
+ priv->metadata = NULL;
+ }
+
+ if (priv->setup_document_idle > 0) {
+ g_source_remove (priv->setup_document_idle);
+ priv->setup_document_idle = 0;
+ }
+
+ if (priv->monitor) {
+ g_object_unref (priv->monitor);
+ priv->monitor = NULL;
+ }
+
+ if (priv->title) {
+ ev_window_title_free (priv->title);
+ priv->title = NULL;
+ }
+
+ if (priv->ui_manager) {
+ g_object_unref (priv->ui_manager);
+ priv->ui_manager = NULL;
+ }
+
+ if (priv->action_group) {
+ g_object_unref (priv->action_group);
+ priv->action_group = NULL;
+ }
+
+ if (priv->view_popup_action_group) {
+ g_object_unref (priv->view_popup_action_group);
+ priv->view_popup_action_group = NULL;
+ }
+
+ if (priv->attachment_popup_action_group) {
+ g_object_unref (priv->attachment_popup_action_group);
+ priv->attachment_popup_action_group = NULL;
+ }
+
+ if (priv->recent_action_group) {
+ g_object_unref (priv->recent_action_group);
+ priv->recent_action_group = NULL;
+ }
+
+ if (priv->recent_manager) {
+ g_signal_handlers_disconnect_by_func (priv->recent_manager,
+ ev_window_setup_recent,
+ window);
+ priv->recent_manager = NULL;
+ }
+
+ if (priv->settings) {
+ g_object_unref (priv->settings);
+ priv->settings = NULL;
+ }
+
+ if (priv->default_settings) {
+ g_settings_apply (priv->default_settings);
+ g_object_unref (priv->default_settings);
+ priv->default_settings = NULL;
+ }
+
+ if (priv->lockdown_settings) {
+ g_object_unref (priv->lockdown_settings);
+ priv->lockdown_settings = NULL;
+ }
+
+ priv->recent_ui_id = 0;
+
+ if (priv->model) {
+ g_signal_handlers_disconnect_by_func (priv->model,
+ ev_window_page_changed_cb,
+ window);
+ g_object_unref (priv->model);
+ priv->model = NULL;
+ }
+
+ if (priv->document) {
+ g_object_unref (priv->document);
+ priv->document = NULL;
+ }
+
+ if (priv->view) {
+ g_object_unref (priv->view);
+ priv->view = NULL;
+ }
+
+ if (priv->password_view) {
+ g_object_unref (priv->password_view);
+ priv->password_view = NULL;
+ }
+
+ if (priv->load_job) {
+ ev_window_clear_load_job (window);
+ }
+
+ if (priv->reload_job) {
+ ev_window_clear_reload_job (window);
+ }
+
+ if (priv->save_job) {
+ ev_window_clear_save_job (window);
+ }
+
+ if (priv->thumbnail_job) {
+ ev_window_clear_thumbnail_job (window);
+ }
+
+ if (priv->find_job) {
+ ev_window_clear_find_job (window);
+ }
+
+ if (priv->local_uri) {
+ ev_window_clear_local_uri (window);
+ priv->local_uri = NULL;
+ }
+
+ ev_window_clear_progress_idle (window);
+ if (priv->progress_cancellable) {
+ g_object_unref (priv->progress_cancellable);
+ priv->progress_cancellable = NULL;
+ }
+
+ ev_window_close_dialogs (window);
+
+ if (priv->link) {
+ g_object_unref (priv->link);
+ priv->link = NULL;
+ }
+
+ if (priv->image) {
+ g_object_unref (priv->image);
+ priv->image = NULL;
+ }
+
+ if (priv->annot) {
+ g_object_unref (priv->annot);
+ priv->annot = NULL;
+ }
+
+ if (priv->attach_list) {
+ g_list_foreach (priv->attach_list,
+ (GFunc) g_object_unref,
+ NULL);
+ g_list_free (priv->attach_list);
+ priv->attach_list = NULL;
+ }
+
+ if (priv->find_bar) {
+ g_signal_handlers_disconnect_by_func
+ (window->priv->find_bar,
+ G_CALLBACK (find_bar_close_cb),
+ window);
+ priv->find_bar = NULL;
+ }
+
+ if (priv->uri) {
+ g_free (priv->uri);
+ priv->uri = NULL;
+ }
+
+ if (priv->search_string) {
+ g_free (priv->search_string);
+ priv->search_string = NULL;
+ }
+
+ if (priv->dest) {
+ g_object_unref (priv->dest);
+ priv->dest = NULL;
+ }
+
+ if (priv->history) {
+ g_object_unref (priv->history);
+ priv->history = NULL;
+ }
+
+ if (priv->print_queue) {
+ g_queue_free (priv->print_queue);
+ priv->print_queue = NULL;
+ }
+
+ G_OBJECT_CLASS (ev_window_parent_class)->dispose (object);
+}
+
+static void
+menubar_deactivate_cb (GtkWidget *menubar,
+ EvWindow *window)
+{
+ g_signal_handlers_disconnect_by_func (menubar,
+ G_CALLBACK (menubar_deactivate_cb),
+ window);
+
+ gtk_menu_shell_deselect (GTK_MENU_SHELL (menubar));
+
+ update_chrome_visibility (window);
+}
+
+static gboolean
+ev_window_key_press_event (GtkWidget *widget,
+ GdkEventKey *event)
+{
+ EvWindow *ev_window = EV_WINDOW (widget);
+ EvWindowPrivate *priv = ev_window->priv;
+ gboolean handled = FALSE;
+
+ /* Propagate the event to the view first
+ * It's needed to be able to type in
+ * annot popups windows
+ */
+ if (priv->view) {
+ g_object_ref (priv->view);
+ if (gtk_widget_is_sensitive (priv->view))
+ handled = gtk_widget_event (priv->view, (GdkEvent*) event);
+ g_object_unref (priv->view);
+ }
+
+ if (!handled && !EV_WINDOW_IS_PRESENTATION (ev_window)) {
+ guint modifier = event->state & gtk_accelerator_get_default_mod_mask ();
+
+ if (priv->menubar_accel_keyval != 0 &&
+ event->keyval == priv->menubar_accel_keyval &&
+ modifier == priv->menubar_accel_modifier) {
+ if (!gtk_widget_get_visible (priv->menubar)) {
+ g_signal_connect (priv->menubar, "deactivate",
+ G_CALLBACK (menubar_deactivate_cb),
+ ev_window);
+
+ gtk_widget_show (priv->menubar);
+ gtk_menu_shell_select_first (GTK_MENU_SHELL (priv->menubar),
+ FALSE);
+
+ handled = TRUE;
+ }
+ }
+ }
+
+ if (!handled)
+ handled = GTK_WIDGET_CLASS (ev_window_parent_class)->key_press_event (widget, event);
+
+ return handled;
+}
+
+static gboolean
+ev_window_delete_event (GtkWidget *widget,
+ GdkEventAny *event)
+{
+ return !ev_window_close (EV_WINDOW (widget));
+}
+
+static void
+ev_window_class_init (EvWindowClass *ev_window_class)
+{
+ GObjectClass *g_object_class = G_OBJECT_CLASS (ev_window_class);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (ev_window_class);
+
+ g_object_class->dispose = ev_window_dispose;
+ g_object_class->finalize = ev_window_finalize;
+
+ widget_class->delete_event = ev_window_delete_event;
+ widget_class->key_press_event = ev_window_key_press_event;
+ widget_class->screen_changed = ev_window_screen_changed;
+ widget_class->window_state_event = ev_window_state_event;
+ widget_class->drag_data_received = ev_window_drag_data_received;
+
+ g_type_class_add_private (g_object_class, sizeof (EvWindowPrivate));
+}
+
+/* Normal items */
+static const GtkActionEntry entries[] = {
+ { "File", NULL, N_("_File") },
+ { "Edit", NULL, N_("_Edit") },
+ { "View", NULL, N_("_View") },
+ { "Go", NULL, N_("_Go") },
+ { "Help", NULL, N_("_Help") },
+
+ /* File menu */
+ { "FileOpen", GTK_STOCK_OPEN, N_("_Open…"), "<control>O",
+ N_("Open an existing document"),
+ G_CALLBACK (ev_window_cmd_file_open) },
+ { "FileOpenCopy", NULL, N_("Op_en a Copy"), "<control>N",
+ N_("Open a copy of the current document in a new window"),
+ G_CALLBACK (ev_window_cmd_file_open_copy) },
+ { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy…"), "<control>S",
+ N_("Save a copy of the current document"),
+ G_CALLBACK (ev_window_cmd_save_as) },
+ { "FilePrint", GTK_STOCK_PRINT, N_("_Print…"), "<control>P",
+ N_("Print this document"),
+ G_CALLBACK (ev_window_cmd_file_print) },
+ { "FileProperties", GTK_STOCK_PROPERTIES, N_("P_roperties"), "<alt>Return", NULL,
+ G_CALLBACK (ev_window_cmd_file_properties) },
+ { "FileCloseWindow", GTK_STOCK_CLOSE, NULL, "<control>W", NULL,
+ G_CALLBACK (ev_window_cmd_file_close_window) },
+
+ /* Edit menu */
+ { "EditCopy", GTK_STOCK_COPY, NULL, "<control>C", NULL,
+ G_CALLBACK (ev_window_cmd_edit_copy) },
+ { "EditSelectAll", GTK_STOCK_SELECT_ALL, N_("Select _All"), "<control>A", NULL,
+ G_CALLBACK (ev_window_cmd_edit_select_all) },
+ { "EditFind", GTK_STOCK_FIND, N_("_Find…"), "<control>F",
+ N_("Find a word or phrase in the document"),
+ G_CALLBACK (ev_window_cmd_edit_find) },
+ { "EditFindNext", NULL, N_("Find Ne_xt"), "<control>G", NULL,
+ G_CALLBACK (ev_window_cmd_edit_find_next) },
+ { "EditFindPrevious", NULL, N_("Find Pre_vious"), "<shift><control>G", NULL,
+ G_CALLBACK (ev_window_cmd_edit_find_previous) },
+ { "EditToolbar", NULL, N_("T_oolbar"), NULL, NULL,
+ G_CALLBACK (ev_window_cmd_edit_toolbar) },
+ { "EditRotateLeft", EV_STOCK_ROTATE_LEFT, N_("Rotate _Left"), "<control>Left", NULL,
+ G_CALLBACK (ev_window_cmd_edit_rotate_left) },
+ { "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), "<control>Right", NULL,
+ G_CALLBACK (ev_window_cmd_edit_rotate_right) },
+ { "EditSaveSettings", NULL, N_("Save Current Settings as _Default"), "<control>T", NULL,
+ G_CALLBACK (ev_window_cmd_edit_save_settings) },
+
+
+ /* View menu */
+ { "ViewZoomIn", GTK_STOCK_ZOOM_IN, NULL, "<control>plus",
+ N_("Enlarge the document"),
+ G_CALLBACK (ev_window_cmd_view_zoom_in) },
+ { "ViewZoomOut", GTK_STOCK_ZOOM_OUT, NULL, "<control>minus",
+ N_("Shrink the document"),
+ G_CALLBACK (ev_window_cmd_view_zoom_out) },
+ { "ViewReload", GTK_STOCK_REFRESH, N_("_Reload"), "<control>R",
+ N_("Reload the document"),
+ G_CALLBACK (ev_window_cmd_view_reload) },
+
+ { "ViewAutoscroll", GTK_STOCK_MEDIA_PLAY, N_("Auto_scroll"), NULL, NULL,
+ G_CALLBACK (ev_window_cmd_view_autoscroll) },
+
+ /* Go menu */
+ { "GoPreviousPage", GTK_STOCK_GO_UP, N_("_Previous Page"), "<control>Page_Up",
+ N_("Go to the previous page"),
+ G_CALLBACK (ev_window_cmd_go_previous_page) },
+ { "GoNextPage", GTK_STOCK_GO_DOWN, N_("_Next Page"), "<control>Page_Down",
+ N_("Go to the next page"),
+ G_CALLBACK (ev_window_cmd_go_next_page) },
+ { "GoFirstPage", GTK_STOCK_GOTO_TOP, N_("_First Page"), "<control>Home",
+ N_("Go to the first page"),
+ G_CALLBACK (ev_window_cmd_go_first_page) },
+ { "GoLastPage", GTK_STOCK_GOTO_BOTTOM, N_("_Last Page"), "<control>End",
+ N_("Go to the last page"),
+ G_CALLBACK (ev_window_cmd_go_last_page) },
+
+ /* Help menu */
+ { "HelpContents", GTK_STOCK_HELP, N_("_Contents"), "F1", NULL,
+ G_CALLBACK (ev_window_cmd_help_contents) },
+
+ { "HelpAbout", GTK_STOCK_ABOUT, N_("_About"), NULL, NULL,
+ G_CALLBACK (ev_window_cmd_help_about) },
+
+ /* Toolbar-only */
+ { "LeaveFullscreen", GTK_STOCK_LEAVE_FULLSCREEN, N_("Leave Fullscreen"), NULL,
+ N_("Leave fullscreen mode"),
+ G_CALLBACK (ev_window_cmd_leave_fullscreen) },
+ { "StartPresentation", EV_STOCK_RUN_PRESENTATION, N_("Start Presentation"), NULL,
+ N_("Start a presentation"),
+ G_CALLBACK (ev_window_cmd_start_presentation) },
+
+ /* Accellerators */
+ { "Escape", NULL, "", "Escape", "",
+ G_CALLBACK (ev_window_cmd_escape) },
+ { "Slash", GTK_STOCK_FIND, NULL, "slash", NULL,
+ G_CALLBACK (ev_window_cmd_edit_find) },
+ { "F3", NULL, "", "F3", NULL,
+ G_CALLBACK (ev_window_cmd_edit_find_next) },
+ { "PageDown", NULL, "", "Page_Down", NULL,
+ G_CALLBACK (ev_window_cmd_scroll_forward) },
+ { "PageUp", NULL, "", "Page_Up", NULL,
+ G_CALLBACK (ev_window_cmd_scroll_backward) },
+ { "Space", NULL, "", "space", NULL,
+ G_CALLBACK (ev_window_cmd_scroll_forward) },
+ { "ShiftSpace", NULL, "", "<shift>space", NULL,
+ G_CALLBACK (ev_window_cmd_scroll_backward) },
+ { "BackSpace", NULL, "", "BackSpace", NULL,
+ G_CALLBACK (ev_window_cmd_scroll_backward) },
+ { "ShiftBackSpace", NULL, "", "<shift>BackSpace", NULL,
+ G_CALLBACK (ev_window_cmd_scroll_forward) },
+ { "Return", NULL, "", "Return", NULL,
+ G_CALLBACK (ev_window_cmd_scroll_forward) },
+ { "ShiftReturn", NULL, "", "<shift>Return", NULL,
+ G_CALLBACK (ev_window_cmd_scroll_backward) },
+ { "p", GTK_STOCK_GO_UP, "", "p", NULL,
+ G_CALLBACK (ev_window_cmd_go_previous_page) },
+ { "n", GTK_STOCK_GO_DOWN, "", "n", NULL,
+ G_CALLBACK (ev_window_cmd_go_next_page) },
+ { "Plus", GTK_STOCK_ZOOM_IN, NULL, "plus", NULL,
+ G_CALLBACK (ev_window_cmd_view_zoom_in) },
+ { "CtrlEqual", GTK_STOCK_ZOOM_IN, NULL, "<control>equal", NULL,
+ G_CALLBACK (ev_window_cmd_view_zoom_in) },
+ { "Equal", GTK_STOCK_ZOOM_IN, NULL, "equal", NULL,
+ G_CALLBACK (ev_window_cmd_view_zoom_in) },
+ { "Minus", GTK_STOCK_ZOOM_OUT, NULL, "minus", NULL,
+ G_CALLBACK (ev_window_cmd_view_zoom_out) },
+ { "FocusPageSelector", NULL, "", "<control>l", NULL,
+ G_CALLBACK (ev_window_cmd_focus_page_selector) },
+ { "GoBackwardFast", NULL, "", "<shift>Page_Up", NULL,
+ G_CALLBACK (ev_window_cmd_go_backward) },
+ { "GoForwardFast", NULL, "", "<shift>Page_Down", NULL,
+ G_CALLBACK (ev_window_cmd_go_forward) },
+ { "KpPlus", GTK_STOCK_ZOOM_IN, NULL, "KP_Add", NULL,
+ G_CALLBACK (ev_window_cmd_view_zoom_in) },
+ { "KpMinus", GTK_STOCK_ZOOM_OUT, NULL, "KP_Subtract", NULL,
+ G_CALLBACK (ev_window_cmd_view_zoom_out) },
+ { "CtrlKpPlus", GTK_STOCK_ZOOM_IN, NULL, "<control>KP_Add", NULL,
+ G_CALLBACK (ev_window_cmd_view_zoom_in) },
+ { "CtrlKpMinus", GTK_STOCK_ZOOM_OUT, NULL, "<control>KP_Subtract", NULL,
+ G_CALLBACK (ev_window_cmd_view_zoom_out) },
+ { "CtrlInsert", GTK_STOCK_COPY, NULL, "<control>Insert", NULL,
+ G_CALLBACK (ev_window_cmd_edit_copy) },
+};
+
+/* Toggle items */
+static const GtkToggleActionEntry toggle_entries[] = {
+ /* View Menu */
+ { "ViewToolbar", NULL, N_("_Toolbar"), NULL,
+ N_("Show or hide the toolbar"),
+ G_CALLBACK (ev_window_view_toolbar_cb), TRUE },
+ { "ViewSidebar", GTK_STOCK_INDEX, N_("Side _Pane"), "F9",
+ N_("Show or hide the side pane"),
+ G_CALLBACK (ev_window_view_sidebar_cb), TRUE },
+ { "ViewContinuous", EV_STOCK_VIEW_CONTINUOUS, N_("_Continuous"), NULL,
+ N_("Show the entire document"),
+ G_CALLBACK (ev_window_cmd_continuous), TRUE },
+ { "ViewDual", EV_STOCK_VIEW_DUAL, N_("_Dual"), NULL,
+ N_("Show two pages at once"),
+ G_CALLBACK (ev_window_cmd_dual), FALSE },
+ { "ViewFullscreen", GTK_STOCK_FULLSCREEN, N_("_Fullscreen"), "F11",
+ N_("Expand the window to fill the screen"),
+ G_CALLBACK (ev_window_cmd_view_fullscreen) },
+ { "ViewPresentation", EV_STOCK_RUN_PRESENTATION, N_("Pre_sentation"), "F5",
+ N_("Run document as a presentation"),
+ G_CALLBACK (ev_window_cmd_view_presentation) },
+ { "ViewBestFit", EV_STOCK_ZOOM_PAGE, N_("_Best Fit"), NULL,
+ N_("Make the current document fill the window"),
+ G_CALLBACK (ev_window_cmd_view_best_fit) },
+ { "ViewPageWidth", EV_STOCK_ZOOM_WIDTH, N_("Fit Page _Width"), NULL,
+ N_("Make the current document fill the window width"),
+ G_CALLBACK (ev_window_cmd_view_page_width) },
+ { "ViewInvertedColors", EV_STOCK_INVERTED_COLORS, N_("_Inverted Colors"), "<control>I",
+ N_("Show page contents with the colors inverted"),
+ G_CALLBACK (ev_window_cmd_view_inverted_colors) },
+
+};
+
+/* Popups specific items */
+static const GtkActionEntry view_popup_entries [] = {
+ /* Links */
+ { "OpenLink", GTK_STOCK_OPEN, N_("_Open Link"), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_open_link) },
+ { "GoLink", GTK_STOCK_GO_FORWARD, N_("_Go To"), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_open_link) },
+ { "OpenLinkNewWindow", NULL, N_("Open in New _Window"), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_open_link_new_window) },
+ { "CopyLinkAddress", NULL, N_("_Copy Link Address"), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_copy_link_address) },
+ { "SaveImageAs", NULL, N_("_Save Image As…"), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_save_image_as) },
+ { "CopyImage", NULL, N_("Copy _Image"), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_copy_image) },
+ { "AnnotProperties", NULL, N_("Annotation Properties…"), NULL,
+ NULL, G_CALLBACK (ev_view_popup_cmd_annot_properties) }
+};
+
+static const GtkActionEntry attachment_popup_entries [] = {
+ { "OpenAttachment", GTK_STOCK_OPEN, N_("_Open Attachment"), NULL,
+ NULL, G_CALLBACK (ev_attachment_popup_cmd_open_attachment) },
+ { "SaveAttachmentAs", GTK_STOCK_SAVE_AS, N_("_Save Attachment As…"), NULL,
+ NULL, G_CALLBACK (ev_attachment_popup_cmd_save_attachment_as) },
+};
+
+static void
+sidebar_links_link_activated_cb (EvSidebarLinks *sidebar_links, EvLink *link, EvWindow *window)
+{
+ ev_view_handle_link (EV_VIEW (window->priv->view), link);
+}
+
+static void
+activate_link_cb (EvPageAction *page_action, EvLink *link, EvWindow *window)
+{
+ ev_view_handle_link (EV_VIEW (window->priv->view), link);
+ gtk_widget_grab_focus (window->priv->view);
+}
+
+static void
+navigation_action_activate_link_cb (EvNavigationAction *action, EvLink *link, EvWindow *window)
+{