diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/AppIndicator-0.1.metadata | 1 | ||||
-rw-r--r-- | src/Makefile.am | 162 | ||||
-rw-r--r-- | src/Makefile.in | 562 | ||||
-rw-r--r-- | src/app-indicator-enum-types.c | 2 | ||||
-rw-r--r-- | src/app-indicator-enum-types.h | 52 | ||||
-rw-r--r-- | src/app-indicator.c | 2118 | ||||
-rw-r--r-- | src/app-indicator.h | 302 | ||||
-rw-r--r-- | src/appindicator-0.1.pc.in | 14 | ||||
-rw-r--r-- | src/appindicator3-0.1.pc.in | 14 | ||||
-rw-r--r-- | src/application-service-appstore.c | 1115 | ||||
-rw-r--r-- | src/application-service.c | 1 | ||||
-rw-r--r-- | src/application-service.xml | 2 | ||||
-rw-r--r-- | src/dbus-properties.xml | 23 | ||||
-rw-r--r-- | src/dbus-shared.h | 6 | ||||
-rw-r--r-- | src/gen-application-service.xml.c | 61 | ||||
-rw-r--r-- | src/gen-notification-approver.xml.c | 31 | ||||
-rw-r--r-- | src/generate-id.h | 2 | ||||
-rw-r--r-- | src/indicator-application.c | 324 | ||||
-rw-r--r-- | src/notification-item.xml | 39 |
19 files changed, 960 insertions, 3871 deletions
diff --git a/src/AppIndicator-0.1.metadata b/src/AppIndicator-0.1.metadata deleted file mode 100644 index e4d068e..0000000 --- a/src/AppIndicator-0.1.metadata +++ /dev/null @@ -1 +0,0 @@ -AppIndicator name="AppIndicator" diff --git a/src/Makefile.am b/src/Makefile.am index 9e58943..18e2baf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,22 +1,13 @@ if USE_GTK3 VER=3 -lib_LTLIBRARIES = libappindicator3.la -GTKGIR = Gtk-3.0 -GTKVAPI = gtk+-3.0 else VER= -lib_LTLIBRARIES = libappindicator.la -GTKGIR = Gtk-2.0 -GTKVAPI = gtk+-2.0 endif CLEANFILES = DISTCLEANFILES = BUILT_SOURCES = -EXTRA_DIST = \ - appindicator-0.1.pc.in \ - appindicator3-0.1.pc.in \ - AppIndicator-0.1.metadata +EXTRA_DIST = include $(top_srcdir)/Makefile.am.enum include $(top_srcdir)/Makefile.am.marshal @@ -48,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 = \ @@ -62,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 \ @@ -69,84 +58,32 @@ indicator_application_service_SOURCES = \ indicator_application_service_CFLAGS = \ $(INDICATOR_CFLAGS) \ + -I$(APP_INDICATOR_INCLUDE) \ -DDATADIR="\"$(pkgdatadir)\"" \ -Wall -Werror \ -DG_LOG_DOMAIN=\"indicator-application-service\" indicator_application_service_LDADD = \ - $(INDICATOR_LIBS) \ - libappindicator$(VER).la + $(INDICATOR_LIBS) glib_marshal_list = application-service-marshal.list glib_marshal_prefix = _application_service_marshal -################################## -# Library -################################## - -pkgconfig_DATA = appindicator$(VER)-0.1.pc -pkgconfigdir = $(libdir)/pkgconfig - glib_enum_h = app-indicator-enum-types.h glib_enum_c = app-indicator-enum-types.c -glib_enum_headers = $(addprefix $(srcdir)/, $(libappindicator_headers)) +glib_enum_headers = $(wildcard $(APP_INDICATOR_INCLUDE)/libappindicator/*.h) DISTCLEANFILES += app-indicator-enum-types.c -libappindicatorincludedir=$(includedir)/libappindicator$(VER)-0.1/libappindicator - -libappindicator_headers = \ - app-indicator.h - -libappindicatorinclude_HEADERS = \ - $(libappindicator_headers) \ - $(glib_enum_h) - -BUILT_SOURCES += \ - notification-watcher-client.h \ - notification-item-server.h - -libappindicator_la_SOURCES = \ - $(libappindicator_headers) \ - app-indicator-enum-types.c \ - app-indicator.c \ - application-service-marshal.c \ - generate-id.h \ - generate-id.c - -libappindicator_la_LDFLAGS = \ - -version-info 1:0:0 \ - -no-undefined \ - -export-symbols-regex "^[^_d].*" - -libappindicator_la_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -DG_LOG_DOMAIN=\"libappindicator\" - -libappindicator_la_LIBADD = \ - $(INDICATOR_LIBS) - -# We duplicate these here because Automake won't let us use $(VER) on the left hand side. -# Since we carefully use $(VER) in the right hand side above, we can assign the same values. -# Only one version of the library is every compiled at the same time, so it is safe to reuse -# the right hand sides like this. -libappindicator3includedir = $(libappindicatorincludedir) -libappindicator3include_HEADERS = $(libappindicatorinclude_HEADERS) -libappindicator3_la_SOURCES = $(libappindicator_la_SOURCES) -libappindicator3_la_LDFLAGS = $(libappindicator_la_LDFLAGS) -libappindicator3_la_CFLAGS = $(libappindicator_la_CFLAGS) -libappindicator3_la_LIBADD = $(libappindicator_la_LIBADD) - ################################## # 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 @@ -163,73 +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) - -######################### -# GObject Introsepction -######################### - --include $(INTROSPECTION_MAKEFILE) -INTROSPECTION_GIRS = -INTROSPECTION_SCANNER_ARGS = \ - --add-include-path=$(srcdir) \ - $(addprefix --c-include=src/, $(introspection_sources)) \ - --symbol-prefix=app \ - --identifier-prefix=App -INTROSPECTION_COMPILER_ARGS = --includedir=$(builddir) - -if HAVE_INTROSPECTION - -introspection_sources = \ - $(addprefix $(srcdir)/,$(libappindicator_headers)) - -AppIndicator$(VER)-0.1.gir: libappindicator$(VER).la -AppIndicator_0_1_gir_INCLUDES = \ - GObject-2.0 \ - $(GTKGIR) -AppIndicator_0_1_gir_CFLAGS = $(INDICATOR_CFLAGS) -I$(srcdir) -I$(top_builddir)/src -AppIndicator_0_1_gir_LIBS = libappindicator$(VER).la -AppIndicator_0_1_gir_FILES = $(introspection_sources) - -AppIndicator3_0_1_gir_INCLUDES = $(AppIndicator_0_1_gir_INCLUDES) -AppIndicator3_0_1_gir_CFLAGS = $(AppIndicator_0_1_gir_CFLAGS) -AppIndicator3_0_1_gir_LIBS = $(AppIndicator_0_1_gir_LIBS) -AppIndicator3_0_1_gir_FILES = $(AppIndicator_0_1_gir_FILES) - -INTROSPECTION_GIRS += AppIndicator$(VER)-0.1.gir - -girdir = $(datadir)/gir-1.0 -gir_DATA = $(INTROSPECTION_GIRS) - -typelibdir = $(libdir)/girepository-1.0 -typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) - -CLEANFILES += $(gir_DATA) $(typelib_DATA) - -endif - -######################### -# VAPI Files -######################### - -if HAVE_INTROSPECTION - -vapidir = $(datadir)/vala/vapi -vapi_DATA = AppIndicator$(VER)-0.1.vapi - -AppIndicator$(VER)-0.1.vapi: AppIndicator$(VER)-0.1.gir Makefile.am - $(VALA_API_GEN) --library=AppIndicator$(VER)-0.1 \ - --pkg $(GTKVAPI) \ - --vapidir=$(top_builddir)/src \ - $< - -CLEANFILES += $(vapi_DATA) - -endif - +EXTRA_DIST += $(DBUS_SPECS) $(GDBUS_SPECS) diff --git a/src/Makefile.in b/src/Makefile.in index 3e55704..c24eb09 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -49,8 +49,6 @@ # Author: Emmanuele Bassi <ebassi@linux.intel.com> - - VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ @@ -70,20 +68,13 @@ PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(libappindicator3include_HEADERS) \ - $(libappindicatorinclude_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/appindicator-0.1.pc.in \ - $(srcdir)/appindicator3-0.1.pc.in \ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/Makefile.am.enum \ $(top_srcdir)/Makefile.am.marshal libexec_PROGRAMS = indicator-application-service$(EXEEXT) -@HAVE_INTROSPECTION_TRUE@am__append_1 = AppIndicator$(VER)-0.1.gir -@HAVE_INTROSPECTION_TRUE@am__append_2 = $(gir_DATA) $(typelib_DATA) \ -@HAVE_INTROSPECTION_TRUE@ $(vapi_DATA) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \ - $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \ +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac @@ -91,7 +82,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = appindicator-0.1.pc appindicator3-0.1.pc +CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ @@ -115,48 +106,17 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(applicationlibdir)" \ - "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexecdir)" \ - "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" \ - "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(vapidir)" \ - "$(DESTDIR)$(libappindicator3includedir)" \ - "$(DESTDIR)$(libappindicatorincludedir)" -LTLIBRARIES = $(applicationlib_LTLIBRARIES) $(lib_LTLIBRARIES) + "$(DESTDIR)$(libexecdir)" +LTLIBRARIES = $(applicationlib_LTLIBRARIES) am__DEPENDENCIES_1 = -libappindicator_la_DEPENDENCIES = $(am__DEPENDENCIES_1) -am__objects_1 = -am_libappindicator_la_OBJECTS = $(am__objects_1) \ - libappindicator_la-app-indicator-enum-types.lo \ - libappindicator_la-app-indicator.lo \ - libappindicator_la-application-service-marshal.lo \ - libappindicator_la-generate-id.lo -libappindicator_la_OBJECTS = $(am_libappindicator_la_OBJECTS) -AM_V_lt = $(am__v_lt_$(V)) -am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) -am__v_lt_0 = --silent -libappindicator_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(libappindicator_la_CFLAGS) $(CFLAGS) \ - $(libappindicator_la_LDFLAGS) $(LDFLAGS) -o $@ -@USE_GTK3_FALSE@am_libappindicator_la_rpath = -rpath $(libdir) -am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) -libappindicator3_la_DEPENDENCIES = $(am__DEPENDENCIES_2) -am__objects_2 = $(am__objects_1) \ - libappindicator3_la-app-indicator-enum-types.lo \ - libappindicator3_la-app-indicator.lo \ - libappindicator3_la-application-service-marshal.lo \ - libappindicator3_la-generate-id.lo -am_libappindicator3_la_OBJECTS = $(am__objects_2) -libappindicator3_la_OBJECTS = $(am_libappindicator3_la_OBJECTS) -libappindicator3_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(libappindicator3_la_CFLAGS) $(CFLAGS) \ - $(libappindicator3_la_LDFLAGS) $(LDFLAGS) -o $@ -@USE_GTK3_TRUE@am_libappindicator3_la_rpath = -rpath $(libdir) libapplication_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libapplication_la_OBJECTS = \ libapplication_la-application-service-marshal.lo \ libapplication_la-indicator-application.lo libapplication_la_OBJECTS = $(am_libapplication_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent libapplication_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libapplication_la_CFLAGS) $(CFLAGS) \ @@ -167,12 +127,12 @@ 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 = \ $(am_indicator_application_service_OBJECTS) -indicator_application_service_DEPENDENCIES = $(am__DEPENDENCIES_1) \ - libappindicator$(VER).la +indicator_application_service_DEPENDENCIES = $(am__DEPENDENCIES_1) indicator_application_service_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(indicator_application_service_CFLAGS) $(CFLAGS) \ @@ -203,24 +163,17 @@ am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; -SOURCES = $(libappindicator_la_SOURCES) $(libappindicator3_la_SOURCES) \ - $(libapplication_la_SOURCES) \ +SOURCES = $(libapplication_la_SOURCES) \ $(indicator_application_service_SOURCES) -DIST_SOURCES = $(libappindicator_la_SOURCES) \ - $(libappindicator3_la_SOURCES) $(libapplication_la_SOURCES) \ +DIST_SOURCES = $(libapplication_la_SOURCES) \ $(indicator_application_service_SOURCES) -DATA = $(gir_DATA) $(pkgconfig_DATA) $(typelib_DATA) $(vapi_DATA) -HEADERS = $(libappindicator3include_HEADERS) \ - $(libappindicatorinclude_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ -AL = @AL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -APPINDICATOR_PYTHON_CFLAGS = @APPINDICATOR_PYTHON_CFLAGS@ -APPINDICATOR_PYTHON_LIBS = @APPINDICATOR_PYTHON_LIBS@ +APP_INDICATOR_INCLUDE = @APP_INDICATOR_INCLUDE@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ @@ -231,7 +184,6 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CSC = @CSC@ CYGPATH_W = @CYGPATH_W@ DBUSSERVICEDIR = @DBUSSERVICEDIR@ DEFS = @DEFS@ @@ -244,22 +196,9 @@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ -GACUTIL = @GACUTIL@ -GAPI_CFLAGS = @GAPI_CFLAGS@ -GAPI_CODEGEN = @GAPI_CODEGEN@ -GAPI_FIXUP = @GAPI_FIXUP@ -GAPI_LIBS = @GAPI_LIBS@ -GAPI_PARSER = @GAPI_PARSER@ -GENERATED_SOURCES = @GENERATED_SOURCES@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_MKENUMS = @GLIB_MKENUMS@ GREP = @GREP@ -GTKDOC_CHECK = @GTKDOC_CHECK@ -GTKDOC_MKPDF = @GTKDOC_MKPDF@ -GTKDOC_REBASE = @GTKDOC_REBASE@ -GTK_SHARP_CFLAGS = @GTK_SHARP_CFLAGS@ -GTK_SHARP_LIBS = @GTK_SHARP_LIBS@ -HTML_DIR = @HTML_DIR@ INDICATORDIR = @INDICATORDIR@ INDICATORICONSDIR = @INDICATORICONSDIR@ INDICATOR_CFLAGS = @INDICATOR_CFLAGS@ @@ -269,33 +208,19 @@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@ -INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@ -INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@ -INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@ -INTROSPECTION_LIBS = @INTROSPECTION_LIBS@ -INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@ -INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@ -INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ -LIB_PREFIX = @LIB_PREFIX@ -LIB_SUFFIX = @LIB_SUFFIX@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ -MONO_DEPENDENCY_CFLAGS = @MONO_DEPENDENCY_CFLAGS@ -MONO_DEPENDENCY_LIBS = @MONO_DEPENDENCY_LIBS@ NM = @NM@ NMEDIT = @NMEDIT@ -NUNIT_CFLAGS = @NUNIT_CFLAGS@ -NUNIT_LIBS = @NUNIT_LIBS@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ @@ -311,21 +236,13 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ -PYGTK_CODEGEN = @PYGTK_CODEGEN@ -PYGTK_DEFSDIR = @PYGTK_DEFSDIR@ -PYTHON = @PYTHON@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_INCLUDES = @PYTHON_INCLUDES@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ -RUNTIME = @RUNTIME@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ -VALA_API_GEN = @VALA_API_GEN@ +TEST_CFLAGS = @TEST_CFLAGS@ +TEST_LIBS = @TEST_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ @@ -368,13 +285,9 @@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -385,26 +298,18 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @USE_GTK3_FALSE@VER = @USE_GTK3_TRUE@VER = 3 -@USE_GTK3_FALSE@lib_LTLIBRARIES = libappindicator.la -@USE_GTK3_TRUE@lib_LTLIBRARIES = libappindicator3.la -@USE_GTK3_FALSE@GTKGIR = Gtk-2.0 -@USE_GTK3_TRUE@GTKGIR = Gtk-3.0 -@USE_GTK3_FALSE@GTKVAPI = gtk+-2.0 -@USE_GTK3_TRUE@GTKVAPI = gtk+-3.0 -CLEANFILES = stamp-enum-types stamp-marshal $(BUILT_SOURCES) \ - $(am__append_2) +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 notification-watcher-client.h \ - notification-item-server.h $(DBUS_SPECS:.xml=-client.h) \ - $(DBUS_SPECS:.xml=-server.h) -EXTRA_DIST = appindicator-0.1.pc.in appindicator3-0.1.pc.in \ - AppIndicator-0.1.metadata $(enum_tmpl_h) $(enum_tmpl_c) \ - $(glib_marshal_list) $(DBUS_SPECS) + $(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) $(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) @@ -437,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 \ @@ -444,108 +350,30 @@ indicator_application_service_SOURCES = \ indicator_application_service_CFLAGS = \ $(INDICATOR_CFLAGS) \ + -I$(APP_INDICATOR_INCLUDE) \ -DDATADIR="\"$(pkgdatadir)\"" \ -Wall -Werror \ -DG_LOG_DOMAIN=\"indicator-application-service\" indicator_application_service_LDADD = \ - $(INDICATOR_LIBS) \ - libappindicator$(VER).la + $(INDICATOR_LIBS) glib_marshal_list = application-service-marshal.list glib_marshal_prefix = _application_service_marshal - -################################## -# Library -################################## -pkgconfig_DATA = appindicator$(VER)-0.1.pc -pkgconfigdir = $(libdir)/pkgconfig glib_enum_h = app-indicator-enum-types.h glib_enum_c = app-indicator-enum-types.c -glib_enum_headers = $(addprefix $(srcdir)/, $(libappindicator_headers)) -libappindicatorincludedir = $(includedir)/libappindicator$(VER)-0.1/libappindicator -libappindicator_headers = \ - app-indicator.h - -libappindicatorinclude_HEADERS = \ - $(libappindicator_headers) \ - $(glib_enum_h) - -libappindicator_la_SOURCES = \ - $(libappindicator_headers) \ - app-indicator-enum-types.c \ - app-indicator.c \ - application-service-marshal.c \ - generate-id.h \ - generate-id.c - -libappindicator_la_LDFLAGS = \ - -version-info 1:0:0 \ - -no-undefined \ - -export-symbols-regex "^[^_d].*" - -libappindicator_la_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -Wall -Werror \ - -DG_LOG_DOMAIN=\"libappindicator\" - -libappindicator_la_LIBADD = \ - $(INDICATOR_LIBS) - - -# We duplicate these here because Automake won't let us use $(VER) on the left hand side. -# Since we carefully use $(VER) in the right hand side above, we can assign the same values. -# Only one version of the library is every compiled at the same time, so it is safe to reuse -# the right hand sides like this. -libappindicator3includedir = $(libappindicatorincludedir) -libappindicator3include_HEADERS = $(libappindicatorinclude_HEADERS) -libappindicator3_la_SOURCES = $(libappindicator_la_SOURCES) -libappindicator3_la_LDFLAGS = $(libappindicator_la_LDFLAGS) -libappindicator3_la_CFLAGS = $(libappindicator_la_CFLAGS) -libappindicator3_la_LIBADD = $(libappindicator_la_LIBADD) +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 -INTROSPECTION_GIRS = $(am__append_1) -INTROSPECTION_SCANNER_ARGS = \ - --add-include-path=$(srcdir) \ - $(addprefix --c-include=src/, $(introspection_sources)) \ - --symbol-prefix=app \ - --identifier-prefix=App - -INTROSPECTION_COMPILER_ARGS = --includedir=$(builddir) -@HAVE_INTROSPECTION_TRUE@introspection_sources = \ -@HAVE_INTROSPECTION_TRUE@ $(addprefix $(srcdir)/,$(libappindicator_headers)) - -@HAVE_INTROSPECTION_TRUE@AppIndicator_0_1_gir_INCLUDES = \ -@HAVE_INTROSPECTION_TRUE@ GObject-2.0 \ -@HAVE_INTROSPECTION_TRUE@ $(GTKGIR) - -@HAVE_INTROSPECTION_TRUE@AppIndicator_0_1_gir_CFLAGS = $(INDICATOR_CFLAGS) -I$(srcdir) -I$(top_builddir)/src -@HAVE_INTROSPECTION_TRUE@AppIndicator_0_1_gir_LIBS = libappindicator$(VER).la -@HAVE_INTROSPECTION_TRUE@AppIndicator_0_1_gir_FILES = $(introspection_sources) -@HAVE_INTROSPECTION_TRUE@AppIndicator3_0_1_gir_INCLUDES = $(AppIndicator_0_1_gir_INCLUDES) -@HAVE_INTROSPECTION_TRUE@AppIndicator3_0_1_gir_CFLAGS = $(AppIndicator_0_1_gir_CFLAGS) -@HAVE_INTROSPECTION_TRUE@AppIndicator3_0_1_gir_LIBS = $(AppIndicator_0_1_gir_LIBS) -@HAVE_INTROSPECTION_TRUE@AppIndicator3_0_1_gir_FILES = $(AppIndicator_0_1_gir_FILES) -@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0 -@HAVE_INTROSPECTION_TRUE@gir_DATA = $(INTROSPECTION_GIRS) -@HAVE_INTROSPECTION_TRUE@typelibdir = $(libdir)/girepository-1.0 -@HAVE_INTROSPECTION_TRUE@typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) - -######################### -# VAPI Files -######################### -@HAVE_INTROSPECTION_TRUE@vapidir = $(datadir)/vala/vapi -@HAVE_INTROSPECTION_TRUE@vapi_DATA = AppIndicator$(VER)-0.1.vapi all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am @@ -581,10 +409,6 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -appindicator-0.1.pc: $(top_builddir)/config.status $(srcdir)/appindicator-0.1.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ -appindicator3-0.1.pc: $(top_builddir)/config.status $(srcdir)/appindicator3-0.1.pc.in - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-applicationlibLTLIBRARIES: $(applicationlib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(applicationlibdir)" || $(MKDIR_P) "$(DESTDIR)$(applicationlibdir)" @@ -616,41 +440,6 @@ clean-applicationlibLTLIBRARIES: echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ - } - -uninstall-libLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ - done - -clean-libLTLIBRARIES: - -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libappindicator.la: $(libappindicator_la_OBJECTS) $(libappindicator_la_DEPENDENCIES) - $(AM_V_CCLD)$(libappindicator_la_LINK) $(am_libappindicator_la_rpath) $(libappindicator_la_OBJECTS) $(libappindicator_la_LIBADD) $(LIBS) -libappindicator3.la: $(libappindicator3_la_OBJECTS) $(libappindicator3_la_DEPENDENCIES) - $(AM_V_CCLD)$(libappindicator3_la_LINK) $(am_libappindicator3_la_rpath) $(libappindicator3_la_OBJECTS) $(libappindicator3_la_LIBADD) $(LIBS) libapplication.la: $(libapplication_la_OBJECTS) $(libapplication_la_DEPENDENCIES) $(AM_V_CCLD)$(libapplication_la_LINK) -rpath $(applicationlibdir) $(libapplication_la_OBJECTS) $(libapplication_la_LIBADD) $(LIBS) install-libexecPROGRAMS: $(libexec_PROGRAMS) @@ -711,15 +500,8 @@ 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)/libappindicator3_la-app-indicator-enum-types.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator3_la-app-indicator.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator3_la-application-service-marshal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator3_la-generate-id.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator_la-app-indicator-enum-types.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator_la-app-indicator.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator_la-application-service-marshal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator_la-generate-id.Plo@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@ @@ -747,70 +529,6 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -libappindicator_la-app-indicator-enum-types.lo: app-indicator-enum-types.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator_la_CFLAGS) $(CFLAGS) -MT libappindicator_la-app-indicator-enum-types.lo -MD -MP -MF $(DEPDIR)/libappindicator_la-app-indicator-enum-types.Tpo -c -o libappindicator_la-app-indicator-enum-types.lo `test -f 'app-indicator-enum-types.c' || echo '$(srcdir)/'`app-indicator-enum-types.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator_la-app-indicator-enum-types.Tpo $(DEPDIR)/libappindicator_la-app-indicator-enum-types.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='app-indicator-enum-types.c' object='libappindicator_la-app-indicator-enum-types.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator_la_CFLAGS) $(CFLAGS) -c -o libappindicator_la-app-indicator-enum-types.lo `test -f 'app-indicator-enum-types.c' || echo '$(srcdir)/'`app-indicator-enum-types.c - -libappindicator_la-app-indicator.lo: app-indicator.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator_la_CFLAGS) $(CFLAGS) -MT libappindicator_la-app-indicator.lo -MD -MP -MF $(DEPDIR)/libappindicator_la-app-indicator.Tpo -c -o libappindicator_la-app-indicator.lo `test -f 'app-indicator.c' || echo '$(srcdir)/'`app-indicator.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator_la-app-indicator.Tpo $(DEPDIR)/libappindicator_la-app-indicator.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='app-indicator.c' object='libappindicator_la-app-indicator.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator_la_CFLAGS) $(CFLAGS) -c -o libappindicator_la-app-indicator.lo `test -f 'app-indicator.c' || echo '$(srcdir)/'`app-indicator.c - -libappindicator_la-application-service-marshal.lo: application-service-marshal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator_la_CFLAGS) $(CFLAGS) -MT libappindicator_la-application-service-marshal.lo -MD -MP -MF $(DEPDIR)/libappindicator_la-application-service-marshal.Tpo -c -o libappindicator_la-application-service-marshal.lo `test -f 'application-service-marshal.c' || echo '$(srcdir)/'`application-service-marshal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator_la-application-service-marshal.Tpo $(DEPDIR)/libappindicator_la-application-service-marshal.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-marshal.c' object='libappindicator_la-application-service-marshal.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator_la_CFLAGS) $(CFLAGS) -c -o libappindicator_la-application-service-marshal.lo `test -f 'application-service-marshal.c' || echo '$(srcdir)/'`application-service-marshal.c - -libappindicator_la-generate-id.lo: generate-id.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator_la_CFLAGS) $(CFLAGS) -MT libappindicator_la-generate-id.lo -MD -MP -MF $(DEPDIR)/libappindicator_la-generate-id.Tpo -c -o libappindicator_la-generate-id.lo `test -f 'generate-id.c' || echo '$(srcdir)/'`generate-id.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator_la-generate-id.Tpo $(DEPDIR)/libappindicator_la-generate-id.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generate-id.c' object='libappindicator_la-generate-id.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator_la_CFLAGS) $(CFLAGS) -c -o libappindicator_la-generate-id.lo `test -f 'generate-id.c' || echo '$(srcdir)/'`generate-id.c - -libappindicator3_la-app-indicator-enum-types.lo: app-indicator-enum-types.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator3_la_CFLAGS) $(CFLAGS) -MT libappindicator3_la-app-indicator-enum-types.lo -MD -MP -MF $(DEPDIR)/libappindicator3_la-app-indicator-enum-types.Tpo -c -o libappindicator3_la-app-indicator-enum-types.lo `test -f 'app-indicator-enum-types.c' || echo '$(srcdir)/'`app-indicator-enum-types.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator3_la-app-indicator-enum-types.Tpo $(DEPDIR)/libappindicator3_la-app-indicator-enum-types.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='app-indicator-enum-types.c' object='libappindicator3_la-app-indicator-enum-types.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator3_la_CFLAGS) $(CFLAGS) -c -o libappindicator3_la-app-indicator-enum-types.lo `test -f 'app-indicator-enum-types.c' || echo '$(srcdir)/'`app-indicator-enum-types.c - -libappindicator3_la-app-indicator.lo: app-indicator.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator3_la_CFLAGS) $(CFLAGS) -MT libappindicator3_la-app-indicator.lo -MD -MP -MF $(DEPDIR)/libappindicator3_la-app-indicator.Tpo -c -o libappindicator3_la-app-indicator.lo `test -f 'app-indicator.c' || echo '$(srcdir)/'`app-indicator.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator3_la-app-indicator.Tpo $(DEPDIR)/libappindicator3_la-app-indicator.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='app-indicator.c' object='libappindicator3_la-app-indicator.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator3_la_CFLAGS) $(CFLAGS) -c -o libappindicator3_la-app-indicator.lo `test -f 'app-indicator.c' || echo '$(srcdir)/'`app-indicator.c - -libappindicator3_la-application-service-marshal.lo: application-service-marshal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator3_la_CFLAGS) $(CFLAGS) -MT libappindicator3_la-application-service-marshal.lo -MD -MP -MF $(DEPDIR)/libappindicator3_la-application-service-marshal.Tpo -c -o libappindicator3_la-application-service-marshal.lo `test -f 'application-service-marshal.c' || echo '$(srcdir)/'`application-service-marshal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator3_la-application-service-marshal.Tpo $(DEPDIR)/libappindicator3_la-application-service-marshal.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-marshal.c' object='libappindicator3_la-application-service-marshal.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator3_la_CFLAGS) $(CFLAGS) -c -o libappindicator3_la-application-service-marshal.lo `test -f 'application-service-marshal.c' || echo '$(srcdir)/'`application-service-marshal.c - -libappindicator3_la-generate-id.lo: generate-id.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator3_la_CFLAGS) $(CFLAGS) -MT libappindicator3_la-generate-id.lo -MD -MP -MF $(DEPDIR)/libappindicator3_la-generate-id.Tpo -c -o libappindicator3_la-generate-id.lo `test -f 'generate-id.c' || echo '$(srcdir)/'`generate-id.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator3_la-generate-id.Tpo $(DEPDIR)/libappindicator3_la-generate-id.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generate-id.c' object='libappindicator3_la-generate-id.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libappindicator3_la_CFLAGS) $(CFLAGS) -c -o libappindicator3_la-generate-id.lo `test -f 'generate-id.c' || echo '$(srcdir)/'`generate-id.c - libapplication_la-application-service-marshal.lo: application-service-marshal.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libapplication_la_CFLAGS) $(CFLAGS) -MT libapplication_la-application-service-marshal.lo -MD -MP -MF $(DEPDIR)/libapplication_la-application-service-marshal.Tpo -c -o libapplication_la-application-service-marshal.lo `test -f 'application-service-marshal.c' || echo '$(srcdir)/'`application-service-marshal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libapplication_la-application-service-marshal.Tpo $(DEPDIR)/libapplication_la-application-service-marshal.Plo @@ -891,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 @@ -928,126 +662,6 @@ mostlyclean-libtool: clean-libtool: -rm -rf .libs _libs -install-girDATA: $(gir_DATA) - @$(NORMAL_INSTALL) - test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)" - @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \ - done - -uninstall-girDATA: - @$(NORMAL_UNINSTALL) - @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(girdir)" && rm -f $$files -install-pkgconfigDATA: $(pkgconfig_DATA) - @$(NORMAL_INSTALL) - test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ - done - -uninstall-pkgconfigDATA: - @$(NORMAL_UNINSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files -install-typelibDATA: $(typelib_DATA) - @$(NORMAL_INSTALL) - test -z "$(typelibdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibdir)" - @list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibdir)" || exit $$?; \ - done - -uninstall-typelibDATA: - @$(NORMAL_UNINSTALL) - @list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(typelibdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(typelibdir)" && rm -f $$files -install-vapiDATA: $(vapi_DATA) - @$(NORMAL_INSTALL) - test -z "$(vapidir)" || $(MKDIR_P) "$(DESTDIR)$(vapidir)" - @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(vapidir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(vapidir)" || exit $$?; \ - done - -uninstall-vapiDATA: - @$(NORMAL_UNINSTALL) - @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(vapidir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(vapidir)" && rm -f $$files -install-libappindicator3includeHEADERS: $(libappindicator3include_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(libappindicator3includedir)" || $(MKDIR_P) "$(DESTDIR)$(libappindicator3includedir)" - @list='$(libappindicator3include_HEADERS)'; test -n "$(libappindicator3includedir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libappindicator3includedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(libappindicator3includedir)" || exit $$?; \ - done - -uninstall-libappindicator3includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(libappindicator3include_HEADERS)'; test -n "$(libappindicator3includedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(libappindicator3includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(libappindicator3includedir)" && rm -f $$files -install-libappindicatorincludeHEADERS: $(libappindicatorinclude_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(libappindicatorincludedir)" || $(MKDIR_P) "$(DESTDIR)$(libappindicatorincludedir)" - @list='$(libappindicatorinclude_HEADERS)'; test -n "$(libappindicatorincludedir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libappindicatorincludedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(libappindicatorincludedir)" || exit $$?; \ - done - -uninstall-libappindicatorincludeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(libappindicatorinclude_HEADERS)'; test -n "$(libappindicatorincludedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(libappindicatorincludedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(libappindicatorincludedir)" && rm -f $$files ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ @@ -1134,9 +748,9 @@ distdir: $(DISTFILES) check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) installdirs: - for dir in "$(DESTDIR)$(applicationlibdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(vapidir)" "$(DESTDIR)$(libappindicator3includedir)" "$(DESTDIR)$(libappindicatorincludedir)"; do \ + for dir in "$(DESTDIR)$(applicationlibdir)" "$(DESTDIR)$(libexecdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) @@ -1171,8 +785,7 @@ maintainer-clean-generic: clean: clean-am clean-am: clean-applicationlibLTLIBRARIES clean-generic \ - clean-libLTLIBRARIES clean-libexecPROGRAMS clean-libtool \ - mostlyclean-am + clean-libexecPROGRAMS clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) @@ -1192,16 +805,13 @@ info: info-am info-am: -install-data-am: install-applicationlibLTLIBRARIES install-girDATA \ - install-libappindicator3includeHEADERS \ - install-libappindicatorincludeHEADERS install-pkgconfigDATA \ - install-typelibDATA install-vapiDATA +install-data-am: install-applicationlibLTLIBRARIES install-dvi: install-dvi-am install-dvi-am: -install-exec-am: install-libLTLIBRARIES install-libexecPROGRAMS +install-exec-am: install-libexecPROGRAMS install-html: install-html-am @@ -1241,39 +851,27 @@ ps: ps-am ps-am: -uninstall-am: uninstall-applicationlibLTLIBRARIES uninstall-girDATA \ - uninstall-libLTLIBRARIES \ - uninstall-libappindicator3includeHEADERS \ - uninstall-libappindicatorincludeHEADERS \ - uninstall-libexecPROGRAMS uninstall-pkgconfigDATA \ - uninstall-typelibDATA uninstall-vapiDATA +uninstall-am: uninstall-applicationlibLTLIBRARIES \ + uninstall-libexecPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean \ clean-applicationlibLTLIBRARIES clean-generic \ - clean-libLTLIBRARIES clean-libexecPROGRAMS clean-libtool ctags \ - distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am \ - install-applicationlibLTLIBRARIES install-data install-data-am \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-girDATA install-html install-html-am install-info \ - install-info-am install-libLTLIBRARIES \ - install-libappindicator3includeHEADERS \ - install-libappindicatorincludeHEADERS install-libexecPROGRAMS \ - install-man install-pdf install-pdf-am install-pkgconfigDATA \ - install-ps install-ps-am install-strip install-typelibDATA \ - install-vapiDATA installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags uninstall uninstall-am \ - uninstall-applicationlibLTLIBRARIES uninstall-girDATA \ - uninstall-libLTLIBRARIES \ - uninstall-libappindicator3includeHEADERS \ - uninstall-libappindicatorincludeHEADERS \ - uninstall-libexecPROGRAMS uninstall-pkgconfigDATA \ - uninstall-typelibDATA uninstall-vapiDATA + clean-libexecPROGRAMS clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-applicationlibLTLIBRARIES \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libexecPROGRAMS \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-applicationlibLTLIBRARIES \ + uninstall-libexecPROGRAMS stamp-enum-types: $(glib_enum_headers) @@ -1331,19 +929,15 @@ $(marshal_c): $(marshal_h) --output=$@ \ $< -######################### -# GObject Introsepction -######################### - --include $(INTROSPECTION_MAKEFILE) - -@HAVE_INTROSPECTION_TRUE@AppIndicator$(VER)-0.1.gir: libappindicator$(VER).la +gen-%.xml.c: %.xml + @echo "Building $@ from $<" + @echo "const char * _$(notdir $(subst -,_,$(subst .,_,$(basename $<)))) = " > $@ + @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@ + @echo ";" >> $@ -@HAVE_INTROSPECTION_TRUE@AppIndicator$(VER)-0.1.vapi: AppIndicator$(VER)-0.1.gir Makefile.am -@HAVE_INTROSPECTION_TRUE@ $(VALA_API_GEN) --library=AppIndicator$(VER)-0.1 \ -@HAVE_INTROSPECTION_TRUE@ --pkg $(GTKVAPI) \ -@HAVE_INTROSPECTION_TRUE@ --vapidir=$(top_builddir)/src \ -@HAVE_INTROSPECTION_TRUE@ $< +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. 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/app-indicator.c b/src/app-indicator.c deleted file mode 100644 index 98663c1..0000000 --- a/src/app-indicator.c +++ /dev/null @@ -1,2118 +0,0 @@ -/* -An object to represent the application as an application indicator -in the system panel. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould <ted@canonical.com> - Cody Russell <cody.russell@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/> -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-bindings.h> - -#include <libdbusmenu-glib/server.h> -#ifdef HAVE_GTK3 -#include <libdbusmenu-gtk3/client.h> -#else -#include <libdbusmenu-gtk/client.h> -#endif - -#include "app-indicator.h" -#include "app-indicator-enum-types.h" -#include "application-service-marshal.h" - -#include "notification-item-server.h" -#include "notification-watcher-client.h" - -#include "dbus-shared.h" -#include "generate-id.h" - -#define PANEL_ICON_SUFFIX "panel" - -/** - AppIndicatorPrivate: - - All of the private data in an instance of a - application indicator. -*/ -/* Private Fields - @id: The ID of the indicator. Maps to AppIndicator:id. - @category: Which category the indicator is. Maps to AppIndicator:category. - @status: The status of the indicator. Maps to AppIndicator:status. - @icon_name: The name of the icon to use. Maps to AppIndicator:icon-name. - @attention_icon_name: The name of the attention icon to use. Maps to AppIndicator:attention-icon-name. - @menu: The menu for this indicator. Maps to AppIndicator:menu - @watcher_proxy: The proxy connection to the watcher we're connected to. If we're not connected to one this will be %NULL. -*/ -struct _AppIndicatorPrivate { - /*< Private >*/ - /* Properties */ - gchar *id; - gchar *clean_id; - AppIndicatorCategory category; - AppIndicatorStatus status; - gchar *icon_name; - gchar *attention_icon_name; - gchar *icon_theme_path; - DbusmenuServer *menuservice; - GtkWidget *menu; - guint32 ordering_index; - gchar * label; - gchar * label_guide; - guint label_change_idle; - - GtkStatusIcon * status_icon; - gint fallback_timer; - - /* Fun stuff */ - DBusGProxy *watcher_proxy; - DBusGConnection *connection; - DBusGProxy * dbus_proxy; -}; - -/* Signals Stuff */ -enum { - NEW_ICON, - NEW_ATTENTION_ICON, - NEW_STATUS, - NEW_LABEL, - X_NEW_LABEL, - CONNECTION_CHANGED, - NEW_ICON_THEME_PATH, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/* Enum for the properties so that they can be quickly - found and looked up. */ -enum { - PROP_0, - PROP_ID, - PROP_CATEGORY, - PROP_STATUS, - PROP_ICON_NAME, - PROP_ATTENTION_ICON_NAME, - PROP_ICON_THEME_PATH, - PROP_MENU, - PROP_CONNECTED, - PROP_LABEL, - PROP_LABEL_GUIDE, - PROP_X_LABEL, - PROP_X_LABEL_GUIDE, - PROP_ORDERING_INDEX, - PROP_X_ORDERING_INDEX -}; - -/* The strings so that they can be slowly looked up. */ -#define PROP_ID_S "id" -#define PROP_CATEGORY_S "category" -#define PROP_STATUS_S "status" -#define PROP_ICON_NAME_S "icon-name" -#define PROP_ATTENTION_ICON_NAME_S "attention-icon-name" -#define PROP_ICON_THEME_PATH_S "icon-theme-path" -#define PROP_MENU_S "menu" -#define PROP_CONNECTED_S "connected" -#define PROP_LABEL_S "label" -#define PROP_LABEL_GUIDE_S "label-guide" -#define PROP_X_LABEL_S ("x-ayatana-" PROP_LABEL_S) -#define PROP_X_LABEL_GUIDE_S ("x-ayatana-" PROP_LABEL_GUIDE_S) -#define PROP_ORDERING_INDEX_S "ordering-index" -#define PROP_X_ORDERING_INDEX_S ("x-ayatana-" PROP_ORDERING_INDEX_S) - -/* Private macro, shhhh! */ -#define APP_INDICATOR_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), APP_INDICATOR_TYPE, AppIndicatorPrivate)) - -/* Signal wrapper */ -#define APP_INDICATOR_SIGNAL_X_NEW_LABEL ("x-ayatana-" APP_INDICATOR_SIGNAL_NEW_LABEL) - -/* Default Path */ -#define DEFAULT_ITEM_PATH "/org/ayatana/NotificationItem" - -/* More constants */ -#define DEFAULT_FALLBACK_TIMER 100 /* in milliseconds */ - -/* Boiler plate */ -static void app_indicator_class_init (AppIndicatorClass *klass); -static void app_indicator_init (AppIndicator *self); -static void app_indicator_dispose (GObject *object); -static void app_indicator_finalize (GObject *object); -/* Property functions */ -static void app_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -/* Other stuff */ -static void signal_label_change (AppIndicator * self); -static void check_connect (AppIndicator * self); -static void register_service_cb (DBusGProxy * proxy, GError * error, gpointer data); -static void start_fallback_timer (AppIndicator * self, gboolean disable_timeout); -static gboolean fallback_timer_expire (gpointer data); -static GtkStatusIcon * fallback (AppIndicator * self); -static void status_icon_status_wrapper (AppIndicator * self, const gchar * status, gpointer data); -static void status_icon_changes (AppIndicator * self, gpointer data); -static void status_icon_activate (GtkStatusIcon * icon, gpointer data); -static void unfallback (AppIndicator * self, GtkStatusIcon * status_icon); -static gchar * append_panel_icon_suffix (const gchar * icon_name); -static void watcher_proxy_destroyed (GObject * object, gpointer data); -static void client_menu_changed (GtkWidget *widget, GtkWidget *child, AppIndicator *indicator); -static void submenu_changed (GtkWidget *widget, GtkWidget *child, gpointer data); - -static void theme_changed_cb (GtkIconTheme * theme, gpointer user_data); - -/* GObject type */ -G_DEFINE_TYPE (AppIndicator, app_indicator, G_TYPE_OBJECT); - -static void -app_indicator_class_init (AppIndicatorClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (AppIndicatorPrivate)); - - /* Clean up */ - object_class->dispose = app_indicator_dispose; - object_class->finalize = app_indicator_finalize; - - /* Property funcs */ - object_class->set_property = app_indicator_set_property; - object_class->get_property = app_indicator_get_property; - - /* Our own funcs */ - klass->fallback = fallback; - klass->unfallback = unfallback; - - /* Properties */ - - /** - AppIndicator:id: - - The ID for this indicator, which should be unique, but used consistently - by this program and its indicator. - */ - g_object_class_install_property (object_class, - PROP_ID, - g_param_spec_string(PROP_ID_S, - "The ID for this indicator", - "An ID that should be unique, but used consistently by this program and its indicator.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); - - /** - AppIndicator:category: - - The type of indicator that this represents. Please don't use 'Other'. - Defaults to 'ApplicationStatus'. - */ - g_object_class_install_property (object_class, - PROP_CATEGORY, - g_param_spec_string (PROP_CATEGORY_S, - "Indicator Category", - "The type of indicator that this represents. Please don't use 'other'. Defaults to 'ApplicationStatus'.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); - - /** - AppIndicator:status: - - Whether the indicator is shown or requests attention. Defaults to - 'Passive'. - */ - g_object_class_install_property (object_class, - PROP_STATUS, - g_param_spec_string (PROP_STATUS_S, - "Indicator Status", - "Whether the indicator is shown or requests attention. Defaults to 'Passive'.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - AppIndicator:icon-name: - - The name of the regular icon that is shown for the indicator. - */ - g_object_class_install_property(object_class, - PROP_ICON_NAME, - g_param_spec_string (PROP_ICON_NAME_S, - "An icon for the indicator", - "The default icon that is shown for the indicator.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT)); - - /** - AppIndicator:attention-icon-name: - - If the indicator sets it's status to %APP_INDICATOR_STATUS_ATTENTION - then this icon is shown. - */ - g_object_class_install_property (object_class, - PROP_ATTENTION_ICON_NAME, - g_param_spec_string (PROP_ATTENTION_ICON_NAME_S, - "An icon to show when the indicator request attention.", - "If the indicator sets it's status to 'attention' then this icon is shown.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - /** - AppIndicator:icon-theme-path: - - An additional place to look for icon names that may be installed by the - application. - */ - g_object_class_install_property(object_class, - PROP_ICON_THEME_PATH, - g_param_spec_string (PROP_ICON_THEME_PATH_S, - "An additional path for custom icons.", - "An additional place to look for icon names that may be installed by the application.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT)); - - /** - AppIndicator:menu: - - A method for getting the menu path as a string for DBus. - */ - g_object_class_install_property(object_class, - PROP_MENU, - g_param_spec_boxed (PROP_MENU_S, - "The object path of the menu on DBus.", - "A method for getting the menu path as a string for DBus.", - DBUS_TYPE_G_OBJECT_PATH, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - /** - AppIndicator:connected: - - Pretty simple, %TRUE if we have a reasonable expectation of being - displayed through this object. You should hide your TrayIcon if so. - */ - g_object_class_install_property (object_class, - PROP_CONNECTED, - g_param_spec_boolean (PROP_CONNECTED_S, - "Whether we're conneced to a watcher", - "Pretty simple, true if we have a reasonable expectation of being displayed through this object. You should hide your TrayIcon if so.", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - /** - AppIndicator:label: - - A label that can be shown next to the string in the application - indicator. The label will not be shown unless there is an icon - as well. The label is useful for numerical and other frequently - updated information. In general, it shouldn't be shown unless a - user requests it as it can take up a significant amount of space - on the user's panel. This may not be shown in all visualizations. - */ - g_object_class_install_property(object_class, - PROP_LABEL, - g_param_spec_string (PROP_LABEL_S, - "A label next to the icon", - "A label to provide dynamic information.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - /** - AppIndicator:label-guide: - - An optional string to provide guidance to the panel on how big - the #AppIndicator:label string could get. If this is set correctly - then the panel should never 'jiggle' as the string adjusts through - out the range of options. For instance, if you were providing a - percentage like "54% thrust" in #AppIndicator:label you'd want to - set this string to "100% thrust" to ensure space when Scotty can - get you enough power. - */ - g_object_class_install_property(object_class, - PROP_LABEL_GUIDE, - g_param_spec_string (PROP_LABEL_GUIDE_S, - "A string to size the space available for the label.", - "To ensure that the label does not cause the panel to 'jiggle' this string should provide information on how much space it could take.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - /** - AppIndicator:ordering-index: - - The ordering index is an odd parameter, and if you think you don't need - it you're probably right. In general, the application indicator try - to place the applications in a recreatable place taking into account - which category they're in to try and group them. But, there are some - cases where you'd want to ensure indicators are next to each other. - To do that you can override the generated ordering index and replace it - with a new one. Again, you probably don't want to be doing this, but - in case you do, this is the way. - */ - g_object_class_install_property(object_class, - PROP_ORDERING_INDEX, - g_param_spec_uint (PROP_ORDERING_INDEX_S, - "The location that this app indicator should be in the list.", - "A way to override the default ordering of the applications by providing a very specific idea of where this entry should be placed.", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - /** - AppIndicator:x-ayatana-ordering-index: - - A wrapper for #AppIndicator:ordering-index so that it can match the - dbus interface currently. It will hopefully be retired, please don't - use it anywhere. - */ - g_object_class_install_property(object_class, - PROP_X_ORDERING_INDEX, - g_param_spec_uint (PROP_X_ORDERING_INDEX_S, - "A wrapper, please don't use.", - "A wrapper, please don't use.", - 0, G_MAXUINT32, 0, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - AppIndicator:x-ayatana-label: - - Wrapper for #AppIndicator:label. Please use that in all of your - code. - */ - g_object_class_install_property(object_class, - PROP_X_LABEL, - g_param_spec_string (PROP_X_LABEL_S, - "A wrapper, please don't use.", - "A wrapper, please don't use.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - /** - AppIndicator:x-ayatana-label-guide: - - Wrapper for #AppIndicator:label-guide. Please use that in all of your - code. - */ - g_object_class_install_property(object_class, - PROP_X_LABEL_GUIDE, - g_param_spec_string (PROP_X_LABEL_GUIDE_S, - "A wrapper, please don't use.", - "A wrapper, please don't use.", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /* Signals */ - - /** - AppIndicator::new-icon: - @arg0: The #AppIndicator object - - Emitted when #AppIndicator:icon-name is changed - */ - signals[NEW_ICON] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ICON, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (AppIndicatorClass, new_icon), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - AppIndicator::new-attention-icon: - @arg0: The #AppIndicator object - - Emitted when #AppIndicator:attention-icon-name is changed - */ - signals[NEW_ATTENTION_ICON] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (AppIndicatorClass, new_attention_icon), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - /** - AppIndicator::new-status: - @arg0: The #AppIndicator object - @arg1: The string value of the #AppIndicatorStatus enum. - - Emitted when #AppIndicator:status is changed - */ - signals[NEW_STATUS] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_STATUS, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (AppIndicatorClass, new_status), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - /** - AppIndicator::new-label: - @arg0: The #AppIndicator object - @arg1: The string for the label - @arg1: The string for the guide - - Emitted when either #AppIndicator:label or #AppIndicator:label-guide are - changed. - */ - signals[NEW_LABEL] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_LABEL, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (AppIndicatorClass, new_label), - NULL, NULL, - _application_service_marshal_VOID__STRING_STRING, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); - - /** - AppIndicator::x-ayatana-new-label: - @arg0: The #AppIndicator object - @arg1: The string for the label - @arg1: The string for the guide - - Wrapper for #AppIndicator::new-label, please don't use this signal - use the other one. - */ - signals[X_NEW_LABEL] = g_signal_new (APP_INDICATOR_SIGNAL_X_NEW_LABEL, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (AppIndicatorClass, new_label), - NULL, NULL, - _application_service_marshal_VOID__STRING_STRING, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); - - /** - AppIndicator::connection-changed: - @arg0: The #AppIndicator object - @arg1: Whether we're connected or not - - Signaled when we connect to a watcher, or when it drops away. - */ - signals[CONNECTION_CHANGED] = g_signal_new (APP_INDICATOR_SIGNAL_CONNECTION_CHANGED, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (AppIndicatorClass, connection_changed), - NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, - G_TYPE_NONE, 1, G_TYPE_BOOLEAN, G_TYPE_NONE); - - /** - AppIndicator::new-icon-theme-path: - @arg0: The #AppIndicator object - - Signaled when there is a new icon set for the - object. - */ - signals[NEW_ICON_THEME_PATH] = g_signal_new (APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH, - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (AppIndicatorClass, new_icon_theme_path), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); - - /* Initialize the object as a DBus type */ - dbus_g_object_type_install_info(APP_INDICATOR_TYPE, - &dbus_glib__notification_item_server_object_info); - - return; -} - -static void -app_indicator_init (AppIndicator *self) -{ - AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(self); - - priv->id = NULL; - priv->clean_id = NULL; - priv->category = APP_INDICATOR_CATEGORY_OTHER; - priv->status = APP_INDICATOR_STATUS_PASSIVE; - priv->icon_name = NULL; - priv->attention_icon_name = NULL; - priv->icon_theme_path = NULL; - priv->menu = NULL; - priv->menuservice = NULL; - priv->ordering_index = 0; - priv->label = NULL; - priv->label_guide = NULL; - priv->label_change_idle = 0; - - priv->watcher_proxy = NULL; - priv->connection = NULL; - priv->dbus_proxy = NULL; - - priv->status_icon = NULL; - priv->fallback_timer = 0; - - /* Put the object on DBus */ - GError * error = NULL; - priv->connection = dbus_g_bus_get(DBUS_BUS_SESSION, &error); - if (error != NULL) { - g_error("Unable to connect to the session bus when creating application indicator: %s", error->message); - g_error_free(error); - return; - } - dbus_g_connection_ref(priv->connection); - - g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), - "changed", G_CALLBACK(theme_changed_cb), self); - - self->priv = priv; - - return; -} - -/* Free all objects, make sure that all the dbus - signals are sent out before we shut this down. */ -static void -app_indicator_dispose (GObject *object) -{ - AppIndicator *self = APP_INDICATOR (object); - AppIndicatorPrivate *priv = self->priv; - - if (priv->status != APP_INDICATOR_STATUS_PASSIVE) { - app_indicator_set_status(self, APP_INDICATOR_STATUS_PASSIVE); - } - - if (priv->status_icon != NULL) { - AppIndicatorClass * class = APP_INDICATOR_GET_CLASS(object); - if (class->unfallback != NULL) { - class->unfallback(self, priv->status_icon); - } - priv->status_icon = NULL; - } - - if (priv->fallback_timer != 0) { - g_source_remove(priv->fallback_timer); - priv->fallback_timer = 0; - } - - if (priv->label_change_idle != 0) { - g_source_remove(priv->label_change_idle); - priv->label_change_idle = 0; - } - - if (priv->menu != NULL) { - g_signal_handlers_disconnect_by_func (G_OBJECT (priv->menu), - client_menu_changed, - self); - g_object_unref(G_OBJECT(priv->menu)); - priv->menu = NULL; - } - - if (priv->menuservice != NULL) { - g_object_unref (priv->menuservice); - } - - if (priv->dbus_proxy != NULL) { - g_object_unref(G_OBJECT(priv->dbus_proxy)); - priv->dbus_proxy = NULL; - } - - if (priv->watcher_proxy != NULL) { - dbus_g_connection_flush(priv->connection); - g_signal_handlers_disconnect_by_func(G_OBJECT(priv->watcher_proxy), watcher_proxy_destroyed, self); - g_object_unref(G_OBJECT(priv->watcher_proxy)); - priv->watcher_proxy = NULL; - - /* Emit the AppIndicator::connection-changed signal*/ - g_signal_emit (self, signals[CONNECTION_CHANGED], 0, FALSE); - } - - if (priv->connection != NULL) { - dbus_g_connection_unref(priv->connection); - priv->connection = NULL; - } - - G_OBJECT_CLASS (app_indicator_parent_class)->dispose (object); - return; -} - -/* Free all of the memory that we could be using in - the object. */ -static void -app_indicator_finalize (GObject *object) -{ - AppIndicator * self = APP_INDICATOR(object); - AppIndicatorPrivate *priv = self->priv; - - if (priv->status != APP_INDICATOR_STATUS_PASSIVE) { - g_warning("Finalizing Application Status with the status set to: %d", priv->status); - } - - if (priv->id != NULL) { - g_free(priv->id); - priv->id = NULL; - } - - if (priv->clean_id != NULL) { - g_free(priv->clean_id); - priv->clean_id = NULL; - } - - if (priv->icon_name != NULL) { - g_free(priv->icon_name); - priv->icon_name = NULL; - } - - if (priv->attention_icon_name != NULL) { - g_free(priv->attention_icon_name); - priv->attention_icon_name = NULL; - } - - if (priv->icon_theme_path != NULL) { - g_free(priv->icon_theme_path); - priv->icon_theme_path = NULL; - } - - if (priv->label != NULL) { - g_free(priv->label); - priv->label = NULL; - } - - if (priv->label_guide != NULL) { - g_free(priv->label_guide); - priv->label_guide = NULL; - } - - G_OBJECT_CLASS (app_indicator_parent_class)->finalize (object); - return; -} - -#define WARN_BAD_TYPE(prop, value) g_warning("Can not work with property '%s' with value of type '%s'.", prop, G_VALUE_TYPE_NAME(value)) - -/* Set some properties */ -static void -app_indicator_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) -{ - AppIndicator *self = APP_INDICATOR (object); - AppIndicatorPrivate *priv = self->priv; - GEnumValue *enum_val; - - switch (prop_id) { - case PROP_ID: - if (priv->id != NULL) { - g_warning ("Resetting ID value when I already had a value of: %s", priv->id); - break; - } - - priv->id = g_strdup (g_value_get_string (value)); - - priv->clean_id = g_strdup(priv->id); - gchar * cleaner; - for (cleaner = priv->clean_id; *cleaner != '\0'; cleaner++) { - if (!g_ascii_isalnum(*cleaner)) { - *cleaner = '_'; - } - } - - check_connect (self); - break; - - case PROP_CATEGORY: - enum_val = g_enum_get_value_by_nick ((GEnumClass *) g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_CATEGORY), - g_value_get_string (value)); - - if (priv->category != enum_val->value) - { - priv->category = enum_val->value; - } - - break; - - case PROP_STATUS: - enum_val = g_enum_get_value_by_nick ((GEnumClass *) g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_STATUS), - g_value_get_string (value)); - - app_indicator_set_status (APP_INDICATOR (object), - enum_val->value); - break; - - case PROP_ICON_NAME: - app_indicator_set_icon (APP_INDICATOR (object), - g_value_get_string (value)); - check_connect (self); - break; - - case PROP_ATTENTION_ICON_NAME: - app_indicator_set_attention_icon (APP_INDICATOR (object), - g_value_get_string (value)); - break; - - case PROP_ICON_THEME_PATH: - app_indicator_set_icon_theme_path (APP_INDICATOR (object), - g_value_get_string (value)); - check_connect (self); - break; - - case PROP_X_LABEL: - case PROP_LABEL: { - gchar * oldlabel = priv->label; - priv->label = g_value_dup_string(value); - - if (g_strcmp0(oldlabel, priv->label) != 0) { - signal_label_change(APP_INDICATOR(object)); - } - - if (priv->label != NULL && priv->label[0] == '\0') { - g_free(priv->label); - priv->label = NULL; - } - - if (oldlabel != NULL) { - g_free(oldlabel); - } - break; - } - case PROP_X_LABEL_GUIDE: - case PROP_LABEL_GUIDE: { - gchar * oldguide = priv->label_guide; - priv->label_guide = g_value_dup_string(value); - - if (g_strcmp0(oldguide, priv->label_guide) != 0) { - signal_label_change(APP_INDICATOR(object)); - } - - if (priv->label_guide != NULL && priv->label_guide[0] == '\0') { - g_free(priv->label_guide); - priv->label_guide = NULL; - } - - if (oldguide != NULL) { - g_free(oldguide); - } - break; - } - case PROP_X_ORDERING_INDEX: - case PROP_ORDERING_INDEX: - priv->ordering_index = g_value_get_uint(value); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - return; -} - -/* Function to fill our value with the property it's requesting. */ -static void -app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) -{ - AppIndicator *self = APP_INDICATOR (object); - AppIndicatorPrivate *priv = self->priv; - GEnumValue *enum_value; - - switch (prop_id) { - case PROP_ID: - g_value_set_string (value, priv->id); - break; - - case PROP_CATEGORY: - enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_CATEGORY), priv->category); - g_value_set_string (value, enum_value->value_nick); - break; - - case PROP_STATUS: - enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_STATUS), priv->status); - g_value_set_string (value, enum_value->value_nick); - break; - - case PROP_ICON_NAME: - g_value_set_string (value, priv->icon_name); - break; - - case PROP_ATTENTION_ICON_NAME: - g_value_set_string (value, priv->attention_icon_name); - break; - - case PROP_ICON_THEME_PATH: - g_value_set_string (value, priv->icon_theme_path); - break; - - case PROP_MENU: - if (priv->menuservice != NULL) { - GValue strval = { 0 }; - g_value_init(&strval, G_TYPE_STRING); - g_object_get_property (G_OBJECT (priv->menuservice), DBUSMENU_SERVER_PROP_DBUS_OBJECT, &strval); - g_value_set_boxed(value, g_value_get_string(&strval)); - g_value_unset(&strval); - } - break; - - case PROP_CONNECTED: - g_value_set_boolean (value, priv->watcher_proxy != NULL ? TRUE : FALSE); - break; - - case PROP_X_LABEL: - case PROP_LABEL: - g_value_set_string (value, priv->label); - break; - - case PROP_X_LABEL_GUIDE: - case PROP_LABEL_GUIDE: - g_value_set_string (value, priv->label_guide); - break; - - case PROP_X_ORDERING_INDEX: - case PROP_ORDERING_INDEX: - g_value_set_uint(value, priv->ordering_index); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - return; -} - -/* Sends the label changed signal and resets the source ID */ -static gboolean -signal_label_change_idle (gpointer user_data) -{ - AppIndicator * self = (AppIndicator *)user_data; - AppIndicatorPrivate *priv = self->priv; - - g_signal_emit(G_OBJECT(self), signals[NEW_LABEL], 0, - priv->label != NULL ? priv->label : "", - priv->label_guide != NULL ? priv->label_guide : "", - TRUE); - g_signal_emit(G_OBJECT(self), signals[X_NEW_LABEL], 0, - priv->label != NULL ? priv->label : "", - priv->label_guide != NULL ? priv->label_guide : "", - TRUE); - - priv->label_change_idle = 0; - - return FALSE; -} - -/* Sets up an idle function to send the label changed signal - so that we don't send it too many times. */ -static void -signal_label_change (AppIndicator * self) -{ - AppIndicatorPrivate *priv = self->priv; - - /* don't set it twice */ - if (priv->label_change_idle != 0) { - return; - } - - priv->label_change_idle = g_idle_add(signal_label_change_idle, self); - return; -} - -/* This function is used to see if we have enough information to - connect to things. If we do, and we're not connected, it - connects for us. */ -static void -check_connect (AppIndicator *self) -{ - AppIndicatorPrivate *priv = self->priv; - - /* We're alreadying connecting or trying to connect. */ - if (priv->watcher_proxy != NULL) return; - - /* Do we have enough information? */ - if (priv->menu == NULL) return; - if (priv->icon_name == NULL) return; - if (priv->id == NULL) return; - - gchar * path = g_strdup_printf(DEFAULT_ITEM_PATH "/%s", priv->clean_id); - - dbus_g_connection_register_g_object(priv->connection, - path, - G_OBJECT(self)); - - GError * error = NULL; - priv->watcher_proxy = dbus_g_proxy_new_for_name_owner(priv->connection, - NOTIFICATION_WATCHER_DBUS_ADDR, - NOTIFICATION_WATCHER_DBUS_OBJ, - NOTIFICATION_WATCHER_DBUS_IFACE, - &error); - if (error != NULL) { - /* Unable to get proxy, but we're handling that now so - it's not a warning anymore. */ - g_error_free(error); - dbus_g_connection_unregister_g_object(priv->connection, - G_OBJECT(self)); - start_fallback_timer(self, FALSE); - g_free(path); - return; - } - - g_signal_connect(G_OBJECT(priv->watcher_proxy), "destroy", G_CALLBACK(watcher_proxy_destroyed), self); - org_kde_StatusNotifierWatcher_register_status_notifier_item_async(priv->watcher_proxy, path, register_service_cb, self); - g_free(path); - - /* Emit the AppIndicator::connection-changed signal*/ - g_signal_emit (self, signals[CONNECTION_CHANGED], 0, TRUE); - - return; -} - -/* A function that gets called when the watcher dies. Like - dies dies. Not our friend anymore. */ -static void -watcher_proxy_destroyed (GObject * object, gpointer data) -{ - AppIndicator * self = APP_INDICATOR(data); - g_return_if_fail(self != NULL); - - dbus_g_connection_unregister_g_object(self->priv->connection, - G_OBJECT(self)); - self->priv->watcher_proxy = NULL; - - /* Emit the AppIndicator::connection-changed signal*/ - g_signal_emit (self, signals[CONNECTION_CHANGED], 0, FALSE); - - start_fallback_timer(self, FALSE); - return; -} - -/* Responce from the DBus command to register a service - with a NotificationWatcher. */ -static void -register_service_cb (DBusGProxy * proxy, GError * error, gpointer data) -{ - g_return_if_fail(IS_APP_INDICATOR(data)); - AppIndicatorPrivate * priv = APP_INDICATOR(data)->priv; - - if (error != NULL) { - /* They didn't respond, ewww. Not sure what they could - be doing */ - g_warning("Unable to connect to the Notification Watcher: %s", error->message); - dbus_g_connection_unregister_g_object(priv->connection, - G_OBJECT(data)); - g_object_unref(G_OBJECT(priv->watcher_proxy)); - priv->watcher_proxy = NULL; - start_fallback_timer(APP_INDICATOR(data), TRUE); - } - - if (priv->status_icon) { - AppIndicatorClass * class = APP_INDICATOR_GET_CLASS(data); - if (class->unfallback != NULL) { - class->unfallback(APP_INDICATOR(data), priv->status_icon); - priv->status_icon = NULL; - } - } - - return; -} - -/* A helper function to get the nick out of a given - category enum value. */ -static const gchar * -category_from_enum (AppIndicatorCategory category) -{ - GEnumValue *value; - - value = g_enum_get_value ((GEnumClass *)g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_CATEGORY), category); - return value->value_nick; -} - -/* Watching the dbus owner change events to see if someone - we care about pops up! */ -static void -dbus_owner_change (DBusGProxy * proxy, const gchar * name, const gchar * prev, const gchar * new, gpointer data) -{ - if (new == NULL || new[0] == '\0') { - /* We only care about folks coming on the bus. Exit quickly otherwise. */ - return; - } - - if (g_strcmp0(name, NOTIFICATION_WATCHER_DBUS_ADDR)) { - /* We only care about this address, reject all others. */ - return; - } - - /* Woot, there's a new notification watcher in town. */ - - AppIndicatorPrivate * priv = APP_INDICATOR_GET_PRIVATE(data); - - if (priv->fallback_timer != 0) { - /* Stop a timer */ - g_source_remove(priv->fallback_timer); - - /* Stop listening to bus events */ - g_object_unref(G_OBJECT(priv->dbus_proxy)); - priv->dbus_proxy = NULL; - } - - /* Let's start from the very beginning */ - check_connect(APP_INDICATOR(data)); - - return; -} - -/* Checking to see if someone already has the name we're looking for */ -static void -check_owner_cb (DBusGProxy *proxy, gboolean exists, GError *error, gpointer userdata) -{ - if (error != NULL) { - g_warning("Unable to check for '" NOTIFICATION_WATCHER_DBUS_ADDR "' on DBus. No worries, but concerning."); - return; - } - - if (exists) { - g_debug("Woah, we actually has a race condition with dbus"); - dbus_owner_change(proxy, NOTIFICATION_WATCHER_DBUS_ADDR, NULL, "Non NULL", userdata); - } - - return; -} - -/* This is an idle function to create the proxy. This is mostly - because start_fallback_timer can get called in the distruction - of a proxy and thus the proxy manager gets confused when creating - a new proxy as part of destroying an old one. This function being - on idle means that we'll just do it outside of the same stack where - the previous proxy is being destroyed. */ -static gboolean -setup_name_owner_proxy (gpointer data) -{ - g_return_val_if_fail(IS_APP_INDICATOR(data), FALSE); - AppIndicatorPrivate * priv = APP_INDICATOR(data)->priv; - - if (priv->dbus_proxy == NULL) { - priv->dbus_proxy = dbus_g_proxy_new_for_name(priv->connection, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS); - dbus_g_proxy_add_signal(priv->dbus_proxy, "NameOwnerChanged", - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal(priv->dbus_proxy, "NameOwnerChanged", - G_CALLBACK(dbus_owner_change), data, NULL); - - /* Check to see if anyone has the name we're looking for - just incase we missed it changing. */ - - org_freedesktop_DBus_name_has_owner_async(priv->dbus_proxy, NOTIFICATION_WATCHER_DBUS_ADDR, check_owner_cb, data); - } - - return FALSE; -} - -/* A function that will start the fallback timer if it's not - already started. It sets up the DBus watcher to see if - there is a change. Also, provides an override mode for cases - where it's unlikely that a timer will help anything. */ -static void -start_fallback_timer (AppIndicator * self, gboolean disable_timeout) -{ - g_return_if_fail(IS_APP_INDICATOR(self)); - AppIndicatorPrivate * priv = APP_INDICATOR(self)->priv; - - if (priv->fallback_timer != 0) { - /* The timer is set, let's just be happy with the one - we've already got running */ - return; - } - - if (priv->status_icon != NULL) { - /* We're already fallen back. Let's not do it again. */ - return; - } - - if (priv->dbus_proxy == NULL) { - /* NOTE: Read the comment on setup_name_owner_proxy */ - g_idle_add(setup_name_owner_proxy, self); - } - - if (disable_timeout) { - fallback_timer_expire(self); - } else { - priv->fallback_timer = g_timeout_add(DEFAULT_FALLBACK_TIMER, fallback_timer_expire, self); - } - - return; -} - -/* A function that gets executed when we want to change the - state of the fallback. */ -static gboolean -fallback_timer_expire (gpointer data) -{ - g_return_val_if_fail(IS_APP_INDICATOR(data), FALSE); - - AppIndicatorPrivate * priv = APP_INDICATOR(data)->priv; - AppIndicatorClass * class = APP_INDICATOR_GET_CLASS(data); - - if (priv->status_icon == NULL) { - if (class->fallback != NULL) { - priv->status_icon = class->fallback(APP_INDICATOR(data)); - } - } else { - if (class->unfallback != NULL) { - class->unfallback(APP_INDICATOR(data), priv->status_icon); - priv->status_icon = NULL; - } else { - g_warning("No 'unfallback' function but the 'fallback' function returned a non-NULL result."); - } - } - - priv->fallback_timer = 0; - return FALSE; -} - -/* emit a NEW_ICON signal in response for the theme change */ -static void -theme_changed_cb (GtkIconTheme * theme, gpointer user_data) -{ - g_signal_emit (user_data, signals[NEW_ICON], 0, TRUE); -} - -/* Creates a StatusIcon that can be used when the application - indicator area isn't available. */ -static GtkStatusIcon * -fallback (AppIndicator * self) -{ - GtkStatusIcon * icon = gtk_status_icon_new(); - - gtk_status_icon_set_title(icon, app_indicator_get_id(self)); - - g_signal_connect(G_OBJECT(self), APP_INDICATOR_SIGNAL_NEW_STATUS, - G_CALLBACK(status_icon_status_wrapper), icon); - g_signal_connect(G_OBJECT(self), APP_INDICATOR_SIGNAL_NEW_ICON, - G_CALLBACK(status_icon_changes), icon); - g_signal_connect(G_OBJECT(self), APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, - G_CALLBACK(status_icon_changes), icon); - - status_icon_changes(self, icon); - - g_signal_connect(G_OBJECT(icon), "activate", G_CALLBACK(status_icon_activate), self); - - return icon; -} - -/* A wrapper as the status update prototype is a little - bit different, but we want to handle it the same. */ -static void -status_icon_status_wrapper (AppIndicator * self, const gchar * status, gpointer data) -{ - return status_icon_changes(self, data); -} - -/* This tracks changes to either the status or the icons - that are associated with the app indicator */ -static void -status_icon_changes (AppIndicator * self, gpointer data) -{ - GtkStatusIcon * icon = GTK_STATUS_ICON(data); - GIcon *themed_icon = NULL; - gchar *longname = NULL; - - switch (app_indicator_get_status(self)) { - case APP_INDICATOR_STATUS_PASSIVE: - longname = append_panel_icon_suffix(app_indicator_get_icon(self)); - themed_icon = g_themed_icon_new_with_default_fallbacks (longname); - gtk_status_icon_set_visible(icon, FALSE); - gtk_status_icon_set_from_gicon(icon, themed_icon); - break; - case APP_INDICATOR_STATUS_ACTIVE: - longname = append_panel_icon_suffix(app_indicator_get_icon(self)); - themed_icon = g_themed_icon_new_with_default_fallbacks (longname); - gtk_status_icon_set_from_gicon(icon, themed_icon); - gtk_status_icon_set_visible(icon, TRUE); - break; - case APP_INDICATOR_STATUS_ATTENTION: - longname = append_panel_icon_suffix(app_indicator_get_attention_icon(self)); - themed_icon = g_themed_icon_new_with_default_fallbacks (longname); - gtk_status_icon_set_from_gicon(icon, themed_icon); - gtk_status_icon_set_visible(icon, TRUE); - break; - }; - - if (themed_icon) { - g_object_unref (themed_icon); - } - - if (longname) { - g_free(longname); - } - - return; -} - -/* Handles the activate action by the status icon by showing - the menu in a popup. */ -static void -status_icon_activate (GtkStatusIcon * icon, gpointer data) -{ - GtkMenu * menu = app_indicator_get_menu(APP_INDICATOR(data)); - if (menu == NULL) - return; - - gtk_menu_popup(menu, - NULL, /* Parent Menu */ - NULL, /* Parent item */ - gtk_status_icon_position_menu, - icon, - 1, /* Button */ - gtk_get_current_event_time()); - - return; -} - -/* Removes the status icon as the application indicator area - is now up and running again. */ -static void -unfallback (AppIndicator * self, GtkStatusIcon * status_icon) -{ - g_signal_handlers_disconnect_by_func(G_OBJECT(self), status_icon_status_wrapper, status_icon); - g_signal_handlers_disconnect_by_func(G_OBJECT(self), status_icon_changes, status_icon); - gtk_status_icon_set_visible(status_icon, FALSE); - g_object_unref(G_OBJECT(status_icon)); - return; -} - -/* A helper function that appends PANEL_ICON_SUFFIX to the given icon name - if it's missing. */ -static gchar * -append_panel_icon_suffix (const gchar *icon_name) -{ - gchar * long_name = NULL; - - if (!g_str_has_suffix (icon_name, PANEL_ICON_SUFFIX)) { - long_name = - g_strdup_printf("%s-%s", icon_name, PANEL_ICON_SUFFIX); - } else { - long_name = g_strdup (icon_name); - } - - return long_name; -} - - -/* ************************* */ -/* Public Functions */ -/* ************************* */ - -/** - app_indicator_new: - @id: The unique id of the indicator to create. - @icon_name: The icon name for this indicator - @category: The category of indicator. - - Creates a new #AppIndicator setting the properties: - #AppIndicator:id with @id, #AppIndicator:category - with @category and #AppIndicator:icon-name with - @icon_name. - - Return value: A pointer to a new #AppIndicator object. - */ -AppIndicator * -app_indicator_new (const gchar *id, - const gchar *icon_name, - AppIndicatorCategory category) -{ - AppIndicator *indicator = g_object_new (APP_INDICATOR_TYPE, - PROP_ID_S, id, - PROP_CATEGORY_S, category_from_enum (category), - PROP_ICON_NAME_S, icon_name, - NULL); - - return indicator; -} - -/** - app_indicator_new_with_path: - @id: The unique id of the indicator to create. - @icon_name: The icon name for this indicator - @category: The category of indicator. - @icon_theme_path: A custom path for finding icons. - - Creates a new #AppIndicator setting the properties: - #AppIndicator:id with @id, #AppIndicator:category - with @category, #AppIndicator:icon-name with - @icon_name and #AppIndicator:icon-theme-path with @icon_theme_path. - - Return value: A pointer to a new #AppIndicator object. - */ -AppIndicator * -app_indicator_new_with_path (const gchar *id, - const gchar *icon_name, - AppIndicatorCategory category, - const gchar *icon_theme_path) -{ - AppIndicator *indicator = g_object_new (APP_INDICATOR_TYPE, - PROP_ID_S, id, - PROP_CATEGORY_S, category_from_enum (category), - PROP_ICON_NAME_S, icon_name, - PROP_ICON_THEME_PATH_S, icon_theme_path, - NULL); - - return indicator; -} - -/** - app_indicator_get_type: - - Generates or returns the unique #GType for #AppIndicator. - - Return value: A unique #GType for #AppIndicator objects. -*/ - -/** - app_indicator_set_status: - @self: The #AppIndicator object to use - @status: The status to set for this indicator - - Wrapper function for property #AppIndicator:status. -*/ -void -app_indicator_set_status (AppIndicator *self, AppIndicatorStatus status) -{ - g_return_if_fail (IS_APP_INDICATOR (self)); - - if (self->priv->status != status) - { - GEnumValue *value = g_enum_get_value ((GEnumClass *) g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_STATUS), status); - - self->priv->status = status; - g_signal_emit (self, signals[NEW_STATUS], 0, value->value_nick); - } -} - -/** - app_indicator_set_attention_icon: - @self: The #AppIndicator object to use - @icon_name: The name of the attention icon to set for this indicator - - Wrapper function for property #AppIndicator:attention-icon-name. -*/ -void -app_indicator_set_attention_icon (AppIndicator *self, const gchar *icon_name) -{ - g_return_if_fail (IS_APP_INDICATOR (self)); - g_return_if_fail (icon_name != NULL); - - if (g_strcmp0 (self->priv->attention_icon_name, icon_name) != 0) - { - if (self->priv->attention_icon_name) - g_free (self->priv->attention_icon_name); - - self->priv->attention_icon_name = g_strdup(icon_name); - - g_signal_emit (self, signals[NEW_ATTENTION_ICON], 0, TRUE); - } - - return; -} - -/** - app_indicator_set_icon: - @self: The #AppIndicator object to use - @icon_name: The icon name to set. - - Sets the default icon to use when the status is active but - not set to attention. In most cases, this should be the - application icon for the program. - Wrapper function for property #AppIndicator:icon-name. -**/ -void -app_indicator_set_icon (AppIndicator *self, const gchar *icon_name) -{ - g_return_if_fail (IS_APP_INDICATOR (self)); - g_return_if_fail (icon_name != NULL); - - if (g_strcmp0 (self->priv->icon_name, icon_name) != 0) - { - if (self->priv->icon_name) - g_free (self->priv->icon_name); - - self->priv->icon_name = g_strdup(icon_name); - - g_signal_emit (self, signals[NEW_ICON], 0, TRUE); - } - - return; -} - -/** - app_indicator_set_label: - @self: The #AppIndicator object to use - @label: The label to show next to the icon. - @guide: A guide to size the label correctly. - - This is a wrapper function for the #AppIndicator:label and - #AppIndicator:guide properties. This function can take #NULL - as either @label or @guide and will clear the entries. -*/ -void -app_indicator_set_label (AppIndicator *self, const gchar * label, const gchar * guide) -{ - g_return_if_fail (IS_APP_INDICATOR (self)); - /* Note: The label can be NULL, it's okay */ - /* Note: The guide can be NULL, it's okay */ - - g_object_set(G_OBJECT(self), - PROP_LABEL_S, label == NULL ? "" : label, - PROP_LABEL_GUIDE_S, guide == NULL ? "" : guide, - NULL); - - return; -} - -/** - app_indicator_set_icon_theme_path: - @self: The #AppIndicator object to use - @icon_theme_path: The icon theme path to set. - - Sets the path to use when searching for icons. -**/ -void -app_indicator_set_icon_theme_path (AppIndicator *self, const gchar *icon_theme_path) -{ - g_return_if_fail (IS_APP_INDICATOR (self)); - - if (g_strcmp0 (self->priv->icon_theme_path, icon_theme_path) != 0) - { - if (self->priv->icon_theme_path != NULL) - g_free(self->priv->icon_theme_path); - - self->priv->icon_theme_path = g_strdup(icon_theme_path); - - g_signal_emit (self, signals[NEW_ICON_THEME_PATH], 0, g_strdup(self->priv->icon_theme_path)); - } - - return; -} - -static void -activate_menuitem (DbusmenuMenuitem *mi, guint timestamp, gpointer user_data) -{ - GtkWidget *widget = (GtkWidget *)user_data; - - gtk_menu_item_activate (GTK_MENU_ITEM (widget)); -} - -static void -widget_toggled (GtkWidget *widget, DbusmenuMenuitem *mi) -{ - dbusmenu_menuitem_property_set_int (mi, - DBUSMENU_MENUITEM_PROP_TOGGLE_STATE, - gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (widget)) ? DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED : DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED); -} - -static void -menuitem_iterate (GtkWidget *widget, - gpointer data) -{ - if (GTK_IS_LABEL (widget)) - { - DbusmenuMenuitem *child = (DbusmenuMenuitem *)data; - - dbusmenu_menuitem_property_set (child, - DBUSMENU_MENUITEM_PROP_LABEL, - gtk_label_get_text (GTK_LABEL (widget))); - } -} - -static gboolean -should_show_image (GtkImage *image) -{ - GtkWidget *item; - - item = gtk_widget_get_ancestor (GTK_WIDGET (image), - GTK_TYPE_IMAGE_MENU_ITEM); - - if (item) - { - GtkSettings *settings; - gboolean gtk_menu_images; - - settings = gtk_widget_get_settings (item); - - g_object_get (settings, "gtk-menu-images", >k_menu_images, NULL); - - if (gtk_menu_images) - return TRUE; - - return gtk_image_menu_item_get_always_show_image (GTK_IMAGE_MENU_ITEM (item)); - } - - return FALSE; -} - -static void -update_icon_name (DbusmenuMenuitem *menuitem, - GtkImage *image) -{ - const gchar *icon_name = NULL; - - if (gtk_image_get_storage_type (image) != GTK_IMAGE_ICON_NAME) - return; - - gtk_image_get_icon_name (image, &icon_name, NULL); - - if (should_show_image (image)) - dbusmenu_menuitem_property_set (menuitem, - DBUSMENU_MENUITEM_PROP_ICON_NAME, - icon_name); - else - dbusmenu_menuitem_property_remove (menuitem, - DBUSMENU_MENUITEM_PROP_ICON_NAME); -} - -/* return value specifies whether the label is set or not */ -static gboolean -update_stock_item (DbusmenuMenuitem *menuitem, - GtkImage *image) -{ - GtkStockItem stock; - gchar *stock_id = NULL; - - if (gtk_image_get_storage_type (image) != GTK_IMAGE_STOCK) - return FALSE; - - gtk_image_get_stock (image, &stock_id, NULL); - gtk_stock_lookup (stock_id, &stock); - - if (should_show_image (image)) - dbusmenu_menuitem_property_set (menuitem, - DBUSMENU_MENUITEM_PROP_ICON_NAME, - stock_id); - else - dbusmenu_menuitem_property_remove (menuitem, - DBUSMENU_MENUITEM_PROP_ICON_NAME); - - const gchar * label = dbusmenu_menuitem_property_get (menuitem, - DBUSMENU_MENUITEM_PROP_LABEL); - - if (stock.label != NULL && label != NULL) - { - dbusmenu_menuitem_property_set (menuitem, - DBUSMENU_MENUITEM_PROP_LABEL, - stock.label); - - return TRUE; - } - - return FALSE; -} - -static void -image_notify_cb (GtkWidget *widget, - GParamSpec *pspec, - gpointer data) -{ - DbusmenuMenuitem *child = (DbusmenuMenuitem *)data; - GtkImage *image = GTK_IMAGE (widget); - - if (pspec->name == g_intern_static_string ("stock")) - { - update_stock_item (child, image); - } - else if (pspec->name == g_intern_static_string ("icon-name")) - { - update_icon_name (child, image); - } -} - -static void -widget_notify_cb (GtkWidget *widget, - GParamSpec *pspec, - gpointer data) -{ - DbusmenuMenuitem *child = (DbusmenuMenuitem *)data; - - if (pspec->name == g_intern_static_string ("sensitive")) - { - dbusmenu_menuitem_property_set_bool (child, - DBUSMENU_MENUITEM_PROP_ENABLED, - gtk_widget_is_sensitive (widget)); - } - else if (pspec->name == g_intern_static_string ("label")) - { - dbusmenu_menuitem_property_set (child, - DBUSMENU_MENUITEM_PROP_LABEL, - gtk_menu_item_get_label (GTK_MENU_ITEM (widget))); - } - else if (pspec->name == g_intern_static_string ("visible")) - { - dbusmenu_menuitem_property_set_bool (child, - DBUSMENU_MENUITEM_PROP_VISIBLE, - gtk_widget_get_visible (widget)); - } -} - -static void -action_notify_cb (GtkAction *action, - GParamSpec *pspec, - gpointer data) -{ - DbusmenuMenuitem *child = (DbusmenuMenuitem *)data; - - if (pspec->name == g_intern_static_string ("active")) - { - dbusmenu_menuitem_property_set_bool (child, - DBUSMENU_MENUITEM_PROP_TOGGLE_STATE, - gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))); - } - - if (pspec->name == g_intern_static_string ("label")) - { - dbusmenu_menuitem_property_set (child, - DBUSMENU_MENUITEM_PROP_LABEL, - gtk_action_get_label (action)); - } -} - -static void -container_iterate (GtkWidget *widget, - gpointer data) -{ - DbusmenuMenuitem *root = (DbusmenuMenuitem *)data; - DbusmenuMenuitem *child; - GtkWidget *submenu = NULL; - const gchar *label = NULL; - gboolean label_set = FALSE; - - if (GTK_IS_TEAROFF_MENU_ITEM(widget)) { - return; - } - - child = dbusmenu_menuitem_new (); - - if (GTK_IS_SEPARATOR_MENU_ITEM (widget)) - { - dbusmenu_menuitem_property_set (child, - "type", - DBUSMENU_CLIENT_TYPES_SEPARATOR); - } - else - { - if (GTK_IS_CHECK_MENU_ITEM (widget)) - { - GtkCheckMenuItem *check; - - check = GTK_CHECK_MENU_ITEM (widget); - label = gtk_menu_item_get_label (GTK_MENU_ITEM (widget)); - - dbusmenu_menuitem_property_set (child, - DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE, - GTK_IS_RADIO_MENU_ITEM (widget) ? DBUSMENU_MENUITEM_TOGGLE_RADIO : DBUSMENU_MENUITEM_TOGGLE_CHECK); - - dbusmenu_menuitem_property_set (child, - DBUSMENU_MENUITEM_PROP_LABEL, - label); - - label_set = TRUE; - - dbusmenu_menuitem_property_set_int (child, - DBUSMENU_MENUITEM_PROP_TOGGLE_STATE, - gtk_check_menu_item_get_active (check) ? DBUSMENU_MENUITEM_TOGGLE_STATE_CHECKED : DBUSMENU_MENUITEM_TOGGLE_STATE_UNCHECKED); - - g_signal_connect (widget, - "toggled", - G_CALLBACK (widget_toggled), - child); - } - else if (GTK_IS_IMAGE_MENU_ITEM (widget)) - { - GtkWidget *image; - GtkImageType image_type; - - image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (widget)); - image_type = gtk_image_get_storage_type (GTK_IMAGE (image)); - - g_signal_connect (image, - "notify", - G_CALLBACK (image_notify_cb), - child); - - if (image_type == GTK_IMAGE_STOCK) - { - label_set = update_stock_item (child, GTK_IMAGE (image)); - } - else if (image_type == GTK_IMAGE_ICON_NAME) - { - update_icon_name (child, GTK_IMAGE (image)); - } - } - } - - if (!label_set) - { - if (label != NULL) - { - dbusmenu_menuitem_property_set (child, - DBUSMENU_MENUITEM_PROP_LABEL, - label); - } - else - { - /* find label child widget */ - gtk_container_forall (GTK_CONTAINER (widget), - menuitem_iterate, - child); - } - } - - if (GTK_IS_MENU_ITEM (widget)) - { - submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget)); - if (submenu != NULL) - { - gtk_container_foreach (GTK_CONTAINER (submenu), - container_iterate, - child); - g_signal_connect_object (submenu, - "child-added", - G_CALLBACK (submenu_changed), - child, - 0); - g_signal_connect_object (submenu, - "child-removed", - G_CALLBACK (submenu_changed), - child, - 0); - } - } - - dbusmenu_menuitem_property_set_bool (child, - DBUSMENU_MENUITEM_PROP_ENABLED, - gtk_widget_is_sensitive (widget)); - dbusmenu_menuitem_property_set_bool (child, - DBUSMENU_MENUITEM_PROP_VISIBLE, - gtk_widget_get_visible (widget)); - - g_signal_connect (widget, "notify", - G_CALLBACK (widget_notify_cb), child); - - if (GTK_IS_ACTIVATABLE (widget)) - { - GtkActivatable *activatable = GTK_ACTIVATABLE (widget); - - if (gtk_activatable_get_use_action_appearance (activatable)) - { - GtkAction *action = gtk_activatable_get_related_action (activatable); - - if (action) - { - g_signal_connect_object (action, "notify", - G_CALLBACK (action_notify_cb), - child, - G_CONNECT_AFTER); - } - } - } - - g_signal_connect (G_OBJECT (child), - DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, - G_CALLBACK (activate_menuitem), widget); - dbusmenu_menuitem_child_append (root, child); - - /* Get rid of initial ref now that the root is - holding the object */ - g_object_unref(child); - - return; -} - -static void -submenu_changed (GtkWidget *widget, - GtkWidget *child, - gpointer data) -{ - DbusmenuMenuitem *root = (DbusmenuMenuitem *)data; - GList *children, *l; - children = dbusmenu_menuitem_get_children (root); - - for (l = children; l;) - { - DbusmenuMenuitem *c = (DbusmenuMenuitem *)l->data; - l = l->next; - dbusmenu_menuitem_child_delete (root, c); - } - - gtk_container_foreach (GTK_CONTAINER (widget), - container_iterate, - root); -} - -static void -setup_dbusmenu (AppIndicator *self) -{ - AppIndicatorPrivate *priv; - DbusmenuMenuitem *root; - - priv = self->priv; - root = dbusmenu_menuitem_new (); - - if (priv->menu) - { - gtk_container_foreach (GTK_CONTAINER (priv->menu), - container_iterate, - root); - } - - if (priv->menuservice == NULL) - { - gchar * path = g_strdup_printf(DEFAULT_ITEM_PATH "/%s/Menu", priv->clean_id); - priv->menuservice = dbusmenu_server_new (path); - g_free(path); - } - - dbusmenu_server_set_root (priv->menuservice, root); - - return; -} - -static void -client_menu_changed (GtkWidget *widget, - GtkWidget *child, - AppIndicator *indicator) -{ - setup_dbusmenu (indicator); -} - -/** - app_indicator_set_menu: - @self: The #AppIndicator - @menu: A #GtkMenu to set - - Sets the menu that should be shown when the Application Indicator - is clicked on in the panel. An application indicator will not - be rendered unless it has a menu. - - Wrapper function for property #AppIndicator:menu. -**/ -void -app_indicator_set_menu (AppIndicator *self, GtkMenu *menu) -{ - AppIndicatorPrivate *priv; - - g_return_if_fail (IS_APP_INDICATOR (self)); - g_return_if_fail (GTK_IS_MENU (menu)); - g_return_if_fail (self->priv->clean_id != NULL); - - priv = self->priv; - - if (priv->menu != NULL) - { - g_object_unref (priv->menu); - } - - priv->menu = GTK_WIDGET (menu); - g_object_ref (priv->menu); - - setup_dbusmenu (self); - - check_connect (self); - - g_signal_connect (menu, - "child-added", - G_CALLBACK (client_menu_changed), - self); - g_signal_connect (menu, - "child-removed", - G_CALLBACK (client_menu_changed), - self); -} - -/** - app_indicator_set_ordering_index: - @self: The #AppIndicator - @ordering_index: A value for the ordering of this app indicator - - Sets the ordering index for the app indicator which effects the - placement of it on the panel. For almost all app indicator - this is not the function you're looking for. - - Wrapper function for property #AppIndicator:ordering-index. -**/ -void -app_indicator_set_ordering_index (AppIndicator *self, guint32 ordering_index) -{ - g_return_if_fail (IS_APP_INDICATOR (self)); - - self->priv->ordering_index = ordering_index; - - return; -} - -/** - app_indicator_get_id: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:id. - - Return value: The current ID -*/ -const gchar * -app_indicator_get_id (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); - - return self->priv->id; -} - -/** - app_indicator_get_category: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:category. - - Return value: The current category. -*/ -AppIndicatorCategory -app_indicator_get_category (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), APP_INDICATOR_CATEGORY_APPLICATION_STATUS); - - return self->priv->category; -} - -/** - app_indicator_get_status: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:status. - - Return value: The current status. -*/ -AppIndicatorStatus -app_indicator_get_status (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), APP_INDICATOR_STATUS_PASSIVE); - - return self->priv->status; -} - -/** - app_indicator_get_icon: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:icon-name. - - Return value: The current icon name. -*/ -const gchar * -app_indicator_get_icon (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); - - return self->priv->icon_name; -} - -/** - app_indicator_get_icon_theme_path: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:icon-theme-path. - - Return value: The current icon theme path. -*/ -const gchar * -app_indicator_get_icon_theme_path (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); - - return self->priv->icon_theme_path; -} - -/** - app_indicator_get_attention_icon: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:attention-icon-name. - - Return value: The current attention icon name. -*/ -const gchar * -app_indicator_get_attention_icon (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); - - return self->priv->attention_icon_name; -} - -/** - app_indicator_get_menu: - @self: The #AppIndicator object to use - - Gets the menu being used for this application indicator. - Wrapper function for property #AppIndicator:menu. - - Return value: A #GtkMenu object or %NULL if one hasn't been set. -*/ -GtkMenu * -app_indicator_get_menu (AppIndicator *self) -{ - AppIndicatorPrivate *priv; - - g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); - - priv = self->priv; - - return GTK_MENU(priv->menu); -} - -/** - app_indicator_get_label: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:label. - - Return value: The current label. -*/ -const gchar * -app_indicator_get_label (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); - - return self->priv->label; -} - -/** - app_indicator_get_label_guide: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:label-guide. - - Return value: The current label guide. -*/ -const gchar * -app_indicator_get_label_guide (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), NULL); - - return self->priv->label_guide; -} - -/** - app_indicator_get_ordering_index: - @self: The #AppIndicator object to use - - Wrapper function for property #AppIndicator:ordering-index. - - Return value: The current ordering index. -*/ -guint32 -app_indicator_get_ordering_index (AppIndicator *self) -{ - g_return_val_if_fail (IS_APP_INDICATOR (self), 0); - - if (self->priv->ordering_index == 0) { - return generate_id(self->priv->category, self->priv->id); - } else { - return self->priv->ordering_index; - } -} - diff --git a/src/app-indicator.h b/src/app-indicator.h deleted file mode 100644 index ce152bb..0000000 --- a/src/app-indicator.h +++ /dev/null @@ -1,302 +0,0 @@ -/* -An object to represent the application as an application indicator -in the system panel. - -Copyright 2009 Canonical Ltd. - -Authors: - Ted Gould <ted@canonical.com> - Cody Russell <cody.russell@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_H__ -#define __APP_INDICATOR_H__ - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -/** - APP_INDICATOR_TYPE: - - Get the #GType for a #AppIndicator. -*/ -/** - APP_INDICATOR: - @obj: The object to convert - - Safely convert a #GObject into an #AppIndicator. -*/ -/** - APP_INDICATOR_CLASS: - @klass: #GObjectClass based class to convert. - - Safely convert a #GObjectClass into a #AppIndicatorClass. -*/ -/** - IS_APP_INDICATOR: - @obj: An #GObject to check - - Checks to see if @obj is in the object hierarchy of #AppIndicator. -*/ -/** - IS_APP_INDICATOR_CLASS: - @klass: An #GObjectClass to check - - Checks to see if @klass is in the object class hierarchy of #AppIndicatorClass. -*/ -/** - APP_INDICATOR_GET_CLASS: - @obj: A #GObject in the class hierarchy of #AppIndicator. - - Gets a pointer to the #AppIndicatorClass for the object @obj. -*/ - -#define APP_INDICATOR_TYPE (app_indicator_get_type ()) -#define APP_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APP_INDICATOR_TYPE, AppIndicator)) -#define APP_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), APP_INDICATOR_TYPE, AppIndicatorClass)) -#define IS_APP_INDICATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), APP_INDICATOR_TYPE)) -#define IS_APP_INDICATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), APP_INDICATOR_TYPE)) -#define APP_INDICATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APP_INDICATOR_TYPE, AppIndicatorClass)) - -/** - APP_INDICATOR_SIGNAL_NEW_ICON: - - String identifier for the #AppIndicator::new-icon signal. -*/ -/** - APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON: - - String identifier for the #AppIndicator::new-attention-icon signal. -*/ -/** - APP_INDICATOR_SIGNAL_NEW_STATUS: - - String identifier for the #AppIndicator::new-status signal. -*/ -/** - APP_INDICATOR_SIGNAL_NEW_LABEL: - - String identifier for the #AppIndicator::new-label signal. -*/ -/** - APP_INDICATOR_SIGNAL_CONNECTION_CHANGED: - - String identifier for the #AppIndicator::connection-changed signal. -*/ -/** - APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH: - - String identifier for the #AppIndicator::new-icon-theme-path signal. -*/ -#define APP_INDICATOR_SIGNAL_NEW_ICON "new-icon" -#define APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON "new-attention-icon" -#define APP_INDICATOR_SIGNAL_NEW_STATUS "new-status" -#define APP_INDICATOR_SIGNAL_NEW_LABEL "new-label" -#define APP_INDICATOR_SIGNAL_CONNECTION_CHANGED "connection-changed" -#define APP_INDICATOR_SIGNAL_NEW_ICON_THEME_PATH "new-icon-theme-path" - -/** - AppIndicatorCategory: - @APP_INDICATOR_CATEGORY_APPLICATION_STATUS: The indicator is used to display the status of the application. - @APP_INDICATOR_CATEGORY_COMMUNICATIONS: The application is used for communication with other people. - @APP_INDICATOR_CATEGORY_SYSTEM_SERVICES: A system indicator relating to something in the user's system. - @APP_INDICATOR_CATEGORY_HARDWARE: An indicator relating to the user's hardware. - @APP_INDICATOR_CATEGORY_OTHER: Something not defined in this enum, please don't use unless you really need it. - - The category provides grouping for the indicators so that - users can find indicators that are similar together. -*/ -typedef enum { /*< prefix=APP_INDICATOR_CATEGORY >*/ - APP_INDICATOR_CATEGORY_APPLICATION_STATUS, /*< nick=ApplicationStatus >*/ - APP_INDICATOR_CATEGORY_COMMUNICATIONS, /*< nick=Communications >*/ - APP_INDICATOR_CATEGORY_SYSTEM_SERVICES, /*< nick=SystemServices >*/ - APP_INDICATOR_CATEGORY_HARDWARE, /*< nick=Hardware >*/ - APP_INDICATOR_CATEGORY_OTHER /*< nick=Other >*/ -} AppIndicatorCategory; - -/** - AppIndicatorStatus: - @APP_INDICATOR_STATUS_PASSIVE: The indicator should not be shown to the user. - @APP_INDICATOR_STATUS_ACTIVE: The indicator should be shown in it's default state. - @APP_INDICATOR_STATUS_ATTENTION: The indicator should show it's attention icon. - - These are the states that the indicator can be on in - the user's panel. The indicator by default starts - in the state @APP_INDICATOR_STATUS_PASSIVE and can be - shown by setting it to @APP_INDICATOR_STATUS_ACTIVE. -*/ -typedef enum { /*< prefix=APP_INDICATOR_STATUS >*/ - APP_INDICATOR_STATUS_PASSIVE, /*< nick=Passive >*/ - APP_INDICATOR_STATUS_ACTIVE, /*< nick=Active >*/ - APP_INDICATOR_STATUS_ATTENTION /*< nick=NeedsAttention >*/ -} AppIndicatorStatus; - -typedef struct _AppIndicator AppIndicator; -typedef struct _AppIndicatorClass AppIndicatorClass; -typedef struct _AppIndicatorPrivate AppIndicatorPrivate; - -/** - AppIndicatorClass: - @parent_class: Mia familia - @new_icon: Slot for #AppIndicator::new-icon. - @new_attention_icon: Slot for #AppIndicator::new-attention-icon. - @new_status: Slot for #AppIndicator::new-status. - @new_icon_theme_path: Slot for #AppIndicator::new-icon-theme-path - @new_label: Slot for #AppIndicator::new-label. - @connection_changed: Slot for #AppIndicator::connection-changed. - @app_indicator_reserved_sw: Reserved for future use. - @app_indicator_reserved_ats: Reserved for future use. - @fallback: Function that gets called to make a #GtkStatusIcon when - there is no Application Indicator area available. - @unfallback: The function that gets called if an Application - Indicator area appears after the fallback has been created. - @app_indicator_reserved_1: Reserved for future use. - @app_indicator_reserved_2: Reserved for future use. - @app_indicator_reserved_3: Reserved for future use. - @app_indicator_reserved_4: Reserved for future use. - @app_indicator_reserved_5: Reserved for future use. - @app_indicator_reserved_6: Reserved for future use. - - The signals and external functions that make up the #AppIndicator - class object. -*/ -struct _AppIndicatorClass { - /* Parent */ - GObjectClass parent_class; - - /* DBus Signals */ - void (* new_icon) (AppIndicator *indicator, - gpointer user_data); - void (* new_attention_icon) (AppIndicator *indicator, - gpointer user_data); - void (* new_status) (AppIndicator *indicator, - const gchar *status, - gpointer user_data); - void (* new_icon_theme_path) (AppIndicator *indicator, - const gchar *icon_theme_path, - gpointer user_data); - void (* new_label) (AppIndicator *indicator, - const gchar *label, - const gchar *guide, - gpointer user_data); - - /* Local Signals */ - void (* connection_changed) (AppIndicator * indicator, - gboolean connected, - gpointer user_data); - void (*app_indicator_reserved_sw)(void); - void (*app_indicator_reserved_ats)(void); - - /* Overridable Functions */ - GtkStatusIcon * (*fallback) (AppIndicator * indicator); - void (*unfallback) (AppIndicator * indicator, - GtkStatusIcon * status_icon); - - /* Reserved */ - void (*app_indicator_reserved_1)(void); - void (*app_indicator_reserved_2)(void); - void (*app_indicator_reserved_3)(void); - void (*app_indicator_reserved_4)(void); - void (*app_indicator_reserved_5)(void); - void (*app_indicator_reserved_6)(void); -}; - -/** - AppIndicator: - - A application indicator represents the values that are needed to show a - unique status in the panel for an application. In general, applications - should try to fit in the other indicators that are available on the - panel before using this. But, sometimes it is necissary. -*/ -/* Private fields - @parent: Parent object. - @priv: Internal data. -*/ -struct _AppIndicator { - /*< Private >*/ - GObject parent; - - /*< Private >*/ - AppIndicatorPrivate *priv; -}; - -/* GObject Stuff */ -GType app_indicator_get_type (void) G_GNUC_CONST; - -AppIndicator *app_indicator_new (const gchar *id, - const gchar *icon_name, - AppIndicatorCategory category); -AppIndicator *app_indicator_new_with_path (const gchar *id, - const gchar *icon_name, - AppIndicatorCategory category, - const gchar *icon_theme_path); - -/* Set properties */ -void app_indicator_set_status (AppIndicator *self, - AppIndicatorStatus status); -void app_indicator_set_attention_icon (AppIndicator *self, - const gchar *icon_name); -void app_indicator_set_menu (AppIndicator *self, - GtkMenu *menu); -void app_indicator_set_icon (AppIndicator *self, - const gchar *icon_name); -void app_indicator_set_label (AppIndicator *self, - const gchar *label, - const gchar *guide); -void app_indicator_set_icon_theme_path(AppIndicator *self, - const gchar *icon_theme_path); -void app_indicator_set_ordering_index (AppIndicator *self, - guint32 ordering_index); - -/* Get properties */ -const gchar * app_indicator_get_id (AppIndicator *self); -AppIndicatorCategory app_indicator_get_category (AppIndicator *self); -AppIndicatorStatus app_indicator_get_status (AppIndicator *self); -const gchar * app_indicator_get_icon (AppIndicator *self); -const gchar * app_indicator_get_icon_theme_path(AppIndicator *self); -const gchar * app_indicator_get_attention_icon (AppIndicator *self); -GtkMenu * app_indicator_get_menu (AppIndicator *self); -const gchar * app_indicator_get_label (AppIndicator *self); -const gchar * app_indicator_get_label_guide (AppIndicator *self); -guint32 app_indicator_get_ordering_index (AppIndicator *self); - -G_END_DECLS - -/** - SECTION:app-indicator - @short_description: An object to put application information - into the panel. - @stability: Unstable - @include: libappindicator/app-indicator.h - - An application indicator is a way for an application to put - a menu into the panel on the user's screen. This allows the - user to interact with the application even though it might - not be visible to the user at the time. In most cases this - is not a good solution as there are other ways to inform the - user. It should only be use if persistence is a desired - feature for the user (not for your marketing purpose of - having your logo in the panel). -*/ - -#endif diff --git a/src/appindicator-0.1.pc.in b/src/appindicator-0.1.pc.in deleted file mode 100644 index b80fded..0000000 --- a/src/appindicator-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}/libappindicator-0.1 -Requires: dbusmenu-glib gtk+-2.0 -Libs: -L${libdir} -lappindicator - -Name: appindicator-0.1 -Description: Application indicators -Version: @VERSION@ - 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 e3befff..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 "app-indicator.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/generate-id.h b/src/generate-id.h index 9d3167d..4c26da2 100644 --- a/src/generate-id.h +++ b/src/generate-id.h @@ -23,7 +23,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define __GENERATE_ID_H__ #include <glib.h> -#include "app-indicator.h" +#include "libappindicator/app-indicator.h" guint32 generate_id (const AppIndicatorCategory category, const gchar * id); 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> |