#ifndef VMSIG_INPUT_H #define VMSIG_INPUT_H /* Private config of the input adapter (vmctl, in-tree at src/si/input/). cfg==NULL or * stub!=0 => stub mode (ack without actuation). stub==0 opens vmctl_open() and actuates for * real. Injection is ALWAYS uinput; the created evdev nodes are forwarded into the guest by an * input-linux QMP object that the vmhost seam adds over its own connection (this adapter only * publishes the evdev paths, it never touches QMP). qmp_path is kept for the SERVICE path * (power/lifecycle via vmctl QMP), not for injection. */ typedef struct { int stub; const char* qmp_path; /* for power/lifecycle (vmctl QMP); NOT input injection */ /* On a real attach the adapter writes the uinput evdev node paths here (>=64 bytes each) * so the vmhost seam can bridge them via input-linux. NULL => not published; B is "" when * there is no second device. Buffers belong to the caller and outlive the adapter. */ char* out_evdev_a; char* out_evdev_b; } vmsig_input_cfg; /* Input event codes/contract are PUBLIC: vmsig_input / vmsig_input_kind in * include/vmsig_event.h (external control encodes them into inln). No private duplicate. */ #endif /* VMSIG_INPUT_H */