#endif
#include "totem-scrsaver.h"
+
+#ifdef WITH_SMCLIENT
#include "eggsmclient.h"
+#endif
#include "ev-application.h"
#include "ev-document-factory.h"
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;
g_free (uri_list);
}
+#ifdef ENABLE_DBUS
static void
ev_application_save_session_crashed (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,
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,
} else {
return FALSE;
}
- } else {
+ } else
+#endif /* ENABLE_DBUS */
return FALSE;
- }
uri_list = g_key_file_get_string_list (state_file,
"Evince",
return TRUE;
}
+#ifdef WITH_SMCLIENT
+
static void
smclient_save_state_cb (EggSMClient *client,
GKeyFile *state_file,
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),
g_signal_connect (application->smclient, "quit",
G_CALLBACK (smclient_quit_cb),
application);
+#endif
}
/**
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);
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));
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);
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;
{
gint i;
const gchar *home_dir;
+ gchar *toolbar_path;
ev_application->dot_dir = g_build_filename (g_get_home_dir (),
".gnome2",
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 ();
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
}
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
{
return application->dot_dir;
}
+
+const gchar *
+ev_application_get_data_dir (EvApplication *application)
+{
+ return application->data_dir;
+}