[client] evdev: fix input capture and device handling

Classify configured devices by keyboard and pointer capability so
automatic keyboard capture leaves relative pointer devices with the
display server.

Run descriptor, grab, physical-state, and LED operations on one worker.
Marshal normalized events through each display server's event loop and
serialize ownership changes with per-lane barriers.

Fall back whole lanes to native input when an evdev cohort cannot be
owned, and retry missing or removed devices without disabling the rest.

Handle report framing, SYN_DROPPED, high-resolution wheels, queue
overflow, held-state cleanup, and guest-driven keyboard LEDs. Restore
host LEDs and kernel grabs during teardown.

Re-evaluate capture when the active input transport changes.
This commit is contained in:
Geoffrey McRae
2026-08-21 13:10:34 +10:00
parent 8b38546049
commit 423269802f
12 changed files with 2359 additions and 301 deletions

View File

@@ -163,6 +163,10 @@ bool core_inputEnabled(void)
return t.input;
}
void core_updateKeyboardGrab(void)
{
}
void core_setGrab(bool enable)
{
++t.grabN;

View File

@@ -224,6 +224,10 @@ void core_updatePositionInfo(void)
++t.posN;
}
void core_updateKeyboardGrab(void)
{
}
void core_setCursorInView(bool enable)
{
++t.cursorN;

View File

@@ -282,6 +282,12 @@ void app_mouseTrace(const char * file, unsigned int line,
(void)format;
}
void evdev_setGrab(bool keyboard, bool pointer)
{
(void)keyboard;
(void)pointer;
}
static bool inputSupports(void * opaque, LG_InputSupport support)
{
return support == LG_INPUT_SUPPORT_MOUSE_ABSOLUTE &&