diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 113 | ||||
-rw-r--r-- | src/Makefile.in | 452 | ||||
-rw-r--r-- | src/app-indicator.c | 879 | ||||
-rw-r--r-- | src/app-indicator.h | 5 | ||||
-rw-r--r-- | src/application-service-appstore.c | 1305 | ||||
-rw-r--r-- | src/application-service-appstore.h | 73 | ||||
-rw-r--r-- | src/application-service-watcher.c | 302 | ||||
-rw-r--r-- | src/application-service-watcher.h | 61 | ||||
-rw-r--r-- | src/application-service.c | 78 | ||||
-rw-r--r-- | src/application-service.xml | 59 | ||||
-rw-r--r-- | src/dbus-properties.xml | 23 | ||||
-rw-r--r-- | src/gen-notification-item.xml.c | 41 | ||||
-rw-r--r-- | src/gen-notification-item.xml.h | 1 | ||||
-rw-r--r-- | src/gen-notification-watcher.xml.c | 39 | ||||
-rw-r--r-- | src/gen-notification-watcher.xml.h | 1 | ||||
-rw-r--r-- | src/generate-id.c | 2 | ||||
-rw-r--r-- | src/generate-id.h | 2 | ||||
-rw-r--r-- | src/indicator-application.c | 879 | ||||
-rw-r--r-- | src/notification-approver.xml | 29 |
19 files changed, 807 insertions, 3537 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 9e58943..a5ea29b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -22,60 +22,12 @@ include $(top_srcdir)/Makefile.am.enum include $(top_srcdir)/Makefile.am.marshal ################################## -# Indicator +# Marshallers ################################## -applicationlibdir = $(INDICATORDIR) -applicationlib_LTLIBRARIES = libapplication.la -libapplication_la_SOURCES = \ - application-service-marshal.c \ - dbus-shared.h \ - indicator-application.c -libapplication_la_CFLAGS = $(INDICATOR_CFLAGS) \ - -Wall \ - -Wl,-Bsymbolic-functions \ - -Wl,-z,defs \ - -Wl,--as-needed \ - -Werror \ - -DG_LOG_DOMAIN=\"Indicator-Application\" -libapplication_la_LIBADD = $(INDICATOR_LIBS) -libapplication_la_LDFLAGS = -module -avoid-version - -################################## -# Service -################################## - -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 = \ - application-service.c \ - application-service-appstore.h \ - application-service-appstore.c \ - application-service-marshal.c \ - application-service-watcher.h \ - application-service-watcher.c \ - app-indicator-enum-types.c \ - dbus-shared.h \ - generate-id.h \ - generate-id.c - -indicator_application_service_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -DDATADIR="\"$(pkgdatadir)\"" \ - -Wall -Werror \ - -DG_LOG_DOMAIN=\"indicator-application-service\" - -indicator_application_service_LDADD = \ - $(INDICATOR_LIBS) \ - libappindicator$(VER).la + application-service-marshal.c glib_marshal_list = application-service-marshal.list glib_marshal_prefix = _application_service_marshal @@ -102,17 +54,18 @@ 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 \ + dbus-shared.h \ generate-id.h \ - generate-id.c + generate-id.c \ + gen-notification-item.xml.h \ + gen-notification-item.xml.c \ + gen-notification-watcher.xml.h \ + gen-notification-watcher.xml.c libappindicator_la_LDFLAGS = \ -version-info 1:0:0 \ @@ -120,12 +73,12 @@ libappindicator_la_LDFLAGS = \ -export-symbols-regex "^[^_d].*" libappindicator_la_CFLAGS = \ - $(INDICATOR_CFLAGS) \ + $(LIBRARY_CFLAGS) \ -Wall -Werror \ -DG_LOG_DOMAIN=\"libappindicator\" libappindicator_la_LIBADD = \ - $(INDICATOR_LIBS) + $(LIBRARY_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. @@ -143,31 +96,30 @@ libappindicator3_la_LIBADD = $(libappindicator_la_LIBADD) ################################## DBUS_SPECS = \ - dbus-properties.xml \ - application-service.xml \ - notification-approver.xml \ notification-item.xml \ notification-watcher.xml -%-client.h: %.xml - dbus-binding-tool \ - --prefix=_$(notdir $(subst -,_,$(<:.xml=)))_client \ - --mode=glib-client \ - --output=$@ \ - $< +gen-%.xml.h: %.xml + @echo "Building $@ from $<" + @echo "extern const char * _$(subst -,_,$(subst .,_,$(basename $<)));" > $@ -%-server.h: %.xml - dbus-binding-tool \ - --prefix=_$(notdir $(subst -,_,$(<:.xml=)))_server \ - --mode=glib-server \ - --output=$@ \ - $< +gen-%.xml.c: %.xml + @echo "Building $@ from $<" + @echo "const char * _$(subst -,_,$(subst .,_,$(basename $<))) = " > $@ + @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@ + @echo ";" >> $@ BUILT_SOURCES += \ - $(DBUS_SPECS:.xml=-client.h) \ - $(DBUS_SPECS:.xml=-server.h) + gen-notification-item.xml.c \ + gen-notification-item.xml.h \ + gen-notification-watcher.xml.c \ + gen-notification-watcher.xml.h -CLEANFILES += $(BUILT_SOURCES) +CLEANFILES += \ + gen-notification-item.xml.c \ + gen-notification-item.xml.h \ + gen-notification-watcher.xml.c \ + gen-notification-watcher.xml.h EXTRA_DIST += $(DBUS_SPECS) @@ -177,11 +129,19 @@ EXTRA_DIST += $(DBUS_SPECS) -include $(INTROSPECTION_MAKEFILE) INTROSPECTION_GIRS = + +if INTROSPECTION_TEN INTROSPECTION_SCANNER_ARGS = \ --add-include-path=$(srcdir) \ $(addprefix --c-include=src/, $(introspection_sources)) \ --symbol-prefix=app \ --identifier-prefix=App +else +INTROSPECTION_SCANNER_ARGS = \ + --add-include-path=$(srcdir) \ + $(addprefix --c-include=src/, $(introspection_sources)) +endif + INTROSPECTION_COMPILER_ARGS = --includedir=$(builddir) if HAVE_INTROSPECTION @@ -190,10 +150,11 @@ 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_CFLAGS = $(LIBRARY_CFLAGS) -I$(srcdir) -I$(top_builddir)/src AppIndicator_0_1_gir_LIBS = libappindicator$(VER).la AppIndicator_0_1_gir_FILES = $(introspection_sources) diff --git a/src/Makefile.in b/src/Makefile.in index 3e55704..75da889 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -50,7 +50,6 @@ - VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ @@ -76,7 +75,6 @@ DIST_COMMON = $(libappindicator3include_HEADERS) \ $(srcdir)/appindicator3-0.1.pc.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) @@ -114,13 +112,12 @@ am__nobase_list = $(am__nobase_strip_setup); \ 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)" \ +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \ + "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" \ + "$(DESTDIR)$(vapidir)" \ "$(DESTDIR)$(libappindicator3includedir)" \ "$(DESTDIR)$(libappindicatorincludedir)" -LTLIBRARIES = $(applicationlib_LTLIBRARIES) $(lib_LTLIBRARIES) +LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libappindicator_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__objects_1 = @@ -128,7 +125,9 @@ 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-generate-id.lo \ + libappindicator_la-gen-notification-item.xml.lo \ + libappindicator_la-gen-notification-watcher.xml.lo libappindicator_la_OBJECTS = $(am_libappindicator_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) @@ -144,7 +143,9 @@ 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 + libappindicator3_la-generate-id.lo \ + libappindicator3_la-gen-notification-item.xml.lo \ + libappindicator3_la-gen-notification-watcher.xml.lo am_libappindicator3_la_OBJECTS = $(am__objects_2) libappindicator3_la_OBJECTS = $(am_libappindicator3_la_OBJECTS) libappindicator3_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ @@ -152,31 +153,6 @@ libappindicator3_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(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) -libapplication_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(libapplication_la_CFLAGS) $(CFLAGS) \ - $(libapplication_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(libexec_PROGRAMS) -am_indicator_application_service_OBJECTS = \ - indicator_application_service-application-service.$(OBJEXT) \ - indicator_application_service-application-service-appstore.$(OBJEXT) \ - indicator_application_service-application-service-marshal.$(OBJEXT) \ - indicator_application_service-application-service-watcher.$(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_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(indicator_application_service_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @@ -203,12 +179,9 @@ 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) \ - $(indicator_application_service_SOURCES) +SOURCES = $(libappindicator_la_SOURCES) $(libappindicator3_la_SOURCES) DIST_SOURCES = $(libappindicator_la_SOURCES) \ - $(libappindicator3_la_SOURCES) $(libapplication_la_SOURCES) \ - $(indicator_application_service_SOURCES) + $(libappindicator3_la_SOURCES) DATA = $(gir_DATA) $(pkgconfig_DATA) $(typelib_DATA) $(vapi_DATA) HEADERS = $(libappindicator3include_HEADERS) \ $(libappindicatorinclude_HEADERS) @@ -233,7 +206,6 @@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSC = @CSC@ CYGPATH_W = @CYGPATH_W@ -DBUSSERVICEDIR = @DBUSSERVICEDIR@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ @@ -260,10 +232,6 @@ 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@ -INDICATOR_LIBS = @INDICATOR_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ @@ -280,6 +248,8 @@ INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ +LIBRARY_CFLAGS = @LIBRARY_CFLAGS@ +LIBRARY_LIBS = @LIBRARY_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_PREFIX = @LIB_PREFIX@ @@ -325,6 +295,8 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +TESTDEPS_CFLAGS = @TESTDEPS_CFLAGS@ +TESTDEPS_LIBS = @TESTDEPS_LIBS@ VALA_API_GEN = @VALA_API_GEN@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ @@ -391,17 +363,21 @@ top_srcdir = @top_srcdir@ @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) \ +CLEANFILES = stamp-enum-types stamp-marshal \ + gen-notification-item.xml.c gen-notification-item.xml.h \ + gen-notification-watcher.xml.c gen-notification-watcher.xml.h \ $(am__append_2) DISTCLEANFILES = $(glib_enum_h) $(glib_enum_c) $(marshal_h) \ $(marshal_c) app-indicator-enum-types.c + +################################## +# Marshallers +################################## 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) + $(marshal_c) application-service-marshal.h \ + application-service-marshal.c gen-notification-item.xml.c \ + gen-notification-item.xml.h gen-notification-watcher.xml.c \ + gen-notification-watcher.xml.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) @@ -409,49 +385,6 @@ 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) marshal_c = $(glib_marshal_list:.list=.c) - -################################## -# Indicator -################################## -applicationlibdir = $(INDICATORDIR) -applicationlib_LTLIBRARIES = libapplication.la -libapplication_la_SOURCES = \ - application-service-marshal.c \ - dbus-shared.h \ - indicator-application.c - -libapplication_la_CFLAGS = $(INDICATOR_CFLAGS) \ - -Wall \ - -Wl,-Bsymbolic-functions \ - -Wl,-z,defs \ - -Wl,--as-needed \ - -Werror \ - -DG_LOG_DOMAIN=\"Indicator-Application\" - -libapplication_la_LIBADD = $(INDICATOR_LIBS) -libapplication_la_LDFLAGS = -module -avoid-version -indicator_application_service_SOURCES = \ - application-service.c \ - application-service-appstore.h \ - application-service-appstore.c \ - application-service-marshal.c \ - application-service-watcher.h \ - application-service-watcher.c \ - app-indicator-enum-types.c \ - dbus-shared.h \ - generate-id.h \ - generate-id.c - -indicator_application_service_CFLAGS = \ - $(INDICATOR_CFLAGS) \ - -DDATADIR="\"$(pkgdatadir)\"" \ - -Wall -Werror \ - -DG_LOG_DOMAIN=\"indicator-application-service\" - -indicator_application_service_LDADD = \ - $(INDICATOR_LIBS) \ - libappindicator$(VER).la - glib_marshal_list = application-service-marshal.list glib_marshal_prefix = _application_service_marshal @@ -476,8 +409,13 @@ libappindicator_la_SOURCES = \ app-indicator-enum-types.c \ app-indicator.c \ application-service-marshal.c \ + dbus-shared.h \ generate-id.h \ - generate-id.c + generate-id.c \ + gen-notification-item.xml.h \ + gen-notification-item.xml.c \ + gen-notification-watcher.xml.h \ + gen-notification-watcher.xml.c libappindicator_la_LDFLAGS = \ -version-info 1:0:0 \ @@ -485,12 +423,12 @@ libappindicator_la_LDFLAGS = \ -export-symbols-regex "^[^_d].*" libappindicator_la_CFLAGS = \ - $(INDICATOR_CFLAGS) \ + $(LIBRARY_CFLAGS) \ -Wall -Werror \ -DG_LOG_DOMAIN=\"libappindicator\" libappindicator_la_LIBADD = \ - $(INDICATOR_LIBS) + $(LIBRARY_LIBS) # We duplicate these here because Automake won't let us use $(VER) on the left hand side. @@ -508,18 +446,19 @@ libappindicator3_la_LIBADD = $(libappindicator_la_LIBADD) # DBus Specs ################################## DBUS_SPECS = \ - dbus-properties.xml \ - application-service.xml \ - notification-approver.xml \ notification-item.xml \ 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_TEN_FALSE@INTROSPECTION_SCANNER_ARGS = \ +@INTROSPECTION_TEN_FALSE@ --add-include-path=$(srcdir) \ +@INTROSPECTION_TEN_FALSE@ $(addprefix --c-include=src/, $(introspection_sources)) + +@INTROSPECTION_TEN_TRUE@INTROSPECTION_SCANNER_ARGS = \ +@INTROSPECTION_TEN_TRUE@ --add-include-path=$(srcdir) \ +@INTROSPECTION_TEN_TRUE@ $(addprefix --c-include=src/, $(introspection_sources)) \ +@INTROSPECTION_TEN_TRUE@ --symbol-prefix=app \ +@INTROSPECTION_TEN_TRUE@ --identifier-prefix=App INTROSPECTION_COMPILER_ARGS = --includedir=$(builddir) @HAVE_INTROSPECTION_TRUE@introspection_sources = \ @@ -529,7 +468,7 @@ INTROSPECTION_COMPILER_ARGS = --includedir=$(builddir) @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_CFLAGS = $(LIBRARY_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) @@ -585,37 +524,6 @@ appindicator-0.1.pc: $(top_builddir)/config.status $(srcdir)/appindicator-0.1.pc 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)" - @list='$(applicationlib_LTLIBRARIES)'; test -n "$(applicationlibdir)" || 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)$(applicationlibdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(applicationlibdir)"; \ - } - -uninstall-applicationlibLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(applicationlib_LTLIBRARIES)'; test -n "$(applicationlibdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(applicationlibdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(applicationlibdir)/$$f"; \ - done - -clean-applicationlibLTLIBRARIES: - -test -z "$(applicationlib_LTLIBRARIES)" || rm -f $(applicationlib_LTLIBRARIES) - @list='$(applicationlib_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 install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @@ -651,54 +559,6 @@ libappindicator.la: $(libappindicator_la_OBJECTS) $(libappindicator_la_DEPENDENC $(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) - @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ - for p in $$list; do echo "$$p $$p"; done | \ - sed 's/$(EXEEXT)$$//' | \ - while read p p1; do if test -f $$p || test -f $$p1; \ - then echo "$$p"; echo "$$p"; else :; fi; \ - done | \ - sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ - -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ - sed 'N;N;N;s,\n, ,g' | \ - $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ - { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ - if ($$2 == $$4) files[d] = files[d] " " $$1; \ - else { print "f", $$3 "/" $$4, $$1; } } \ - END { for (d in files) print "f", d, files[d] }' | \ - while read type dir files; do \ - if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ - test -z "$$files" || { \ - echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-libexecPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ - files=`for p in $$list; do echo "$$p"; done | \ - sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(libexecdir)" && rm -f $$files - -clean-libexecPROGRAMS: - @list='$(libexec_PROGRAMS)'; test -n "$$list" || exit 0; \ - echo " rm -f" $$list; \ - rm -f $$list || exit $$?; \ - test -n "$(EXEEXT)" || exit 0; \ - list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ - echo " rm -f" $$list; \ - rm -f $$list -indicator-application-service$(EXEEXT): $(indicator_application_service_OBJECTS) $(indicator_application_service_DEPENDENCIES) - @rm -f indicator-application-service$(EXEEXT) - $(AM_V_CCLD)$(indicator_application_service_LINK) $(indicator_application_service_OBJECTS) $(indicator_application_service_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -706,22 +566,18 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_application_service-app-indicator-enum-types.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_application_service-application-service-appstore.Po@am__quote@ -@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-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-gen-notification-item.xml.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator3_la-gen-notification-watcher.xml.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-gen-notification-item.xml.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libappindicator_la-gen-notification-watcher.xml.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@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -779,6 +635,22 @@ libappindicator_la-generate-id.lo: generate-id.c @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 +libappindicator_la-gen-notification-item.xml.lo: gen-notification-item.xml.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-gen-notification-item.xml.lo -MD -MP -MF $(DEPDIR)/libappindicator_la-gen-notification-item.xml.Tpo -c -o libappindicator_la-gen-notification-item.xml.lo `test -f 'gen-notification-item.xml.c' || echo '$(srcdir)/'`gen-notification-item.xml.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator_la-gen-notification-item.xml.Tpo $(DEPDIR)/libappindicator_la-gen-notification-item.xml.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gen-notification-item.xml.c' object='libappindicator_la-gen-notification-item.xml.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-gen-notification-item.xml.lo `test -f 'gen-notification-item.xml.c' || echo '$(srcdir)/'`gen-notification-item.xml.c + +libappindicator_la-gen-notification-watcher.xml.lo: gen-notification-watcher.xml.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-gen-notification-watcher.xml.lo -MD -MP -MF $(DEPDIR)/libappindicator_la-gen-notification-watcher.xml.Tpo -c -o libappindicator_la-gen-notification-watcher.xml.lo `test -f 'gen-notification-watcher.xml.c' || echo '$(srcdir)/'`gen-notification-watcher.xml.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator_la-gen-notification-watcher.xml.Tpo $(DEPDIR)/libappindicator_la-gen-notification-watcher.xml.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gen-notification-watcher.xml.c' object='libappindicator_la-gen-notification-watcher.xml.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-gen-notification-watcher.xml.lo `test -f 'gen-notification-watcher.xml.c' || echo '$(srcdir)/'`gen-notification-watcher.xml.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 @@ -811,117 +683,21 @@ libappindicator3_la-generate-id.lo: generate-id.c @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 -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-marshal.c' object='libapplication_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) $(libapplication_la_CFLAGS) $(CFLAGS) -c -o libapplication_la-application-service-marshal.lo `test -f 'application-service-marshal.c' || echo '$(srcdir)/'`application-service-marshal.c - -libapplication_la-indicator-application.lo: indicator-application.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-indicator-application.lo -MD -MP -MF $(DEPDIR)/libapplication_la-indicator-application.Tpo -c -o libapplication_la-indicator-application.lo `test -f 'indicator-application.c' || echo '$(srcdir)/'`indicator-application.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libapplication_la-indicator-application.Tpo $(DEPDIR)/libapplication_la-indicator-application.Plo -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='indicator-application.c' object='libapplication_la-indicator-application.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) $(libapplication_la_CFLAGS) $(CFLAGS) -c -o libapplication_la-indicator-application.lo `test -f 'indicator-application.c' || echo '$(srcdir)/'`indicator-application.c - -indicator_application_service-application-service.o: application-service.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-application-service.o -MD -MP -MF $(DEPDIR)/indicator_application_service-application-service.Tpo -c -o indicator_application_service-application-service.o `test -f 'application-service.c' || echo '$(srcdir)/'`application-service.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-application-service.Tpo $(DEPDIR)/indicator_application_service-application-service.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service.c' object='indicator_application_service-application-service.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-application-service.o `test -f 'application-service.c' || echo '$(srcdir)/'`application-service.c - -indicator_application_service-application-service.obj: application-service.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-application-service.obj -MD -MP -MF $(DEPDIR)/indicator_application_service-application-service.Tpo -c -o indicator_application_service-application-service.obj `if test -f 'application-service.c'; then $(CYGPATH_W) 'application-service.c'; else $(CYGPATH_W) '$(srcdir)/application-service.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-application-service.Tpo $(DEPDIR)/indicator_application_service-application-service.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service.c' object='indicator_application_service-application-service.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-application-service.obj `if test -f 'application-service.c'; then $(CYGPATH_W) 'application-service.c'; else $(CYGPATH_W) '$(srcdir)/application-service.c'; fi` - -indicator_application_service-application-service-appstore.o: application-service-appstore.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-application-service-appstore.o -MD -MP -MF $(DEPDIR)/indicator_application_service-application-service-appstore.Tpo -c -o indicator_application_service-application-service-appstore.o `test -f 'application-service-appstore.c' || echo '$(srcdir)/'`application-service-appstore.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-application-service-appstore.Tpo $(DEPDIR)/indicator_application_service-application-service-appstore.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-appstore.c' object='indicator_application_service-application-service-appstore.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-application-service-appstore.o `test -f 'application-service-appstore.c' || echo '$(srcdir)/'`application-service-appstore.c - -indicator_application_service-application-service-appstore.obj: application-service-appstore.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-application-service-appstore.obj -MD -MP -MF $(DEPDIR)/indicator_application_service-application-service-appstore.Tpo -c -o indicator_application_service-application-service-appstore.obj `if test -f 'application-service-appstore.c'; then $(CYGPATH_W) 'application-service-appstore.c'; else $(CYGPATH_W) '$(srcdir)/application-service-appstore.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-application-service-appstore.Tpo $(DEPDIR)/indicator_application_service-application-service-appstore.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-appstore.c' object='indicator_application_service-application-service-appstore.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-application-service-appstore.obj `if test -f 'application-service-appstore.c'; then $(CYGPATH_W) 'application-service-appstore.c'; else $(CYGPATH_W) '$(srcdir)/application-service-appstore.c'; fi` - -indicator_application_service-application-service-marshal.o: application-service-marshal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-application-service-marshal.o -MD -MP -MF $(DEPDIR)/indicator_application_service-application-service-marshal.Tpo -c -o indicator_application_service-application-service-marshal.o `test -f 'application-service-marshal.c' || echo '$(srcdir)/'`application-service-marshal.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-application-service-marshal.Tpo $(DEPDIR)/indicator_application_service-application-service-marshal.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-marshal.c' object='indicator_application_service-application-service-marshal.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-application-service-marshal.o `test -f 'application-service-marshal.c' || echo '$(srcdir)/'`application-service-marshal.c - -indicator_application_service-application-service-marshal.obj: application-service-marshal.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-application-service-marshal.obj -MD -MP -MF $(DEPDIR)/indicator_application_service-application-service-marshal.Tpo -c -o indicator_application_service-application-service-marshal.obj `if test -f 'application-service-marshal.c'; then $(CYGPATH_W) 'application-service-marshal.c'; else $(CYGPATH_W) '$(srcdir)/application-service-marshal.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-application-service-marshal.Tpo $(DEPDIR)/indicator_application_service-application-service-marshal.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-marshal.c' object='indicator_application_service-application-service-marshal.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-application-service-marshal.obj `if test -f 'application-service-marshal.c'; then $(CYGPATH_W) 'application-service-marshal.c'; else $(CYGPATH_W) '$(srcdir)/application-service-marshal.c'; fi` - -indicator_application_service-application-service-watcher.o: application-service-watcher.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-application-service-watcher.o -MD -MP -MF $(DEPDIR)/indicator_application_service-application-service-watcher.Tpo -c -o indicator_application_service-application-service-watcher.o `test -f 'application-service-watcher.c' || echo '$(srcdir)/'`application-service-watcher.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-application-service-watcher.Tpo $(DEPDIR)/indicator_application_service-application-service-watcher.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-watcher.c' object='indicator_application_service-application-service-watcher.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-application-service-watcher.o `test -f 'application-service-watcher.c' || echo '$(srcdir)/'`application-service-watcher.c - -indicator_application_service-application-service-watcher.obj: application-service-watcher.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-application-service-watcher.obj -MD -MP -MF $(DEPDIR)/indicator_application_service-application-service-watcher.Tpo -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` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-application-service-watcher.Tpo $(DEPDIR)/indicator_application_service-application-service-watcher.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application-service-watcher.c' object='indicator_application_service-application-service-watcher.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-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-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 -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='app-indicator-enum-types.c' object='indicator_application_service-app-indicator-enum-types.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-app-indicator-enum-types.o `test -f 'app-indicator-enum-types.c' || echo '$(srcdir)/'`app-indicator-enum-types.c - -indicator_application_service-app-indicator-enum-types.obj: 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.obj -MD -MP -MF $(DEPDIR)/indicator_application_service-app-indicator-enum-types.Tpo -c -o indicator_application_service-app-indicator-enum-types.obj `if test -f 'app-indicator-enum-types.c'; then $(CYGPATH_W) 'app-indicator-enum-types.c'; else $(CYGPATH_W) '$(srcdir)/app-indicator-enum-types.c'; fi` -@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 +libappindicator3_la-gen-notification-item.xml.lo: gen-notification-item.xml.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-gen-notification-item.xml.lo -MD -MP -MF $(DEPDIR)/libappindicator3_la-gen-notification-item.xml.Tpo -c -o libappindicator3_la-gen-notification-item.xml.lo `test -f 'gen-notification-item.xml.c' || echo '$(srcdir)/'`gen-notification-item.xml.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator3_la-gen-notification-item.xml.Tpo $(DEPDIR)/libappindicator3_la-gen-notification-item.xml.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='app-indicator-enum-types.c' object='indicator_application_service-app-indicator-enum-types.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gen-notification-item.xml.c' object='libappindicator3_la-gen-notification-item.xml.lo' libtool=yes @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-app-indicator-enum-types.obj `if test -f 'app-indicator-enum-types.c'; then $(CYGPATH_W) 'app-indicator-enum-types.c'; else $(CYGPATH_W) '$(srcdir)/app-indicator-enum-types.c'; fi` +@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-gen-notification-item.xml.lo `test -f 'gen-notification-item.xml.c' || echo '$(srcdir)/'`gen-notification-item.xml.c -indicator_application_service-generate-id.o: generate-id.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-generate-id.o -MD -MP -MF $(DEPDIR)/indicator_application_service-generate-id.Tpo -c -o indicator_application_service-generate-id.o `test -f 'generate-id.c' || echo '$(srcdir)/'`generate-id.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-generate-id.Tpo $(DEPDIR)/indicator_application_service-generate-id.Po +libappindicator3_la-gen-notification-watcher.xml.lo: gen-notification-watcher.xml.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-gen-notification-watcher.xml.lo -MD -MP -MF $(DEPDIR)/libappindicator3_la-gen-notification-watcher.xml.Tpo -c -o libappindicator3_la-gen-notification-watcher.xml.lo `test -f 'gen-notification-watcher.xml.c' || echo '$(srcdir)/'`gen-notification-watcher.xml.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libappindicator3_la-gen-notification-watcher.xml.Tpo $(DEPDIR)/libappindicator3_la-gen-notification-watcher.xml.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generate-id.c' object='indicator_application_service-generate-id.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gen-notification-watcher.xml.c' object='libappindicator3_la-gen-notification-watcher.xml.lo' libtool=yes @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-generate-id.o `test -f 'generate-id.c' || echo '$(srcdir)/'`generate-id.c - -indicator_application_service-generate-id.obj: generate-id.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_application_service_CFLAGS) $(CFLAGS) -MT indicator_application_service-generate-id.obj -MD -MP -MF $(DEPDIR)/indicator_application_service-generate-id.Tpo -c -o indicator_application_service-generate-id.obj `if test -f 'generate-id.c'; then $(CYGPATH_W) 'generate-id.c'; else $(CYGPATH_W) '$(srcdir)/generate-id.c'; fi` -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_application_service-generate-id.Tpo $(DEPDIR)/indicator_application_service-generate-id.Po -@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generate-id.c' object='indicator_application_service-generate-id.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-generate-id.obj `if test -f 'generate-id.c'; then $(CYGPATH_W) 'generate-id.c'; else $(CYGPATH_W) '$(srcdir)/generate-id.c'; fi` +@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-gen-notification-watcher.xml.lo `test -f 'gen-notification-watcher.xml.c' || echo '$(srcdir)/'`gen-notification-watcher.xml.c mostlyclean-libtool: -rm -f *.lo @@ -1134,9 +910,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) $(DATA) $(HEADERS) 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)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(vapidir)" "$(DESTDIR)$(libappindicator3includedir)" "$(DESTDIR)$(libappindicatorincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) @@ -1170,8 +946,7 @@ maintainer-clean-generic: -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am -clean-am: clean-applicationlibLTLIBRARIES clean-generic \ - clean-libLTLIBRARIES clean-libexecPROGRAMS clean-libtool \ +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am @@ -1192,7 +967,7 @@ info: info-am info-am: -install-data-am: install-applicationlibLTLIBRARIES install-girDATA \ +install-data-am: install-girDATA \ install-libappindicator3includeHEADERS \ install-libappindicatorincludeHEADERS install-pkgconfigDATA \ install-typelibDATA install-vapiDATA @@ -1201,7 +976,7 @@ install-dvi: install-dvi-am install-dvi-am: -install-exec-am: install-libLTLIBRARIES install-libexecPROGRAMS +install-exec-am: install-libLTLIBRARIES install-html: install-html-am @@ -1241,39 +1016,34 @@ ps: ps-am ps-am: -uninstall-am: uninstall-applicationlibLTLIBRARIES uninstall-girDATA \ - uninstall-libLTLIBRARIES \ +uninstall-am: uninstall-girDATA uninstall-libLTLIBRARIES \ uninstall-libappindicator3includeHEADERS \ uninstall-libappindicatorincludeHEADERS \ - uninstall-libexecPROGRAMS uninstall-pkgconfigDATA \ - uninstall-typelibDATA uninstall-vapiDATA + uninstall-pkgconfigDATA uninstall-typelibDATA \ + uninstall-vapiDATA .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 \ +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES 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-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-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-girDATA \ uninstall-libLTLIBRARIES \ uninstall-libappindicator3includeHEADERS \ uninstall-libappindicatorincludeHEADERS \ - uninstall-libexecPROGRAMS uninstall-pkgconfigDATA \ - uninstall-typelibDATA uninstall-vapiDATA + uninstall-pkgconfigDATA uninstall-typelibDATA \ + uninstall-vapiDATA stamp-enum-types: $(glib_enum_headers) @@ -1317,19 +1087,15 @@ $(marshal_c): $(marshal_h) && cp xgen-mc $(marshal_c) \ && rm -f xgen-mc -%-client.h: %.xml - dbus-binding-tool \ - --prefix=_$(notdir $(subst -,_,$(<:.xml=)))_client \ - --mode=glib-client \ - --output=$@ \ - $< - -%-server.h: %.xml - dbus-binding-tool \ - --prefix=_$(notdir $(subst -,_,$(<:.xml=)))_server \ - --mode=glib-server \ - --output=$@ \ - $< +gen-%.xml.h: %.xml + @echo "Building $@ from $<" + @echo "extern const char * _$(subst -,_,$(subst .,_,$(basename $<)));" > $@ + +gen-%.xml.c: %.xml + @echo "Building $@ from $<" + @echo "const char * _$(subst -,_,$(subst .,_,$(basename $<))) = " > $@ + @sed -e "s:\":\\\\\":g" -e s:^:\": -e s:\$$:\\\\n\": $< >> $@ + @echo ";" >> $@ ######################### # GObject Introsepction diff --git a/src/app-indicator.c b/src/app-indicator.c index 98663c1..babdaf5 100644 --- a/src/app-indicator.c +++ b/src/app-indicator.c @@ -31,22 +31,18 @@ License version 3 and version 2.1 along with this program. If not, see #include "config.h" #endif -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-bindings.h> - +#include <libdbusmenu-glib/menuitem.h> #include <libdbusmenu-glib/server.h> -#ifdef HAVE_GTK3 -#include <libdbusmenu-gtk3/client.h> -#else #include <libdbusmenu-gtk/client.h> -#endif + +#include <libindicator/indicator-desktop-shortcuts.h> #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 "gen-notification-watcher.xml.h" +#include "gen-notification-item.xml.h" #include "dbus-shared.h" #include "generate-id.h" @@ -89,9 +85,13 @@ struct _AppIndicatorPrivate { gint fallback_timer; /* Fun stuff */ - DBusGProxy *watcher_proxy; - DBusGConnection *connection; - DBusGProxy * dbus_proxy; + GDBusProxy *watcher_proxy; + GDBusConnection *connection; + guint dbus_registration; + gchar * path; + + /* Might be used */ + IndicatorDesktopShortcuts * shorties; }; /* Signals Stuff */ @@ -100,7 +100,6 @@ enum { NEW_ATTENTION_ICON, NEW_STATUS, NEW_LABEL, - X_NEW_LABEL, CONNECTION_CHANGED, NEW_ICON_THEME_PATH, LAST_SIGNAL @@ -118,14 +117,11 @@ enum { 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 + PROP_DBUS_MENU_SERVER }; /* The strings so that they can be slowly looked up. */ @@ -135,28 +131,28 @@ enum { #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) +#define PROP_DBUS_MENU_SERVER_S "dbus-menu-server" /* 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 */ +/* Globals */ +static GDBusNodeInfo * item_node_info = NULL; +static GDBusInterfaceInfo * item_interface_info = NULL; +static GDBusNodeInfo * watcher_node_info = NULL; +static GDBusInterfaceInfo * watcher_interface_info = NULL; + /* Boiler plate */ static void app_indicator_class_init (AppIndicatorClass *klass); static void app_indicator_init (AppIndicator *self); @@ -168,7 +164,7 @@ static void app_indicator_get_property (GObject * object, guint prop_id, GValue /* 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 register_service_cb (GObject * obj, GAsyncResult * res, gpointer user_data); static void start_fallback_timer (AppIndicator * self, gboolean disable_timeout); static gboolean fallback_timer_expire (gpointer data); static GtkStatusIcon * fallback (AppIndicator * self); @@ -177,11 +173,19 @@ 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 watcher_owner_changed (GObject * obj, GParamSpec * pspec, gpointer user_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); +static GVariant * bus_get_prop (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * property, GError ** error, gpointer user_data); +static void bus_creation (GObject * obj, GAsyncResult * res, gpointer user_data); +static void bus_watcher_ready (GObject * obj, GAsyncResult * res, gpointer user_data); + +static const GDBusInterfaceVTable item_interface_table = { + method_call: NULL, /* No methods on this object */ + get_property: bus_get_prop, + set_property: NULL /* No properties that can be set */ +}; /* GObject type */ G_DEFINE_TYPE (AppIndicator, app_indicator, G_TYPE_OBJECT); @@ -290,19 +294,6 @@ app_indicator_class_init (AppIndicatorClass *klass) 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 @@ -369,46 +360,19 @@ app_indicator_class_init (AppIndicatorClass *klass) "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: + AppIndicator:dbus-menu-server: - Wrapper for #AppIndicator:label. Please use that in all of your - code. + A way to get the internal dbusmenu server if it is available. + This should only be used for testing. */ 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, + PROP_DBUS_MENU_SERVER, + g_param_spec_object (PROP_DBUS_MENU_SERVER_S, + "The internal DBusmenu Server", + "DBusmenu server which is available for testing the application indicators.", + DBUSMENU_TYPE_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); /* Signals */ @@ -474,22 +438,6 @@ app_indicator_class_init (AppIndicatorClass *klass) _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: @@ -521,9 +469,42 @@ app_indicator_class_init (AppIndicatorClass *klass) 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); + /* DBus interfaces */ + if (item_node_info == NULL) { + GError * error = NULL; + + item_node_info = g_dbus_node_info_new_for_xml(_notification_item, &error); + if (error != NULL) { + g_error("Unable to parse Notification Item DBus interface: %s", error->message); + g_error_free(error); + } + } + + if (item_interface_info == NULL && item_node_info != NULL) { + item_interface_info = g_dbus_node_info_lookup_interface(item_node_info, NOTIFICATION_ITEM_DBUS_IFACE); + + if (item_interface_info == NULL) { + g_error("Unable to find interface '" NOTIFICATION_ITEM_DBUS_IFACE "'"); + } + } + + if (watcher_node_info == NULL) { + GError * error = NULL; + + watcher_node_info = g_dbus_node_info_new_for_xml(_notification_watcher, &error); + if (error != NULL) { + g_error("Unable to parse Notification Item DBus interface: %s", error->message); + g_error_free(error); + } + } + + if (watcher_interface_info == NULL && watcher_node_info != NULL) { + watcher_interface_info = g_dbus_node_info_lookup_interface(watcher_node_info, NOTIFICATION_WATCHER_DBUS_IFACE); + + if (watcher_interface_info == NULL) { + g_error("Unable to find interface '" NOTIFICATION_WATCHER_DBUS_IFACE "'"); + } + } return; } @@ -549,20 +530,17 @@ app_indicator_init (AppIndicator *self) priv->watcher_proxy = NULL; priv->connection = NULL; - priv->dbus_proxy = NULL; + priv->dbus_registration = 0; + priv->path = 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); + priv->shorties = NULL; + + /* Start getting the session bus */ + g_object_ref(self); /* ref for the bus creation callback */ + g_bus_get(G_BUS_TYPE_SESSION, NULL, bus_creation, self); g_signal_connect(G_OBJECT(gtk_icon_theme_get_default()), "changed", G_CALLBACK(theme_changed_cb), self); @@ -580,6 +558,16 @@ app_indicator_dispose (GObject *object) AppIndicator *self = APP_INDICATOR (object); AppIndicatorPrivate *priv = self->priv; + if (priv->dbus_registration != 0) { + g_dbus_connection_unregister_object(priv->connection, priv->dbus_registration); + priv->dbus_registration = 0; + } + + if (priv->shorties != NULL) { + g_object_unref(G_OBJECT(priv->shorties)); + priv->shorties = NULL; + } + if (priv->status != APP_INDICATOR_STATUS_PASSIVE) { app_indicator_set_status(self, APP_INDICATOR_STATUS_PASSIVE); } @@ -610,18 +598,12 @@ app_indicator_dispose (GObject *object) 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->menuservice != NULL) { + g_object_unref (priv->menuservice); } 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_signal_handlers_disconnect_by_func(G_OBJECT(priv->watcher_proxy), watcher_owner_changed, self); g_object_unref(G_OBJECT(priv->watcher_proxy)); priv->watcher_proxy = NULL; @@ -630,7 +612,7 @@ app_indicator_dispose (GObject *object) } if (priv->connection != NULL) { - dbus_g_connection_unref(priv->connection); + g_object_unref(G_OBJECT(priv->connection)); priv->connection = NULL; } @@ -643,8 +625,8 @@ app_indicator_dispose (GObject *object) static void app_indicator_finalize (GObject *object) { - AppIndicator * self = APP_INDICATOR(object); - AppIndicatorPrivate *priv = self->priv; + 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); @@ -685,6 +667,11 @@ app_indicator_finalize (GObject *object) priv->label_guide = NULL; } + if (priv->path != NULL) { + g_free(priv->path); + priv->path = NULL; + } + G_OBJECT_CLASS (app_indicator_parent_class)->finalize (object); return; } @@ -755,7 +742,6 @@ app_indicator_set_property (GObject * object, guint prop_id, const GValue * valu check_connect (self); break; - case PROP_X_LABEL: case PROP_LABEL: { gchar * oldlabel = priv->label; priv->label = g_value_dup_string(value); @@ -774,7 +760,6 @@ app_indicator_set_property (GObject * object, guint prop_id, const GValue * valu } break; } - case PROP_X_LABEL_GUIDE: case PROP_LABEL_GUIDE: { gchar * oldguide = priv->label_guide; priv->label_guide = g_value_dup_string(value); @@ -793,11 +778,18 @@ app_indicator_set_property (GObject * object, guint prop_id, const GValue * valu } break; } - case PROP_X_ORDERING_INDEX: case PROP_ORDERING_INDEX: priv->ordering_index = g_value_get_uint(value); break; + case PROP_DBUS_MENU_SERVER: + if (priv->menuservice != NULL) { + g_object_unref (priv->menuservice); + } + gpointer val = g_value_dup_object(value); + priv->menuservice = DBUSMENU_SERVER(val); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -841,35 +833,37 @@ app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GPa 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: { + gboolean connected = FALSE; - case PROP_CONNECTED: - g_value_set_boolean (value, priv->watcher_proxy != NULL ? TRUE : FALSE); - break; + if (priv->watcher_proxy != NULL) { + gchar * name = g_dbus_proxy_get_name_owner(priv->watcher_proxy); + if (name != NULL) { + connected = TRUE; + g_free(name); + } + } + + g_value_set_boolean (value, connected); + 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; + case PROP_DBUS_MENU_SERVER: + g_value_set_object(value, priv->menuservice); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -878,6 +872,81 @@ app_indicator_get_property (GObject * object, guint prop_id, GValue * value, GPa return; } +/* DBus bus has been created, well maybe, but we got a call + back about it so we need to check into it. */ +static void +bus_creation (GObject * obj, GAsyncResult * res, gpointer user_data) +{ + GError * error = NULL; + + GDBusConnection * connection = g_bus_get_finish(res, &error); + if (error != NULL) { + g_warning("Unable to get the session bus: %s", error->message); + g_error_free(error); + g_object_unref(G_OBJECT(user_data)); + return; + } + + AppIndicator * app = APP_INDICATOR(user_data); + app->priv->connection = connection; + + /* If the connection was blocking the exporting of the + object this function will export everything. */ + check_connect(app); + + g_object_unref(G_OBJECT(app)); + + return; +} + +/* DBus is asking for a property so we should figure out what it + wants and try and deliver. */ +static GVariant * +bus_get_prop (GDBusConnection * connection, const gchar * sender, const gchar * path, const gchar * interface, const gchar * property, GError ** error, gpointer user_data) +{ + g_return_val_if_fail(IS_APP_INDICATOR(user_data), NULL); + AppIndicator * app = APP_INDICATOR(user_data); + AppIndicatorPrivate *priv = app->priv; + + if (g_strcmp0(property, "Id") == 0) { + return g_variant_new_string(app->priv->id); + } else if (g_strcmp0(property, "Category") == 0) { + GEnumValue *enum_value; + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_CATEGORY), priv->category); + return g_variant_new_string(enum_value->value_nick); + } else if (g_strcmp0(property, "Status") == 0) { + GEnumValue *enum_value; + enum_value = g_enum_get_value ((GEnumClass *) g_type_class_ref (APP_INDICATOR_TYPE_INDICATOR_STATUS), priv->status); + return g_variant_new_string(enum_value->value_nick); + } else if (g_strcmp0(property, "IconName") == 0) { + return g_variant_new_string(priv->icon_name); + } else if (g_strcmp0(property, "AttentionIconName") == 0) { + return g_variant_new_string(priv->attention_icon_name); + } else if (g_strcmp0(property, "IconThemePath") == 0) { + return g_variant_new_string(priv->icon_theme_path); + } else if (g_strcmp0(property, "Menu") == 0) { + 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); + GVariant * var = g_variant_new("o", g_value_get_string(&strval)); + g_value_unset(&strval); + return var; + } else { + return g_variant_new("o", "/"); + } + } else if (g_strcmp0(property, "XAyatanaLabel") == 0) { + return g_variant_new_string(priv->label); + } else if (g_strcmp0(property, "XAyatanaLabelGuide") == 0) { + return g_variant_new_string(priv->label_guide); + } else if (g_strcmp0(property, "XAyatanaOrderingIndex") == 0) { + return g_variant_new_uint32(priv->ordering_index); + } + + *error = g_error_new(0, 0, "Unknown property: %s", property); + return NULL; +} + /* Sends the label changed signal and resets the source ID */ static gboolean signal_label_change_idle (gpointer user_data) @@ -885,14 +954,27 @@ signal_label_change_idle (gpointer user_data) AppIndicator * self = (AppIndicator *)user_data; AppIndicatorPrivate *priv = self->priv; + gchar * label = priv->label != NULL ? priv->label : ""; + gchar * guide = priv->label_guide != NULL ? priv->label_guide : ""; + 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); + label, guide, TRUE); + if (priv->dbus_registration != 0 && priv->connection != NULL) { + GError * error = NULL; + + g_dbus_connection_emit_signal(priv->connection, + NULL, + priv->path, + NOTIFICATION_ITEM_DBUS_IFACE, + "XAyatanaNewLabel", + g_variant_new("(ss)", label, guide), + &error); + + if (error != NULL) { + g_warning("Unable to send signal for NewIcon: %s", error->message); + g_error_free(error); + } + } priv->label_change_idle = 0; @@ -923,93 +1005,197 @@ 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 a connection? */ + if (priv->connection == NULL) return; + + /* If we already have a proxy, let's see if it has someone + implementing it. If not, we can't do much more than to + do nothing. */ + if (priv->watcher_proxy != NULL) { + gchar * name = g_dbus_proxy_get_name_owner(priv->watcher_proxy); + if (name == NULL) { + return; + } + g_free(name); + } /* 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); + if (priv->path == NULL) { + priv->path = g_strdup_printf(DEFAULT_ITEM_PATH "/%s", priv->clean_id); + } + + if (priv->dbus_registration == 0) { + GError * error = NULL; + priv->dbus_registration = g_dbus_connection_register_object(priv->connection, + priv->path, + item_interface_info, + &item_interface_table, + self, + NULL, + &error); + if (error != NULL) { + g_warning("Unable to register object on path '%s': %s", priv->path, error->message); + g_error_free(error); + return; + } + } - dbus_g_connection_register_g_object(priv->connection, - path, - G_OBJECT(self)); + /* NOTE: It's really important the order here. We make sure to *publish* + the object on the bus and *then* get the proxy. The reason is that we + want to ensure all the filters are setup before talking to the watcher + and that's where the order is important. */ + + g_object_ref(G_OBJECT(self)); /* Unref in watcher_ready() */ + if (priv->watcher_proxy == NULL) { + /* Build Watcher Proxy */ + g_dbus_proxy_new(priv->connection, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, /* We don't use these, don't bother with them */ + watcher_interface_info, + NOTIFICATION_WATCHER_DBUS_ADDR, + NOTIFICATION_WATCHER_DBUS_OBJ, + NOTIFICATION_WATCHER_DBUS_IFACE, + NULL, /* cancellable */ + bus_watcher_ready, + self); + } else { + bus_watcher_ready(NULL, NULL, self); + } + return; +} + +/* Callback for when the watcher proxy has been created, or not + but we got called none-the-less. */ +static void +bus_watcher_ready (GObject * obj, GAsyncResult * res, gpointer user_data) +{ 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); + + GDBusProxy * proxy = NULL; + if (res != NULL) { + proxy = g_dbus_proxy_new_finish(res, &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); + + if (IS_APP_INDICATOR(user_data)) { + start_fallback_timer(APP_INDICATOR(user_data), FALSE); + } + + g_object_unref(G_OBJECT(user_data)); 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); + AppIndicator * app = APP_INDICATOR(user_data); - /* Emit the AppIndicator::connection-changed signal*/ - g_signal_emit (self, signals[CONNECTION_CHANGED], 0, TRUE); + if (res != NULL) { + app->priv->watcher_proxy = proxy; + + /* Setting up a signal to watch when the unique name + changes */ + g_signal_connect(G_OBJECT(app->priv->watcher_proxy), "notify::g-name-owner", G_CALLBACK(watcher_owner_changed), user_data); + } + + /* Let's insure that someone is on the other side, else we're + still in a fallback scenario. */ + gchar * name = g_dbus_proxy_get_name_owner(app->priv->watcher_proxy); + if (name == NULL) { + start_fallback_timer(APP_INDICATOR(user_data), FALSE); + g_object_unref(G_OBJECT(user_data)); + return; + } + + /* g_object_unref(G_OBJECT(user_data)); */ + /* Why is this commented out? Oh, wait, we don't want to + unref in this case because we need to ref again to do the + register callback. Let's not unref to ref again. */ + + g_dbus_proxy_call(app->priv->watcher_proxy, + "RegisterStatusNotifierItem", + g_variant_new("(s)", app->priv->path), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, /* cancelable */ + register_service_cb, + user_data); return; } -/* A function that gets called when the watcher dies. Like - dies dies. Not our friend anymore. */ +/* Watching for when the name owner changes on the interface + to know whether we should be connected or not. */ static void -watcher_proxy_destroyed (GObject * object, gpointer data) +watcher_owner_changed (GObject * obj, GParamSpec * pspec, gpointer user_data) { - AppIndicator * self = APP_INDICATOR(data); + AppIndicator * self = APP_INDICATOR(user_data); g_return_if_fail(self != NULL); + g_return_if_fail(self->priv->watcher_proxy != NULL); - dbus_g_connection_unregister_g_object(self->priv->connection, - G_OBJECT(self)); - self->priv->watcher_proxy = NULL; + gchar * name = g_dbus_proxy_get_name_owner(self->priv->watcher_proxy); + + if (name == NULL) { + /* Emit the AppIndicator::connection-changed signal*/ + g_signal_emit (self, signals[CONNECTION_CHANGED], 0, FALSE); + + start_fallback_timer(self, FALSE); + } else { + if (self->priv->fallback_timer != 0) { + /* Stop the timer */ + g_source_remove(self->priv->fallback_timer); + self->priv->fallback_timer = 0; + } + + check_connect(self); + } - /* 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) +register_service_cb (GObject * obj, GAsyncResult * res, gpointer user_data) { - g_return_if_fail(IS_APP_INDICATOR(data)); - AppIndicatorPrivate * priv = APP_INDICATOR(data)->priv; + GError * error = NULL; + GVariant * returns = g_dbus_proxy_call_finish(G_DBUS_PROXY(obj), res, &error); + + /* We don't care about any return values */ + if (returns != NULL) { + g_variant_unref(returns); + } 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); + start_fallback_timer(APP_INDICATOR(user_data), TRUE); + g_object_unref(G_OBJECT(user_data)); + return; } + g_return_if_fail(IS_APP_INDICATOR(user_data)); + AppIndicator * app = APP_INDICATOR(user_data); + AppIndicatorPrivate * priv = app->priv; + + /* Emit the AppIndicator::connection-changed signal*/ + g_signal_emit (app, signals[CONNECTION_CHANGED], 0, TRUE); + if (priv->status_icon) { - AppIndicatorClass * class = APP_INDICATOR_GET_CLASS(data); + AppIndicatorClass * class = APP_INDICATOR_GET_CLASS(app); if (class->unfallback != NULL) { - class->unfallback(APP_INDICATOR(data), priv->status_icon); + class->unfallback(app, priv->status_icon); priv->status_icon = NULL; } } + g_object_unref(G_OBJECT(user_data)); return; } @@ -1024,89 +1210,6 @@ category_from_enum (AppIndicatorCategory 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 @@ -1128,11 +1231,6 @@ start_fallback_timer (AppIndicator * self, gboolean disable_timeout) 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 { @@ -1174,6 +1272,28 @@ static void theme_changed_cb (GtkIconTheme * theme, gpointer user_data) { g_signal_emit (user_data, signals[NEW_ICON], 0, TRUE); + + AppIndicator * self = (AppIndicator *)user_data; + AppIndicatorPrivate *priv = self->priv; + + if (priv->dbus_registration != 0 && priv->connection != NULL) { + GError * error = NULL; + + g_dbus_connection_emit_signal(priv->connection, + NULL, + priv->path, + NOTIFICATION_ITEM_DBUS_IFACE, + "NewIcon", + NULL, + &error); + + if (error != NULL) { + g_warning("Unable to send signal for NewIcon: %s", error->message); + g_error_free(error); + } + } + + return; } /* Creates a StatusIcon that can be used when the application @@ -1377,15 +1497,33 @@ app_indicator_new_with_path (const gchar *id, void app_indicator_set_status (AppIndicator *self, AppIndicatorStatus status) { - g_return_if_fail (IS_APP_INDICATOR (self)); + 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); + 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); - } + self->priv->status = status; + g_signal_emit (self, signals[NEW_STATUS], 0, value->value_nick); + + if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) { + GError * error = NULL; + + g_dbus_connection_emit_signal(self->priv->connection, + NULL, + self->priv->path, + NOTIFICATION_ITEM_DBUS_IFACE, + "NewStatus", + g_variant_new("(s)", value->value_nick), + &error); + + if (error != NULL) { + g_warning("Unable to send signal for NewStatus: %s", error->message); + g_error_free(error); + } + } + } + + return; } /** @@ -1398,20 +1536,36 @@ app_indicator_set_status (AppIndicator *self, AppIndicatorStatus status) 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); + 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); + 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); + self->priv->attention_icon_name = g_strdup(icon_name); - g_signal_emit (self, signals[NEW_ATTENTION_ICON], 0, TRUE); - } + g_signal_emit (self, signals[NEW_ATTENTION_ICON], 0, TRUE); - return; + if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) { + GError * error = NULL; + + g_dbus_connection_emit_signal(self->priv->connection, + NULL, + self->priv->path, + NOTIFICATION_ITEM_DBUS_IFACE, + "NewAttentionIcon", + NULL, + &error); + + if (error != NULL) { + g_warning("Unable to send signal for NewAttentionIcon: %s", error->message); + g_error_free(error); + } + } + } + + return; } /** @@ -1427,20 +1581,36 @@ app_indicator_set_attention_icon (AppIndicator *self, const gchar *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); + 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); + 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); + self->priv->icon_name = g_strdup(icon_name); - g_signal_emit (self, signals[NEW_ICON], 0, TRUE); - } + g_signal_emit (self, signals[NEW_ICON], 0, TRUE); - return; + if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) { + GError * error = NULL; + + g_dbus_connection_emit_signal(self->priv->connection, + NULL, + self->priv->path, + NOTIFICATION_ITEM_DBUS_IFACE, + "NewIcon", + NULL, + &error); + + if (error != NULL) { + g_warning("Unable to send signal for NewIcon: %s", error->message); + g_error_free(error); + } + } + } + + return; } /** @@ -1478,19 +1648,35 @@ app_indicator_set_label (AppIndicator *self, const gchar * label, const gchar * void app_indicator_set_icon_theme_path (AppIndicator *self, const gchar *icon_theme_path) { - g_return_if_fail (IS_APP_INDICATOR (self)); + 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); + 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); + 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)); - } + g_signal_emit (self, signals[NEW_ICON_THEME_PATH], 0, self->priv->icon_theme_path, TRUE); - return; + if (self->priv->dbus_registration != 0 && self->priv->connection != NULL) { + GError * error = NULL; + + g_dbus_connection_emit_signal(self->priv->connection, + NULL, + self->priv->path, + NOTIFICATION_ITEM_DBUS_IFACE, + "NewIconThemePath", + g_variant_new("(s)", self->priv->icon_theme_path), + &error); + + if (error != NULL) { + g_warning("Unable to send signal for NewIconThemePath: %s", error->message); + g_error_free(error); + } + } + } + + return; } static void @@ -2110,9 +2296,88 @@ 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); + return _generate_id(self->priv->category, self->priv->id); } else { return self->priv->ordering_index; } } +#define APP_INDICATOR_SHORTY_NICK "app-indicator-shorty-nick" + +/* Callback when an item from the desktop shortcuts gets + called. */ +static void +shorty_activated_cb (DbusmenuMenuitem * mi, guint timestamp, gpointer user_data) +{ + gchar * nick = g_object_get_data(G_OBJECT(mi), APP_INDICATOR_SHORTY_NICK); + g_return_if_fail(nick != NULL); + + g_return_if_fail(IS_APP_INDICATOR(user_data)); + AppIndicator * self = APP_INDICATOR(user_data); + AppIndicatorPrivate *priv = self->priv; + + g_return_if_fail(priv->shorties != NULL); + + indicator_desktop_shortcuts_nick_exec(priv->shorties, nick); + + return; +} + +/** + app_indicator_build_menu_from_desktop: + @self: The #AppIndicator object to use + @desktop_file: A path to the desktop file to build the menu from + @desktop_profile: Which entries should be used from the desktop file + + This function allows for building the Application Indicator menu + from a static desktop file. +*/ +void +app_indicator_build_menu_from_desktop (AppIndicator * self, const gchar * desktop_file, const gchar * desktop_profile) +{ + g_return_if_fail(IS_APP_INDICATOR(self)); + AppIndicatorPrivate *priv = self->priv; + + /* Build a new shortcuts object */ + if (priv->shorties != NULL) { + g_object_unref(priv->shorties); + priv->shorties = NULL; + } + priv->shorties = indicator_desktop_shortcuts_new(desktop_file, desktop_profile); + g_return_if_fail(priv->shorties != NULL); + + const gchar ** nicks = indicator_desktop_shortcuts_get_nicks(priv->shorties); + int nick_num; + + /* Place the items on a dbusmenu */ + DbusmenuMenuitem * root = dbusmenu_menuitem_new(); + + for (nick_num = 0; nicks[nick_num] != NULL; nick_num++) { + DbusmenuMenuitem * item = dbusmenu_menuitem_new(); + g_object_set_data(G_OBJECT(item), APP_INDICATOR_SHORTY_NICK, (gpointer)nicks[nick_num]); + + gchar * name = indicator_desktop_shortcuts_nick_get_name(priv->shorties, nicks[nick_num]); + dbusmenu_menuitem_property_set(item, DBUSMENU_MENUITEM_PROP_LABEL, name); + g_free(name); + + g_signal_connect(G_OBJECT(item), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(shorty_activated_cb), self); + + dbusmenu_menuitem_child_append(root, item); + } + + /* Swap it if needed */ + 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); + + if (priv->menu != NULL) { + g_object_unref(G_OBJECT(priv->menu)); + priv->menu = NULL; + } + + return; +} diff --git a/src/app-indicator.h b/src/app-indicator.h index ce152bb..3e159db 100644 --- a/src/app-indicator.h +++ b/src/app-indicator.h @@ -280,6 +280,11 @@ const gchar * app_indicator_get_label (AppIndicator * const gchar * app_indicator_get_label_guide (AppIndicator *self); guint32 app_indicator_get_ordering_index (AppIndicator *self); +/* Helpers */ +void app_indicator_build_menu_from_desktop (AppIndicator * self, + const gchar * desktop_file, + const gchar * desktop_profile); + G_END_DECLS /** diff --git a/src/application-service-appstore.c b/src/application-service-appstore.c deleted file mode 100644 index e3befff..0000000 --- a/src/application-service-appstore.c +++ /dev/null @@ -1,1305 +0,0 @@ -/* -An object that stores the registration of all the application -indicators. It also communicates this to the indicator visualization. - -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 the GNU General Public License version 3, 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 GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <dbus/dbus-glib.h> -#include "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); - -#include "application-service-server.h" - -#define NOTIFICATION_ITEM_PROP_ID "Id" -#define NOTIFICATION_ITEM_PROP_CATEGORY "Category" -#define NOTIFICATION_ITEM_PROP_STATUS "Status" -#define NOTIFICATION_ITEM_PROP_ICON_NAME "IconName" -#define NOTIFICATION_ITEM_PROP_AICON_NAME "AttentionIconName" -#define NOTIFICATION_ITEM_PROP_ICON_THEME_PATH "IconThemePath" -#define NOTIFICATION_ITEM_PROP_MENU "Menu" -#define NOTIFICATION_ITEM_PROP_LABEL "XAyatanaLabel" -#define NOTIFICATION_ITEM_PROP_LABEL_GUIDE "XAyatanaLabelGuide" -#define NOTIFICATION_ITEM_PROP_ORDERING_INDEX "XAyatanaOrderingIndex" - -#define NOTIFICATION_ITEM_SIG_NEW_ICON "NewIcon" -#define NOTIFICATION_ITEM_SIG_NEW_AICON "NewAttentionIcon" -#define NOTIFICATION_ITEM_SIG_NEW_STATUS "NewStatus" -#define NOTIFICATION_ITEM_SIG_NEW_LABEL "XAyatanaNewLabel" -#define NOTIFICATION_ITEM_SIG_NEW_ICON_THEME_PATH "NewIconThemePath" - -#define OVERRIDE_GROUP_NAME "Ordering Index Overrides" -#define OVERRIDE_FILE_NAME "ordering-override.keyfile" - -/* Private Stuff */ -struct _ApplicationServiceAppstorePrivate { - DBusGConnection * bus; - GList * applications; - GList * approvers; - GHashTable * ordering_overrides; -}; - -typedef enum { - VISIBLE_STATE_HIDDEN, - VISIBLE_STATE_SHOWN -} visible_state_t; - -#define STATE2STRING(x) ((x) == VISIBLE_STATE_HIDDEN ? "hidden" : "visible") - -typedef struct _Approver Approver; -struct _Approver { - DBusGProxy * proxy; - gboolean destroy_by_proxy; -}; - -typedef struct _Application Application; -struct _Application { - gchar * id; - gchar * category; - gchar * dbus_name; - gchar * dbus_object; - ApplicationServiceAppstore * appstore; /* not ref'd */ - DBusGProxy * dbus_proxy; - DBusGProxy * prop_proxy; - gboolean validated; /* Whether we've gotten all the parameters and they look good. */ - AppIndicatorStatus status; - gchar * icon; - gchar * aicon; - gchar * menu; - gchar * icon_theme_path; - gchar * label; - gchar * guide; - gboolean currently_free; - guint ordering_index; - GList * approved_by; - visible_state_t visible_state; -}; - -#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 -}; - -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); -static void application_service_appstore_dispose (GObject *object); -static void application_service_appstore_finalize (GObject *object); -static gint app_sort_func (gconstpointer a, gconstpointer b, gpointer userdata); -static void load_override_file (GHashTable * hash, const gchar * filename); -static AppIndicatorStatus string_to_status(const gchar * status_string); -static void apply_status (Application * app); -static AppIndicatorCategory string_to_cat(const gchar * cat_string); -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); - -G_DEFINE_TYPE (ApplicationServiceAppstore, application_service_appstore, G_TYPE_OBJECT); - -static void -application_service_appstore_class_init (ApplicationServiceAppstoreClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (ApplicationServiceAppstorePrivate)); - - 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); - - return; -} - -static void -application_service_appstore_init (ApplicationServiceAppstore *self) -{ - - ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (self); - - priv->applications = NULL; - priv->approvers = NULL; - - priv->ordering_overrides = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); - - load_override_file(priv->ordering_overrides, DATADIR "/" OVERRIDE_FILE_NAME); - 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); - - GError * error = NULL; - priv->bus = dbus_g_bus_get(DBUS_BUS_STARTER, &error); - if (error != NULL) { - g_error("Unable to get session bus: %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; - - return; -} - -static void -application_service_appstore_dispose (GObject *object) -{ - ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE(object)->priv; - - while (priv->applications != NULL) { - application_service_appstore_application_remove(APPLICATION_SERVICE_APPSTORE(object), - ((Application *)priv->applications->data)->dbus_name, - ((Application *)priv->applications->data)->dbus_object); - } - - if (priv->approvers != NULL) { - g_list_foreach(priv->approvers, approver_free, object); - g_list_free(priv->approvers); - priv->approvers = NULL; - } - - G_OBJECT_CLASS (application_service_appstore_parent_class)->dispose (object); - return; -} - -static void -application_service_appstore_finalize (GObject *object) -{ - ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE(object)->priv; - - if (priv->ordering_overrides != NULL) { - g_hash_table_destroy(priv->ordering_overrides); - priv->ordering_overrides = NULL; - } - - G_OBJECT_CLASS (application_service_appstore_parent_class)->finalize (object); - return; -} - -/* Loads the file and adds the override entries to the table - of overrides */ -static void -load_override_file (GHashTable * hash, const gchar * filename) -{ - g_return_if_fail(hash != NULL); - g_return_if_fail(filename != NULL); - - if (!g_file_test(filename, G_FILE_TEST_EXISTS)) { - return; - } - - g_debug("Loading overrides from: '%s'", filename); - - GError * error = NULL; - GKeyFile * keyfile = g_key_file_new(); - g_key_file_load_from_file(keyfile, filename, G_KEY_FILE_NONE, &error); - - if (error != NULL) { - g_warning("Unable to load keyfile '%s' because: %s", filename, error->message); - g_error_free(error); - g_key_file_free(keyfile); - return; - } - - gchar ** keys = g_key_file_get_keys(keyfile, OVERRIDE_GROUP_NAME, NULL, &error); - if (error != NULL) { - g_warning("Unable to get keys from keyfile '%s' because: %s", filename, error->message); - g_error_free(error); - g_key_file_free(keyfile); - return; - } - - gchar * key = keys[0]; - gint i; - - for (i = 0; (key = keys[i]) != NULL; i++) { - GError * valerror = NULL; - gint val = g_key_file_get_integer(keyfile, OVERRIDE_GROUP_NAME, key, &valerror); - - if (valerror != NULL) { - g_warning("Unable to get key '%s' out of file '%s' because: %s", key, filename, valerror->message); - g_error_free(valerror); - continue; - } - g_debug("%s: override '%s' with value '%d'", filename, key, val); - - g_hash_table_insert(hash, g_strdup(key), GINT_TO_POINTER(val)); - } - g_strfreev(keys); - g_key_file_free(keyfile); - - return; -} - -/* 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 - move on up to sending this onto the indicator. */ -static void -get_all_properties_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data) -{ - if (error != NULL) { - g_warning("Unable to get properties: %s", error->message); - /* TODO: We need to free all the application data here */ - return; - } - - Application * app = (Application *)data; - - 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) { - 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; - } - - app->validated = TRUE; - - 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))); - - ApplicationServiceAppstorePrivate * priv = app->appstore->priv; - - app->icon = g_value_dup_string(g_hash_table_lookup(properties, NOTIFICATION_ITEM_PROP_ICON_NAME)); - - 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 (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 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(""); - } - - 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); - } else { - app->ordering_index = g_value_get_uint(ordering_index_data); - } - } 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(""); - } - - 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(""); - } - - 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); - - apply_status(app); - - return; -} - -/* Check the application against an approver */ -static void -check_with_old_approver (gpointer papprove, gpointer papp) -{ - /* Funny the parallels, eh? */ - check_with_new_approver(papp, papprove); - return; -} - -/* Simple translation function -- could be optimized */ -static AppIndicatorStatus -string_to_status(const gchar * status_string) -{ - GEnumClass * klass = G_ENUM_CLASS(g_type_class_ref(APP_INDICATOR_TYPE_INDICATOR_STATUS)); - g_return_val_if_fail(klass != NULL, APP_INDICATOR_STATUS_PASSIVE); - - AppIndicatorStatus retval = APP_INDICATOR_STATUS_PASSIVE; - - GEnumValue * val = g_enum_get_value_by_nick(klass, status_string); - if (val == NULL) { - g_warning("Unrecognized status '%s' assuming passive.", status_string); - } else { - retval = (AppIndicatorStatus)val->value; - } - - g_type_class_unref(klass); - - return retval; -} - -/* Simple translation function -- could be optimized */ -static AppIndicatorCategory -string_to_cat(const gchar * cat_string) -{ - GEnumClass * klass = G_ENUM_CLASS(g_type_class_ref(APP_INDICATOR_TYPE_INDICATOR_CATEGORY)); - g_return_val_if_fail(klass != NULL, APP_INDICATOR_CATEGORY_OTHER); - - AppIndicatorCategory retval = APP_INDICATOR_CATEGORY_OTHER; - - GEnumValue * val = g_enum_get_value_by_nick(klass, cat_string); - if (val == NULL) { - g_warning("Unrecognized status '%s' assuming other.", cat_string); - } else { - retval = (AppIndicatorCategory)val->value; - } - - g_type_class_unref(klass); - - return retval; -} - - -/* A small helper function to get the position of an application - in the app list of the applications that are visible. */ -static gint -get_position (Application * app) { - ApplicationServiceAppstore * appstore = app->appstore; - ApplicationServiceAppstorePrivate * priv = appstore->priv; - - GList * lapp; - gint count; - - /* Go through the list and try to find ours */ - for (lapp = priv->applications, count = 0; lapp != NULL; lapp = g_list_next(lapp), count++) { - if (lapp->data == app) { - break; - } - - /* If the selected app isn't visible let's not - count it's position */ - Application * thisapp = (Application *)(lapp->data); - if (thisapp->visible_state == VISIBLE_STATE_HIDDEN) { - count--; - } - } - - if (lapp == NULL) { - g_warning("Unable to find position for app '%s'", app->id); - return -1; - } - - return count; -} - -/* A simple global function for dealing with freeing the information - in an Application structure */ -static void -application_free (Application * app) -{ - if (app == NULL) return; - g_debug("Application free '%s'", app->id); - - /* Handle the case where this could be called by unref'ing one of - the proxy objects. */ - if (app->currently_free) return; - app->currently_free = TRUE; - - if (app->dbus_proxy) { - g_object_unref(app->dbus_proxy); - } - if (app->prop_proxy) { - g_object_unref(app->prop_proxy); - } - - if (app->id != NULL) { - g_free(app->id); - } - if (app->category != NULL) { - g_free(app->category); - } - if (app->dbus_name != NULL) { - g_free(app->dbus_name); - } - if (app->dbus_object != NULL) { - g_free(app->dbus_object); - } - if (app->icon != NULL) { - g_free(app->icon); - } - if (app->aicon != NULL) { - g_free(app->aicon); - } - if (app->menu != NULL) { - g_free(app->menu); - } - if (app->icon_theme_path != NULL) { - g_free(app->icon_theme_path); - } - if (app->label != NULL) { - g_free(app->label); - } - if (app->guide != NULL) { - g_free(app->guide); - } - if (app->approved_by != NULL) { - g_list_free(app->approved_by); - } - - g_free(app); - return; -} - -/* Gets called when the proxy is destroyed, which is usually when it - drops off of the bus. */ -static void -application_removed_cb (DBusGProxy * proxy, gpointer userdata) -{ - Application * app = (Application *)userdata; - 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; -} - -/* This function takes two Application structure - pointers and uses their ordering index to compare them. */ -static gint -app_sort_func (gconstpointer a, gconstpointer b, gpointer userdata) -{ - Application * appa = (Application *)a; - Application * appb = (Application *)b; - return (appb->ordering_index/2) - (appa->ordering_index/2); -} - -/* 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. */ -static void -apply_status (Application * app) -{ - ApplicationServiceAppstore * appstore = app->appstore; - ApplicationServiceAppstorePrivate * priv = appstore->priv; - - /* g_debug("Applying status. Status: %d Approved by: %d Approvers: %d Visible: %d", app->status, g_list_length(app->approved_by), g_list_length(priv->approvers), app->visible_state); */ - - visible_state_t goal_state = VISIBLE_STATE_HIDDEN; - - if (app->status != APP_INDICATOR_STATUS_PASSIVE && - g_list_length(app->approved_by) >= g_list_length(priv->approvers)) { - goal_state = VISIBLE_STATE_SHOWN; - } - - /* Nothing needs to change, we're good */ - if (app->visible_state == goal_state /* ) { */ - && goal_state == VISIBLE_STATE_HIDDEN) { - /* TODO: Uhg, this is a little wrong in that we're going to - send an icon every time the status changes and the indicator - is visible even though it might not be updating. But, at - this point we need a small patch that is harmless. In the - future we need to track which icon is shown and remove the - duplicate message. */ - return; - } - - 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); - } else { - /* Figure out which icon we should be using */ - gchar * newicon = app->icon; - if (app->status == APP_INDICATOR_STATUS_ATTENTION && app->aicon != NULL && app->aicon[0] != '\0') { - newicon = app->aicon; - } - - /* 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); - } 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); - } - } - - app->visible_state = goal_state; - - 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) -{ - Application * app = (Application *)data; - if (!app->validated) return; - - app->status = string_to_status(status); - apply_status(app); - - return; -} - -/* 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) -{ - 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); - app->icon_theme_path = g_strdup(icon_theme_path); - - if (app->visible_state != VISIBLE_STATE_HIDDEN) { - 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); - } - } - - return; -} - -/* 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) -{ - Application * app = (Application *)data; - if (!app->validated) return; - - gboolean changed = FALSE; - - if (g_strcmp0(app->label, label) != 0) { - changed = TRUE; - if (app->label != NULL) { - g_free(app->label); - app->label = NULL; - } - app->label = g_strdup(label); - } - - if (g_strcmp0(app->guide, guide) != 0) { - changed = TRUE; - if (app->guide != NULL) { - g_free(app->guide); - app->guide = NULL; - } - app->guide = g_strdup(guide); - } - - if (changed) { - 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); - } - - return; -} - -/* Adding a new NotificationItem object from DBus in to the - appstore. First, we need to get the information on it - though. */ -void -application_service_appstore_application_add (ApplicationServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) -{ - g_debug("Adding new application: %s:%s", dbus_name, dbus_object); - - /* Make sure we got a sensible request */ - 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); - return; - } - - /* Build the application entry. This will be carried - along until we're sure we've got everything. */ - app = g_new0(Application, 1); - - app->validated = FALSE; - app->dbus_name = g_strdup(dbus_name); - app->dbus_object = g_strdup(dbus_object); - app->appstore = appstore; - app->status = APP_INDICATOR_STATUS_PASSIVE; - app->icon = NULL; - app->aicon = NULL; - app->menu = NULL; - app->icon_theme_path = NULL; - app->label = NULL; - app->guide = NULL; - app->currently_free = FALSE; - app->ordering_index = 0; - app->approved_by = NULL; - app->visible_state = VISIBLE_STATE_HIDDEN; - - /* Get the DBus proxy for the NotificationItem interface */ - 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); - - 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_free(error); - g_free(app); - return; - } - - /* 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); - - /* 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); - - 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_free(error); - g_object_unref(app->dbus_proxy); - g_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); - - /* We're returning, nothing is yet added until the properties - come back and give us more info. */ - return; -} - -/* Looks for an application in the list of applications */ -static Application * -find_application (ApplicationServiceAppstore * appstore, const gchar * address, const gchar * object) -{ - ApplicationServiceAppstorePrivate * priv = appstore->priv; - GList * listpntr; - - for (listpntr = priv->applications; listpntr != NULL; listpntr = g_list_next(listpntr)) { - Application * app = (Application *)listpntr->data; - - if (!g_strcmp0(app->dbus_name, address) && !g_strcmp0(app->dbus_object, object)) { - return app; - } - } - - return NULL; -} - -/* Removes an application. Currently only works for the apps - that are shown. */ -void -application_service_appstore_application_remove (ApplicationServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) -{ - 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'); - - Application * app = find_application(appstore, dbus_name, dbus_object); - if (app != NULL) { - application_removed_cb(NULL, app); - } else { - g_warning("Unable to find application %s:%s", dbus_name, dbus_object); - } - - return; -} - -gchar** -application_service_appstore_application_get_list (ApplicationServiceAppstore * appstore) -{ - ApplicationServiceAppstorePrivate * priv = appstore->priv; - gchar ** out; - gchar ** outpntr; - GList * listpntr; - - out = g_new(gchar*, g_list_length(priv->applications) + 1); - - for (listpntr = priv->applications, outpntr = out; listpntr != NULL; listpntr = g_list_next(listpntr), ++outpntr) { - Application * app = (Application *)listpntr->data; - *outpntr = g_strdup_printf("%s%s", app->dbus_name, app->dbus_object); - } - *outpntr = 0; - return out; -} - -/* Creates a basic appstore object and attaches the - LRU file object to it. */ -ApplicationServiceAppstore * -application_service_appstore_new (void) -{ - ApplicationServiceAppstore * appstore = APPLICATION_SERVICE_APPSTORE(g_object_new(APPLICATION_SERVICE_APPSTORE_TYPE, NULL)); - return appstore; -} - -/* DBus Interface */ -static gboolean -_application_service_server_get_applications (ApplicationServiceAppstore * appstore, GPtrArray ** apps, GError ** error) -{ - ApplicationServiceAppstorePrivate * priv = appstore->priv; - - *apps = g_ptr_array_new(); - GList * listpntr; - gint position = 0; - - for (listpntr = priv->applications; listpntr != NULL; listpntr = g_list_next(listpntr)) { - Application * app = (Application *)listpntr->data; - if (app->visible_state == VISIBLE_STATE_HIDDEN) { - 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); - } - - return TRUE; -} - -/* Removes and approver from our list of approvers and - then sees if that changes our status. Most likely this - could make us visible if this approver rejected us. */ -static void -remove_approver (gpointer papp, gpointer pproxy) -{ - Application * app = (Application *)papp; - app->approved_by = g_list_remove(app->approved_by, pproxy); - apply_status(app); - return; -} - -/* Frees the data associated with an approver */ -static void -approver_free (gpointer papprover, gpointer user_data) -{ - Approver * approver = (Approver *)papprover; - g_return_if_fail(approver != NULL); - - ApplicationServiceAppstore * appstore = APPLICATION_SERVICE_APPSTORE(user_data); - g_list_foreach(appstore->priv->applications, remove_approver, approver->proxy); - - if (approver->proxy != NULL) { - if (!approver->destroy_by_proxy) { - g_object_unref(approver->proxy); - } - approver->proxy = 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) -{ - if (error == NULL) { - g_debug("Approver responded: %s", OUT_approved ? "approve" : "rejected"); - } else { - g_debug("Approver responded error: %s", error->message); - } - - Application * app = (Application *)userdata; - - if (OUT_approved || error != NULL) { - app->approved_by = g_list_prepend(app->approved_by, proxy); - } else { - app->approved_by = g_list_remove(app->approved_by, proxy); - } - - apply_status(app); - return; -} - -/* Run the applications through the new approver */ -static void -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); - - return; -} - -/* 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) -{ - 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); - - if (app == NULL) { - g_warning("Unable to update approver status of application (%s:%s) as it was not found", address, path); - return; - } - - if (new_status) { - app->approved_by = g_list_prepend(app->approved_by, proxy); - } else { - app->approved_by = g_list_remove(app->approved_by, proxy); - } - apply_status(app); - - return; -} - -/* Adds a new approver to the app store */ -void -application_service_appstore_approver_add (ApplicationServiceAppstore * appstore, const gchar * dbus_name, const gchar * dbus_object) -{ - g_return_if_fail(IS_APPLICATION_SERVICE_APPSTORE(appstore)); - g_return_if_fail(dbus_name != NULL); - g_return_if_fail(dbus_object != NULL); - ApplicationServiceAppstorePrivate * priv = APPLICATION_SERVICE_APPSTORE_GET_PRIVATE (appstore); - - Approver * approver = g_new0(Approver, 1); - approver->destroy_by_proxy = FALSE; - - GError * error = NULL; - approver->proxy = dbus_g_proxy_new_for_name_owner(priv->bus, - dbus_name, - dbus_object, - NOTIFICATION_APPROVER_DBUS_IFACE, - &error); - if (error != NULL) { - g_warning("Unable to get approver interface on '%s:%s' : %s", dbus_name, dbus_object, 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); - - priv->approvers = g_list_prepend(priv->approvers, approver); - - g_list_foreach(priv->applications, check_with_new_approver, approver); - - return; -} - diff --git a/src/application-service-appstore.h b/src/application-service-appstore.h deleted file mode 100644 index aa2824b..0000000 --- a/src/application-service-appstore.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -An object that stores the registration of all the application -indicators. It also communicates this to the indicator visualization. - -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 the GNU General Public License version 3, 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 GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __APPLICATION_SERVICE_APPSTORE_H__ -#define __APPLICATION_SERVICE_APPSTORE_H__ - -#include <glib.h> -#include <glib-object.h> - -G_BEGIN_DECLS - -#define APPLICATION_SERVICE_APPSTORE_TYPE (application_service_appstore_get_type ()) -#define APPLICATION_SERVICE_APPSTORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstore)) -#define APPLICATION_SERVICE_APPSTORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstoreClass)) -#define IS_APPLICATION_SERVICE_APPSTORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), APPLICATION_SERVICE_APPSTORE_TYPE)) -#define IS_APPLICATION_SERVICE_APPSTORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), APPLICATION_SERVICE_APPSTORE_TYPE)) -#define APPLICATION_SERVICE_APPSTORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APPLICATION_SERVICE_APPSTORE_TYPE, ApplicationServiceAppstoreClass)) - -typedef struct _ApplicationServiceAppstore ApplicationServiceAppstore; -typedef struct _ApplicationServiceAppstoreClass ApplicationServiceAppstoreClass; -typedef struct _ApplicationServiceAppstorePrivate ApplicationServiceAppstorePrivate; - -struct _ApplicationServiceAppstoreClass { - GObjectClass parent_class; - - void (*application_added) (ApplicationServiceAppstore * appstore, gchar *, gint, gchar *, gchar *, gpointer); - void (*application_removed) (ApplicationServiceAppstore * appstore, gint, gpointer); - void (*application_icon_changed)(ApplicationServiceAppstore * appstore, gint, const gchar *, gpointer); - void (*application_icon_theme_path_changed)(ApplicationServiceAppstore * appstore, gint, const gchar *, gpointer); - void (*application_label_changed)(ApplicationServiceAppstore * appstore, gint, const gchar *, const gchar *, gpointer); -}; - -struct _ApplicationServiceAppstore { - GObject parent; - - ApplicationServiceAppstorePrivate * priv; -}; - -ApplicationServiceAppstore * application_service_appstore_new (void); -GType application_service_appstore_get_type (void); -void application_service_appstore_application_add (ApplicationServiceAppstore * appstore, - const gchar * dbus_name, - const gchar * dbus_object); -void application_service_appstore_application_remove (ApplicationServiceAppstore * appstore, - const gchar * dbus_name, - const gchar * dbus_object); -void application_service_appstore_approver_add (ApplicationServiceAppstore * appstore, - const gchar * dbus_name, - const gchar * dbus_object); -gchar** application_service_appstore_application_get_list (ApplicationServiceAppstore * appstore); - -G_END_DECLS - -#endif diff --git a/src/application-service-watcher.c b/src/application-service-watcher.c deleted file mode 100644 index 50b0be9..0000000 --- a/src/application-service-watcher.c +++ /dev/null @@ -1,302 +0,0 @@ -/* -An object implementing the NotificationWatcher interface and passes -the information into the app-store. - -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 the GNU General Public License version 3, 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 GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> -#include <dbus/dbus-glib-bindings.h> -#include "application-service-watcher.h" -#include "dbus-shared.h" - -/* Enum for the properties so that they can be quickly - found and looked up. */ -enum { - PROP_0, - PROP_PROTOCOL_VERSION, - PROP_IS_STATUS_NOTIFIER_HOST_REGISTERED, - PROP_REGISTERED_STATUS_NOTIFIER_ITEMS -}; - -/* The strings so that they can be slowly looked up. */ -#define PROP_PROTOCOL_VERSION_S "protocol-version" -#define PROP_IS_STATUS_NOTIFIER_HOST_REGISTERED_S "is-status-notifier-host-registered" -#define PROP_REGISTERED_STATUS_NOTIFIER_ITEMS_S "registered-status-notifier-items" - -#define CURRENT_PROTOCOL_VERSION 0 - -static gboolean _notification_watcher_server_register_status_notifier_item (ApplicationServiceWatcher * appwatcher, const gchar * service, DBusGMethodInvocation * method); -static gboolean _notification_watcher_server_register_status_notifier_host (ApplicationServiceWatcher * appwatcher, const gchar * host); -static gboolean _notification_watcher_server_x_ayatana_register_notification_approver (ApplicationServiceWatcher * appwatcher, const gchar * path, const GArray * categories, DBusGMethodInvocation * method); -static void get_name_cb (DBusGProxy * proxy, guint status, GError * error, gpointer data); - -#include "notification-watcher-server.h" - -/* Private Stuff */ -typedef struct _ApplicationServiceWatcherPrivate ApplicationServiceWatcherPrivate; -struct _ApplicationServiceWatcherPrivate { - ApplicationServiceAppstore * appstore; - DBusGProxy * dbus_proxy; -}; - -#define APPLICATION_SERVICE_WATCHER_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), APPLICATION_SERVICE_WATCHER_TYPE, ApplicationServiceWatcherPrivate)) - -/* Signals Stuff */ -enum { - STATUS_NOTIFIER_ITEM_REGISTERED, - STATUS_NOTIFIER_ITEM_UNREGISTERED, - STATUS_NOTIFIER_HOST_REGISTERED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -/* GObject stuff */ -static void application_service_watcher_class_init (ApplicationServiceWatcherClass *klass); -static void application_service_watcher_init (ApplicationServiceWatcher *self); -static void application_service_watcher_dispose (GObject *object); -static void application_service_watcher_finalize (GObject *object); -static void application_service_watcher_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void application_service_watcher_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); - -G_DEFINE_TYPE (ApplicationServiceWatcher, application_service_watcher, G_TYPE_OBJECT); - -static void -application_service_watcher_class_init (ApplicationServiceWatcherClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (ApplicationServiceWatcherPrivate)); - - object_class->dispose = application_service_watcher_dispose; - object_class->finalize = application_service_watcher_finalize; - - /* Property funcs */ - object_class->set_property = application_service_watcher_set_property; - object_class->get_property = application_service_watcher_get_property; - - /* Properties */ - g_object_class_install_property (object_class, - PROP_PROTOCOL_VERSION, - g_param_spec_int(PROP_PROTOCOL_VERSION_S, - "Protocol Version", - "Which version of the StatusNotifierProtocol this watcher implements", - 0, G_MAXINT, - CURRENT_PROTOCOL_VERSION, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (object_class, - PROP_IS_STATUS_NOTIFIER_HOST_REGISTERED, - g_param_spec_boolean(PROP_IS_STATUS_NOTIFIER_HOST_REGISTERED_S, - "Is StatusNotifierHost Registered", - "True if there is at least one StatusNotifierHost registered", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (object_class, - PROP_REGISTERED_STATUS_NOTIFIER_ITEMS, - g_param_spec_boxed(PROP_REGISTERED_STATUS_NOTIFIER_ITEMS_S, - "Registered StatusNotifierItems", - "The list of StatusNotifierItems registered to this watcher", - G_TYPE_STRV, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - /* Signals */ - signals[STATUS_NOTIFIER_ITEM_REGISTERED] = g_signal_new ("status-notifier-item-registered", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationServiceWatcherClass, status_notifier_item_registered), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); - signals[STATUS_NOTIFIER_ITEM_UNREGISTERED] = g_signal_new ("status-notifier-item-unregistered", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationServiceWatcherClass, status_notifier_item_unregistered), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING, G_TYPE_NONE); - signals[STATUS_NOTIFIER_HOST_REGISTERED] = g_signal_new ("status-notifier-host-registered", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ApplicationServiceWatcherClass, status_notifier_host_registered), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0, G_TYPE_NONE); - - dbus_g_object_type_install_info(APPLICATION_SERVICE_WATCHER_TYPE, - &dbus_glib__notification_watcher_server_object_info); - - return; -} - -static void -application_service_watcher_init (ApplicationServiceWatcher *self) -{ - ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(self); - - priv->appstore = NULL; - - GError * error = NULL; - DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); - if (error != NULL) { - g_error("Unable to get session bus: %s", error->message); - g_error_free(error); - return; - } - - dbus_g_connection_register_g_object(session_bus, - NOTIFICATION_WATCHER_DBUS_OBJ, - G_OBJECT(self)); - - priv->dbus_proxy = dbus_g_proxy_new_for_name_owner(session_bus, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS, - &error); - if (error != NULL) { - g_error("Ah, can't get proxy to dbus: %s", error->message); - g_error_free(error); - return; - } - - org_freedesktop_DBus_request_name_async(priv->dbus_proxy, - NOTIFICATION_WATCHER_DBUS_ADDR, - DBUS_NAME_FLAG_DO_NOT_QUEUE, - get_name_cb, - self); - - return; -} - -static void -application_service_watcher_dispose (GObject *object) -{ - ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(object); - - if (priv->appstore != NULL) { - g_object_unref(G_OBJECT(priv->appstore)); - priv->appstore = NULL; - } - - G_OBJECT_CLASS (application_service_watcher_parent_class)->dispose (object); - return; -} - -static void -application_service_watcher_finalize (GObject *object) -{ - - G_OBJECT_CLASS (application_service_watcher_parent_class)->finalize (object); - return; -} - -static void -application_service_watcher_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) -{ - /* There are no writable properties for now */ -} - -static void -application_service_watcher_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) -{ - ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(object); - switch (prop_id) { - case PROP_PROTOCOL_VERSION: - g_value_set_int (value, CURRENT_PROTOCOL_VERSION); - break; - case PROP_IS_STATUS_NOTIFIER_HOST_REGISTERED: - g_value_set_boolean (value, TRUE); - break; - case PROP_REGISTERED_STATUS_NOTIFIER_ITEMS: - g_value_set_boxed (value, application_service_appstore_application_get_list(priv->appstore)); - break; - } -} - -ApplicationServiceWatcher * -application_service_watcher_new (ApplicationServiceAppstore * appstore) -{ - GObject * obj = g_object_new(APPLICATION_SERVICE_WATCHER_TYPE, NULL); - ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(obj); - priv->appstore = appstore; - g_object_ref(G_OBJECT(priv->appstore)); - return APPLICATION_SERVICE_WATCHER(obj); -} - -static gboolean -_notification_watcher_server_register_status_notifier_item (ApplicationServiceWatcher * appwatcher, const gchar * service, DBusGMethodInvocation * method) -{ - ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(appwatcher); - - if (service[0] == '/') { - application_service_appstore_application_add(priv->appstore, - dbus_g_method_get_sender(method), - service); - } else { - application_service_appstore_application_add(priv->appstore, - service, - NOTIFICATION_ITEM_DEFAULT_OBJ); - } - - dbus_g_method_return(method, G_TYPE_NONE); - return TRUE; -} - -static gboolean -_notification_watcher_server_register_status_notifier_host (ApplicationServiceWatcher * appwatcher, const gchar * host) -{ - - return FALSE; -} - -/* Function to handle the return of the get name. There isn't a whole - lot that can be done, but we're atleast going to tell people. */ -static void -get_name_cb (DBusGProxy * proxy, guint status, GError * error, gpointer data) -{ - if (error != NULL) { - g_warning("Unable to get watcher name '%s' because: %s", NOTIFICATION_WATCHER_DBUS_ADDR, error->message); - return; - } - - if (status != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER && - status != DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER) { - g_warning("Unable to get watcher name '%s'", NOTIFICATION_WATCHER_DBUS_ADDR); - return; - } - - return; -} - -static gboolean -_notification_watcher_server_x_ayatana_register_notification_approver (ApplicationServiceWatcher * appwatcher, const gchar * path, const GArray * categories, DBusGMethodInvocation * method) -{ - ApplicationServiceWatcherPrivate * priv = APPLICATION_SERVICE_WATCHER_GET_PRIVATE(appwatcher); - - application_service_appstore_approver_add(priv->appstore, - dbus_g_method_get_sender(method), - path); - - dbus_g_method_return(method, G_TYPE_NONE); - return TRUE; -} diff --git a/src/application-service-watcher.h b/src/application-service-watcher.h deleted file mode 100644 index 6c430db..0000000 --- a/src/application-service-watcher.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -An object implementing the NotificationWatcher interface and passes -the information into the app-store. - -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 the GNU General Public License version 3, 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 GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __APPLICATION_SERVICE_WATCHER_H__ -#define __APPLICATION_SERVICE_WATCHER_H__ - -#include <glib.h> -#include <glib-object.h> - -#include "application-service-appstore.h" - -G_BEGIN_DECLS - -#define APPLICATION_SERVICE_WATCHER_TYPE (application_service_watcher_get_type ()) -#define APPLICATION_SERVICE_WATCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), APPLICATION_SERVICE_WATCHER_TYPE, ApplicationServiceWatcher)) -#define APPLICATION_SERVICE_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), APPLICATION_SERVICE_WATCHER_TYPE, ApplicationServiceWatcherClass)) -#define IS_APPLICATION_SERVICE_WATCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), APPLICATION_SERVICE_WATCHER_TYPE)) -#define IS_APPLICATION_SERVICE_WATCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), APPLICATION_SERVICE_WATCHER_TYPE)) -#define APPLICATION_SERVICE_WATCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), APPLICATION_SERVICE_WATCHER_TYPE, ApplicationServiceWatcherClass)) - -typedef struct _ApplicationServiceWatcher ApplicationServiceWatcher; -typedef struct _ApplicationServiceWatcherClass ApplicationServiceWatcherClass; - -struct _ApplicationServiceWatcherClass { - GObjectClass parent_class; - - /* Signals */ - void (*status_notifier_item_registered) (ApplicationServiceWatcher * watcher, gchar * object, gpointer data); - void (*status_notifier_item_unregistered) (ApplicationServiceWatcher * watcher, gchar * object, gpointer data); - void (*status_notifier_host_registered) (ApplicationServiceWatcher * watcher, gpointer data); -}; - -struct _ApplicationServiceWatcher { - GObject parent; -}; - -GType application_service_watcher_get_type (void); -ApplicationServiceWatcher * application_service_watcher_new (ApplicationServiceAppstore * appstore); - -G_END_DECLS - -#endif diff --git a/src/application-service.c b/src/application-service.c deleted file mode 100644 index 94e7d2e..0000000 --- a/src/application-service.c +++ /dev/null @@ -1,78 +0,0 @@ -/* -The core file for the service that starts up all the objects we need -and houses our main loop. - -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 the GNU General Public License version 3, 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 GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - - -#include "libindicator/indicator-service.h" -#include "notification-item-client.h" -#include "application-service-appstore.h" -#include "application-service-watcher.h" -#include "dbus-shared.h" - -/* The base main loop */ -static GMainLoop * mainloop = NULL; -/* Where the application registry lives */ -static ApplicationServiceAppstore * appstore = NULL; -/* Interface for applications */ -static ApplicationServiceWatcher * watcher = NULL; -/* The service management interface */ -static IndicatorService * service = NULL; - -/* Recieves the disonnection signal from the service - object and closes the mainloop. */ -static void -service_disconnected (IndicatorService * service, gpointer data) -{ - g_debug("Service disconnected"); - if (mainloop != NULL) { - g_main_loop_quit(mainloop); - } - return; -} - -/* Builds up the core objects and puts us spinning into - a main loop. */ -int -main (int argc, char ** argv) -{ - g_type_init(); - - /* Bring us up as a basic indicator service */ - service = indicator_service_new(INDICATOR_APPLICATION_DBUS_ADDR); - g_signal_connect(G_OBJECT(service), INDICATOR_SERVICE_SIGNAL_SHUTDOWN, G_CALLBACK(service_disconnected), NULL); - - /* Building our app store */ - appstore = application_service_appstore_new(); - - /* Adding a watcher for the Apps coming up */ - watcher = application_service_watcher_new(appstore); - - /* Building and executing our main loop */ - mainloop = g_main_loop_new(NULL, FALSE); - g_main_loop_run(mainloop); - - /* Unref'ing all the objects */ - g_object_unref(G_OBJECT(watcher)); - g_object_unref(G_OBJECT(appstore)); - g_object_unref(G_OBJECT(service)); - - return 0; -} diff --git a/src/application-service.xml b/src/application-service.xml deleted file mode 100644 index 031bf68..0000000 --- a/src/application-service.xml +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -An interface for communication between the service and indicator. - -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 the GNU General Public License version 3, 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 GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see <http://www.gnu.org/licenses/>. ---> -<node name="/"> - <interface name="org.ayatana.indicator.application.service"> -<!-- Properties --> - <!-- None currently --> - -<!-- Methods --> - <method name="GetApplications"> - <arg type="a(sisosss)" name="applications" direction="out" /> - </method> - -<!-- Signals --> - <signal name="ApplicationAdded"> - <arg type="s" name="iconname" direction="out" /> - <arg type="i" name="position" direction="out" /> - <arg type="s" name="dbusaddress" direction="out" /> - <arg type="o" name="dbusobject" direction="out" /> - <arg type="s" name="iconpath" direction="out" /> - <arg type="s" name="label" direction="out" /> - <arg type="s" name="labelguide" direction="out" /> - </signal> - <signal name="ApplicationRemoved"> - <arg type="i" name="position" direction="out" /> - </signal> - <signal name="ApplicationIconChanged"> - <arg type="i" name="position" direction="out" /> - <arg type="s" name="icon_name" direction="out" /> - </signal> - <signal name="ApplicationIconThemePathChanged"> - <arg type="i" name="position" direction="out" /> - <arg type="s" name="icon_theme_path" direction="out" /> - </signal> - <signal name="ApplicationLabelChanged"> - <arg type="i" name="position" direction="out" /> - <arg type="s" name="label" direction="out" /> - <arg type="s" name="guide" direction="out" /> - </signal> - </interface> -</node> 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/gen-notification-item.xml.c b/src/gen-notification-item.xml.c new file mode 100644 index 0000000..5243f9e --- /dev/null +++ b/src/gen-notification-item.xml.c @@ -0,0 +1,41 @@ +const char * _notification_item = +"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<node name=\"/StatusNotifierItem\">\n" +" <interface name=\"org.kde.StatusNotifierItem\">\n" +"\n" +"<!-- Properties -->\n" +" <property name=\"Id\" type=\"s\" access=\"read\" />\n" +" <property name=\"Category\" type=\"s\" access=\"read\" />\n" +" <property name=\"Status\" type=\"s\" access=\"read\" />\n" +" <property name=\"IconName\" type=\"s\" access=\"read\" />\n" +" <property name=\"AttentionIconName\" type=\"s\" access=\"read\" />\n" +" <!-- An additional path to add to the theme search path\n" +" to find the icons specified above. -->\n" +" <property name=\"IconThemePath\" type=\"s\" access=\"read\" />\n" +" <property name=\"Menu\" type=\"o\" access=\"read\" />\n" +" <property name=\"XAyatanaLabel\" type=\"s\" access=\"read\" />\n" +" <property name=\"XAyatanaLabelGuide\" type=\"s\" access=\"read\" />\n" +" <property name=\"XAyatanaOrderingIndex\" type=\"u\" access=\"read\" />\n" +"\n" +"<!-- Methods -->\n" +" <!-- None currently -->\n" +"\n" +"<!-- Signals -->\n" +" <signal name=\"NewIcon\">\n" +" </signal>\n" +" <signal name=\"NewIconThemePath\">\n" +" <arg type=\"s\" name=\"icon_theme_path\" direction=\"out\" />\n" +" </signal>\n" +" <signal name=\"NewAttentionIcon\">\n" +" </signal>\n" +" <signal name=\"NewStatus\">\n" +" <arg type=\"s\" name=\"status\" direction=\"out\" />\n" +" </signal>\n" +" <signal name=\"XAyatanaNewLabel\">\n" +" <arg type=\"s\" name=\"label\" direction=\"out\" />\n" +" <arg type=\"s\" name=\"guide\" direction=\"out\" />\n" +" </signal>\n" +"\n" +" </interface>\n" +"</node>\n" +; diff --git a/src/gen-notification-item.xml.h b/src/gen-notification-item.xml.h new file mode 100644 index 0000000..f62b42e --- /dev/null +++ b/src/gen-notification-item.xml.h @@ -0,0 +1 @@ +extern const char * _notification_item; diff --git a/src/gen-notification-watcher.xml.c b/src/gen-notification-watcher.xml.c new file mode 100644 index 0000000..605195c --- /dev/null +++ b/src/gen-notification-watcher.xml.c @@ -0,0 +1,39 @@ +const char * _notification_watcher = +"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<node name=\"/StatusNotifierWatcher\">\n" +" <interface name=\"org.kde.StatusNotifierWatcher\">\n" +"\n" +"<!-- Properties -->\n" +" <property name=\"ProtocolVersion\" type=\"i\" access=\"read\" />\n" +" <property name=\"IsStatusNotifierHostRegistered\" type=\"b\" access=\"read\" />\n" +" <property name=\"RegisteredStatusNotifierItems\" type=\"as\" access=\"read\" />\n" +"\n" +"<!-- Methods -->\n" +" <method name=\"RegisterStatusNotifierItem\">\n" +" <annotation name=\"org.freedesktop.DBus.GLib.Async\" value=\"true\" />\n" +" <arg type=\"s\" name=\"service\" direction=\"in\" />\n" +" </method>\n" +" <method name=\"RegisterStatusNotifierHost\">\n" +" <arg type=\"s\" name=\"service\" direction=\"in\" />\n" +" </method>\n" +" <method name=\"XAyatanaRegisterNotificationApprover\">\n" +" <annotation name=\"org.freedesktop.DBus.GLib.Async\" value=\"true\" />\n" +" <!-- The path where to find the approver interface -->\n" +" <arg type=\"o\" name=\"path\" direction=\"in\" />\n" +" <!-- List of categories to approve, none represents all -->\n" +" <arg type=\"as\" name=\"categories\" direction=\"in\" />\n" +" </method>\n" +"\n" +"<!-- Signals -->\n" +" <signal name=\"StatusNotifierItemRegistered\">\n" +" <arg type=\"s\" name=\"service\" direction=\"out\" />\n" +" </signal>\n" +" <signal name=\"StatusNotifierItemUnregistered\">\n" +" <arg type=\"s\" name=\"service\" direction=\"out\" />\n" +" </signal>\n" +" <signal name=\"StatusNotifierHostRegistered\">\n" +" </signal>\n" +"\n" +" </interface>\n" +"</node>\n" +; diff --git a/src/gen-notification-watcher.xml.h b/src/gen-notification-watcher.xml.h new file mode 100644 index 0000000..cf9affa --- /dev/null +++ b/src/gen-notification-watcher.xml.h @@ -0,0 +1 @@ +extern const char * _notification_watcher; diff --git a/src/generate-id.c b/src/generate-id.c index 14d762e..6389678 100644 --- a/src/generate-id.c +++ b/src/generate-id.c @@ -24,7 +24,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define MULTIPLIER 32 guint32 -generate_id (const AppIndicatorCategory catenum, const gchar * id) +_generate_id (const AppIndicatorCategory catenum, const gchar * id) { guchar category = 0; guchar first = 0; diff --git a/src/generate-id.h b/src/generate-id.h index 9d3167d..2c31921 100644 --- a/src/generate-id.h +++ b/src/generate-id.h @@ -25,6 +25,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <glib.h> #include "app-indicator.h" -guint32 generate_id (const AppIndicatorCategory category, const gchar * id); +guint32 _generate_id (const AppIndicatorCategory category, const gchar * id); #endif /* __GENERATE_ID_H__ */ diff --git a/src/indicator-application.c b/src/indicator-application.c deleted file mode 100644 index ecf19e8..0000000 --- a/src/indicator-application.c +++ /dev/null @@ -1,879 +0,0 @@ -/* -The indicator application visualization object. It takes the information -given by the service and turns it into real-world pixels that users can -actually use. Well, GTK does that, but this asks nicely. - -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 the GNU General Public License version 3, 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 GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -/* G Stuff */ -#include <glib.h> -#include <glib-object.h> -#include <gtk/gtk.h> - -/* DBus Stuff */ -#include <dbus/dbus-glib.h> -#ifdef HAVE_GTK3 -#include <libdbusmenu-gtk3/menu.h> -#else -#include <libdbusmenu-gtk/menu.h> -#endif - -/* Indicator Stuff */ -#include <libindicator/indicator.h> -#include <libindicator/indicator-object.h> -#include <libindicator/indicator-service-manager.h> -#include <libindicator/indicator-image-helper.h> - -/* Local Stuff */ -#include "dbus-shared.h" -#include "application-service-client.h" -#include "application-service-marshal.h" - -#define PANEL_ICON_SUFFIX "panel" - -#define INDICATOR_APPLICATION_TYPE (indicator_application_get_type ()) -#define INDICATOR_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INDICATOR_APPLICATION_TYPE, IndicatorApplication)) -#define INDICATOR_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INDICATOR_APPLICATION_TYPE, IndicatorApplicationClass)) -#define IS_INDICATOR_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), INDICATOR_APPLICATION_TYPE)) -#define IS_INDICATOR_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), INDICATOR_APPLICATION_TYPE)) -#define INDICATOR_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), INDICATOR_APPLICATION_TYPE, IndicatorApplicationClass)) - -typedef struct _IndicatorApplication IndicatorApplication; -typedef struct _IndicatorApplicationClass IndicatorApplicationClass; - -struct _IndicatorApplicationClass { - IndicatorObjectClass parent_class; -}; - -struct _IndicatorApplication { - IndicatorObject parent; -}; - -GType indicator_application_get_type (void); - -INDICATOR_SET_VERSION -INDICATOR_SET_TYPE(INDICATOR_APPLICATION_TYPE) - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -typedef struct _IndicatorApplicationPrivate IndicatorApplicationPrivate; -struct _IndicatorApplicationPrivate { - IndicatorServiceManager * sm; - DBusGConnection * bus; - DBusGProxy * service_proxy; - GList * applications; - GHashTable * theme_dirs; - guint disconnect_kill; -}; - -typedef struct _ApplicationEntry ApplicationEntry; -struct _ApplicationEntry { - IndicatorObjectEntry entry; - gchar * icon_theme_path; - gboolean old_service; - gchar * dbusobject; - gchar * dbusaddress; - gchar * guide; - gchar * longname; -}; - -#define INDICATOR_APPLICATION_GET_PRIVATE(o) \ -(G_TYPE_INSTANCE_GET_PRIVATE ((o), INDICATOR_APPLICATION_TYPE, IndicatorApplicationPrivate)) - -static void indicator_application_class_init (IndicatorApplicationClass *klass); -static void indicator_application_init (IndicatorApplication *self); -static void indicator_application_dispose (GObject *object); -static void indicator_application_finalize (GObject *object); -static GList * get_entries (IndicatorObject * io); -static guint get_location (IndicatorObject * io, IndicatorObjectEntry * entry); -void connection_changed (IndicatorServiceManager * sm, gboolean connected, IndicatorApplication * application); -static void connected (IndicatorApplication * application); -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 theme_dir_unref(IndicatorApplication * ia, const gchar * dir); -static void theme_dir_ref(IndicatorApplication * ia, const gchar * dir); - -G_DEFINE_TYPE (IndicatorApplication, indicator_application, INDICATOR_OBJECT_TYPE); - -static void -indicator_application_class_init (IndicatorApplicationClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - g_type_class_add_private (klass, sizeof (IndicatorApplicationPrivate)); - - object_class->dispose = indicator_application_dispose; - object_class->finalize = indicator_application_finalize; - - IndicatorObjectClass * io_class = INDICATOR_OBJECT_CLASS(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; -} - -static void -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 = NULL; - priv->theme_dirs = NULL; - priv->disconnect_kill = 0; - - priv->sm = indicator_service_manager_new(INDICATOR_APPLICATION_DBUS_ADDR); - g_signal_connect(G_OBJECT(priv->sm), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connection_changed), self); - - priv->applications = NULL; - - priv->theme_dirs = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); - - return; -} - -static void -indicator_application_dispose (GObject *object) -{ - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(object); - - if (priv->disconnect_kill != 0) { - g_source_remove(priv->disconnect_kill); - } - - while (priv->applications != NULL) { - application_removed(priv->service_proxy, - 0, - INDICATOR_APPLICATION(object)); - } - - if (priv->sm != NULL) { - g_object_unref(priv->sm); - 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->theme_dirs != NULL) { - while (g_hash_table_size(priv->theme_dirs)) { - GList * keys = g_hash_table_get_keys(priv->theme_dirs); - theme_dir_unref(INDICATOR_APPLICATION(object), (gchar *)keys->data); - } - g_hash_table_destroy(priv->theme_dirs); - priv->theme_dirs = NULL; - } - - G_OBJECT_CLASS (indicator_application_parent_class)->dispose (object); - return; -} - -static void -indicator_application_finalize (GObject *object) -{ - - G_OBJECT_CLASS (indicator_application_parent_class)->finalize (object); - return; -} - -/* Responds to connection change event from the service manager and - splits it into two. */ -void -connection_changed (IndicatorServiceManager * sm, gboolean connect, IndicatorApplication * application) -{ - g_return_if_fail(IS_INDICATOR_APPLICATION(application)); - if (connect) { - connected(application); - } else { - disconnected(application); - } - return; -} - -/* Brings up the connection to a service that has just come onto the - bus, or is atleast new to us. */ -void -connected (IndicatorApplication * application) -{ - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); - g_debug("Connected to Application Indicator Service."); - - GError * error = NULL; - - /* Grab the session bus */ - if (priv->bus == NULL) { - priv->bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); - - if (error != NULL) { - g_error("Unable to get session bus: %s", error->message); - g_error_free(error); - return; - } - } - - 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 */); - } - - /* Query it for existing applications */ - g_debug("Request current apps"); - org_ayatana_indicator_application_service_get_applications_async(priv->service_proxy, - get_applications, - application); - - return; -} - -/* Marks every current application as belonging to the old - service so that we can delete it if it doesn't come back. - Also, sets up a timeout on comming back. */ -static void -disconnected (IndicatorApplication * application) -{ - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); - g_list_foreach(priv->applications, disconnected_helper, application); - /* I'll like this to be a little shorter, but it's a bit - inpractical to make it so. This means that the user will - probably notice a visible glitch. Though, if applications - are disappearing there isn't much we can do. */ - priv->disconnect_kill = g_timeout_add(250, disconnected_kill, application); - return; -} - -/* Marks an entry as being from the old service */ -static void -disconnected_helper (gpointer data, gpointer user_data) -{ - ApplicationEntry * entry = (ApplicationEntry *)data; - entry->old_service = TRUE; - return; -} - -/* Makes sure the old applications that don't come back - get dropped. */ -static gboolean -disconnected_kill (gpointer user_data) -{ - g_return_val_if_fail(IS_INDICATOR_APPLICATION(user_data), FALSE); - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(user_data); - priv->disconnect_kill = 0; - g_list_foreach(priv->applications, disconnected_kill_helper, user_data); - return FALSE; -} - -/* Looks for entries that are still associated with the - old service and removes them. */ -static void -disconnected_kill_helper (gpointer data, gpointer user_data) -{ - g_return_if_fail(IS_INDICATOR_APPLICATION(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)); - } - return; -} - -/* Goes through the list of applications that we're maintaining and - pulls out the IndicatorObjectEntry and returns that in a list - for the caller. */ -static GList * -get_entries (IndicatorObject * io) -{ - g_return_val_if_fail(IS_INDICATOR_APPLICATION(io), NULL); - - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(io); - GList * retval = NULL; - GList * apppointer = NULL; - - for (apppointer = priv->applications; apppointer != NULL; apppointer = g_list_next(apppointer)) { - IndicatorObjectEntry * entry = &(((ApplicationEntry *)apppointer->data)->entry); - retval = g_list_prepend(retval, entry); - } - - if (retval != NULL) { - retval = g_list_reverse(retval); - } - - return retval; -} - -/* Finds the location of a specific entry */ -static guint -get_location (IndicatorObject * io, IndicatorObjectEntry * entry) -{ - g_return_val_if_fail(IS_INDICATOR_APPLICATION(io), 0); - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(io); - 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 -measure_string (GtkStyle * style, PangoContext * context, const gchar * string) -{ - PangoLayout * layout = pango_layout_new(context); - pango_layout_set_text(layout, string, -1); - pango_layout_set_font_description(layout, style->font_desc); - - gint width; - pango_layout_get_pixel_size(layout, &width, NULL); - g_object_unref(layout); - return width; -} - -/* Try to get a good guess at what a maximum width of the entire - string would be. */ -static void -guess_label_size (ApplicationEntry * app) -{ - /* This is during startup. */ - if (app->entry.label == NULL) return; - - GtkStyle * style = gtk_widget_get_style(GTK_WIDGET(app->entry.label)); - PangoContext * context = gtk_widget_get_pango_context(GTK_WIDGET(app->entry.label)); - - gint length = measure_string(style, context, gtk_label_get_text(app->entry.label)); - - if (app->guide != NULL) { - gint guidelen = measure_string(style, context, app->guide); - if (guidelen > length) { - length = guidelen; - } - } - - gtk_widget_set_size_request(GTK_WIDGET(app->entry.label), length, -1); - - return; -} - -/* Here we respond to new applications by building up the - 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) -{ - g_return_if_fail(IS_INDICATOR_APPLICATION(application)); - g_debug("Building new application entry: %s with icon: %s", dbusaddress, iconname); - 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; - app->icon_theme_path = NULL; - if (icon_theme_path != NULL && icon_theme_path[0] != '\0') { - app->icon_theme_path = g_strdup(icon_theme_path); - theme_dir_ref(application, icon_theme_path); - } - - app->dbusaddress = g_strdup(dbusaddress); - app->dbusobject = g_strdup(dbusobject); - app->guide = NULL; - - /* We make a long name using the suffix, and if that - icon is available we want to use it. Otherwise we'll - just use the name we were given. */ - app->longname = NULL; - if (!g_str_has_suffix(iconname, PANEL_ICON_SUFFIX)) { - app->longname = g_strdup_printf("%s-%s", iconname, PANEL_ICON_SUFFIX); - } else { - app->longname = g_strdup(iconname); - } - app->entry.image = indicator_image_helper(app->longname); - - if (label == NULL || label[0] == '\0') { - app->entry.label = NULL; - } else { - app->entry.label = GTK_LABEL(gtk_label_new(label)); - g_object_ref(G_OBJECT(app->entry.label)); - gtk_widget_show(GTK_WIDGET(app->entry.label)); - - if (app->guide != NULL) { - g_free(app->guide); - app->guide = NULL; - } - - if (guide != NULL) { - app->guide = g_strdup(guide); - } - - guess_label_size(app); - } - - app->entry.menu = GTK_MENU(dbusmenu_gtkmenu_new((gchar *)dbusaddress, (gchar *)dbusobject)); - - /* Keep copies of these for ourself, just in case. */ - g_object_ref(app->entry.image); - g_object_ref(app->entry.menu); - - gtk_widget_show(GTK_WIDGET(app->entry.image)); - - priv->applications = g_list_insert(priv->applications, app, position); - - g_signal_emit(G_OBJECT(application), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED_ID, 0, &(app->entry), TRUE); - return; -} - -/* 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) -{ - g_return_if_fail(IS_INDICATOR_APPLICATION(application)); - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); - ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); - - if (app == NULL) { - g_warning("Unable to find application at position: %d", position); - return; - } - - priv->applications = g_list_remove(priv->applications, app); - g_signal_emit(G_OBJECT(application), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED_ID, 0, &(app->entry), TRUE); - - if (app->icon_theme_path != NULL) { - theme_dir_unref(application, app->icon_theme_path); - g_free(app->icon_theme_path); - } - if (app->dbusaddress != NULL) { - g_free(app->dbusaddress); - } - if (app->dbusobject != NULL) { - g_free(app->dbusobject); - } - if (app->guide != NULL) { - g_free(app->guide); - } - if (app->longname != NULL) { - g_free(app->longname); - } - if (app->entry.image != NULL) { - g_object_unref(G_OBJECT(app->entry.image)); - } - if (app->entry.label != NULL) { - g_object_unref(G_OBJECT(app->entry.label)); - } - if (app->entry.menu != NULL) { - g_object_unref(G_OBJECT(app->entry.menu)); - } - g_free(app); - - return; -} - -/* 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) -{ - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); - ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); - gboolean signal_reload = FALSE; - - if (app == NULL) { - g_warning("Unable to find application at position: %d", position); - return; - } - - if (label == NULL || label[0] == '\0') { - /* No label, let's see if we need to delete the old one */ - if (app->entry.label != NULL) { - g_object_unref(G_OBJECT(app->entry.label)); - app->entry.label = NULL; - - signal_reload = TRUE; - } - } else { - /* We've got a label, is this just an update or is - it a new thing. */ - if (app->entry.label != NULL) { - gtk_label_set_text(app->entry.label, label); - } else { - app->entry.label = GTK_LABEL(gtk_label_new(label)); - g_object_ref(G_OBJECT(app->entry.label)); - gtk_widget_show(GTK_WIDGET(app->entry.label)); - - signal_reload = TRUE; - } - } - - /* Copy the guide if we have one */ - if (app->guide != NULL) { - g_free(app->guide); - app->guide = NULL; - } - - if (guide != NULL && guide[0] != '\0') { - app->guide = g_strdup(guide); - } - - /* Protected against not having a label */ - guess_label_size(app); - - if (signal_reload) { - /* Telling the listener that this has been removed, and then - readded to make it reparse the entry. */ - if (app->entry.label != NULL) { - gtk_widget_hide(GTK_WIDGET(app->entry.label)); - } - - if (app->entry.image != NULL) { - gtk_widget_hide(GTK_WIDGET(app->entry.image)); - } - - if (app->entry.menu != NULL) { - gtk_menu_detach(app->entry.menu); - } - - g_signal_emit(G_OBJECT(application), INDICATOR_OBJECT_SIGNAL_ENTRY_REMOVED_ID, 0, &(app->entry), TRUE); - - if (app->entry.label != NULL) { - gtk_widget_show(GTK_WIDGET(app->entry.label)); - } - - if (app->entry.image != NULL) { - indicator_image_helper_update(app->entry.image, app->longname); - gtk_widget_show(GTK_WIDGET(app->entry.image)); - } - - g_signal_emit(G_OBJECT(application), INDICATOR_OBJECT_SIGNAL_ENTRY_ADDED_ID, 0, &(app->entry), TRUE); - } - - return; -} - -/* 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) -{ - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); - ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); - - if (app == NULL) { - g_warning("Unable to find application at position: %d", position); - return; - } - - /* We make a long name using the suffix, and if that - icon is available we want to use it. Otherwise we'll - just use the name we were given. */ - if (app->longname != NULL) { - g_free(app->longname); - app->longname = NULL; - } - if (!g_str_has_suffix(iconname, PANEL_ICON_SUFFIX)) { - app->longname = g_strdup_printf("%s-%s", iconname, PANEL_ICON_SUFFIX); - } else { - app->longname = g_strdup(iconname); - } - indicator_image_helper_update(app->entry.image, app->longname); - - return; -} - -/* 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) -{ - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(application); - ApplicationEntry * app = (ApplicationEntry *)g_list_nth_data(priv->applications, position); - - if (app == NULL) { - g_warning("Unable to find application at position: %d", position); - return; - } - - if (g_strcmp0(icon_theme_path, app->icon_theme_path) != 0) { - if(app->icon_theme_path != NULL) { - theme_dir_unref(application, app->icon_theme_path); - g_free(app->icon_theme_path); - app->icon_theme_path = NULL; - } - if (icon_theme_path != NULL && icon_theme_path[0] != '\0') { - app->icon_theme_path = g_strdup(icon_theme_path); - theme_dir_ref(application, app->icon_theme_path); - } - indicator_image_helper_update(app->entry.image, app->longname); - } - - return; -} - -/* This repsonds 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) -{ - if (error != NULL) { - g_warning("Unable to get application list: %s", error->message); - return; - } - g_ptr_array_foreach(OUT_applications, get_applications_helper, userdata); - - return; -} - -/* 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) -{ - 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); -} - -/* Unrefs a theme directory. This may involve removing it from - the search path. */ -static void -theme_dir_unref(IndicatorApplication * ia, const gchar * dir) -{ - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(ia); - - /* Grab the count for this dir */ - int count = GPOINTER_TO_INT(g_hash_table_lookup(priv->theme_dirs, dir)); - - /* Is this a simple deprecation, if so, we can just lower the - number and move on. */ - if (count > 1) { - count--; - g_hash_table_insert(priv->theme_dirs, g_strdup(dir), GINT_TO_POINTER(count)); - return; - } - - /* Try to remove it from the hash table, this makes sure - that it existed */ - if (!g_hash_table_remove(priv->theme_dirs, dir)) { - g_warning("Unref'd a directory that wasn't in the theme dir hash table."); - return; - } - - GtkIconTheme * icon_theme = gtk_icon_theme_get_default(); - gchar ** paths; - gint path_count; - - gtk_icon_theme_get_search_path(icon_theme, &paths, &path_count); - - gint i; - gboolean found = FALSE; - for (i = 0; i < path_count; i++) { - if (found) { - /* If we've already found the right entry */ - paths[i - 1] = paths[i]; - } else { - /* We're still looking, is this the one? */ - if (!g_strcmp0(paths[i], dir)) { - found = TRUE; - /* We're freeing this here as it won't be captured by the - g_strfreev() below as it's out of the array. */ - g_free(paths[i]); - } - } - } - - /* If we found one we need to reset the path to - accomidate the changes */ - if (found) { - paths[path_count - 1] = NULL; /* Clear the last one */ - gtk_icon_theme_set_search_path(icon_theme, (const gchar **)paths, path_count - 1); - } - - g_strfreev(paths); - - return; -} - -/* Refs a theme directory, and it may add it to the search - path */ -static void -theme_dir_ref(IndicatorApplication * ia, const gchar * dir) -{ - IndicatorApplicationPrivate * priv = INDICATOR_APPLICATION_GET_PRIVATE(ia); - - int count = 0; - if ((count = GPOINTER_TO_INT(g_hash_table_lookup(priv->theme_dirs, dir))) != 0) { - /* It exists so what we need to do is increase the ref - count of this dir. */ - count++; - } else { - /* It doesn't exist, so we need to add it to the table - and to the search path. */ - gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), dir); - g_debug("\tAppending search path: %s", dir); - count = 1; - } - - g_hash_table_insert(priv->theme_dirs, g_strdup(dir), GINT_TO_POINTER(count)); - - return; -} - diff --git a/src/notification-approver.xml b/src/notification-approver.xml deleted file mode 100644 index 4a8e39b..0000000 --- a/src/notification-approver.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<node name="/"> - <interface name="org.ayatana.StatusNotifierApprover"> - -<!-- Methods --> - <method name="ApproveItem"> - <!-- KSNI ID --> - <arg type="s" name="id" direction="in" /> - <!-- KSNI Category --> - <arg type="s" name="category" direction="in" /> - <!-- Application PID --> - <arg type="u" name="pid" direction="in" /> - <!-- Application DBus Address --> - <arg type="s" name="address" direction="in" /> - <!-- Application DBus Path for KSNI interface --> - <arg type="o" name="path" direction="in" /> - <!-- So, what do you think? --> - <arg type="b" name="approved" direction="out" /> - </method> - -<!-- Signals --> - <signal name="ReviseJudgement"> - <arg type="b" name="approved" direction="out" /> - <arg type="s" name="address" direction="out" /> - <arg type="o" name="path" direction="out" /> - </signal> - - </interface> -</node> |