]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-application.c
Fix misspelling of 'appropriate'
[evince.git] / shell / ev-application.c
index 9c7770ae0b1a75a1023a3316305e85ccc87b29e9..8ba99bc1e908f6aad13571a7b0d488d999028ce0 100644 (file)
 #endif
 
 #include "totem-scrsaver.h"
+
+#ifdef WITH_SMCLIENT
 #include "eggsmclient.h"
+#endif
 
 #include "ev-application.h"
 #include "ev-document-factory.h"
@@ -57,18 +60,25 @@ struct _EvApplication {
        GObject base_instance;
 
        gchar *dot_dir;
+       gchar *data_dir;
        gchar *accel_map_file;
        gchar *toolbars_file;
+
+#ifdef ENABLE_DBUS
        gchar *crashed_file;
        guint  crashed_idle;
+#endif
 
        EggToolbarsModel *toolbars_model;
 
        TotemScrsaver *scr_saver;
 
+#ifdef WITH_SMCLIENT
        EggSMClient *smclient;
+#endif
 
-       gchar *last_chooser_uri;
+       gchar *filechooser_open_uri;
+       gchar *filechooser_save_uri;
 
 #ifdef ENABLE_DBUS
        EvMediaPlayerKeys *keys;
@@ -193,6 +203,7 @@ save_session (EvApplication *application,
        g_free (uri_list);
 }
 
+#ifdef ENABLE_DBUS
 static void
 ev_application_save_session_crashed (EvApplication *application)
 {
@@ -245,11 +256,48 @@ save_session_crashed_in_idle (EvApplication *application)
 }
 
 static gboolean
-ev_application_run_crash_recovery_dialog (EvApplication *application)
+ev_application_run_crash_recovery_dialog (EvApplication *application,
+                                         const gchar  **files)
 {
        GtkWidget *dialog;
        gint       response;
 
+       /* Do not show the recover dialog if the requested file is the
+        * only one to be recovered
+        */
+       if (files && g_strv_length ((gchar **)files) == 1) {
+               GKeyFile *state_file;
+               gchar   **uri_list;
+
+               state_file = g_key_file_new ();
+               g_key_file_load_from_file (state_file,
+                                          application->crashed_file,
+                                          G_KEY_FILE_NONE,
+                                          NULL);
+               uri_list = g_key_file_get_string_list (state_file,
+                                                      "Evince",
+                                                      "documents",
+                                                      NULL, NULL);
+               if (uri_list && g_strv_length (uri_list) == 1) {
+                       GFile *file;
+                       gchar *uri;
+
+                       file = g_file_new_for_commandline_arg (files[0]);
+                       uri = g_file_get_uri (file);
+                       g_object_unref (file);
+                       if (g_ascii_strcasecmp (uri, uri_list[0]) == 0) {
+                               g_strfreev (uri_list);
+                               g_key_file_free (state_file);
+                               g_free (uri);
+
+                               return FALSE;
+                       }
+                       g_free (uri);
+                       g_strfreev (uri_list);
+               }
+               g_key_file_free (state_file);
+       }
+
        dialog = gtk_message_dialog_new (NULL,
                                         GTK_DIALOG_MODAL,
                                         GTK_MESSAGE_WARNING,
@@ -278,19 +326,25 @@ ev_application_run_crash_recovery_dialog (EvApplication *application)
 
        return response == GTK_RESPONSE_ACCEPT;
 }
+#endif /* ENABLE_DBUS */
 
 gboolean
-ev_application_load_session (EvApplication *application)
+ev_application_load_session (EvApplication *application,
+                            const gchar  **files)
 {
        GKeyFile *state_file;
        gchar   **uri_list;
 
+#ifdef WITH_SMCLIENT
        if (egg_sm_client_is_resumed (application->smclient)) {
                state_file = egg_sm_client_get_state_file (application->smclient);
                if (!state_file)
                        return FALSE;
-       } else if (g_file_test (application->crashed_file, G_FILE_TEST_IS_REGULAR)) {
-               if (ev_application_run_crash_recovery_dialog (application)) {
+       } else
+#endif /* WITH_SMCLIENT */
+#ifdef ENABLE_DBUS
+        if (g_file_test (application->crashed_file, G_FILE_TEST_IS_REGULAR)) {
+               if (ev_application_run_crash_recovery_dialog (application, files)) {
                        state_file = g_key_file_new ();
                        g_key_file_load_from_file (state_file,
                                                   application->crashed_file,
@@ -299,9 +353,9 @@ ev_application_load_session (EvApplication *application)
                } else {
                        return FALSE;
                }
-       } else {
+       } else
+#endif /* ENABLE_DBUS */
                return FALSE;
-       }
 
        uri_list = g_key_file_get_string_list (state_file,
                                               "Evince",
@@ -323,6 +377,8 @@ ev_application_load_session (EvApplication *application)
        return TRUE;
 }
 
+#ifdef WITH_SMCLIENT
+
 static void
 smclient_save_state_cb (EggSMClient   *client,
                        GKeyFile      *state_file,
@@ -344,12 +400,17 @@ smclient_quit_cb (EggSMClient   *client,
        ev_application_shutdown (application);
 }
 
+#endif /* WITH_SMCLIENT */
+
 static void
 ev_application_init_session (EvApplication *application)
 {
+#ifdef ENABLE_DBUS
        application->crashed_file = g_build_filename (application->dot_dir,
                                                      "evince-crashed", NULL);
+#endif
 
+#ifdef WITH_SMCLIENT
        application->smclient = egg_sm_client_get ();
        g_signal_connect (application->smclient, "save_state",
                          G_CALLBACK (smclient_save_state_cb),
@@ -357,6 +418,7 @@ ev_application_init_session (EvApplication *application)
        g_signal_connect (application->smclient, "quit",
                          G_CALLBACK (smclient_quit_cb),
                          application);
+#endif
 }
 
 /**
@@ -528,10 +590,12 @@ ev_application_open_window (EvApplication  *application,
                gtk_window_set_screen (GTK_WINDOW (new_window), screen);
        }
 
+#ifdef ENABLE_DBUS
        ev_application_save_session_crashed (application);
        g_signal_connect_swapped (new_window, "destroy",
                                  G_CALLBACK (save_session_crashed_in_idle),
                                  application);
+#endif
 
        if (!GTK_WIDGET_REALIZED (new_window))
                gtk_widget_realize (new_window);
@@ -661,10 +725,12 @@ ev_application_open_uri_at_dest (EvApplication  *application,
           we can restore window size without flickering */     
        ev_window_open_uri (new_window, uri, dest, mode, search_string);
 
+#ifdef ENABLE_DBUS
        ev_application_save_session_crashed (application);
        g_signal_connect_swapped (new_window, "destroy",
                                  G_CALLBACK (save_session_crashed_in_idle),
                                  application);
+#endif
 
        if (!GTK_WIDGET_REALIZED (GTK_WIDGET (new_window)))
                gtk_widget_realize (GTK_WIDGET (new_window));
@@ -739,11 +805,13 @@ ev_application_open_uri_list (EvApplication *application,
 void
 ev_application_shutdown (EvApplication *application)
 {
+#ifdef ENABLE_DBUS
        if (application->crashed_file) {
                ev_application_save_session_crashed (application);
                g_free (application->crashed_file);
                application->crashed_file = NULL;
        }
+#endif
 
        if (application->accel_map_file) {
                gtk_accel_map_save (application->accel_map_file);
@@ -786,8 +854,12 @@ ev_application_shutdown (EvApplication *application)
 
         g_free (application->dot_dir);
         application->dot_dir = NULL;
-       g_free (application->last_chooser_uri);
-        application->last_chooser_uri = NULL;
+        g_free (application->data_dir);
+        application->data_dir = NULL;
+       g_free (application->filechooser_open_uri);
+        application->filechooser_open_uri = NULL;
+       g_free (application->filechooser_save_uri);
+       application->filechooser_save_uri = NULL;
 
        g_object_unref (application);
         instance = NULL;
@@ -805,6 +877,7 @@ ev_application_init (EvApplication *ev_application)
 {
        gint i;
        const gchar *home_dir;
+       gchar *toolbar_path;
 
         ev_application->dot_dir = g_build_filename (g_get_home_dir (),
                                                     ".gnome2",
@@ -815,6 +888,18 @@ ev_application_init (EvApplication *ev_application)
         if (!ev_dir_ensure_exists (ev_application->dot_dir, 0700))
                 exit (1);
 
+#ifdef G_OS_WIN32
+{
+       gchar *dir;
+
+       dir = g_win32_get_package_installation_directory_of_module (NULL);
+       ev_application->data_dir = g_build_filename (dir, "share", "evince", NULL);
+       g_free (dir);
+}
+#else
+       ev_application->data_dir = g_strdup (DATADIR);
+#endif
+
        ev_application_init_session (ev_application);
 
        home_dir = g_get_home_dir ();
@@ -832,14 +917,17 @@ ev_application_init (EvApplication *ev_application)
        ev_application->toolbars_file = g_build_filename
                        (ev_application->dot_dir, "evince_toolbar.xml", NULL);
 
+       toolbar_path = g_build_filename (ev_application->data_dir,
+                                        "evince-toolbar.xml", NULL);
        egg_toolbars_model_load_names (ev_application->toolbars_model,
-                                      DATADIR "/evince-toolbar.xml");
+                                      toolbar_path);
 
        if (!egg_toolbars_model_load_toolbars (ev_application->toolbars_model,
                                               ev_application->toolbars_file)) {
                egg_toolbars_model_load_toolbars (ev_application->toolbars_model,
-                                                 DATADIR"/evince-toolbar.xml");
+                                                 toolbar_path);
        }
+       g_free (toolbar_path);
 
        /* Open item doesn't exist anymore,
         * convert it to OpenRecent for compatibility
@@ -924,16 +1012,32 @@ ev_application_save_toolbars_model (EvApplication *application)
 }
 
 void
-ev_application_set_chooser_uri (EvApplication *application, const gchar *uri)
+ev_application_set_filechooser_uri (EvApplication       *application,
+                                   GtkFileChooserAction action,
+                                   const gchar         *uri)
 {
-       g_free (application->last_chooser_uri);
-       application->last_chooser_uri = g_strdup (uri);
+       if (action == GTK_FILE_CHOOSER_ACTION_OPEN) {
+               g_free (application->filechooser_open_uri);
+               application->filechooser_open_uri = g_strdup (uri);
+       } else if (action == GTK_FILE_CHOOSER_ACTION_SAVE) {
+               g_free (application->filechooser_save_uri);
+               application->filechooser_save_uri = g_strdup (uri);
+       }
 }
 
 const gchar *
-ev_application_get_chooser_uri (EvApplication *application)
+ev_application_get_filechooser_uri (EvApplication       *application,
+                                   GtkFileChooserAction action)
 {
-       return application->last_chooser_uri;
+       if (action == GTK_FILE_CHOOSER_ACTION_OPEN) {
+               if (application->filechooser_open_uri)
+                       return application->filechooser_open_uri;
+       } else if (action == GTK_FILE_CHOOSER_ACTION_SAVE) {
+               if (application->filechooser_save_uri)
+                       return application->filechooser_save_uri;
+       }
+
+       return NULL;
 }
 
 void
@@ -1095,3 +1199,9 @@ ev_application_get_dot_dir (EvApplication   *application)
 {
        return application->dot_dir;
 }
+
+const gchar *
+ev_application_get_data_dir (EvApplication   *application)
+{
+       return application->data_dir;
+}