[evince] shell: Use gdbus-codegen for the org.gnome.evince.Application interface
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] shell: Use gdbus-codegen for the org.gnome.evince.Application interface
- Date: Tue, 7 Aug 2012 10:01:45 +0000 (UTC)
commit c9aada8d186d22913abed6b8c3e60da0bfd4e8af
Author: Christian Persch <chpe gnome org>
Date: Sun Jun 10 16:05:59 2012 +0200
shell: Use gdbus-codegen for the org.gnome.evince.Application interface
configure.ac | 6 ++
shell/Makefile.am | 19 ++++-
shell/ev-application.c | 223 +++++++++++++++++++++++-------------------------
shell/ev-gdbus.xml | 15 +++
4 files changed, 144 insertions(+), 119 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index a721888..13b9a8a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -208,6 +208,12 @@ if test -z "$XMLLINT"; then
AC_MSG_ERROR([xmllint not found])
fi
+AC_ARG_VAR([GDBUS_CODEGEN],[the gdbus-codegen programme])
+AC_PATH_PROG([GDBUS_CODEGEN],[gdbus-codegen],[])
+if test -z "$GDBUS_CODEGEN"; then
+ AC_MSG_ERROR([gdbus-codegen not found])
+fi
+
# *********
# SM client
# *********
diff --git a/shell/Makefile.am b/shell/Makefile.am
index b730eb3..02003ad 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -99,6 +99,10 @@ evince_SOURCES += \
ev-media-player-keys.c \
ev-media-player-keys.h \
$(NULL)
+nodist_evince_SOURCES += \
+ ev-gdbus-generated.c \
+ ev-gdbus-generated.h \
+ $(NULL)
endif
evince_LDFLAGS = $(AM_LDFLAGS)
@@ -132,6 +136,10 @@ BUILT_SOURCES = \
ev-resources.c
if ENABLE_DBUS
+BUILT_SOURCES += ev-gdbus-generated.c ev-gdbus-generated.h
+endif
+
+if ENABLE_DBUS
evinced_SOURCES = \
ev-daemon.c \
$(NULL)
@@ -153,7 +161,8 @@ EXTRA_DIST = \
evince-icon.rc \
evince-ui.xml \
evince-toolbar.xml \
- evince.gresource.xml
+ evince.gresource.xml \
+ ev-gdbus.xml
ev-marshal.h: $(srcdir)/ev-marshal.list
$(AM_V_GEN)$(GLIB_GENMARSHAL) --prefix=ev_marshal $(srcdir)/ev-marshal.list --header > ev-marshal.h
@@ -165,6 +174,14 @@ ev-marshal.c: $(srcdir)/ev-marshal.list
ev-resources.c: evince.gresource.xml Makefile $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies --sourcedir $(srcdir) $(srcdir)/evince.gresource.xml)
$(AM_V_GEN) XMLLINT=$(XMLLINT) $(GLIB_COMPILE_RESOURCES) --target $@ --sourcedir $(srcdir) --generate-source --c-name ev $<
+ev-gdbus-generated.c ev-gdbus-generated.h: ev-gdbus.xml Makefile
+ $(AM_V_GEN) $(GDBUS_CODEGEN) \
+ --interface-prefix=org.gnome.evince \
+ --c-namespace=Ev \
+ --c-generate-object-manager \
+ --generate-c-code ev-gdbus-generated \
+ $<
+
DISTCLEANFILES = $(BUILT_SOURCES)
-include $(top_srcdir)/git.mk
diff --git a/shell/ev-application.c b/shell/ev-application.c
index 34d67f5..53797ac 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -46,6 +46,7 @@
#include "ev-stock-icons.h"
#ifdef ENABLE_DBUS
+#include "ev-gdbus-generated.h"
#include "ev-media-player-keys.h"
#endif /* ENABLE_DBUS */
@@ -57,8 +58,8 @@ struct _EvApplication {
gchar *dot_dir;
#ifdef ENABLE_DBUS
- GDBusConnection *connection;
- guint registration_id;
+ GDBusConnection *connection;
+ EvEvinceApplication *skeleton;
EvMediaPlayerKeys *keys;
gboolean doc_registered;
#endif
@@ -636,6 +637,9 @@ ev_application_open_uri_in_window (EvApplication *application,
GdkWindow *gdk_window;
#endif
+ if (uri == NULL)
+ uri = application->uri;
+
if (screen) {
ev_stock_icons_set_screen (screen);
gtk_window_set_screen (GTK_WINDOW (ev_window), screen);
@@ -763,115 +767,97 @@ ev_application_open_window (EvApplication *application,
}
#ifdef ENABLE_DBUS
-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_get_window_list_cb (EvEvinceApplication *object,
+ GDBusMethodInvocation *invocation,
+ EvApplication *application)
{
- EvApplication *application = EV_APPLICATION (user_data);
- GList *windows, *l;
- guint timestamp;
- GVariantIter *iter;
- const gchar *key;
- GVariant *value;
- GdkDisplay *display = NULL;
- int screen_number = 0;
- EvLinkDest *dest = NULL;
- EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL;
- const gchar *search_string = NULL;
- GdkScreen *screen = NULL;
-
- if (g_strcmp0 (method_name, "Reload") == 0) {
- g_variant_get (parameters, "(a{sv}u)", &iter, ×tamp);
-
- while (g_variant_iter_loop (iter, "{&sv}", &key, &value)) {
- if (strcmp (key, "display") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
- display = ev_display_open_if_needed (g_variant_get_string (value, NULL));
- } else if (strcmp (key, "screen") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_INT32) {
- screen_number = g_variant_get_int32 (value);
- } else if (strcmp (key, "mode") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
- mode = g_variant_get_uint32 (value);
- } else if (strcmp (key, "page-label") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
- dest = ev_link_dest_new_page_label (g_variant_get_string (value, NULL));
- } else if (strcmp (key, "named-dest") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
- dest = ev_link_dest_new_named (g_variant_get_string (value, NULL));
- } else if (strcmp (key, "page-index") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
- dest = ev_link_dest_new_page (g_variant_get_uint32 (value));
- } else if (strcmp (key, "find-string") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
- search_string = g_variant_get_string (value, NULL);
- }
- }
- g_variant_iter_free (iter);
+ GList *windows, *l;
+ GPtrArray *paths;
- if (display != NULL &&
- screen_number >= 0 &&
- screen_number < gdk_display_get_n_screens (display))
- screen = gdk_display_get_screen (display, screen_number);
- else
- screen = gdk_screen_get_default ();
+ paths = g_ptr_array_new ();
- windows = ev_application_get_windows (application);
- for (l = windows; l != NULL; l = g_list_next (l)) {
- EvWindow *ev_window = EV_WINDOW (l->data);
-
- ev_application_open_uri_in_window (application, application->uri,
- ev_window,
- screen, dest, mode,
- search_string,
- timestamp);
- }
- g_list_free (windows);
+ windows = ev_application_get_windows (application);
+ for (l = windows; l; l = g_list_next (l)) {
+ EvWindow *window = (EvWindow *)l->data;
- if (dest)
- g_object_unref (dest);
+ g_ptr_array_add (paths, (gpointer) ev_window_get_dbus_object_path (window));
+ }
+ g_list_free (windows);
- g_dbus_method_invocation_return_value (invocation, g_variant_new ("()"));
- } else if (g_strcmp0 (method_name, "GetWindowList") == 0) {
- GList *windows = ev_application_get_windows (application);
- GVariantBuilder builder;
- GList *l;
+ g_ptr_array_add (paths, NULL);
+ ev_evince_application_complete_get_window_list (object, invocation,
+ (const char * const *) paths->pdata);
- g_variant_builder_init (&builder, G_VARIANT_TYPE ("(ao)"));
- g_variant_builder_open (&builder, G_VARIANT_TYPE ("ao"));
+ g_ptr_array_free (paths, TRUE);
- for (l = windows; l; l = g_list_next (l)) {
- EvWindow *window = (EvWindow *)l->data;
+ return TRUE;
+}
- g_variant_builder_add (&builder, "o", ev_window_get_dbus_object_path (window));
- }
+static gboolean
+handle_reload_cb (EvEvinceApplication *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *args,
+ guint timestamp,
+ EvApplication *application)
+{
+ GList *windows, *l;
+ GVariantIter iter;
+ const gchar *key;
+ GVariant *value;
+ GdkDisplay *display = NULL;
+ int screen_number = 0;
+ EvLinkDest *dest = NULL;
+ EvWindowRunMode mode = EV_WINDOW_MODE_NORMAL;
+ const gchar *search_string = NULL;
+ GdkScreen *screen = NULL;
+
+ g_variant_iter_init (&iter, args);
+
+ while (g_variant_iter_loop (&iter, "{&sv}", &key, &value)) {
+ if (strcmp (key, "display") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+ display = ev_display_open_if_needed (g_variant_get_string (value, NULL));
+ } else if (strcmp (key, "screen") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_INT32) {
+ screen_number = g_variant_get_int32 (value);
+ } else if (strcmp (key, "mode") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
+ mode = g_variant_get_uint32 (value);
+ } else if (strcmp (key, "page-label") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+ dest = ev_link_dest_new_page_label (g_variant_get_string (value, NULL));
+ } else if (strcmp (key, "named-dest") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+ dest = ev_link_dest_new_named (g_variant_get_string (value, NULL));
+ } else if (strcmp (key, "page-index") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_UINT32) {
+ dest = ev_link_dest_new_page (g_variant_get_uint32 (value));
+ } else if (strcmp (key, "find-string") == 0 && g_variant_classify (value) == G_VARIANT_CLASS_STRING) {
+ search_string = g_variant_get_string (value, NULL);
+ }
+ }
- g_variant_builder_close (&builder);
- g_list_free (windows);
+ if (display != NULL &&
+ screen_number >= 0 &&
+ screen_number < gdk_display_get_n_screens (display))
+ screen = gdk_display_get_screen (display, screen_number);
+ else
+ screen = gdk_screen_get_default ();
+
+ windows = ev_application_get_windows (application);
+ for (l = windows; l != NULL; l = g_list_next (l)) {
+ EvWindow *ev_window = EV_WINDOW (l->data);
+
+ ev_application_open_uri_in_window (application, NULL,
+ ev_window,
+ screen, dest, mode,
+ search_string,
+ timestamp);
+ }
+ g_list_free (windows);
- g_dbus_method_invocation_return_value (invocation, g_variant_builder_end (&builder));
- }
-}
+ if (dest)
+ g_object_unref (dest);
-static const char introspection_xml[] =
- "<node>"
- "<interface name='org.gnome.evince.Application'>"
- "<method name='Reload'>"
- "<arg type='a{sv}' name='args' direction='in'/>"
- "<arg type='u' name='timestamp' direction='in'/>"
- "</method>"
- "<method name='GetWindowList'>"
- "<arg type='ao' name='window_list' direction='out'/>"
- "</method>"
- "</interface>"
- "</node>";
-
-static const GDBusInterfaceVTable interface_vtable = {
- method_call_cb,
- NULL,
- NULL
-};
+ ev_evince_application_complete_reload (object, invocation);
-static GDBusNodeInfo *introspection_data;
+ return TRUE;
+}
#endif /* ENABLE_DBUS */
void
@@ -1047,19 +1033,15 @@ ev_application_shutdown (EvApplication *application)
g_object_unref (application->keys);
application->keys = NULL;
}
- if (application->registration_id != 0) {
- g_dbus_connection_unregister_object (application->connection,
- application->registration_id);
- application->registration_id = 0;
+ if (application->skeleton != NULL) {
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (application->skeleton));
+ g_object_unref (application->skeleton);
+ application->skeleton = NULL;
}
if (application->connection != NULL) {
g_object_unref (application->connection);
application->connection = NULL;
}
- if (introspection_data) {
- g_dbus_node_info_ref (introspection_data);
- introspection_data = NULL;
- }
#endif /* ENABLE_DBUS */
g_free (application->dot_dir);
@@ -1095,17 +1077,22 @@ ev_application_init (EvApplication *ev_application)
#ifdef ENABLE_DBUS
ev_application->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
if (ev_application->connection != NULL) {
- introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
- g_assert (introspection_data != NULL);
-
- ev_application->registration_id =
- g_dbus_connection_register_object (ev_application->connection,
- APPLICATION_DBUS_OBJECT_PATH,
- introspection_data->interfaces[0],
- &interface_vtable,
- ev_application, NULL,
- &error);
- if (ev_application->registration_id == 0) {
+ EvEvinceApplication *skeleton;
+
+ skeleton = ev_evince_application_skeleton_new ();
+ if (g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (skeleton),
+ ev_application->connection,
+ APPLICATION_DBUS_OBJECT_PATH,
+ &error)) {
+ ev_application->skeleton = skeleton;
+ g_signal_connect (skeleton, "handle-get-window-list",
+ G_CALLBACK (handle_get_window_list_cb),
+ ev_application);
+ g_signal_connect (skeleton, "handle-reload",
+ G_CALLBACK (handle_reload_cb),
+ ev_application);
+ } else {
+ g_object_unref (skeleton);
g_printerr ("Failed to register bus object: %s\n", error->message);
g_error_free (error);
}
diff --git a/shell/ev-gdbus.xml b/shell/ev-gdbus.xml
new file mode 100644
index 0000000..e6af0f3
--- /dev/null
+++ b/shell/ev-gdbus.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Introspection 0.1//EN"
+ "http://www.freedesktop.org/software/dbus/introspection.dtd">
+<node>
+ <interface name='org.gnome.evince.Application'>
+ <annotation name="org.gtk.GDBus.C.Name" value="EvinceApplication" />
+ <method name='Reload'>
+ <arg type='a{sv}' name='args' direction='in'/>
+ <arg type='u' name='timestamp' direction='in'/>
+ </method>
+ <method name='GetWindowList'>
+ <arg type='ao' name='window_list' direction='out'/>
+ </method>
+ </interface>
+</node>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]