X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-window.c;h=c53b772b448f761de91ecf50a151ae5285a750b3;hb=e03ccc6269d7e687b4f5a67a0c07a014f301930b;hp=cdc41ea6a7e05a63f7ddd00c01368a8e7ffe502c;hpb=0de4e4076b4198674b6fa77c8281cd62a293f2fe;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index cdc41ea6..c53b772b 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -32,6 +32,7 @@ #include "ev-window-title.h" #include "ev-navigation-action.h" #include "ev-page-action.h" +#include "ev-open-recent-action.h" #include "ev-sidebar.h" #include "ev-sidebar-links.h" #include "ev-sidebar-attachments.h" @@ -51,13 +52,6 @@ #include "ev-jobs.h" #include "ev-sidebar-page.h" #include "eggfindbar.h" - -#ifndef HAVE_GTK_RECENT -#include "egg-recent-view-uimanager.h" -#include "egg-recent-view.h" -#include "egg-recent-model.h" -#endif - #include "egg-toolbar-editor.h" #include "egg-editable-toolbar.h" #include "egg-toolbars-model.h" @@ -97,7 +91,9 @@ #include #include +#if !GLIB_CHECK_VERSION (2, 13, 3) char *xdg_user_dir_lookup (char *type); +#endif typedef enum { PAGE_MODE_DOCUMENT, @@ -143,11 +139,9 @@ struct _EvWindowPrivate { GtkActionGroup *action_group; GtkActionGroup *view_popup_action_group; GtkActionGroup *attachment_popup_action_group; -#ifdef HAVE_GTK_RECENT GtkRecentManager *recent_manager; GtkActionGroup *recent_action_group; guint recent_ui_id; -#endif GtkUIManager *ui_manager; /* Fullscreen mode */ @@ -174,18 +168,17 @@ struct _EvWindowPrivate { char *local_uri; EvLinkDest *dest; gboolean unlink_temp_file; + gboolean in_reload; EvDocument *document; EvHistory *history; EvPageCache *page_cache; EvWindowPageMode page_mode; EvWindowTitle *title; -#ifndef HAVE_GTK_RECENT - EggRecentViewUIManager *recent_view; -#endif EvJob *load_job; EvJob *thumbnail_job; + EvJob *save_job; #ifdef WITH_GNOME_PRINT GnomePrintJob *print_job; #endif @@ -218,7 +211,7 @@ struct _EvWindowPrivate { #define THUMBNAILS_SIDEBAR_ID "thumbnails" #define ATTACHMENTS_SIDEBAR_ID "attachments" -static void ev_window_update_actions (EvWindow *ev_window); +static void ev_window_update_actions (EvWindow *ev_window); static void ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar, GParamSpec *pspec, EvWindow *ev_window); @@ -232,6 +225,8 @@ static void ev_window_set_icon_from_thumbnail (EvJobThumbnail *job, static void ev_window_print_job_cb (EvJobPrint *job, EvWindow *window); #endif +static void ev_window_save_job_cb (EvJobSave *save, + EvWindow *window); static void ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window); @@ -260,16 +255,21 @@ static void ev_view_popup_cmd_save_image_as (GtkAction *actio static void ev_view_popup_cmd_copy_image (GtkAction *action, EvWindow *window); static void ev_attachment_popup_cmd_open_attachment (GtkAction *action, - EvWindow *window); -static void ev_attachment_popup_cmd_save_attachment_as (GtkAction *action, - EvWindow *window); + EvWindow *window); +static void ev_attachment_popup_cmd_save_attachment_as (GtkAction *action, + EvWindow *window); static void ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window); static void ev_window_cmd_view_page_width (GtkAction *action, EvWindow *ev_window); -static void view_handle_link_cb (EvView *view, - EvLink *link, - EvWindow *window); +static void view_handle_link_cb (EvView *view, + EvLink *link, + EvWindow *window); +static void ev_window_cmd_edit_find (GtkAction *action, + EvWindow *ev_window); +static void find_bar_search_changed_cb (EggFindBar *find_bar, + GParamSpec *param, + EvWindow *ev_window); G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) @@ -314,7 +314,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) has_properties = FALSE; } - if (has_document && ev_document_can_get_text (document)) { + if (has_document && EV_IS_SELECTION (document)) { can_get_text = TRUE; } @@ -506,7 +506,7 @@ update_chrome_visibility (EvWindow *window) fullscreen_toolbar = ((priv->chrome & EV_CHROME_FULLSCREEN_TOOLBAR) != 0 || (priv->chrome & EV_CHROME_RAISE_TOOLBAR) != 0) && fullscreen; findbar = (priv->chrome & EV_CHROME_FINDBAR) != 0; - sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && !fullscreen_mode; + sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && !presentation; preview_toolbar = (priv->chrome& EV_CHROME_PREVIEW_TOOLBAR); set_widget_visibility (priv->menubar, menubar); @@ -535,8 +535,6 @@ update_chrome_flag (EvWindow *window, EvChrome flag, gboolean active) } else { priv->chrome &= ~flag; } - - update_chrome_visibility (window); } static void @@ -700,6 +698,9 @@ ev_window_add_history (EvWindow *window, gint page, EvLink *link) if (window->priv->history == NULL) return; + + if (!EV_IS_DOCUMENT_LINKS (window->priv->document)) + return; if (link) { action = g_object_ref (ev_link_get_action (link)); @@ -718,8 +719,7 @@ ev_window_add_history (EvWindow *window, gint page, EvLink *link) find_task.page_label = page_label; find_task.chapter = NULL; - if (EV_IS_DOCUMENT_LINKS (window->priv->document) && - ev_document_links_has_document_links (EV_DOCUMENT_LINKS (window->priv->document))) { + 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); @@ -796,7 +796,7 @@ setup_document_from_metadata (EvWindow *window) if (uri && ev_metadata_manager_get (uri, "page", &page, TRUE)) { n_pages = ev_page_cache_get_n_pages (window->priv->page_cache); new_page = CLAMP (g_value_get_int (&page), 0, n_pages - 1); - if (new_page == n_pages - 1) + if (!window->priv->in_reload && new_page == n_pages - 1) new_page = 0; ev_page_cache_set_current_page (window->priv->page_cache, new_page); @@ -854,6 +854,7 @@ setup_sidebar_from_metadata (EvWindow *window, EvDocument *document) if (ev_metadata_manager_get (uri, "sidebar_visibility", &sidebar_visibility, FALSE)) { update_chrome_flag (window, EV_CHROME_SIDEBAR, g_value_get_boolean (&sidebar_visibility)); g_value_unset (&sidebar_visibility); + update_chrome_visibility (window); } } @@ -1053,6 +1054,36 @@ ev_window_set_icon_from_thumbnail (EvJobThumbnail *job, ev_window_clear_thumbnail_job (ev_window); } +static void +ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation) +{ + + EvRenderContext *rc; + gint page_width, page_height; + gdouble scale; + EvDocument *document = ev_window->priv->document; + + if (!EV_IS_DOCUMENT_THUMBNAILS (document)) { + return; + } + + ev_window_clear_thumbnail_job (ev_window); + + ev_page_cache_get_size (ev_window->priv->page_cache, + 0, 0, 1.0, + &page_width, &page_height); + scale = (gdouble)128 / (gdouble)page_width; + + rc = ev_render_context_new (rotation, 0, scale); + + ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, rc); + g_signal_connect (ev_window->priv->thumbnail_job, "finished", + G_CALLBACK (ev_window_set_icon_from_thumbnail), + ev_window); + ev_job_queue_add_job (EV_JOB (ev_window->priv->thumbnail_job), EV_JOB_PRIORITY_LOW); + g_object_unref (rc); +} + static gboolean ev_window_setup_document (EvWindow *ev_window) { @@ -1067,27 +1098,8 @@ ev_window_setup_document (EvWindow *ev_window) G_CALLBACK (find_changed_cb), ev_window, 0); } - - if (EV_IS_DOCUMENT_THUMBNAILS (document)) { - EvRenderContext *rc; - gint page_width, page_height; - gdouble scale; - - ev_window_clear_thumbnail_job (ev_window); - - ev_page_cache_get_size (ev_window->priv->page_cache, - 0, 0, 1.0, - &page_width, &page_height); - scale = (gdouble)128 / (gdouble)page_width; - - rc = ev_render_context_new (0, 0, scale); - ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, rc); - g_signal_connect (ev_window->priv->thumbnail_job, "finished", - G_CALLBACK (ev_window_set_icon_from_thumbnail), - ev_window); - ev_job_queue_add_job (EV_JOB (ev_window->priv->thumbnail_job), EV_JOB_PRIORITY_LOW); - g_object_unref (rc); - } + + ev_window_refresh_window_thumbnail (ev_window, 0); ev_window_set_page_mode (ev_window, PAGE_MODE_DOCUMENT); ev_window_title_set_document (ev_window->priv->title, document); @@ -1208,25 +1220,25 @@ ev_window_popup_password_dialog (EvWindow *ev_window) static void ev_window_clear_load_job (EvWindow *ev_window) { - if (ev_window->priv->load_job != NULL) { - - if (!ev_window->priv->load_job->finished) - ev_job_queue_remove_job (ev_window->priv->load_job); - - g_signal_handlers_disconnect_by_func (ev_window->priv->load_job, ev_window_load_job_cb, ev_window); - g_object_unref (ev_window->priv->load_job); - ev_window->priv->load_job = NULL; - } + if (ev_window->priv->load_job != NULL) { + + if (!ev_window->priv->load_job->finished) + ev_job_queue_remove_job (ev_window->priv->load_job); + + g_signal_handlers_disconnect_by_func (ev_window->priv->load_job, ev_window_load_job_cb, ev_window); + g_object_unref (ev_window->priv->load_job); + ev_window->priv->load_job = NULL; + } } static void ev_window_clear_local_uri (EvWindow *ev_window) { - if (ev_window->priv->local_uri) { - ev_tmp_uri_unlink (ev_window->priv->local_uri); - g_free (ev_window->priv->local_uri); - ev_window->priv->local_uri = NULL; - } + if (ev_window->priv->local_uri) { + ev_tmp_uri_unlink (ev_window->priv->local_uri); + g_free (ev_window->priv->local_uri); + ev_window->priv->local_uri = NULL; + } } static void @@ -1323,7 +1335,23 @@ ev_window_load_job_cb (EvJobLoad *job, break; } - ev_window_clear_load_job (ev_window); + /* Restart the search after reloading */ + if (ev_window->priv->in_reload) { + GtkWidget *widget; + + widget = gtk_window_get_focus (GTK_WINDOW (ev_window)); + if (widget && gtk_widget_get_ancestor (widget, EGG_TYPE_FIND_BAR)) { + find_bar_search_changed_cb (EGG_FIND_BAR (ev_window->priv->find_bar), + NULL, ev_window); + } + } else if (job->search_string && EV_IS_DOCUMENT_FIND (document)) { + ev_window_cmd_edit_find (NULL, ev_window); + egg_find_bar_set_search_string (EGG_FIND_BAR (ev_window->priv->find_bar), + job->search_string); + } + + ev_window_clear_load_job (ev_window); + ev_window->priv->in_reload = FALSE; return; } @@ -1347,6 +1375,7 @@ ev_window_load_job_cb (EvJobLoad *job, _("Unable to open document"), job->error); ev_window_clear_load_job (ev_window); + ev_window->priv->in_reload = FALSE; } return; @@ -1425,11 +1454,17 @@ ev_window_open_uri (EvWindow *ev_window, const char *uri, EvLinkDest *dest, EvWindowRunMode mode, + const gchar *search_string, gboolean unlink_temp_file, const gchar *print_settings) { GnomeVFSURI *source_uri; GnomeVFSURI *target_uri; + + if (ev_window->priv->uri && + g_ascii_strcasecmp (ev_window->priv->uri, uri) == 0) { + ev_window->priv->in_reload = TRUE; + } ev_window_close_dialogs (ev_window); ev_window_clear_load_job (ev_window); @@ -1450,7 +1485,7 @@ ev_window_open_uri (EvWindow *ev_window, setup_size_from_metadata (ev_window); - ev_window->priv->load_job = ev_job_load_new (uri, dest, mode); + ev_window->priv->load_job = ev_job_load_new (uri, dest, mode, search_string); g_signal_connect (ev_window->priv->load_job, "finished", G_CALLBACK (ev_window_load_job_cb), @@ -1506,6 +1541,8 @@ file_open_dialog_response_cb (GtkWidget *chooser, gint response_id, EvWindow *ev_window) { + gchar *uri; + if (response_id == GTK_RESPONSE_OK) { GSList *uris; @@ -1518,8 +1555,10 @@ file_open_dialog_response_cb (GtkWidget *chooser, g_slist_foreach (uris, (GFunc)g_free, NULL); g_slist_free (uris); } - ev_application_set_chooser_uri (EV_APP, - gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser))); + + uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser)); + ev_application_set_chooser_uri (EV_APP, uri); + g_free (uri); gtk_widget_destroy (chooser); } @@ -1547,12 +1586,20 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window) gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser), window->priv->uri); } else { +#if GLIB_CHECK_VERSION (2, 13, 3) + const gchar *folder; + + folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), + folder ? folder : g_get_home_dir ()); +#else char *folder; folder = xdg_user_dir_lookup ("DOCUMENTS"); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), folder); free (folder); +#endif } g_signal_connect (chooser, "response", @@ -1640,6 +1687,7 @@ ev_window_cmd_file_open_copy_at_dest (EvWindow *window, EvLinkDest *dest) gtk_window_get_screen (GTK_WINDOW (window)), dest, 0, + NULL, TRUE, NULL, GDK_CURRENT_TIME); @@ -1661,10 +1709,9 @@ ev_window_cmd_file_open_copy (GtkAction *action, EvWindow *window) g_object_unref (dest); } -#ifdef HAVE_GTK_RECENT static void -ev_window_cmd_recent_file_activate (GtkAction *action, - EvWindow *window) +ev_window_cmd_recent_file_activate (GtkAction *action, + EvWindow *window) { GtkRecentInfo *info; const gchar *uri; @@ -1676,46 +1723,27 @@ ev_window_cmd_recent_file_activate (GtkAction *action, ev_application_open_uri_at_dest (EV_APP, uri, gtk_window_get_screen (GTK_WINDOW (window)), - NULL, 0, FALSE, NULL, + NULL, 0, NULL, FALSE, NULL, GDK_CURRENT_TIME); } -#else + static void -ev_window_cmd_recent_file_activate (GtkAction *action, - EvWindow *ev_window) +ev_window_open_recent_action_item_activated (EvOpenRecentAction *action, + const gchar *uri, + EvWindow *window) { - char *uri; - EggRecentItem *item; - - item = egg_recent_view_uimanager_get_item (ev_window->priv->recent_view, - action); - - uri = egg_recent_item_get_uri (item); - ev_application_open_uri_at_dest (EV_APP, uri, - gtk_window_get_screen (GTK_WINDOW (ev_window)), - NULL, 0, FALSE, NULL, + gtk_window_get_screen (GTK_WINDOW (window)), + NULL, 0, NULL, FALSE, NULL, GDK_CURRENT_TIME); - - g_free (uri); } -#endif /* HAVE_GTK_RECENT */ static void ev_window_add_recent (EvWindow *window, const char *filename) { -#ifdef HAVE_GTK_RECENT gtk_recent_manager_add_item (window->priv->recent_manager, filename); -#else - EggRecentItem *item; - - item = egg_recent_item_new_from_uri (filename); - egg_recent_item_add_group (item, "Evince"); - egg_recent_model_add_full (ev_application_get_recent_model (EV_APP), item); -#endif /* HAVE_GTK_RECENT */ } -#ifdef HAVE_GTK_RECENT static gint compare_recent_items (GtkRecentInfo *a, GtkRecentInfo *b) { @@ -1740,7 +1768,6 @@ compare_recent_items (GtkRecentInfo *a, GtkRecentInfo *b) return 0; } -#endif /* HAVE_GTK_RECENT */ /* * Doubles underscore to avoid spurious menu accels. @@ -1784,7 +1811,6 @@ ev_window_get_recent_file_label (gint index, const gchar *filename) static void ev_window_setup_recent (EvWindow *ev_window) { -#ifdef HAVE_GTK_RECENT GList *items, *l; guint n_items = 0; const gchar *evince = g_get_application_name (); @@ -1859,22 +1885,6 @@ ev_window_setup_recent (EvWindow *ev_window) g_list_foreach (items, (GFunc) gtk_recent_info_unref, NULL); g_list_free (items); -#else /* HAVE_GTK_RECENT */ - ev_window->priv->recent_view = egg_recent_view_uimanager_new (ev_window->priv->ui_manager, - "/MainMenu/FileMenu/RecentFilesMenu", - G_CALLBACK (ev_window_cmd_recent_file_activate), - ev_window); - - egg_recent_view_uimanager_show_icons (EGG_RECENT_VIEW_UIMANAGER (ev_window->priv->recent_view), FALSE); - - egg_recent_view_set_model (EGG_RECENT_VIEW (ev_window->priv->recent_view), - ev_application_get_recent_model (EV_APP)); - - egg_recent_view_uimanager_set_trailing_sep (ev_window->priv->recent_view, TRUE); - - g_signal_connect (ev_window->priv->recent_view, "activate", - G_CALLBACK (ev_window_cmd_recent_file_activate), ev_window); -#endif /* HAVE_GTK_RECENT */ } static gint @@ -1953,130 +1963,60 @@ ev_window_save_remote (EvWindow *ev_window, } static void -file_save_dialog_response_cb (GtkWidget *fc, - gint response_id, - EvWindow *ev_window) +ev_window_clear_save_job (EvWindow *ev_window) { - gchar *uri; - gchar *local_uri; - gint fd; - gchar *filename; - gchar *tmp_filename; - GError *error = NULL; - - if (response_id != GTK_RESPONSE_OK) { - gtk_widget_destroy (fc); - return; + if (ev_window->priv->save_job != NULL) { + if (!ev_window->priv->save_job->finished) + ev_job_queue_remove_job (ev_window->priv->save_job); + + g_signal_handlers_disconnect_by_func (ev_window->priv->save_job, + ev_window_save_job_cb, + ev_window); + g_object_unref (ev_window->priv->save_job); + ev_window->priv->save_job = NULL; } +} - uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc)); - - filename = ev_tmp_filename ("saveacopy"); - tmp_filename = g_strdup_printf ("%s.XXXXXX", filename); - g_free (filename); - - fd = g_mkstemp (tmp_filename); - if (fd == -1) { +static void +ev_window_save_job_cb (EvJobSave *job, + EvWindow *window) +{ + if (job->error) { gchar *msg; - gchar *display_name; - gint save_errno = errno; - display_name = g_filename_display_name (tmp_filename); - g_set_error (&error, - G_FILE_ERROR, - g_file_error_from_errno (save_errno), - _("Failed to create file “%s”: %s"), - display_name, g_strerror (save_errno)); - g_free (display_name); - - msg = g_strdup_printf (_("The file could not be saved as “%s”."), uri); - ev_window_error_dialog (GTK_WINDOW (ev_window), msg, error); - - g_free (tmp_filename); - g_free (uri); + msg = g_strdup_printf (_("The file could not be saved as “%s”."), job->uri); + ev_window_error_dialog (GTK_WINDOW (window), msg, job->error); g_free (msg); - g_error_free (error); - gtk_widget_destroy (fc); - - return; - } - - /* Save document to temp filename */ - local_uri = g_filename_to_uri (tmp_filename, NULL, NULL); - - ev_document_doc_mutex_lock (); - ev_document_save (ev_window->priv->document, local_uri, &error); - ev_document_doc_mutex_unlock (); - - close (fd); - - if (!error) { - /* If original document was compressed, - * compress it again before saving - */ - if (g_object_get_data (G_OBJECT (ev_window->priv->document), - "uri-uncompressed")) { - EvCompressionType ctype = EV_COMPRESSION_NONE; - const gchar *ext; - gchar *uri_comp; - - ext = g_strrstr (ev_window->priv->uri, ".gz"); - if (ext && g_ascii_strcasecmp (ext, ".gz") == 0) - ctype = EV_COMPRESSION_GZIP; - - ext = g_strrstr (ev_window->priv->uri, ".bz2"); - if (ext && g_ascii_strcasecmp (ext, ".bz2") == 0) - ctype = EV_COMPRESSION_BZIP2; - - uri_comp = ev_file_compress (local_uri, ctype, &error); - g_free (local_uri); - ev_tmp_filename_unlink (tmp_filename); - - if (!uri_comp || error) { - local_uri = NULL; - } else { - local_uri = uri_comp; - } - } } - g_free (tmp_filename); - - if (error) { - gchar *msg; + ev_window_clear_save_job (window); +} - msg = g_strdup_printf (_("The file could not be saved as “%s”."), uri); - ev_window_error_dialog (GTK_WINDOW (ev_window), msg, error); - g_free (uri); - g_free (msg); - g_error_free (error); - g_free (local_uri); +static void +file_save_dialog_response_cb (GtkWidget *fc, + gint response_id, + EvWindow *ev_window) +{ + gchar *uri; + + if (response_id != GTK_RESPONSE_OK) { gtk_widget_destroy (fc); - return; } - - if (local_uri) { - GnomeVFSURI *target_uri; - - target_uri = gnome_vfs_uri_new (uri); - if (gnome_vfs_uri_is_local (target_uri)) { - /* If target uri is local, just rename local_uri */ - if (gnome_vfs_move (local_uri, uri, TRUE) != GNOME_VFS_OK) - ev_tmp_uri_unlink (local_uri); - } else { - GnomeVFSURI *source_uri; - - source_uri = gnome_vfs_uri_new (local_uri); - ev_window_save_remote (ev_window, source_uri, target_uri); - gnome_vfs_uri_unref (source_uri); - } - - gnome_vfs_uri_unref (target_uri); - g_free (local_uri); - } + + uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc)); + + ev_window_clear_save_job (ev_window); + ev_window->priv->save_job = ev_job_save_new (ev_window->priv->document, + uri, ev_window->priv->uri); + g_signal_connect (ev_window->priv->save_job, "finished", + G_CALLBACK (ev_window_save_job_cb), + ev_window); + /* The priority doesn't matter for this job */ + ev_job_queue_add_job (ev_window->priv->save_job, EV_JOB_PRIORITY_LOW); g_free (uri); + gtk_widget_destroy (fc); } @@ -2086,7 +2026,11 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) GtkWidget *fc; gchar *base_name; gchar *file_name; +#if GLIB_CHECK_VERSION (2, 13, 3) + const gchar *folder; +#else gchar *folder; +#endif fc = gtk_file_chooser_dialog_new ( _("Save a Copy"), @@ -2102,12 +2046,20 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE); file_name = gnome_vfs_format_uri_for_display (ev_window->priv->uri); base_name = g_path_get_basename (file_name); - folder = xdg_user_dir_lookup ("DOCUMENTS"); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), base_name); + +#if GLIB_CHECK_VERSION (2, 13, 3) + folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc), + folder ? folder : g_get_home_dir ()); +#else + folder = xdg_user_dir_lookup ("DOCUMENTS"); gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc), folder); + free (folder); +#endif + g_free (file_name); g_free (base_name); - free (folder); g_signal_connect (fc, "response", G_CALLBACK (file_save_dialog_response_cb), @@ -2220,8 +2172,10 @@ ev_window_print_send (EvWindow *window, gtk_print_settings_set_collate (settings, FALSE); if (capabilities & EV_FILE_EXPORTER_CAN_REVERSE) gtk_print_settings_set_reverse (settings, FALSE); - if (capabilities & EV_FILE_EXPORTER_CAN_NUMBER_UP) + if (capabilities & EV_FILE_EXPORTER_CAN_NUMBER_UP) { gtk_print_settings_set_number_up (settings, 1); + gtk_print_settings_set_int (settings, "cups-"GTK_PRINT_SETTINGS_NUMBER_UP, 1); + } if (window->priv->print_preview) { gchar *uri; @@ -2240,6 +2194,7 @@ ev_window_print_send (EvWindow *window, gtk_window_get_screen (GTK_WINDOW (window)), NULL, EV_WINDOW_MODE_PREVIEW, + NULL, TRUE, print_settings_file, GDK_CURRENT_TIME); @@ -2370,7 +2325,17 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog, ranges = g_memdup (page_range, n_ranges * sizeof (GtkPageRange)); } break; - default: + case GTK_PRINT_PAGES_ALL: { + gint n_pages; + + n_pages = ev_page_cache_get_n_pages (ev_page_cache_get (window->priv->document)); + + ranges = g_new0 (EvPrintRange, 1); + + ranges->start = 0; + ranges->end = n_pages - 1; + n_ranges = 1; + } break; } @@ -2379,10 +2344,10 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog, scale = gtk_print_settings_get_scale (window->priv->print_settings) * 0.01; width = gtk_page_setup_get_paper_width (window->priv->print_page_setup, - GTK_UNIT_PIXEL); + GTK_UNIT_POINTS); height = gtk_page_setup_get_paper_height (window->priv->print_page_setup, - GTK_UNIT_PIXEL); - + GTK_UNIT_POINTS); + if (scale != 1.0) { width *= scale; height *= scale; @@ -2650,6 +2615,7 @@ ev_window_cmd_focus_page_selector (GtkAction *act, EvWindow *window) update_chrome_flag (window, EV_CHROME_RAISE_TOOLBAR, TRUE); ev_window_set_action_sensitive (window, "ViewToolbar", FALSE); + update_chrome_visibility (window); action = gtk_action_group_get_action (window->priv->action_group, PAGE_SELECTOR_ACTION); @@ -2740,6 +2706,7 @@ ev_window_cmd_edit_find (GtkAction *action, EvWindow *ev_window) } update_chrome_flag (ev_window, EV_CHROME_FINDBAR, TRUE); + update_chrome_visibility (ev_window); gtk_widget_grab_focus (ev_window->priv->find_bar); } @@ -2748,6 +2715,9 @@ ev_window_cmd_edit_find_next (GtkAction *action, EvWindow *ev_window) { g_return_if_fail (EV_IS_WINDOW (ev_window)); + update_chrome_flag (ev_window, EV_CHROME_FINDBAR, TRUE); + update_chrome_visibility (ev_window); + gtk_widget_grab_focus (ev_window->priv->find_bar); ev_view_find_next (EV_VIEW (ev_window->priv->view)); } @@ -2756,6 +2726,9 @@ ev_window_cmd_edit_find_previous (GtkAction *action, EvWindow *ev_window) { g_return_if_fail (EV_IS_WINDOW (ev_window)); + update_chrome_flag (ev_window, EV_CHROME_FINDBAR, TRUE); + update_chrome_visibility (ev_window); + gtk_widget_grab_focus (ev_window->priv->find_bar); ev_view_find_previous (EV_VIEW (ev_window->priv->view)); } @@ -2834,7 +2807,11 @@ ev_window_run_fullscreen (EvWindow *window) ev_view_set_fullscreen (EV_VIEW (window->priv->view), TRUE); ev_window_update_fullscreen_action (window); - update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR, TRUE); + /* If the user doesn't have the main toolbar he/she won't probably want + * the toolbar in fullscreen mode. See bug #483048 + */ + update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR, + (window->priv->chrome & EV_CHROME_TOOLBAR) != 0); update_chrome_visibility (window); gtk_window_fullscreen (GTK_WINDOW (window)); @@ -3274,7 +3251,7 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) gchar *uri; uri = g_strdup (ev_window->priv->uri); - ev_window_open_uri (ev_window, uri, NULL, 0, FALSE, NULL); + ev_window_open_uri (ev_window, uri, NULL, 0, NULL, FALSE, NULL); g_free (uri); } @@ -3306,6 +3283,8 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) if (g_file_test (uri, G_FILE_TEST_EXISTS)) { break; } + g_free (uri); + uri = NULL; } if (uri == NULL) { @@ -3479,6 +3458,7 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window) widget = gtk_window_get_focus (GTK_WINDOW (window)); if (widget && gtk_widget_get_ancestor (widget, EGG_TYPE_FIND_BAR)) { update_chrome_flag (window, EV_CHROME_FINDBAR, FALSE); + update_chrome_visibility (window); gtk_widget_grab_focus (window->priv->view); } else { gboolean fullscreen; @@ -3632,6 +3612,7 @@ ev_window_rotation_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window ev_sidebar_thumbnails_refresh (EV_SIDEBAR_THUMBNAILS (window->priv->sidebar_thumbs), rotation); + ev_window_refresh_window_thumbnail (window, rotation); } static void @@ -3757,6 +3738,7 @@ ev_window_view_toolbar_cb (GtkAction *action, EvWindow *ev_window) active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); update_chrome_flag (ev_window, EV_CHROME_TOOLBAR, active); + update_chrome_visibility (ev_window); ev_metadata_manager_set_boolean (NULL, "show_toolbar", active); } @@ -3768,6 +3750,7 @@ ev_window_view_sidebar_cb (GtkAction *action, EvWindow *ev_window) update_chrome_flag (ev_window, EV_CHROME_SIDEBAR, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))); + update_chrome_visibility (ev_window); } static void @@ -3806,9 +3789,7 @@ ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar, action = gtk_action_group_get_action (ev_window->priv->action_group, "ViewSidebar"); - if (!ev_view_get_presentation (view) && - !ev_view_get_fullscreen (view)) { - + if (!ev_view_get_presentation (view)) { gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), GTK_WIDGET_VISIBLE (ev_sidebar)); @@ -3972,6 +3953,7 @@ find_bar_close_cb (EggFindBar *find_bar, EvWindow *ev_window) { update_chrome_flag (ev_window, EV_CHROME_FINDBAR, FALSE); + update_chrome_visibility (ev_window); } static void @@ -3980,24 +3962,18 @@ find_bar_search_changed_cb (EggFindBar *find_bar, EvWindow *ev_window) { gboolean case_sensitive; - gboolean visible; const char *search_string; - /* Either the string or case sensitivity could have changed, - * we connect this callback to both. We also connect it - * to ::visible so when the find bar is hidden, we should - * pretend the search string is NULL/"" - */ + /* Either the string or case sensitivity could have changed. */ case_sensitive = egg_find_bar_get_case_sensitive (find_bar); - visible = GTK_WIDGET_VISIBLE (find_bar); search_string = egg_find_bar_get_search_string (find_bar); ev_view_search_changed (EV_VIEW(ev_window->priv->view)); if (ev_window->priv->document && EV_IS_DOCUMENT_FIND (ev_window->priv->document)) { - if (visible && search_string && search_string[0]) { + if (search_string && search_string[0]) { ev_document_doc_mutex_lock (); ev_document_find_begin (EV_DOCUMENT_FIND (ev_window->priv->document), ev_page_cache_get_current_page (ev_window->priv->page_cache), @@ -4017,6 +3993,26 @@ find_bar_search_changed_cb (EggFindBar *find_bar, } } +static void +find_bar_visibility_changed_cb (EggFindBar *find_bar, + GParamSpec *param, + EvWindow *ev_window) +{ + gboolean visible; + + visible = GTK_WIDGET_VISIBLE (find_bar); + + if (ev_window->priv->document && + EV_IS_DOCUMENT_FIND (ev_window->priv->document)) { + ev_view_set_highlight_search (EV_VIEW(ev_window->priv->view), visible); + ev_view_search_changed (EV_VIEW(ev_window->priv->view)); + ev_window_update_actions (ev_window); + + if (!visible) + egg_find_bar_set_status_text (EGG_FIND_BAR (ev_window->priv->find_bar), NULL); + } +} + static void find_bar_scroll(EggFindBar *find_bar, GtkScrollType scroll, EvWindow* ev_window) { @@ -4094,7 +4090,6 @@ ev_window_dispose (GObject *object) priv->attachment_popup_action_group = NULL; } -#ifdef HAVE_GTK_RECENT if (priv->recent_action_group) { g_object_unref (priv->recent_action_group); priv->recent_action_group = NULL; @@ -4108,12 +4103,6 @@ ev_window_dispose (GObject *object) } priv->recent_ui_id = 0; -#else - if (priv->recent_view) { - g_object_unref (priv->recent_view); - priv->recent_view = NULL; - } -#endif /* HAVE_GTK_RECENT */ if (priv->page_cache) { g_signal_handlers_disconnect_by_func (priv->page_cache, page_changed_cb, window); @@ -4139,6 +4128,10 @@ ev_window_dispose (GObject *object) ev_window_clear_load_job (window); } + if (priv->save_job) { + ev_window_clear_save_job (window); + } + if (priv->thumbnail_job) { ev_window_clear_thumbnail_job (window); } @@ -4276,11 +4269,7 @@ static const GtkActionEntry entries[] = { /* Edit menu */ { "EditCopy", GTK_STOCK_COPY, NULL, "C", NULL, G_CALLBACK (ev_window_cmd_edit_copy) }, -#ifdef HAVE_GTK_RECENT { "EditSelectAll", GTK_STOCK_SELECT_ALL, N_("Select _All"), "A", NULL, -#else - { "EditSelectAll", NULL, N_("Select _All"), "A", NULL, -#endif /* HAVE_GTK_RECENT */ G_CALLBACK (ev_window_cmd_edit_select_all) }, { "EditFind", GTK_STOCK_FIND, N_("_Find..."), "F", N_("Find a word or phrase in the document"), @@ -4402,7 +4391,7 @@ static const GtkToggleActionEntry toggle_entries[] = { { "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_("_Presentation"), "F5", + { "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, @@ -4499,6 +4488,20 @@ register_custom_actions (EvWindow *window, GtkActionGroup *group) G_CALLBACK (navigation_action_activate_link_cb), window); gtk_action_group_add_action (group, action); g_object_unref (action); + + action = g_object_new (EV_TYPE_OPEN_RECENT_ACTION, + "name", "FileOpenRecent", + "label", _("_Open..."), + "tooltip", _("Open an existing document"), + "stock_id", GTK_STOCK_OPEN, + NULL); + g_signal_connect (action, "activate", + G_CALLBACK (ev_window_cmd_file_open), window); + g_signal_connect (action, "item_activated", + G_CALLBACK (ev_window_open_recent_action_item_activated), + window); + gtk_action_group_add_action (group, action); + g_object_unref (action); } static void @@ -4577,6 +4580,8 @@ view_actions_focus_in_cb (GtkWidget *widget, GdkEventFocus *event, EvWindow *win ev_window_set_view_accels_sensitivity (window, TRUE); + update_chrome_visibility (window); + return FALSE; } @@ -4691,45 +4696,41 @@ launch_action (EvWindow *window, EvLinkAction *action) allowing to launch executables is a good idea though. -- marco */ } -static gboolean -uri_is_valid (const gchar *uri) -{ - gchar *p = (gchar *) uri; - - if (!p || !g_ascii_isalpha (*p)) - return FALSE; - - p++; - while (g_ascii_isalnum (*p)) - p++; - - return (g_ascii_strncasecmp (p, "://", strlen ("://")) == 0); -} - static void launch_external_uri (EvWindow *window, EvLinkAction *action) { const gchar *uri = ev_link_action_get_uri (action); - - if (!uri_is_valid (uri)) { - GtkWidget *dialog; + GnomeVFSResult result = gnome_vfs_url_show (uri); + GtkWidget *dialog; + gchar* message = NULL; + switch(result) { + case GNOME_VFS_OK: + break; + case GNOME_VFS_ERROR_BAD_PARAMETERS: + message = _("Invalid URI: “%s”"); + break; + case GNOME_VFS_ERROR_NOT_SUPPORTED: + message = _("Unsupported URI: “%s”"); + break; + default: + message = _("Unknown error"); + } + if(message) { dialog = gtk_message_dialog_new (GTK_WINDOW (window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Unable to open external link")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - _("Invalid URI: “%s”"), uri); + message, uri); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); gtk_widget_show (dialog); - return; } - - gnome_vfs_url_show (uri); + return; } static void @@ -4748,6 +4749,7 @@ open_remote_link (EvWindow *window, EvLinkAction *action) gtk_window_get_screen (GTK_WINDOW (window)), ev_link_action_get_dest (action), 0, + NULL, FALSE, NULL, GDK_CURRENT_TIME); @@ -5175,7 +5177,6 @@ ev_window_init (EvWindow *ev_window) g_error_free (error); } -#ifdef HAVE_GTK_RECENT #if GTK_CHECK_VERSION(2,11,4) ev_window->priv->recent_manager = gtk_recent_manager_get_default (); #else @@ -5189,8 +5190,7 @@ ev_window_init (EvWindow *ev_window) "changed", G_CALLBACK (ev_window_setup_recent), ev_window); -#endif /* HAVE_GTK_RECENT */ - + ev_window->priv->menubar = gtk_ui_manager_get_widget (ev_window->priv->ui_manager, "/MainMenu"); @@ -5198,7 +5198,6 @@ ev_window_init (EvWindow *ev_window) ev_window->priv->menubar, FALSE, FALSE, 0); - ev_window->priv->toolbar = GTK_WIDGET (g_object_new (EGG_TYPE_EDITABLE_TOOLBAR, "ui-manager", ev_window->priv->ui_manager, @@ -5380,7 +5379,7 @@ ev_window_init (EvWindow *ev_window) ev_window); g_signal_connect (ev_window->priv->find_bar, "notify::visible", - G_CALLBACK (find_bar_search_changed_cb), + G_CALLBACK (find_bar_visibility_changed_cb), ev_window); g_signal_connect (ev_window->priv->find_bar, "scroll",