From 88edaf7fcdfb2f4df6eab6e5692680b8c27ff85e362b8e1e728dc35b610cbf8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Fri, 3 May 2024 14:32:33 +0200 Subject: [PATCH] Sync from SUSE:SLFO:Main libappindicator revision cf095544e3bb8e3e0304d29c263db639 --- .gitattributes | 23 + 0001_Fix_mono_dir.patch | 24 + _multibuild | 4 + libappindicator.changes | 186 ++++++ libappindicator.spec | 206 +++++++ ...cator_12.10.1+20.10.20200706.1.orig.tar.gz | 3 + make_gtk_doc_optional.patch | 16 + xappstatusicon.patch | 550 ++++++++++++++++++ 8 files changed, 1012 insertions(+) create mode 100644 .gitattributes create mode 100644 0001_Fix_mono_dir.patch create mode 100644 _multibuild create mode 100644 libappindicator.changes create mode 100644 libappindicator.spec create mode 100644 libappindicator_12.10.1+20.10.20200706.1.orig.tar.gz create mode 100644 make_gtk_doc_optional.patch create mode 100644 xappstatusicon.patch diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/0001_Fix_mono_dir.patch b/0001_Fix_mono_dir.patch new file mode 100644 index 0000000..c76a2c8 --- /dev/null +++ b/0001_Fix_mono_dir.patch @@ -0,0 +1,24 @@ +diff -aur a/bindings/mono/appindicator-sharp-0.1.pc.in b/bindings/mono/appindicator-sharp-0.1.pc.in +--- a/bindings/mono/appindicator-sharp-0.1.pc.in ++++ b/bindings/mono/appindicator-sharp-0.1.pc.in +@@ -1,7 +1,7 @@ + prefix=@prefix@ + exec_prefix=@exec_prefix@ + libdir=@libdir@ +-assemblies_dir=${prefix}/lib/cli/appindicator-sharp-0.1 ++assemblies_dir=${libdir}/appindicator-sharp-0.1 + + Name: appindicator-sharp + Description: application indicators for .NET +diff -aur a/bindings/mono/Makefile.am b/bindings/mono/Makefile.am +--- a/bindings/mono/Makefile.am ++++ b/bindings/mono/Makefile.am +@@ -31,7 +31,7 @@ + $(DLLPOLICY1) \ + $(POLICY1).config + +-assemblydir = $(libdir)/cli/appindicator-sharp-0.1 ++assemblydir = $(libdir)/appindicator-sharp-0.1 + assembly_DATA = $(TARGET) + + CLEANFILES = \ diff --git a/_multibuild b/_multibuild new file mode 100644 index 0000000..c65639a --- /dev/null +++ b/_multibuild @@ -0,0 +1,4 @@ + + gtk2 + gtk3 + diff --git a/libappindicator.changes b/libappindicator.changes new file mode 100644 index 0000000..1106706 --- /dev/null +++ b/libappindicator.changes @@ -0,0 +1,186 @@ +------------------------------------------------------------------- +Sat Nov 12 07:07:18 UTC 2022 - Bernhard Wiedemann + +- Let the rpm provide libappindicator-gtk3 for EL8 compat + +------------------------------------------------------------------- +Sat Nov 20 19:39:20 UTC 2021 - Alexei Sorokin + +- Update to version 12.10.1~bzr20200706.298 (chages since + 12.10.1~bzr20170215.282): + * Fix build failures. + * Vendorise indicator-desktop-shortcuts (convenience wrapper + around gdesktopappinfo) from the libindicator project, to drop + the dependency on libindicator as none of the rest of it is + used. + * Don't build with -Werror. + * Drop Python 2 bindings and GObject Introspection for GTK 2 + (lp#1740637). + * app-indicator: Don't pass unexpected parameter to signal + emissions (lp#1867996). + * app-indicator: Only check for item numbers when iterating + array (lp#1867996). + * Fall back to tray icon when StatusNotifierHost is not + available. +- Drop libappindicator-no-Werror.patch: fixed upstream. +- Drop only_require_python_for_gtk2.patch: no longer needed. +- Rebase xappstatusicon.patch. + +------------------------------------------------------------------- +Sun Dec 20 16:34:27 UTC 2020 - Callum Farmer + +- Provide RH used libappindicator symbol, so third party rpms + like Mailspring won't complain about missing dependencies + +------------------------------------------------------------------- +Fri Aug 7 10:14:02 UTC 2020 - Michal Vyskocil + +- Provide RH used libappindicator-gtk3 symbol, so third party rpms + like Slack won't complain about missing dependencies + +------------------------------------------------------------------- +Tue Jul 7 13:20:25 UTC 2020 - Callum Farmer + +- Fixes for %_libexecdir changing to /usr/libexec + +------------------------------------------------------------------- +Tue Apr 14 10:01:22 UTC 2020 - Martin Liška + +- Add -fcommon in order to fix boo#1164492. + +------------------------------------------------------------------- +Thu Apr 9 22:02:52 UTC 2020 - Dominique Leuenberger + +- Do not apply xappstatusicon.patch: pulls half of Mate into Ring1. + +------------------------------------------------------------------- +Mon Mar 23 13:32:23 UTC 2020 - Tomáš Chvátal + +- Fix build on py2 less system + +------------------------------------------------------------------- +Wed Feb 12 15:18:19 UTC 2020 - Maurizio Galli + +- Added xappstatusicon.patch. It adds support for XAppStatus Icon by + Linux Mint. + +------------------------------------------------------------------- +Sun Feb 2 11:49:09 UTC 2020 - Matthias Mailänder + +- Use the vanilla nunit for compatibility with newer Mono + +------------------------------------------------------------------- +Tue Oct 1 10:57:51 UTC 2019 - Stefan Brüns + +- Make sure the OBS spec file parser does not apply the gtk3 psuffix + for the default ("") multibuild flavor. + +------------------------------------------------------------------- +Wed Sep 18 19:07:04 UTC 2019 - Stefan Brüns + +- Split gtk2 and gtk3 builds using _multibuild. Python2 and Mono + bindings are only available for GTK2, so the GTK3 version has + significantly less build dependencies, + add only_require_python_for_gtk2.patch +- Drop dependency on deprecated gnome-common, see + https://wiki.gnome.org/Projects/GnomeCommon/Migration +- Allow configure run to succeed even when gtk-doc is not installed, + add make_gtk_doc_optional.patch + +------------------------------------------------------------------- +Wed May 15 14:40:16 UTC 2019 - Maurizio Galli + +- Drop libappindicator-activate-support.patch as it's no longer needed and + breaks context menu / actions in fall-back mode (boo#1132659) + +------------------------------------------------------------------- +Sun Jan 13 19:146:00 UTC 2019 - ximi.obs@gmail.com + +- Changed the activate-support patch to signal an "activate-event" + so users can create callbacks themselves. + Original patch from Yichao Yu . + +------------------------------------------------------------------- +Sat Mar 10 14:14:54 UTC 2018 - dimstar@opensuse.org + +- Add libappindicator-no-Werror.patch: the libappindicator code is + aging and is not keeping up well with the moving world around it. + +------------------------------------------------------------------- +Mon Sep 4 16:06:31 UTC 2017 - dimstar@opensuse.org + +- Disable building of -doc subpackage (source not compatible with + gtk-doc 1.26 - and the doc is available online anyway): + + Remove gtk-doc BuildRequires. + + Replace --enable-gtk-doc configure parameter with + --disable-gtk-doc, + + Drop the -doc subpackage. + +------------------------------------------------------------------- +Fri Apr 28 16:04:54 UTC 2017 - jengelh@inai.de + +- Rename %soname to %sover to better reflect its purpose. +- Update summaries. +- Remove redundant pkgconfig() reqiures; these are already + autodiscovered. + +------------------------------------------------------------------- +Wed Apr 19 19:50:11 UTC 2017 - sor.alexei@meowr.ru + +- Update to version 12.10.1+bzr20170215 (changes since + 12.10.1+bzr20141110): + * Handle watcher service appearing and disappearing. + * Make test-simple-app really working. + * Fix icon and theme paths when running in $SNAP environment + (lp#1600136). + * Do not emit label changes when guide is still empty. + * Do not append the snap prefix if the icon is saved in a well + known readable path. +- Add libappindicator-activate-support.patch: Open menu on the + left-click action (lp#1403449). +- Rename python-appindicator to python2-appindicator. + +------------------------------------------------------------------- +Thu Jul 7 09:25:12 UTC 2016 - t.gruner@katodev.de + +- Allow building with mono support in case without mono is set + +------------------------------------------------------------------- +Mon Jun 13 10:22:47 UTC 2016 - sor.alexei@meowr.ru + +- Little spec cleanup. + +------------------------------------------------------------------- +Tue May 5 13:47:23 UTC 2015 - sor.alexei@meowr.ru + +- Update to 12.10.1+bzr20141110: + * scroll-event: change parameter to the right type. +- Rebase 0001_Fix_mono_dir.patch. +- Remove no-deprecated.patch: merged upstream. +- Remove dont-build-examples.patch: fixed upstream. +- Minor spec cleanup. + +------------------------------------------------------------------- +Thu Mar 5 11:32:19 UTC 2015 - schwab@suse.de + +- Allow building without mono support + +------------------------------------------------------------------- +Tue Mar 11 10:41:46 UTC 2014 - p.drouand@gmail.com + +- Fix appindicator-sharp require in appindicator-sharp-devel + +------------------------------------------------------------------- +Mon Mar 10 15:15:37 UTC 2014 - p.drouand@gmail.com + +- Fix license; src/generate-id.c is released and distributed under + GPL-3.0 license + +------------------------------------------------------------------- +Fri Mar 7 20:18:46 UTC 2014 - hrvoje.senjan@gmail.com + +- Init libappindicator package +- Add 0001_Fix_mono_dir.patch; fix location of .pc files +- Add dont-build-examples.patch; don't build examples +- Add no-deprecated.patch; don't fail on deprecated declarations + diff --git a/libappindicator.spec b/libappindicator.spec new file mode 100644 index 0000000..1ab0328 --- /dev/null +++ b/libappindicator.spec @@ -0,0 +1,206 @@ +# +# spec file for package libappindicator +# +# Copyright (c) 2021 SUSE LLC +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +%global flavor @BUILD_FLAVOR@%{nil} +%if "%{flavor}" == "gtk2" +%global gtkver 2 +%bcond_without mono +%endif +%if "%{flavor}" == "gtk3" +%global psuffix 3 +%global gtkver 3 +%bcond_with mono +%endif +%define sover 1 +%define _version 12.10.1+20.10.20200706.1 +Name: libappindicator +Version: 12.10.1~bzr20200706.298 +Release: 0 +Summary: Application indicators library +License: GPL-3.0-only AND LGPL-2.0-only AND LGPL-3.0-only +Group: System/GUI/Other +URL: https://launchpad.net/libappindicator +Source: https://launchpad.net/ubuntu/+archive/primary/+files/%{name}_%{_version}.orig.tar.gz +# PATCH-FIX-UPSTREAM 0001_Fix_mono_dir.patch hrvoje.senjan@gmail.com -- Fix location of .pc files. +Patch0: 0001_Fix_mono_dir.patch +# PATCH-FIX-OPENSUSE make_gtk_doc_optional.patch -- Do not require macros from gtk-doc +Patch1: make_gtk_doc_optional.patch +# PATCH-FIX-OPENSUSE xappstatusicon.patch maurizio.galli@gmail.com -- Original patch by Linux Mint. Include support for XAppStatusIcon by Linux Mint +Patch2: xappstatusicon.patch +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: fdupes +BuildRequires: libtool +BuildRequires: pkgconfig +BuildRequires: pkgconfig(gobject-introspection-1.0) +%if "%{flavor}" == "" +ExclusiveArch: do-not-build +%endif +%if "%{flavor}" == "gtk2" +BuildRequires: pkgconfig(dbusmenu-gtk-0.4) +BuildRequires: pkgconfig(gtk+-2.0) +%if %{with mono} +BuildRequires: pkgconfig(gapi-2.0) +BuildRequires: pkgconfig(gtk-sharp-2.0) +BuildRequires: pkgconfig(mono) +BuildRequires: pkgconfig(nunit) +%endif +%else +BuildRequires: vala +BuildRequires: pkgconfig(dbusmenu-gtk3-0.4) +BuildRequires: pkgconfig(gtk+-3.0) +#BuildRequires: pkgconfig(xapp) >= 1.5.0 +%endif +Provides: libappindicator-gtk3 + +%description +A library to allow applications to export a menu into the Unity Menu bar. Based +on KSNI it also works in KDE and will fallback to generic Systray support if +none of those are available. + +%package -n libappindicator%{?psuffix:%{psuffix}-}%{sover} +Summary: Application indicators library +Group: System/Libraries +# Fedora and friends compatibility symbol +%if "%{flavor}" == "gtk2" +Provides: libappindicator = %{version} +%else +Provides: libappindicator-gtk3 = %{version} +%endif + +%description -n libappindicator%{?psuffix:%{psuffix}-}%{sover} +A library to allow applications to export a menu into the Unity Menu bar. Based +on KSNI it also works in KDE and will fallback to generic Systray support if +none of those are available. + +%if "%{flavor}" != "gtk2" +%package -n typelib-1_0-AppIndicator%{?psuffix}-0_1 +Summary: Application indicators library +Group: System/Libraries + +%description -n typelib-1_0-AppIndicator%{?psuffix}-0_1 +This package contains the GObject Introspection bindings for the appindicator +library. + +%else + +%package -n appindicator%{?psuffix}-sharp +Summary: Application indicators library for C# +Group: System/Libraries + +%description -n appindicator%{?psuffix}-sharp +This package provides the appindicator-sharp assembly that allows CLI (.NET) +programs to take menus from applications and place them in the panel. + +This package provides assemblies to be used by applications. + +%package -n appindicator%{?psuffix}-sharp-devel +Summary: Development files for libappindicator-sharp +Group: Development/Libraries/Other +Requires: appindicator%{?psuffix}-sharp = %{version} + +%description -n appindicator%{?psuffix}-sharp-devel +This package contains the development files for the appindicator-sharp library. +%endif + +%package -n libappindicator%{?psuffix}-devel +Summary: Development files for libappindicator +Group: Development/Libraries/C and C++ +Requires: libappindicator%{?psuffix:%{psuffix}-}%{sover} = %{version} + +%description -n libappindicator%{?psuffix}-devel +This package contains the development files for the appindicator%{?psuffix} library. + +%prep +%setup -q -c +%patch0 -p1 +%patch1 -p1 +#%%patch2 -p1 + +%build +# Create dummy file, to avoid dependency on gtk-doc +echo "EXTRA_DIST = " >> gtk-doc.make +autoreconf -vfi +%if %{with mono} +export CSC=%{_bindir}/gmcs +%endif + +%configure \ + --disable-static \ + --disable-gtk-doc \ + --disable-mono-test \ + --with-gtk=%{gtkver} +%make_build + +%install +%make_install +find %{buildroot} -type f -name "*.la" -delete -print + +%if "%{flavor}" == "gtk2" +rm %{buildroot}%{_libdir}/girepository-1.0/AppIndicator3-0.1.typelib +rm %{buildroot}%{_datadir}/gir-1.0/AppIndicator3-0.1.gir +%endif + +%post -n libappindicator%{?psuffix:%{psuffix}-}%{sover} -p /sbin/ldconfig + +%postun -n libappindicator%{?psuffix:%{psuffix}-}%{sover} -p /sbin/ldconfig + +%files -n libappindicator%{?psuffix:%{psuffix}-}%{sover} +%license COPYING COPYING.LGPL.2.1 +%doc README +%{_libdir}/libappindicator%{?psuffix}.so.%{sover}* + +%if "%{flavor}" == "gtk2" +# Only for GTK 2 +%if %{with mono} +%files -n appindicator%{?psuffix}-sharp +%license COPYING COPYING.LGPL.2.1 +%doc README +%{_libdir}/appindicator%{?psuffix}-sharp-0.1/ +%{_prefix}/lib/mono/appindicator%{?psuffix}-sharp/ +%{_prefix}/lib/mono/gac/appindicator%{?psuffix}-sharp/ +%{_prefix}/lib/mono/gac/policy.0.0.appindicator%{?psuffix}-sharp/ + +%files -n appindicator%{?psuffix}-sharp-devel +%license COPYING COPYING.LGPL.2.1 +%doc README +%{_libdir}/pkgconfig/appindicator%{?psuffix}-sharp-0.1.pc +%endif + +%else + +# Only for GTK 3+ +%files -n typelib-1_0-AppIndicator%{?psuffix}-0_1 +%license COPYING COPYING.LGPL.2.1 +%doc README +%{_libdir}/girepository-1.0/AppIndicator%{?psuffix}-0.1.typelib + +%endif + +%files -n libappindicator%{?psuffix}-devel +%license COPYING COPYING.LGPL.2.1 +%doc README +%{_includedir}/libappindicator%{?psuffix}-0.1/ +%{_libdir}/libappindicator%{?psuffix}.so +%{_libdir}/pkgconfig/appindicator%{?psuffix}-0.1.pc +%if "%{flavor}" != "gtk2" +%{_datadir}/gir-1.0/AppIndicator%{?psuffix}-0.1.gir +%{_datadir}/vala/vapi/appindicator%{?psuffix}-0.1.* +%endif + +%changelog diff --git a/libappindicator_12.10.1+20.10.20200706.1.orig.tar.gz b/libappindicator_12.10.1+20.10.20200706.1.orig.tar.gz new file mode 100644 index 0000000..4057d70 --- /dev/null +++ b/libappindicator_12.10.1+20.10.20200706.1.orig.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94e7096a49c400628ecddcafe313d63bf917d95a90ab994930909de724604e0a +size 75204 diff --git a/make_gtk_doc_optional.patch b/make_gtk_doc_optional.patch new file mode 100644 index 0000000..91b05c3 --- /dev/null +++ b/make_gtk_doc_optional.patch @@ -0,0 +1,16 @@ +--- a/configure.ac 2019-09-18 20:01:29.244433451 +0200 ++++ b/configure.ac 2019-09-18 20:59:47.284282932 +0200 +@@ -33,8 +33,12 @@ + # GTK Doc + ########################### + ++# check for gtk-doc ++m4_ifdef([GTK_DOC_CHECK], [ + GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) +- ++],[ ++AM_CONDITIONAL([ENABLE_GTK_DOC], false) ++]) + + ########################### + # Dependencies diff --git a/xappstatusicon.patch b/xappstatusicon.patch new file mode 100644 index 0000000..1f06548 --- /dev/null +++ b/xappstatusicon.patch @@ -0,0 +1,550 @@ +--- a/configure.ac ++++ b/configure.ac +@@ -61,7 +61,8 @@ AS_IF([test "x$with_gtk" = x3], + glib-2.0 >= $GLIB_REQUIRED_VERSION + gio-unix-2.0 + gio-2.0 >= $GIO_REQUIRED_VERSION +- dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION) ++ dbusmenu-gtk3-0.4 >= $DBUSMENUGTK_REQUIRED_VERSION ++ xapp >= 1.5.0) + AC_DEFINE(HAVE_GTK3, 1, [whether gtk3 is available]) + ], + [test "x$with_gtk" = x2], +--- a/src/appindicator3-0.1.pc.in ++++ b/src/appindicator3-0.1.pc.in +@@ -5,7 +5,7 @@ bindir=@bindir@ + includedir=@includedir@ + + Cflags: -I${includedir}/libappindicator3-0.1 +-Requires: dbusmenu-glib-0.4 gtk+-3.0 ++Requires: dbusmenu-glib-0.4 gtk+-3.0 xapp + Libs: -L${libdir} -lappindicator3 + + Name: appindicator3-0.1 +--- a/src/app-indicator.c ++++ b/src/app-indicator.c +@@ -31,6 +31,8 @@ License version 3 and version 2.1 along + #include "config.h" + #endif + ++#include ++ + #include + #include + #include +@@ -52,6 +54,8 @@ License version 3 and version 2.1 along + + #define PANEL_ICON_SUFFIX "panel" + ++#define FALLBACK_ICON "image-missing" ++ + /** + * AppIndicatorPrivate: + * All of the private data in an instance of an application indicator. +@@ -90,7 +94,7 @@ struct _AppIndicatorPrivate { + gchar * att_accessible_desc; + guint label_change_idle; + +- GtkStatusIcon * status_icon; ++ XAppStatusIcon * status_icon; + gint fallback_timer; + + /* Fun stuff */ +@@ -186,14 +190,11 @@ static void check_connect (AppIndicator + 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); ++static XAppStatusIcon * fallback (AppIndicator * self); + static void status_icon_status_wrapper (AppIndicator * self, const gchar * status, gpointer data); +-static gboolean scroll_event_wrapper(GtkWidget *status_icon, GdkEventScroll *event, gpointer user_data); +-static gboolean middle_click_wrapper(GtkWidget *status_icon, GdkEventButton *event, gpointer user_data); ++// static gboolean scroll_event_wrapper(GtkWidget *status_icon, GdkEventScroll *event, gpointer user_data); + static void status_icon_changes (AppIndicator * self, gpointer data); +-static void status_icon_activate (GtkStatusIcon * icon, gpointer data); +-static void status_icon_menu_activate (GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer user_data); +-static void unfallback (AppIndicator * self, GtkStatusIcon * status_icon); ++static void unfallback (AppIndicator * self, XAppStatusIcon * status_icon); + static gchar * append_panel_icon_suffix (const gchar * icon_name); + static gchar * get_real_theme_path (AppIndicator * self); + static gchar * append_snap_prefix (const gchar * path); +@@ -988,6 +989,9 @@ app_indicator_set_property (GObject * ob + + if (g_strcmp0(oldlabel, priv->label) != 0) { + signal_label_change(APP_INDICATOR(object)); ++ if (priv->status_icon != NULL) { ++ xapp_status_icon_set_label (priv->status_icon, priv->label ? priv->label : ""); ++ } + } + + if (oldlabel != NULL) { +@@ -1019,15 +1023,16 @@ app_indicator_set_property (GObject * ob + g_warning("Unable to send signal for NewTitle: %s", error->message); + g_error_free(error); + } ++ ++ if (priv->status_icon != NULL) { ++ xapp_status_icon_set_tooltip_text (priv->status_icon, priv->title ? priv->title : ""); ++ } + } + + if (oldtitle != NULL) { + g_free(oldtitle); + } + +- if (priv->status_icon != NULL) { +- gtk_status_icon_set_title(priv->status_icon, priv->title ? priv->title : ""); +- } + break; + } + case PROP_LABEL_GUIDE: { +@@ -1557,19 +1562,60 @@ theme_changed_cb (GtkIconTheme * theme, + return; + } + ++/* Handles the middle-click secondary action coming from XAppStatusIcon. */ ++static void ++status_icon_menu_button_activate (XAppStatusIcon *status_icon, ++ guint button, ++ guint activate_time, ++ gpointer user_data) ++{ ++ AppIndicator *self = APP_INDICATOR (user_data); ++ ++ if (button == GDK_BUTTON_PRIMARY || button == GDK_BUTTON_MIDDLE) { ++ GtkWidget *menuitem = self->priv->sec_activate_target; ++ ++ if (menuitem != NULL && ++ gtk_widget_get_visible (menuitem) && ++ gtk_widget_get_sensitive (menuitem)) ++ { ++ gtk_widget_activate (menuitem); ++ } ++ } ++} ++ ++static void ++status_icon_set_has_secondary_activate (XAppStatusIcon *icon, ++ gboolean has) ++{ ++ if (icon != NULL) ++ { ++ g_object_set_data (G_OBJECT (icon), ++ "app-indicator-has-secondary-activate", GINT_TO_POINTER (has)); ++ } ++} ++ + /* Creates a StatusIcon that can be used when the application + indicator area isn't available. */ +-static GtkStatusIcon * ++static XAppStatusIcon * + fallback (AppIndicator * self) + { +- GtkStatusIcon * icon = gtk_status_icon_new(); ++ XAppStatusIcon * icon = xapp_status_icon_new(); ++ ++ xapp_status_icon_set_name(icon, app_indicator_get_id(self)); + +- gtk_status_icon_set_name(icon, app_indicator_get_id(self)); + const gchar * title = app_indicator_get_title(self); + if (title != NULL) { +- gtk_status_icon_set_title(icon, title); ++ xapp_status_icon_set_tooltip_text (icon, title); + } + ++ xapp_status_icon_set_label (icon, app_indicator_get_label (self)); ++ ++ /* Tell xapp-status-icon where this is coming from. It will change the behavior ++ * of left clicks accordingly (to open the menu instead of some sort of 'activation') */ ++ g_object_set_data (G_OBJECT (icon), "app-indicator", GINT_TO_POINTER (1)); ++ ++ status_icon_set_has_secondary_activate (icon, self->priv->sec_activate_enabled); ++ + g_signal_connect(G_OBJECT(self), APP_INDICATOR_SIGNAL_NEW_STATUS, + G_CALLBACK(status_icon_status_wrapper), icon); + g_signal_connect(G_OBJECT(self), APP_INDICATOR_SIGNAL_NEW_ICON, +@@ -1577,12 +1623,11 @@ fallback (AppIndicator * self) + g_signal_connect(G_OBJECT(self), APP_INDICATOR_SIGNAL_NEW_ATTENTION_ICON, + G_CALLBACK(status_icon_changes), icon); + ++ xapp_status_icon_set_secondary_menu (icon, app_indicator_get_menu (self)); ++ + status_icon_changes(self, icon); + +- g_signal_connect(G_OBJECT(icon), "activate", G_CALLBACK(status_icon_activate), self); +- g_signal_connect(G_OBJECT(icon), "popup-menu", G_CALLBACK(status_icon_menu_activate), self); +- g_signal_connect(G_OBJECT(icon), "scroll-event", G_CALLBACK(scroll_event_wrapper), self); +- g_signal_connect(G_OBJECT(icon), "button-release-event", G_CALLBACK(middle_click_wrapper), self); ++ g_signal_connect(G_OBJECT(icon), "activate", G_CALLBACK(status_icon_menu_button_activate), self); + + return icon; + } +@@ -1597,49 +1642,22 @@ status_icon_status_wrapper (AppIndicator + + /* A wrapper for redirecting the scroll events to the app-indicator from status + icon widget. */ +-static gboolean +-scroll_event_wrapper (GtkWidget *status_icon, GdkEventScroll *event, gpointer data) +-{ +- g_return_val_if_fail(IS_APP_INDICATOR(data), FALSE); +- AppIndicator * app = APP_INDICATOR(data); +- g_signal_emit(app, signals[SCROLL_EVENT], 0, 1, event->direction); +- +- return TRUE; +-} ++// static gboolean ++// scroll_event_wrapper (GtkWidget *status_icon, GdkEventScroll *event, gpointer data) ++// { ++// g_return_val_if_fail(IS_APP_INDICATOR(data), FALSE); ++// AppIndicator * app = APP_INDICATOR(data); ++// g_signal_emit(app, signals[SCROLL_EVENT], 0, 1, event->direction); + +-static gboolean +-middle_click_wrapper (GtkWidget *status_icon, GdkEventButton *event, gpointer data) +-{ +- g_return_val_if_fail(IS_APP_INDICATOR(data), FALSE); +- AppIndicator * app = APP_INDICATOR(data); +- AppIndicatorPrivate *priv = app->priv; +- +- if (event->button == 2 && event->type == GDK_BUTTON_RELEASE) { +- GtkAllocation alloc; +- gint px = event->x; +- gint py = event->y; +- gtk_widget_get_allocation (status_icon, &alloc); +- GtkWidget *menuitem = priv->sec_activate_target; +- +- if (px >= 0 && px < alloc.width && py >= 0 && py < alloc.height && +- priv->sec_activate_enabled && menuitem && +- gtk_widget_get_visible (menuitem) && +- gtk_widget_get_sensitive (menuitem)) +- { +- gtk_widget_activate (menuitem); +- return TRUE; +- } +- } +- +- return FALSE; +-} ++// return TRUE; ++// } + + /* This tracks changes to either the status or the icons + that are associated with the app indicator */ + static void + status_icon_changes (AppIndicator * self, gpointer data) + { +- GtkStatusIcon * icon = GTK_STATUS_ICON(data); ++ XAppStatusIcon * icon = XAPP_STATUS_ICON(data); + + /* add the icon_theme_path once if needed */ + GtkIconTheme *icon_theme = gtk_icon_theme_get_default(); +@@ -1668,17 +1686,17 @@ status_icon_changes (AppIndicator * self + switch (app_indicator_get_status(self)) { + case APP_INDICATOR_STATUS_PASSIVE: + /* hide first to avoid that the change is visible to the user */ +- gtk_status_icon_set_visible(icon, FALSE); ++ xapp_status_icon_set_visible(icon, FALSE); + icon_name = app_indicator_get_icon(self); + break; + case APP_INDICATOR_STATUS_ACTIVE: + icon_name = app_indicator_get_icon(self); +- gtk_status_icon_set_visible(icon, TRUE); ++ xapp_status_icon_set_visible(icon, TRUE); + break; + case APP_INDICATOR_STATUS_ATTENTION: + /* get the _attention_ icon here */ + icon_name = app_indicator_get_attention_icon(self); +- gtk_status_icon_set_visible(icon, TRUE); ++ xapp_status_icon_set_visible(icon, TRUE); + break; + }; + +@@ -1686,16 +1704,45 @@ status_icon_changes (AppIndicator * self + gchar *snapped_icon = append_snap_prefix(icon_name); + + if (g_file_test(icon_name, G_FILE_TEST_EXISTS)) { +- gtk_status_icon_set_from_file(icon, icon_name); ++ xapp_status_icon_set_icon_name(icon, icon_name); + } else if (snapped_icon && g_file_test(snapped_icon, G_FILE_TEST_EXISTS)) { +- gtk_status_icon_set_from_file(icon, snapped_icon); ++ xapp_status_icon_set_icon_name(icon, snapped_icon); + } else { + gchar *longname = append_panel_icon_suffix(icon_name); + + if (longname != NULL && gtk_icon_theme_has_icon (icon_theme, longname)) { +- gtk_status_icon_set_from_icon_name(icon, longname); ++ xapp_status_icon_set_icon_name(icon, longname); + } else { +- gtk_status_icon_set_from_icon_name(icon, icon_name); ++ if (gtk_icon_theme_has_icon (icon_theme, icon_name)) { ++ xapp_status_icon_set_icon_name(icon, icon_name); ++ } else { ++ gint i; ++ gchar *icon_path; ++ ++ const gchar *extensions[] = { ++ "png", ++ "svg", ++ }; ++ ++ for (i = 0; i < G_N_ELEMENTS (extensions); i++) { ++ icon_path = g_strdup_printf ("%s/%s.%s", theme_path, icon_name, extensions[i]); ++ ++ if (g_file_test (icon_path, G_FILE_TEST_EXISTS)) { ++ break; ++ } ++ ++ g_clear_pointer (&icon_path, g_free); ++ } ++ ++ if (icon_path) { ++ xapp_status_icon_set_icon_name (icon, icon_path); ++ g_free (icon_path); ++ } else { ++ // Should we do this?? Otherwise there's a blank (but reactive) ++ // space in the panel ++ xapp_status_icon_set_icon_name (icon, FALLBACK_ICON); ++ } ++ } + } + + g_free(longname); +@@ -1707,44 +1754,16 @@ status_icon_changes (AppIndicator * self + return; + } + +-/* Handles the activate action by the status icon by showing +- the menu in a popup. */ +-static void +-status_icon_activate (GtkStatusIcon * icon, gpointer data) +-{ +- GtkMenu * menu = app_indicator_get_menu(APP_INDICATOR(data)); +- if (menu == NULL) +- return; +- +- gtk_menu_popup(menu, +- NULL, /* Parent Menu */ +- NULL, /* Parent item */ +- gtk_status_icon_position_menu, +- icon, +- 1, /* Button */ +- gtk_get_current_event_time()); +- +- return; +-} +- +-/* Handles the right-click action by the status icon by showing +- the menu in a popup. */ +-static void +-status_icon_menu_activate (GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer user_data) +-{ +- status_icon_activate(status_icon, user_data); +-} +- + /* Removes the status icon as the application indicator area + is now up and running again. */ + static void +-unfallback (AppIndicator * self, GtkStatusIcon * status_icon) ++unfallback (AppIndicator * self, XAppStatusIcon * status_icon) + { + g_signal_handlers_disconnect_by_func(G_OBJECT(self), status_icon_status_wrapper, status_icon); + g_signal_handlers_disconnect_by_func(G_OBJECT(self), status_icon_changes, status_icon); +- g_signal_handlers_disconnect_by_func(G_OBJECT(self), scroll_event_wrapper, status_icon); +- g_signal_handlers_disconnect_by_func(G_OBJECT(self), middle_click_wrapper, status_icon); +- gtk_status_icon_set_visible(status_icon, FALSE); ++ g_signal_handlers_disconnect_by_func(G_OBJECT(self), status_icon_menu_button_activate, status_icon); ++ ++ xapp_status_icon_set_visible(status_icon, FALSE); + g_object_unref(G_OBJECT(status_icon)); + return; + } +@@ -1796,6 +1815,8 @@ sec_activate_target_parent_changed(GtkWi + g_return_if_fail(IS_APP_INDICATOR(data)); + AppIndicator *self = data; + self->priv->sec_activate_enabled = widget_is_menu_child(self, menuitem); ++ ++ status_icon_set_has_secondary_activate (self->priv->status_icon, self->priv->sec_activate_enabled); + } + + +@@ -2089,6 +2110,7 @@ app_indicator_set_label (AppIndicator *s + PROP_LABEL_GUIDE_S, guide == NULL ? "" : guide, + NULL); + ++ + return; + } + +@@ -2260,9 +2282,14 @@ app_indicator_set_menu (AppIndicator *se + priv->menu = GTK_WIDGET (menu); + g_object_ref_sink (priv->menu); + ++ if (self->priv->status_icon) { ++ xapp_status_icon_set_secondary_menu (self->priv->status_icon, menu); ++ } ++ + setup_dbusmenu (self); + + priv->sec_activate_enabled = widget_is_menu_child (self, priv->sec_activate_target); ++ status_icon_set_has_secondary_activate (self->priv->status_icon, priv->sec_activate_enabled); + + check_connect (self); + +@@ -2316,6 +2343,7 @@ app_indicator_set_secondary_activate_tar + self); + g_object_unref(G_OBJECT(priv->sec_activate_target)); + priv->sec_activate_target = NULL; ++ status_icon_set_has_secondary_activate (priv->status_icon, FALSE); + } + + if (menuitem == NULL) { +@@ -2326,6 +2354,7 @@ app_indicator_set_secondary_activate_tar + + priv->sec_activate_target = g_object_ref(menuitem); + priv->sec_activate_enabled = widget_is_menu_child(self, menuitem); ++ status_icon_set_has_secondary_activate (priv->status_icon, priv->sec_activate_enabled); + g_signal_connect(menuitem, "parent-set", G_CALLBACK(sec_activate_target_parent_changed), self); + } + +--- a/src/app-indicator.h ++++ b/src/app-indicator.h +@@ -32,6 +32,14 @@ License version 3 and version 2.1 along + + #include + ++#if GTK_MAJOR_VERSION == 3 ++#define USE_XAPP_FALLBACK 1 ++#endif ++ ++#ifdef USE_XAPP_FALLBACK ++#include ++#endif ++ + G_BEGIN_DECLS + + /** +@@ -218,10 +226,18 @@ struct _AppIndicatorClass { + void (*app_indicator_reserved_ats)(void); + + /* Overridable Functions */ ++#ifdef USE_XAPP_FALLBACK ++ XAppStatusIcon * (*fallback) (AppIndicator * indicator); ++ void (*unfallback) (AppIndicator * indicator, ++ XAppStatusIcon * status_icon); ++ ++#else + GtkStatusIcon * (*fallback) (AppIndicator * indicator); + void (*unfallback) (AppIndicator * indicator, + GtkStatusIcon * status_icon); + ++#endif ++ + /* Reserved */ + void (*app_indicator_reserved_1)(void); + void (*app_indicator_reserved_2)(void); +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -57,7 +57,6 @@ libappindicatorinclude_HEADERS = \ + libappindicator_la_SOURCES = \ + $(libappindicator_headers) \ + app-indicator-enum-types.c \ +- app-indicator.c \ + application-service-marshal.c \ + dbus-shared.h \ + generate-id.h \ +@@ -69,6 +68,14 @@ libappindicator_la_SOURCES = \ + gen-notification-watcher.xml.h \ + gen-notification-watcher.xml.c + ++if USE_GTK3 ++libappindicator_la_SOURCES += \ ++ app-indicator.c ++else ++libappindicator_la_SOURCES += \ ++ app-indicator-gtk2.c ++endif ++ + libappindicator_la_LDFLAGS = \ + $(COVERAGE_LDFLAGS) \ + -version-info 1:0:0 \ +@@ -151,9 +158,15 @@ INTROSPECTION_COMPILER_ARGS = --included + + if HAVE_INTROSPECTION + ++if USE_GTK3 + introspection_sources = \ + $(addprefix $(srcdir)/,app-indicator.c) \ + $(addprefix $(srcdir)/,$(libappindicator_headers)) ++else ++introspection_sources = \ ++ $(addprefix $(srcdir)/,app-indicator-gtk2.c) \ ++ $(addprefix $(srcdir)/,$(libappindicator_headers)) ++endif + + AppIndicator3-0.1.gir: libappindicator3.la + +--- a/tests/test-libappindicator-fallback-item.c ++++ b/tests/test-libappindicator-fallback-item.c +@@ -31,8 +31,14 @@ GType test_libappindicator_fallback_item + + static void test_libappindicator_fallback_item_class_init (TestLibappindicatorFallbackItemClass *klass); + static void test_libappindicator_fallback_item_init (TestLibappindicatorFallbackItem *self); ++ ++#ifdef USE_XAPP_FALLBACK ++static XAppStatusIcon * fallback (AppIndicator * indicator); ++static void unfallback (AppIndicator * indicator, XAppStatusIcon * status_icon); ++#else + static GtkStatusIcon * fallback (AppIndicator * indicator); + static void unfallback (AppIndicator * indicator, GtkStatusIcon * status_icon); ++#endif + + G_DEFINE_TYPE (TestLibappindicatorFallbackItem, test_libappindicator_fallback_item, APP_INDICATOR_TYPE); + +@@ -63,6 +69,39 @@ enum { + + gint state = STATE_INIT; + ++#ifdef USE_XAPP_FALLBACK ++static XAppStatusIcon * ++fallback (AppIndicator * indicator) ++{ ++ g_debug("Fallback"); ++ if (state == STATE_INIT) { ++ state = STATE_FALLBACK; ++ } else if (state == STATE_UNFALLBACK) { ++ state = STATE_REFALLBACK; ++ } else { ++ g_debug("Error, fallback in state: %d", state); ++ passed = FALSE; ++ } ++ return (XAppStatusIcon *)5; ++} ++ ++static void ++unfallback (AppIndicator * indicator, XAppStatusIcon * status_icon) ++{ ++ g_debug("Unfallback"); ++ if (state == STATE_FALLBACK) { ++ state = STATE_UNFALLBACK; ++ } else if (state == STATE_REFALLBACK) { ++ state = STATE_REUNFALLBACK; ++ passed = TRUE; ++ g_main_loop_quit(mainloop); ++ } else { ++ g_debug("Error, unfallback in state: %d", state); ++ passed = FALSE; ++ } ++ return; ++} ++#else + static GtkStatusIcon * + fallback (AppIndicator * indicator) + { +@@ -94,6 +133,7 @@ unfallback (AppIndicator * indicator, Gt + } + return; + } ++#endif // USE_XAPP_FALLBACK + + gboolean + kill_func (gpointer data)