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=bc7d1513f2b922573d8e4adb863c1e37216aa1be;hb=6821de696db5b2d3225015b01d428ba8a0302960;hp=455c6a59a1fbe97f869fc132c4a5bf109a748d11;hpb=0d3ecd2dee49b48a8c2ccf7b59de516987fb3d7f;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 455c6a59..bc7d1513 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -38,11 +38,8 @@ #include #include #include -#if GTK_CHECK_VERSION (2, 14, 0) #include -#else -#include -#endif + #ifdef WITH_GCONF #include #endif @@ -73,7 +70,6 @@ #include "ev-jobs.h" #include "ev-message-area.h" #include "ev-metadata-manager.h" -#include "ev-mount-operation.h" #include "ev-navigation-action.h" #include "ev-open-recent-action.h" #include "ev-page-action.h" @@ -115,7 +111,6 @@ typedef enum { EV_CHROME_RAISE_TOOLBAR = 1 << 3, EV_CHROME_FULLSCREEN_TOOLBAR = 1 << 4, EV_CHROME_SIDEBAR = 1 << 5, - EV_CHROME_PREVIEW_TOOLBAR = 1 << 6, EV_CHROME_NORMAL = EV_CHROME_MENUBAR | EV_CHROME_TOOLBAR | EV_CHROME_SIDEBAR } EvChrome; @@ -168,10 +163,6 @@ struct _EvWindowPrivate { /* Presentation mode */ guint presentation_timeout_id; - /* Preview mode */ - GtkWidget *preview_toolbar; - gchar *print_settings_file; - /* Popup view */ GtkWidget *view_popup; EvLink *link; @@ -185,7 +176,6 @@ struct _EvWindowPrivate { char *uri; glong uri_mtime; char *local_uri; - gboolean unlink_temp_file; gboolean in_reload; EvFileMonitor *monitor; guint setup_document_idle; @@ -279,7 +269,6 @@ static void ev_window_stop_presentation (EvWindow *windo gboolean unfullscreen_window); static void ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window); -static void ev_window_run_preview (EvWindow *window); static void ev_view_popup_cmd_open_link (GtkAction *action, EvWindow *window); static void ev_view_popup_cmd_open_link_new_window (GtkAction *action, @@ -307,7 +296,6 @@ 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); static void ev_window_media_player_key_pressed (EvWindow *window, @@ -396,7 +384,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) /* 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); - ev_window_set_action_sensitive (ev_window, "FilePrintSetup", has_pages && ok_to_print); + ev_window_set_action_sensitive (ev_window, "FilePageSetup", has_pages && ok_to_print); 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); @@ -419,7 +407,6 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) ev_window_set_action_sensitive (ev_window, PAGE_SELECTOR_ACTION, has_pages); ev_window_set_action_sensitive (ev_window, ZOOM_CONTROL_ACTION, has_pages); ev_window_set_action_sensitive (ev_window, NAVIGATION_ACTION, FALSE); - ev_window_set_action_sensitive (ev_window, "PreviewPrint", has_pages && ok_to_print); ev_window_update_actions (ev_window); } @@ -449,6 +436,8 @@ ev_window_update_actions (EvWindow *ev_window) has_pages && can_find_in_page); ev_window_set_action_sensitive (ev_window, "EditFindPrevious", has_pages && can_find_in_page); + ev_window_set_action_sensitive (ev_window, "F3", + has_pages && can_find_in_page); presentation_mode = ev_view_get_presentation (view); @@ -536,7 +525,6 @@ update_chrome_visibility (EvWindow *window) EvWindowPrivate *priv = window->priv; gboolean menubar, toolbar, findbar, fullscreen_toolbar, sidebar; gboolean fullscreen_mode, presentation, fullscreen; - gboolean preview_toolbar; presentation = ev_view_get_presentation (EV_VIEW (priv->view)); fullscreen = ev_view_get_fullscreen (EV_VIEW (priv->view)); @@ -549,16 +537,12 @@ update_chrome_visibility (EvWindow *window) (priv->chrome & EV_CHROME_RAISE_TOOLBAR) != 0) && fullscreen; findbar = (priv->chrome & EV_CHROME_FINDBAR) != 0; sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && !presentation; - preview_toolbar = (priv->chrome& EV_CHROME_PREVIEW_TOOLBAR); set_widget_visibility (priv->menubar, menubar); set_widget_visibility (priv->toolbar, toolbar); set_widget_visibility (priv->find_bar, findbar); set_widget_visibility (priv->sidebar, sidebar); - if (priv->preview_toolbar) - set_widget_visibility (priv->preview_toolbar, preview_toolbar); - ev_window_set_action_sensitive (window, "EditToolbar", toolbar); gtk_widget_set_sensitive (priv->menubar, menubar); @@ -1008,10 +992,12 @@ setup_document_from_metadata (EvWindow *window) request_width = MIN (request_width, gdk_screen_get_width (screen)); request_height = MIN (request_width, gdk_screen_get_height (screen)); } - - gtk_window_resize (GTK_WINDOW (window), - request_width, - request_height); + + if (request_width > 0 && request_height > 0) { + gtk_window_resize (GTK_WINDOW (window), + request_width, + request_height); + } g_value_unset (&width_ratio); g_value_unset (&height_ratio); } @@ -1173,7 +1159,8 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation) EvDocument *document = ev_window->priv->document; if (!EV_IS_DOCUMENT_THUMBNAILS (document) || - ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) { + ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0 || + ev_page_cache_check_dimensions (ev_window->priv->page_cache)) { return; } @@ -1260,15 +1247,19 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document) ev_window->priv->dest = NULL; } - if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) { - ev_view_set_document (view, document); - } else { + if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) { ev_window_warning_message (ev_window, "%s", _("The document contains no pages")); + } else if (ev_page_cache_check_dimensions (ev_window->priv->page_cache)) { + ev_window_warning_message (ev_window, "%s", + _("The document contains only empty pages")); + } else { + ev_view_set_document (view, document); } if (ev_window->priv->setup_document_idle > 0) g_source_remove (ev_window->priv->setup_document_idle); + ev_window->priv->setup_document_idle = g_idle_add ((GSourceFunc)ev_window_setup_document, ev_window); } @@ -1328,17 +1319,7 @@ ev_window_clear_local_uri (EvWindow *ev_window) } static void -ev_window_clear_print_settings_file (EvWindow *ev_window) -{ - if (ev_window->priv->print_settings_file) { - g_unlink (ev_window->priv->print_settings_file); - g_free (ev_window->priv->print_settings_file); - ev_window->priv->print_settings_file = NULL; - } -} - -static void -ev_window_clear_temp_file (EvWindow *ev_window) +ev_window_clear_temp_symlink (EvWindow *ev_window) { GFile *file, *tempdir; @@ -1346,10 +1327,24 @@ ev_window_clear_temp_file (EvWindow *ev_window) return; file = g_file_new_for_uri (ev_window->priv->uri); - tempdir = g_file_new_for_path (g_get_tmp_dir ()); + tempdir = g_file_new_for_path (ev_tmp_dir ()); if (g_file_has_prefix (file, tempdir)) { - g_file_delete (file, NULL, NULL); + GFileInfo *file_info; + GError *error = NULL; + + file_info = g_file_query_info (file, + G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, + NULL, &error); + if (file_info) { + if (g_file_info_get_is_symlink (file_info)) + g_file_delete (file, NULL, NULL); + g_object_unref (file_info); + } else { + g_warning ("Error deleting temp symlink: %s\n", error->message); + g_error_free (error); + } } g_object_unref (file); @@ -1381,14 +1376,9 @@ ev_window_load_job_cb (EvJob *job, ev_window_set_document (ev_window, document); setup_document_from_metadata (ev_window); - - if (ev_window->priv->window_mode != EV_WINDOW_MODE_PREVIEW) { - setup_view_from_metadata (ev_window); - } + setup_view_from_metadata (ev_window); - if (!ev_window->priv->unlink_temp_file) { - ev_window_add_recent (ev_window, ev_window->priv->uri); - } + ev_window_add_recent (ev_window, ev_window->priv->uri); ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_DOCUMENT); @@ -1425,9 +1415,6 @@ ev_window_load_job_cb (EvJob *job, case EV_WINDOW_MODE_PRESENTATION: ev_window_run_presentation (ev_window); break; - case EV_WINDOW_MODE_PREVIEW: - ev_window_run_preview (ev_window); - break; default: break; } @@ -1606,12 +1593,15 @@ show_loading_progress (EvWindow *ev_window) { GtkWidget *area; gchar *text; + gchar *display_name; if (ev_window->priv->message_area) return FALSE; - - text = g_strdup_printf (_("Loading document from %s"), - ev_window->priv->uri); + + display_name = escape_uri_for_display (ev_window->priv->uri); + text = g_strdup_printf (_("Loading document from “%s”"), + display_name); + area = ev_progress_message_area_new (GTK_STOCK_OPEN, text, GTK_STOCK_CLOSE, @@ -1624,7 +1614,9 @@ show_loading_progress (EvWindow *ev_window) ev_window); gtk_widget_show (area); ev_window_set_message_area (ev_window, area); + g_free (text); + g_free (display_name); return FALSE; } @@ -1707,22 +1699,19 @@ window_open_file_copy_ready_cb (GFile *source, return; } - if (error->domain == G_IO_ERROR && - error->code == G_IO_ERROR_NOT_MOUNTED) { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) { GMountOperation *operation; - operation = ev_mount_operation_new (GTK_WINDOW (ev_window)); + operation = gtk_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 if (error->domain == G_IO_ERROR && - error->code == G_IO_ERROR_CANCELLED) { + } else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { ev_window_clear_load_job (ev_window); ev_window_clear_local_uri (ev_window); - ev_window_clear_print_settings_file (ev_window); g_free (ev_window->priv->uri); ev_window->priv->uri = NULL; g_object_unref (source); @@ -1802,9 +1791,7 @@ 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) + const gchar *search_string) { GFile *source_file; @@ -1824,17 +1811,10 @@ ev_window_open_uri (EvWindow *ev_window, ev_window_close_dialogs (ev_window); ev_window_clear_load_job (ev_window); ev_window_clear_local_uri (ev_window); - ev_window_clear_print_settings_file (ev_window); ev_view_set_loading (EV_VIEW (ev_window->priv->view), TRUE); - ev_window->priv->unlink_temp_file = unlink_temp_file; ev_window->priv->window_mode = mode; - if (mode == EV_WINDOW_MODE_PREVIEW) { - ev_window->priv->print_settings_file = print_settings ? - g_strdup (print_settings) : NULL; - } - if (ev_window->priv->uri) g_free (ev_window->priv->uri); ev_window->priv->uri = g_strdup (uri); @@ -1917,8 +1897,7 @@ reload_remote_copy_ready_cb (GFile *remote, g_file_copy_finish (remote, async_result, &error); if (error) { - if (error->domain != G_IO_ERROR || - error->code != G_IO_ERROR_CANCELLED) + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ev_window_error_message (ev_window, error, "%s", _("Failed to reload document.")); g_error_free (error); @@ -2104,10 +2083,11 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window) static gchar * ev_window_create_tmp_symlink (const gchar *filename, GError **error) { - gchar *tmp_filename = NULL; - gchar *name; - gint res; - guint i = 0; + gchar *tmp_filename = NULL; + gchar *name; + guint i = 0; + GError *link_error = NULL; + GFile *tmp_file = NULL; name = g_path_get_basename (filename); @@ -2116,29 +2096,32 @@ ev_window_create_tmp_symlink (const gchar *filename, GError **error) if (tmp_filename) g_free (tmp_filename); + if (tmp_file) + g_object_unref (tmp_file); + g_clear_error (&link_error); basename = g_strdup_printf ("%s-%d", name, i++); tmp_filename = g_build_filename (ev_tmp_dir (), basename, NULL); g_free (basename); - } while ((res = symlink (filename, tmp_filename)) != 0 && errno == EEXIST); - - g_free (name); + tmp_file = g_file_new_for_path (tmp_filename); + } while (!g_file_make_symbolic_link (tmp_file, filename, NULL, &link_error) && + g_error_matches (link_error, G_IO_ERROR, G_IO_ERROR_EXISTS)); - if (res != 0 && errno != EEXIST) { - if (error) { - *error = g_error_new (G_FILE_ERROR, - g_file_error_from_errno (errno), - _("Couldn't create symlink “%s”: %s"), - tmp_filename, strerror (errno)); - } + g_free (name); + g_object_unref (tmp_file); + if (link_error) { + g_propagate_prefixed_error (error, + link_error, + _("Couldn't create symlink “%s”: "), + tmp_filename); g_free (tmp_filename); - + return NULL; } - + return tmp_filename; } @@ -2178,8 +2161,6 @@ ev_window_cmd_file_open_copy_at_dest (EvWindow *window, EvLinkDest *dest) dest, 0, NULL, - TRUE, - NULL, GDK_CURRENT_TIME); g_free (symlink_uri); } @@ -2213,8 +2194,7 @@ 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, NULL, FALSE, NULL, - GDK_CURRENT_TIME); + NULL, 0, NULL, GDK_CURRENT_TIME); } static void @@ -2224,8 +2204,7 @@ ev_window_open_recent_action_item_activated (EvOpenRecentAction *action, { ev_application_open_uri_at_dest (EV_APP, uri, gtk_window_get_screen (GTK_WINDOW (window)), - NULL, 0, NULL, FALSE, NULL, - GDK_CURRENT_TIME); + NULL, 0, NULL, GDK_CURRENT_TIME); } static void @@ -2444,8 +2423,7 @@ window_save_file_copy_ready_cb (GFile *src, return; } - if (error->domain != G_IO_ERROR || - error->code != G_IO_ERROR_CANCELLED) { + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { gchar *name; name = g_file_get_basename (dst); @@ -2601,6 +2579,10 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) ev_document_factory_add_filters (fc, ev_window->priv->document); gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (fc), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (fc), FALSE); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE); @@ -3133,6 +3115,11 @@ ev_window_cmd_file_close_window (GtkAction *action, EvWindow *ev_window) 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 (print_jobs_confirmation_dialog_response), @@ -3589,38 +3576,6 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window) } } -static void -ev_window_run_preview (EvWindow *window) -{ - GtkAction *action; - - if (!window->priv->preview_toolbar) { - window->priv->preview_toolbar = - gtk_ui_manager_get_widget (window->priv->ui_manager, - "/PreviewToolbar"); - - gtk_box_pack_start (GTK_BOX (window->priv->main_box), - window->priv->preview_toolbar, - FALSE, FALSE, 0); - gtk_box_reorder_child (GTK_BOX (window->priv->main_box), - window->priv->preview_toolbar, 1); - } - - ev_view_set_continuous (EV_VIEW (window->priv->view), FALSE); - - update_chrome_flag (window, EV_CHROME_TOOLBAR, FALSE); - update_chrome_flag (window, EV_CHROME_MENUBAR, FALSE); - update_chrome_flag (window, EV_CHROME_SIDEBAR, FALSE); - - update_chrome_flag (window, EV_CHROME_PREVIEW_TOOLBAR, TRUE); - - action = gtk_action_group_get_action (window->priv->action_group, - "PreviewPrint"); - gtk_action_set_visible (action, TRUE); - - update_chrome_visibility (window); -} - static void ev_window_screen_changed (GtkWidget *widget, GdkScreen *old_screen) @@ -3852,7 +3807,6 @@ ev_window_cmd_view_autoscroll (GtkAction *action, EvWindow *ev_window) ev_view_autoscroll_start (EV_VIEW (ev_window->priv->view)); } -#if GTK_CHECK_VERSION (2, 14, 0) static void ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) { @@ -3868,56 +3822,6 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) g_error_free (error); } } -#else /* !GTK_CHECK_VERSION (2, 14, 0) */ -static void -ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) -{ - GError *error = NULL; - GdkScreen *screen; - char *command; - const char *lang; - char *uri = NULL; - - int i; - - const char * const * langs = g_get_language_names (); - - for (i = 0; langs[i]; i++) { - lang = langs[i]; - if (strchr (lang, '.')) { - continue; - } - - uri = g_build_filename(GNOMEDATADIR, - "/gnome/help/" PACKAGE, - lang, - "/evince.xml", - NULL); - - if (g_file_test (uri, G_FILE_TEST_EXISTS)) { - break; - } - g_free (uri); - uri = NULL; - } - - if (uri == NULL) { - g_warning ("Cannot find help"); - return; - } - - command = g_strconcat ("gnome-help ghelp://", uri, NULL); - g_free (uri); - - screen = gtk_widget_get_screen (GTK_WIDGET (ev_window)); - gdk_spawn_command_line_on_screen (screen, command, &error); - if (error != NULL) { - g_warning ("%s", error->message); - g_error_free (error); - } - g_free (command); -} -#endif /* GTK_CHECK_VERSION (2, 14, 0) */ static void ev_window_cmd_leave_fullscreen (GtkAction *action, EvWindow *window) @@ -3931,137 +3835,6 @@ ev_window_cmd_start_presentation (GtkAction *action, EvWindow *window) ev_window_run_presentation (window); } -static gboolean -ev_window_enumerate_printer_cb (GtkPrinter *printer, - EvWindow *window) -{ - EvWindowPrivate *priv = window->priv; - const gchar *printer_name; - - printer_name = gtk_print_settings_get_printer (priv->print_settings); - if ((printer_name - && strcmp (printer_name, gtk_printer_get_name (printer)) == 0) || - (!printer_name && gtk_printer_is_default (printer))) { - if (priv->printer) - g_object_unref (priv->printer); - priv->printer = g_object_ref (printer); - - /* Now that we have the printer, we'll start the print */ - ev_window_do_preview_print (window); - - return TRUE; /* we're done */ - } - - return FALSE; /* continue the enumeration */ -} - -static void -ev_window_preview_print_finished (GtkPrintJob *print_job, - EvWindow *window, - GError *error) -{ - if (error) { - ev_window_error_message (window, error, - "%s", _("Failed to print document")); - } - - g_object_unref (print_job); - gtk_widget_destroy (GTK_WIDGET (window)); -} - -static void -ev_window_do_preview_print (EvWindow *window) -{ - EvWindowPrivate *priv = window->priv; - GtkPrintJob *job; - gchar *filename; - GError *error = NULL; - - g_assert (priv->print_settings != NULL); - g_assert (priv->printer != NULL); - - job = gtk_print_job_new (gtk_window_get_title (GTK_WINDOW (window)), - priv->printer, - priv->print_settings, - priv->print_page_setup); - - g_object_unref (priv->print_settings); - priv->print_settings = NULL; - g_object_unref (priv->print_page_setup); - priv->print_page_setup = NULL; - g_object_unref (priv->printer); - priv->printer = NULL; - - filename = g_filename_from_uri (priv->local_uri ? - priv->local_uri : priv->uri, - NULL, NULL); - - if (gtk_print_job_set_source_file (job, filename, &error)) { - gtk_print_job_send (job, - (GtkPrintJobCompleteFunc)ev_window_preview_print_finished, - window, NULL); - } else { - g_warning ("%s", error->message); - g_error_free (error); - } - - g_free (filename); - - gtk_widget_hide (GTK_WIDGET (window)); -} - -static void -ev_window_cmd_preview_print (GtkAction *action, EvWindow *window) -{ - EvWindowPrivate *priv = window->priv; - GtkPrintSettings *print_settings; - GtkPageSetup *page_setup; - const gchar *print_settings_file = priv->print_settings_file; - - if (print_settings_file && g_file_test (print_settings_file, G_FILE_TEST_IS_REGULAR)) { - GKeyFile *key_file; - GError *error = NULL; - - key_file = g_key_file_new (); - g_key_file_load_from_file (key_file, - print_settings_file, - G_KEY_FILE_KEEP_COMMENTS | - G_KEY_FILE_KEEP_TRANSLATIONS, - &error); - if (!error) { - print_settings = - gtk_print_settings_new_from_key_file (key_file, - "Print Settings", - NULL); - print_settings = print_settings ? print_settings : gtk_print_settings_new (); - - page_setup = gtk_page_setup_new_from_key_file (key_file, - "Page Setup", - NULL); - page_setup = page_setup ? page_setup : gtk_page_setup_new (); - } else { - print_settings = gtk_print_settings_new (); - page_setup = gtk_page_setup_new (); - g_error_free (error); - } - - g_key_file_free (key_file); - } else { - print_settings = gtk_print_settings_new (); - page_setup = gtk_page_setup_new (); - } - - if (priv->print_settings) - g_object_unref (priv->print_settings); - priv->print_settings = print_settings; - if (priv->print_page_setup) - g_object_unref (priv->print_page_setup); - priv->print_page_setup = page_setup; - - gtk_enumerate_printers ((GtkPrinterFunc) ev_window_enumerate_printer_cb, - window, NULL, FALSE); -} - static void ev_window_cmd_escape (GtkAction *action, EvWindow *window) { @@ -4111,51 +3884,59 @@ save_sizing_mode (EvWindow *window) enum_value->value_nick); } +static void +ev_window_set_view_size (EvWindow *window) +{ + gint width, height; + GtkRequisition vsb_requisition; + GtkRequisition hsb_requisition; + gint scrollbar_spacing; + GtkWidget *scrolled_window = window->priv->scrolled_window; + + if (!window->priv->view) + return; + + /* Calculate the width available for the content */ + width = scrolled_window->allocation.width; + height = scrolled_window->allocation.height; + + if (gtk_scrolled_window_get_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window)) == GTK_SHADOW_IN) { + width -= 2 * window->priv->view->style->xthickness; + height -= 2 * window->priv->view->style->ythickness; + } + + gtk_widget_size_request (GTK_SCROLLED_WINDOW (scrolled_window)->vscrollbar, + &vsb_requisition); + gtk_widget_size_request (GTK_SCROLLED_WINDOW (scrolled_window)->hscrollbar, + &hsb_requisition); + gtk_widget_style_get (scrolled_window, + "scrollbar_spacing", + &scrollbar_spacing, + NULL); + + ev_view_set_zoom_for_size (EV_VIEW (window->priv->view), + MAX (1, width), + MAX (1, height), + vsb_requisition.width + scrollbar_spacing, + hsb_requisition.height + scrollbar_spacing); +} + static void ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) { - GtkWidget *scrolled_window; EvSizingMode sizing_mode; g_object_get (ev_window->priv->view, "sizing-mode", &sizing_mode, NULL); - scrolled_window = ev_window->priv->scrolled_window; - - g_signal_handlers_disconnect_by_func (ev_window->priv->view, ev_view_update_view_size, scrolled_window); - - if (sizing_mode != EV_SIZING_FREE) - ev_view_update_view_size (EV_VIEW (ev_window->priv->view), - GTK_SCROLLED_WINDOW (scrolled_window)); - - switch (sizing_mode) { - case EV_SIZING_BEST_FIT: - g_object_set (G_OBJECT (scrolled_window), - "hscrollbar-policy", GTK_POLICY_NEVER, - "vscrollbar-policy", GTK_POLICY_AUTOMATIC, - NULL); - g_signal_connect (ev_window->priv->view, "zoom_invalid", - G_CALLBACK (ev_view_update_view_size), - scrolled_window); - break; - case EV_SIZING_FIT_WIDTH: - g_object_set (G_OBJECT (scrolled_window), - "hscrollbar-policy", GTK_POLICY_NEVER, - "vscrollbar-policy", GTK_POLICY_AUTOMATIC, - NULL); - g_signal_connect (ev_window->priv->view, "zoom_invalid", - G_CALLBACK (ev_view_update_view_size), - scrolled_window); - break; - case EV_SIZING_FREE: - g_object_set (G_OBJECT (scrolled_window), - "hscrollbar-policy", GTK_POLICY_AUTOMATIC, - "vscrollbar-policy", GTK_POLICY_AUTOMATIC, - NULL); - break; - } + g_object_set (ev_window->priv->scrolled_window, + "hscrollbar-policy", + sizing_mode == EV_SIZING_FREE ? + GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER, + "vscrollbar-policy", GTK_POLICY_AUTOMATIC, + NULL); update_sizing_buttons (ev_window); save_sizing_mode (ev_window); @@ -4718,7 +4499,7 @@ zoom_control_changed_cb (EphyZoomAction *action, } else { mode = EV_SIZING_FREE; } - + ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), mode); if (mode == EV_SIZING_FREE) { @@ -4933,8 +4714,8 @@ ev_window_dispose (GObject *object) } if (priv->uri) { - if (priv->unlink_temp_file) - ev_window_clear_temp_file (window); + /* Delete the uri if it's a temp symlink (open a copy) */ + ev_window_clear_temp_symlink (window); g_free (priv->uri); priv->uri = NULL; } @@ -4954,11 +4735,6 @@ ev_window_dispose (GObject *object) priv->history = NULL; } - if (priv->print_settings_file) { - ev_window_clear_print_settings_file (window); - priv->print_settings_file = NULL; - } - if (priv->presentation_timeout_id > 0) { g_source_remove (priv->presentation_timeout_id); priv->presentation_timeout_id = 0; @@ -5006,7 +4782,7 @@ 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) }, - { "FilePrintSetup", NULL, N_("Print Set_up..."), NULL, + { "FilePageSetup", GTK_STOCK_PAGE_SETUP, N_("Page Set_up..."), NULL, N_("Setup the page settings for printing"), G_CALLBACK (ev_window_cmd_file_print_setup) }, { "FilePrint", GTK_STOCK_PRINT, N_("_Print..."), "P", @@ -5031,9 +4807,9 @@ static const GtkActionEntry entries[] = { 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"), "Left", NULL, + { "EditRotateLeft", EV_STOCK_ROTATE_LEFT, N_("Rotate _Left"), "Left", NULL, G_CALLBACK (ev_window_cmd_edit_rotate_left) }, - { "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), "Right", NULL, + { "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), "Right", NULL, G_CALLBACK (ev_window_cmd_edit_rotate_right) }, /* View menu */ @@ -5078,15 +4854,14 @@ static const GtkActionEntry entries[] = { { "StartPresentation", EV_STOCK_RUN_PRESENTATION, N_("Start Presentation"), NULL, N_("Start a presentation"), G_CALLBACK (ev_window_cmd_start_presentation) }, - { "PreviewPrint", GTK_STOCK_PRINT, N_("Print"), NULL, - N_("Print this document"), - G_CALLBACK (ev_window_cmd_preview_print) }, /* 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, @@ -5440,7 +5215,7 @@ launch_action (EvWindow *window, EvLinkAction *action) GAppInfo *app_info; GFile *file; GList file_list = {NULL}; - GAppLaunchContext *context = NULL; + GAppLaunchContext *context; GError *error = NULL; if (filename == NULL) @@ -5471,12 +5246,10 @@ launch_action (EvWindow *window, EvLinkAction *action) return; } -#if GTK_CHECK_VERSION (2, 14, 0) context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ()); gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context), gtk_window_get_screen (GTK_WINDOW (window))); gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context), GDK_CURRENT_TIME); -#endif file_list.data = file; if (!g_app_info_launch (app_info, &file_list, context, &error)) { @@ -5499,17 +5272,13 @@ launch_external_uri (EvWindow *window, EvLinkAction *action) const gchar *uri = ev_link_action_get_uri (action); GError *error = NULL; gboolean ret; -#if GTK_CHECK_VERSION (2, 14, 0) - GAppLaunchContext *context = NULL; -#endif + GAppLaunchContext *context; -#if GTK_CHECK_VERSION (2, 14, 0) context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ()); gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context), gtk_window_get_screen (GTK_WINDOW (window))); gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context), GDK_CURRENT_TIME); -#endif if (!g_strstr_len (uri, strlen (uri), "://") && !g_str_has_prefix (uri, "mailto:")) { @@ -5547,8 +5316,6 @@ open_remote_link (EvWindow *window, EvLinkAction *action) ev_link_action_get_dest (action), 0, NULL, - FALSE, - NULL, GDK_CURRENT_TIME); g_free (uri); @@ -5761,6 +5528,11 @@ ev_view_popup_cmd_save_image_as (GtkAction *action, EvWindow *window) NULL); gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (fc), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (fc), FALSE); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE); @@ -5919,6 +5691,11 @@ ev_attachment_popup_cmd_save_attachment_as (GtkAction *action, EvWindow *window) NULL); gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (fc), + GTK_RESPONSE_OK, + GTK_RESPONSE_CANCEL, + -1); + gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (fc), FALSE); @@ -6159,7 +5936,9 @@ ev_window_init (EvWindow *ev_window) g_signal_connect_object (ev_window->priv->view, "handle-link", G_CALLBACK (view_handle_link_cb), ev_window, 0); - + g_signal_connect_swapped (ev_window->priv->view, "zoom_invalid", + G_CALLBACK (ev_window_set_view_size), + ev_window); g_signal_connect_object (ev_window->priv->view, "popup", G_CALLBACK (view_menu_popup_cb),