linuxmint / blueberry

A Bluetooth configuration tool
GNU General Public License v3.0
170 stars 51 forks source link

AppIndicator port of blueberry-tray.py #120

Open oniGino opened 2 years ago

oniGino commented 2 years ago

For those like me running Wayland based DE, here is a patch of blueberry-tray.py to use libappindicator instead of xapp

If someone is willing to do some additional testing it might be worth getting merged.

--- /usr/lib/blueberry/blueberry-tray.py.org    2021-12-13 01:02:56.923349069 -0800
+++ /usr/lib/blueberry/blueberry-tray.py    2021-12-13 02:21:23.253300141 -0800
@@ -5,8 +5,8 @@
 import gi
 gi.require_version('Gtk', '3.0')
 gi.require_version('GnomeBluetooth', '1.0')
-gi.require_version('XApp', '1.0')
-from gi.repository import Gtk, Gdk, GnomeBluetooth, Gio, XApp
+gi.require_version('AppIndicator3', '0.1')
+from gi.repository import AppIndicator3, Gtk, Gdk, GnomeBluetooth, Gio
 import rfkillMagic
 import setproctitle
 import subprocess
@@ -53,12 +53,16 @@
         self.model.connect('row-deleted', self.update_icon_callback)
         self.model.connect('row-inserted', self.update_icon_callback)

-        self.icon = XApp.StatusIcon()
-        self.icon.set_name("blueberry")
-        self.icon.set_tooltip_text(_("Bluetooth"))
-        self.icon.connect("activate", self.on_statusicon_activated)
-        self.icon.connect("button-release-event", self.on_statusicon_released)
-
+        self.paired_devices = {}
+
+        self.icon = AppIndicator3.Indicator.new(
+            'BlueBerry',
+            'blueberry',
+            AppIndicator3.IndicatorCategory.SYSTEM_SERVICES
+        )
+        self.icon.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
+        self.icon.set_menu(self.build_menu())
+
         self.update_icon_callback(None, None, None)

     def on_settings_changed_cb(self, setting, key, data=None):
@@ -71,21 +75,18 @@
             return

         if self.rfkill.hard_block or self.rfkill.soft_block:
-            self.icon.set_icon_name(self.tray_disabled_icon)
-            self.icon.set_tooltip_text(_("Bluetooth is disabled"))
+            self.icon.set_icon(self.tray_disabled_icon)
         else:
-            self.icon.set_icon_name(self.tray_icon)
+            self.icon.set_icon(self.tray_icon)
             self.update_connected_state()

     def update_connected_state(self):
         self.get_devices()

         if len(self.connected_devices) > 0:
-            self.icon.set_icon_name(self.tray_active_icon)
-            self.icon.set_tooltip_text(_("Bluetooth: Connected to %s") % (", ".join(self.connected_devices)))
+            self.icon.set_icon(self.tray_active_icon)
         else:
-            self.icon.set_icon_name(self.tray_icon)
-            self.icon.set_tooltip_text(_("Bluetooth"))
+            self.icon.set_icon(self.tray_icon)

     def get_devices(self):
         self.connected_devices = []
@@ -117,13 +118,14 @@

                 iter = self.model.iter_next(iter)

-    def on_statusicon_activated(self, icon, button, time):
-        if button == Gdk.BUTTON_PRIMARY:
-            subprocess.Popen(["blueberry"])
+    def start_blueberry(self):
+        subprocess.Popen(["blueberry"])

-    def on_statusicon_released(self, icon, x, y, button, time, position):
-        if button == 3:
+    def build_menu(self):
             menu = Gtk.Menu()
+            blueberry_exec = Gtk.MenuItem(label=_("BlueBerry"))
+            blueberry_exec.connect("activate", self.start_blueberry)
+            menu.append(blueberry_exec)

             if not self.rfkill.hard_block:
                 if self.rfkill.soft_block:
@@ -168,7 +170,7 @@
             menu.append(item)

             menu.show_all()
-            icon.popup_menu(menu, x, y, button, time, position)
+            return menu

     def toggle_connect_cb(self, item, data = None):
         proxy = self.paired_devices[data]
albsch commented 2 years ago

I applied the patch and it works well. Thank you! No problems so far.

Crystal4276 commented 1 year ago

The nm-applet normally working with systray when loaded as nm-applet --indicator becomes usable with status.notifier. @oniGino Would you consider rewriting the code above to allow such feature and propose it as a pull request ?

jthomaschewski commented 1 year ago

I can confirm that the patch works for me on Sway. Thanks!
I have created an AUR package for Arch Linux for easier installation until this is merged: https://aur.archlinux.org/packages/blueberry-wayland

lucasew commented 9 months ago

Just a little contribution:

This expression derives the nixpkgs blueberry using this patch:

pkgs.blueberry.overrideAttrs (old: {
  patches = (old.patches or []) ++ [ ./blueberry-tray-fix.patch ];
  buildInputs = old.buildInputs ++ [ pkgs.libappindicator-gtk3 ];
})

It works but doesn't show any icon by default, this appears in the logs just after blueberry is started.

out 11 21:44:05 riverwood blueberry-tray-start[711802]: /nix/store/m3s1hh7hgn5s514j3mgx27qjx8xxbb05-blueberry-1.4.8/lib/blueberry/.blueberry-tray.py-wrapped:81: Deprec>
out 11 21:44:05 riverwood blueberry-tray-start[711802]:   self.icon.set_icon(self.tray_icon)

Everything else works fine. I am running Hyprland on NixOS.

Edit 1: Thank you for the patch <3