aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen VanDine <ken.vandine@canonical.com>2011-01-14 10:44:36 -0600
committerKen VanDine <ken.vandine@canonical.com>2011-01-14 10:44:36 -0600
commit81a4a72ef58e85e5d495daf04a2a6d687d160ce6 (patch)
treefca5689c69bcad91071cc8a17d995e8767f2c12b
parent93ada25fa1aa4b45f54c343ae34fa611d876d87b (diff)
parent9dee1e2decb74007676089f5d86fde138d1aac9e (diff)
downloadayatana-indicator-application-81a4a72ef58e85e5d495daf04a2a6d687d160ce6.tar.gz
ayatana-indicator-application-81a4a72ef58e85e5d495daf04a2a6d687d160ce6.tar.bz2
ayatana-indicator-application-81a4a72ef58e85e5d495daf04a2a6d687d160ce6.zip
releasing version 0.2.91-0ubuntu1
-rw-r--r--ChangeLog128
-rw-r--r--Makefile.in2
-rwxr-xr-xautogen.sh11
-rwxr-xr-xconfigure23
-rw-r--r--configure.ac7
-rw-r--r--data/indicator-application.service.in2
-rw-r--r--debian/changelog21
-rw-r--r--debian/control8
-rw-r--r--debian/copyright36
-rw-r--r--gtk-doc.make230
-rw-r--r--m4/gtk-doc.m461
-rw-r--r--omf.make61
-rwxr-xr-xpy-compile146
-rw-r--r--src/Makefile.am30
-rw-r--r--src/Makefile.in50
-rw-r--r--src/app-indicator-enum-types.c2
-rw-r--r--src/app-indicator-enum-types.h52
-rw-r--r--src/appindicator3-0.1.pc.in14
-rw-r--r--src/application-service-appstore.c1113
-rw-r--r--src/application-service.c1
-rw-r--r--src/application-service.xml2
-rw-r--r--src/dbus-properties.xml23
-rw-r--r--src/dbus-shared.h6
-rw-r--r--src/gen-application-service.xml.c61
-rw-r--r--src/gen-notification-approver.xml.c31
-rw-r--r--src/indicator-application.c324
-rw-r--r--src/notification-item.xml39
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/Makefile.in22
-rw-r--r--tests/test-approver.c134
-rw-r--r--xmldocs.make101
31 files changed, 1221 insertions, 1521 deletions
diff --git a/ChangeLog b/ChangeLog
index 4a14793..dfe882e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,133 @@
# Generated by Makefile. Do not edit.
+2011-01-14 Ted Gould <ted@gould.cx>
+
+ Porting to GDBus and fixing some other misc. issus.
+
+2011-01-13 Michael Terry <mike@mterry.name>
+
+ merge ken's com.canonical branch
+
+2011-01-13 Ken VanDine <ken.vandine@canonical.com>
+
+ com.canonical rename for the indicator
+
+2011-01-13 Michael Terry <mike@mterry.name>
+
+ make sure to free pre-validated applications; add applications to the app list as soon as we create them, to avoid apps that spam us (like gnome-power-manager) from creating multiple apps in our list
+
+2011-01-13 Michael Terry <mike@mterry.name>
+
+ reduce debug spew
+
+2011-01-13 Michael Terry <mike@mterry.name>
+
+ don't use cached properties for new icons or new aicons either. Instead, just ask for all properties again
+
+2011-01-13 Michael Terry <mike@mterry.name>
+
+ actually request properties from applications; using cached properties doesn't seem to work
+
+2011-01-13 Michael Terry <mike@mterry.name>
+
+ don't second guess service's new application, which caused our positions to get out of sync with the service if it was a bit confused
+
+2011-01-13 Michael Terry <mike@mterry.name>
+
+ watch for name change, instead of name owner change for approver connections
+
+2011-01-12 Michael Terry <mike@mterry.name>
+
+ fix issue where icons never went away
+
+2011-01-12 Michael Terry <mike@mterry.name>
+
+ fix bug with gvariant string; port test
+
+2011-01-11 Michael Terry <mike@mterry.name>
+
+ port to gdbus
+
+2010-12-08 Ted Gould <ted@gould.cx>
+
+ Remove the library from the build
+
+2010-12-08 Ted Gould <ted@gould.cx>
+
+ Updating to new dbusmenu, no API changes here
+
+2010-12-08 Ted Gould <ted@gould.cx>
+
+ Updating to trunk with mostly libappindicator changes.
+
+2010-12-03 Ted Gould <ted@gould.cx>
+
+ Merging with trunk to get the GTK 3 build. Though, we don't really use it yet.
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Fixing up the test so it builds and runs
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Removing some unneeded files
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Linking to the install directory of libappindicator for the header files
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Adding the libappindicator dep for the tests
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Dropping the library tests
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Removing the example
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Removing the C files and build
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Removing doc and introspection build options
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Remove m4 files and including them in dist
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Removing LGPL
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Removing bindings
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Removing docs
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Removing library deps, bindings and documentation that are included with the lib
+
+2010-12-02 Ted Gould <ted@gould.cx>
+
+ Splitting the deps
+
+2010-09-22 Ted Gould <ted@gould.cx>
+
+ Adding a new library line for configure so that we don't end up with extra libs in the library.
+
+2010-12-07 Ted Gould <ted@gould.cx>
+
+ 0.2.90
+
2010-12-07 Ted Gould <ted@gould.cx>
Update to newest g-ir-scanner and vapigen
diff --git a/Makefile.in b/Makefile.in
index ef76b91..275e4a2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -38,7 +38,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/config.h.in \
$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
compile config.guess config.sub depcomp install-sh ltmain.sh \
- missing py-compile
+ missing
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100755
index 3b930e5..0000000
--- a/autogen.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-PKG_NAME="indicator-application"
-
-which gnome-autogen.sh || {
- echo "You need gnome-common from GNOME SVN"
- exit 1
-}
-
-USE_GNOME2_MACROS=1 \
-gnome-autogen.sh $@
diff --git a/configure b/configure
index 57d159f..6c50566 100755
--- a/configure
+++ b/configure
@@ -2735,7 +2735,7 @@ fi
# Define the identity of the package.
PACKAGE=indicator-application
- VERSION=0.2.90
+ VERSION=0.2.91
cat >>confdefs.h <<_ACEOF
@@ -11479,8 +11479,9 @@ fi
GTK_REQUIRED_VERSION=2.18
GTK3_REQUIRED_VERSION=2.91
+GIO_REQUIRED_VERSION=2.26
INDICATOR_REQUIRED_VERSION=0.3.5
-DBUSMENUGTK_REQUIRED_VERSION=0.2.2
+DBUSMENUGTK_REQUIRED_VERSION=0.3.91
JSON_GLIB_REQUIRED_VERSION=0.7.6
DBUS_GLIB_REQUIRED_VERSION=0.82
@@ -11503,11 +11504,13 @@ if test -n "$INDICATOR_CFLAGS"; then
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK3_REQUIRED_VERSION
+ gio-2.0 >= \$GIO_REQUIRED_VERSION
indicator3 >= \$INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= \$JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= \$DBUS_GLIB_REQUIRED_VERSION
dbusmenu-gtk3-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION\""; } >&5
($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK3_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator3 >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11516,6 +11519,7 @@ if test -n "$INDICATOR_CFLAGS"; then
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_INDICATOR_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= $GTK3_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator3 >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11531,11 +11535,13 @@ if test -n "$INDICATOR_LIBS"; then
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= \$GTK3_REQUIRED_VERSION
+ gio-2.0 >= \$GIO_REQUIRED_VERSION
indicator3 >= \$INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= \$JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= \$DBUS_GLIB_REQUIRED_VERSION
dbusmenu-gtk3-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION\""; } >&5
($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= $GTK3_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator3 >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11544,6 +11550,7 @@ if test -n "$INDICATOR_LIBS"; then
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_INDICATOR_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= $GTK3_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator3 >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11568,12 +11575,14 @@ else
fi
if test $_pkg_short_errors_supported = yes; then
INDICATOR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gtk+-3.0 >= $GTK3_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator3 >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION" 2>&1`
else
INDICATOR_PKG_ERRORS=`$PKG_CONFIG --print-errors "gtk+-3.0 >= $GTK3_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator3 >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11583,6 +11592,7 @@ fi
echo "$INDICATOR_PKG_ERRORS" >&5
as_fn_error $? "Package requirements (gtk+-3.0 >= $GTK3_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator3 >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11635,11 +11645,13 @@ if test -n "$INDICATOR_CFLAGS"; then
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= \$GTK_REQUIRED_VERSION
+ gio-2.0 >= \$GIO_REQUIRED_VERSION
indicator >= \$INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= \$JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= \$DBUS_GLIB_REQUIRED_VERSION
dbusmenu-gtk-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION\""; } >&5
($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11648,6 +11660,7 @@ if test -n "$INDICATOR_CFLAGS"; then
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_INDICATOR_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11663,11 +11676,13 @@ if test -n "$INDICATOR_LIBS"; then
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= \$GTK_REQUIRED_VERSION
+ gio-2.0 >= \$GIO_REQUIRED_VERSION
indicator >= \$INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= \$JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= \$DBUS_GLIB_REQUIRED_VERSION
dbusmenu-gtk-0.4 >= \$DBUSMENUGTK_REQUIRED_VERSION\""; } >&5
($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11676,6 +11691,7 @@ if test -n "$INDICATOR_LIBS"; then
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_INDICATOR_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11700,12 +11716,14 @@ else
fi
if test $_pkg_short_errors_supported = yes; then
INDICATOR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
dbusmenu-gtk-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION" 2>&1`
else
INDICATOR_PKG_ERRORS=`$PKG_CONFIG --print-errors "gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -11715,6 +11733,7 @@ fi
echo "$INDICATOR_PKG_ERRORS" >&5
as_fn_error $? "Package requirements (gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
diff --git a/configure.ac b/configure.ac
index 87211d0..1deb16f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@ AC_COPYRIGHT([Copyright 2009, 2010 Canonical])
AC_PREREQ(2.53)
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(indicator-application, 0.2.90)
+AM_INIT_AUTOMAKE(indicator-application, 0.2.91)
AM_MAINTAINER_MODE
@@ -31,8 +31,9 @@ PKG_PROG_PKG_CONFIG
GTK_REQUIRED_VERSION=2.18
GTK3_REQUIRED_VERSION=2.91
+GIO_REQUIRED_VERSION=2.26
INDICATOR_REQUIRED_VERSION=0.3.5
-DBUSMENUGTK_REQUIRED_VERSION=0.2.2
+DBUSMENUGTK_REQUIRED_VERSION=0.3.91
JSON_GLIB_REQUIRED_VERSION=0.7.6
DBUS_GLIB_REQUIRED_VERSION=0.82
@@ -43,6 +44,7 @@ AC_ARG_WITH([gtk],
[with_gtk=2])
AS_IF([test "x$with_gtk" = x3],
[PKG_CHECK_MODULES(INDICATOR, gtk+-3.0 >= $GTK3_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator3 >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
@@ -53,6 +55,7 @@ AS_IF([test "x$with_gtk" = x3],
],
[test "x$with_gtk" = x2],
[PKG_CHECK_MODULES(INDICATOR, gtk+-2.0 >= $GTK_REQUIRED_VERSION
+ gio-2.0 >= $GIO_REQUIRED_VERSION
indicator >= $INDICATOR_REQUIRED_VERSION
json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
diff --git a/data/indicator-application.service.in b/data/indicator-application.service.in
index 83e430a..f6ceee3 100644
--- a/data/indicator-application.service.in
+++ b/data/indicator-application.service.in
@@ -1,3 +1,3 @@
[D-BUS Service]
-Name=org.ayatana.indicator.application
+Name=com.canonical.indicator.application
Exec=@libexecdir@/indicator-application-service
diff --git a/debian/changelog b/debian/changelog
index 643534e..fb134f4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,9 +1,24 @@
-indicator-application (0.2.90-0ubuntu3) UNRELEASED; urgency=low
+indicator-application (0.2.91-0ubuntu1) natty; urgency=low
+ [ Ted Gould ]
+ * Upstream Merge
+ * Removing libappindicator from the tarball
+ * debian/control: Removing all libappindicator packages
+
+ [ Ken VanDine ]
+ * New upstream release
+ - Ported to gdbus and dbusmenu 0.4
* debian/control
- - build depend on dbusmenu >= 0.3.90
+ - Bump build depends for dbusmenu to >= 0.3.91
+ - Bump build depends for libindicator-dev to >= 0.3.16
+ - Added build depends for libappindicator-dev >= 0.2.91
+ * debian/rules
+ - Removed all the extra build targets, we don't build those
+ packages anymore
+ * debian/copyright
+ - Removed references to LGPL sources, those moved to libappindicator
- -- Ken VanDine <ken.vandine@canonical.com> Wed, 08 Dec 2010 13:32:07 -0500
+ -- Ken VanDine <ken.vandine@canonical.com> Fri, 14 Jan 2011 10:25:42 -0600
indicator-application (0.2.90-0ubuntu2) natty; urgency=low
diff --git a/debian/control b/debian/control
index 723bdcd..62a270e 100644
--- a/debian/control
+++ b/debian/control
@@ -9,10 +9,10 @@ Build-Depends: debhelper (>= 5.0),
libdbus-glib-1-dev (>= 0.82),
libjson-glib-dev,
intltool,
- libindicator-dev (>= 0.3.14),
- libdbusmenu-gtk-dev (>= 0.3.90),
- libdbusmenu-glib-dev (>= 0.3.90),
- libappindicator-dev (>= 0.2.90+r170)
+ libindicator-dev (>= 0.3.16),
+ libdbusmenu-gtk-dev (>= 0.3.91),
+ libdbusmenu-glib-dev (>= 0.3.91),
+ libappindicator-dev (>= 0.2.91)
Standards-Version: 3.8.4
Homepage: https://launchpad.net/indicator-application
Vcs-Bzr: http://bazaar.launchpad.net/~ubuntu-desktop/indicator-application/ubuntu
diff --git a/debian/copyright b/debian/copyright
index ba92c05..fcfcc8a 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -9,7 +9,7 @@ Upstream Author:
Copyright:
- Copyright (C) 2009 Canonical Ltd.
+ Copyright (C) 2009-2010 Canonical Ltd.
License:
@@ -26,35 +26,5 @@ License:
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-Two files (app-indicator.c and app-indicator.h) are under:
-
- 1) the GNU Lesser General Public License version 3, as published by the
- Free Software Foundation; and/or
- 2) the GNU Lesser General Public License version 2.1, as published by
- the Free Software Foundation.
-
- This program is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranties of
- MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the applicable version of the GNU Lesser General Public
- License for more details.
-
- 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
-
-On Debian/Ubuntu systems, the full text of the LGPL v2.1 can be found in
-`/usr/share/common-licenses/LGPL-2.1', the full text of the LGPL v3 can be found in
-`/usr/share/common-licenses/LGPL-3, and the full text of the GPL v3 can be
-found in `/usr/share/common-licenses/GPL-3'
+On Debian/Ubuntu systems, the full text of the GPL v3 can be found in
+`/usr/share/common-licenses/GPL-3'
diff --git a/gtk-doc.make b/gtk-doc.make
deleted file mode 100644
index 57fab98..0000000
--- a/gtk-doc.make
+++ /dev/null
@@ -1,230 +0,0 @@
-# -*- mode: makefile -*-
-
-####################################
-# Everything below here is generic #
-####################################
-
-if GTK_DOC_USE_LIBTOOL
-GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-GTKDOC_LD = $(LIBTOOL) --tag=CC --mode=link $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
-GTKDOC_RUN = $(LIBTOOL) --mode=execute
-else
-GTKDOC_CC = $(CC) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-GTKDOC_LD = $(CC) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS)
-GTKDOC_RUN =
-endif
-
-# We set GPATH here; this gives us semantics for GNU make
-# which are more like other make's VPATH, when it comes to
-# whether a source that is a target of one rule is then
-# searched for in VPATH/GPATH.
-#
-GPATH = $(srcdir)
-
-TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)
-
-EXTRA_DIST = \
- $(content_files) \
- $(HTML_IMAGES) \
- $(DOC_MAIN_SGML_FILE) \
- $(DOC_MODULE)-sections.txt \
- $(DOC_MODULE)-overrides.txt
-
-DOC_STAMPS=scan-build.stamp tmpl-build.stamp sgml-build.stamp html-build.stamp \
- pdf-build.stamp \
- $(srcdir)/tmpl.stamp $(srcdir)/sgml.stamp $(srcdir)/html.stamp \
- $(srcdir)/pdf.stamp
-
-SCANOBJ_FILES = \
- $(DOC_MODULE).args \
- $(DOC_MODULE).hierarchy \
- $(DOC_MODULE).interfaces \
- $(DOC_MODULE).prerequisites \
- $(DOC_MODULE).signals
-
-REPORT_FILES = \
- $(DOC_MODULE)-undocumented.txt \
- $(DOC_MODULE)-undeclared.txt \
- $(DOC_MODULE)-unused.txt
-
-CLEANFILES = $(SCANOBJ_FILES) $(REPORT_FILES) $(DOC_STAMPS)
-
-if ENABLE_GTK_DOC
-if GTK_DOC_BUILD_HTML
-HTML_BUILD_STAMP=html-build.stamp
-else
-HTML_BUILD_STAMP=
-endif
-if GTK_DOC_BUILD_PDF
-PDF_BUILD_STAMP=pdf-build.stamp
-else
-PDF_BUILD_STAMP=
-endif
-
-all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
-else
-all-local:
-endif
-
-docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
-
-$(REPORT_FILES): sgml-build.stamp
-
-#### scan ####
-
-scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
- @echo 'gtk-doc: Scanning header files'
- @-chmod -R u+w $(srcdir)
- @_source_dir='' ; for i in $(DOC_SOURCE_DIR) ; do \
- _source_dir="$${_source_dir} --source-dir=$$i" ; \
- done ; \
- cd $(srcdir) && \
- gtkdoc-scan --module=$(DOC_MODULE) --ignore-headers="$(IGNORE_HFILES)" $${_source_dir} $(SCAN_OPTIONS) $(EXTRA_HFILES)
- @if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null 2>&1 ; then \
- CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" RUN="$(GTKDOC_RUN)" CFLAGS="$(GTKDOC_CFLAGS) $(CFLAGS)" LDFLAGS="$(GTKDOC_LIBS) $(LDFLAGS)" gtkdoc-scangobj $(SCANGOBJ_OPTIONS) --module=$(DOC_MODULE) --output-dir=$(srcdir) ; \
- else \
- cd $(srcdir) ; \
- for i in $(SCANOBJ_FILES) ; do \
- test -f $$i || touch $$i ; \
- done \
- fi
- @touch scan-build.stamp
-
-$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
- @true
-
-#### templates ####
-
-tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
- @echo 'gtk-doc: Rebuilding template files'
- @-chmod -R u+w $(srcdir)
- @cd $(srcdir) && gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
- @touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-$(srcdir)/tmpl/*.sgml:
- @true
-
-#### xml ####
-
-sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
- @echo 'gtk-doc: Building XML'
- @-chmod -R u+w $(srcdir)
- @_source_dir='' ; for i in $(DOC_SOURCE_DIR) ; do \
- _source_dir="$${_source_dir} --source-dir=$$i" ; \
- done ; \
- cd $(srcdir) && \
- gtkdoc-mkdb --module=$(DOC_MODULE) --output-format=xml --expand-content-files="$(expand_content_files)" --main-sgml-file=$(DOC_MAIN_SGML_FILE) $${_source_dir} $(MKDB_OPTIONS)
- @touch sgml-build.stamp
-
-sgml.stamp: sgml-build.stamp
- @true
-
-#### html ####
-
-html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
- @echo 'gtk-doc: Building HTML'
- @-chmod -R u+w $(srcdir)
- @rm -rf $(srcdir)/html
- @mkdir $(srcdir)/html
- @mkhtml_options=""; \
- gtkdoc-mkhtml 2>&1 --help | grep >/dev/null "\-\-path"; \
- if test "$(?)" = "0"; then \
- mkhtml_options=--path="$(srcdir)"; \
- fi; \
- cd $(srcdir)/html && gtkdoc-mkhtml $$mkhtml_options $(MKHTML_OPTIONS) $(DOC_MODULE) ../$(DOC_MAIN_SGML_FILE)
- @test "x$(HTML_IMAGES)" = "x" || ( cd $(srcdir) && cp $(HTML_IMAGES) html )
- @echo 'gtk-doc: Fixing cross-references'
- @cd $(srcdir) && gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
- @touch html-build.stamp
-
-#### pdf ####
-
-pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
- @echo 'gtk-doc: Building PDF'
- @-chmod -R u+w $(srcdir)
- @rm -rf $(srcdir)/$(DOC_MODULE).pdf
- @mkpdf_imgdirs=""; \
- if test "x$(HTML_IMAGES)" != "x"; then \
- for img in $(HTML_IMAGES); do \
- part=`dirname $$img`; \
- echo $$mkpdf_imgdirs | grep >/dev/null "\-\-imgdir=$$part "; \
- if test $$? != 0; then \
- mkpdf_imgdirs="$$mkpdf_imgdirs --imgdir=$$part"; \
- fi; \
- done; \
- fi; \
- cd $(srcdir) && gtkdoc-mkpdf --path="$(abs_srcdir)" $$mkpdf_imgdirs $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) $(MKPDF_OPTIONS)
- @touch pdf-build.stamp
-
-##############
-
-clean-local:
- rm -f *~ *.bak
- rm -rf .libs
-
-distclean-local:
- cd $(srcdir) && \
- rm -rf xml $(REPORT_FILES) $(DOC_MODULE).pdf \
- $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
-
-maintainer-clean-local: clean
- cd $(srcdir) && rm -rf xml html
-
-install-data-local:
- @installfiles=`echo $(srcdir)/html/*`; \
- if test "$$installfiles" = '$(srcdir)/html/*'; \
- then echo '-- Nothing to install' ; \
- else \
- if test -n "$(DOC_MODULE_VERSION)"; then \
- installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
- else \
- installdir="$(DESTDIR)$(TARGET_DIR)"; \
- fi; \
- $(mkinstalldirs) $${installdir} ; \
- for i in $$installfiles; do \
- echo '-- Installing '$$i ; \
- $(INSTALL_DATA) $$i $${installdir}; \
- done; \
- if test -n "$(DOC_MODULE_VERSION)"; then \
- mv -f $${installdir}/$(DOC_MODULE).devhelp2 \
- $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp2; \
- mv -f $${installdir}/$(DOC_MODULE).devhelp \
- $${installdir}/$(DOC_MODULE)-$(DOC_MODULE_VERSION).devhelp; \
- fi; \
- $(GTKDOC_REBASE) --relative --dest-dir=$(DESTDIR) --html-dir=$${installdir}; \
- fi
-
-uninstall-local:
- @if test -n "$(DOC_MODULE_VERSION)"; then \
- installdir="$(DESTDIR)$(TARGET_DIR)-$(DOC_MODULE_VERSION)"; \
- else \
- installdir="$(DESTDIR)$(TARGET_DIR)"; \
- fi; \
- rm -rf $${installdir}
-
-#
-# Require gtk-doc when making dist
-#
-if ENABLE_GTK_DOC
-dist-check-gtkdoc:
-else
-dist-check-gtkdoc:
- @echo "*** gtk-doc must be installed and enabled in order to make dist"
- @false
-endif
-
-dist-hook: dist-check-gtkdoc dist-hook-local
- mkdir $(distdir)/tmpl
- mkdir $(distdir)/html
- -cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
- cp $(srcdir)/html/* $(distdir)/html
- -cp $(srcdir)/$(DOC_MODULE).pdf $(distdir)/
- -cp $(srcdir)/$(DOC_MODULE).types $(distdir)/
- -cp $(srcdir)/$(DOC_MODULE)-sections.txt $(distdir)/
- cd $(distdir) && rm -f $(DISTCLEANFILES)
- $(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
-
-.PHONY : dist-hook-local docs
diff --git a/m4/gtk-doc.m4 b/m4/gtk-doc.m4
deleted file mode 100644
index 2cfa1e7..0000000
--- a/m4/gtk-doc.m4
+++ /dev/null
@@ -1,61 +0,0 @@
-dnl -*- mode: autoconf -*-
-
-# serial 1
-
-dnl Usage:
-dnl GTK_DOC_CHECK([minimum-gtk-doc-version])
-AC_DEFUN([GTK_DOC_CHECK],
-[
- AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
- AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
-
- dnl check for tools we added during development
- AC_PATH_PROG([GTKDOC_CHECK],[gtkdoc-check])
- AC_PATH_PROGS([GTKDOC_REBASE],[gtkdoc-rebase],[true])
- AC_PATH_PROG([GTKDOC_MKPDF],[gtkdoc-mkpdf])
-
- dnl for overriding the documentation installation directory
- AC_ARG_WITH([html-dir],
- AS_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),,
- [with_html_dir='${datadir}/gtk-doc/html'])
- HTML_DIR="$with_html_dir"
- AC_SUBST([HTML_DIR])
-
- dnl enable/disable documentation building
- AC_ARG_ENABLE([gtk-doc],
- AS_HELP_STRING([--enable-gtk-doc],
- [use gtk-doc to build documentation [[default=no]]]),,
- [enable_gtk_doc=no])
-
- if test x$enable_gtk_doc = xyes; then
- ifelse([$1],[],
- [PKG_CHECK_EXISTS([gtk-doc],,
- AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))],
- [PKG_CHECK_EXISTS([gtk-doc >= $1],,
- AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))])
- fi
-
- AC_MSG_CHECKING([whether to build gtk-doc documentation])
- AC_MSG_RESULT($enable_gtk_doc)
-
- dnl enable/disable output formats
- AC_ARG_ENABLE([gtk-doc-html],
- AS_HELP_STRING([--enable-gtk-doc-html],
- [build documentation in html format [[default=yes]]]),,
- [enable_gtk_doc_html=yes])
- AC_ARG_ENABLE([gtk-doc-pdf],
- AS_HELP_STRING([--enable-gtk-doc-pdf],
- [build documentation in pdf format [[default=no]]]),,
- [enable_gtk_doc_pdf=no])
-
- if test -z "$GTKDOC_MKPDF"; then
- enable_gtk_doc_pdf=no
- fi
-
-
- AM_CONDITIONAL([ENABLE_GTK_DOC], [test x$enable_gtk_doc = xyes])
- AM_CONDITIONAL([GTK_DOC_BUILD_HTML], [test x$enable_gtk_doc_html = xyes])
- AM_CONDITIONAL([GTK_DOC_BUILD_PDF], [test x$enable_gtk_doc_pdf = xyes])
- AM_CONDITIONAL([GTK_DOC_USE_LIBTOOL], [test -n "$LIBTOOL"])
- AM_CONDITIONAL([GTK_DOC_USE_REBASE], [test -n "$GTKDOC_REBASE"])
-])
diff --git a/omf.make b/omf.make
deleted file mode 100644
index cb7acba..0000000
--- a/omf.make
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-# No modifications of this Makefile should be necessary.
-#
-# This file contains the build instructions for installing OMF files. It is
-# generally called from the makefiles for particular formats of documentation.
-#
-# Note that you must configure your package with --localstatedir=/var
-# so that the scrollkeeper-update command below will update the database
-# in the standard scrollkeeper directory.
-#
-# If it is impossible to configure with --localstatedir=/var, then
-# modify the definition of scrollkeeper_localstate_dir so that
-# it points to the correct location. Note that you must still use
-# $(localstatedir) in this or when people build RPMs it will update
-# the real database on their system instead of the one under RPM_BUILD_ROOT.
-#
-# Note: This make file is not incorporated into xmldocs.make because, in
-# general, there will be other documents install besides XML documents
-# and the makefiles for these formats should also include this file.
-#
-# About this file:
-# This file was derived from scrollkeeper_example2, a package
-# illustrating how to install documentation and OMF files for use with
-# ScrollKeeper 0.3.x and 0.4.x. For more information, see:
-# http://scrollkeeper.sourceforge.net/
-# Version: 0.1.3 (last updated: March 20, 2002)
-#
-
-omf_dest_dir=$(datadir)/omf/@PACKAGE@
-scrollkeeper_localstate_dir = $(localstatedir)/scrollkeeper
-
-# At some point, it may be wise to change to something like this:
-# scrollkeeper_localstate_dir = @SCROLLKEEPER_STATEDIR@
-
-omf: omf_timestamp
-
-omf_timestamp: $(omffile)
- -for file in $(omffile); do \
- scrollkeeper-preinstall $(docdir)/$(docname).xml $(srcdir)/$$file $$file.out; \
- done; \
- touch omf_timestamp
-
-install-data-hook-omf:
- $(mkinstalldirs) $(DESTDIR)$(omf_dest_dir)
- for file in $(omffile); do \
- $(INSTALL_DATA) $$file.out $(DESTDIR)$(omf_dest_dir)/$$file; \
- done
- -scrollkeeper-update -p $(DESTDIR)$(scrollkeeper_localstate_dir) -o $(DESTDIR)$(omf_dest_dir)
-
-uninstall-local-omf:
- -for file in $(srcdir)/*.omf; do \
- basefile=`basename $$file`; \
- rm -f $(DESTDIR)$(omf_dest_dir)/$$basefile; \
- done
- -rmdir $(DESTDIR)$(omf_dest_dir)
- -scrollkeeper-update -p $(DESTDIR)$(scrollkeeper_localstate_dir)
-
-clean-local-omf:
- -for file in $(omffile); do \
- rm -f $$file.out; \
- done
diff --git a/py-compile b/py-compile
deleted file mode 100755
index 3f9d05b..0000000
--- a/py-compile
+++ /dev/null
@@ -1,146 +0,0 @@
-#!/bin/sh
-# py-compile - Compile a Python program
-
-scriptversion=2009-04-28.21; # UTC
-
-# Copyright (C) 2000, 2001, 2003, 2004, 2005, 2008, 2009 Free Software
-# Foundation, Inc.
-
-# 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
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program 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 General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-if [ -z "$PYTHON" ]; then
- PYTHON=python
-fi
-
-basedir=
-destdir=
-files=
-while test $# -ne 0; do
- case "$1" in
- --basedir)
- basedir=$2
- if test -z "$basedir"; then
- echo "$0: Missing argument to --basedir." 1>&2
- exit 1
- fi
- shift
- ;;
- --destdir)
- destdir=$2
- if test -z "$destdir"; then
- echo "$0: Missing argument to --destdir." 1>&2
- exit 1
- fi
- shift
- ;;
- -h|--h*)
- cat <<\EOF
-Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..."
-
-Byte compile some python scripts FILES. Use --destdir to specify any
-leading directory path to the FILES that you don't want to include in the
-byte compiled file. Specify --basedir for any additional path information you
-do want to be shown in the byte compiled file.
-
-Example:
- py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
- exit $?
- ;;
- -v|--v*)
- echo "py-compile $scriptversion"
- exit $?
- ;;
- *)
- files="$files $1"
- ;;
- esac
- shift
-done
-
-if test -z "$files"; then
- echo "$0: No files given. Try \`$0 --help' for more information." 1>&2
- exit 1
-fi
-
-# if basedir was given, then it should be prepended to filenames before
-# byte compilation.
-if [ -z "$basedir" ]; then
- pathtrans="path = file"
-else
- pathtrans="path = os.path.join('$basedir', file)"
-fi
-
-# if destdir was given, then it needs to be prepended to the filename to
-# byte compile but not go into the compiled file.
-if [ -z "$destdir" ]; then
- filetrans="filepath = path"
-else
- filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)"
-fi
-
-$PYTHON -c "
-import sys, os, py_compile
-
-files = '''$files'''
-
-sys.stdout.write('Byte-compiling python modules...\n')
-for file in files.split():
- $pathtrans
- $filetrans
- if not os.path.exists(filepath) or not (len(filepath) >= 3
- and filepath[-3:] == '.py'):
- continue
- sys.stdout.write(file)
- sys.stdout.flush()
- py_compile.compile(filepath, filepath + 'c', path)
-sys.stdout.write('\n')" || exit $?
-
-# this will fail for python < 1.5, but that doesn't matter ...
-$PYTHON -O -c "
-import sys, os, py_compile
-
-files = '''$files'''
-sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n')
-for file in files.split():
- $pathtrans
- $filetrans
- if not os.path.exists(filepath) or not (len(filepath) >= 3
- and filepath[-3:] == '.py'):
- continue
- sys.stdout.write(file)
- sys.stdout.flush()
- py_compile.compile(filepath, filepath + 'o', path)
-sys.stdout.write('\n')" 2>/dev/null || :
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/src/Makefile.am b/src/Makefile.am
index 23f5727..18e2baf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -39,11 +39,8 @@ libapplication_la_LDFLAGS = -module -avoid-version
libexec_PROGRAMS = indicator-application-service
BUILT_SOURCES += \
- application-service-server.h \
application-service-marshal.h \
application-service-marshal.c \
- dbus-properties-client.h \
- notification-item-client.h \
notification-watcher-server.h
indicator_application_service_SOURCES = \
@@ -53,6 +50,7 @@ indicator_application_service_SOURCES = \
application-service-marshal.c \
application-service-watcher.h \
application-service-watcher.c \
+ gen-application-service.xml.c \
app-indicator-enum-types.c \
dbus-shared.h \
generate-id.h \
@@ -81,11 +79,11 @@ DISTCLEANFILES += app-indicator-enum-types.c
# DBus Specs
##################################
-DBUS_SPECS = \
- dbus-properties.xml \
+GDBUS_SPECS = \
application-service.xml \
- notification-approver.xml \
- notification-item.xml \
+ notification-approver.xml
+
+DBUS_SPECS = \
notification-watcher.xml
%-client.h: %.xml
@@ -102,10 +100,24 @@ DBUS_SPECS = \
--output=$@ \
$<
+gen-%.xml.c: %.xml
+ @echo "Building $@ from $<"
+ @echo "const char * _$(notdir $(subst -,_,$(subst .,_,$(basename $<)))) = " > $@
+ @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@
+ @echo ";" >> $@
+
+gen-%.xml.h: %.xml
+ @echo "Building $@ from $<"
+ @echo "extern const char * _$(notdir $(subst -,_,$(subst .,_,$(basename $<))));" > $@
+
BUILT_SOURCES += \
$(DBUS_SPECS:.xml=-client.h) \
- $(DBUS_SPECS:.xml=-server.h)
+ $(DBUS_SPECS:.xml=-server.h) \
+ gen-application-service.xml.c \
+ gen-application-service.xml.h \
+ gen-notification-approver.xml.c \
+ gen-notification-approver.xml.h
CLEANFILES += $(BUILT_SOURCES)
-EXTRA_DIST += $(DBUS_SPECS)
+EXTRA_DIST += $(DBUS_SPECS) $(GDBUS_SPECS)
diff --git a/src/Makefile.in b/src/Makefile.in
index 0a904c9..c24eb09 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -127,6 +127,7 @@ am_indicator_application_service_OBJECTS = \
indicator_application_service-application-service-appstore.$(OBJEXT) \
indicator_application_service-application-service-marshal.$(OBJEXT) \
indicator_application_service-application-service-watcher.$(OBJEXT) \
+ indicator_application_service-gen-application-service.xml.$(OBJEXT) \
indicator_application_service-app-indicator-enum-types.$(OBJEXT) \
indicator_application_service-generate-id.$(OBJEXT)
indicator_application_service_OBJECTS = \
@@ -301,13 +302,14 @@ CLEANFILES = stamp-enum-types stamp-marshal $(BUILT_SOURCES)
DISTCLEANFILES = $(glib_enum_h) $(glib_enum_c) $(marshal_h) \
$(marshal_c) app-indicator-enum-types.c
BUILT_SOURCES = $(glib_enum_h) $(glib_enum_c) $(marshal_h) \
- $(marshal_c) application-service-server.h \
- application-service-marshal.h application-service-marshal.c \
- dbus-properties-client.h notification-item-client.h \
- notification-watcher-server.h $(DBUS_SPECS:.xml=-client.h) \
- $(DBUS_SPECS:.xml=-server.h)
+ $(marshal_c) application-service-marshal.h \
+ application-service-marshal.c notification-watcher-server.h \
+ $(DBUS_SPECS:.xml=-client.h) $(DBUS_SPECS:.xml=-server.h) \
+ gen-application-service.xml.c gen-application-service.xml.h \
+ gen-notification-approver.xml.c \
+ gen-notification-approver.xml.h
EXTRA_DIST = $(enum_tmpl_h) $(enum_tmpl_c) $(glib_marshal_list) \
- $(DBUS_SPECS)
+ $(DBUS_SPECS) $(GDBUS_SPECS)
enum_tmpl_h = $(glib_enum_h:.h=.h.in)
enum_tmpl_c = $(glib_enum_c:.c=.c.in)
marshal_h = $(glib_marshal_list:.list=.h)
@@ -340,6 +342,7 @@ indicator_application_service_SOURCES = \
application-service-marshal.c \
application-service-watcher.h \
application-service-watcher.c \
+ gen-application-service.xml.c \
app-indicator-enum-types.c \
dbus-shared.h \
generate-id.h \
@@ -364,11 +367,11 @@ glib_enum_headers = $(wildcard $(APP_INDICATOR_INCLUDE)/libappindicator/*.h)
##################################
# DBus Specs
##################################
-DBUS_SPECS = \
- dbus-properties.xml \
+GDBUS_SPECS = \
application-service.xml \
- notification-approver.xml \
- notification-item.xml \
+ notification-approver.xml
+
+DBUS_SPECS = \
notification-watcher.xml
all: $(BUILT_SOURCES)
@@ -497,6 +500,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_application_service-application-service-marshal.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_application_service-application-service-watcher.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_application_service-application-service.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_application_service-gen-application-service.xml.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_application_service-generate-id.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapplication_la-application-service-marshal.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libapplication_la-indicator-application.Plo@am__quote@
@@ -605,6 +609,22 @@ indicator_application_service-application-service-watcher.obj: application-servi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -c -o indicator_application_service-application-service-watcher.obj `if test -f 'application-service-watcher.c'; then $(CYGPATH_W) 'application-service-watcher.c'; else $(CYGPATH_W) '$(srcdir)/application-service-watcher.c'; fi`
+indicator_application_service-gen-application-service.xml.o: gen-application-service.xml.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-gen-application-service.xml.o -MD -MP -MF $(DEPDIR)/indicator_application_service-gen-application-service.xml.Tpo -c -o indicator_application_service-gen-application-service.xml.o `test -f 'gen-application-service.xml.c' || echo '$(srcdir)/'`gen-application-service.xml.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-gen-application-service.xml.Tpo $(DEPDIR)/indicator_application_service-gen-application-service.xml.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gen-application-service.xml.c' object='indicator_application_service-gen-application-service.xml.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -c -o indicator_application_service-gen-application-service.xml.o `test -f 'gen-application-service.xml.c' || echo '$(srcdir)/'`gen-application-service.xml.c
+
+indicator_application_service-gen-application-service.xml.obj: gen-application-service.xml.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-gen-application-service.xml.obj -MD -MP -MF $(DEPDIR)/indicator_application_service-gen-application-service.xml.Tpo -c -o indicator_application_service-gen-application-service.xml.obj `if test -f 'gen-application-service.xml.c'; then $(CYGPATH_W) 'gen-application-service.xml.c'; else $(CYGPATH_W) '$(srcdir)/gen-application-service.xml.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-gen-application-service.xml.Tpo $(DEPDIR)/indicator_application_service-gen-application-service.xml.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gen-application-service.xml.c' object='indicator_application_service-gen-application-service.xml.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -c -o indicator_application_service-gen-application-service.xml.obj `if test -f 'gen-application-service.xml.c'; then $(CYGPATH_W) 'gen-application-service.xml.c'; else $(CYGPATH_W) '$(srcdir)/gen-application-service.xml.c'; fi`
+
indicator_application_service-app-indicator-enum-types.o: app-indicator-enum-types.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-app-indicator-enum-types.o -MD -MP -MF $(DEPDIR)/indicator_application_service-app-indicator-enum-types.Tpo -c -o indicator_application_service-app-indicator-enum-types.o `test -f 'app-indicator-enum-types.c' || echo '$(srcdir)/'`app-indicator-enum-types.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-app-indicator-enum-types.Tpo $(DEPDIR)/indicator_application_service-app-indicator-enum-types.Po
@@ -909,6 +929,16 @@ $(marshal_c): $(marshal_h)
--output=$@ \
$<
+gen-%.xml.c: %.xml
+ @echo "Building $@ from $<"
+ @echo "const char * _$(notdir $(subst -,_,$(subst .,_,$(basename $<)))) = " > $@
+ @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@
+ @echo ";" >> $@
+
+gen-%.xml.h: %.xml
+ @echo "Building $@ from $<"
+ @echo "extern const char * _$(notdir $(subst -,_,$(subst .,_,$(basename $<))));" > $@
+
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff --git a/src/app-indicator-enum-types.c b/src/app-indicator-enum-types.c
index 82042b6..f73ed2c 100644
--- a/src/app-indicator-enum-types.c
+++ b/src/app-indicator-enum-types.c
@@ -31,7 +31,7 @@ License version 3 and version 2.1 along with this program. If not, see
#include "app-indicator-enum-types.h"
-#include "./app-indicator.h"
+#include "/usr/include/libappindicator-0.1//libappindicator/app-indicator.h"
/**
app_indicator_category_get_type:
diff --git a/src/app-indicator-enum-types.h b/src/app-indicator-enum-types.h
deleted file mode 100644
index 48b596b..0000000
--- a/src/app-indicator-enum-types.h
+++ /dev/null
@@ -1,52 +0,0 @@
-
-/* Generated data (by glib-mkenums) */
-
-/*
-An object to represent the application as an application indicator
-in the system panel.
-
-Copyright 2009 Canonical Ltd.
-
-Authors:
- Ted Gould <ted@canonical.com>
-
-This program is free software: you can redistribute it and/or modify it
-under the terms of either or both of the following licenses:
-
-1) the GNU Lesser General Public License version 3, as published by the
- Free Software Foundation; and/or
-2) the GNU Lesser General Public License version 2.1, as published by
- the Free Software Foundation.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranties of
-MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
-PURPOSE. See the applicable version of the GNU Lesser General Public
-License for more details.
-
-You should have received a copy of both the GNU Lesser General Public
-License version 3 and version 2.1 along with this program. If not, see
-<http://www.gnu.org/licenses/>
-*/
-
-#ifndef __APP_INDICATOR_ENUM_TYPES_H__
-#define __APP_INDICATOR_ENUM_TYPES_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-/* Enumerations from file: "./app-indicator.h" */
-GType app_indicator_category_get_type (void) G_GNUC_CONST;
-#define APP_INDICATOR_TYPE_INDICATOR_CATEGORY (app_indicator_category_get_type())
-
-GType app_indicator_status_get_type (void) G_GNUC_CONST;
-#define APP_INDICATOR_TYPE_INDICATOR_STATUS (app_indicator_status_get_type())
-
-
-G_END_DECLS
-
-#endif /* __APP_INDICATOR_ENUM_TYPES_H__ */
-
-/* Generated data ends here */
-
diff --git a/src/appindicator3-0.1.pc.in b/src/appindicator3-0.1.pc.in
deleted file mode 100644
index a485910..0000000
--- a/src/appindicator3-0.1.pc.in
+++ /dev/null
@@ -1,14 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-bindir=@bindir@
-includedir=@includedir@
-
-Cflags: -I${includedir}/libappindicator3-0.1
-Requires: dbusmenu-glib gtk+-3.0
-Libs: -L${libdir} -lappindicator3
-
-Name: appindicator3-0.1
-Description: Application indicators
-Version: @VERSION@
-
diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c
index 6e05739..481d886 100644
--- a/src/application-service-appstore.c
+++ b/src/application-service-appstore.c
@@ -24,20 +24,19 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config.h"
#endif
-#include <dbus/dbus-glib.h>
#include "libappindicator/app-indicator.h"
#include "app-indicator-enum-types.h"
#include "application-service-appstore.h"
#include "application-service-marshal.h"
-#include "dbus-properties-client.h"
#include "dbus-shared.h"
-#include "notification-approver-client.h"
#include "generate-id.h"
/* DBus Prototypes */
-static gboolean _application_service_server_get_applications (ApplicationServiceAppstore * appstore, GPtrArray ** apps, GError ** error);
+static GVariant * get_applications (ApplicationServiceAppstore * appstore);
+static void bus_method_call (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * method, GVariant * params, GDBusMethodInvocation * invocation, gpointer user_data);
+static void props_cb (GObject * object, GAsyncResult * res, gpointer user_data);
-#include "application-service-server.h"
+#include "gen-application-service.xml.h"
#define NOTIFICATION_ITEM_PROP_ID "Id"
#define NOTIFICATION_ITEM_PROP_CATEGORY "Category"
@@ -61,7 +60,9 @@ static gboolean _application_service_server_get_applications (ApplicationService
/* Private Stuff */
struct _ApplicationServiceAppstorePrivate {
- DBusGConnection * bus;
+ GCancellable * bus_cancel;
+ GDBusConnection * bus;
+ guint dbus_registration;
GList * applications;
GList * approvers;
GHashTable * ordering_overrides;
@@ -76,8 +77,10 @@ typedef enum {
typedef struct _Approver Approver;
struct _Approver {
- DBusGProxy * proxy;
- gboolean destroy_by_proxy;
+ ApplicationServiceAppstore * appstore; /* not ref'd */
+ GCancellable * proxy_cancel;
+ GDBusProxy * proxy;
+ guint name_watcher;
};
typedef struct _Application Application;
@@ -87,8 +90,11 @@ struct _Application {
gchar * dbus_name;
gchar * dbus_object;
ApplicationServiceAppstore * appstore; /* not ref'd */
- DBusGProxy * dbus_proxy;
- DBusGProxy * prop_proxy;
+ GCancellable * dbus_proxy_cancel;
+ GDBusProxy * dbus_proxy;
+ GCancellable * props_cancel;
+ gboolean queued_props;
+ GDBusProxy * props;
gboolean validated; /* Whether we've gotten all the parameters and they look good. */
AppIndicatorStatus status;
gchar * icon;
@@ -101,23 +107,21 @@ struct _Application {
guint ordering_index;
GList * approved_by;
visible_state_t visible_state;
+ guint name_watcher;
};
#define APPLICATION_SERVICE_APPSTORE_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstorePrivate))
-/* Signals Stuff */
-enum {
- APPLICATION_ADDED,
- APPLICATION_REMOVED,
- APPLICATION_ICON_CHANGED,
- APPLICATION_LABEL_CHANGED,
- APPLICATION_ICON_THEME_PATH_CHANGED,
- LAST_SIGNAL
+/* GDBus Stuff */
+static GDBusNodeInfo * node_info = NULL;
+static GDBusInterfaceInfo * interface_info = NULL;
+static GDBusInterfaceVTable interface_table = {
+ method_call: bus_method_call,
+ get_property: NULL, /* No properties */
+ set_property: NULL /* No properties */
};
-static guint signals[LAST_SIGNAL] = { 0 };
-
/* GObject stuff */
static void application_service_appstore_class_init (ApplicationServiceAppstoreClass *klass);
static void application_service_appstore_init (ApplicationServiceAppstore *self);
@@ -132,6 +136,13 @@ static void approver_free (gpointer papprover, gpointer user_data);
static void check_with_new_approver (gpointer papp, gpointer papprove);
static void check_with_old_approver (gpointer papprove, gpointer papp);
static Application * find_application (ApplicationServiceAppstore * appstore, const gchar * address, const gchar * object);
+static void bus_get_cb (GObject * object, GAsyncResult * res, gpointer user_data);
+static void dbus_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data);
+static void app_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data);
+static void approver_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data);
+static void approver_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data);
+static void get_all_properties (Application * app);
+static void application_free (Application * app);
G_DEFINE_TYPE (ApplicationServiceAppstore, application_service_appstore, G_TYPE_OBJECT);
@@ -145,56 +156,24 @@ application_service_appstore_class_init (ApplicationServiceAppstoreClass *klass)
object_class->dispose = application_service_appstore_dispose;
object_class->finalize = application_service_appstore_finalize;
- signals[APPLICATION_ADDED] = g_signal_new ("application-added",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_added),
- NULL, NULL,
- _application_service_marshal_VOID__STRING_INT_STRING_STRING_STRING_STRING_STRING,
- G_TYPE_NONE, 7, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_NONE);
- signals[APPLICATION_REMOVED] = g_signal_new ("application-removed",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_removed),
- NULL, NULL,
- g_cclosure_marshal_VOID__INT,
- G_TYPE_NONE, 1, G_TYPE_INT, G_TYPE_NONE);
- signals[APPLICATION_ICON_CHANGED] = g_signal_new ("application-icon-changed",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_icon_changed),
- NULL, NULL,
- _application_service_marshal_VOID__INT_STRING,
- G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING, G_TYPE_NONE);
- signals[APPLICATION_ICON_THEME_PATH_CHANGED] = g_signal_new ("application-icon-theme-path-changed",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_icon_theme_path_changed),
- NULL, NULL,
- _application_service_marshal_VOID__INT_STRING,
- G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING, G_TYPE_NONE);
- signals[APPLICATION_LABEL_CHANGED] = g_signal_new ("application-label-changed",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (ApplicationServiceAppstoreClass, application_label_changed),
- NULL, NULL,
- _application_service_marshal_VOID__INT_STRING_STRING,
- G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_NONE);
-
- dbus_g_object_register_marshaller(_application_service_marshal_VOID__STRING_STRING,
- G_TYPE_NONE,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_object_register_marshaller(_application_service_marshal_VOID__BOOLEAN_STRING_OBJECT,
- G_TYPE_NONE,
- G_TYPE_BOOLEAN,
- G_TYPE_STRING,
- G_TYPE_OBJECT,
- G_TYPE_INVALID);
-
- dbus_g_object_type_install_info(APPLICATION_SERVICE_APPSTORE_TYPE,
- &dbus_glib__application_service_server_object_info);
+ /* Setting up the DBus interfaces */
+ if (node_info == NULL) {
+ GError * error = NULL;
+
+ node_info = g_dbus_node_info_new_for_xml(_application_service, &error);
+ if (error != NULL) {
+ g_error("Unable to parse Application Service Interface description: %s", error->message);
+ g_error_free(error);
+ }
+ }
+
+ if (interface_info == NULL) {
+ interface_info = g_dbus_node_info_lookup_interface(node_info, INDICATOR_APPLICATION_DBUS_IFACE);
+
+ if (interface_info == NULL) {
+ g_error("Unable to find interface '" INDICATOR_APPLICATION_DBUS_IFACE "'");
+ }
+ }
return;
}
@@ -207,6 +186,8 @@ application_service_appstore_init (ApplicationServiceAppstore *self)
priv->applications = NULL;
priv->approvers = NULL;
+ priv->bus_cancel = NULL;
+ priv->dbus_registration = 0;
priv->ordering_overrides = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
@@ -214,21 +195,76 @@ application_service_appstore_init (ApplicationServiceAppstore *self)
gchar * userfile = g_build_filename(g_get_user_data_dir(), "indicators", "application", OVERRIDE_FILE_NAME, NULL);
load_override_file(priv->ordering_overrides, userfile);
g_free(userfile);
-
+
+ priv->bus_cancel = g_cancellable_new();
+ g_bus_get(G_BUS_TYPE_SESSION,
+ priv->bus_cancel,
+ bus_get_cb,
+ self);
+
+ self->priv = priv;
+
+ return;
+}
+
+static void
+bus_get_cb (GObject * object, GAsyncResult * res, gpointer user_data)
+{
GError * error = NULL;
- priv->bus = dbus_g_bus_get(DBUS_BUS_STARTER, &error);
+ GDBusConnection * connection = g_bus_get_finish(res, &error);
+
if (error != NULL) {
- g_error("Unable to get session bus: %s", error->message);
+ g_error("OMG! Unable to get a connection to DBus: %s", error->message);
g_error_free(error);
return;
}
- dbus_g_connection_register_g_object(priv->bus,
- INDICATOR_APPLICATION_DBUS_OBJ,
- G_OBJECT(self));
-
- self->priv = priv;
+ ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (user_data);
+ g_warn_if_fail(priv->bus == NULL);
+ priv->bus = connection;
+
+ if (priv->bus_cancel != NULL) {
+ g_object_unref(priv->bus_cancel);
+ priv->bus_cancel = NULL;
+ }
+
+ /* Now register our object on our new connection */
+ priv->dbus_registration = g_dbus_connection_register_object(priv->bus,
+ INDICATOR_APPLICATION_DBUS_OBJ,
+ interface_info,
+ &interface_table,
+ user_data,
+ NULL,
+ &error);
+
+ if (error != NULL) {
+ g_error("Unable to register the object to DBus: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+
+ return;
+}
+
+/* A method has been called from our dbus inteface. Figure out what it
+ is and dispatch it. */
+static void
+bus_method_call (GDBusConnection * connection, const gchar * sender,
+ const gchar * path, const gchar * interface,
+ const gchar * method, GVariant * params,
+ GDBusMethodInvocation * invocation, gpointer user_data)
+{
+ ApplicationServiceAppstore * service = APPLICATION_SERVICE_APPSTORE(user_data);
+ GVariant * retval = NULL;
+
+ if (g_strcmp0(method, "GetApplications") == 0) {
+ retval = get_applications(service);
+ } else {
+ g_warning("Calling method '%s' on the indicator service and it's unknown", method);
+ }
+
+ g_dbus_method_invocation_return_value(invocation, retval);
return;
}
@@ -249,6 +285,23 @@ application_service_appstore_dispose (GObject *object)
priv->approvers = NULL;
}
+ if (priv->dbus_registration != 0) {
+ g_dbus_connection_unregister_object(priv->bus, priv->dbus_registration);
+ /* Don't care if it fails, there's nothing we can do */
+ priv->dbus_registration = 0;
+ }
+
+ if (priv->bus != NULL) {
+ g_object_unref(priv->bus);
+ priv->bus = NULL;
+ }
+
+ if (priv->bus_cancel != NULL) {
+ g_cancellable_cancel(priv->bus_cancel);
+ g_object_unref(priv->bus_cancel);
+ priv->bus_cancel = NULL;
+ }
+
G_OBJECT_CLASS (application_service_appstore_parent_class)->dispose (object);
return;
}
@@ -323,94 +376,156 @@ load_override_file (GHashTable * hash, const gchar * filename)
}
/* Return from getting the properties from the item. We're looking at those
- and making sure we have everythign that we need. If we do, then we'll
+ and making sure we have everything that we need. If we do, then we'll
move on up to sending this onto the indicator. */
static void
-get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data)
+got_all_properties (GObject * source_object, GAsyncResult * res,
+ gpointer user_data)
{
+ Application * app = (Application *)user_data;
+ g_return_if_fail(app != NULL);
+
+ GError * error = NULL;
+ ApplicationServiceAppstorePrivate * priv = app->appstore->priv;
+ GVariant * menu = NULL, * id = NULL, * category = NULL,
+ * status = NULL, * icon_name = NULL, * aicon_name = NULL,
+ * icon_theme_path = NULL, * index = NULL, * label = NULL,
+ * guide = NULL;
+
+ GVariant * properties = g_dbus_proxy_call_finish(app->props, res, &error);
+
+ if (app->props_cancel != NULL) {
+ g_object_unref(app->props_cancel);
+ app->props_cancel = NULL;
+ }
+
if (error != NULL) {
- g_warning("Unable to get properties: %s", error->message);
- /* TODO: We need to free all the application data here */
+ g_error("Could not grab DBus properties for %s: %s", app->dbus_name, error->message);
+ g_error_free(error);
+ if (!app->validated)
+ application_free(app);
return;
}
- Application * app = (Application *)data;
+ /* Grab all properties from variant */
+ GVariantIter * iter = NULL;
+ const gchar * name = NULL;
+ GVariant * value = NULL;
+ g_variant_get(properties, "(a{sv})", &iter);
+ while (g_variant_iter_loop (iter, "{&sv}", &name, &value)) {
+ if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_MENU) == 0) {
+ menu = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_ID) == 0) {
+ id = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_CATEGORY) == 0) {
+ category = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_STATUS) == 0) {
+ status = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_ICON_NAME) == 0) {
+ icon_name = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_AICON_NAME) == 0) {
+ aicon_name = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_ICON_THEME_PATH) == 0) {
+ icon_theme_path = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_ORDERING_INDEX) == 0) {
+ index = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_LABEL) == 0) {
+ label = g_variant_ref(value);
+ } else if (g_strcmp0(name, NOTIFICATION_ITEM_PROP_LABEL_GUIDE) == 0) {
+ guide = g_variant_ref(value);
+ } /* else ignore */
+ }
+ g_variant_iter_free (iter);
- if (g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_MENU) == NULL ||
- g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ID) == NULL ||
- g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_CATEGORY) == NULL ||
- g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_STATUS) == NULL ||
- g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_NAME) == NULL) {
+ if (menu == NULL || id == NULL || category == NULL || status == NULL ||
+ icon_name == NULL) {
g_warning("Notification Item on object %s of %s doesn't have enough properties.", app->dbus_object, app->dbus_name);
g_free(app); // Need to do more than this, but it gives the idea of the flow we're going for.
- return;
}
+ else {
+ app->validated = TRUE;
- app->validated = TRUE;
+ app->id = g_variant_dup_string(id, NULL);
+ app->category = g_variant_dup_string(category, NULL);
+ app->status = string_to_status(g_variant_get_string(status, NULL));
+ app->icon = g_variant_dup_string(icon_name, NULL);
+ app->menu = g_variant_dup_string(menu, NULL);
- app->id = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ID));
- app->category = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_CATEGORY));
- app->status = string_to_status(g_value_get_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_STATUS)));
+ /* Now the optional properties */
- ApplicationServiceAppstorePrivate * priv = app->appstore->priv;
-
- app->icon = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_NAME));
+ if (aicon_name != NULL) {
+ app->aicon = g_variant_dup_string(aicon_name, NULL);
+ }
- GValue * menuval = (GValue *)g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_MENU);
- if (G_VALUE_TYPE(menuval) == G_TYPE_STRING) {
- /* This is here to support an older version where we
- were using strings instea of object paths. */
- app->menu = g_value_dup_string(menuval);
- } else {
- app->menu = g_strdup((gchar *)g_value_get_boxed(menuval));
- }
+ if (icon_theme_path != NULL) {
+ app->icon_theme_path = g_variant_dup_string(icon_theme_path, NULL);
+ } else {
+ app->icon_theme_path = g_strdup("");
+ }
- if (g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_AICON_NAME) != NULL) {
- app->aicon = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_AICON_NAME));
- }
+ gpointer ordering_index_over = g_hash_table_lookup(priv->ordering_overrides, app->id);
+ if (ordering_index_over == NULL) {
+ if (index == NULL || g_variant_get_uint32(index) == 0) {
+ app->ordering_index = generate_id(string_to_cat(app->category), app->id);
+ } else {
+ app->ordering_index = g_variant_get_uint32(index);
+ }
+ } else {
+ app->ordering_index = GPOINTER_TO_UINT(ordering_index_over);
+ }
+ g_debug("'%s' ordering index is '%X'", app->id, app->ordering_index);
- gpointer icon_theme_path_data = g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_THEME_PATH);
- if (icon_theme_path_data != NULL) {
- app->icon_theme_path = g_value_dup_string((GValue *)icon_theme_path_data);
- } else {
- app->icon_theme_path = g_strdup("");
- }
+ if (label != NULL) {
+ app->label = g_variant_dup_string(label, NULL);
+ } else {
+ app->label = g_strdup("");
+ }
- gpointer ordering_index_over = g_hash_table_lookup(priv->ordering_overrides, app->id);
- if (ordering_index_over == NULL) {
- gpointer ordering_index_data = g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ORDERING_INDEX);
- if (ordering_index_data == NULL || g_value_get_uint(ordering_index_data) == 0) {
- app->ordering_index = generate_id(string_to_cat(app->category), app->id);
+ if (guide != NULL) {
+ app->guide = g_variant_dup_string(guide, NULL);
} else {
- app->ordering_index = g_value_get_uint(ordering_index_data);
+ app->guide = g_strdup("");
}
- } else {
- app->ordering_index = GPOINTER_TO_UINT(ordering_index_over);
- }
- g_debug("'%s' ordering index is '%X'", app->id, app->ordering_index);
- gpointer label_data = g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_LABEL);
- if (label_data != NULL) {
- app->label = g_value_dup_string((GValue *)label_data);
- } else {
- app->label = g_strdup("");
- }
+ g_list_foreach(priv->approvers, check_with_old_approver, app);
- gpointer guide_data = g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_LABEL_GUIDE);
- if (guide_data != NULL) {
- app->guide = g_value_dup_string((GValue *)guide_data);
- } else {
- app->guide = g_strdup("");
- }
+ apply_status(app);
- priv->applications = g_list_insert_sorted_with_data (priv->applications, app, app_sort_func, NULL);
- g_list_foreach(priv->approvers, check_with_old_approver, app);
+ if (app->queued_props) {
+ get_all_properties(app);
+ app->queued_props = FALSE;
+ }
+ }
- apply_status(app);
+ if (menu) g_variant_unref (menu);
+ if (id) g_variant_unref (id);
+ if (category) g_variant_unref (category);
+ if (status) g_variant_unref (status);
+ if (icon_name) g_variant_unref (icon_name);
+ if (aicon_name) g_variant_unref (aicon_name);
+ if (icon_theme_path) g_variant_unref (icon_theme_path);
+ if (index) g_variant_unref (index);
+ if (label) g_variant_unref (label);
+ if (guide) g_variant_unref (guide);
return;
}
+static void
+get_all_properties (Application * app)
+{
+ if (app->props != NULL && app->props_cancel == NULL) {
+ g_dbus_proxy_call(app->props, "GetAll",
+ g_variant_new("(s)", NOTIFICATION_ITEM_DBUS_IFACE),
+ G_DBUS_CALL_FLAGS_NONE, -1, app->props_cancel,
+ got_all_properties, app);
+ }
+ else {
+ g_debug("Queuing a properties check");
+ app->queued_props = TRUE;
+ }
+}
+
/* Check the application against an approver */
static void
check_with_old_approver (gpointer papprove, gpointer papp)
@@ -508,11 +623,32 @@ application_free (Application * app)
if (app->currently_free) return;
app->currently_free = TRUE;
+ /* Remove from the application list */
+ app->appstore->priv->applications = g_list_remove(app->appstore->priv->applications, app);
+
+ if (app->name_watcher != 0) {
+ g_dbus_connection_signal_unsubscribe(g_dbus_proxy_get_connection(app->dbus_proxy), app->name_watcher);
+ app->name_watcher = 0;
+ }
+
+ if (app->props) {
+ g_object_unref(app->props);
+ }
+
+ if (app->props_cancel != NULL) {
+ g_cancellable_cancel(app->props_cancel);
+ g_object_unref(app->props_cancel);
+ app->props_cancel = NULL;
+ }
+
if (app->dbus_proxy) {
g_object_unref(app->dbus_proxy);
}
- if (app->prop_proxy) {
- g_object_unref(app->prop_proxy);
+
+ if (app->dbus_proxy_cancel != NULL) {
+ g_cancellable_cancel(app->dbus_proxy_cancel);
+ g_object_unref(app->dbus_proxy_cancel);
+ app->dbus_proxy_cancel = NULL;
}
if (app->id != NULL) {
@@ -553,21 +689,18 @@ application_free (Application * app)
return;
}
-/* Gets called when the proxy is destroyed, which is usually when it
+/* Gets called when the proxy changes owners, which is usually when it
drops off of the bus. */
static void
-application_removed_cb (DBusGProxy * proxy, gpointer userdata)
+application_died (Application * app)
{
- Application * app = (Application *)userdata;
+ /* Application died */
g_debug("Application proxy destroyed '%s'", app->id);
/* Remove from the panel */
app->status = APP_INDICATOR_STATUS_PASSIVE;
apply_status(app);
- /* Remove from the application list */
- app->appstore->priv->applications = g_list_remove(app->appstore->priv->applications, app);
-
/* Destroy the data */
application_free(app);
return;
@@ -583,6 +716,30 @@ app_sort_func (gconstpointer a, gconstpointer b, gpointer userdata)
return (appb->ordering_index/2) - (appa->ordering_index/2);
}
+static void
+emit_signal (ApplicationServiceAppstore * appstore, const gchar * name,
+ GVariant * variant)
+{
+ ApplicationServiceAppstorePrivate * priv = appstore->priv;
+ GError * error = NULL;
+
+ g_dbus_connection_emit_signal (priv->bus,
+ NULL,
+ INDICATOR_APPLICATION_DBUS_OBJ,
+ INDICATOR_APPLICATION_DBUS_IFACE,
+ name,
+ variant,
+ &error);
+
+ if (error != NULL) {
+ g_error("Unable to send %s signal: %s", name, error->message);
+ g_error_free(error);
+ return;
+ }
+
+ return;
+}
+
/* Change the status of the application. If we're going passive
it removes it from the panel. If we're coming online, then
it add it to the panel. Otherwise it changes the icon. */
@@ -613,16 +770,17 @@ apply_status (Application * app)
return;
}
- g_debug("Changing app '%s' state from %s to %s", app->id, STATE2STRING(app->visible_state), STATE2STRING(goal_state));
+ if (app->visible_state != goal_state) {
+ g_debug("Changing app '%s' state from %s to %s", app->id, STATE2STRING(app->visible_state), STATE2STRING(goal_state));
+ }
/* This means we're going off line */
if (goal_state == VISIBLE_STATE_HIDDEN) {
gint position = get_position(app);
if (position == -1) return;
- g_signal_emit(G_OBJECT(appstore),
- signals[APPLICATION_REMOVED], 0,
- position, TRUE);
+ emit_signal (appstore, "ApplicationRemoved",
+ g_variant_new ("(i)", position));
} else {
/* Figure out which icon we should be using */
gchar * newicon = app->icon;
@@ -633,24 +791,19 @@ apply_status (Application * app)
/* Determine whether we're already shown or not */
if (app->visible_state == VISIBLE_STATE_HIDDEN) {
/* Put on panel */
- g_signal_emit(G_OBJECT(app->appstore),
- signals[APPLICATION_ADDED], 0,
- newicon,
- get_position(app), /* Position */
- app->dbus_name,
- app->menu,
- app->icon_theme_path,
- app->label,
- app->guide,
- TRUE);
+ emit_signal (appstore, "ApplicationAdded",
+ g_variant_new ("(sisosss)", newicon,
+ get_position(app),
+ app->dbus_name, app->menu,
+ app->icon_theme_path,
+ app->label, app->guide));
} else {
/* Icon update */
gint position = get_position(app);
if (position == -1) return;
- g_signal_emit(G_OBJECT(appstore),
- signals[APPLICATION_ICON_CHANGED], 0,
- position, newicon, TRUE);
+ emit_signal (appstore, "ApplicationIconChanged",
+ g_variant_new ("(is)", position, newicon));
}
}
@@ -659,123 +812,11 @@ apply_status (Application * app)
return;
}
-/* Gets the data back on an updated icon signal. Hopefully
- a new fun icon. */
-static void
-new_icon_cb (DBusGProxy * proxy, GValue value, GError * error, gpointer userdata)
-{
- /* Check for errors */
- if (error != NULL) {
- g_warning("Unable to get updated icon name: %s", error->message);
- return;
- }
-
- /* Grab the icon and make sure we have one */
- const gchar * newicon = g_value_get_string(&value);
- if (newicon == NULL) {
- g_warning("Bad new icon :(");
- return;
- }
-
- Application * app = (Application *) userdata;
-
- if (g_strcmp0(newicon, app->icon)) {
- /* If the new icon is actually a new icon */
- if (app->icon != NULL) g_free(app->icon);
- app->icon = g_strdup(newicon);
-
- if (app->visible_state == VISIBLE_STATE_SHOWN && app->status == APP_INDICATOR_STATUS_ACTIVE) {
- gint position = get_position(app);
- if (position == -1) return;
-
- g_signal_emit(G_OBJECT(app->appstore),
- signals[APPLICATION_ICON_CHANGED], 0,
- position, newicon, TRUE);
- }
- }
-
- return;
-}
-
-/* Gets the data back on an updated aicon signal. Hopefully
- a new fun icon. */
-static void
-new_aicon_cb (DBusGProxy * proxy, GValue value, GError * error, gpointer userdata)
-{
- /* Check for errors */
- if (error != NULL) {
- g_warning("Unable to get updated icon name: %s", error->message);
- return;
- }
-
- /* Grab the icon and make sure we have one */
- const gchar * newicon = g_value_get_string(&value);
- if (newicon == NULL) {
- g_warning("Bad new icon :(");
- return;
- }
-
- Application * app = (Application *) userdata;
-
- if (g_strcmp0(newicon, app->aicon)) {
- /* If the new icon is actually a new icon */
- if (app->aicon != NULL) g_free(app->aicon);
- app->aicon = g_strdup(newicon);
-
- if (app->visible_state == VISIBLE_STATE_SHOWN && app->status == APP_INDICATOR_STATUS_ATTENTION) {
- gint position = get_position(app);
- if (position == -1) return;
-
- g_signal_emit(G_OBJECT(app->appstore),
- signals[APPLICATION_ICON_CHANGED], 0,
- position, newicon, TRUE);
- }
- }
-
- return;
-}
-
-/* Called when the Notification Item signals that it
- has a new icon. */
-static void
-new_icon (DBusGProxy * proxy, gpointer data)
-{
- Application * app = (Application *)data;
- if (!app->validated) return;
-
- org_freedesktop_DBus_Properties_get_async(app->prop_proxy,
- NOTIFICATION_ITEM_DBUS_IFACE,
- NOTIFICATION_ITEM_PROP_ICON_NAME,
- new_icon_cb,
- app);
- return;
-}
-
-/* Called when the Notification Item signals that it
- has a new attention icon. */
-static void
-new_aicon (DBusGProxy * proxy, gpointer data)
-{
- Application * app = (Application *)data;
- if (!app->validated) return;
-
- org_freedesktop_DBus_Properties_get_async(app->prop_proxy,
- NOTIFICATION_ITEM_DBUS_IFACE,
- NOTIFICATION_ITEM_PROP_AICON_NAME,
- new_aicon_cb,
- app);
-
- return;
-}
-
/* Called when the Notification Item signals that it
has a new status. */
static void
-new_status (DBusGProxy * proxy, const gchar * status, gpointer data)
+new_status (Application * app, const gchar * status)
{
- Application * app = (Application *)data;
- if (!app->validated) return;
-
app->status = string_to_status(status);
apply_status(app);
@@ -785,11 +826,8 @@ new_status (DBusGProxy * proxy, const gchar * status, gpointer data)
/* Called when the Notification Item signals that it
has a new icon theme path. */
static void
-new_icon_theme_path (DBusGProxy * proxy, const gchar * icon_theme_path, gpointer data)
+new_icon_theme_path (Application * app, const gchar * icon_theme_path)
{
- Application * app = (Application *)data;
- if (!app->validated) return;
-
if (g_strcmp0(icon_theme_path, app->icon_theme_path)) {
/* If the new icon theme path is actually a new icon theme path */
if (app->icon_theme_path != NULL) g_free(app->icon_theme_path);
@@ -799,9 +837,10 @@ new_icon_theme_path (DBusGProxy * proxy, const gchar * icon_theme_path, gpointer
gint position = get_position(app);
if (position == -1) return;
- g_signal_emit(G_OBJECT(app->appstore),
- signals[APPLICATION_ICON_THEME_PATH_CHANGED], 0,
- position, app->icon_theme_path, TRUE);
+ emit_signal (app->appstore,
+ "ApplicationIconThemePathChanged",
+ g_variant_new ("(is)", position,
+ app->icon_theme_path));
}
}
@@ -811,11 +850,8 @@ new_icon_theme_path (DBusGProxy * proxy, const gchar * icon_theme_path, gpointer
/* Called when the Notification Item signals that it
has a new label. */
static void
-new_label (DBusGProxy * proxy, const gchar * label, const gchar * guide, gpointer data)
+new_label (Application * app, const gchar * label, const gchar * guide)
{
- Application * app = (Application *)data;
- if (!app->validated) return;
-
gboolean changed = FALSE;
if (g_strcmp0(app->label, label) != 0) {
@@ -840,11 +876,10 @@ new_label (DBusGProxy * proxy, const gchar * label, const gchar * guide, gpointe
gint position = get_position(app);
if (position == -1) return;
- g_signal_emit(app->appstore, signals[APPLICATION_LABEL_CHANGED], 0,
- position,
- app->label != NULL ? app->label : "",
- app->guide != NULL ? app->guide : "",
- TRUE);
+ emit_signal (app->appstore, "ApplicationLabelChanged",
+ g_variant_new ("(iss)", position,
+ app->label != NULL ? app->label : "",
+ app->guide != NULL ? app->guide : ""));
}
return;
@@ -862,15 +897,11 @@ application_service_appstore_application_add (ApplicationServiceAppstore * appst
g_return_if_fail(IS_APPLICATION_SERVICE_APPSTORE(appstore));
g_return_if_fail(dbus_name != NULL && dbus_name[0] != '\0');
g_return_if_fail(dbus_object != NULL && dbus_object[0] != '\0');
- ApplicationServiceAppstorePrivate * priv = appstore->priv;
Application * app = find_application(appstore, dbus_name, dbus_object);
if (app != NULL) {
- g_warning("Application already exists! Rerequesting properties.");
- org_freedesktop_DBus_Properties_get_all_async(app->prop_proxy,
- NOTIFICATION_ITEM_DBUS_IFACE,
- get_all_properties_cb,
- app);
+ g_warning("Application already exists, re-requesting properties.");
+ get_all_properties(app);
return;
}
@@ -893,95 +924,166 @@ application_service_appstore_application_add (ApplicationServiceAppstore * appst
app->ordering_index = 0;
app->approved_by = NULL;
app->visible_state = VISIBLE_STATE_HIDDEN;
+ app->name_watcher = 0;
+ app->props_cancel = NULL;
+ app->props = NULL;
+ app->queued_props = FALSE;
/* Get the DBus proxy for the NotificationItem interface */
+ app->dbus_proxy_cancel = g_cancellable_new();
+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ app->dbus_name,
+ app->dbus_object,
+ NOTIFICATION_ITEM_DBUS_IFACE,
+ app->dbus_proxy_cancel,
+ dbus_proxy_cb,
+ app);
+
+ appstore->priv->applications = g_list_insert_sorted_with_data (appstore->priv->applications, app, app_sort_func, NULL);
+
+ /* We're returning, nothing is yet added until the properties
+ come back and give us more info. */
+ return;
+}
+
+static void
+name_changed (GDBusConnection * connection, const gchar * sender_name,
+ const gchar * object_path, const gchar * interface_name,
+ const gchar * signal_name, GVariant * parameters,
+ gpointer user_data)
+{
+ Application * app = (Application *)user_data;
+
+ const gchar * new_name;
+ g_variant_get(parameters, "(&s&s&s)", NULL, NULL, &new_name);
+
+ if (new_name == NULL || new_name[0] == 0)
+ application_died(app);
+}
+
+/* Callback from trying to create the proxy for the app. */
+static void
+dbus_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
+{
GError * error = NULL;
- app->dbus_proxy = dbus_g_proxy_new_for_name_owner(priv->bus,
- app->dbus_name,
- app->dbus_object,
- NOTIFICATION_ITEM_DBUS_IFACE,
- &error);
+
+ Application * app = (Application *)user_data;
+ g_return_if_fail(app != NULL);
+
+ GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
+
+ if (app->dbus_proxy_cancel != NULL) {
+ g_object_unref(app->dbus_proxy_cancel);
+ app->dbus_proxy_cancel = NULL;
+ }
if (error != NULL) {
- g_warning("Unable to get notification item proxy for object '%s' on host '%s': %s", dbus_object, dbus_name, error->message);
+ g_error("Could not grab DBus proxy for %s: %s", app->dbus_name, error->message);
g_error_free(error);
- g_free(app);
+ application_free(app);
return;
}
-
+
+ /* Okay, we're good to grab the proxy at this point, we're
+ sure that it's ours. */
+ app->dbus_proxy = proxy;
+
/* We've got it, let's watch it for destruction */
- g_signal_connect(G_OBJECT(app->dbus_proxy), "destroy", G_CALLBACK(application_removed_cb), app);
+ app->name_watcher = g_dbus_connection_signal_subscribe(
+ g_dbus_proxy_get_connection(proxy),
+ "org.freedesktop.DBus",
+ "org.freedesktop.DBus",
+ "NameOwnerChanged",
+ "/org/freedesktop/DBus",
+ g_dbus_proxy_get_name(proxy),
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ name_changed,
+ app,
+ NULL);
+
+ g_signal_connect(proxy, "g-signal", G_CALLBACK(app_receive_signal), app);
+
+ app->props_cancel = g_cancellable_new();
+ g_dbus_proxy_new(g_dbus_proxy_get_connection(proxy),
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ app->dbus_name,
+ app->dbus_object,
+ "org.freedesktop.DBus.Properties",
+ app->props_cancel,
+ props_cb,
+ app);
- /* Grab the property proxy interface */
- app->prop_proxy = dbus_g_proxy_new_for_name_owner(priv->bus,
- app->dbus_name,
- app->dbus_object,
- DBUS_INTERFACE_PROPERTIES,
- &error);
+ return;
+}
+
+/* Callback from trying to create the proxy for the app. */
+static void
+props_cb (GObject * object, GAsyncResult * res, gpointer user_data)
+{
+ GError * error = NULL;
+
+ Application * app = (Application *)user_data;
+ g_return_if_fail(app != NULL);
+
+ GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
+
+ if (app->props_cancel != NULL) {
+ g_object_unref(app->props_cancel);
+ app->props_cancel = NULL;
+ }
if (error != NULL) {
- g_warning("Unable to get property proxy for object '%s' on host '%s': %s", dbus_object, dbus_name, error->message);
+ g_error("Could not grab Properties DBus proxy for %s: %s", app->dbus_name, error->message);
g_error_free(error);
- g_object_unref(app->dbus_proxy);
- g_free(app);
+ application_free(app);
return;
}
- /* Connect to signals */
- dbus_g_proxy_add_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_ICON,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_AICON,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_STATUS,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_ICON_THEME_PATH,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_LABEL,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
-
- dbus_g_proxy_connect_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_ICON,
- G_CALLBACK(new_icon),
- app,
- NULL);
- dbus_g_proxy_connect_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_AICON,
- G_CALLBACK(new_aicon),
- app,
- NULL);
- dbus_g_proxy_connect_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_STATUS,
- G_CALLBACK(new_status),
- app,
- NULL);
- dbus_g_proxy_connect_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_ICON_THEME_PATH,
- G_CALLBACK(new_icon_theme_path),
- app,
- NULL);
- dbus_g_proxy_connect_signal(app->dbus_proxy,
- NOTIFICATION_ITEM_SIG_NEW_LABEL,
- G_CALLBACK(new_label),
- app,
- NULL);
-
- /* Get all the propertiees */
- org_freedesktop_DBus_Properties_get_all_async(app->prop_proxy,
- NOTIFICATION_ITEM_DBUS_IFACE,
- get_all_properties_cb,
- app);
+ /* Okay, we're good to grab the proxy at this point, we're
+ sure that it's ours. */
+ app->props = proxy;
+
+ get_all_properties(app);
+
+ return;
+}
+
+/* Receives all signals from the service, routed to the appropriate functions */
+static void
+app_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name,
+ GVariant * parameters, gpointer user_data)
+{
+ Application * app = (Application *)user_data;
+
+ if (!app->validated) return;
+
+ if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_ICON) == 0) {
+ /* icon name isn't provided by signal, so look it up */
+ get_all_properties(app);
+ }
+ else if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_AICON) == 0) {
+ /* aicon name isn't provided by signal, so look it up */
+ get_all_properties(app);
+ }
+ else if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_STATUS) == 0) {
+ const gchar * status;
+ g_variant_get(parameters, "(&s)", &status);
+ new_status(app, status);
+ }
+ else if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_ICON_THEME_PATH) == 0) {
+ const gchar * icon_theme_path;
+ g_variant_get(parameters, "(&s)", &icon_theme_path);
+ new_icon_theme_path(app, icon_theme_path);
+ }
+ else if (g_strcmp0(signal_name, NOTIFICATION_ITEM_SIG_NEW_LABEL) == 0) {
+ const gchar * label, * guide;
+ g_variant_get(parameters, "(&s&s)", &label, &guide);
+ new_label(app, label, guide);
+ }
- /* We're returning, nothing is yet added until the properties
- come back and give us more info. */
return;
}
@@ -1014,7 +1116,7 @@ application_service_appstore_application_remove (ApplicationServiceAppstore * ap
Application * app = find_application(appstore, dbus_name, dbus_object);
if (app != NULL) {
- application_removed_cb(NULL, app);
+ application_died(app);
} else {
g_warning("Unable to find application %s:%s", dbus_name, dbus_object);
}
@@ -1050,12 +1152,12 @@ application_service_appstore_new (void)
}
/* DBus Interface */
-static gboolean
-_application_service_server_get_applications (ApplicationServiceAppstore * appstore, GPtrArray ** apps, GError ** error)
+static GVariant *
+get_applications (ApplicationServiceAppstore * appstore)
{
ApplicationServiceAppstorePrivate * priv = appstore->priv;
- *apps = g_ptr_array_new();
+ GVariantBuilder * builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
GList * listpntr;
gint position = 0;
@@ -1065,56 +1167,13 @@ _application_service_server_get_applications (ApplicationServiceAppstore * appst
continue;
}
- GValueArray * values = g_value_array_new(5);
-
- GValue value = {0};
-
- /* Icon name */
- g_value_init(&value, G_TYPE_STRING);
- g_value_set_string(&value, app->icon);
- g_value_array_append(values, &value);
- g_value_unset(&value);
-
- /* Position */
- g_value_init(&value, G_TYPE_INT);
- g_value_set_int(&value, position++);
- g_value_array_append(values, &value);
- g_value_unset(&value);
-
- /* DBus Address */
- g_value_init(&value, G_TYPE_STRING);
- g_value_set_string(&value, app->dbus_name);
- g_value_array_append(values, &value);
- g_value_unset(&value);
-
- /* DBus Object */
- g_value_init(&value, DBUS_TYPE_G_OBJECT_PATH);
- g_value_set_static_boxed(&value, app->menu);
- g_value_array_append(values, &value);
- g_value_unset(&value);
-
- /* Icon path */
- g_value_init(&value, G_TYPE_STRING);
- g_value_set_string(&value, app->icon_theme_path);
- g_value_array_append(values, &value);
- g_value_unset(&value);
-
- /* Label */
- g_value_init(&value, G_TYPE_STRING);
- g_value_set_string(&value, app->label);
- g_value_array_append(values, &value);
- g_value_unset(&value);
-
- /* Guide */
- g_value_init(&value, G_TYPE_STRING);
- g_value_set_string(&value, app->guide);
- g_value_array_append(values, &value);
- g_value_unset(&value);
-
- g_ptr_array_add(*apps, values);
+ g_variant_builder_add (builder, "(sisosss)", app->icon,
+ position++, app->dbus_name, app->menu,
+ app->icon_theme_path, app->label,
+ app->guide);
}
- return TRUE;
+ return g_variant_new("(a(sisosss))", builder);
}
/* Removes and approver from our list of approvers and
@@ -1139,30 +1198,47 @@ approver_free (gpointer papprover, gpointer user_data)
ApplicationServiceAppstore * appstore = APPLICATION_SERVICE_APPSTORE(user_data);
g_list_foreach(appstore->priv->applications, remove_approver, approver->proxy);
+ if (approver->name_watcher != 0) {
+ g_dbus_connection_signal_unsubscribe(g_dbus_proxy_get_connection(approver->proxy), approver->name_watcher);
+ approver->name_watcher = 0;
+ }
+
if (approver->proxy != NULL) {
- if (!approver->destroy_by_proxy) {
- g_object_unref(approver->proxy);
- }
+ g_object_unref(approver->proxy);
approver->proxy = NULL;
}
+ if (approver->proxy_cancel != NULL) {
+ g_cancellable_cancel(approver->proxy_cancel);
+ g_object_unref(approver->proxy_cancel);
+ approver->proxy_cancel = NULL;
+ }
+
g_free(approver);
return;
}
/* What did the approver tell us? */
static void
-approver_request_cb (DBusGProxy *proxy, gboolean OUT_approved, GError *error, gpointer userdata)
+approver_request_cb (GObject *object, GAsyncResult *res, gpointer user_data)
{
+ GDBusProxy * proxy = G_DBUS_PROXY(object);
+ Application * app = (Application *)user_data;
+ GError * error = NULL;
+ gboolean approved = TRUE; /* default to approved */
+ GVariant * result;
+
+ result = g_dbus_proxy_call_finish(proxy, res, &error);
+
if (error == NULL) {
- g_debug("Approver responded: %s", OUT_approved ? "approve" : "rejected");
- } else {
+ g_variant_get(result, "(b)", &approved);
+ g_debug("Approver responded: %s", approved ? "approve" : "rejected");
+ }
+ else {
g_debug("Approver responded error: %s", error->message);
}
- Application * app = (Application *)userdata;
-
- if (OUT_approved || error != NULL) {
+ if (approved) {
app->approved_by = g_list_prepend(app->approved_by, proxy);
} else {
app->approved_by = g_list_remove(app->approved_by, proxy);
@@ -1179,50 +1255,11 @@ check_with_new_approver (gpointer papp, gpointer papprove)
Application * app = (Application *)papp;
Approver * approver = (Approver *)papprove;
- org_ayatana_StatusNotifierApprover_approve_item_async(approver->proxy,
- app->id,
- app->category,
- 0,
- app->dbus_name,
- app->dbus_object,
- approver_request_cb,
- app);
-
- return;
-}
-
-/* Look through all the approvers and find the one with a given
- proxy. */
-static gint
-approver_find_by_proxy (gconstpointer papprover, gconstpointer pproxy)
-{
- Approver * approver = (Approver *)papprover;
-
- if (approver->proxy == pproxy) {
- return 0;
- }
-
- return -1;
-}
-
-/* Tracks when a proxy gets destroyed so that we know that the
- approver has dropped off the bus. */
-static void
-approver_destroyed (gpointer pproxy, gpointer pappstore)
-{
- ApplicationServiceAppstore * appstore = APPLICATION_SERVICE_APPSTORE(pappstore);
-
- GList * lapprover = g_list_find_custom(appstore->priv->approvers, pproxy, approver_find_by_proxy);
- if (lapprover == NULL) {
- g_warning("Approver proxy died, but we don't seem to have that approver.");
- return;
- }
-
- Approver * approver = (Approver *)lapprover->data;
- approver->destroy_by_proxy = TRUE;
-
- appstore->priv->approvers = g_list_remove(appstore->priv->approvers, approver);
- approver_free(approver, appstore);
+ g_dbus_proxy_call(approver->proxy, "ApproveItem",
+ g_variant_new("(ssuso)", app->id, app->category,
+ 0, app->dbus_name, app->dbus_object),
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+ approver_request_cb, app);
return;
}
@@ -1230,17 +1267,12 @@ approver_destroyed (gpointer pproxy, gpointer pappstore)
/* A signal when an approver changes the why that it thinks about
a particular indicator. */
void
-approver_revise_judgement (DBusGProxy * proxy, gboolean new_status, gchar * address, DBusGProxy * get_path, gpointer user_data)
+approver_revise_judgement (Approver * approver, gboolean new_status, const gchar * address, const gchar * path)
{
- g_return_if_fail(IS_APPLICATION_SERVICE_APPSTORE(user_data));
g_return_if_fail(address != NULL && address[0] != '\0');
- g_return_if_fail(get_path != NULL);
- const gchar * path = dbus_g_proxy_get_path(get_path);
g_return_if_fail(path != NULL && path[0] != '\0');
- ApplicationServiceAppstore * appstore = APPLICATION_SERVICE_APPSTORE(user_data);
-
- Application * app = find_application(appstore, address, path);
+ Application * app = find_application(approver->appstore, address, path);
if (app == NULL) {
g_warning("Unable to update approver status of application (%s:%s) as it was not found", address, path);
@@ -1248,9 +1280,9 @@ approver_revise_judgement (DBusGProxy * proxy, gboolean new_status, gchar * addr
}
if (new_status) {
- app->approved_by = g_list_prepend(app->approved_by, proxy);
+ app->approved_by = g_list_prepend(app->approved_by, approver->proxy);
} else {
- app->approved_by = g_list_remove(app->approved_by, proxy);
+ app->approved_by = g_list_remove(app->approved_by, approver->proxy);
}
apply_status(app);
@@ -1267,39 +1299,108 @@ application_service_appstore_approver_add (ApplicationServiceAppstore * appstore
ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (appstore);
Approver * approver = g_new0(Approver, 1);
- approver->destroy_by_proxy = FALSE;
+ approver->appstore = appstore;
+ approver->proxy_cancel = NULL;
+ approver->proxy = NULL;
+ approver->name_watcher = 0;
+
+ approver->proxy_cancel = g_cancellable_new();
+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ dbus_name,
+ dbus_object,
+ NOTIFICATION_APPROVER_DBUS_IFACE,
+ approver->proxy_cancel,
+ approver_proxy_cb,
+ approver);
+
+ priv->approvers = g_list_prepend(priv->approvers, approver);
+
+ return;
+}
+
+static void
+approver_name_changed (GDBusConnection * connection, const gchar * sender_name,
+ const gchar * object_path, const gchar * interface_name,
+ const gchar * signal_name, GVariant * parameters,
+ gpointer user_data)
+{
+ Approver * approver = (Approver *)user_data;
+ ApplicationServiceAppstore * appstore = approver->appstore;
+
+ const gchar * new_name;
+ g_variant_get(parameters, "(&s&s&s)", NULL, NULL, &new_name);
+
+ if (new_name == NULL || new_name[0] == 0) {
+ appstore->priv->approvers = g_list_remove(appstore->priv->approvers, approver);
+ approver_free(approver, appstore);
+ }
+}
+/* Callback from trying to create the proxy for the approver. */
+static void
+approver_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
+{
GError * error = NULL;
- approver->proxy = dbus_g_proxy_new_for_name_owner(priv->bus,
- dbus_name,
- dbus_object,
- NOTIFICATION_APPROVER_DBUS_IFACE,
- &error);
+
+ Approver * approver = (Approver *)user_data;
+ g_return_if_fail(approver != NULL);
+
+ GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
+ ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (approver->appstore);
+
+ if (approver->proxy_cancel != NULL) {
+ g_object_unref(approver->proxy_cancel);
+ approver->proxy_cancel = NULL;
+ }
+
if (error != NULL) {
- g_warning("Unable to get approver interface on '%s:%s' : %s", dbus_name, dbus_object, error->message);
+ g_error("Could not grab DBus proxy for approver: %s", error->message);
g_error_free(error);
- g_free(approver);
return;
}
- g_signal_connect(G_OBJECT(approver->proxy), "destroy", G_CALLBACK(approver_destroyed), appstore);
-
- dbus_g_proxy_add_signal(approver->proxy,
- "ReviseJudgement",
- G_TYPE_BOOLEAN,
- G_TYPE_STRING,
- DBUS_TYPE_G_OBJECT_PATH,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal(approver->proxy,
- "ReviseJudgement",
- G_CALLBACK(approver_revise_judgement),
- appstore,
- NULL);
+ /* Okay, we're good to grab the proxy at this point, we're
+ sure that it's ours. */
+ approver->proxy = proxy;
- priv->approvers = g_list_prepend(priv->approvers, approver);
+ /* We've got it, let's watch it for destruction */
+ approver->name_watcher = g_dbus_connection_signal_subscribe(
+ g_dbus_proxy_get_connection(proxy),
+ "org.freedesktop.DBus",
+ "org.freedesktop.DBus",
+ "NameOwnerChanged",
+ "/org/freedesktop/DBus",
+ g_dbus_proxy_get_name(proxy),
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ approver_name_changed,
+ approver,
+ NULL);
+
+ g_signal_connect(proxy, "g-signal", G_CALLBACK(approver_receive_signal),
+ approver);
g_list_foreach(priv->applications, check_with_new_approver, approver);
return;
}
+/* Receives all signals from the service, routed to the appropriate functions */
+static void
+approver_receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name,
+ GVariant * parameters, gpointer user_data)
+{
+ Approver * approver = (Approver *)user_data;
+
+ if (g_strcmp0(signal_name, "ReviseJudgement") == 0) {
+ gboolean approved;
+ const gchar * address;
+ const gchar * path;
+ g_variant_get(parameters, "(b&s&o)", &approved, &address, &path);
+ approver_revise_judgement(approver, approved, address, path);
+ }
+
+ return;
+}
+
diff --git a/src/application-service.c b/src/application-service.c
index 94e7d2e..68ac264 100644
--- a/src/application-service.c
+++ b/src/application-service.c
@@ -22,7 +22,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include "libindicator/indicator-service.h"
-#include "notification-item-client.h"
#include "application-service-appstore.h"
#include "application-service-watcher.h"
#include "dbus-shared.h"
diff --git a/src/application-service.xml b/src/application-service.xml
index 031bf68..ae20900 100644
--- a/src/application-service.xml
+++ b/src/application-service.xml
@@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<node name="/">
- <interface name="org.ayatana.indicator.application.service">
+ <interface name="com.canonical.indicator.application.service">
<!-- Properties -->
<!-- None currently -->
diff --git a/src/dbus-properties.xml b/src/dbus-properties.xml
deleted file mode 100644
index c172895..0000000
--- a/src/dbus-properties.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<node name="/">
- <interface name="org.freedesktop.DBus.Properties">
-
- <method name="Get">
- <arg direction="in" type="s" name="Interface_Name"/>
- <arg direction="in" type="s" name="Property_Name"/>
- <arg direction="out" type="v" name="Value"/>
- </method>
-
- <method name="Set">
- <arg direction="in" type="s" name="Interface_Name"/>
- <arg direction="in" type="s" name="Property_Name"/>
- <arg direction="in" type="v" name="Value"/>
- </method>
-
- <method name="GetAll">
- <arg direction="in" type="s" name="Interface_Name"/>
- <arg direction="out" type="a{sv}" name="Properties"/>
- </method>
-
- </interface>
-</node>
diff --git a/src/dbus-shared.h b/src/dbus-shared.h
index 1d8d89c..71c063e 100644
--- a/src/dbus-shared.h
+++ b/src/dbus-shared.h
@@ -20,9 +20,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#define INDICATOR_APPLICATION_DBUS_ADDR "org.ayatana.indicator.application"
-#define INDICATOR_APPLICATION_DBUS_OBJ "/org/ayatana/indicator/application/service"
-#define INDICATOR_APPLICATION_DBUS_IFACE "org.ayatana.indicator.application.service"
+#define INDICATOR_APPLICATION_DBUS_ADDR "com.canonical.indicator.application"
+#define INDICATOR_APPLICATION_DBUS_OBJ "/com/canonical/indicator/application/service"
+#define INDICATOR_APPLICATION_DBUS_IFACE "com.canonical.indicator.application.service"
#define NOTIFICATION_WATCHER_DBUS_ADDR "org.kde.StatusNotifierWatcher"
#define NOTIFICATION_WATCHER_DBUS_OBJ "/StatusNotifierWatcher"
diff --git a/src/gen-application-service.xml.c b/src/gen-application-service.xml.c
new file mode 100644
index 0000000..2a0277a
--- /dev/null
+++ b/src/gen-application-service.xml.c
@@ -0,0 +1,61 @@
+const char * _application_service =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<!--\n"
+"An interface for communication between the service and indicator.\n"
+"\n"
+"Copyright 2009 Canonical Ltd.\n"
+"\n"
+"Authors:\n"
+" Ted Gould <ted@canonical.com>\n"
+"\n"
+"This program is free software: you can redistribute it and/or modify it \n"
+"under the terms of the GNU General Public License version 3, as published \n"
+"by the Free Software Foundation.\n"
+"\n"
+"This program is distributed in the hope that it will be useful, but \n"
+"WITHOUT ANY WARRANTY; without even the implied warranties of \n"
+"MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR \n"
+"PURPOSE. See the GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License along \n"
+"with this program. If not, see <http://www.gnu.org/licenses/>.\n"
+"-->\n"
+"<node name=\"/\">\n"
+" <interface name=\"com.canonical.indicator.application.service\">\n"
+"<!-- Properties -->\n"
+" <!-- None currently -->\n"
+"\n"
+"<!-- Methods -->\n"
+" <method name=\"GetApplications\">\n"
+" <arg type=\"a(sisosss)\" name=\"applications\" direction=\"out\" />\n"
+" </method>\n"
+"\n"
+"<!-- Signals -->\n"
+" <signal name=\"ApplicationAdded\">\n"
+" <arg type=\"s\" name=\"iconname\" direction=\"out\" />\n"
+" <arg type=\"i\" name=\"position\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"dbusaddress\" direction=\"out\" />\n"
+" <arg type=\"o\" name=\"dbusobject\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"iconpath\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"label\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"labelguide\" direction=\"out\" />\n"
+" </signal>\n"
+" <signal name=\"ApplicationRemoved\">\n"
+" <arg type=\"i\" name=\"position\" direction=\"out\" />\n"
+" </signal>\n"
+" <signal name=\"ApplicationIconChanged\">\n"
+" <arg type=\"i\" name=\"position\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"icon_name\" direction=\"out\" />\n"
+" </signal>\n"
+" <signal name=\"ApplicationIconThemePathChanged\">\n"
+" <arg type=\"i\" name=\"position\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"icon_theme_path\" direction=\"out\" />\n"
+" </signal>\n"
+" <signal name=\"ApplicationLabelChanged\">\n"
+" <arg type=\"i\" name=\"position\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"label\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"guide\" direction=\"out\" />\n"
+" </signal>\n"
+" </interface>\n"
+"</node>\n"
+;
diff --git a/src/gen-notification-approver.xml.c b/src/gen-notification-approver.xml.c
new file mode 100644
index 0000000..0844b94
--- /dev/null
+++ b/src/gen-notification-approver.xml.c
@@ -0,0 +1,31 @@
+const char * _notification_approver =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<node name=\"/\">\n"
+" <interface name=\"org.ayatana.StatusNotifierApprover\">\n"
+"\n"
+"<!-- Methods -->\n"
+" <method name=\"ApproveItem\">\n"
+" <!-- KSNI ID -->\n"
+" <arg type=\"s\" name=\"id\" direction=\"in\" />\n"
+" <!-- KSNI Category -->\n"
+" <arg type=\"s\" name=\"category\" direction=\"in\" />\n"
+" <!-- Application PID -->\n"
+" <arg type=\"u\" name=\"pid\" direction=\"in\" />\n"
+" <!-- Application DBus Address -->\n"
+" <arg type=\"s\" name=\"address\" direction=\"in\" />\n"
+" <!-- Application DBus Path for KSNI interface -->\n"
+" <arg type=\"o\" name=\"path\" direction=\"in\" />\n"
+" <!-- So, what do you think? -->\n"
+" <arg type=\"b\" name=\"approved\" direction=\"out\" />\n"
+" </method>\n"
+"\n"
+"<!-- Signals -->\n"
+" <signal name=\"ReviseJudgement\">\n"
+" <arg type=\"b\" name=\"approved\" direction=\"out\" />\n"
+" <arg type=\"s\" name=\"address\" direction=\"out\" />\n"
+" <arg type=\"o\" name=\"path\" direction=\"out\" />\n"
+" </signal>\n"
+"\n"
+" </interface>\n"
+"</node>\n"
+;
diff --git a/src/indicator-application.c b/src/indicator-application.c
index ecf19e8..5754ac4 100644
--- a/src/indicator-application.c
+++ b/src/indicator-application.c
@@ -28,10 +28,10 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
/* G Stuff */
#include <glib.h>
#include <glib-object.h>
+#include <gio/gio.h>
#include <gtk/gtk.h>
/* DBus Stuff */
-#include <dbus/dbus-glib.h>
#ifdef HAVE_GTK3
#include <libdbusmenu-gtk3/menu.h>
#else
@@ -46,7 +46,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
/* Local Stuff */
#include "dbus-shared.h"
-#include "application-service-client.h"
+#include "gen-application-service.xml.h"
#include "application-service-marshal.h"
#define PANEL_ICON_SUFFIX "panel"
@@ -81,8 +81,8 @@ INDICATOR_SET_TYPE(INDICATOR_APPLICATION_TYPE)
typedef struct _IndicatorApplicationPrivate IndicatorApplicationPrivate;
struct _IndicatorApplicationPrivate {
IndicatorServiceManager * sm;
- DBusGConnection * bus;
- DBusGProxy * service_proxy;
+ GCancellable * service_proxy_cancel;
+ GDBusProxy * service_proxy;
GList * applications;
GHashTable * theme_dirs;
guint disconnect_kill;
@@ -114,15 +114,17 @@ static void disconnected (IndicatorApplication * application);
static void disconnected_helper (gpointer data, gpointer user_data);
static gboolean disconnected_kill (gpointer user_data);
static void disconnected_kill_helper (gpointer data, gpointer user_data);
-static void application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, const gchar * icon_theme_path, const gchar * label, const gchar * guide, IndicatorApplication * application);
-static void application_removed (DBusGProxy * proxy, gint position , IndicatorApplication * application);
-static void application_label_changed (DBusGProxy * proxy, gint position, const gchar * label, const gchar * guide, IndicatorApplication * application);
-static void application_icon_changed (DBusGProxy * proxy, gint position, const gchar * iconname, IndicatorApplication * application);
-static void application_icon_theme_path_changed (DBusGProxy * proxy, gint position, const gchar * icon_theme_path, IndicatorApplication * application);
-static void get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, gpointer userdata);
-static void get_applications_helper (gpointer data, gpointer user_data);
+static void application_added (IndicatorApplication * application, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, const gchar * icon_theme_path, const gchar * label, const gchar * guide);
+static void application_removed (IndicatorApplication * application, gint position);
+static void application_label_changed (IndicatorApplication * application, gint position, const gchar * label, const gchar * guide);
+static void application_icon_changed (IndicatorApplication * application, gint position, const gchar * iconname);
+static void application_icon_theme_path_changed (IndicatorApplication * application, gint position, const gchar * icon_theme_path);
+static void get_applications (GObject * obj, GAsyncResult * res, gpointer user_data);
+static void get_applications_helper (IndicatorApplication * self, GVariant * variant);
static void theme_dir_unref(IndicatorApplication * ia, const gchar * dir);
static void theme_dir_ref(IndicatorApplication * ia, const gchar * dir);
+static void service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data);
+static void receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data);
G_DEFINE_TYPE (IndicatorApplication, indicator_application, INDICATOR_OBJECT_TYPE);
@@ -141,28 +143,6 @@ indicator_application_class_init (IndicatorApplicationClass *klass)
io_class->get_entries = get_entries;
io_class->get_location = get_location;
- dbus_g_object_register_marshaller(_application_service_marshal_VOID__STRING_INT_STRING_STRING_STRING_STRING_STRING,
- G_TYPE_NONE,
- G_TYPE_STRING,
- G_TYPE_INT,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_object_register_marshaller(_application_service_marshal_VOID__INT_STRING,
- G_TYPE_NONE,
- G_TYPE_INT,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_object_register_marshaller(_application_service_marshal_VOID__INT_STRING_STRING,
- G_TYPE_NONE,
- G_TYPE_INT,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
-
return;
}
@@ -172,7 +152,7 @@ indicator_application_init (IndicatorApplication *self)
IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(self);
/* These are built in the connection phase */
- priv->bus = NULL;
+ priv->service_proxy_cancel = NULL;
priv->service_proxy = NULL;
priv->theme_dirs = NULL;
priv->disconnect_kill = 0;
@@ -197,9 +177,8 @@ indicator_application_dispose (GObject *object)
}
while (priv->applications != NULL) {
- application_removed(priv->service_proxy,
- 0,
- INDICATOR_APPLICATION(object));
+ application_removed(INDICATOR_APPLICATION(object),
+ 0);
}
if (priv->sm != NULL) {
@@ -207,16 +186,17 @@ indicator_application_dispose (GObject *object)
priv->sm = NULL;
}
- if (priv->bus != NULL) {
- /* We're not incrementing the ref count on this one. */
- priv->bus = NULL;
- }
-
if (priv->service_proxy != NULL) {
g_object_unref(G_OBJECT(priv->service_proxy));
priv->service_proxy = NULL;
}
+ if (priv->service_proxy_cancel != NULL) {
+ g_cancellable_cancel(priv->service_proxy_cancel);
+ g_object_unref(priv->service_proxy_cancel);
+ priv->service_proxy_cancel = NULL;
+ }
+
if (priv->theme_dirs != NULL) {
while (g_hash_table_size(priv->theme_dirs)) {
GList * keys = g_hash_table_get_keys(priv->theme_dirs);
@@ -260,93 +240,59 @@ connected (IndicatorApplication * application)
IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application);
g_debug("Connected to Application Indicator Service.");
+ if (priv->service_proxy_cancel == NULL && priv->service_proxy == NULL) {
+ /* Build the service proxy */
+ priv->service_proxy_cancel = g_cancellable_new();
+
+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ INDICATOR_APPLICATION_DBUS_ADDR,
+ INDICATOR_APPLICATION_DBUS_OBJ,
+ INDICATOR_APPLICATION_DBUS_IFACE,
+ priv->service_proxy_cancel,
+ service_proxy_cb,
+ application);
+ }
+
+ return;
+}
+
+/* Callback from trying to create the proxy for the service, this
+ could include starting the service. */
+static void
+service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
+{
GError * error = NULL;
- /* Grab the session bus */
- if (priv->bus == NULL) {
- priv->bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
+ IndicatorApplication * self = INDICATOR_APPLICATION(user_data);
+ g_return_if_fail(self != NULL);
- if (error != NULL) {
- g_error("Unable to get session bus: %s", error->message);
- g_error_free(error);
- return;
- }
+ IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(self);
+ GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
+
+ if (priv->service_proxy_cancel != NULL) {
+ g_object_unref(priv->service_proxy_cancel);
+ priv->service_proxy_cancel = NULL;
}
- if (priv->service_proxy == NULL) {
- /* Build the service proxy */
- priv->service_proxy = dbus_g_proxy_new_for_name(priv->bus,
- INDICATOR_APPLICATION_DBUS_ADDR,
- INDICATOR_APPLICATION_DBUS_OBJ,
- INDICATOR_APPLICATION_DBUS_IFACE);
-
- /* Set up proxy signals */
- g_debug("Setup proxy signals");
- dbus_g_proxy_add_signal(priv->service_proxy,
- "ApplicationAdded",
- G_TYPE_STRING,
- G_TYPE_INT,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal(priv->service_proxy,
- "ApplicationRemoved",
- G_TYPE_INT,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal(priv->service_proxy,
- "ApplicationIconChanged",
- G_TYPE_INT,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal(priv->service_proxy,
- "ApplicationIconThemePathChanged",
- G_TYPE_INT,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_add_signal(priv->service_proxy,
- "ApplicationLabelChanged",
- G_TYPE_INT,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
-
- /* Connect to them */
- g_debug("Connect to them.");
- dbus_g_proxy_connect_signal(priv->service_proxy,
- "ApplicationAdded",
- G_CALLBACK(application_added),
- application,
- NULL /* Disconnection Signal */);
- dbus_g_proxy_connect_signal(priv->service_proxy,
- "ApplicationRemoved",
- G_CALLBACK(application_removed),
- application,
- NULL /* Disconnection Signal */);
- dbus_g_proxy_connect_signal(priv->service_proxy,
- "ApplicationIconChanged",
- G_CALLBACK(application_icon_changed),
- application,
- NULL /* Disconnection Signal */);
- dbus_g_proxy_connect_signal(priv->service_proxy,
- "ApplicationIconThemePathChanged",
- G_CALLBACK(application_icon_theme_path_changed),
- application,
- NULL /* Disconnection Signal */);
- dbus_g_proxy_connect_signal(priv->service_proxy,
- "ApplicationLabelChanged",
- G_CALLBACK(application_label_changed),
- application,
- NULL /* Disconnection Signal */);
+ if (error != NULL) {
+ g_error("Could not grab DBus proxy for %s: %s", INDICATOR_APPLICATION_DBUS_ADDR, error->message);
+ g_error_free(error);
+ return;
}
+ /* Okay, we're good to grab the proxy at this point, we're
+ sure that it's ours. */
+ priv->service_proxy = proxy;
+
+ g_signal_connect(proxy, "g-signal", G_CALLBACK(receive_signal), self);
+
/* Query it for existing applications */
g_debug("Request current apps");
- org_ayatana_indicator_application_service_get_applications_async(priv->service_proxy,
- get_applications,
- application);
+ g_dbus_proxy_call(priv->service_proxy, "GetApplications", NULL,
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+ get_applications, self);
return;
}
@@ -397,7 +343,7 @@ disconnected_kill_helper (gpointer data, gpointer user_data)
IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(user_data);
ApplicationEntry * entry = (ApplicationEntry *)data;
if (entry->old_service) {
- application_removed(NULL, g_list_index(priv->applications, data), INDICATOR_APPLICATION(user_data));
+ application_removed(INDICATOR_APPLICATION(user_data), g_list_index(priv->applications, data));
}
return;
}
@@ -435,22 +381,6 @@ get_location (IndicatorObject * io, IndicatorObjectEntry * entry)
return g_list_index(priv->applications, entry);
}
-/* Searching for ApplicationEntries where the dbusobject and
- address are the same. */
-static gint
-application_added_search (gconstpointer a, gconstpointer b)
-{
- ApplicationEntry * appa = (ApplicationEntry *)a;
- ApplicationEntry * appb = (ApplicationEntry *)b;
-
- if (g_strcmp0(appa->dbusaddress, appb->dbusaddress) == 0 &&
- g_strcmp0(appa->dbusobject, appb->dbusobject) == 0) {
- return 0;
- }
-
- return -1;
-}
-
/* Does a quick meausre of how big the string is in
pixels with a Pango layout */
static gint
@@ -495,25 +425,12 @@ guess_label_size (ApplicationEntry * app)
ApplicationEntry and signaling the indicator host that
we've got a new indicator. */
static void
-application_added (DBusGProxy * proxy, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, const gchar * icon_theme_path, const gchar * label, const gchar * guide, IndicatorApplication * application)
+application_added (IndicatorApplication * application, const gchar * iconname, gint position, const gchar * dbusaddress, const gchar * dbusobject, const gchar * icon_theme_path, const gchar * label, const gchar * guide)
{
g_return_if_fail(IS_INDICATOR_APPLICATION(application));
- g_debug("Building new application entry: %s with icon: %s", dbusaddress, iconname);
+ g_debug("Building new application entry: %s with icon: %s at position %i", dbusaddress, iconname, position);
IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application);
- /* First search to see if we already have this entry */
- ApplicationEntry searchapp;
- searchapp.dbusaddress = (gchar *)dbusaddress; /* Casting off const, but it's okay, we're not changing it */
- searchapp.dbusobject = (gchar *)dbusobject; /* Casting off const, but it's okay, we're not changing it */
-
- GList * searchpointer = g_list_find_custom(priv->applications, &searchapp, application_added_search);
- if (searchpointer != NULL) {
- g_debug("\t...Already have that one.");
- ApplicationEntry * app = (ApplicationEntry *)searchpointer->data;
- app->old_service = FALSE;
- return;
- }
-
ApplicationEntry * app = g_new(ApplicationEntry, 1);
app->old_service = FALSE;
@@ -574,7 +491,7 @@ application_added (DBusGProxy * proxy, const gchar * iconname, gint position, co
/* This removes the application from the list and free's all
of the memory associated with it. */
static void
-application_removed (DBusGProxy * proxy, gint position, IndicatorApplication * application)
+application_removed (IndicatorApplication * application, gint position)
{
g_return_if_fail(IS_INDICATOR_APPLICATION(application));
IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application);
@@ -621,7 +538,7 @@ application_removed (DBusGProxy * proxy, gint position, IndicatorApplication * a
/* The callback for the signal that the label for an application
has changed. */
static void
-application_label_changed (DBusGProxy * proxy, gint position, const gchar * label, const gchar * guide, IndicatorApplication * application)
+application_label_changed (IndicatorApplication * application, gint position, const gchar * label, const gchar * guide)
{
IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application);
ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position);
@@ -702,7 +619,7 @@ application_label_changed (DBusGProxy * proxy, gint position, const gchar * labe
/* The callback for the signal that the icon for an application
has changed. */
static void
-application_icon_changed (DBusGProxy * proxy, gint position, const gchar * iconname, IndicatorApplication * application)
+application_icon_changed (IndicatorApplication * application, gint position, const gchar * iconname)
{
IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application);
ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position);
@@ -732,7 +649,7 @@ application_icon_changed (DBusGProxy * proxy, gint position, const gchar * iconn
/* The callback for the signal that the icon theme path for an application
has changed. */
static void
-application_icon_theme_path_changed (DBusGProxy * proxy, gint position, const gchar * icon_theme_path, IndicatorApplication * application)
+application_icon_theme_path_changed (IndicatorApplication * application, gint position, const gchar * icon_theme_path)
{
IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application);
ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position);
@@ -758,16 +675,78 @@ application_icon_theme_path_changed (DBusGProxy * proxy, gint position, const gc
return;
}
-/* This repsonds to the list of applications that the service
+/* Receives all signals from the service, routed to the appropriate functions */
+static void
+receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name,
+ GVariant * parameters, gpointer user_data)
+{
+ IndicatorApplication * self = INDICATOR_APPLICATION(user_data);
+
+ if (g_strcmp0(signal_name, "ApplicationAdded") == 0) {
+ const gchar * iconname;
+ gint position;
+ const gchar * dbusaddress;
+ const gchar * dbusobject;
+ const gchar * icon_theme_path;
+ const gchar * label;
+ const gchar * guide;
+ g_variant_get (parameters, "(&si&s&o&s&s&s)", &iconname,
+ &position, &dbusaddress, &dbusobject,
+ &icon_theme_path, &label, &guide);
+ application_added(self, iconname, position, dbusaddress,
+ dbusobject, icon_theme_path, label, guide);
+ }
+ else if (g_strcmp0(signal_name, "ApplicationRemoved") == 0) {
+ gint position;
+ g_variant_get (parameters, "(i)", &position);
+ application_removed(self, position);
+ }
+ else if (g_strcmp0(signal_name, "ApplicationIconChanged") == 0) {
+ gint position;
+ const gchar * iconname;
+ g_variant_get (parameters, "(i&s)", &position, &iconname);
+ application_icon_changed(self, position, iconname);
+ }
+ else if (g_strcmp0(signal_name, "ApplicationIconThemePathChanged") == 0) {
+ gint position;
+ const gchar * icon_theme_path;
+ g_variant_get (parameters, "(i&s)", &position, &icon_theme_path);
+ application_icon_theme_path_changed(self, position, icon_theme_path);
+ }
+ else if (g_strcmp0(signal_name, "ApplicationLabelChanged") == 0) {
+ gint position;
+ const gchar * label;
+ const gchar * guide;
+ g_variant_get (parameters, "(i&s&s)", &position, &label, &guide);
+ application_label_changed(self, position, label, guide);
+ }
+
+ return;
+}
+
+/* This responds to the list of applications that the service
has and calls application_added on each one of them. */
static void
-get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error, gpointer userdata)
+get_applications (GObject * obj, GAsyncResult * res, gpointer user_data)
{
+ IndicatorApplication * self = INDICATOR_APPLICATION(user_data);
+ IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(self);
+ GError * error = NULL;
+ GVariant * result;
+ GVariant * child;
+ GVariantIter * iter;
+
+ result = g_dbus_proxy_call_finish(priv->service_proxy, res, &error);
+
if (error != NULL) {
g_warning("Unable to get application list: %s", error->message);
return;
}
- g_ptr_array_foreach(OUT_applications, get_applications_helper, userdata);
+
+ g_variant_get(result, "(a(sisosss))", &iter);
+ while ((child = g_variant_iter_next_value (iter)))
+ get_applications_helper(self, child);
+ g_variant_iter_free (iter);
return;
}
@@ -775,21 +754,20 @@ get_applications (DBusGProxy *proxy, GPtrArray *OUT_applications, GError *error,
/* A little helper that takes apart the DBus structure and calls
application_added on every entry in the list. */
static void
-get_applications_helper (gpointer data, gpointer user_data)
+get_applications_helper (IndicatorApplication * self, GVariant * variant)
{
- GValueArray * array = (GValueArray *)data;
-
- g_return_if_fail(array->n_values == 7);
-
- const gchar * icon_name = g_value_get_string(g_value_array_get_nth(array, 0));
- gint position = g_value_get_int(g_value_array_get_nth(array, 1));
- const gchar * dbus_address = g_value_get_string(g_value_array_get_nth(array, 2));
- const gchar * dbus_object = g_value_get_boxed(g_value_array_get_nth(array, 3));
- const gchar * icon_theme_path = g_value_get_string(g_value_array_get_nth(array, 4));
- const gchar * label = g_value_get_string(g_value_array_get_nth(array, 5));
- const gchar * guide = g_value_get_string(g_value_array_get_nth(array, 6));
-
- return application_added(NULL, icon_name, position, dbus_address, dbus_object, icon_theme_path, label, guide, user_data);
+ const gchar * icon_name;
+ gint position;
+ const gchar * dbus_address;
+ const gchar * dbus_object;
+ const gchar * icon_theme_path;
+ const gchar * label;
+ const gchar * guide;
+ g_variant_get(variant, "(sisosss)", &icon_name, &position,
+ &dbus_address, &dbus_object, &icon_theme_path, &label,
+ &guide);
+
+ return application_added(self, icon_name, position, dbus_address, dbus_object, icon_theme_path, label, guide);
}
/* Unrefs a theme directory. This may involve removing it from
diff --git a/src/notification-item.xml b/src/notification-item.xml
deleted file mode 100644
index 05afd83..0000000
--- a/src/notification-item.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<node name="/StatusNotifierItem">
- <interface name="org.kde.StatusNotifierItem">
-
-<!-- Properties -->
- <property name="Id" type="s" access="read" />
- <property name="Category" type="s" access="read" />
- <property name="Status" type="s" access="read" />
- <property name="IconName" type="s" access="read" />
- <property name="AttentionIconName" type="s" access="read" />
- <!-- An additional path to add to the theme search path
- to find the icons specified above. -->
- <property name="IconThemePath" type="s" access="read" />
- <property name="Menu" type="o" access="read" />
- <property name="XAyatanaLabel" type="s" access="read" />
- <property name="XAyatanaLabelGuide" type="s" access="read" />
- <property name="XAyatanaOrderingIndex" type="u" access="read" />
-
-<!-- Methods -->
- <!-- None currently -->
-
-<!-- Signals -->
- <signal name="NewIcon">
- </signal>
- <signal name="NewIconThemePath">
- <arg type="s" name="icon_theme_path" direction="out" />
- </signal>
- <signal name="NewAttentionIcon">
- </signal>
- <signal name="NewStatus">
- <arg type="s" name="status" direction="out" />
- </signal>
- <signal name="XAyatanaNewLabel">
- <arg type="s" name="label" direction="out" />
- <arg type="s" name="guide" direction="out" />
- </signal>
-
- </interface>
-</node>
diff --git a/tests/Makefile.am b/tests/Makefile.am
index cef1eda..a885dff 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -14,6 +14,7 @@ DBUS_RUNNER=dbus-test-runner --dbus-config /usr/share/dbus-test-runner/session.c
#########################################
test_approver_SOURCES = \
+ $(top_srcdir)/src/gen-notification-approver.xml.c \
test-approver.c
test_approver_CFLAGS = \
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 09dfc32..49192b9 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -47,7 +47,9 @@ mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-am_test_approver_OBJECTS = test_approver-test-approver.$(OBJEXT)
+am_test_approver_OBJECTS = \
+ test_approver-gen-notification-approver.xml.$(OBJEXT) \
+ test_approver-test-approver.$(OBJEXT)
test_approver_OBJECTS = $(am_test_approver_OBJECTS)
am__DEPENDENCIES_1 =
test_approver_DEPENDENCIES = $(am__DEPENDENCIES_1) \
@@ -225,6 +227,7 @@ DBUS_RUNNER = dbus-test-runner --dbus-config /usr/share/dbus-test-runner/session
#########################################
#########################################
test_approver_SOURCES = \
+ $(top_srcdir)/src/gen-notification-approver.xml.c \
test-approver.c
test_approver_CFLAGS = \
@@ -291,6 +294,7 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_approver-gen-notification-approver.xml.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_approver-test-approver.Po@am__quote@
.c.o:
@@ -317,6 +321,22 @@ distclean-compile:
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+test_approver-gen-notification-approver.xml.o: $(top_srcdir)/src/gen-notification-approver.xml.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_approver_CFLAGS) $(CFLAGS) -MT test_approver-gen-notification-approver.xml.o -MD -MP -MF $(DEPDIR)/test_approver-gen-notification-approver.xml.Tpo -c -o test_approver-gen-notification-approver.xml.o `test -f '$(top_srcdir)/src/gen-notification-approver.xml.c' || echo '$(srcdir)/'`$(top_srcdir)/src/gen-notification-approver.xml.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_approver-gen-notification-approver.xml.Tpo $(DEPDIR)/test_approver-gen-notification-approver.xml.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/src/gen-notification-approver.xml.c' object='test_approver-gen-notification-approver.xml.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_approver_CFLAGS) $(CFLAGS) -c -o test_approver-gen-notification-approver.xml.o `test -f '$(top_srcdir)/src/gen-notification-approver.xml.c' || echo '$(srcdir)/'`$(top_srcdir)/src/gen-notification-approver.xml.c
+
+test_approver-gen-notification-approver.xml.obj: $(top_srcdir)/src/gen-notification-approver.xml.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_approver_CFLAGS) $(CFLAGS) -MT test_approver-gen-notification-approver.xml.obj -MD -MP -MF $(DEPDIR)/test_approver-gen-notification-approver.xml.Tpo -c -o test_approver-gen-notification-approver.xml.obj `if test -f '$(top_srcdir)/src/gen-notification-approver.xml.c'; then $(CYGPATH_W) '$(top_srcdir)/src/gen-notification-approver.xml.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/gen-notification-approver.xml.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_approver-gen-notification-approver.xml.Tpo $(DEPDIR)/test_approver-gen-notification-approver.xml.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_srcdir)/src/gen-notification-approver.xml.c' object='test_approver-gen-notification-approver.xml.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_approver_CFLAGS) $(CFLAGS) -c -o test_approver-gen-notification-approver.xml.obj `if test -f '$(top_srcdir)/src/gen-notification-approver.xml.c'; then $(CYGPATH_W) '$(top_srcdir)/src/gen-notification-approver.xml.c'; else $(CYGPATH_W) '$(srcdir)/$(top_srcdir)/src/gen-notification-approver.xml.c'; fi`
+
test_approver-test-approver.o: test-approver.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_approver_CFLAGS) $(CFLAGS) -MT test_approver-test-approver.o -MD -MP -MF $(DEPDIR)/test_approver-test-approver.Tpo -c -o test_approver-test-approver.o `test -f 'test-approver.c' || echo '$(srcdir)/'`test-approver.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_approver-test-approver.Tpo $(DEPDIR)/test_approver-test-approver.Po
diff --git a/tests/test-approver.c b/tests/test-approver.c
index adad4a7..6fc75c5 100644
--- a/tests/test-approver.c
+++ b/tests/test-approver.c
@@ -1,11 +1,10 @@
#include <glib.h>
#include <glib-object.h>
+#include <gio/gio.h>
-#include <dbus/dbus-glib-bindings.h>
-
-#include "notification-watcher-client.h"
#include "dbus-shared.h"
#include "libappindicator/app-indicator.h"
+#include "gen-notification-approver.xml.h"
#define APPROVER_PATH "/my/approver"
@@ -35,13 +34,22 @@ GType test_approver_get_type (void);
static void test_approver_class_init (TestApproverClass *klass);
static void test_approver_init (TestApprover *self);
-static gboolean _notification_approver_server_approve_item (TestApprover * ta, const gchar * id, const gchar * category, guint pid, const gchar * address, const gchar * path, gboolean * approved, GError ** error);
-
-#include "../src/notification-approver-server.h"
+static GVariant * approve_item (TestApprover * ta, const gchar * id);
+static void bus_method_call (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * method, GVariant * params, GDBusMethodInvocation * invocation, gpointer user_data);
+
+/* GDBus Stuff */
+static GDBusNodeInfo * node_info = NULL;
+static GDBusInterfaceInfo * interface_info = NULL;
+static GDBusInterfaceVTable interface_table = {
+ method_call: bus_method_call,
+ get_property: NULL, /* No properties */
+ set_property: NULL /* No properties */
+};
GMainLoop * main_loop = NULL;
-DBusGConnection * session_bus = NULL;
-DBusGProxy * bus_proxy = NULL;
+GDBusConnection * session_bus = NULL;
+GDBusProxy * bus_proxy = NULL;
+GDBusProxy * watcher_proxy = NULL;
AppIndicator * app_indicator = NULL;
gboolean passed = FALSE;
@@ -50,8 +58,24 @@ G_DEFINE_TYPE (TestApprover, test_approver, G_TYPE_OBJECT);
static void
test_approver_class_init (TestApproverClass *klass)
{
- dbus_g_object_type_install_info(TEST_APPROVER_TYPE,
- &dbus_glib__notification_approver_server_object_info);
+ /* Setting up the DBus interfaces */
+ if (node_info == NULL) {
+ GError * error = NULL;
+
+ node_info = g_dbus_node_info_new_for_xml(_notification_approver, &error);
+ if (error != NULL) {
+ g_error("Unable to parse Approver Service Interface description: %s", error->message);
+ g_error_free(error);
+ }
+ }
+
+ if (interface_info == NULL) {
+ interface_info = g_dbus_node_info_lookup_interface(node_info, NOTIFICATION_APPROVER_DBUS_IFACE);
+
+ if (interface_info == NULL) {
+ g_error("Unable to find interface '" NOTIFICATION_APPROVER_DBUS_IFACE "'");
+ }
+ }
return;
}
@@ -59,17 +83,29 @@ test_approver_class_init (TestApproverClass *klass)
static void
test_approver_init (TestApprover *self)
{
- dbus_g_connection_register_g_object(session_bus,
- APPROVER_PATH,
- G_OBJECT(self));
+ GError * error = NULL;
+
+ /* Now register our object on our new connection */
+ g_dbus_connection_register_object(session_bus,
+ APPROVER_PATH,
+ interface_info,
+ &interface_table,
+ self,
+ NULL,
+ &error);
+
+ if (error != NULL) {
+ g_error("Unable to register the object to DBus: %s", error->message);
+ g_error_free(error);
+ return;
+ }
return;
}
-static gboolean
-_notification_approver_server_approve_item (TestApprover * ta, const gchar * id, const gchar * category, guint pid, const gchar * address, const gchar * path, gboolean * approved, GError ** error)
+static GVariant *
+approve_item (TestApprover * ta, const gchar * id)
{
- *approved = TRUE;
g_debug("Asked to approve indicator");
if (g_strcmp0(id, INDICATOR_ID) == 0) {
@@ -78,12 +114,41 @@ _notification_approver_server_approve_item (TestApprover * ta, const gchar * id,
g_main_loop_quit(main_loop);
- return TRUE;
+ return g_variant_new("(b)", TRUE);
}
+/* A method has been called from our dbus inteface. Figure out what it
+ is and dispatch it. */
static void
-register_cb (DBusGProxy * proxy, GError * error, gpointer user_data)
+bus_method_call (GDBusConnection * connection, const gchar * sender,
+ const gchar * path, const gchar * interface,
+ const gchar * method, GVariant * params,
+ GDBusMethodInvocation * invocation, gpointer user_data)
{
+ TestApprover * ta = (TestApprover *)user_data;
+ GVariant * retval = NULL;
+
+ if (g_strcmp0(method, "ApproveItem") == 0) {
+ const gchar * id;
+ g_variant_get(params, "(&ssuso)", &id, NULL, NULL, NULL, NULL);
+ retval = approve_item(ta, id);
+ } else {
+ g_warning("Calling method '%s' on the indicator service and it's unknown", method);
+ }
+
+ g_dbus_method_invocation_return_value(invocation, retval);
+ return;
+}
+
+static void
+register_cb (GObject *object, GAsyncResult *res, gpointer user_data)
+{
+ GDBusProxy * proxy = G_DBUS_PROXY(object);
+ GError * error = NULL;
+ GVariant * result;
+
+ result = g_dbus_proxy_call_finish(proxy, res, &error);
+
if (error != NULL) {
g_warning("Unable to register approver: %s", error->message);
g_error_free(error);
@@ -118,18 +183,17 @@ check_for_service (gpointer user_data)
owner_count++;
gboolean has_owner = FALSE;
- org_freedesktop_DBus_name_has_owner(bus_proxy, NOTIFICATION_WATCHER_DBUS_ADDR, &has_owner, NULL);
+ gchar * owner = g_dbus_proxy_get_name_owner(bus_proxy);
+ has_owner = (owner != NULL);
+ g_free (owner);
if (has_owner) {
- const char * cats = NULL;
- DBusGProxy * proxy = dbus_g_proxy_new_for_name(session_bus,
- NOTIFICATION_WATCHER_DBUS_ADDR,
- NOTIFICATION_WATCHER_DBUS_OBJ,
- NOTIFICATION_WATCHER_DBUS_IFACE);
-
g_debug("Registering Approver");
- org_kde_StatusNotifierWatcher_x_ayatana_register_notification_approver_async (proxy, APPROVER_PATH, &cats, register_cb, NULL);
-
+ GVariantBuilder * builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
+ g_dbus_proxy_call(bus_proxy, "XAyatanaRegisterNotificationApprover",
+ g_variant_new("(oas)", APPROVER_PATH, builder),
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL, register_cb,
+ NULL);
return FALSE;
}
@@ -152,16 +216,22 @@ main (int argc, char ** argv)
gtk_init(&argc, &argv);
g_debug("Initing");
- session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
+ session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
+ TestApprover * approver = g_object_new(TEST_APPROVER_TYPE, NULL);
+
+ bus_proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, NULL, NOTIFICATION_WATCHER_DBUS_ADDR, NOTIFICATION_WATCHER_DBUS_OBJ, NOTIFICATION_WATCHER_DBUS_IFACE, NULL, &error);
if (error != NULL) {
- g_warning("Unable to get session bus: %s", error->message);
+ g_warning("Unable to get bus proxy: %s", error->message);
g_error_free(error);
return -1;
}
- TestApprover * approver = g_object_new(TEST_APPROVER_TYPE, NULL);
-
- bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
+ watcher_proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, NULL, NOTIFICATION_WATCHER_DBUS_ADDR, NOTIFICATION_WATCHER_DBUS_OBJ, NOTIFICATION_WATCHER_DBUS_IFACE, NULL, &error);
+ if (error != NULL) {
+ g_warning("Unable to get watcher bus: %s", error->message);
+ g_error_free(error);
+ return -1;
+ }
g_timeout_add(100, check_for_service, NULL);
g_timeout_add_seconds(2, fail_timeout, NULL);
diff --git a/xmldocs.make b/xmldocs.make
deleted file mode 100644
index b93e3f3..0000000
--- a/xmldocs.make
+++ /dev/null
@@ -1,101 +0,0 @@
-#
-# No modifications of this Makefile should be necessary.
-#
-# To use this template:
-# 1) Define: figdir, docname, lang, omffile, and entities in
-# your Makefile.am file for each document directory,
-# although figdir, omffile, and entities may be empty
-# 2) Make sure the Makefile in (1) also includes
-# "include $(top_srcdir)/xmldocs.make" and
-# "dist-hook: app-dist-hook".
-# 3) Optionally define 'entities' to hold xml entities which
-# you would also like installed
-# 4) Figures must go under $(figdir)/ and be in PNG format
-# 5) You should only have one document per directory
-# 6) Note that the figure directory, $(figdir)/, should not have its
-# own Makefile since this Makefile installs those figures.
-#
-# example Makefile.am:
-# figdir = figures
-# docname = scrollkeeper-manual
-# lang = C
-# omffile=scrollkeeper-manual-C.omf
-# entities = fdl.xml
-# include $(top_srcdir)/xmldocs.make
-# dist-hook: app-dist-hook
-#
-# About this file:
-# This file was taken from scrollkeeper_example2, a package illustrating
-# how to install documentation and OMF files for use with ScrollKeeper
-# 0.3.x and 0.4.x. For more information, see:
-# http://scrollkeeper.sourceforge.net/
-# Version: 0.1.2 (last updated: March 20, 2002)
-#
-
-
-# ********** Begin of section some packagers may need to modify **********
-# This variable (docdir) specifies where the documents should be installed.
-# This default value should work for most packages.
-docdir = $(datadir)/gnome/help/$(docname)/$(lang)
-
-# ********** You should not have to edit below this line **********
-xml_files = $(entities) $(docname).xml
-
-EXTRA_DIST = $(xml_files) $(omffile)
-CLEANFILES = omf_timestamp
-
-include $(top_srcdir)/omf.make
-
-all: omf
-
-$(docname).xml: $(entities)
- -ourdir=`pwd`; \
- cd $(srcdir); \
- cp $(entities) $$ourdir
-
-app-dist-hook:
- if test "$(figdir)"; then \
- $(mkinstalldirs) $(distdir)/$(figdir); \
- for file in $(srcdir)/$(figdir)/*.png; do \
- basefile=`echo $$file | sed -e 's,^.*/,,'`; \
- $(INSTALL_DATA) $$file $(distdir)/$(figdir)/$$basefile; \
- done \
- fi
-
-install-data-local: omf
- $(mkinstalldirs) $(DESTDIR)$(docdir)
- for file in $(xml_files); do \
- cp $(srcdir)/$$file $(DESTDIR)$(docdir); \
- done
- if test "$(figdir)"; then \
- $(mkinstalldirs) $(DESTDIR)$(docdir)/$(figdir); \
- for file in $(srcdir)/$(figdir)/*.png; do \
- basefile=`echo $$file | sed -e 's,^.*/,,'`; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \
- done \
- fi
-
-install-data-hook: install-data-hook-omf
-
-uninstall-local: uninstall-local-doc uninstall-local-omf
-
-uninstall-local-doc:
- -if test "$(figdir)"; then \
- for file in $(srcdir)/$(figdir)/*.png; do \
- basefile=`echo $$file | sed -e 's,^.*/,,'`; \
- rm -f $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \
- done; \
- rmdir $(DESTDIR)$(docdir)/$(figdir); \
- fi
- -for file in $(xml_files); do \
- rm -f $(DESTDIR)$(docdir)/$$file; \
- done
- -rmdir $(DESTDIR)$(docdir)
-
-clean-local: clean-local-doc clean-local-omf
-
-# for non-srcdir builds, remove the copied entities.
-clean-local-doc:
- if test $(srcdir) != .; then \
- rm -f $(entities); \
- fi