Skip to content

feat: add native Omarchy 4 controls and notification feedback#16

Closed
k8rito01 wants to merge 7 commits into
HANCORE-linux:mainfrom
k8rito01:feat/omarchy4-network-bluetooth
Closed

feat: add native Omarchy 4 controls and notification feedback#16
k8rito01 wants to merge 7 commits into
HANCORE-linux:mainfrom
k8rito01:feat/omarchy4-network-bluetooth

Conversation

@k8rito01

Copy link
Copy Markdown

Summary

  • expand Wi-Fi management with native NetworkManager support for Omarchy 4 while preserving the legacy iwd path
  • move Bluetooth power, discovery, pairing, connection and device state to Quickshell.Bluetooth
  • add native PipeWire microphone metering and mute-state feedback
  • add a bounded, coalescing Dynamic Island notification pill with persistent history and filtered sounds
  • consolidate settings into the tabbed Control Center and load Omarchy 4 menu actions from the installed omarchy-menu.jsonc

Omarchy 4 scope

Rise remains a replacement-shell configuration, not an omarchy-shell plugin. The PR uses Omarchy 4's native NetworkManager, Bluetooth and PipeWire contracts and dispatches menu actions through hl.dsp.exec_cmd, but it deliberately does not claim that two complete notification-owning shells can run simultaneously. The README documents that boundary and leaves plugin-mode integration as future work.

Safety and behavior

  • Wi-Fi SSIDs are passed as argv on the legacy path rather than interpolated into a shell command.
  • Bluetooth no longer uses the temporary BlueZ ObjectManager helper or one subprocess per device.
  • Notification history and early queues are bounded, repeated intent-equivalent toasts are coalesced, and transient system feedback does not pollute the per-app mixer.
  • The microphone meter monitors only the default source, is disabled while muted/closed, and never mistakes playback for input.
  • The embedded Omarchy menu reads the installed official JSONC instead of maintaining a copied Omarchy 4 route table.

Validation

  • qmllint passes for every changed panel/component (Theme.qml and shell.qml retain the same silent exit 255 produced by the base branch with local qmllint 1.0).
  • git diff --check passes.
  • tests/qs-arch-update-regression.sh passes.
  • tests/qs-theme-update-regression.sh passes.
  • tests/qs-shell-update-regression.sh passes.

Authored by Lito with implementation contributions co-authored by Codex.

kioma01 and others added 7 commits July 13, 2026 20:53
Add backend-neutral available/saved views, expandable actions and keyboard navigation for Wi-Fi while preserving NetworkManager on Omarchy 4 and the legacy iwd path. Enrich Bluetooth through one BlueZ ObjectManager snapshot with device type, signal, battery, reconnect and forget actions.

Co-Authored-By: Codex <noreply@openai.com>
Monitor the default PipeWire source only while the volume panel is open, apply a conservative noise floor with smooth decay, use a backend-neutral wpctl/pamixer mute path, and emit a synchronous microphone state notification after successful toggles.

Co-Authored-By: Codex <noreply@openai.com>
Make Quickshell the notification server, retain a bounded local history, debounce cache writes, throttle sounds and filter event streams from the app mixer. Add a bounded/coalescing toast queue with actionable timing, status OSD semantics and microphone state icons, rendered through the center pill.

Co-Authored-By: Codex <noreply@openai.com>
Replace nested flyouts with one compact Control Center for Omarchy actions, bar appearance, widget visibility/compact modes and pickers. Embed a reusable searchable Omarchy menu view while keeping actions delegated to the installed Omarchy command surface.

Co-Authored-By: Codex <noreply@openai.com>
Use Quickshell.Bluetooth for adapter and device state, consume the installed Omarchy 4 menu JSONC, dispatch its actions through Hyprland's Lua contract, and document replacement-shell ownership.

Co-Authored-By: Codex <noreply@openai.com>
BluetoothPanel now uses Quickshell.Bluetooth directly, leaving the ObjectManager snapshot helper unused.

Co-Authored-By: Codex <noreply@openai.com>
NetworkPanel: header comment describing the runtime backend split
(NetworkManager via NetworkManagerAdapter on Omarchy 4 vs iwd/iwctl legacy,
selected by root.useNM/nmAdapterReady), the shared action shape, the argv
safety note and the rfkill-vs-adapter radio toggle.

BluetoothPanel: header for the Quickshell.Bluetooth native model (what it
replaces), plus comments on activateDevice's connect/pair/disconnect flow and
syncBusyState's event-driven completion tracking (onDevicesChanged, no callbacks).

Comments only; no behavior change. qmllint clean, git diff --check clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@HANCORE-linux

Copy link
Copy Markdown
Owner

Thanks for the work in this PR. For V1, I am only considering three scoped parts: expanded Wi-Fi management, native Bluetooth management, and microphone metering/mute feedback. I do not plan to adopt the Dynamic Island/notification-server, Control Center, Omarchy menu, or other bundled changes into V1.

Before those three parts can be adopted, I found the following points:

Wi-Fi

  • The Saved view is derived from the current scanned networks model. Therefore it only shows known networks that are currently visible, not all saved profiles. Please either implement a real saved-profile model per backend or label it accurately as Known nearby.
  • slice(0, 12) silently hides additional networks.
  • Keyboard selection does not scroll the Flickable, so the active row can move off-screen. A ListView with currentIndex/positionViewAtIndex() would provide a complete keyboard flow.
  • Expanding a row before every connect adds a second click to the common path. Please consider keeping primary connect direct and exposing details/actions separately.

Bluetooth

  • The native Quickshell.Bluetooth direction is useful and removes repeated bluetoothctl polling.
  • Please scope devices to the selected/default adapter (adapter.devices) instead of the global Bluetooth.devices, otherwise multi-adapter systems can mix device state with controls for only one adapter.
  • RSSI is currently always null, so signal strength is not actually implemented and should not be claimed or rendered until a real source exists.
  • An operation timeout currently clears the busy label without reporting failure. Pair/connect/disconnect/forget need an explicit failure state.
  • Please provide runtime evidence for ordinary headset pairing and a confirmation/PIN pairing flow.
  • Do not silently truncate devices with slice(0, 12).

Microphone

  • PwNodePeakMonitor limited to the open panel and unmuted default source is a good bounded design.
  • Please preserve the existing omarchy-audio-input-mute path and keep wpctl/pamixer as fallbacks for cross-version compatibility.
  • Emit the success notification only after the status refresh returns a valid parsed mute state. Empty/failed pactl output must not become Microphone active.
  • This feature should remain independent of the new notification-server/Dynamic Island implementation; normal notify-send feedback is sufficient for V1.

I recommend splitting these into three independently reviewable commits or PRs, with runtime checks on Omarchy 3.8/iwd and Omarchy quattro/NetworkManager. The remaining PR features are out of scope for V1.

@k8rito01

Copy link
Copy Markdown
Author

Superseded by three independent PRs, split according to the maintainer review and each rebased on the latest main:

Each replacement PR contains one focused commit and only its relevant files. Closing this combined PR so every feature can be reviewed, runtime-tested, merged, or reverted independently.

@k8rito01 k8rito01 closed this Jul 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants