fix(bluetooth): show connected devices without pairing bonds

BlueZ exposes `Paired` and `Connected` as separate states, but the
Bluetooth page currently conflates them in a few places.

As a result, devices that connect successfully without creating a
pairing bond can fail to appear as connected in COSMIC Settings.

This patch separates those two concepts in the UI/state handling:
- initialize a device as connected from `Connected`, not from
  `Connected && Paired`,
- do not let `Paired` updates mutate connection state,
- treat paired or currently connected devices as "known" devices in
  the main device list,
- keep `Forget` available only for actually paired devices.

## User-visible effect

This fixes cases such as the DualShock 3, where the controller is
successfully connected but does not show up as connected in the
Bluetooth settings page.

## Notes

This also matches the behavior already used in
`cosmic-applet-bluetooth`, which treats `Connected` and `Paired` as
separate states and reports a device as connected based on
`is_connected()`, not on pairing state.

A follow-up could rename the section/title to better reflect that it
now contains paired-or-connected devices rather than only paired ones.

- [x] I have disclosed use of any AI generated code in my commit
messages.
- [x] I understand these changes in full and will be able to respond to
review comments.
- [x] My change is accurately described in the commit message.
- [x] My contribution is tested and working as described.
- [x] I have read the [Developer Certificate of
Origin](https://developercertificate.org/) and certify my contribution
under its conditions.
This commit is contained in:
mikairyuu 2026-03-19 22:53:31 +03:00 committed by GitHub
parent 9118be4093
commit 243d302447
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 10 deletions

View file

@ -61,7 +61,7 @@ impl Device {
let alias = alias.ok();
let device_type: String = proxy.icon().await;
let paired = proxy.device.paired().await.unwrap_or(false);
let enabled = if proxy.device.connected().await.unwrap_or(false) && paired {
let enabled = if proxy.device.connected().await.unwrap_or(false) {
Active::Enabled
} else {
Active::Disabled
@ -111,7 +111,6 @@ impl Device {
}
}
DeviceUpdate::Paired(paired) => {
self.enabled = Active::Enabling;
self.paired = paired;
}
DeviceUpdate::Icon(icon) => self.icon = icon,