X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=dd05d662d2b88ab2f871f6d8cd9c48594e8f028f;hb=7e774cfc05a9eb30c5d011ba5229d4324052e474;hp=0ec0533b94a809451975a33ecefb6ceaeb6ce4a7;hpb=e912e532fd67211aa87ac79414efb30f30a00fab;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 0ec0533b..dd05d662 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -66,15 +66,9 @@ #include "ev-history.h" #include "ev-image.h" #include "ev-message-area.h" +#include "ev-mount-operation.h" -#ifdef WITH_GNOME_PRINT -#include "ev-print-job.h" -#include -#endif - -#ifdef WITH_GTK_PRINT #include -#endif #ifdef ENABLE_PDF #include @@ -91,10 +85,6 @@ #include #include -#if !GLIB_CHECK_VERSION (2, 13, 3) -char *xdg_user_dir_lookup (char *type); -#endif - typedef enum { PAGE_MODE_DOCUMENT, PAGE_MODE_PASSWORD @@ -132,9 +122,7 @@ struct _EvWindowPrivate { /* Dialogs */ GtkWidget *properties; -#ifdef WITH_PRINT GtkWidget *print_dialog; -#endif GtkWidget *password_dialog; /* UI Builders */ @@ -178,21 +166,18 @@ struct _EvWindowPrivate { EvWindowPageMode page_mode; EvWindowTitle *title; - EvJob *load_job; - EvJob *thumbnail_job; - EvJob *save_job; -#ifdef WITH_GNOME_PRINT - GnomePrintJob *print_job; -#endif - -#ifdef WITH_GTK_PRINT + EvJob *load_job; + EvJob *thumbnail_job; + EvJob *save_job; EvJob *print_job; + + /* Printing */ gboolean print_preview; GtkPrintJob *gtk_print_job; GtkPrinter *printer; GtkPrintSettings *print_settings; GtkPageSetup *print_page_setup; -#endif + }; #define EV_WINDOW_GET_PRIVATE(object) \ @@ -213,7 +198,6 @@ struct _EvWindowPrivate { #define THUMBNAILS_SIDEBAR_ID "thumbnails" #define ATTACHMENTS_SIDEBAR_ID "attachments" -#ifdef WITH_GTK_PRINT static const gchar *document_print_settings[] = { GTK_PRINT_SETTINGS_N_COPIES, GTK_PRINT_SETTINGS_COLLATE, @@ -224,7 +208,6 @@ static const gchar *document_print_settings[] = { GTK_PRINT_SETTINGS_PAGE_RANGES, GTK_PRINT_SETTINGS_PAGE_SET }; -#endif /* WITH_GTK_PRINT */ static void ev_window_update_actions (EvWindow *ev_window); static void ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar, @@ -236,10 +219,8 @@ static void ev_window_load_job_cb (EvJobLoad *job, gpointer data); static void ev_window_set_icon_from_thumbnail (EvJobThumbnail *job, EvWindow *ev_window); -#ifdef WITH_GTK_PRINT 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, @@ -251,11 +232,13 @@ static void ev_window_zoom_changed_cb (EvView *view, static void ev_window_add_recent (EvWindow *window, const char *filename); static void ev_window_run_fullscreen (EvWindow *window); -static void ev_window_stop_fullscreen (EvWindow *window); +static void ev_window_stop_fullscreen (EvWindow *window, + gboolean unfullscreen_window); static void ev_window_cmd_view_fullscreen (GtkAction *action, EvWindow *window); static void ev_window_run_presentation (EvWindow *window); -static void ev_window_stop_presentation (EvWindow *window); +static void ev_window_stop_presentation (EvWindow *window, + gboolean unfullscreen_window); static void ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window); static void ev_window_run_preview (EvWindow *window); @@ -285,6 +268,9 @@ static void ev_window_cmd_edit_find (GtkAction *actio static void find_bar_search_changed_cb (EggFindBar *find_bar, GParamSpec *param, EvWindow *ev_window); +static void ev_window_do_preview_print (EvWindow *window); +static void ev_window_load_file_remote (EvWindow *ev_window, + GFile *source_file); G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) @@ -357,24 +343,13 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) if (gconf_client_get_bool (client, GCONF_LOCKDOWN_PRINT, NULL)) { ok_to_print = FALSE; } -#ifndef WITH_PRINT - ok_to_print = FALSE; -#endif - g_object_unref (client); + g_object_unref (client); /* File menu */ ev_window_set_action_sensitive (ev_window, "FileOpenCopy", has_document); ev_window_set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy); - -#ifdef WITH_GTK_PRINT ev_window_set_action_sensitive (ev_window, "FilePrintSetup", has_pages && ok_to_print); -#endif - -#ifdef WITH_GNOME_PRINT - ev_window_set_action_sensitive (ev_window, "FilePrintSetup", FALSE); -#endif - ev_window_set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print); ev_window_set_action_sensitive (ev_window, "FileProperties", has_document && has_properties); @@ -1100,8 +1075,6 @@ ev_window_set_icon_from_thumbnail (EvJobThumbnail *job, 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; @@ -1117,14 +1090,11 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation) &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); + ev_window->priv->thumbnail_job = ev_job_thumbnail_new (document, 0, rotation, scale); 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 @@ -1307,7 +1277,7 @@ ev_window_clear_temp_file (EvWindow *ev_window) file = g_file_new_for_uri (ev_window->priv->uri); tempdir = g_file_new_for_path (g_get_tmp_dir ()); - if (g_file_contains_file (tempdir, file)) { + if (g_file_has_prefix (file, tempdir)) { g_file_delete (file, NULL, NULL); } @@ -1445,31 +1415,111 @@ ev_window_close_dialogs (EvWindow *ev_window) gtk_widget_destroy (ev_window->priv->password_dialog); ev_window->priv->password_dialog = NULL; -#ifdef WITH_PRINT if (ev_window->priv->print_dialog) gtk_widget_destroy (ev_window->priv->print_dialog); ev_window->priv->print_dialog = NULL; -#endif - -#ifdef WITH_GNOME_PRINT - if (ev_window->priv->print_job) - g_object_unref (ev_window->priv->print_job); - ev_window->priv->print_job = NULL; -#endif if (ev_window->priv->properties) gtk_widget_destroy (ev_window->priv->properties); ev_window->priv->properties = NULL; } +static void +ev_window_load_remote_failed (EvWindow *ev_window, + GError *error) +{ + ev_view_set_loading (EV_VIEW (ev_window->priv->view), FALSE); + ev_window->priv->in_reload = FALSE; + ev_window_error_message (GTK_WINDOW (ev_window), + _("Unable to open document"), + error); + g_free (ev_window->priv->local_uri); + ev_window->priv->local_uri = NULL; +} + +static void +mount_volume_ready_cb (GFile *source, + GAsyncResult *async_result, + EvWindow *ev_window) +{ + GError *error = NULL; + + g_file_mount_enclosing_volume_finish (source, async_result, &error); + + if (error) { + ev_window_load_remote_failed (ev_window, error); + g_object_unref (source); + g_error_free (error); + } else { + /* Volume successfully mounted, + try opening the file again */ + ev_window_load_file_remote (ev_window, source); + } +} + static void window_open_file_copy_ready_cb (GFile *source, GAsyncResult *async_result, EvWindow *ev_window) { - g_file_copy_finish (source, async_result, NULL); - ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); - g_object_unref (source); + GError *error = NULL; + + g_file_copy_finish (source, async_result, &error); + if (!error) { + ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); + g_object_unref (source); + + return; + } + + if (error->domain == G_IO_ERROR && + error->code == G_IO_ERROR_NOT_MOUNTED) { + GMountOperation *operation; + + operation = ev_mount_operation_new (GTK_WINDOW (ev_window)); + g_file_mount_enclosing_volume (source, + G_MOUNT_MOUNT_NONE, + operation, NULL, + (GAsyncReadyCallback)mount_volume_ready_cb, + ev_window); + g_object_unref (operation); + } else { + ev_window_load_remote_failed (ev_window, error); + g_object_unref (source); + } + + g_error_free (error); +} + +static void +ev_window_load_file_remote (EvWindow *ev_window, + GFile *source_file) +{ + GFile *target_file; + + if (!ev_window->priv->local_uri) { + gchar *tmp_name; + gchar *base_name; + + /* We'd like to keep extension of source uri since + * it helps to resolve some mime types, say cbz */ + tmp_name = ev_tmp_filename (NULL); + base_name = g_file_get_basename (source_file); + ev_window->priv->local_uri = g_strconcat ("file:", tmp_name, "-", + base_name, NULL); + ev_job_load_set_uri (EV_JOB_LOAD (ev_window->priv->load_job), + ev_window->priv->local_uri); + g_free (base_name); + g_free (tmp_name); + } + + target_file = g_file_new_for_uri (ev_window->priv->local_uri); + g_file_copy_async (source_file, target_file, + 0, G_PRIORITY_DEFAULT, NULL, + NULL, NULL, /* no progress callback */ + (GAsyncReadyCallback) window_open_file_copy_ready_cb, + ev_window); + g_object_unref (target_file); } void @@ -1482,7 +1532,6 @@ ev_window_open_uri (EvWindow *ev_window, const gchar *print_settings) { GFile *source_file; - GFile *target_file; if (ev_window->priv->uri && g_ascii_strcasecmp (ev_window->priv->uri, uri) == 0) { @@ -1516,33 +1565,11 @@ ev_window_open_uri (EvWindow *ev_window, source_file = g_file_new_for_uri (uri); if (!g_file_is_native (source_file) && !ev_window->priv->local_uri) { - char *tmp_name; - char *base_name; - - /* We'd like to keep extension of source uri since - * it helps to resolve some mime types, say cbz */ - - tmp_name = ev_tmp_filename (NULL); - base_name = g_file_get_basename (source_file); - ev_window->priv->local_uri = g_strconcat ("file:", tmp_name, "-", base_name, NULL); - ev_job_load_set_uri (EV_JOB_LOAD (ev_window->priv->load_job), - ev_window->priv->local_uri); - g_free (base_name); - g_free (tmp_name); - - target_file = g_file_new_for_uri (ev_window->priv->local_uri); - - g_file_copy_async (source_file, target_file, - 0, G_PRIORITY_DEFAULT, NULL, - NULL, NULL, /* no progress callback */ - (GAsyncReadyCallback) window_open_file_copy_ready_cb, - ev_window); - g_object_unref (target_file); - return; + ev_window_load_file_remote (ev_window, source_file); + } else { + g_object_unref (source_file); + ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); } - - g_object_unref (source_file); - ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); } static void @@ -1595,20 +1622,11 @@ 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", @@ -2012,11 +2030,7 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) GtkWidget *fc; gchar *base_name; GFile *file; -#if GLIB_CHECK_VERSION (2, 13, 3) const gchar *folder; -#else - gchar *folder; -#endif fc = gtk_file_chooser_dialog_new ( _("Save a Copy"), @@ -2034,15 +2048,9 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) base_name = g_file_get_basename (file); 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_object_unref (file); g_free (base_name); @@ -2054,7 +2062,6 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) gtk_widget_show (fc); } -#ifdef WITH_GTK_PRINT static void ev_window_print_page_setup_done_cb (GtkPageSetup *page_setup, EvWindow *window) @@ -2067,22 +2074,18 @@ ev_window_print_page_setup_done_cb (GtkPageSetup *page_setup, g_object_unref (window->priv->print_page_setup); window->priv->print_page_setup = g_object_ref (page_setup); } -#endif /* WITH_GTK_PRINT */ static void ev_window_cmd_file_print_setup (GtkAction *action, EvWindow *ev_window) { -#ifdef WITH_GTK_PRINT gtk_print_run_page_setup_dialog_async ( GTK_WINDOW (ev_window), ev_window->priv->print_page_setup, ev_window->priv->print_settings, (GtkPageSetupDoneFunc) ev_window_print_page_setup_done_cb, ev_window); -#endif /* WITH_GTK_PRINT */ } -#ifdef WITH_GTK_PRINT static void ev_window_clear_print_job (EvWindow *window) { @@ -2282,7 +2285,8 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog, GtkPrintPages print_pages; const gchar *file_format; - if (response == GTK_RESPONSE_CANCEL) { + if (response != GTK_RESPONSE_OK && + response != GTK_RESPONSE_APPLY) { gtk_widget_destroy (GTK_WIDGET (dialog)); window->priv->print_dialog = NULL; @@ -2465,124 +2469,6 @@ ev_window_print_range (EvWindow *ev_window, int first_page, int last_page) gtk_widget_show (dialog); } -#endif /* WITH_GTK_PRINT */ - -#ifdef WITH_GNOME_PRINT -static gboolean -ev_window_print_dialog_response_cb (GtkDialog *print_dialog, - gint response, - EvWindow *ev_window) -{ - EvPrintJob *print_job; - GnomePrintConfig *config; - - if (response != GNOME_PRINT_DIALOG_RESPONSE_PRINT) { - gtk_widget_destroy (GTK_WIDGET (print_dialog)); - ev_window->priv->print_dialog = NULL; - g_object_unref (ev_window->priv->print_job); - ev_window->priv->print_job = NULL; - - return FALSE; - } - - config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (print_dialog)); - - /* FIXME: Change this when we have the first backend - * that can print more than postscript - */ - if (using_pdf_printer (config)) { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (GTK_WINDOW (print_dialog), GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, - _("Generating PDF is not supported")); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - - return FALSE; - } else if (!using_postscript_printer (config)) { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (GTK_WINDOW (print_dialog), GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, - _("Printing is not supported on this printer.")); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - _("You were trying to print to a printer using the “%s” driver. " - "This program requires a PostScript printer driver."), - gnome_print_config_get (config, (guchar *)"Settings.Engine.Backend.Driver")); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - - return FALSE; - } - - save_print_config_to_file (config); - - print_job = g_object_new (EV_TYPE_PRINT_JOB, - "gnome_print_job", ev_window->priv->print_job, - "document", ev_window->priv->document, - "print_dialog", print_dialog, - NULL); - - if (print_job != NULL) { - ev_print_job_print (print_job, GTK_WINDOW (ev_window)); - g_object_unref (print_job); - } - - g_object_unref (config); - - gtk_widget_destroy (GTK_WIDGET (print_dialog)); - ev_window->priv->print_dialog = NULL; - g_object_unref (ev_window->priv->print_job); - ev_window->priv->print_job = NULL; - - return FALSE; -} - -void -ev_window_print_range (EvWindow *ev_window, int first_page, int last_page) -{ - GnomePrintConfig *config; - gchar *pages_label; - - g_return_if_fail (EV_IS_WINDOW (ev_window)); - g_return_if_fail (ev_window->priv->document != NULL); - - config = load_print_config_from_file (); - - if (ev_window->priv->print_job == NULL) - ev_window->priv->print_job = gnome_print_job_new (config); - - if (ev_window->priv->print_dialog == NULL) { - ev_window->priv->print_dialog = - gnome_print_dialog_new (ev_window->priv->print_job, - (guchar *) _("Print"), - (GNOME_PRINT_DIALOG_RANGE | - GNOME_PRINT_DIALOG_COPIES)); - } - - gtk_window_set_transient_for (GTK_WINDOW (ev_window->priv->print_dialog), - GTK_WINDOW (ev_window)); - g_object_unref (config); - - pages_label = g_strconcat (_("Pages"), " ", NULL); - gnome_print_dialog_construct_range_page (GNOME_PRINT_DIALOG (ev_window->priv->print_dialog), - GNOME_PRINT_RANGE_ALL | - GNOME_PRINT_RANGE_RANGE, - first_page, last_page, - NULL, (const guchar *)pages_label); - g_free (pages_label); - - gtk_dialog_set_response_sensitive (GTK_DIALOG (ev_window->priv->print_dialog), - GNOME_PRINT_DIALOG_RESPONSE_PREVIEW, - FALSE); - - g_signal_connect (G_OBJECT (ev_window->priv->print_dialog), "response", - G_CALLBACK (ev_window_print_dialog_response_cb), - ev_window); - gtk_widget_show (ev_window->priv->print_dialog); -} -#endif /* WITH_GNOME_PRINT */ static void ev_window_print (EvWindow *window) @@ -2593,9 +2479,7 @@ ev_window_print (EvWindow *window) page_cache = ev_page_cache_get (window->priv->document); last_page = ev_page_cache_get_n_pages (page_cache); -#ifdef WITH_PRINT ev_window_print_range (window, 1, last_page); -#endif } static void @@ -2661,7 +2545,7 @@ ev_window_cmd_continuous (GtkAction *action, EvWindow *ev_window) { gboolean continuous; - ev_window_stop_presentation (ev_window); + ev_window_stop_presentation (ev_window, TRUE); continuous = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); g_object_set (G_OBJECT (ev_window->priv->view), "continuous", continuous, @@ -2674,7 +2558,7 @@ ev_window_cmd_dual (GtkAction *action, EvWindow *ev_window) { gboolean dual_page; - ev_window_stop_presentation (ev_window); + ev_window_stop_presentation (ev_window, TRUE); dual_page = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); g_object_set (G_OBJECT (ev_window->priv->view), "dual-page", dual_page, @@ -2685,7 +2569,7 @@ ev_window_cmd_dual (GtkAction *action, EvWindow *ev_window) static void ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window) { - ev_window_stop_presentation (ev_window); + ev_window_stop_presentation (ev_window, TRUE); if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) { ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_BEST_FIT); @@ -2698,7 +2582,7 @@ ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window) static void ev_window_cmd_view_page_width (GtkAction *action, EvWindow *ev_window) { - ev_window_stop_presentation (ev_window); + ev_window_stop_presentation (ev_window, TRUE); if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) { ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FIT_WIDTH); @@ -2827,6 +2711,12 @@ fullscreen_toolbar_remove_shadow (GtkWidget *toolbar) static void ev_window_run_fullscreen (EvWindow *window) { + EvView *view = EV_VIEW (window->priv->view); + gboolean fullscreen_window = TRUE; + + if (ev_view_get_fullscreen (view)) + return; + if (!window->priv->fullscreen_toolbar) { window->priv->fullscreen_toolbar = gtk_ui_manager_get_widget (window->priv->ui_manager, @@ -2844,11 +2734,16 @@ ev_window_run_fullscreen (EvWindow *window) window->priv->fullscreen_toolbar, 1); } + if (ev_view_get_presentation (view)) { + ev_window_stop_presentation (window, FALSE); + fullscreen_window = FALSE; + } + g_object_set (G_OBJECT (window->priv->scrolled_window), "shadow-type", GTK_SHADOW_NONE, NULL); - ev_view_set_fullscreen (EV_VIEW (window->priv->view), TRUE); + ev_view_set_fullscreen (view, TRUE); ev_window_update_fullscreen_action (window); /* If the user doesn't have the main toolbar he/she won't probably want @@ -2857,8 +2752,9 @@ ev_window_run_fullscreen (EvWindow *window) 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)); + + if (fullscreen_window) + gtk_window_fullscreen (GTK_WINDOW (window)); gtk_widget_grab_focus (window->priv->view); if (!ev_window_is_empty (window)) @@ -2866,11 +2762,12 @@ ev_window_run_fullscreen (EvWindow *window) } static void -ev_window_stop_fullscreen (EvWindow *window) +ev_window_stop_fullscreen (EvWindow *window, + gboolean unfullscreen_window) { EvView *view = EV_VIEW (window->priv->view); - if (!ev_view_get_fullscreen (EV_VIEW (view))) + if (!ev_view_get_fullscreen (view)) return; g_object_set (G_OBJECT (window->priv->scrolled_window), @@ -2881,7 +2778,8 @@ ev_window_stop_fullscreen (EvWindow *window) ev_window_update_fullscreen_action (window); update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR, FALSE); update_chrome_visibility (window); - gtk_window_unfullscreen (GTK_WINDOW (window)); + if (unfullscreen_window) + gtk_window_unfullscreen (GTK_WINDOW (window)); if (!ev_window_is_empty (window)) ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE); @@ -2892,14 +2790,11 @@ ev_window_cmd_view_fullscreen (GtkAction *action, EvWindow *window) { gboolean fullscreen; - g_return_if_fail (EV_IS_WINDOW (window)); - ev_window_stop_presentation (window); - fullscreen = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); if (fullscreen) { ev_window_run_fullscreen (window); } else { - ev_window_stop_fullscreen (window); + ev_window_stop_fullscreen (window, TRUE); } } @@ -2924,15 +2819,9 @@ presentation_set_timeout (EvWindow *window) g_source_remove (window->priv->presentation_timeout_id); } -#if GLIB_CHECK_VERSION (2, 13, 0) window->priv->presentation_timeout_id = g_timeout_add_seconds (PRESENTATION_TIMEOUT, (GSourceFunc)presentation_timeout_cb, window); -#else - window->priv->presentation_timeout_id = - g_timeout_add (PRESENTATION_TIMEOUT * 1000, - (GSourceFunc)presentation_timeout_cb, window); -#endif ev_view_show_cursor (EV_VIEW (window->priv->view)); } @@ -2990,17 +2879,29 @@ ev_window_update_presentation_action (EvWindow *window) static void ev_window_run_presentation (EvWindow *window) { + EvView *view = EV_VIEW (window->priv->view); + gboolean fullscreen_window = TRUE; + + if (ev_view_get_presentation (view)) + return; + + if (ev_view_get_fullscreen (view)) { + ev_window_stop_fullscreen (window, FALSE); + fullscreen_window = FALSE; + } + g_object_set (G_OBJECT (window->priv->scrolled_window), "shadow-type", GTK_SHADOW_NONE, NULL); - ev_view_set_presentation (EV_VIEW (window->priv->view), TRUE); + ev_view_set_presentation (view, TRUE); ev_window_update_presentation_action (window); update_chrome_visibility (window); gtk_widget_grab_focus (window->priv->view); - gtk_window_fullscreen (GTK_WINDOW (window)); + if (fullscreen_window) + gtk_window_fullscreen (GTK_WINDOW (window)); g_signal_connect (window->priv->view, "motion-notify-event", @@ -3019,9 +2920,12 @@ ev_window_run_presentation (EvWindow *window) } static void -ev_window_stop_presentation (EvWindow *window) +ev_window_stop_presentation (EvWindow *window, + gboolean unfullscreen_window) { - if (!ev_view_get_presentation (EV_VIEW (window->priv->view))) + EvView *view = EV_VIEW (window->priv->view); + + if (!ev_view_get_presentation (view)) return; g_object_set (G_OBJECT (window->priv->scrolled_window), @@ -3031,7 +2935,8 @@ ev_window_stop_presentation (EvWindow *window) ev_view_set_presentation (EV_VIEW (window->priv->view), FALSE); ev_window_update_presentation_action (window); update_chrome_visibility (window); - gtk_window_unfullscreen (GTK_WINDOW (window)); + if (unfullscreen_window) + gtk_window_unfullscreen (GTK_WINDOW (window)); g_signal_handlers_disconnect_by_func (window->priv->view, (gpointer) presentation_motion_notify_cb, @@ -3052,14 +2957,11 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window) { gboolean presentation; - g_return_if_fail (EV_IS_WINDOW (window)); - ev_window_stop_fullscreen (window); - presentation = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); if (presentation) { ev_window_run_presentation (window); } else { - ev_window_stop_presentation (window); + ev_window_stop_presentation (window, TRUE); } } @@ -3302,7 +3204,7 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) static void ev_window_cmd_view_autoscroll (GtkAction *action, EvWindow *ev_window) { - ev_view_autoscroll (EV_VIEW (ev_window->priv->view)); + ev_view_autoscroll_start (EV_VIEW (ev_window->priv->view)); } static void @@ -3357,19 +3259,15 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) static void ev_window_cmd_leave_fullscreen (GtkAction *action, EvWindow *window) { - ev_window_stop_fullscreen (window); + ev_window_stop_fullscreen (window, TRUE); } static void ev_window_cmd_start_presentation (GtkAction *action, EvWindow *window) { - ev_window_stop_fullscreen (window); ev_window_run_presentation (window); } -#ifdef WITH_GTK_PRINT -static void ev_window_do_preview_print (EvWindow *window); - static gboolean ev_window_enumerate_printer_cb (GtkPrinter *printer, EvWindow *window) @@ -3461,12 +3359,9 @@ ev_window_do_preview_print (EvWindow *window) gtk_widget_hide (GTK_WIDGET (window)); } -#endif /* WITH_GTK_PRINT */ - static void ev_window_cmd_preview_print (GtkAction *action, EvWindow *window) { -#ifdef WITH_GTK_PRINT EvWindowPrivate *priv = window->priv; GtkPrintSettings *print_settings = NULL; #if GTK_CHECK_VERSION (2, 11, 0) @@ -3497,7 +3392,6 @@ ev_window_cmd_preview_print (GtkAction *action, EvWindow *window) gtk_enumerate_printers ((GtkPrinterFunc) ev_window_enumerate_printer_cb, window, NULL, FALSE); -#endif /* WITH_GTK_PRINT */ } static void @@ -3505,6 +3399,8 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window) { GtkWidget *widget; + ev_view_autoscroll_stop (EV_VIEW (window->priv->view)); + 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); @@ -3520,9 +3416,9 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window) NULL); if (fullscreen) { - ev_window_stop_fullscreen (window); + ev_window_stop_fullscreen (window, TRUE); } else if (presentation) { - ev_window_stop_presentation (window); + ev_window_stop_presentation (window, TRUE); gtk_widget_grab_focus (window->priv->view); } else { gtk_widget_grab_focus (window->priv->view); @@ -4002,6 +3898,7 @@ static void find_bar_close_cb (EggFindBar *find_bar, EvWindow *ev_window) { + ev_view_find_cancel (EV_VIEW (ev_window->priv->view)); update_chrome_flag (ev_window, EV_CHROME_FINDBAR, FALSE); update_chrome_visibility (ev_window); } @@ -4192,8 +4089,6 @@ ev_window_dispose (GObject *object) } ev_window_close_dialogs (window); - -#ifdef WITH_GTK_PRINT ev_window_clear_print_job (window); if (window->priv->gtk_print_job) { @@ -4215,7 +4110,6 @@ ev_window_dispose (GObject *object) g_object_unref (window->priv->print_page_setup); window->priv->print_page_setup = NULL; } -#endif if (priv->link) { g_object_unref (priv->link); @@ -4424,6 +4318,8 @@ static const GtkActionEntry entries[] = { G_CALLBACK (ev_window_cmd_view_zoom_in) }, { "CtrlKpMinus", GTK_STOCK_ZOOM_OUT, NULL, "KP_Subtract", NULL, G_CALLBACK (ev_window_cmd_view_zoom_out) }, + { "CtrlInsert", GTK_STOCK_COPY, NULL, "Insert", NULL, + G_CALLBACK (ev_window_cmd_edit_copy) }, }; /* Toggle items */ @@ -4771,29 +4667,11 @@ static void launch_external_uri (EvWindow *window, EvLinkAction *action) { const gchar *uri = ev_link_action_get_uri (action); - const char *content_type; - GFile *file; - GFileInfo *file_info; - GAppInfo *app; - GList *file_list = NULL; GError *error = NULL; + gboolean ret; - file = g_file_new_for_uri (uri); - file_info = g_file_query_info (file, - G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, - 0, NULL, NULL); - if (file_info == NULL) { - g_object_unref (file); - return; - } - - content_type = g_file_info_get_content_type (file_info); - app = g_app_info_get_default_for_type (content_type, TRUE); - g_object_unref (file_info); - - file_list = g_list_append (file_list, file); - - if (!g_app_info_launch (app, file_list, NULL, &error)) { + ret = g_app_info_launch_default_for_uri (uri, NULL, &error); + if (ret == FALSE) { GtkWidget *dialog; dialog = gtk_message_dialog_new (GTK_WINDOW (window), @@ -4807,11 +4685,8 @@ launch_external_uri (EvWindow *window, EvLinkAction *action) G_CALLBACK (gtk_widget_destroy), NULL); gtk_widget_show (dialog); + g_error_free(error); } - - g_object_unref (app); - g_object_unref (file); - g_list_free (file_list); } static void @@ -4922,19 +4797,14 @@ ev_view_popup_cmd_open_link_new_window (GtkAction *action, EvWindow *window) static void ev_view_popup_cmd_copy_link_address (GtkAction *action, EvWindow *window) { - GtkClipboard *clipboard; EvLinkAction *ev_action; - const gchar *uri; ev_action = ev_link_get_action (window->priv->link); if (!ev_action) return; - uri = ev_link_action_get_uri (ev_action); - - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (window), - GDK_SELECTION_CLIPBOARD); - gtk_clipboard_set_text (clipboard, uri, -1); + ev_view_copy_link_address (EV_VIEW (window->priv->view), + ev_action); } @@ -4948,7 +4818,6 @@ image_save_dialog_response_cb (GtkWidget *fc, GError *error = NULL; GdkPixbuf *pixbuf; gchar *uri; - gchar *uri_extension; gchar **extensions; gchar *filename; gchar *file_format; @@ -4979,27 +4848,31 @@ image_save_dialog_response_cb (GtkWidget *fc, } extensions = gdk_pixbuf_format_get_extensions (format); - uri_extension = g_strconcat (uri, ".", extensions[0], NULL); + if (g_str_has_suffix(uri, extensions[0])) { + gchar *uri_extension; + + uri_extension = g_strconcat (uri, ".", extensions[0], NULL); + target_file = g_file_new_for_uri (uri_extension); + g_free (uri_extension); + } else { + target_file = g_file_new_for_uri (uri); + } g_strfreev(extensions); - file_format = gdk_pixbuf_format_get_name (format); + g_free (uri); - target_file = g_file_new_for_uri (uri_extension); is_native = g_file_is_native (target_file); - if (is_native) { filename = g_file_get_path (target_file); } else { filename = ev_tmp_filename ("saveimage"); } - - g_free (uri); - g_free (uri_extension); ev_document_doc_mutex_lock (); pixbuf = ev_document_images_get_image (EV_DOCUMENT_IMAGES (ev_window->priv->document), ev_window->priv->image); ev_document_doc_mutex_unlock (); - + + file_format = gdk_pixbuf_format_get_name (format); gdk_pixbuf_save (pixbuf, filename, file_format, &error, NULL); g_free (file_format); g_object_unref (pixbuf);