X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=944a469663bf25a9c4a4255c8f4e2175b997b8d1;hb=a61c4406e2cd4dc8f2d3a981e73dc09ae21e6ece;hp=70cc0439f919cdaf16248f012a0fdede3e1dabe0;hpb=90a8680bba08da4ae9aa5f0f5382c625eef2f86c;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 70cc0439..944a4696 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -37,7 +37,6 @@ #include "ev-view.h" #include "ev-password.h" #include "ev-password-view.h" -#include "ev-print-job.h" #include "ev-properties-dialog.h" #include "ev-ps-exporter.h" #include "ev-document-thumbnails.h" @@ -65,12 +64,16 @@ #include "ev-utils.h" #include "ev-debug.h" +#ifdef WITH_GNOME_PRINT +#include "ev-print-job.h" +#include +#endif + #include #include #include #include -#include #include #include @@ -102,20 +105,21 @@ struct _EvWindowPrivate { GtkWidget *find_bar; GtkWidget *scrolled_window; GtkWidget *view; - GtkWidget *page_view; GtkWidget *password_view; GtkWidget *sidebar_thumbs; GtkWidget *sidebar_links; - EvWindowTitle *title; - /* Dialogs */ GtkWidget *properties; +#ifdef WITH_GNOME_PRINT + GtkWidget *print_dialog; +#endif + GtkWidget *password_dialog; /* UI Builders */ GtkActionGroup *action_group; GtkActionGroup *popups_action_group; - GtkUIManager *ui_manager; + GtkUIManager *ui_manager; /* Fullscreen mode */ GtkWidget *fullscreen_toolbar; @@ -129,23 +133,20 @@ struct _EvWindowPrivate { /* Document */ char *uri; char *local_uri; - char *loaded_uri; EvDocument *document; + EvDocument *password_document; EvPageCache *page_cache; - EvWindowPageMode page_mode; - - /* These members are used temporarily when in PAGE_MODE_PASSWORD */ - EvDocument *password_document; - GtkWidget *password_dialog; - char *password_uri; + EvWindowTitle *title; + EggRecentViewUIManager *recent_view; /* Job used to load document */ EvJob *xfer_job; EvJob *load_job; - - EggRecentViewUIManager *recent_view; +#ifdef WITH_GNOME_PRINT + GnomePrintJob *print_job; +#endif }; static const GtkTargetEntry ev_drop_types[] = { @@ -281,6 +282,10 @@ update_action_sensitivity (EvWindow *ev_window) ok_to_copy_text = ev_view_get_has_selection (view); } +#ifndef WITH_GNOME_PRINT + ok_to_print = FALSE; +#endif + /* File menu */ /* "FileOpen": always sensitive */ set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy); @@ -477,13 +482,13 @@ ev_window_cmd_focus_page_selector (GtkAction *act, EvWindow *window) static void ev_window_cmd_scroll_forward (GtkAction *action, EvWindow *window) { - ev_view_scroll (EV_VIEW (window->priv->view), EV_SCROLL_PAGE_FORWARD); + ev_view_scroll (EV_VIEW (window->priv->view), EV_SCROLL_PAGE_FORWARD, FALSE); } static void ev_window_cmd_scroll_backward (GtkAction *action, EvWindow *window) { - ev_view_scroll (EV_VIEW (window->priv->view), EV_SCROLL_PAGE_BACKWARD); + ev_view_scroll (EV_VIEW (window->priv->view), EV_SCROLL_PAGE_BACKWARD, FALSE); } static void @@ -598,7 +603,8 @@ page_changed_cb (EvPageCache *page_cache, EvWindow *ev_window) { update_action_sensitivity (ev_window); - ev_metadata_manager_set_int (ev_window->priv->loaded_uri, "page", page); + if (!ev_window_is_empty (ev_window)) + ev_metadata_manager_set_int (ev_window->priv->uri, "page", page); } static void @@ -629,11 +635,12 @@ setup_document_from_metadata (EvWindow *window) { char *uri = window->priv->uri; GValue page = { 0, }; + gint new_page; - /* Page */ if (uri && ev_metadata_manager_get (uri, "page", &page, TRUE)) { + new_page = CLAMP (g_value_get_int (&page), 0, ev_page_cache_get_n_pages (window->priv->page_cache) - 1); ev_page_cache_set_current_page (window->priv->page_cache, - g_value_get_int (&page)); + new_page); } } @@ -754,14 +761,14 @@ setup_view_from_metadata (EvWindow *window) /* Presentation */ if (ev_metadata_manager_get (uri, "presentation", &presentation, FALSE)) { - if (g_value_get_boolean (&presentation)) { + if (g_value_get_boolean (&presentation) && uri) { ev_window_run_presentation (window); } } /* Fullscreen */ if (ev_metadata_manager_get (uri, "fullscreen", &fullscreen, FALSE)) { - if (g_value_get_boolean (&fullscreen)) { + if (g_value_get_boolean (&fullscreen) && uri) { ev_window_run_fullscreen (window); } } @@ -806,12 +813,12 @@ ev_window_setup_document (EvWindow *ev_window) ev_window, 0); } - ev_window_set_page_mode (ev_window, PAGE_MODE_DOCUMENT); ev_sidebar_set_document (sidebar, document); if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) { ev_view_set_document (view, document); } + ev_window_set_page_mode (ev_window, PAGE_MODE_DOCUMENT); ev_window_title_set_document (ev_window->priv->title, document); ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->uri); @@ -840,8 +847,6 @@ password_dialog_response (GtkWidget *password_dialog, char *password; if (response_id == GTK_RESPONSE_OK) { - EvDocument *document; - gchar *uri; password = ev_password_dialog_get_password (EV_PASSWORD_DIALOG (password_dialog)); if (password) { @@ -854,21 +859,14 @@ password_dialog_response (GtkWidget *password_dialog, ev_password_dialog_save_password (EV_PASSWORD_DIALOG (password_dialog)); - document = ev_window->priv->password_document; - uri = ev_window->priv->password_uri; - + g_object_unref (ev_window->priv->password_document); ev_window->priv->password_document = NULL; - ev_window->priv->password_uri = NULL; ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_DOCUMENT); - ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); gtk_widget_destroy (password_dialog); - g_object_unref (document); - g_free (uri); - return; } @@ -884,16 +882,15 @@ static void ev_window_popup_password_dialog (EvWindow *ev_window) { g_assert (ev_window->priv->password_document); - g_assert (ev_window->priv->password_uri); gtk_widget_set_sensitive (ev_window->priv->password_view, FALSE); - ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->password_uri); + ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->uri); ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_PASSWORD); if (ev_window->priv->password_dialog == NULL) { ev_window->priv->password_dialog = - g_object_new (EV_TYPE_PASSWORD_DIALOG, "uri", ev_window->priv->password_uri, NULL); + g_object_new (EV_TYPE_PASSWORD_DIALOG, "uri", ev_window->priv->uri, NULL); gtk_window_set_transient_for (GTK_WINDOW (ev_window->priv->password_dialog), GTK_WINDOW (ev_window)); g_object_add_weak_pointer (G_OBJECT (ev_window->priv->password_dialog), @@ -967,29 +964,23 @@ ev_window_load_job_cb (EvJobLoad *job, g_assert (document); g_assert (document != ev_window->priv->document); g_assert (job->uri); + + ev_view_set_loading (EV_VIEW (ev_window->priv->view), FALSE); if (ev_window->priv->password_document) { g_object_unref (ev_window->priv->password_document); ev_window->priv->password_document = NULL; } - if (ev_window->priv->password_uri) { - g_free (ev_window->priv->password_uri); - ev_window->priv->password_uri = NULL; - } /* Success! */ if (job->error == NULL) { + if (ev_window->priv->document) g_object_unref (ev_window->priv->document); ev_window->priv->document = g_object_ref (document); - ev_window_setup_document (ev_window); - - ev_window_add_recent (ev_window, ev_window->priv->uri); - - if (ev_window->priv->loaded_uri) - g_free (ev_window->priv->loaded_uri); - ev_window->priv->loaded_uri = g_strdup (ev_window->priv->uri); + ev_window_setup_document (ev_window); + ev_window_add_recent (ev_window, ev_window->priv->uri); ev_window_clear_jobs (ev_window); return; @@ -1000,7 +991,6 @@ ev_window_load_job_cb (EvJobLoad *job, gchar *base_name, *file_name; ev_window->priv->password_document = g_object_ref (document); - ev_window->priv->password_uri = g_strdup (job->uri); file_name = gnome_vfs_format_uri_for_display (job->uri); base_name = g_path_get_basename (file_name); @@ -1029,6 +1019,7 @@ ev_window_xfer_job_cb (EvJobXfer *job, if (job->error != NULL) { unable_to_load (ev_window, job->error->message); ev_window_clear_jobs (ev_window); + ev_view_set_loading (EV_VIEW (ev_window->priv->view), FALSE); } else { char *uri; @@ -1054,19 +1045,46 @@ ev_window_xfer_job_cb (EvJobXfer *job, } } -void -ev_window_open_uri (EvWindow *ev_window, const char *uri) +const char * +ev_window_get_uri (EvWindow *ev_window) +{ + return ev_window->priv->uri; +} + +static void +ev_window_close_dialogs (EvWindow *ev_window) { if (ev_window->priv->password_dialog) gtk_widget_destroy (ev_window->priv->password_dialog); + ev_window->priv->password_dialog = NULL; + +#ifdef WITH_GNOME_PRINT + if (ev_window->priv->print_dialog) { + gtk_widget_destroy (ev_window->priv->print_dialog); + g_object_unref (ev_window->priv->print_job); + } + ev_window->priv->print_dialog = NULL; + ev_window->priv->print_job = NULL; +#endif + + if (ev_window->priv->properties) + gtk_widget_destroy (ev_window->priv->properties); + ev_window->priv->properties = NULL; +} + +void +ev_window_open_uri (EvWindow *ev_window, const char *uri) +{ g_free (ev_window->priv->uri); ev_window->priv->uri = g_strdup (uri); setup_view_from_metadata (ev_window); + ev_window_close_dialogs (ev_window); ev_window_clear_jobs (ev_window); ev_window_clear_local_uri (ev_window); + ev_view_set_loading (EV_VIEW (ev_window->priv->view), TRUE); ev_window->priv->xfer_job = ev_job_xfer_new (uri); g_signal_connect (ev_window->priv->xfer_job, @@ -1091,6 +1109,8 @@ 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))); gtk_widget_destroy (chooser); } @@ -1111,7 +1131,10 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window) ev_document_types_add_filters (chooser, NULL); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE); - + if (ev_application_get_chooser_uri (EV_APP) != NULL) + gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser), + ev_application_get_chooser_uri (EV_APP)); + g_signal_connect (chooser, "response", G_CALLBACK (file_open_dialog_response_cb), window); @@ -1228,7 +1251,10 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) ev_document_types_add_filters (fc, ev_window->priv->document); gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK); - + +#ifdef HAVE_GTK_FILE_CHOOSER_SET_DO_OVERWRITE_CONFIRMATION + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER (fc), TRUE); +#endif file_name = gnome_vfs_format_uri_for_display (ev_window->priv->uri); base_name = g_path_get_basename (file_name); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), base_name); @@ -1251,113 +1277,118 @@ ev_window_print (EvWindow *window) page_cache = ev_page_cache_get (window->priv->document); last_page = ev_page_cache_get_n_pages (page_cache); - ev_window_print_range (window, 1, -1); +#ifdef WITH_GNOME_PRINT + ev_window_print_range (window, 1, last_page); +#endif } -const char * -ev_window_get_uri (EvWindow *ev_window) + +#ifdef WITH_GNOME_PRINT +static gboolean +ev_window_print_dialog_response_cb (GtkDialog *print_dialog, gint response, gpointer data) { - return ev_window->priv->uri; + EvWindow *ev_window = EV_WINDOW (data); + 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; - GnomePrintJob *job; - GtkWidget *print_dialog; gchar *pages_label; - EvPrintJob *print_job = NULL; - EvPageCache *page_cache; g_return_if_fail (EV_IS_WINDOW (ev_window)); g_return_if_fail (ev_window->priv->document != NULL); - page_cache = ev_page_cache_get (ev_window->priv->document); - if (last_page == -1) { - last_page = ev_page_cache_get_n_pages (page_cache); - } - config = load_print_config_from_file (); - job = gnome_print_job_new (config); - print_dialog = gnome_print_dialog_new (job, (guchar *) _("Print"), - (GNOME_PRINT_DIALOG_RANGE | - GNOME_PRINT_DIALOG_COPIES)); + 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 (print_dialog), + 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 (print_dialog), + gtk_dialog_set_response_sensitive (GTK_DIALOG (ev_window->priv->print_dialog), GNOME_PRINT_DIALOG_RESPONSE_PREVIEW, FALSE); - while (TRUE) { - int response; - response = gtk_dialog_run (GTK_DIALOG (print_dialog)); - - if (response != GNOME_PRINT_DIALOG_RESPONSE_PRINT) - break; - - /* 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); - - continue; - } 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); - - continue; - } - - save_print_config_to_file (config); - - print_job = g_object_new (EV_TYPE_PRINT_JOB, - "gnome_print_job", job, - "document", ev_window->priv->document, - "print_dialog", print_dialog, - NULL); - break; - } - - g_object_unref (job); - - gtk_widget_destroy (print_dialog); - - if (print_job != NULL) { - ev_print_job_print (print_job, GTK_WINDOW (ev_window)); - g_object_unref (print_job); - } - - g_object_unref (config); + 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); + return; } - +#endif /* WITH_GNOME_PRINT */ + static void ev_window_cmd_file_print (GtkAction *action, EvWindow *ev_window) { @@ -1506,8 +1537,9 @@ static void ev_window_sidebar_position_change_cb (GObject *object, GParamSpec *pspec, EvWindow *ev_window) { - ev_metadata_manager_set_int (ev_window->priv->loaded_uri, "sidebar_size", - gtk_paned_get_position (GTK_PANED (object))); + if (!ev_window_is_empty (ev_window)) + ev_metadata_manager_set_int (ev_window->priv->uri, "sidebar_size", + gtk_paned_get_position (GTK_PANED (object))); } static void @@ -1724,7 +1756,8 @@ ev_window_run_fullscreen (EvWindow *window) gtk_window_fullscreen (GTK_WINDOW (window)); ev_window_update_fullscreen_popup (window); - ev_metadata_manager_set_boolean (window->priv->loaded_uri, "fullscreen", TRUE); + if (!ev_window_is_empty (window)) + ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", TRUE); } static void @@ -1753,7 +1786,8 @@ ev_window_stop_fullscreen (EvWindow *window) update_chrome_visibility (window); update_sidebar_visibility (window); - ev_metadata_manager_set_boolean (window->priv->loaded_uri, "fullscreen", FALSE); + if (!ev_window_is_empty (window)) + ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE); } static void @@ -1800,7 +1834,8 @@ ev_window_run_presentation (EvWindow *window) update_chrome_visibility (window); gtk_widget_hide (window->priv->sidebar); - ev_metadata_manager_set_boolean (window->priv->loaded_uri, "presentation", TRUE); + if (!ev_window_is_empty (window)) + ev_metadata_manager_set_boolean (window->priv->uri, "presentation", TRUE); } static void @@ -1818,7 +1853,8 @@ ev_window_stop_presentation (EvWindow *window) update_chrome_visibility (window); update_sidebar_visibility (window); - ev_metadata_manager_set_boolean (window->priv->loaded_uri, "presentation", FALSE); + if (!ev_window_is_empty (window)) + ev_metadata_manager_set_boolean (window->priv->uri, "presentation", FALSE); } static void @@ -2082,7 +2118,7 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) ev_window_open_uri (ev_window, uri); /* In case the number of pages in the document has changed. */ - page = CLAMP (page, 0, ev_page_cache_get_n_pages (ev_window->priv->page_cache)); + page = CLAMP (page, 0, ev_page_cache_get_n_pages (ev_window->priv->page_cache) - 1); ev_page_cache_set_current_page (ev_window->priv->page_cache, page); @@ -2179,8 +2215,9 @@ save_sizing_mode (EvWindow *window) mode = ev_view_get_sizing_mode (EV_VIEW (window->priv->view)); enum_value = g_enum_get_value (EV_SIZING_MODE_CLASS, mode); - ev_metadata_manager_set_string (window->priv->loaded_uri, "sizing_mode", - enum_value->value_nick); + if (!ev_window_is_empty (window)) + ev_metadata_manager_set_string (window->priv->uri, "sizing_mode", + enum_value->value_nick); } static void @@ -2237,8 +2274,8 @@ ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) { update_action_sensitivity (ev_window); - if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE) { - ev_metadata_manager_set_double (ev_window->priv->loaded_uri, "zoom", + if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE && !ev_window_is_empty (ev_window)) { + ev_metadata_manager_set_double (ev_window->priv->uri, "zoom", ev_view_get_zoom (view)); } } @@ -2275,8 +2312,10 @@ static void ev_window_continuous_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) { ev_window_update_continuous_action (ev_window); - ev_metadata_manager_set_boolean (ev_window->priv->loaded_uri, "continuous", - ev_view_get_continuous (EV_VIEW (ev_window->priv->view))); + + if (!ev_window_is_empty (ev_window)) + ev_metadata_manager_set_boolean (ev_window->priv->uri, "continuous", + ev_view_get_continuous (EV_VIEW (ev_window->priv->view))); } static void @@ -2286,8 +2325,9 @@ ev_window_rotation_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window rotation = ev_view_get_rotation (EV_VIEW (window->priv->view)); - ev_metadata_manager_set_int (window->priv->loaded_uri, "rotation", - rotation); + if (!ev_window_is_empty (window)) + ev_metadata_manager_set_int (window->priv->uri, "rotation", + rotation); ev_sidebar_thumbnails_refresh (EV_SIDEBAR_THUMBNAILS (window->priv->sidebar_thumbs), rotation); @@ -2303,8 +2343,10 @@ static void ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) { ev_window_update_dual_page_action (ev_window); - ev_metadata_manager_set_boolean (ev_window->priv->loaded_uri, "dual-page", - ev_view_get_dual_page (EV_VIEW (ev_window->priv->view))); + + if (!ev_window_is_empty (ev_window)) + ev_metadata_manager_set_boolean (ev_window->priv->uri, "dual-page", + ev_view_get_dual_page (EV_VIEW (ev_window->priv->view))); } static char * @@ -2435,7 +2477,9 @@ ev_window_sidebar_current_page_changed_cb (EvSidebar *ev_sidebar, } g_object_unref (current_page); - ev_metadata_manager_set_string (ev_window->priv->loaded_uri, "sidebar_page", id); + + if (!ev_window_is_empty (ev_window)) + ev_metadata_manager_set_string (ev_window->priv->uri, "sidebar_page", id); } static void @@ -2455,8 +2499,9 @@ ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar, GParamSpec *pspe (action, G_CALLBACK (ev_window_view_sidebar_cb), ev_window); if (!ev_view_get_presentation (view) && - !ev_view_get_fullscreen (view)) { - ev_metadata_manager_set_boolean (ev_window->priv->loaded_uri, "sidebar_visibility", + !ev_view_get_fullscreen (view) && + !ev_window_is_empty (ev_window)) { + ev_metadata_manager_set_boolean (ev_window->priv->uri, "sidebar_visibility", GTK_WIDGET_VISIBLE (ev_sidebar)); } } @@ -2470,6 +2515,9 @@ view_menu_popup_cb (EvView *view, gboolean show_external = FALSE; gboolean show_internal = FALSE; GtkAction *action; + + if (ev_view_get_presentation (EV_VIEW (ev_window->priv->view))) + return FALSE; if (ev_window->priv->link) g_object_unref (ev_window->priv->link); @@ -2513,7 +2561,7 @@ view_menu_popup_cb (EvView *view, gtk_menu_popup (GTK_MENU (popup), NULL, NULL, NULL, NULL, 3, gtk_get_current_event_time ()); - return TRUE; + return FALSE; } static void @@ -2573,6 +2621,7 @@ find_bar_search_changed_cb (EggFindBar *find_bar, #if 0 g_printerr ("search for '%s'\n", search_string ? search_string : "(nil)"); #endif + ev_view_search_changed (EV_VIEW(ev_window->priv->view)); if (ev_window->priv->document && EV_IS_DOCUMENT_FIND (ev_window->priv->document)) { @@ -2596,6 +2645,12 @@ find_bar_search_changed_cb (EggFindBar *find_bar, } } +static void +find_bar_scroll(EggFindBar *find_bar, GtkScrollType scroll, EvWindow* ev_window) +{ + ev_view_scroll(EV_VIEW(ev_window->priv->view), scroll, FALSE); +} + static void zoom_control_changed_cb (EphyZoomAction *action, float zoom, @@ -2680,11 +2735,6 @@ ev_window_dispose (GObject *object) priv->view = NULL; } - if (priv->page_view) { - g_object_unref (priv->page_view); - priv->page_view = NULL; - } - if (priv->load_job || priv->xfer_job) { ev_window_clear_jobs (window); } @@ -2698,14 +2748,7 @@ ev_window_dispose (GObject *object) priv->password_document = NULL; } - if (priv->password_uri) { - g_free (priv->password_uri); - priv->password_uri = NULL; - } - - if (priv->password_dialog) { - gtk_widget_destroy (priv->password_dialog); - } + ev_window_close_dialogs (window); if (priv->link) { g_object_unref (priv->link); @@ -2720,11 +2763,6 @@ ev_window_dispose (GObject *object) priv->find_bar = NULL; } - if (priv->loaded_uri) { - g_free (priv->loaded_uri); - priv->loaded_uri = NULL; - } - if (priv->uri) { g_free (priv->uri); priv->uri = NULL; @@ -2884,7 +2922,7 @@ static const GtkToggleActionEntry toggle_entries[] = { { "ViewToolbar", NULL, N_("_Toolbar"), "T", N_("Show or hide the toolbar"), G_CALLBACK (ev_window_view_toolbar_cb), TRUE }, - { "ViewSidebar", NULL, N_("Side _Pane"), "F9", + { "ViewSidebar", GTK_STOCK_INDEX, N_("Side _Pane"), "F9", N_("Show or hide the side pane"), G_CALLBACK (ev_window_view_sidebar_cb), TRUE }, { "ViewContinuous", EV_STOCK_VIEW_CONTINUOUS, N_("_Continuous"), NULL, @@ -3138,7 +3176,8 @@ window_state_event_cb (EvWindow *window, GdkEventWindowState *event, gpointer du gboolean maximized; maximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED; - ev_metadata_manager_set_boolean (window->priv->loaded_uri, "window_maximized", maximized); + if (!ev_window_is_empty (window)) + ev_metadata_manager_set_boolean (window->priv->uri, "window_maximized", maximized); } return FALSE; @@ -3147,7 +3186,7 @@ window_state_event_cb (EvWindow *window, GdkEventWindowState *event, gpointer du static gboolean window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer dummy) { - char *uri = window->priv->loaded_uri; + char *uri = window->priv->uri; GdkWindowState state; int x, y, width, height; @@ -3157,10 +3196,12 @@ window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer gtk_window_get_position (GTK_WINDOW (window), &x, &y); gtk_window_get_size (GTK_WINDOW (window), &width, &height); - ev_metadata_manager_set_int (uri, "window_x", x); - ev_metadata_manager_set_int (uri, "window_y", y); - ev_metadata_manager_set_int (uri, "window_width", width); - ev_metadata_manager_set_int (uri, "window_height", height); + if (!ev_window_is_empty (window)) { + ev_metadata_manager_set_int (uri, "window_x", x); + ev_metadata_manager_set_int (uri, "window_y", y); + ev_metadata_manager_set_int (uri, "window_width", width); + ev_metadata_manager_set_int (uri, "window_height", height); + } } return FALSE; @@ -3418,7 +3459,6 @@ ev_window_init (EvWindow *ev_window) /* We own a ref on these widgets, as we can swap them in and out */ g_object_ref (ev_window->priv->view); - //g_object_ref (ev_window->priv->page_view); g_object_ref (ev_window->priv->password_view); gtk_container_add (GTK_CONTAINER (ev_window->priv->scrolled_window), @@ -3488,6 +3528,10 @@ ev_window_init (EvWindow *ev_window) "notify::visible", G_CALLBACK (find_bar_search_changed_cb), ev_window); + g_signal_connect (ev_window->priv->find_bar, + "scroll", + G_CALLBACK (find_bar_scroll), + ev_window); /* Popups */ ev_window->priv->popup = gtk_ui_manager_get_widget (ev_window->priv->ui_manager,