[gimp] Bug 622934 - Migrate from dbus-glib to glib's GDBus



commit c4460e846b55304afd262add2ca61dd69bf468a5
Author: Michael Natterer <mitch gimp org>
Date:   Fri May 24 23:25:47 2013 +0200

    Bug 622934 - Migrate from dbus-glib to glib's GDBus
    
    Drop the glib-dbus dependency and port stuff to GDBus. Use it
    unconditionally if not on Windows or OSX. It seels to work just like
    before but I have no idea if everything is really correct.

 INSTALL                   |   20 ++----
 app/gui/.gitignore        |    3 +-
 app/gui/Makefile.am       |   16 +++--
 app/gui/dbus-service.xml  |    5 +-
 app/gui/gimpdbusservice.c |  144 +++++++++++++++++++--------------------
 app/gui/gimpdbusservice.h |   38 ++++-------
 app/gui/gui-unique.c      |  162 ++++++++++++++++++++++++---------------------
 app/unique.c              |    4 +-
 configure.ac              |   39 +++--------
 9 files changed, 201 insertions(+), 230 deletions(-)
---
diff --git a/INSTALL b/INSTALL
index e24780b..26083b1 100644
--- a/INSTALL
+++ b/INSTALL
@@ -57,10 +57,7 @@ header files installed.
      and fontconfig 2.2.0 or newer. Older versions are known to have
      bugs that seriously affect the stability of GIMP.
 
-  7. We use dbus-glib if available. Grab it from
-     http://dbus.freedesktop.org/releases/dbus-glib/
-
-  8. Access of remote files is implemented in the URI plug-in. There
+  7. Access of remote files is implemented in the URI plug-in. There
      are several possible implementations for this. The implementation
      used is determined when you configure GIMP. By default the
      GIO/GVfs backend is used. If you don't have GVfs support on your
@@ -68,27 +65,27 @@ header files installed.
      configure. The configure script will then try to detect another
      method for accessing remote files.
 
-  9. The file-compressor plug-in requires zlib, libbzip2, and liblzma to
+  8. The file-compressor plug-in requires zlib, libbzip2, and liblzma to
      be installed. All these libraries are required dependencies.
 
- 10. You may want to install other third party libraries or programs
+  9. You may want to install other third party libraries or programs
      that are needed for some of the available plug-ins. We recommend to
      check that the following libraries are installed: lcms, libpng,
      libjpeg, libpoppler, libtiff, webkit, libmng, librsvg, libwmf,
      libgs (Ghostscript), libaa and libjasper.
 
- 11. The Python extension requires Python development headers to be
+ 10. The Python extension requires Python development headers to be
      present. You will also need PyGTK and the respective development
      headers.
 
- 12. Configure GIMP by running the `configure' script. You may want
+ 11. Configure GIMP by running the `configure' script. You may want
      to pass some options to it, see below.
 
- 13. Build GIMP by running `make'. The use of GNU make is recommended.
+ 12. Build GIMP by running `make'. The use of GNU make is recommended.
      If you need to tweak the build to make it work with other flavours
      of make, we'd appreciate if you'd send us a patch with the changes.
 
- 14. Install GIMP by running `make install'. In order to avoid clashes
+ 13. Install GIMP by running `make install'. In order to avoid clashes
      with other versions of GIMP, we install a binary called gimp-2.8.
      By default there's also a link created so that you can type 'gimp'
      to start gimp-2.8.
@@ -204,9 +201,6 @@ These are:
   --without-alsa.  If you don't want to compile ALSA support into the
      MIDI input controller module, you can use the --without-alsa option.
 
-  --without-dbus.  If you want to build without D-Bus support, you can
-     pass --without-dbus to the configure script.
-
   --without-linux-input.  If you don't want to compile the Linux Input
      controller module, you can use the --without-linux-input option.
 
diff --git a/app/gui/.gitignore b/app/gui/.gitignore
index 775ded6..f746fa9 100644
--- a/app/gui/.gitignore
+++ b/app/gui/.gitignore
@@ -3,6 +3,7 @@
 /.deps
 /.libs
 /*.lo
-/gimpdbusservice-glue.h
+/gimpdbusservice-generated.c
+/gimpdbusservice-generated.h
 /libappgui.a
 /libappgui.la
diff --git a/app/gui/Makefile.am b/app/gui/Makefile.am
index 10f9c32..fe75010 100644
--- a/app/gui/Makefile.am
+++ b/app/gui/Makefile.am
@@ -9,6 +9,7 @@ INCLUDES = \
        -I$(top_srcdir)         \
        -I$(top_builddir)/app   \
        -I$(top_srcdir)/app     \
+       $(GIO_UNIX_CFLAGS)      \
        $(GEGL_CFLAGS)          \
        $(GTK_CFLAGS)           \
        $(DBUS_GLIB_CFLAGS)     \
@@ -41,7 +42,9 @@ libappgui_a_sources = \
        ige-mac-menu.c          \
        ige-mac-menu.h
 
-libappgui_a_built_sources = gimpdbusservice-glue.h 
+libappgui_a_built_sources = \
+       gimpdbusservice-generated.c     \
+       gimpdbusservice-generated.h
 
 libappgui_a_SOURCES = $(libappgui_a_built_sources) $(libappgui_a_sources)
 
@@ -52,10 +55,13 @@ EXTRA_DIST = \
 # rules to generate built sources
 #
 # setup autogeneration dependencies
-gen_sources = gimpdbusservice-glue.h
+gen_sources = $(libappgui_a_built_sources)
 CLEANFILES = $(gen_sources)
 
-$(srcdir)/gimpdbusservice.c: gimpdbusservice-glue.h
+$(srcdir)/gimpdbusservice.c: $(libappgui_a_built_sources)
 
-gimpdbusservice-glue.h: $(srcdir)/dbus-service.xml
-       $(DBUS_BINDING_TOOL) --mode=glib-server --prefix=gimp $< > $(@F)
+$(libappgui_a_built_sources): $(srcdir)/dbus-service.xml
+       $(GDBUS_CODEGEN) --interface-prefix org.gimp.GIMP. \
+                        --generate-c-code gimpdbusservice-generated \
+                        --c-namespace GimpDBusService \
+                        $(srcdir)/dbus-service.xml
diff --git a/app/gui/dbus-service.xml b/app/gui/dbus-service.xml
index 58af07b..9324ad6 100644
--- a/app/gui/dbus-service.xml
+++ b/app/gui/dbus-service.xml
@@ -1,12 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
-<node name="/org/gimp/GIMP/UI">
+<node>
 
   <interface name="org.gimp.GIMP.UI">
 
-    <annotation name="org.freedesktop.DBus.GLib.CSymbol"
-               value="gimp_dbus_service" />
-
     <method name="Open">
       <arg type="s" name="uri" direction="in" />
       <arg type="b" name="success" direction="out" />
diff --git a/app/gui/gimpdbusservice.c b/app/gui/gimpdbusservice.c
index 771664d..9e90c46 100644
--- a/app/gui/gimpdbusservice.c
+++ b/app/gui/gimpdbusservice.c
@@ -3,6 +3,7 @@
  *
  * GimpDBusService
  * Copyright (C) 2007, 2008 Sven Neumann <sven gimp org>
+ * Copyright (C) 2013       Michael Natterer <mitch gimp org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,11 +21,8 @@
 
 #include "config.h"
 
-#if HAVE_DBUS_GLIB
-
 #include <gegl.h>
 #include <gtk/gtk.h>
-#include <dbus/dbus-glib.h>
 
 #include "gui-types.h"
 
@@ -37,14 +35,7 @@
 #include "display/gimpdisplayshell.h"
 
 #include "gimpdbusservice.h"
-#include "gimpdbusservice-glue.h"
-
 
-enum
-{
-  OPENED,
-  LAST_SIGNAL
-};
 
 typedef struct
 {
@@ -53,32 +44,42 @@ typedef struct
 } OpenData;
 
 
-static void       gimp_dbus_service_class_init (GimpDBusServiceClass *klass);
+static void       gimp_dbus_service_ui_iface_init  (GimpDBusServiceUIIface *iface);
 
-static void       gimp_dbus_service_init           (GimpDBusService  *service);
-static void       gimp_dbus_service_dispose        (GObject          *object);
-static void       gimp_dbus_service_finalize       (GObject          *object);
+static void       gimp_dbus_service_dispose        (GObject               *object);
+static void       gimp_dbus_service_finalize       (GObject               *object);
 
-static void       gimp_dbus_service_gimp_opened    (Gimp             *gimp,
-                                                   const gchar      *uri,
-                                                   GimpDBusService  *service);
+static gboolean   gimp_dbus_service_activate       (GimpDBusServiceUI     *service,
+                                                    GDBusMethodInvocation *invocation);
+static gboolean   gimp_dbus_service_open           (GimpDBusServiceUI     *service,
+                                                    GDBusMethodInvocation *invocation,
+                                                    const gchar           *uri);
 
-static gboolean   gimp_dbus_service_queue_open     (GimpDBusService  *service,
-                                                    const gchar      *uri,
-                                                    gboolean          as_new);
+static gboolean   gimp_dbus_service_open_as_new    (GimpDBusServiceUI     *service,
+                                                    GDBusMethodInvocation *invocation,
+                                                    const gchar           *uri);
 
-static gboolean   gimp_dbus_service_open_idle      (GimpDBusService  *service);
-static OpenData * gimp_dbus_service_open_data_new  (GimpDBusService  *service,
-                                                    const gchar      *uri,
-                                                    gboolean          as_new);
-static void       gimp_dbus_service_open_data_free (OpenData         *data);
+static void       gimp_dbus_service_gimp_opened    (Gimp                  *gimp,
+                                                   const gchar           *uri,
+                                                   GimpDBusService       *service);
 
+static gboolean   gimp_dbus_service_queue_open     (GimpDBusService       *service,
+                                                    const gchar           *uri,
+                                                    gboolean               as_new);
 
-G_DEFINE_TYPE (GimpDBusService, gimp_dbus_service, G_TYPE_OBJECT)
+static gboolean   gimp_dbus_service_open_idle      (GimpDBusService       *service);
+static OpenData * gimp_dbus_service_open_data_new  (GimpDBusService       *service,
+                                                    const gchar           *uri,
+                                                    gboolean               as_new);
+static void       gimp_dbus_service_open_data_free (OpenData              *data);
 
-#define parent_class gimp_dbus_service_parent_class
 
-static guint gimp_dbus_service_signals[LAST_SIGNAL] = { 0 };
+G_DEFINE_TYPE_WITH_CODE (GimpDBusService, gimp_dbus_service,
+                         GIMP_DBUS_SERVICE_TYPE_UI_SKELETON,
+                         G_IMPLEMENT_INTERFACE (GIMP_DBUS_SERVICE_TYPE_UI,
+                                                gimp_dbus_service_ui_iface_init))
+
+#define parent_class gimp_dbus_service_parent_class
 
 
 static void
@@ -86,20 +87,8 @@ gimp_dbus_service_class_init (GimpDBusServiceClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  gimp_dbus_service_signals[OPENED] =
-    g_signal_new ("opened",
-                 G_TYPE_FROM_CLASS (klass),
-                  G_SIGNAL_RUN_FIRST,
-                  G_STRUCT_OFFSET (GimpDBusServiceClass, opened),
-                  NULL, NULL,
-                  g_cclosure_marshal_VOID__STRING,
-                  G_TYPE_NONE, 1, G_TYPE_STRING);
-
   object_class->dispose  = gimp_dbus_service_dispose;
   object_class->finalize = gimp_dbus_service_finalize;
-
-  dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
-                                   &dbus_glib_gimp_object_info);
 }
 
 static void
@@ -108,6 +97,14 @@ gimp_dbus_service_init (GimpDBusService *service)
   service->queue = g_queue_new ();
 }
 
+static void
+gimp_dbus_service_ui_iface_init (GimpDBusServiceUIIface *iface)
+{
+  iface->handle_activate    = gimp_dbus_service_activate;
+  iface->handle_open        = gimp_dbus_service_open;
+  iface->handle_open_as_new = gimp_dbus_service_open_as_new;
+}
+
 GObject *
 gimp_dbus_service_new (Gimp *gimp)
 {
@@ -160,53 +157,55 @@ gimp_dbus_service_finalize (GObject *object)
 }
 
 gboolean
-gimp_dbus_service_open (GimpDBusService  *service,
-                        const gchar      *uri,
-                        gboolean         *success,
-                        GError          **dbus_error)
+gimp_dbus_service_activate (GimpDBusServiceUI     *service,
+                            GDBusMethodInvocation *invocation)
 {
-  g_return_val_if_fail (GIMP_IS_DBUS_SERVICE (service), FALSE);
-  g_return_val_if_fail (uri != NULL, FALSE);
-  g_return_val_if_fail (success != NULL, FALSE);
+  Gimp *gimp = GIMP_DBUS_SERVICE (service)->gimp;
 
-  *success = gimp_dbus_service_queue_open (service, uri, FALSE);
+  /*  We want to be called again later in case that GIMP is not fully
+   *  started yet.
+   */
+  if (gimp_is_restored (gimp))
+    {
+      GimpObject *display;
+
+      display = gimp_container_get_first_child (gimp->displays);
+
+      if (display)
+        gimp_display_shell_present (gimp_display_get_shell (GIMP_DISPLAY (display)));
+    }
+
+  gimp_dbus_service_ui_complete_activate (service, invocation);
 
   return TRUE;
 }
 
 gboolean
-gimp_dbus_service_open_as_new (GimpDBusService  *service,
-                               const gchar      *uri,
-                               gboolean         *success,
-                               GError          **dbus_error)
+gimp_dbus_service_open (GimpDBusServiceUI     *service,
+                        GDBusMethodInvocation *invocation,
+                        const gchar           *uri)
 {
-  g_return_val_if_fail (GIMP_IS_DBUS_SERVICE (service), FALSE);
-  g_return_val_if_fail (uri != NULL, FALSE);
-  g_return_val_if_fail (success != NULL, FALSE);
+  gboolean success;
+
+  success = gimp_dbus_service_queue_open (GIMP_DBUS_SERVICE (service),
+                                          uri, FALSE);
 
-  *success = gimp_dbus_service_queue_open (service, uri, TRUE);
+  gimp_dbus_service_ui_complete_open (service, invocation, success);
 
   return TRUE;
 }
 
 gboolean
-gimp_dbus_service_activate (GimpDBusService  *service,
-                            GError          **dbus_error)
+gimp_dbus_service_open_as_new (GimpDBusServiceUI     *service,
+                               GDBusMethodInvocation *invocation,
+                               const gchar           *uri)
 {
-  GimpObject *display;
-
-  g_return_val_if_fail (GIMP_IS_DBUS_SERVICE (service), FALSE);
+  gboolean success;
 
-  /*  We want to be called again later in case that GIMP is not fully
-   *  started yet.
-   */
-  if (! gimp_is_restored (service->gimp))
-    return TRUE;
+  success = gimp_dbus_service_queue_open (GIMP_DBUS_SERVICE (service),
+                                          uri, TRUE);
 
-  display = gimp_container_get_first_child (service->gimp->displays);
-
-  if (display)
-    gimp_display_shell_present (gimp_display_get_shell (GIMP_DISPLAY (display)));
+  gimp_dbus_service_ui_complete_open_as_new (service, invocation, success);
 
   return TRUE;
 }
@@ -216,7 +215,7 @@ gimp_dbus_service_gimp_opened (Gimp            *gimp,
                               const gchar     *uri,
                               GimpDBusService *service)
 {
-  g_signal_emit (service, gimp_dbus_service_signals[OPENED], 0, uri);
+  g_signal_emit_by_name (service, "opened", uri);
 }
 
 /*
@@ -297,6 +296,3 @@ gimp_dbus_service_open_data_free (OpenData *data)
   g_free (data->uri);
   g_slice_free (OpenData, data);
 }
-
-
-#endif /* HAVE_DBUS_GLIB */
diff --git a/app/gui/gimpdbusservice.h b/app/gui/gimpdbusservice.h
index 388fc9f..e2a295a 100644
--- a/app/gui/gimpdbusservice.h
+++ b/app/gui/gimpdbusservice.h
@@ -3,6 +3,7 @@
  *
  * GimpDBusService
  * Copyright (C) 2007, 2008 Sven Neumann <sven gimp org>
+ * Copyright (C) 2013       Michael Natterer <mitch gimp org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,12 +22,16 @@
 #ifndef __GIMP_DBUS_SERVICE_H__
 #define __GIMP_DBUS_SERVICE_H__
 
-G_BEGIN_DECLS
 
+#include "gimpdbusservice-generated.h"
 
-#define GIMP_DBUS_SERVICE_NAME       "org.gimp.GIMP.UI"
-#define GIMP_DBUS_SERVICE_PATH       "/org/gimp/GIMP/UI"
-#define GIMP_DBUS_SERVICE_INTERFACE  "org.gimp.GIMP.UI"
+/* service name and path should really be org.gimp.GIMP and
+ * /org/gimp/GIMP and only the interface be called UI.
+ */
+#define GIMP_DBUS_SERVICE_NAME   "org.gimp.GIMP.UI"
+#define GIMP_DBUS_SERVICE_PATH   "/org/gimp/GIMP/UI"
+#define GIMP_DBUS_INTERFACE_NAME "org.gimp.GIMP.UI"
+#define GIMP_DBUS_INTERFACE_PATH "/org/gimp/GIMP/UI"
 
 
 #define GIMP_TYPE_DBUS_SERVICE            (gimp_dbus_service_get_type ())
@@ -42,7 +47,7 @@ typedef struct _GimpDBusServiceClass GimpDBusServiceClass;
 
 struct _GimpDBusService
 {
-  GObject  parent_instance;
+  GimpDBusServiceUISkeleton  parent_instance;
 
   Gimp    *gimp;
   GQueue  *queue;
@@ -51,30 +56,13 @@ struct _GimpDBusService
 
 struct _GimpDBusServiceClass
 {
-  GObjectClass  parent_class;
-
-  /*  signals  */
-  void (* opened) (GimpDBusService *service,
-                  const gchar     *uri);
+  GimpDBusServiceUISkeletonClass  parent_class;
 };
 
 
-GType     gimp_dbus_service_get_type    (void) G_GNUC_CONST;
-
-GObject * gimp_dbus_service_new         (Gimp            *gimp);
-
-gboolean  gimp_dbus_service_open        (GimpDBusService  *service,
-                                         const gchar      *uri,
-                                         gboolean         *success,
-                                         GError          **dbus_error);
-gboolean  gimp_dbus_service_open_as_new (GimpDBusService  *service,
-                                         const gchar      *uri,
-                                         gboolean         *success,
-                                         GError          **dbus_error);
-gboolean  gimp_dbus_service_activate    (GimpDBusService  *service,
-                                         GError          **dbus_error);
+GType     gimp_dbus_service_get_type (void) G_GNUC_CONST;
 
+GObject * gimp_dbus_service_new      (Gimp *gimp);
 
-G_END_DECLS
 
 #endif /* __GIMP_DBUS_SERVICE_H__ */
diff --git a/app/gui/gui-unique.c b/app/gui/gui-unique.c
index 072db7f..594009b 100644
--- a/app/gui/gui-unique.c
+++ b/app/gui/gui-unique.c
@@ -29,12 +29,6 @@
 #include <sys/param.h>
 #endif
 
-#if HAVE_DBUS_GLIB
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-#endif
-
 #include "gui/gui-types.h"
 
 #include "core/gimp.h"
@@ -48,27 +42,30 @@
 #include "gui-unique.h"
 
 
-#if HAVE_DBUS_GLIB
-static void  gui_dbus_service_init (Gimp *gimp);
-static void  gui_dbus_service_exit (void);
-
-static DBusGConnection *dbus_connection  = NULL;
-#endif
-
 #ifdef G_OS_WIN32
+
 static void  gui_unique_win32_init (Gimp *gimp);
 static void  gui_unique_win32_exit (void);
 
-static Gimp            *unique_gimp      = NULL;
-static HWND             proxy_window     = NULL;
-#endif
+static Gimp *unique_gimp  = NULL;
+static HWND  proxy_window = NULL;
+
+#elifdef GDK_WINDOWING_QUARTZ
 
-#ifdef GDK_WINDOWING_QUARTZ
 static void  gui_unique_mac_init (Gimp *gimp);
 static void  gui_unique_mac_exit (void);
 
-static Gimp            *unique_gimp      = NULL;
-AEEventHandlerUPP       open_document_callback_proc;
+static Gimp       *unique_gimp = NULL;
+AEEventHandlerUPP  open_document_callback_proc;
+
+#else
+
+static void  gui_dbus_service_init (Gimp *gimp);
+static void  gui_dbus_service_exit (void);
+
+static GDBusObjectManagerServer *dbus_manager = NULL;
+static guint                     dbus_name_id = 0;
+
 #endif
 
 
@@ -77,12 +74,10 @@ gui_unique_init (Gimp *gimp)
 {
 #ifdef G_OS_WIN32
   gui_unique_win32_init (gimp);
-#elif HAVE_DBUS_GLIB
-  gui_dbus_service_init (gimp);
-#endif
-
-#ifdef GDK_WINDOWING_QUARTZ
+#elifdef GDK_WINDOWING_QUARTZ
   gui_unique_mac_init (gimp);
+#else
+  gui_dbus_service_init (gimp);
 #endif
 }
 
@@ -91,58 +86,14 @@ gui_unique_exit (void)
 {
 #ifdef G_OS_WIN32
   gui_unique_win32_exit ();
-#elif HAVE_DBUS_GLIB
-  gui_dbus_service_exit ();
-#endif
-
-#ifdef GDK_WINDOWING_QUARTZ
+#elifdef GDK_WINDOWING_QUARTZ
   gui_unique_mac_exit ();
+#else
+  gui_dbus_service_exit ();
 #endif
 }
 
 
-#if HAVE_DBUS_GLIB
-
-static void
-gui_dbus_service_init (Gimp *gimp)
-{
-  GError  *error = NULL;
-
-  g_return_if_fail (GIMP_IS_GIMP (gimp));
-  g_return_if_fail (dbus_connection == NULL);
-
-  dbus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-
-  if (dbus_connection)
-    {
-      GObject *service = gimp_dbus_service_new (gimp);
-
-      dbus_bus_request_name (dbus_g_connection_get_connection (dbus_connection),
-                             GIMP_DBUS_SERVICE_NAME, 0, NULL);
-
-      dbus_g_connection_register_g_object (dbus_connection,
-                                           GIMP_DBUS_SERVICE_PATH, service);
-    }
-  else
-    {
-      g_printerr ("%s\n", error->message);
-      g_error_free (error);
-    }
-}
-
-static void
-gui_dbus_service_exit (void)
-{
-  if (dbus_connection)
-    {
-      dbus_g_connection_unref (dbus_connection);
-      dbus_connection = NULL;
-    }
-}
-
-#endif  /* HAVE_DBUS_GLIB */
-
-
 #ifdef G_OS_WIN32
 
 typedef struct
@@ -275,10 +226,7 @@ gui_unique_win32_exit (void)
   DestroyWindow (proxy_window);
 }
 
-#endif  /* G_OS_WIN32 */
-
-
-#ifdef GDK_WINDOWING_QUARTZ
+#elifdef GDK_WINDOWING_QUARTZ
 
 static gboolean
 gui_unique_mac_idle_open (gchar *data)
@@ -379,4 +327,66 @@ gui_unique_mac_exit (void)
   DisposeAEEventHandlerUPP(open_document_callback_proc);
 }
 
-#endif /* GDK_WINDOWING_QUARTZ */
+#else
+
+static void
+gui_dbus_bus_acquired (GDBusConnection *connection,
+                       const gchar     *name,
+                       Gimp            *gimp)
+{
+  GDBusObjectSkeleton *object;
+  GObject             *service;
+
+  /* this should use GIMP_DBUS_SERVICE_PATH, but that's historically wrong */
+  dbus_manager = g_dbus_object_manager_server_new ("/org/gimp/GIMP");
+
+  object = g_dbus_object_skeleton_new (GIMP_DBUS_INTERFACE_PATH);
+
+  service = gimp_dbus_service_new (gimp);
+  g_dbus_object_skeleton_add_interface (object,
+                                        G_DBUS_INTERFACE_SKELETON (service));
+  g_object_unref (service);
+
+  g_dbus_object_manager_server_export (dbus_manager, object);
+  g_object_unref (object);
+
+  g_dbus_object_manager_server_set_connection (dbus_manager, connection);
+}
+
+static void
+gui_dbus_name_acquired (GDBusConnection *connection,
+                        const gchar     *name,
+                        Gimp            *gimp)
+{
+}
+
+static void
+gui_dbus_name_lost (GDBusConnection *connection,
+                    const gchar     *name,
+                    Gimp            *gimp)
+{
+}
+
+static void
+gui_dbus_service_init (Gimp *gimp)
+{
+  g_return_if_fail (GIMP_IS_GIMP (gimp));
+  g_return_if_fail (dbus_name_id == 0);
+
+  dbus_name_id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                                 GIMP_DBUS_SERVICE_NAME,
+                                 G_BUS_NAME_OWNER_FLAGS_NONE,
+                                 (GBusAcquiredCallback) gui_dbus_bus_acquired,
+                                 (GBusNameAcquiredCallback) gui_dbus_name_acquired,
+                                 (GBusNameLostCallback) gui_dbus_name_lost,
+                                 gimp, NULL);
+}
+
+static void
+gui_dbus_service_exit (void)
+{
+  g_bus_unown_name (dbus_name_id);
+  g_object_unref (dbus_manager);
+}
+
+#endif
diff --git a/app/unique.c b/app/unique.c
index f7ef455..a134931 100644
--- a/app/unique.c
+++ b/app/unique.c
@@ -118,7 +118,7 @@ gimp_unique_dbus_open (const gchar **filenames,
                   result = g_dbus_connection_call_sync (connection,
                                                         GIMP_DBUS_SERVICE_NAME,
                                                         GIMP_DBUS_SERVICE_PATH,
-                                                        GIMP_DBUS_SERVICE_INTERFACE,
+                                                        GIMP_DBUS_INTERFACE_NAME,
                                                         method,
                                                         g_variant_new ("(s)",
                                                                        uri),
@@ -149,7 +149,7 @@ gimp_unique_dbus_open (const gchar **filenames,
           result = g_dbus_connection_call_sync (connection,
                                                 GIMP_DBUS_SERVICE_NAME,
                                                 GIMP_DBUS_SERVICE_PATH,
-                                                GIMP_DBUS_SERVICE_INTERFACE,
+                                                GIMP_DBUS_INTERFACE_NAME,
                                                 "Activate",
                                                 NULL,
                                                 NULL,
diff --git a/configure.ac b/configure.ac
index 09dd84f..6bbb265 100644
--- a/configure.ac
+++ b/configure.ac
@@ -58,7 +58,6 @@ m4_define([wmf_required_version], [0.2.8])
 m4_define([pygtk_required_version], [2.10.4])
 m4_define([poppler_required_version], [0.12.4])
 m4_define([libcurl_required_version], [7.15.1])
-m4_define([dbus_glib_required_version], [0.70])
 m4_define([libgudev_required_version], [167])
 m4_define([exif_required_version], [0.6.15])
 m4_define([lcms_required_version], [2.2])
@@ -496,6 +495,15 @@ PKG_CHECK_MODULES(GMODULE_NO_EXPORT, gmodule-no-export-2.0)
 
 PKG_CHECK_MODULES(GIO, gio-2.0)
 
+if test "$os_win32" != "yes"; then
+  PKG_CHECK_MODULES(GIO_UNIX, gio-unix-2.0)
+fi
+
+AC_PATH_PROG(GDBUS_CODEGEN, gdbus-codegen, no)
+if test "x$GDBUS_CODEGEN" = xno; then
+  AC_MSG_ERROR([Could not find gdbus-codegen in your PATH])
+fi
+
 AC_MSG_CHECKING([if GLib is version 2.31.0 or newer])
 if $PKG_CONFIG --atleast-version=2.31.0 glib-2.0; then
   have_glib_2_31=yes
@@ -1694,35 +1702,6 @@ fi
 AM_CONDITIONAL(HAVE_DX_DINPUT, test "x$have_dx_dinput" = xyes)
 
 
-###############################
-# Check for D-Bus GLib bindings
-###############################
-
-AC_ARG_WITH(dbus,  [  --without-dbus          build without D-Bus support])
-
-have_dbus_glib="no (disabled)"
-
-if test "x$with_dbus" != xno; then
-  PKG_CHECK_MODULES(DBUS_GLIB, dbus-glib-1 >= dbus_glib_required_version,
-    have_dbus_glib=yes,
-    have_dbus_glib=no)
-fi
-
-if test "x$have_dbus_glib" = xyes; then
-  AC_PATH_PROG(DBUS_BINDING_TOOL, dbus-binding-tool, no)
-  if test "x$DBUS_BINDING_TOOL" = xno; then
-    AC_MSG_WARN([Could not find dbus-binding-tool in your PATH])
-    have_dbus_glib="no (dbus-binding-tool not found)"
-  fi
-fi
-
-if test "x$have_dbus_glib" = xyes; then
-  AC_DEFINE(HAVE_DBUS_GLIB, 1,
-            [Define to 1 if D-Bus GLib bindings are available])
-  GIMP_COMMAND='gimp-gimp_app_version'
-fi
-
-
 ####################
 # Check for libgudev
 ####################


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]