X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=inline;f=shell%2Fev-daemon.c;h=fa9d506db83ee6b3e32ca7451583952a8df17908;hb=38c1b9aab8bfb41de6dc07df26fd6743a63ea015;hp=6ecd48c1f8af1b470ebe1b70d62c14ee03110214;hpb=b318b653030975b9aef90fc78feccd71d58da373;p=evince.git diff --git a/shell/ev-daemon.c b/shell/ev-daemon.c index 6ecd48c1..fa9d506d 100644 --- a/shell/ev-daemon.c +++ b/shell/ev-daemon.c @@ -1,4 +1,4 @@ -/* ev-metadata.c +/* ev-daemon.c * this file is part of evince, a gnome document viewer * * Copyright (C) 2009 Carlos Garcia Campos @@ -35,6 +35,8 @@ #define EV_DBUS_DAEMON_INTERFACE_NAME "org.gnome.evince.Daemon" #define EV_DBUS_DAEMON_OBJECT_PATH "/org/gnome/evince/Daemon" +#define EV_DBUS_WINDOW_INTERFACE_NAME "org.gnome.evince.Window" + #define DAEMON_TIMEOUT (30) /* seconds */ #define LOG g_printerr @@ -47,6 +49,7 @@ typedef struct { gchar *dbus_name; gchar *uri; guint watch_id; + guint loaded_id; } EvDoc; static void @@ -111,101 +114,6 @@ ev_daemon_maybe_start_killtimer (gpointer data) data); } -static gboolean -convert_metadata (const gchar *metadata) -{ - GFile *file; - char *argv[3]; - gint exit_status; - GFileAttributeInfoList *namespaces; - gboolean supported = FALSE; - GError *error = NULL; - gboolean retval; - - /* If metadata is not supported for a local file - * is likely because and old gvfs version is running. - */ - file = g_file_new_for_path (metadata); - namespaces = g_file_query_writable_namespaces (file, NULL, NULL); - if (namespaces) { - gint i; - - for (i = 0; i < namespaces->n_infos; i++) { - if (strcmp (namespaces->infos[i].name, "metadata") == 0) { - supported = TRUE; - break; - } - } - g_file_attribute_info_list_unref (namespaces); - } - if (!supported) { - g_warning ("GVFS metadata not supported. " - "Evince will run without metadata support.\n"); - g_object_unref (file); - return FALSE; - } - g_object_unref (file); - - argv[0] = g_build_filename (LIBEXECDIR, "evince-convert-metadata", NULL); - argv[1] = (char *) metadata; - argv[2] = NULL; - - retval = g_spawn_sync (NULL /* wd */, argv, NULL /* env */, - 0, NULL, NULL, NULL, NULL, - &exit_status, &error); - g_free (argv[0]); - - if (!retval) { - g_printerr ("Error migrating metadata: %s\n", error->message); - g_error_free (error); - } - - return retval && WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 0; -} - -static void -ev_migrate_metadata (void) -{ - gchar *updated; - gchar *metadata; - gchar *dot_dir; - const gchar *userdir; - - userdir = g_getenv ("GNOME22_USER_DIR"); - if (userdir) { - dot_dir = g_build_filename (userdir, "evince", NULL); - } else { - dot_dir = g_build_filename (g_get_home_dir (), - ".gnome2", - "evince", - NULL); - } - - updated = g_build_filename (dot_dir, "migrated-to-gvfs", NULL); - if (g_file_test (updated, G_FILE_TEST_EXISTS)) { - /* Already migrated */ - g_free (updated); - g_free (dot_dir); - return; - } - - metadata = g_build_filename (dot_dir, "ev-metadata.xml", NULL); - if (g_file_test (metadata, G_FILE_TEST_EXISTS)) { - if (convert_metadata (metadata)) { - gint fd; - - fd = g_creat (updated, 0600); - if (fd != -1) { - close (fd); - } - } - } - - g_free (dot_dir); - g_free (updated); - g_free (metadata); -} - static gboolean spawn_evince (const gchar *uri) { @@ -285,6 +193,23 @@ process_pending_invocations (const gchar *uri, g_hash_table_remove (pending_invocations, uri); } +static void +document_loaded_cb (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + EvDoc *doc) +{ + const gchar *uri; + + g_variant_get (parameters, "(&s)", &uri); + if (strcmp (uri, doc->uri) == 0) + process_pending_invocations (uri, sender_name); + g_dbus_connection_signal_unsubscribe (connection, doc->loaded_id); +} + static void method_call_cb (GDBusConnection *connection, const gchar *sender, @@ -317,8 +242,17 @@ method_call_cb (GDBusConnection *connection, doc = g_new (EvDoc, 1); doc->dbus_name = g_strdup (sender); doc->uri = g_strdup (uri); - process_pending_invocations (doc->uri, doc->dbus_name); + doc->loaded_id = g_dbus_connection_signal_subscribe (connection, + doc->dbus_name, + EV_DBUS_WINDOW_INTERFACE_NAME, + "DocumentLoaded", + NULL, + NULL, + 0, + (GDBusSignalCallback) document_loaded_cb, + doc, + NULL); doc->watch_id = g_bus_watch_name_on_connection (connection, sender, G_BUS_NAME_WATCHER_FLAGS_NONE, @@ -466,8 +400,6 @@ name_acquired_cb (GDBusConnection *connection, const gchar *name, gpointer user_data) { - ev_migrate_metadata (); - ev_daemon_maybe_start_killtimer (user_data); }