Skip to content

fix(linux): L2CAP socket, MAC mapping, Quick Controls, responsive UI, and Spanish translation#518

Open
john2k2 wants to merge 5 commits intokavishdevar:mainfrom
john2k2:main
Open

fix(linux): L2CAP socket, MAC mapping, Quick Controls, responsive UI, and Spanish translation#518
john2k2 wants to merge 5 commits intokavishdevar:mainfrom
john2k2:main

Conversation

@john2k2
Copy link
Copy Markdown

@john2k2 john2k2 commented Apr 11, 2026

Summary

  • L2CAP raw socket: Replace Qt Bluetooth with raw POSIX sockets (AF_BLUETOOTH/BTPROTO_L2CAP) to bypass BlueZ DBus PSM limitations that caused ServiceNotFoundError on connect
  • False disconnect fix: Separate UI presence state (airpodsConnected) from control socket readiness (airpodsCommandReady) — prevents showing "Disconnected" while A2DP audio is still active
  • MAC address normalization: Normalize MAC to lowercase hex-only before looking up bluez_card/bluez_output in PulseAudio/PipeWire, fixing lookup failures caused by : vs _ or case differences
  • Quick Controls: Replace onCheckedChanged with onClicked on Switch controls to avoid bidirectional binding loops; unify disabled/active visual states across switches and SegmentedControl
  • Responsive layout: Adaptive padding, Battery row as Flow, noise mode selector switches to ComboBox on narrow widths
  • Spanish translation: Add librepods_es.ts with full es/es_AR UI translations; install hearing-aid and head-tracking scripts to share/librepods on system install
  • head-tracking: Add argparse support to gestures.py for MAC address argument

Test plan

  • Connect AirPods on Linux — verify L2CAP channel opens without ServiceNotFoundError
  • Disconnect/reconnect AirPods — verify UI does not flash "Disconnected" while audio is still active
  • Change ANC/transparency mode via Quick Controls — verify toggles respond correctly without looping
  • Resize window to narrow width — verify layout adapts without horizontal overflow
  • Set system locale to es or es_AR — verify UI displays in Spanish

john2k2 added 5 commits April 11, 2026 07:45
…nect handling

- Implement L2CAPSocket using raw POSIX sockets (AF_BLUETOOTH/BTPROTO_L2CAP)
  to bypass BlueZ DBus PSM limitations that caused ServiceNotFoundError
- Separate airpodsConnected (UI presence) from airpodsCommandReady (control socket)
  to prevent false Disconnected state when A2DP audio is still active
- Emit airPodsStatusChanged after A2DP activation so UI reflects actual state
- Fix double class qualifier in TrayIconManager::updateBatteryStatus
Normalize MAC to lowercase hex-only before comparing against bluez_card
and bluez_output names in PulseAudio/PipeWire, fixing cases where
colon vs underscore or uppercase differences caused lookup failures
…l states

- Replace onCheckedChanged with onClicked on Switch controls to avoid
  bidirectional binding loops with backend-synced properties
- Implement responsive home layout: adaptive padding, Battery row as Flow,
  noise mode selector switches to ComboBox on narrow widths
- Unify disabled/active visual states across switches and SegmentedControl
- Add librepods_es.ts with full Spanish (es/es_AR) UI translations
- Install hearing-aid-adjustments.py and head-tracking scripts to
  share/librepods on system install
- Add argparse support to gestures.py for MAC address argument
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.

1 participant