-#if DBUS_VERSION >= 60
- if (!org_freedesktop_DBus_request_name (driver_proxy,
- APPLICATION_SERVICE_NAME,
- DBUS_NAME_FLAG_DO_NOT_QUEUE,
- &request_name_result, &err)) {
- g_warning ("Service registration failed.");
- g_clear_error (&err);
- }
-#else
- if (!org_freedesktop_DBus_request_name (driver_proxy,
- APPLICATION_SERVICE_NAME,
- 0, &request_name_result, &err)) {
- g_warning ("Service registration failed.");
- g_clear_error (&err);
+ return TRUE;
+}
+
+#ifdef WITH_SMCLIENT
+
+static void
+smclient_save_state_cb (EggSMClient *client,
+ GKeyFile *state_file,
+ EvApplication *application)
+{
+ if (!application->uri)
+ return;
+
+ g_key_file_set_string (state_file, "Evince", "uri", application->uri);
+}
+
+static void
+smclient_quit_cb (EggSMClient *client,
+ EvApplication *application)
+{
+ ev_application_shutdown (application);
+}
+#endif /* WITH_SMCLIENT */
+
+static void
+ev_application_init_session (EvApplication *application)
+{
+#ifdef WITH_SMCLIENT
+ application->smclient = egg_sm_client_get ();
+ g_signal_connect (application->smclient, "save_state",
+ G_CALLBACK (smclient_save_state_cb),
+ application);
+ g_signal_connect (application->smclient, "quit",
+ G_CALLBACK (smclient_quit_cb),
+ application);
+#endif
+}
+
+/**
+ * ev_display_open_if_needed:
+ * @name: the name of the display to be open if it's needed.
+ *
+ * Search among all the open displays if any of them have the same name as the
+ * passed name. If the display isn't found it tries the open it.
+ *
+ * Returns: a #GdkDisplay of the display with the passed name.
+ */
+static GdkDisplay *
+ev_display_open_if_needed (const gchar *name)
+{
+ GSList *displays;
+ GSList *l;
+ GdkDisplay *display = NULL;
+
+ displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
+
+ for (l = displays; l != NULL; l = l->next) {
+ const gchar *display_name = gdk_display_get_name ((GdkDisplay *) l->data);
+
+ if (g_ascii_strcasecmp (display_name, name) == 0) {
+ display = l->data;
+ break;
+ }