mirror of
https://github.com/Imnotndesh/spacepods-linux.git
synced 2026-09-29 15:33:27 +00:00
An oraimo spacepods controller for linux
- Rust 95.5%
- Shell 4.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
* ci: fix workflow - remove aarch64, add UI binary, fix flatpak source path
- Removed aarch64 target (cross-compilation requires pkg-config sysroot)
- Added separate spacepods-ui binary build job with GTK4 deps
- Fixed Flatpak manifest source path from '.' to '..' so workspace root is found
- Updated install paths in flatpak manifest to use spacepods-ui/ prefix
- All three build jobs (libspacepods, spacepods-ui, flatpak) run in parallel
* ci: add libdbus-1-dev to UI job, fix flatpak network and remove redundant rust install
* ci: fix flatpak network via manifest build-args, remove conflicting --network=host
* ci: point flatpak to rust-stable SDK extension for newer rustc
* ci: migrate flatpak from EOL GNOME 47 to GNOME 49 runtime
The GNOME 47 runtime is end-of-life (EOL Oct 15, 2025) and its
rust-stable SDK extension ships rustc 1.89, which is too old for the
project's gtk4 0.11 / glib 0.22 dependencies that require rustc >= 1.92.
Migrate the flatpak manifest and CI container image to GNOME 49, whose
rust-stable extension ships a recent rustc, fixing the flatpak build.
* feat: unified install/uninstall script for libspacepods and spacepods-ui
Replace the minimal inline install script with a committed, maintained
installer at tools/install.sh that can install or remove:
- libspacepods (daemon + CLI) to /usr/local/bin
- spacepods-ui native GUI binary with desktop entry + icon
- the Flatpak GUI bundle
It supports install/upgrade/remove actions, per-target selection, a
--no-flatpak flag, a --prefix flag and a --no-sudo mode. Downloads use
curl -fSL and guard against error-page bodies (e.g. 'Not Found'), so a
failed download fails loudly instead of piping garbage into the shell
(fixes the 'Not: command not found' seen when piping to sh). The release
notes now document the safer download-then-run flow and note that the
repository is private, so anonymous curl | sh is not supported.
* ui: redesign app icon (neobrutalist headset) and fix newline in Cargo.toml
* feat: add systemd user service install/remove to installer
Add a 'service' target to tools/install.sh that installs a per-user
systemd unit for the libspacepods daemon:
- Unit lives in ~/.config/systemd/user/spacepods.service and is enabled
with 'systemctl --user enable --now spacepods'
- Logs to journald (StandardOutput/StandardError=journal)
- Minimal by default: --log-level warn, changeable with --log-level=
- 'remove service' disables/stops and removes the unit
- Included in 'install all'; --enable to enable at login
Flags: --enable (enable after writing), --no-enable (don't disable on
remove), --log-level=info|warn|full (default warn).
* fix: reflect release tag in app version and fix gestures refresh duplication
Two fixes:
1. Version display showed 0.5.0 (from Cargo.toml) instead of the release
tag. The Flatpak build never received GIT_TAG, so
libspacepods/build.rs fell back to CARGO_PKG_VERSION. Inject the git
tag (github.ref_name) into the Flatpak manifest's build-options.env
before building, so build.rs (which reads GIT_TAG and strips the 'v')
bakes the correct release version into the app.
2. Refreshing the Gestures page duplicated the gesture rows (two Long
Press toggles, etc.) instead of updating them. Refresh was trying to
walk PreferencesGroup's internal widget children to clear rows, which
does not locate the ActionRows (PreferenceGroup's first child is a
GtkBox, not the list) so nothing was removed and populate_group added
a second set. Now we track the exact rows we create in an
Rc<RefCell<Vec<Widget>>> and remove them via the public
PreferencesGroup::remove API before repopulating.
* fix(flatpak): grant session-bus access so the tray can register
The StatusNotifierItem tray protocol registers on the session bus
(org.kde.StatusNotifierWatcher). The Flatpak manifest only exposed the
system bus, so a sandboxed tray could never appear. Add
--socket=session-bus to finish-args.
* feat(tray): integrate the StatusNotifier tray into the app
The tray previously was dead code: its module wasn't even compiled
(main.rs had no 'mod tray') and spawn_tray() was never called. Integrate
it properly:
- Declare the tray module and start it at app startup.
- Rewrite tray.rs to use ksni's synchronous (blocking) API with a real
background thread, set assume_sni_available(true) so hosts without an
SNI implementation (e.g. stock GNOME without the AppIndicator
extension) degrade gracefully, and disable the D-Bus well-known name
inside a Flatpak sandbox.
- Add a WindowController (weak ref to the window) and put a TrayHandle
into AppContext so pages can reach the tray.
- Drain tray menu commands on the GTK main loop and route them to the
window: Show restores it, Hide hides it, Quit closes it.
- Thread the tray handle and window controller through HomeView so the
setup/reconnect flow rebuilds them too.
* feat(settings): add 'Close to tray' option to keep the app in the background
Closing the window by default quits the app. Add a Settings toggle that
makes closing hide the window instead (the app + tray keep running).
- New AppSettings.close_to_background (defaults off, serde-default so old
settings files still load).
- Window close-request handler hides the window when the setting is on,
otherwise lets it close normally.
- WindowController gains a force-quit path used by the tray 'Quit' menu
item so a real quit bypasses close-to-background (otherwise Quit would
just hide again while the setting is on).
* fix(autostart): correct the binary and icon in the autostart entry
write_autostart_entry used Exec=spacepods and Icon=audio-headset, but the
installed binary is spacepods-ui and the icon is com.spacepods.ui. Align
the autostart .desktop entry with the real launcher so 'Start on login'
actually launches the app.
* feat: add a quick-settings popover panel to the header bar
Add a quick-settings popover opened from a headphone button in the
content header. It gives at-a-glance control over the earbuds without
digging into the sidebar:
- Battery row: two cairo-drawn circular percentage rings (left/right).
- Noise Control: Off / Transparency / ANC segmented control.
- Ambient Level: a slider (clamped to the device max level) with −/+.
- Conversation Awareness: a two-way segmented toggle mapped to adaptive ANC.
Reads device status and writes commands through the daemon IPC
(SpacePodsClient).
* fix(daemon): accept Notification packets and parse bluetrum power data
The Rust MessageType enum only accepted Request (0x01) and Response (0x02),
silently dropping all Notification packets (0x03) — including the device's
power updates (left/right/case battery). Add Notify = 0x03 to MessageType
and forward power notifications (cmd_id=0x01, 3-byte payload) to the battery
broadcast channel.
The Android app (com.bluetrum) parses power with:
level = byte & 0x7F, charging = (byte & 0x80) != 0
This matches the encoding now used in the notification handler.
* feat(tray): rewrite tray to open custom quick-settings popup on click
Replace the text-menu-only tray with a proper interactive popup:
Trae icon (ksni/StatusNotifierItem) → left-click fires activate(x, y)
→ dispatches ShowPopup to the GTK main loop → opens the quick-settings
panel as a standalone popup window near the tray icon, matching the
GNOME-style quick-settings design.
The panel includes:
- Two cairo-drawn battery rings (now fed by the bluetrum power notification)
- Noise Control segmented control (Off/Transparency/ANC)
- Ambient Level slider with --/+ buttons
- Conversation Awareness toggle (maps to adaptive ANC)
Also remove the header-bar quick-settings button — the tray popup now
serves that role. Wire the AppContext (with tray/window handles) through
a shared weak slot so the command loop can open the popup without an
active window.
* Revert "fix(daemon): accept Notification packets and parse bluetrum power data"
This reverts commit
|
||
| .github/workflows | ||
| .idea | ||
| docs | ||
| libspacepods-rs | ||
| spacepods-ui | ||
| tools | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
spacepods-linux
An oraimo spacepods controller for linux