]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
[shell] Add DBUS DocumentLoaded signal to EvWindow
[evince.git] / shell / ev-window.c
index 27adfb10ed15d07289184fb31b48b1d7470a4139..19a404e4e32e626b3254094aaadd90e984704e7b 100644 (file)
 #include <gio/gio.h>
 #include <gtk/gtk.h>
 
+#ifdef WITH_GCONF
+#include <gconf/gconf-client.h>
+#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 ("<b>%s</b>", 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[] =
              "<arg type='(ii)' name='source_point' direction='out'/>"
            "</signal>"
             "<signal name='Closed'/>"
+           "<signal name='DocumentLoaded'>"
+             "<arg type='s' name='uri' direction='out'/>"
+           "</signal>"
           "</interface>"
         "</node>";