diff options
-rw-r--r-- | shell/ev-gdbus.xml | 17 | ||||
-rw-r--r-- | shell/ev-window.c | 202 |
2 files changed, 71 insertions, 148 deletions
diff --git a/shell/ev-gdbus.xml b/shell/ev-gdbus.xml index b0f9a050..e9d92ee5 100644 --- a/shell/ev-gdbus.xml +++ b/shell/ev-gdbus.xml @@ -12,5 +12,22 @@ <arg type='ao' name='window_list' direction='out'/> </method> </interface> + <interface name='org.mate.atril.Window'> + <annotation name="org.gtk.GDBus.C.Name" value="AtrilWindow" /> + <method name='SyncView'> + <arg type='s' name='source_file' direction='in'/> + <arg type='(ii)' name='source_point' direction='in'/> + <arg type='u' name='timestamp' direction='in'/> + </method> + <signal name='SyncSource'> + <arg type='s' name='source_file' direction='out'/> + <arg type='(ii)' name='source_point' direction='out'/> + <arg type='u' name='timestamp' direction='out'/> + </signal> + <signal name='Closed'/> + <signal name='DocumentLoaded'> + <arg type='s' name='uri' direction='out'/> + </signal> + </interface> </node> diff --git a/shell/ev-window.c b/shell/ev-window.c index a3387df0..16685012 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -99,6 +99,7 @@ #include "ev-bookmark-action.h" #ifdef ENABLE_DBUS +#include "ev-gdbus-generated.h" #include "ev-media-player-keys.h" #endif /* ENABLE_DBUS */ @@ -225,8 +226,8 @@ struct _EvWindowPrivate { GSettings *lockdown_settings; #ifdef ENABLE_DBUS /* DBus */ - guint dbus_object_id; - gchar *dbus_object_path; + EvAtrilWindow *skeleton; + gchar *dbus_object_path; #endif /* Caret navigation */ @@ -5970,16 +5971,13 @@ ev_window_dispose (GObject *object) } #ifdef ENABLE_DBUS - if (priv->dbus_object_id > 0) { - ev_window_emit_closed (window); - g_dbus_connection_unregister_object (ev_application_get_dbus_connection (EV_APP), - priv->dbus_object_id); - priv->dbus_object_id = 0; - } - - if (priv->dbus_object_path) { - g_free (priv->dbus_object_path); - priv->dbus_object_path = NULL; + if (priv->skeleton != NULL) { + ev_window_emit_closed (window); + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (priv->skeleton)); + g_object_unref (priv->skeleton); + priv->skeleton = NULL; + g_free (priv->dbus_object_path); + priv->dbus_object_path = NULL; } #endif /* ENABLE_DBUS */ @@ -7504,17 +7502,11 @@ static void ev_window_sync_source (EvWindow *window, EvSourceLink *link) { - GDBusConnection *connection; - GError *error = NULL; guint32 timestamp; gchar *uri_input; GFile *input_gfile; - if (window->priv->dbus_object_id <= 0) - return; - - connection = ev_application_get_dbus_connection (EV_APP); - if (!connection) + if (window->priv->skeleton == NULL) return; timestamp = gtk_get_current_event_time (); @@ -7540,144 +7532,57 @@ ev_window_sync_source (EvWindow *window, uri_input = g_file_get_uri (input_gfile); g_object_unref (input_gfile); - g_dbus_connection_emit_signal (connection, - NULL, - window->priv->dbus_object_path, - EV_WINDOW_DBUS_INTERFACE, - "SyncSource", - g_variant_new ("(s(ii)u)", - uri_input, - link->line, - link->col, - timestamp), - &error); + ev_atril_window_emit_sync_source (window->priv->skeleton, + uri_input, + g_variant_new ("(ii)", link->line, link->col), + timestamp); g_free (uri_input); - if (error) { - g_printerr ("Failed to emit DBus signal SyncSource: %s\n", - error->message); - g_error_free (error); - } } static void ev_window_emit_closed (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) + if (window->priv->skeleton == NULL) return; - g_dbus_connection_emit_signal (connection, - NULL, - window->priv->dbus_object_path, - EV_WINDOW_DBUS_INTERFACE, - "Closed", - NULL, - &error); - if (error) { - g_printerr ("Failed to emit DBus signal Closed: %s\n", - error->message); - g_error_free (error); - - return; - } + ev_atril_window_emit_closed (window->priv->skeleton); /* If this is the last window call g_dbus_connection_flush_sync() * to make sure the signal is emitted. */ if (ev_application_get_n_windows (EV_APP) == 1) - g_dbus_connection_flush_sync (connection, NULL, NULL); + g_dbus_connection_flush_sync (ev_application_get_dbus_connection (EV_APP), 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); + if (window->priv->skeleton == NULL) + return; - return; - } + ev_atril_window_emit_document_loaded (window->priv->skeleton, window->priv->uri); } -static void -method_call_cb (GDBusConnection *connection, - const gchar *sender, - const gchar *object_path, - const gchar *interface_name, - const gchar *method_name, - GVariant *parameters, - GDBusMethodInvocation *invocation, - gpointer user_data) +static gboolean +handle_sync_view_cb (EvAtrilWindow *object, + GDBusMethodInvocation *invocation, + const gchar *source_file, + GVariant *source_point, + guint timestamp, + EvWindow *window) { - EvWindow *window = EV_WINDOW (user_data); - if (window->priv->document->iswebdocument == TRUE ) return; - - if (g_strcmp0 (method_name, "SyncView") != 0) - return; - if (window->priv->document && ev_document_has_synctex (window->priv->document)) { EvSourceLink link; - guint32 timestamp; - - g_variant_get (parameters, "(&s(ii)u)", &link.filename, &link.line, &link.col, ×tamp); + link.filename = (char *) source_file; + g_variant_get (source_point, "(ii)", &link.line, &link.col); ev_view_highlight_forward_search (EV_VIEW (window->priv->view), &link); gtk_window_present_with_time (GTK_WINDOW (window), timestamp); } - g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); -} - -static const char introspection_xml[] = - "<node>" - "<interface name='org.mate.atril.Window'>" - "<method name='SyncView'>" - "<arg type='s' name='source_file' direction='in'/>" - "<arg type='(ii)' name='source_point' direction='in'/>" - "<arg type='u' name='timestamp' direction='in'/>" - "</method>" - "<signal name='SyncSource'>" - "<arg type='s' name='source_file' direction='out'/>" - "<arg type='(ii)' name='source_point' direction='out'/>" - "<arg type='u' name='timestamp' direction='out'/>" - "</signal>" - "<signal name='Closed'/>" - "<signal name='DocumentLoaded'>" - "<arg type='s' name='uri' direction='out'/>" - "</signal>" - "</interface>" - "</node>"; - -static const GDBusInterfaceVTable interface_vtable = { - method_call_cb, - NULL, - NULL -}; + ev_atril_window_complete_sync_view (object, invocation); -static GDBusNodeInfo *introspection_data; + return TRUE; +} #endif /* ENABLE_DBUS */ static void @@ -7706,30 +7611,31 @@ ev_window_init (EvWindow *ev_window) #ifdef ENABLE_DBUS connection = ev_application_get_dbus_connection (EV_APP); if (connection) { - if (!introspection_data) { - introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, &error); - if (error) g_warning ("%s\n", error->message); - } - g_assert (introspection_data != NULL); - - ev_window->priv->dbus_object_path = g_strdup_printf (EV_WINDOW_DBUS_OBJECT_PATH, window_id++); - ev_window->priv->dbus_object_id = - g_dbus_connection_register_object (connection, - ev_window->priv->dbus_object_path, - introspection_data->interfaces[0], - &interface_vtable, - ev_window, NULL, - &error); - if (ev_window->priv->dbus_object_id == 0) { + EvAtrilWindow *skeleton; + + ev_window->priv->dbus_object_path = g_strdup_printf (EV_WINDOW_DBUS_OBJECT_PATH, window_id++); + + skeleton = ev_atril_window_skeleton_new (); + if (g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (skeleton), + connection, + ev_window->priv->dbus_object_path, + &error)) { + ev_window->priv->skeleton = skeleton; + g_signal_connect (skeleton, "handle-sync-view", + G_CALLBACK (handle_sync_view_cb), + ev_window); + } else { g_printerr ("Failed to register bus object %s: %s\n", - ev_window->priv->dbus_object_path, error->message); + ev_window->priv->dbus_object_path, error->message); g_error_free (error); - g_free (ev_window->priv->dbus_object_path); - ev_window->priv->dbus_object_path = NULL; - error = NULL; + g_free (ev_window->priv->dbus_object_path); + ev_window->priv->dbus_object_path = NULL; + error = NULL; + + g_object_unref (skeleton); + ev_window->priv->skeleton = NULL; } } - #endif /* ENABLE_DBUS */ ev_window->priv->model = ev_document_model_new (); |