Add new linux app
not sure if this is gonna stay in this repo (reason below)
So, the current Qt app wasn’t really as updated as the Android app- the maintainer didn’t have time, and it was too different from the Android implementation for me to easily port new stuff.
This new app is built in Rust, using the iced library, and borrowing the AACP and ATT implementation from the Android app. This app also has a much better UI, and now isn’t just limited to AirPods! The AirPods basic implementation like ear detection and conversational awareness is already in place, along with battery and changing ANC mode.
To-Do List
- [x] Add basic UI
- Device state and connection handling skeleton
- [x] Handle new connections
- [ ] Handle disconnections
- Improve the tray
- [ ] add a channel between window and tray to make the tray update when customized
- [ ] handle multiple devices
- [ ] handle disconnections
- [ ] use devicemanagers instead of a channel between bluetooth thread and tray thread
- Misc
- [ ] take ear status from LE for taking ownership and audio, not received over AACP without taking control first
- Add AACP settings
- [x] Implement the aacp handler
- [ ] Add a advanced page which allows sending custom packets and control command values
- [ ] Add everything to the UI
- ATT related
- [x] Implement the manager
- [ ] For some reason, connection is refused by AirPods sometimes; haven’t traced the cause yet
- [ ] Handle ATT manager, while keeping it optional- not everyone would change their BlueZ config
- [ ] Add the UI: Yet to decide if I want multiple settings pages for each device, or just out everything on a single page under different sections (like transparency settings, and hearing aid settings will take up space, and can be better of separated)
- [ ] expose everything over dbus
- ~Nothing~ will work on this after airpods so it can be merged first
- [ ] ~Parse notifications~
- [ ] ~Read battery status from bluez (or something else- it's not sent over ATT)~
- Prepare for distribution
- [x] Add CI for Flatpak
- [ ] Add flake.nix
- [x] Possibly, bundle it as an AppImage
can help with testing if need be. Running Fedora KDE 43.
Can help with testing for Arch x86!
Currently trying to run in CachyOS with the following configs:
Linux cachyos-x8664 6.17.8-2-cachyos #1 SMP PREEMPT_DYNAMIC Sun, 16 Nov 2025 09:39:41 +0000 x86_64 GNU/Linux
-------------------
OS: CachyOS x86_64
Host: MS-7E27 (1.0)
Kernel: Linux 6.17.8-2-cachyos
Uptime: 59 mins
Packages: 1474 (pacman)
Shell: fish 4.2.1
Display (GSM5C7C): 2560x1440 in 27", 240 Hz [External]
DE: KDE Plasma 6.5.2
WM: KWin (Wayland)
WM Theme: Breeze
Theme: Breeze (Dark) [Qt], Breeze-Dark [GTK2], Breeze [GTK3]
Icons: breeze-dark [Qt], breeze-dark [GTK2/3/4]
Font: Noto Sans (10pt) [Qt], Noto Sans (10pt) [GTK2/3/4]
Cursor: breeze (24px)
Terminal: konsole 25.8.3
CPU: AMD Ryzen 7 9800X3D (16) @ 5.27 GHz
GPU 1: NVIDIA GeForce RTX 5070 [Discrete]
GPU 2: AMD Radeon Graphics [Integrated]
Memory: 4.90 GiB / 30.45 GiB (16%)
Swap: 224.00 KiB / 30.45 GiB (0%)
Disk (/): 367.95 GiB / 2.22 TiB (16%) - btrfs
Disk (/mnt/ext4_PT): 77.82 GiB / 1.83 TiB (4%) - ext4
Local IP (enp12s0): 192.168.1.10/24
Locale: en_US.UTF-8
When trying to run the AppImage, I get the following in stdout:
[2025-11-17T22:20:43Z ERROR librepods] Failed to read devices file: No such file or directory (os error 2)
[2025-11-17T22:20:43Z INFO zbus::connection::handshake::common] write_command; command=Auth(Some(External), Some([49, 48, 48, 48]))
[2025-11-17T22:20:43Z INFO zbus::connection::handshake::common] write_commands; commands=[Auth(Some(External), Some([49, 48, 48, 48]))] extra_bytes=None
[2025-11-17T22:20:43Z INFO zbus::connection::handshake::common] read_commands; n_commands=1
[2025-11-17T22:20:43Z INFO zbus::connection::handshake::common] write_commands; commands=[NegotiateUnixFD, Begin] extra_bytes=Some([108, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 109, 0, 0, 0, 1, 1, 111, 0, 21, 0, 0, 0, 47, 111, 114, 103, 47, 102, 114, 101, 101, 100, 101, 115, 107, 116, 111, 112, 47, 68, 66, 117, 115, 0, 0, 0, 2, 1, 115, 0, 20, 0, 0, 0, 111, 114, 103, 46, 102, 114, 101, 101, 100, 101, 115, 107, 116, 111, 112, 46, 68, 66, 117, 115, 0, 0, 0, 0, 3, 1, 115, 0, 5, 0, 0, 0, 72, 101, 108, 108, 111, 0, 0, 0, 6, 1, 115, 0, 20, 0, 0, 0, 111, 114, 103, 46, 102, 114, 101, 101, 100, 101, 115, 107, 116, 111, 112, 46, 68, 66, 117, 115, 0, 0, 0, 0])
[2025-11-17T22:20:43Z INFO zbus::connection::handshake::client] receive_secondary_responses; expected_n_responses=1
[2025-11-17T22:20:43Z INFO zbus::connection::handshake::common] read_commands; n_commands=1
[2025-11-17T22:20:43Z INFO zbus::connection] start_object_server; started_event=Some(Event { listeners_notified: 0, listeners_total: 1 })
[2025-11-17T22:20:43Z INFO zbus::connection] monitor_name_lost; name=org.kde.StatusNotifierItem-52493-1
[2025-11-17T22:20:43Z INFO zbus::proxy] {}; task_name="org.kde.StatusNotifierWatcher proxy caching"
[2025-11-17T22:20:43Z INFO librepods] Listening for new connections.
[2025-11-17T22:20:43Z INFO librepods] Checking for connected devices...
[2025-11-17T22:20:43Z INFO librepods] Starting LE monitor...
[2025-11-17T22:20:43Z INFO librepods] Found connected AirPods: AirPods Pro, initializing.
[2025-11-17T22:20:43Z INFO librepods::devices::airpods] Creating new AirPodsDevice for D0:3E:07:F2:65:7F
[2025-11-17T22:20:43Z INFO librepods::bluetooth::aacp] AACPManager connecting to D0:3E:07:F2:65:7F on PSM 0x1001...
[2025-11-17T22:20:43Z ERROR librepods] LE monitor error: internal error: D-Bus error org.freedesktop.DBus.Error.UnknownMethod: Method "RegisterMonitor" with signature "o" on interface "org.bluez.AdvertisementMonitorManager1" doesn't exist
[2025-11-17T22:20:43Z INFO zbus::object_server] dispatch_call; msg=Msg { type: MethodCall, serial: 7560, sender: UniqueName(":1.27"), path: ObjectPath("/StatusNotifierItem"), iface: InterfaceName("org.freedesktop.DBus.Properties"), member: MemberName("GetAll"), body: Str, fds: [] } hdr=Header { primary: PrimaryHeader { endian_sig: Little, msg_type: MethodCall, flags: BitFlags<Flags>(0b0), protocol_version: 1, body_len: 31, serial_num: 7560 }, fields: Fields { path: Some(ObjectPath("/StatusNotifierItem")), interface: Some(InterfaceName("org.freedesktop.DBus.Properties")), member: Some(MemberName("GetAll")), error_name: None, reply_serial: None, destination: Some(BusName::WellKnown("org.kde.StatusNotifierItem-52493-1")), sender: Some(UniqueName(":1.27")), signature: Str, unix_fds: None } }
[2025-11-17T22:20:43Z INFO zbus::object_server] dispatch_call; msg=Msg { type: MethodCall, serial: 7564, sender: UniqueName(":1.27"), path: ObjectPath("/MenuBar"), iface: InterfaceName("com.canonical.dbusmenu"), member: MemberName("GetLayout"), body: Structure(Dynamic { fields: [I32, I32, Array(Dynamic { child: Str })] }), fds: [] } hdr=Header { primary: PrimaryHeader { endian_sig: Little, msg_type: MethodCall, flags: BitFlags<Flags>(0b0), protocol_version: 1, body_len: 12, serial_num: 7564 }, fields: Fields { path: Some(ObjectPath("/MenuBar")), interface: Some(InterfaceName("com.canonical.dbusmenu")), member: Some(MemberName("GetLayout")), error_name: None, reply_serial: None, destination: Some(BusName::WellKnown("org.kde.StatusNotifierItem-52493-1")), sender: Some(UniqueName(":1.27")), signature: Structure(Dynamic { fields: [I32, I32, Array(Dynamic { child: Str })] }), unix_fds: None } }
[2025-11-17T22:20:43Z WARN wgpu_hal::gles::egl] No config found!
[2025-11-17T22:20:43Z WARN wgpu_hal::gles::egl] EGL says it can present to the window but not natively
[2025-11-17T22:20:43Z WARN wgpu_hal::vulkan::conv] Unrecognized present mode 1000361000
[2025-11-17T22:20:43Z ERROR librepods::ui::window] Failed to read devices file: No such file or directory (os error 2)
[destroyed object]: error 7: importing the supplied dmabufs failed
Protocol error 7 on object @0:
[2025-11-17T22:20:43Z ERROR wgpu_hal::vulkan::adapter] get_physical_device_surface_present_modes: ERROR_SURFACE_LOST_KHR
[2025-11-17T22:20:43Z ERROR wgpu_hal::vulkan::adapter] get_physical_device_surface_formats: ERROR_SURFACE_LOST_KHR
thread 'main' (52493) panicked at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wgpu-core-0.19.4/src/device/global.rs:1859:21:
internal error: entered unreachable code: Fallback system failed to choose present mode. This is a bug. Mode: AutoVsync, Options: []
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
[appimagelauncher-binfmt-bypass/lib] ERROR: child exited with code 6
I'll see if I can deep dive it a bit more to provide some additional info!
@guerra08 https://github.com/kavishdevar/librepods/issues/262#issuecomment-3543971374
I've got the following terminal output when trying to run it on the latest Fedora:
[2025-11-18T09:43:04Z ERROR librepods] Failed to read devices file: No such file or directory (os error 2)
[2025-11-18T09:43:04Z INFO zbus::connection::handshake::common] write_command; command=Auth(Some(External), Some([49, 48, 48, 48]))
[2025-11-18T09:43:04Z INFO zbus::connection::handshake::common] write_commands; commands=[Auth(Some(External), Some([49, 48, 48, 48]))] extra_bytes=None
[2025-11-18T09:43:04Z INFO zbus::connection::handshake::common] read_commands; n_commands=1
[2025-11-18T09:43:04Z INFO zbus::connection::handshake::common] write_commands; commands=[NegotiateUnixFD, Begin] extra_bytes=Some([108, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 109, 0, 0, 0, 1, 1, 111, 0, 21, 0, 0, 0, 47, 111, 114, 103, 47, 102, 114, 101, 101, 100, 101, 115, 107, 116, 111, 112, 47, 68, 66, 117, 115, 0, 0, 0, 2, 1, 115, 0, 20, 0, 0, 0, 111, 114, 103, 46, 102, 114, 101, 101, 100, 101, 115, 107, 116, 111, 112, 46, 68, 66, 117, 115, 0, 0, 0, 0, 3, 1, 115, 0, 5, 0, 0, 0, 72, 101, 108, 108, 111, 0, 0, 0, 6, 1, 115, 0, 20, 0, 0, 0, 111, 114, 103, 46, 102, 114, 101, 101, 100, 101, 115, 107, 116, 111, 112, 46, 68, 66, 117, 115, 0, 0, 0, 0])
[2025-11-18T09:43:04Z INFO zbus::connection::handshake::client] receive_secondary_responses; expected_n_responses=1
[2025-11-18T09:43:04Z INFO zbus::connection::handshake::common] read_commands; n_commands=1
[2025-11-18T09:43:04Z INFO zbus::connection] start_object_server; started_event=Some(Event { listeners_notified: 0, listeners_total: 1 })
[2025-11-18T09:43:04Z INFO zbus::connection] monitor_name_lost; name=org.kde.StatusNotifierItem-10365-1
thread '<unnamed>' (10374) panicked at src/main.rs:103:41:
called `Result::unwrap()` on an `Err` value: Watcher(ServiceUnknown("The name is not activatable"))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
.',;::::;,'.
.';:cccccccccccc:;,. ---------------------
.;cccccccccccccccccccccc;. OS: Fedora Linux 43 (Workstation Edition) x86_64
.:cccccccccccccccccccccccccc:. Host: 20FAS0GS00 (ThinkPad T460s)
.;ccccccccccccc;.:dddl:.;ccccccc;. Kernel: Linux 6.17.7-300.fc43.x86_64
.:ccccccccccccc;OWMKOOXMWd;ccccccc:. Uptime: 37 mins
.:ccccccccccccc;KMMc;cc;xMMc;ccccccc:. Packages: 2340 (rpm), 26 (flatpak)
,cccccccccccccc;MMM.;cc;;WW:;cccccccc, Shell: bash 5.3.0
:cccccccccccccc;MMM.;cccccccccccccccc: Display (LGD0521): 1920x1080 @ 60 Hz in 14" [Built-in]
:ccccccc;oxOOOo;MMM000k.;cccccccccccc: Display (BenQ PD2705U): 3840x2160 @ 60 Hz (as 2192x1233) in 27" [External] *
cccccc;0MMKxdd:;MMMkddc.;cccccccccccc; DE: GNOME 49.1
ccccc;XMO';cccc;MMM.;cccccccccccccccc' WM: Mutter (Wayland)
ccccc;MMo;ccccc;MMW.;ccccccccccccccc; WM Theme: Adwaita
ccccc;0MNc.ccc.xMMd;ccccccccccccccc; Theme: Adwaita [GTK2/3/4]
cccccc;dNMWXXXWM0:;cccccccccccccc:, Icons: Reversal-dark [GTK2/3/4]
cccccccc;.:odl:.;cccccccccccccc:,. Font: Inter Display (11pt) [GTK2/3/4]
ccccccccccccccccccccccccccccc:'. Cursor: Adwaita (24px)
:ccccccccccccccccccccccc:;,.. Terminal: GNOME Terminal 3.56.3
':cccccccccccccccc::;,. Terminal Font: Roboto Mono (11pt)
CPU: Intel(R) Core(TM) i5-6300U (4) @ 3.00 GHz
GPU: Intel HD Graphics 520 @ 1.00 GHz [Integrated]
Memory: 6.19 GiB / 19.38 GiB (32%)
Swap: 0 B / 8.00 GiB (0%)
Disk (/): 389.17 GiB / 464.17 GiB (84%) - btrfs
Local IP (wlp4s0): 192.168.76.41/24
Battery (01AV405): 100% [AC Connected]
Battery (00HW023): 100% [AC Connected]
Locale: de_DE.UTF-8
Hope this helps, many thanks and best wishes!
@flowsted you need appindicator extension for gnome. try installing that.
What are your thoughts on implementing AACP and ATT functionality as a separate Rust crate for use in other platform-agnostic projects? I'd love to go about creating a GNOME frontend for this.
What are your thoughts on implementing AACP and ATT functionality as a separate Rust crate for use in other platform-agnostic projects? I'd love to go about creating a GNOME frontend for this.
I was planning to exposing functionality over dbus with librepods itself, and add a way to run it without starting the tray or the UI. What do you think of that? But, if I have some spare time, I wouldn't mind separating the protocol implementation.
What are your thoughts on implementing AACP and ATT functionality as a separate Rust crate for use in other platform-agnostic projects? I'd love to go about creating a GNOME frontend for this.
I was planning to exposing functionality over dbus with librepods itself, and add a way to run it without starting the tray or the UI. What do you think of that? But, if I have some spare time, I wouldn't mind separating the protocol implementation.
I think that's fine. Ideally, it would be nice having the protocol exist as a separate dependency from the UI altogether so there's no unused code when the UI isn't used, but whatever makes the most sense to you architecturally.
@kavishdevar Just saw this PR. Great job with this project so far! Seeing as how this is written in Rust with the iced library, would you like me to update #274 to use Rust instead of Qt 6?
Tested the linux/rust branch on Ubuntu with AirPods Pro 2 (A3048).
Environment (neofetch)
OS: Ubuntu 24.04.3 LTS x86_64
Kernel: 6.14.0-35-generic
Host: Victus by HP Gaming Laptop 15-fa0xxx
DE: GNOME 46.0
WM: Mutter
Theme: Yaru [GTK2/3]
CPU: 12th Gen Intel i7-12650H (16) @ 4.600GHz
GPU: Intel Alder Lake-P GT1 [UHD Graphics]
GPU: NVIDIA GeForce RTX 3050 Mobile
Memory: 7.8 GiB / 15.6 GiB
GNOME is running on Wayland. AppIndicator/KStatusNotifier support is present (tray works).
Build + run
git clone https://github.com/kavishdevar/librepods.git librepods-rust
cd librepods-rust
git checkout linux/rust
cd linux-rust
cargo build --release
./target/release/librepods
Startup behaviour
On first run I see:
[ERROR librepods] Failed to read devices file: No such file or directory (os error 2)
(expected, there is no saved devices file yet)
[ERROR librepods] LE monitor error: internal error: D-Bus error org.freedesktop.DBus.Error.UnknownMethod: Method "RegisterMonitor" with signature "o" on interface "org.bluez.AdvertisementMonitorManager1" doesn't exist
So BlueZ on Ubuntu 24.04.3 doesn’t expose org.bluez.AdvertisementMonitorManager1; the LE monitor setup fails, but the app continues:
Listening for new connections.
Starting LE monitor...
Checking for connected devices...
Listening for Bluetooth connections via D-Bus...
No crash; main window and tray icon both appear and remain functional.
AirPods Pro 2 (A3048) – backend behaviour
Steps:
-
Pair AirPods Pro 2 with Ubuntu via GNOME Bluetooth.
-
Ensure they are connected as the current audio output.
-
Start the Rust
librepodsbinary with:./target/release/librepods
Logs show the AirPods-specific path working:
AirPods connected: AirPods Pro, initializing
Creating new AirPodsDevice for AC:07:75:D5:90:F3
AACPManager connecting to AC:07:75:D5:90:F3 on PSM 0x1001...
L2CAP connection established with AC:07:75:D5:90:F3
Sending handshake
Setting feature flags
Requesting notifications
Requesting Proximity Keys: IRK and ENC_KEY
...
Received Information: AirPodsInformation { name: "AirPods Pro", model_number: "A3048", manufacturer: "Apple Inc.", serial_number: "...", ... le_keys: AirPodsLEKeys { irk: "", enc_key: "" } }
...
Received Control Command: ListeningMode, value: 02
Received Control Command: ConversationDetectConfig, value: 02
Received Control Command: AdaptiveVolumeConfig, value: 01
Received Control Command: HearingAid, value: 02
...
Received Connected Devices: [ConnectedDevice { mac: "BC:03:58:13:40:56", info1: 1, info2: 2, type: None }]
So AACP over L2CAP appears to work correctly on this setup: the device is detected, handshake runs, and the client receives a stream of control commands and information.
Battery updates and audio-source changes also appear as expected, e.g.:
[INFO librepods::bluetooth::aacp] Received Audio Source: Some(AudioSource { mac: "BC:03:58:13:40:56", type: Media })
[INFO librepods::bluetooth::aacp] Received Audio Source: Some(AudioSource { mac: "00:00:00:00:00:00", type: None })
[INFO librepods::bluetooth::aacp] Received Battery Info: [BatteryInfo { component: Right, level: 97, status: NotCharging }, BatteryInfo { component: Left, level: 100, status: NotCharging }, BatteryInfo { component: Case, level: 0, status: Disconnected }]
Device “Add” flow and Nothing vs AirPods
Initial attempt via the “Add” UI:
-
Clicking the “+” button opens “Pick a paired device to add”.
-
Paired devices shown include:
AirPods Pro AC:07:75:D5:90:F3- Some Logitech devices.
For the AirPods row, the Device Type combo box currently only offers Nothing. There is no “AirPods” choice.
If I select Nothing and click Add:
-
The left sidebar shows:
AirPods Pro Connected – AC:07:75:D5:90:F3
-
The main pane shows:
No state available for this Nothing device
So the AirPods entry is treated as a “Nothing” device in the UI and the center panel remains empty, even though the backend is clearly running the AirPods-specific path.
After this, I quit the app (Ctrl-C in the terminal + quit from tray) and restarted it without reusing the “Add device” dialog. On the next start:
-
The sidebar still shows
AirPods Pro – Connected – AC:07:75:D5:90:F3. -
The main pane now shows an AirPods-specific UI, including a
Noise Control Modedropdown with options:- Off
- Transparency
- Adaptive Noise Cancellation
- Low / Mid / High Noise Cancellation
So it looks like:
- Automatic device discovery + the stored devices file correctly route the device through the AirPods UI path.
- The “Add device” flow currently allows misclassifying an AirPods device as
Nothing, which leads to the “No state available for this Nothing device” message and an empty panel.
It also isn’t obvious from the UI that the “Add device” flow is meant for Nothing earbuds only right now.
Tray vs main window behaviour (Noise Control)
On this Ubuntu GNOME/Wayland setup, the tray and the main window behave differently with respect to ANC:
Tray menu (works):
-
The tray icon exposes a noise-control submenu.
-
Changing Noise Control (Off / Transparency / Noise Cancellation) from the tray:
- Audibly changes the listening mode on the AirPods Pro 2.
- Produces fresh log lines when toggling modes, e.g. additional AACP-related messages in the
RUST_LOG=infooutput at the time of the change.
So the Rust backend + tray UI path are correctly wired to the AACP “set listening mode” path.
Main window dropdown (appears read-only):
-
On the main AirPods device page, the
Noise Control Modedropdown shows the same modes (Off / Transparency / Adaptive NC / Low / Mid / High NC). -
Changing this dropdown from the main window:
- Does not audibly change the listening mode on the AirPods.
- Does not generate any additional AACP or ListeningMode-related log lines when toggled (logs continue to show only periodic audio-source and battery updates plus D-Bus menu traffic).
So in this branch the main-window dropdown looks like it is currently only presenting state, while the actual write path (sending AACP “set listening mode” commands) is only hooked up to the tray menu.
“Open Window” tray action
If I:
- Start
librepodsand get both main window + tray. - Close the main window (process keeps running in the background; tray icon remains).
- Use the tray menu’s “Open Window” action,
then:
- No window appears or is focused.
- The tray continues to work (noise control from tray still changes the AirPods).
- The log output around that time does not show any obvious error related to window creation/focus.
So on GNOME 46 / Wayland, the tray’s “Open Window” action does not currently restore or show the main window, even though the process is still running and responding to tray interactions.
Happy to test additional builds/branches if you want to try wiring the main-window controls and window-restore behaviour for GNOME/Wayland.
@kkin1995 thank you so much for the detailed testing!
- Add device flow: AirPods are detected automatically, hence no option to add it manually. And, the app is supposed to hide devices if it has been already added. I think you opened the window first and then connected the airpods?
- open window issues: that's unexpected, does any log show up when you try to open, like
DEBUG librepods::ui::window] Opening main window... - main window not handling bluetooth: could you please share the logs running the program with
--debug? - BLE error: You might need to set the mode to
dualin BlueZ config.
What are your thoughts on implementing AACP and ATT functionality as a separate Rust crate for use in other platform-agnostic projects? I'd love to go about creating a GNOME frontend for this.
I was planning to exposing functionality over dbus with librepods itself, and add a way to run it without starting the tray or the UI. What do you think of that? But, if I have some spare time, I wouldn't mind separating the protocol implementation.
I think that's fine. Ideally, it would be nice having the protocol exist as a separate dependency from the UI altogether so there's no unused code when the UI isn't used, but whatever makes the most sense to you architecturally.
2nd this. It would be nice to separate this into a separate crate. A good example of this is https://github.com/alacritty/alacritty
Off-topic: LibrePods got featured!
https://9to5mac.com/2025/11/20/airpods-pro-user-found-way-to-unlock-iphone-exclusive-features-on-android/
When using new version on Linux, it auto switch handset free mode to A2DP when listening music. I need to back handset free manually, can it respect handset free mod?
When using new version on Linux, it auto switch handset free mode to A2DP when listening music. I need to back handset free manually, can it respect handset free mod?
I'll add that to settings.
So I gave this rust build a try and i wanted to share my feedback here.
- "Off" listening mode not appearing in tray dropdown - When enabled in the main app, the "Off" option doesn't show up in the tray's listening mode menu, even though allow_off_option is being set correctly. The menu generation logic looks correct but may have a refresh/timing issue.
- "Use text in tray" toggle doesn't work - Toggling this setting saves to the config file but the tray icon doesn't update until app restart. The icon generation reads from the file correctly, but ksni doesn't refresh the icon when the tray struct is updated. I would suggest using the same battery indicator as the Qt6 version.
- No visual indicator when AirPods are disconnected - The connected field is set to true on connect but never set to false on disconnect (the DeviceDisconnected handler doesn't update the tray). I would again suggest using the same icon as the Qt6 version.
All three issues appear to be related to the tray not properly refreshing/updating after state changes, possibly a limitation or quirk of the ksni library.
Thank you @xxmathias!
- I think the
allow off optioncontrol command message isn't sent to the tray. Probably the listening mode and conv awareness should also not be updated in the tray when changed from the UI. - The text option is not sent to the tray. the tray is kinda disconnected from the rest of the app. Will fix that soon, along with dynamically handling devices. also, what do you mean by "[...] the same battery indicator as the Qt6 version."? the text here is the same as that.
- Not handling disconnections yet, not even in the main ui- already in the todo.
Thank you @xxmathias!
1. I think the `allow off option` control command message isn't sent to the tray. Probably the listening mode and conv awareness should also not be updated in the tray when changed from the UI. 2. The text option is not sent to the tray. the tray is kinda disconnected from the rest of the app. Will fix that soon, along with dynamically handling devices. also, what do you mean by "[...] the same battery indicator as the Qt6 version."? the text here is the same as that. 3. Not handling disconnections yet, not even in the main ui- already in the todo.
Regarding 2.: Rn there is a gauge icon in the tray. As toggling the text option doesnt do anything I couldnt try if the text is properly displayed or not.
If I find the time I will implement some stuff from the todo. How can we make sure that we both dont work on the same stuff?
Rn there is a gauge icon in the tray. As toggling the text option doesnt do anything I couldnt try if the text is properly displayed or not.
That's weird. I do have the text after restarting instead of the circular indicator. Anyway, I'll remove the need for restart.
How can we make sure that we both dont work on the same stuff?
I'll be working on the tray next. And, please join https://discord.gg/HhG4ycVum4 for further discussions. thanks!
Comparing this version and the Qt version only downside I see is that the Qt version looks native while the Rust version looks alien. Qt for the Gui would work with Rust too.
Comparing this version and the Qt version only downside I see is that the Qt version looks native while the Rust version looks alien. Qt for the Gui would work with Rust too.
That depends on your desktop environment; in COSMIC Iced looks native while Qt looks alien.
I accidentally added my AirPods under “Nothing,” so the panel only shows a noise control mode. Is there a way to remove the device so I can add it correctly?
I accidentally added my AirPods under “Nothing,” so the panel only shows a noise control mode. Is there a way to remove the device so I can add it correctly?
delete ~/.local/share/librepods/devices.json
I wonder if this could be added as a button, which would simply delete ~/.local/share/librepods/devices.json? This may be more user friendly?
Thanks,
Chris