mirror of
https://github.com/outbackdingo/ports.git
synced 2026-01-27 18:20:07 +00:00
1037 lines
32 KiB
Diff
1037 lines
32 KiB
Diff
Submitted By: Armin K. <krejzi at email dot com>
|
|
Date: 2013-03-16
|
|
Initial Package Version: 1.1.6
|
|
Upstream Status: In Upstream VCS
|
|
Origin: Upstream VCS
|
|
Description: Varius fixes from upstream including build system fixes, compilation
|
|
fixes and new GDBus backend.
|
|
|
|
--- a/build/autotools/introspection.m4 2009-09-21 14:31:14.000000000 +0200
|
|
+++ b/build/autotools/introspection.m4 2013-03-16 23:47:50.178671206 +0100
|
|
@@ -59,12 +59,18 @@
|
|
INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
|
|
INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
|
|
INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
|
|
+ INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
|
|
+ INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
|
|
+ INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
|
|
fi
|
|
AC_SUBST(INTROSPECTION_SCANNER)
|
|
AC_SUBST(INTROSPECTION_COMPILER)
|
|
AC_SUBST(INTROSPECTION_GENERATE)
|
|
AC_SUBST(INTROSPECTION_GIRDIR)
|
|
AC_SUBST(INTROSPECTION_TYPELIBDIR)
|
|
+ AC_SUBST(INTROSPECTION_CFLAGS)
|
|
+ AC_SUBST(INTROSPECTION_LIBS)
|
|
+ AC_SUBST(INTROSPECTION_MAKEFILE)
|
|
|
|
AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes")
|
|
])
|
|
--- a/build/autotools/Makefile.am 2009-11-01 18:52:21.000000000 +0100
|
|
+++ b/build/autotools/Makefile.am 2013-03-16 23:47:50.178671206 +0100
|
|
@@ -1,7 +1,4 @@
|
|
EXTRA_DIST = \
|
|
- shave-libtool.in \
|
|
- shave.in \
|
|
- shave.m4 \
|
|
as-compiler-flag.m4 \
|
|
introspection.m4 \
|
|
Makefile.am.enums \
|
|
--- a/build/autotools/Makefile.am.silent 2009-11-01 19:00:57.000000000 +0100
|
|
+++ b/build/autotools/Makefile.am.silent 2013-03-16 23:47:50.178671206 +0100
|
|
@@ -1,10 +1,5 @@
|
|
# custom rules for quiet builds
|
|
|
|
-if USE_SHAVE
|
|
-QUIET_GEN = $(Q:@=@echo ' GEN '$@;)
|
|
-QUIET_LN = $(Q:@=@echo ' LN '$@;)
|
|
-QUIET_RM = $(Q:@=@echo ' RM '$@;)
|
|
-else
|
|
QUIET_GEN = $(AM_V_GEN)
|
|
|
|
QUIET_LN = $(QUIET_LN_$(V))
|
|
@@ -14,4 +9,3 @@
|
|
QUIET_RM = $(QUIET_RM_$(V))
|
|
QUIET_RM_ = $(QUIET_RM_$(AM_DEFAULT_VERBOSITY))
|
|
QUIET_RM_0 = @echo ' RM '$@;
|
|
-endif # USE_SHAVE
|
|
--- a/build/autotools/shave.in 2009-09-21 14:31:14.000000000 +0200
|
|
+++ b/build/autotools/shave.in 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,79 +0,0 @@
|
|
-#!/bin/sh
|
|
-
|
|
-# we need sed
|
|
-SED=@SED@
|
|
-if test -z "$SED" ; then
|
|
-SED=sed
|
|
-fi
|
|
-
|
|
-lt_unmangle ()
|
|
-{
|
|
- last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'`
|
|
-}
|
|
-
|
|
-# the tool to wrap (cc, cxx, ar, ranlib, ..)
|
|
-tool="$1"
|
|
-shift
|
|
-
|
|
-# the reel tool (to call)
|
|
-REEL_TOOL="$1"
|
|
-shift
|
|
-
|
|
-pass_through=0
|
|
-preserved_args=
|
|
-while test "$#" -gt 0; do
|
|
- opt="$1"
|
|
- shift
|
|
-
|
|
- case $opt in
|
|
- --shave-mode=*)
|
|
- mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'`
|
|
- ;;
|
|
- -o)
|
|
- lt_output="$1"
|
|
- preserved_args="$preserved_args $opt"
|
|
- ;;
|
|
- *)
|
|
- preserved_args="$preserved_args $opt"
|
|
- ;;
|
|
- esac
|
|
-done
|
|
-
|
|
-# mode=link is handled in the libtool wrapper
|
|
-case "$mode,$tool" in
|
|
-link,*)
|
|
- pass_through=1
|
|
- ;;
|
|
-*,cxx)
|
|
- Q=" CXX "
|
|
- ;;
|
|
-*,cc)
|
|
- Q=" CC "
|
|
- ;;
|
|
-*,fc)
|
|
- Q=" FC "
|
|
- ;;
|
|
-*,f77)
|
|
- Q=" F77 "
|
|
- ;;
|
|
-*,objc)
|
|
- Q=" OBJC "
|
|
- ;;
|
|
-*,*)
|
|
- # should not happen
|
|
- Q=" CC "
|
|
- ;;
|
|
-esac
|
|
-
|
|
-lt_unmangle "$lt_output"
|
|
-output=$last_result
|
|
-
|
|
-if test -z $V; then
|
|
- if test $pass_through -eq 0; then
|
|
- echo "$Q$output"
|
|
- fi
|
|
- $REEL_TOOL $preserved_args
|
|
-else
|
|
- echo $REEL_TOOL $preserved_args
|
|
- $REEL_TOOL $preserved_args
|
|
-fi
|
|
--- a/build/autotools/shave-libtool.in 2009-09-21 14:31:14.000000000 +0200
|
|
+++ b/build/autotools/shave-libtool.in 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,69 +0,0 @@
|
|
-#!/bin/sh
|
|
-
|
|
-# we need sed
|
|
-SED=@SED@
|
|
-if test -z "$SED" ; then
|
|
-SED=sed
|
|
-fi
|
|
-
|
|
-lt_unmangle ()
|
|
-{
|
|
- last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'`
|
|
-}
|
|
-
|
|
-# the real libtool to use
|
|
-LIBTOOL="$1"
|
|
-shift
|
|
-
|
|
-# if 1, don't print anything, the underlaying wrapper will do it
|
|
-pass_though=0
|
|
-
|
|
-# scan the arguments, keep the right ones for libtool, and discover the mode
|
|
-preserved_args=
|
|
-while test "$#" -gt 0; do
|
|
- opt="$1"
|
|
- shift
|
|
-
|
|
- case $opt in
|
|
- --mode=*)
|
|
- mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'`
|
|
- preserved_args="$preserved_args $opt"
|
|
- ;;
|
|
- -o)
|
|
- lt_output="$1"
|
|
- preserved_args="$preserved_args $opt"
|
|
- ;;
|
|
- *)
|
|
- preserved_args="$preserved_args $opt"
|
|
- ;;
|
|
- esac
|
|
-done
|
|
-
|
|
-case "$mode" in
|
|
-compile)
|
|
- # shave will be called and print the actual CC/CXX/LINK line
|
|
- preserved_args="$preserved_args --shave-mode=$mode"
|
|
- pass_though=1
|
|
- ;;
|
|
-link)
|
|
- preserved_args="$preserved_args --shave-mode=$mode"
|
|
- Q=" LINK "
|
|
- ;;
|
|
-*)
|
|
- # let's u
|
|
- # echo "*** libtool: Unimplemented mode: $mode, fill a bug report"
|
|
- ;;
|
|
-esac
|
|
-
|
|
-lt_unmangle "$lt_output"
|
|
-output=$last_result
|
|
-
|
|
-if test -z $V; then
|
|
- if test $pass_though -eq 0; then
|
|
- echo "$Q$output"
|
|
- fi
|
|
- $LIBTOOL --silent $preserved_args
|
|
-else
|
|
- echo $LIBTOOL $preserved_args
|
|
- $LIBTOOL $preserved_args
|
|
-fi
|
|
--- a/build/autotools/shave.m4 2009-09-21 14:31:14.000000000 +0200
|
|
+++ b/build/autotools/shave.m4 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,77 +0,0 @@
|
|
-dnl Make automake/libtool output more friendly to humans
|
|
-dnl Damien Lespiau <damien.lespiau@gmail.com>
|
|
-dnl
|
|
-dnl SHAVE_INIT([shavedir],[default_mode])
|
|
-dnl
|
|
-dnl shavedir: the directory where the shave scripts are, it defaults to
|
|
-dnl $(top_builddir)
|
|
-dnl default_mode: (enable|disable) default shave mode. This parameter
|
|
-dnl controls shave's behaviour when no option has been
|
|
-dnl given to configure. It defaults to disable.
|
|
-dnl
|
|
-dnl * SHAVE_INIT should be called late in your configure.(ac|in) file (just
|
|
-dnl before AC_CONFIG_FILE/AC_OUTPUT is perfect. This macro rewrites CC and
|
|
-dnl LIBTOOL, you don't want the configure tests to have these variables
|
|
-dnl re-defined.
|
|
-dnl * This macro requires GNU make's -s option.
|
|
-
|
|
-AC_DEFUN([_SHAVE_ARG_ENABLE],
|
|
-[
|
|
- AC_ARG_ENABLE([shave],
|
|
- AS_HELP_STRING(
|
|
- [--enable-shave],
|
|
- [use shave to make the build pretty [[default=$1]]]),,
|
|
- [enable_shave=$1]
|
|
- )
|
|
-])
|
|
-
|
|
-AC_DEFUN([SHAVE_INIT],
|
|
-[
|
|
- dnl you can tweak the default value of enable_shave
|
|
- m4_if([$2], [enable], [_SHAVE_ARG_ENABLE(yes)], [_SHAVE_ARG_ENABLE(no)])
|
|
-
|
|
- if test x"$enable_shave" = xyes; then
|
|
- dnl where can we find the shave scripts?
|
|
- m4_if([$1],,
|
|
- [shavedir="$ac_pwd"],
|
|
- [shavedir="$ac_pwd/$1"])
|
|
- AC_SUBST(shavedir)
|
|
-
|
|
- dnl make is now quiet
|
|
- AC_SUBST([MAKEFLAGS], [-s])
|
|
- AC_SUBST([AM_MAKEFLAGS], ['`test -z $V && echo -s`'])
|
|
-
|
|
- dnl we need sed
|
|
- AC_CHECK_PROG(SED,sed,sed,false)
|
|
-
|
|
- dnl substitute libtool
|
|
- SHAVE_SAVED_LIBTOOL=$LIBTOOL
|
|
- LIBTOOL="${SHELL} ${shavedir}/shave-libtool '${SHAVE_SAVED_LIBTOOL}'"
|
|
- AC_SUBST(LIBTOOL)
|
|
-
|
|
- dnl substitute cc/cxx
|
|
- SHAVE_SAVED_CC=$CC
|
|
- SHAVE_SAVED_CXX=$CXX
|
|
- SHAVE_SAVED_FC=$FC
|
|
- SHAVE_SAVED_F77=$F77
|
|
- SHAVE_SAVED_OBJC=$OBJC
|
|
- CC="${SHELL} ${shavedir}/shave cc ${SHAVE_SAVED_CC}"
|
|
- CXX="${SHELL} ${shavedir}/shave cxx ${SHAVE_SAVED_CXX}"
|
|
- FC="${SHELL} ${shavedir}/shave fc ${SHAVE_SAVED_FC}"
|
|
- F77="${SHELL} ${shavedir}/shave f77 ${SHAVE_SAVED_F77}"
|
|
- OBJC="${SHELL} ${shavedir}/shave objc ${SHAVE_SAVED_OBJC}"
|
|
- AC_SUBST(CC)
|
|
- AC_SUBST(CXX)
|
|
- AC_SUBST(FC)
|
|
- AC_SUBST(F77)
|
|
- AC_SUBST(OBJC)
|
|
-
|
|
- V=@
|
|
- else
|
|
- V=1
|
|
- fi
|
|
- Q='$(V:1=)'
|
|
- AC_SUBST(V)
|
|
- AC_SUBST(Q)
|
|
-])
|
|
-
|
|
--- a/configure.ac 2009-11-12 14:57:39.000000000 +0100
|
|
+++ b/configure.ac 2013-03-16 23:48:53.856423651 +0100
|
|
@@ -14,7 +14,7 @@
|
|
# This is the X.Y used in the protocol negotiation
|
|
m4_define([unique_protocol_version], [1.0])
|
|
|
|
-AC_PREREQ([2.59])
|
|
+AC_PREREQ([2.63])
|
|
|
|
AC_INIT([unique], [unique_version],
|
|
[http://bugzilla.gnome.org/enter_bug.cgi?product=libunique],
|
|
@@ -23,8 +23,20 @@
|
|
AC_CONFIG_SRCDIR([unique/unique.h])
|
|
AC_CONFIG_MACRO_DIR([build/autotools])
|
|
|
|
-AM_INIT_AUTOMAKE([1.10])
|
|
-AM_CONFIG_HEADER([config.h])
|
|
+AM_INIT_AUTOMAKE([1.11 no-define -Wno-portability dist-bzip2])
|
|
+AC_CONFIG_HEADERS([config.h])
|
|
+
|
|
+AM_SILENT_RULES([yes])
|
|
+
|
|
+AC_PROG_CC_C_O
|
|
+
|
|
+AM_PATH_GLIB_2_0
|
|
+
|
|
+LT_PREREQ([2.2])
|
|
+LT_INIT([disable-static])
|
|
+
|
|
+# Honor aclocal flags
|
|
+ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
|
|
|
|
# version symbols
|
|
UNIQUE_MAJOR_VERSION=unique_major_version
|
|
@@ -49,21 +61,6 @@
|
|
AC_SUBST(UNIQUE_LT_VERSION_INFO)
|
|
AC_SUBST(UNIQUE_LT_CURRENT_MINUS_AGE)
|
|
|
|
-AC_ISC_POSIX
|
|
-AC_PROG_CC
|
|
-AC_PROG_INSTALL
|
|
-AC_PROG_MAKE_SET
|
|
-AC_C_CONST
|
|
-AC_PROG_LIBTOOL
|
|
-AC_PATH_PROG(GLIB_MKENUMS, [glib-mkenums])
|
|
-AC_PATH_PROG(GLIB_GENMARSHAL, [glib-genmarshal])
|
|
-
|
|
-AM_SANITY_CHECK
|
|
-AM_PROG_CC_STDC
|
|
-
|
|
-# Honor aclocal flags
|
|
-ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
|
|
-
|
|
m4_define([glib_required], [2.12.0])
|
|
m4_define([gtk_required], [2.11.0])
|
|
m4_define([dbus_required], [0.70])
|
|
@@ -119,10 +116,22 @@
|
|
|
|
AM_CONDITIONAL([HAVE_DBUS], [test "x$have_dbus" = "xyes"])
|
|
|
|
+dnl GDBus backend
|
|
+dnl This is the default backend if GIO is recent enough
|
|
+m4_define([gdbus_gio_required],[2.25.7])
|
|
+PKG_CHECK_MODULES([GDBUS],[gio-2.0 >= gdbus_gio_required],[have_gdbus=yes],[have_gdbus=no])
|
|
+
|
|
+AS_IF([test "x$have_gdbus" = "xyes"],
|
|
+ [
|
|
+ AC_DEFINE([HAVE_GDBUS],[1],[Define if GDBus backend is enabled])
|
|
+ ]
|
|
+ )
|
|
+
|
|
+AM_CONDITIONAL([HAVE_GDBUS],[test "$have_gdbus" = "yes"])
|
|
+
|
|
dnl Bacon backend
|
|
dnl This is the fallback backend, so we *need* these headers and functions
|
|
dnl even if we end up using D-Bus
|
|
-dnl D-Bus backend dependencies
|
|
m4_define([have_bacon_default], [yes])
|
|
AC_ARG_ENABLE([bacon],
|
|
[AC_HELP_STRING([--enable-bacon=@<:@yes/no@:>@],
|
|
@@ -150,7 +159,13 @@
|
|
|
|
dnl Choose the default backend
|
|
AC_MSG_CHECKING([for default IPC mechanism])
|
|
-AS_IF([test "x$have_dbus" = "xyes"],
|
|
+AS_IF([test "x$have_gdbus" = "xyes"],
|
|
+ [
|
|
+ UNIQUE_DEFAULT_BACKEND=gdbus
|
|
+ AC_MSG_RESULT([GDBus])
|
|
+ ],
|
|
+
|
|
+ [test "x$have_dbus" = "xyes"],
|
|
[
|
|
UNIQUE_DEFAULT_BACKEND=dbus
|
|
AC_MSG_RESULT([D-Bus])
|
|
@@ -178,9 +193,9 @@
|
|
AS_IF([test "x$enable_maintainer_flags" = "xyes" && test "x$GCC" = "xyes"],
|
|
[
|
|
AS_COMPILER_FLAGS([MAINTAINER_CFLAGS],
|
|
- ["-Werror -Wall -Wshadow -Wcast-align
|
|
- -Wno-uninitialized -Wempty-body -Wformat-security
|
|
- -Winit-self"])
|
|
+ ["-Wall -Wshadow -Wcast-align
|
|
+ -Wno-uninitialized -Wempty-body
|
|
+ -Wformat-security -Winit-self"])
|
|
]
|
|
)
|
|
|
|
@@ -230,27 +245,10 @@
|
|
AM_GLIB_DEFINE_LOCALEDIR(UNIQUE_LOCALEDIR)
|
|
|
|
# introspection
|
|
-GOBJECT_INTROSPECTION_CHECK([0.6.3])
|
|
+GOBJECT_INTROSPECTION_CHECK([0.6.7])
|
|
|
|
# gtk-doc
|
|
-GTK_DOC_CHECK([1.11])
|
|
-
|
|
-# nice builds
|
|
-m4_ifdef([AM_SILENT_RULES],
|
|
- [
|
|
- AM_SILENT_RULES([yes])
|
|
- use_shave=no
|
|
- ],
|
|
- [
|
|
- SHAVE_INIT([build/autotools], [enable])
|
|
- AC_CONFIG_FILES([
|
|
- build/autotools/shave-libtool
|
|
- build/autotools/shave
|
|
- ])
|
|
- use_shave=yes
|
|
- ])
|
|
-
|
|
-AM_CONDITIONAL([USE_SHAVE], [test "x$use_shave" = "xyes"])
|
|
+GTK_DOC_CHECK([1.13])
|
|
|
|
AC_CONFIG_FILES([
|
|
Makefile
|
|
@@ -264,6 +262,7 @@
|
|
unique/uniqueversion.h
|
|
unique/bacon/Makefile
|
|
unique/dbus/Makefile
|
|
+ unique/gdbus/Makefile
|
|
tests/Makefile
|
|
po/Makefile.in
|
|
])
|
|
@@ -282,6 +281,7 @@
|
|
Backends:
|
|
Unix Domain Socket: $have_bacon
|
|
D-BUS: $have_dbus
|
|
+ GDBus: $have_gdbus
|
|
|
|
Default backend: $UNIQUE_DEFAULT_BACKEND
|
|
"
|
|
--- a/doc/reference/Makefile.am 2009-09-21 14:31:14.000000000 +0200
|
|
+++ b/doc/reference/Makefile.am 2013-03-16 23:48:20.572522852 +0100
|
|
@@ -50,7 +50,8 @@
|
|
uniquemarshal.h \
|
|
stamp-uniquemarshal.h \
|
|
bacon \
|
|
- dbus
|
|
+ dbus \
|
|
+ gdbus
|
|
|
|
EXTRA_HFILES =
|
|
|
|
--- a/unique/dbus/uniquebackend-dbus.c 2009-11-01 20:15:26.000000000 +0100
|
|
+++ b/unique/dbus/uniquebackend-dbus.c 2013-03-16 23:48:03.088891381 +0100
|
|
@@ -84,7 +84,6 @@
|
|
static gboolean
|
|
unique_backend_dbus_request_name (UniqueBackend *backend)
|
|
{
|
|
- UniqueBackendDBus *backend_dbus;
|
|
const gchar *name;
|
|
DBusGConnection *connection;
|
|
DBusGProxy *proxy;
|
|
@@ -97,8 +96,6 @@
|
|
if (!connection)
|
|
return FALSE;
|
|
|
|
- backend_dbus = UNIQUE_BACKEND_DBUS (backend);
|
|
-
|
|
retval = TRUE;
|
|
name = unique_backend_get_name (backend);
|
|
g_assert (name != NULL);
|
|
@@ -207,10 +204,14 @@
|
|
cmd, data, time_,
|
|
&resp,
|
|
&error);
|
|
- if (error)
|
|
+ if (!res)
|
|
{
|
|
- g_warning ("Error while sending message: %s", error->message);
|
|
- g_error_free (error);
|
|
+ if (error)
|
|
+ {
|
|
+ g_warning ("Error while sending message: %s", error->message);
|
|
+ g_error_free (error);
|
|
+ }
|
|
+
|
|
g_free (cmd);
|
|
|
|
return UNIQUE_RESPONSE_INVALID;
|
|
--- a/unique/gdbus/.gitignore 1970-01-01 01:00:00.000000000 +0100
|
|
+++ b/unique/gdbus/.gitignore 2013-03-16 23:48:20.572522852 +0100
|
|
@@ -0,0 +1,2 @@
|
|
+libunique_gdbus_la-uniquebackend-gdbus.lo
|
|
+libunique-gdbus.la
|
|
--- a/unique/gdbus/Makefile.am 1970-01-01 01:00:00.000000000 +0100
|
|
+++ b/unique/gdbus/Makefile.am 2013-03-16 23:48:20.572522852 +0100
|
|
@@ -0,0 +1,24 @@
|
|
+include $(top_srcdir)/build/autotools/Makefile.am.silent
|
|
+
|
|
+noinst_LTLIBRARIES = libunique-gdbus.la
|
|
+
|
|
+libunique_gdbus_la_SOURCES = \
|
|
+ uniquebackend-gdbus.h \
|
|
+ uniquebackend-gdbus.c
|
|
+
|
|
+libunique_gdbus_la_PPCFLAGS = \
|
|
+ -DG_LOG_DOMAIN=\"Unique-GDBus\" \
|
|
+ -DG_DISABLE_SINGLE_INCLUDES \
|
|
+ -I$(top_srcdir) \
|
|
+ $(AM_CPPFLAGS)
|
|
+
|
|
+libunique_gdbus_la_CFLAGS = \
|
|
+ $(UNIQUE_CFLAGS) \
|
|
+ $(UNIQUE_DEBUG_CFLAGS) \
|
|
+ $(MAINTAINER_CFLAGS) \
|
|
+ $(GDBUS_CFLAGS) \
|
|
+ $(AM_CFLAGS)
|
|
+
|
|
+libunique_gdbus_la_LIBADD = \
|
|
+ $(UNIQUE_LIBS) \
|
|
+ $(GDBUS_LIBS)
|
|
--- a/unique/gdbus/uniquebackend-gdbus.c 1970-01-01 01:00:00.000000000 +0100
|
|
+++ b/unique/gdbus/uniquebackend-gdbus.c 2013-03-16 23:48:20.575856242 +0100
|
|
@@ -0,0 +1,303 @@
|
|
+/* Unique - Single Instance application library
|
|
+ * uniquebackend-gdbus.c: GDBus implementation of UniqueBackend
|
|
+ *
|
|
+ * Copyright (C) 2007 Emmanuele Bassi <ebassi@o-hand.com>
|
|
+ * Copyright © 2010 Christian Persch
|
|
+ *
|
|
+ * This library is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU Lesser General Public
|
|
+ * License as published by the Free Software Foundation; either
|
|
+ * version 2.1 of the License, or (at your option) any later version.
|
|
+ *
|
|
+ * This library is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ * Lesser General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public
|
|
+ * License along with this library; if not, write to the Free Software
|
|
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
+ * 02110-1301 USA
|
|
+ */
|
|
+
|
|
+#ifdef HAVE_CONFIG_H
|
|
+#include "config.h"
|
|
+#endif
|
|
+
|
|
+#include <gio/gio.h>
|
|
+#include <gdk/gdk.h>
|
|
+
|
|
+#include "../uniqueinternals.h"
|
|
+#include "uniquebackend-gdbus.h"
|
|
+
|
|
+struct _UniqueBackendGDBus
|
|
+{
|
|
+ UniqueBackend parent_instance;
|
|
+
|
|
+ GDBusConnection *connection;
|
|
+ guint registration_id;
|
|
+ guint owner_id;
|
|
+ gboolean owns_name;
|
|
+ GMainLoop *loop;
|
|
+};
|
|
+
|
|
+struct _UniqueBackendGDBusClass
|
|
+{
|
|
+ UniqueBackendClass parent_class;
|
|
+ GDBusNodeInfo *introspection_data;
|
|
+};
|
|
+
|
|
+G_DEFINE_TYPE (UniqueBackendGDBus, unique_backend_gdbus, UNIQUE_TYPE_BACKEND);
|
|
+
|
|
+static const char introspection_xml[] =
|
|
+ "<node name='/'>"
|
|
+ "<interface name='org.gtk.UniqueApp'>"
|
|
+ "<method name='SendMessage'>"
|
|
+ "<arg name='command' type='s' direction='in'/>"
|
|
+ "<arg name='message' type='(suuus)' direction='in'/>"
|
|
+ "<arg name='time' type='u' direction='in'/>"
|
|
+ "<arg name='response' type='s' direction='out'/>"
|
|
+ "</method>"
|
|
+ "</interface>"
|
|
+ "</node>";
|
|
+
|
|
+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)
|
|
+{
|
|
+ if (g_strcmp0 (interface_name, "org.gtk.UniqueApp") != 0 ||
|
|
+ g_strcmp0 (object_path, "/Factory") != 0)
|
|
+ return;
|
|
+
|
|
+ if (g_strcmp0 (method_name, "SendMessage") == 0)
|
|
+ {
|
|
+ UniqueBackend *backend = UNIQUE_BACKEND (user_data);
|
|
+ const gchar *command_str, *data, *startup_id;
|
|
+ guint len, screen_num, workspace, time_;
|
|
+ UniqueMessageData message_data;
|
|
+ gint command;
|
|
+ UniqueResponse response;
|
|
+ GdkDisplay *display;
|
|
+
|
|
+ g_variant_get (parameters,
|
|
+ "(&s(&suuu&s)u)",
|
|
+ &command_str,
|
|
+ &data, &len, &screen_num, &workspace, &startup_id,
|
|
+ &time_);
|
|
+
|
|
+ command = unique_command_from_string (backend->parent, command_str);
|
|
+ if (command == 0)
|
|
+ {
|
|
+ g_dbus_method_invocation_return_error (invocation,
|
|
+ G_DBUS_ERROR,
|
|
+ G_DBUS_ERROR_INVALID_ARGS,
|
|
+ "Invalid command `%s' received",
|
|
+ command_str);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ display = gdk_display_get_default ();
|
|
+
|
|
+ message_data.data = len > 0 ? (guchar *) data : NULL;
|
|
+ message_data.length = (gint) len;
|
|
+ message_data.workspace = workspace;
|
|
+ message_data.startup_id = (char *) startup_id;
|
|
+ if (screen_num >= 0 && screen_num < gdk_display_get_n_screens (display))
|
|
+ message_data.screen = gdk_display_get_screen (display, screen_num);
|
|
+ else
|
|
+ message_data.screen = gdk_screen_get_default ();
|
|
+
|
|
+ response = unique_app_emit_message_received (backend->parent, command, &message_data, time_);
|
|
+
|
|
+ g_dbus_method_invocation_return_value (invocation,
|
|
+ g_variant_new ("(s)", unique_response_to_string (response)));
|
|
+ return;
|
|
+ }
|
|
+}
|
|
+
|
|
+static void
|
|
+name_acquired_cb (GDBusConnection *connection,
|
|
+ const gchar *name,
|
|
+ gpointer user_data)
|
|
+{
|
|
+ UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (user_data);
|
|
+
|
|
+ backend_gdbus->owns_name = TRUE;
|
|
+ if (backend_gdbus->loop && g_main_loop_is_running (backend_gdbus->loop))
|
|
+ g_main_loop_quit (backend_gdbus->loop);
|
|
+}
|
|
+
|
|
+static void
|
|
+name_lost_cb (GDBusConnection *connection,
|
|
+ const gchar *name,
|
|
+ gpointer user_data)
|
|
+{
|
|
+ UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (user_data);
|
|
+
|
|
+ backend_gdbus->owns_name = FALSE;
|
|
+ if (backend_gdbus->loop && g_main_loop_is_running (backend_gdbus->loop))
|
|
+ g_main_loop_quit (backend_gdbus->loop);
|
|
+}
|
|
+
|
|
+static const GDBusInterfaceVTable interface_vtable = {
|
|
+ method_call_cb,
|
|
+ NULL,
|
|
+ NULL
|
|
+};
|
|
+
|
|
+static gboolean
|
|
+unique_backend_gdbus_request_name (UniqueBackend *backend)
|
|
+{
|
|
+ UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (backend);
|
|
+ UniqueBackendGDBusClass *klass = UNIQUE_BACKEND_GDBUS_GET_CLASS (backend);
|
|
+ GError *error;
|
|
+
|
|
+ error = NULL;
|
|
+ backend_gdbus->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
|
|
+ if (!backend_gdbus->connection)
|
|
+ {
|
|
+ g_warning ("Unable to open a connection to the session bus: %s",
|
|
+ error->message);
|
|
+ g_error_free (error);
|
|
+
|
|
+ return FALSE;
|
|
+ }
|
|
+
|
|
+ backend_gdbus->registration_id =
|
|
+ g_dbus_connection_register_object (backend_gdbus->connection,
|
|
+ "/Factory",
|
|
+ klass->introspection_data->interfaces[0],
|
|
+ &interface_vtable,
|
|
+ backend, NULL,
|
|
+ &error);
|
|
+ if (backend_gdbus->registration_id == 0)
|
|
+ {
|
|
+ g_warning ("Unable to register object with the session bus: %s",
|
|
+ error->message);
|
|
+ g_error_free (error);
|
|
+
|
|
+ return FALSE;
|
|
+ }
|
|
+
|
|
+ backend_gdbus->owns_name = FALSE;
|
|
+
|
|
+ backend_gdbus->owner_id =
|
|
+ g_bus_own_name_on_connection (backend_gdbus->connection,
|
|
+ unique_backend_get_name (backend),
|
|
+ G_BUS_NAME_OWNER_FLAGS_NONE,
|
|
+ name_acquired_cb,
|
|
+ name_lost_cb,
|
|
+ backend, NULL);
|
|
+
|
|
+ backend_gdbus->loop = g_main_loop_new (NULL, FALSE);
|
|
+ g_main_loop_run (backend_gdbus->loop);
|
|
+ g_main_loop_unref (backend_gdbus->loop);
|
|
+ backend_gdbus->loop = NULL;
|
|
+
|
|
+ return backend_gdbus->owns_name;
|
|
+}
|
|
+
|
|
+static UniqueResponse
|
|
+unique_backend_gdbus_send_message (UniqueBackend *backend,
|
|
+ gint command,
|
|
+ UniqueMessageData *message_data,
|
|
+ guint time_)
|
|
+{
|
|
+ UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (backend);
|
|
+ GVariantBuilder builder;
|
|
+ GVariant *result;
|
|
+ const gchar *command_str, *resp;
|
|
+ UniqueResponse response;
|
|
+ GError *error;
|
|
+
|
|
+ command_str = unique_command_to_string (backend->parent, command);
|
|
+
|
|
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("(s(suuus)u)"));
|
|
+ g_variant_builder_add (&builder, "s", command_str ? command_str : "");
|
|
+ g_variant_builder_open (&builder, G_VARIANT_TYPE ("(suuus)"));
|
|
+ g_variant_builder_add (&builder, "s", message_data->data ? (char *) message_data->data : "");
|
|
+ g_variant_builder_add (&builder, "u", (guint) message_data->length);
|
|
+ g_variant_builder_add (&builder, "u", (guint) gdk_screen_get_number (message_data->screen));
|
|
+ g_variant_builder_add (&builder, "u", (guint) message_data->workspace);
|
|
+ g_variant_builder_add (&builder, "s", message_data->startup_id ? message_data->startup_id : "");
|
|
+ g_variant_builder_close (&builder);
|
|
+ g_variant_builder_add (&builder, "u", time_);
|
|
+
|
|
+ error = NULL;
|
|
+ result = g_dbus_connection_call_sync (backend_gdbus->connection,
|
|
+ unique_backend_get_name (backend),
|
|
+ "/Factory",
|
|
+ "org.gtk.UniqueApp",
|
|
+ "SendMessage",
|
|
+ g_variant_builder_end (&builder),
|
|
+ G_VARIANT_TYPE ("(s)"),
|
|
+ G_DBUS_CALL_FLAGS_NO_AUTO_START,
|
|
+ -1,
|
|
+ NULL,
|
|
+ &error);
|
|
+ if (error)
|
|
+ {
|
|
+ g_warning ("Error while sending message: %s", error->message);
|
|
+ g_error_free (error);
|
|
+
|
|
+ return UNIQUE_RESPONSE_INVALID;
|
|
+ }
|
|
+
|
|
+ g_variant_get (result, "(&s)", &resp);
|
|
+ response = unique_response_from_string (resp);
|
|
+ g_variant_unref (result);
|
|
+
|
|
+ return response;
|
|
+}
|
|
+
|
|
+static void
|
|
+unique_backend_gdbus_dispose (GObject *gobject)
|
|
+{
|
|
+ UniqueBackendGDBus *backend_gdbus = UNIQUE_BACKEND_GDBUS (gobject);
|
|
+
|
|
+ if (backend_gdbus->owner_id != 0)
|
|
+ {
|
|
+ g_bus_unown_name (backend_gdbus->owner_id);
|
|
+ backend_gdbus->owner_id = 0;
|
|
+ }
|
|
+ if (backend_gdbus->registration_id != 0)
|
|
+ {
|
|
+ g_assert (backend_gdbus->connection != NULL);
|
|
+ g_dbus_connection_unregister_object (backend_gdbus->connection,
|
|
+ backend_gdbus->registration_id);
|
|
+ backend_gdbus->registration_id = 0;
|
|
+ }
|
|
+ if (backend_gdbus->connection)
|
|
+ {
|
|
+ g_object_unref (backend_gdbus->connection);
|
|
+ backend_gdbus->connection = NULL;
|
|
+ }
|
|
+
|
|
+ G_OBJECT_CLASS (unique_backend_gdbus_parent_class)->dispose (gobject);
|
|
+}
|
|
+
|
|
+static void
|
|
+unique_backend_gdbus_class_init (UniqueBackendGDBusClass *klass)
|
|
+{
|
|
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
+ UniqueBackendClass *backend_class = UNIQUE_BACKEND_CLASS (klass);
|
|
+
|
|
+ gobject_class->dispose = unique_backend_gdbus_dispose;
|
|
+
|
|
+ backend_class->request_name = unique_backend_gdbus_request_name;
|
|
+ backend_class->send_message = unique_backend_gdbus_send_message;
|
|
+
|
|
+ klass->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
|
|
+ g_assert (klass->introspection_data != NULL);
|
|
+}
|
|
+
|
|
+static void
|
|
+unique_backend_gdbus_init (UniqueBackendGDBus *backend)
|
|
+{
|
|
+}
|
|
--- a/unique/gdbus/uniquebackend-gdbus.h 1970-01-01 01:00:00.000000000 +0100
|
|
+++ b/unique/gdbus/uniquebackend-gdbus.h 2013-03-16 23:48:20.575856242 +0100
|
|
@@ -0,0 +1,43 @@
|
|
+/* Unique - Single Instance application library
|
|
+ * uniquebackend-gdbus.c: GDBus implementation of UniqueBackend
|
|
+ *
|
|
+ * Copyright (C) 2007 Emmanuele Bassi <ebassi@o-hand.com>
|
|
+ *
|
|
+ * This library is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU Lesser General Public
|
|
+ * License as published by the Free Software Foundation; either
|
|
+ * version 2.1 of the License, or (at your option) any later version.
|
|
+ *
|
|
+ * This library is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ * Lesser General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU Lesser General Public
|
|
+ * License along with this library; if not, write to the Free Software
|
|
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
+ * 02110-1301 USA
|
|
+ */
|
|
+
|
|
+#ifndef __UNIQUE_BACKEND_GDBUS_H__
|
|
+#define __UNIQUE_BACKEND_GDBUS_H__
|
|
+
|
|
+#include <unique/uniquebackend.h>
|
|
+
|
|
+G_BEGIN_DECLS
|
|
+
|
|
+#define UNIQUE_TYPE_BACKEND_GDBUS (unique_backend_gdbus_get_type ())
|
|
+#define UNIQUE_BACKEND_GDBUS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UNIQUE_TYPE_BACKEND_GDBUS, UniqueBackendGDBus))
|
|
+#define UNIQUE_IS_BACKEND_GDBUS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UNIQUE_TYPE_BACKEND_GDBUS))
|
|
+#define UNIQUE_BACKEND_GDBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), UNIQUE_TYPE_BACKEND_GDBUS, UniqueBackendGDBusClass))
|
|
+#define UNIQUE_IS_BACKEND_GDBUS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), UNIQUE_TYPE_BACKEND_GDBUS))
|
|
+#define UNIQUE_BACKEND_GDBUS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), UNIQUE_TYPE_BACKEND_GDBUS, UniqueBackendGDBusClass))
|
|
+
|
|
+typedef struct _UniqueBackendGDBus UniqueBackendGDBus;
|
|
+typedef struct _UniqueBackendGDBusClass UniqueBackendGDBusClass;
|
|
+
|
|
+GType unique_backend_gdbus_get_type (void) G_GNUC_CONST;
|
|
+
|
|
+G_END_DECLS
|
|
+
|
|
+#endif /* __UNIQUE_BACKEND_GDBUS_H__ */
|
|
--- a/unique/Makefile.am 2009-11-12 14:53:10.000000000 +0100
|
|
+++ b/unique/Makefile.am 2013-03-16 23:48:20.572522852 +0100
|
|
@@ -12,7 +12,11 @@
|
|
SUBDIRS += dbus
|
|
endif
|
|
|
|
-DIST_SUBDIRS = bacon dbus
|
|
+if HAVE_GDBUS
|
|
+SUBDIRS += gdbus
|
|
+endif
|
|
+
|
|
+DIST_SUBDIRS = bacon dbus gdbus
|
|
|
|
INCLUDES = -I$(top_srcdir)
|
|
|
|
@@ -72,6 +76,10 @@
|
|
unique_backend_libs += $(top_builddir)/unique/dbus/libunique-dbus.la
|
|
endif
|
|
|
|
+if HAVE_GDBUS
|
|
+unique_backend_libs += $(top_builddir)/unique/gdbus/libunique-gdbus.la
|
|
+endif
|
|
+
|
|
uniquedir = $(includedir)/unique-1.0/unique
|
|
unique_HEADERS = \
|
|
$(unique_sources_h) \
|
|
--- a/unique/uniqueapp.c 2009-11-01 19:33:13.000000000 +0100
|
|
+++ b/unique/uniqueapp.c 2013-03-16 23:49:05.236617643 +0100
|
|
@@ -781,7 +781,7 @@
|
|
}
|
|
|
|
|
|
-G_CONST_RETURN gchar *
|
|
+const gchar *
|
|
unique_command_to_string (UniqueApp *app,
|
|
gint command)
|
|
{
|
|
@@ -863,7 +863,7 @@
|
|
return retval;
|
|
}
|
|
|
|
-G_CONST_RETURN gchar *
|
|
+const gchar *
|
|
unique_response_to_string (UniqueResponse response)
|
|
{
|
|
GEnumClass *enum_class;
|
|
--- a/unique/uniquebackend.c 2009-11-09 12:02:06.000000000 +0100
|
|
+++ b/unique/uniquebackend.c 2013-03-16 23:49:05.236617643 +0100
|
|
@@ -111,7 +111,7 @@
|
|
*
|
|
* Return value: FIXME
|
|
*/
|
|
-G_CONST_RETURN gchar *
|
|
+const gchar *
|
|
unique_backend_get_name (UniqueBackend *backend)
|
|
{
|
|
g_return_val_if_fail (UNIQUE_IS_BACKEND (backend), NULL);
|
|
@@ -154,7 +154,7 @@
|
|
*
|
|
* Return value: FIXME
|
|
*/
|
|
-G_CONST_RETURN gchar *
|
|
+const gchar *
|
|
unique_backend_get_startup_id (UniqueBackend *backend)
|
|
{
|
|
g_return_val_if_fail (UNIQUE_IS_BACKEND (backend), NULL);
|
|
@@ -298,6 +298,9 @@
|
|
#ifdef HAVE_DBUS
|
|
#include "dbus/uniquebackend-dbus.h"
|
|
#endif
|
|
+#ifdef HAVE_GDBUS
|
|
+#include "gdbus/uniquebackend-gdbus.h"
|
|
+#endif
|
|
|
|
/**
|
|
* unique_backend_create:
|
|
@@ -329,6 +332,10 @@
|
|
if (strcmp (backend_name, "dbus") == 0)
|
|
backend_gtype = unique_backend_dbus_get_type ();
|
|
#endif /* HAVE_DBUS */
|
|
+#ifdef HAVE_GDBUS
|
|
+ if (strcmp (backend_name, "gdbus") == 0)
|
|
+ backend_gtype = unique_backend_gdbus_get_type ();
|
|
+#endif /* HAVE_GDBUS */
|
|
#if !defined(HAVE_BACON) && !defined(HAVE_DBUS)
|
|
#error Need either bacon or dbus
|
|
#endif
|
|
--- a/unique/uniquebackend.h 2009-09-21 14:31:14.000000000 +0200
|
|
+++ b/unique/uniquebackend.h 2013-03-16 23:49:05.236617643 +0100
|
|
@@ -94,10 +94,10 @@
|
|
|
|
UniqueBackend * unique_backend_create (void);
|
|
|
|
-G_CONST_RETURN gchar *unique_backend_get_name (UniqueBackend *backend);
|
|
+const gchar *unique_backend_get_name (UniqueBackend *backend);
|
|
void unique_backend_set_name (UniqueBackend *backend,
|
|
const gchar *name);
|
|
-G_CONST_RETURN gchar *unique_backend_get_startup_id (UniqueBackend *backend);
|
|
+const gchar *unique_backend_get_startup_id (UniqueBackend *backend);
|
|
void unique_backend_set_startup_id (UniqueBackend *backend,
|
|
const gchar *startup_id);
|
|
GdkScreen * unique_backend_get_screen (UniqueBackend *backend);
|
|
--- a/unique/uniqueinternals.h 2009-09-21 14:31:14.000000000 +0200
|
|
+++ b/unique/uniqueinternals.h 2013-03-16 23:49:05.236617643 +0100
|
|
@@ -44,11 +44,11 @@
|
|
* and then back into an id
|
|
*/
|
|
UniqueResponse unique_response_from_string (const gchar *response);
|
|
-G_CONST_RETURN gchar *unique_response_to_string (UniqueResponse response);
|
|
+const gchar *unique_response_to_string (UniqueResponse response);
|
|
|
|
gint unique_command_from_string (UniqueApp *app,
|
|
const gchar *command);
|
|
-G_CONST_RETURN gchar *unique_command_to_string (UniqueApp *app,
|
|
+const gchar *unique_command_to_string (UniqueApp *app,
|
|
gint command);
|
|
|
|
G_END_DECLS
|
|
--- a/unique/uniquemessage.c 2009-11-09 12:02:06.000000000 +0100
|
|
+++ b/unique/uniquemessage.c 2013-03-16 23:49:05.236617643 +0100
|
|
@@ -185,7 +185,7 @@
|
|
*
|
|
* Since: 1.0.2
|
|
*/
|
|
-G_CONST_RETURN guchar *
|
|
+const guchar *
|
|
unique_message_data_get (UniqueMessageData *message_data,
|
|
gsize *length)
|
|
{
|
|
@@ -525,7 +525,7 @@
|
|
* owned by the #UniqueMessageData structure and should not be
|
|
* modified or freed
|
|
*/
|
|
-G_CONST_RETURN gchar *
|
|
+const gchar *
|
|
unique_message_data_get_startup_id (UniqueMessageData *message_data)
|
|
{
|
|
g_return_val_if_fail (message_data != NULL, NULL);
|
|
--- a/unique/uniquemessage.h 2009-09-21 14:31:14.000000000 +0200
|
|
+++ b/unique/uniquemessage.h 2013-03-16 23:49:05.236617643 +0100
|
|
@@ -48,7 +48,7 @@
|
|
void unique_message_data_set (UniqueMessageData *message_data,
|
|
const guchar *data,
|
|
gsize length);
|
|
-G_CONST_RETURN guchar *unique_message_data_get (UniqueMessageData *message_data,
|
|
+const guchar *unique_message_data_get (UniqueMessageData *message_data,
|
|
gsize *length);
|
|
|
|
gboolean unique_message_data_set_text (UniqueMessageData *message_data,
|
|
@@ -63,7 +63,7 @@
|
|
gchar * unique_message_data_get_filename (UniqueMessageData *message_data);
|
|
|
|
GdkScreen * unique_message_data_get_screen (UniqueMessageData *message_data);
|
|
-G_CONST_RETURN gchar * unique_message_data_get_startup_id (UniqueMessageData *message_data);
|
|
+const gchar * unique_message_data_get_startup_id (UniqueMessageData *message_data);
|
|
guint unique_message_data_get_workspace (UniqueMessageData *message_data);
|
|
|
|
G_END_DECLS
|