The editor was a process-wide singleton: opening it on a different device replaced the content in the existing window. A user with two perkey-capable devices (e.g. a G915 keyboard and a G502 mouse) had to context-switch between them, losing any in-progress edits on the device they switched away from. Replace the singleton with a `_dialogs` dict in dialog.py keyed by a stable per-device identifier. control.py builds the key from `device.unitId` first — read from the device firmware via the DeviceInformation feature, the same regardless of whether the device is currently on a receiver or plugged directly via USB — so the same physical device on different transports shares one dialog instead of opening two windows. Falls back to `serial`, `hid_serial`, `codename`, and finally `id(sink)` for the pathological case where nothing else identifies the device. If the dialog is already open for a given device and `present()` is called with the same sink instance, the window is just raised — no flicker, in-progress interaction state preserved. A different sink under the same key (transport change for the same physical device) rebuilds the window content under the existing dialog slot, so the window position is preserved across transport switches. Closing a window via the WM tears down only that dialog and pops it from the registry; other open editors stay up. As a side cleanup the unused `inset` ScrolledWindow shadow already added in editor.py and the per-device sizing logic in dialog.py remain in place. |
||
|---|---|---|
| .. | ||
| hid_parser | ||
| hidapi | ||
| keysyms | ||
| logitech_receiver | ||
| solaar | ||