X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=19a404e4e32e626b3254094aaadd90e984704e7b;hb=481a284b5bee27b139689cb8bf9ff8eac15b1cd5;hp=27adfb10ed15d07289184fb31b48b1d7470a4139;hpb=02f2ad25a6a29756518aa91774df9dbb90a990cf;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 27adfb10..19a404e4 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -41,6 +41,10 @@ #include #include +#ifdef WITH_GCONF +#include +#endif + #include "egg-editable-toolbar.h" #include "egg-toolbar-editor.h" #include "egg-toolbars-model.h" @@ -143,7 +147,6 @@ struct _EvWindowPrivate { /* Settings */ GSettings *settings; GSettings *default_settings; - GSettings *lockdown_settings; /* Menubar accels */ guint menubar_accel_keyval; @@ -211,7 +214,9 @@ struct _EvWindowPrivate { GtkPrintSettings *print_settings; GtkPageSetup *print_page_setup; gboolean close_after_print; - +#ifdef WITH_GCONF + GConfClient *gconf_client; +#endif #ifdef ENABLE_DBUS /* DBus */ guint dbus_object_id; @@ -228,10 +233,10 @@ struct _EvWindowPrivate { #define ZOOM_CONTROL_ACTION "ViewZoom" #define NAVIGATION_ACTION "Navigation" -#define GS_LOCKDOWN_SCHEMA_NAME "org.gnome.desktop.lockdown" -#define GS_LOCKDOWN_SAVE "disable-save-to-disk" -#define GS_LOCKDOWN_PRINT "disable-printing" -#define GS_LOCKDOWN_PRINT_SETUP "disable-print-setup" +#define GCONF_LOCKDOWN_DIR "/desktop/gnome/lockdown" +#define GCONF_LOCKDOWN_SAVE "/desktop/gnome/lockdown/disable_save_to_disk" +#define GCONF_LOCKDOWN_PRINT "/desktop/gnome/lockdown/disable_printing" +#define GCONF_LOCKDOWN_PRINT_SETUP "/desktop/gnome/lockdown/disable_print_setup" #ifdef ENABLE_DBUS #define EV_WINDOW_DBUS_OBJECT_PATH "/org/gnome/evince/Window/%d" @@ -344,6 +349,7 @@ static void ev_window_media_player_key_pressed (EvWindow *windo static void ev_window_update_max_min_scale (EvWindow *window); #ifdef ENABLE_DBUS static void ev_window_emit_closed (EvWindow *window); +static void ev_window_emit_doc_loaded (EvWindow *window); #endif static guint ev_window_n_copies = 0; @@ -416,15 +422,17 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) if (has_document && !ev_print_operation_exists_for_document(document)) ok_to_print = FALSE; - if (has_document && ev_window->priv->lockdown_settings && - g_settings_get_boolean (ev_window->priv->lockdown_settings, GS_LOCKDOWN_SAVE)) { +#ifdef WITH_GCONF + if (has_document && + gconf_client_get_bool (ev_window->priv->gconf_client, GCONF_LOCKDOWN_SAVE, NULL)) { ok_to_copy = FALSE; } - if (has_document && ev_window->priv->lockdown_settings && - g_settings_get_boolean (ev_window->priv->lockdown_settings, GS_LOCKDOWN_PRINT)) { + if (has_document && + gconf_client_get_bool (ev_window->priv->gconf_client, GCONF_LOCKDOWN_PRINT, NULL)) { ok_to_print = FALSE; } +#endif /* File menu */ ev_window_set_action_sensitive (ev_window, "FileOpenCopy", has_document); @@ -1337,13 +1345,16 @@ override_restrictions_changed (GSettings *settings, ev_window_setup_action_sensitivity (ev_window); } +#ifdef WITH_GCONF static void -lockdown_changed (GSettings *lockdown, - const gchar *key, +lockdown_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, EvWindow *ev_window) { ev_window_setup_action_sensitivity (ev_window); } +#endif /* WITH_GCONF */ static gboolean ev_window_setup_document (EvWindow *ev_window) @@ -1368,15 +1379,18 @@ ev_window_setup_document (EvWindow *ev_window) ev_window); } -#ifdef HAVE_DESKTOP_SCHEMAS - if (!ev_window->priv->lockdown_settings) { - ev_window->priv->lockdown_settings = g_settings_new (GS_LOCKDOWN_SCHEMA_NAME); - g_signal_connect (ev_window->priv->lockdown_settings, - "changed", - G_CALLBACK (lockdown_changed), - ev_window); - } -#endif +#ifdef WITH_GCONF + if (!ev_window->priv->gconf_client) + ev_window->priv->gconf_client = gconf_client_get_default (); + gconf_client_add_dir (ev_window->priv->gconf_client, + GCONF_LOCKDOWN_DIR, + GCONF_CLIENT_PRELOAD_ONELEVEL, + NULL); + gconf_client_notify_add (ev_window->priv->gconf_client, + GCONF_LOCKDOWN_DIR, + (GConfClientNotifyFunc)lockdown_changed, + ev_window, NULL, NULL); +#endif /* WITH_GCONF */ ev_window_setup_action_sensitivity (ev_window); @@ -1531,6 +1545,7 @@ ev_window_load_job_cb (EvJob *job, if (!ev_job_is_failed (job)) { ev_document_model_set_document (ev_window->priv->model, document); + ev_window_emit_doc_loaded (ev_window); setup_chrome_from_metadata (ev_window); update_chrome_actions (ev_window); setup_document_from_metadata (ev_window); @@ -3269,7 +3284,6 @@ ev_window_print_range (EvWindow *ev_window, GtkPageSetup *print_page_setup; gint current_page; gint document_last_page; - gboolean embed_page_setup; g_return_if_fail (EV_IS_WINDOW (ev_window)); g_return_if_fail (ev_window->priv->document != NULL); @@ -3321,11 +3335,13 @@ ev_window_print_range (EvWindow *ev_window, ev_print_operation_set_current_page (op, current_page); ev_print_operation_set_print_settings (op, print_settings); ev_print_operation_set_default_page_setup (op, print_page_setup); - embed_page_setup = ev_window->priv->lockdown_settings ? - !g_settings_get_boolean (ev_window->priv->lockdown_settings, - GS_LOCKDOWN_PRINT_SETUP) : - TRUE; - ev_print_operation_set_embed_page_setup (op, embed_page_setup); +#ifdef WITH_GCONF + ev_print_operation_set_embed_page_setup (op, !gconf_client_get_bool (ev_window->priv->gconf_client, + GCONF_LOCKDOWN_PRINT_SETUP, + NULL)); +#else + ev_print_operation_set_embed_page_setup (op, TRUE); +#endif g_object_unref (print_settings); g_object_unref (print_page_setup); @@ -3366,6 +3382,91 @@ ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window) ev_document_fc_mutex_unlock (); } +static void +document_modified_confirmation_dialog_response (GtkDialog *dialog, + gint response, + EvWindow *ev_window) +{ + gtk_widget_destroy (GTK_WIDGET (dialog)); + + switch (response) { + case GTK_RESPONSE_YES: + ev_window_cmd_save_as (NULL, ev_window); + break; + case GTK_RESPONSE_NO: + gtk_widget_destroy (GTK_WIDGET (ev_window)); + break; + case GTK_RESPONSE_CANCEL: + default: + break; + } +} + +static gboolean +ev_window_check_document_modified (EvWindow *ev_window) +{ + EvDocument *document = ev_window->priv->document; + GtkWidget *dialog; + gchar *text, *markup; + const gchar *secondary_text; + + if (!document) + return FALSE; + + if (EV_IS_DOCUMENT_FORMS (document) && + ev_document_forms_document_is_modified (EV_DOCUMENT_FORMS (document))) { + secondary_text = _("Document contains form fields that have been filled out. " + "If you don't save a copy, changes will be permanently lost."); + } else if (EV_IS_DOCUMENT_ANNOTATIONS (document) && + ev_document_annotations_document_is_modified (EV_DOCUMENT_ANNOTATIONS (document))) { + secondary_text = _("Document contains new or modified annotations. " + "If you don't save a copy, changes will be permanently lost."); + } else { + return FALSE; + } + + + text = g_markup_printf_escaped (_("Save a copy of document “%s” before closing?"), + gtk_window_get_title (GTK_WINDOW (ev_window))); + + dialog = gtk_message_dialog_new (GTK_WINDOW (ev_window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + NULL); + + markup = g_strdup_printf ("%s", text); + g_free (text); + + gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), markup); + g_free (markup); + + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), + "%s", secondary_text); + + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + _("Close _without Saving"), + GTK_RESPONSE_NO, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + _("Save a _Copy"), + 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 (document_modified_confirmation_dialog_response), + ev_window); + gtk_widget_show (dialog); + + return TRUE; +} + static void print_jobs_confirmation_dialog_response (GtkDialog *dialog, gint response, @@ -3475,6 +3576,9 @@ ev_window_close (EvWindow *ev_window) ev_document_model_set_page (ev_window->priv->model, current_page); } + if (ev_window_check_document_modified (ev_window)) + return FALSE; + if (ev_window_check_print_queue (ev_window)) return FALSE; @@ -4770,17 +4874,23 @@ ev_window_update_find_status_message (EvWindow *ev_window) return; if (ev_job_is_finished (ev_window->priv->find_job)) { - gint n_results; - - n_results = ev_job_find_get_n_results (EV_JOB_FIND (ev_window->priv->find_job), - ev_document_model_get_page (ev_window->priv->model)); - /* TRANS: Sometimes this could be better translated as - "%d hit(s) on this page". Therefore this string - contains plural cases. */ - message = g_strdup_printf (ngettext ("%d found on this page", - "%d found on this page", - n_results), - n_results); + EvJobFind *job_find = EV_JOB_FIND (ev_window->priv->find_job); + + if (ev_job_find_has_results (job_find)) { + gint n_results; + + n_results = ev_job_find_get_n_results (job_find, + ev_document_model_get_page (ev_window->priv->model)); + /* TRANS: Sometimes this could be better translated as + "%d hit(s) on this page". Therefore this string + contains plural cases. */ + message = g_strdup_printf (ngettext ("%d found on this page", + "%d found on this page", + n_results), + n_results); + } else { + message = g_strdup (_("Not found")); + } } else { gdouble percent; @@ -5038,6 +5148,13 @@ ev_window_dispose (GObject *object) priv->setup_document_idle = 0; } +#ifdef WITH_GCONF + if (priv->gconf_client) { + g_object_unref (priv->gconf_client); + priv->gconf_client = NULL; + } +#endif + if (priv->monitor) { g_object_unref (priv->monitor); priv->monitor = NULL; @@ -5091,11 +5208,6 @@ ev_window_dispose (GObject *object) priv->default_settings = NULL; } - if (priv->lockdown_settings) { - g_object_unref (priv->lockdown_settings); - priv->lockdown_settings = NULL; - } - priv->recent_ui_id = 0; if (priv->model) { @@ -6504,6 +6616,35 @@ ev_window_emit_closed (EvWindow *window) g_dbus_connection_flush_sync (connection, NULL, NULL); } +static void +ev_window_emit_doc_loaded (EvWindow *window) +{ + GDBusConnection *connection; + GError *error = NULL; + + if (window->priv->dbus_object_id <= 0) + return; + + connection = ev_application_get_dbus_connection (EV_APP); + if (!connection) + return; + + g_dbus_connection_emit_signal (connection, + NULL, + window->priv->dbus_object_path, + EV_WINDOW_DBUS_INTERFACE, + "DocumentLoaded", + g_variant_new("(s)", window->priv->uri), + &error); + if (error) { + g_printerr ("Failed to emit DBus signal DocumentLoaded: %s\n", + error->message); + g_error_free (error); + + return; + } +} + static void method_call_cb (GDBusConnection *connection, const gchar *sender, @@ -6542,6 +6683,9 @@ static const char introspection_xml[] = "" "" "" + "" + "" + "" "" "";