f74bc4a3f1
Desktop-mode (KWin) streaming had no input: the path was libei via the RemoteDesktop portal, which (a) isn't reachable from the host service env and (b) requires a human to approve "Allow remote control?" — a non-starter on a headless box. KWin's own headless RDP server (krdpserver) solves this with org_kde_kwin_fake_input, authorized by the exact same .desktop X-KDE-Wayland-Interfaces grant we already ship (org_kde_kwin_fake_input is listed alongside zkde_screencast_unstable_v1). Add a fake_input injector: vendor the protocol XML, bind the global as an ordinary Wayland client, authenticate (auto-accepted for an interface-authorized client — no dialog), and translate pointer (rel/abs), button, scroll, keyboard (raw evdev keycodes resolved by KWin's own keymap) and touch. Select it for KWin (compositor=="kwin" or XDG_CURRENT_DESKTOP KDE); GNOME stays on libei (it has neither fake_input nor the wlr protocols). PUNKTFUNK_INPUT_BACKEND=kwin forces it. cargo check + clippy + fmt green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
74 lines
3.8 KiB
XML
74 lines
3.8 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<protocol name="fake_input">
|
|
<copyright>
|
|
SPDX-FileCopyrightText: 2015 Martin Gräßlin
|
|
SPDX-License-Identifier: LGPL-2.1-or-later
|
|
</copyright>
|
|
<interface name="org_kde_kwin_fake_input" version="4">
|
|
<description summary="Fake input manager">
|
|
This interface allows other processes to provide fake input events.
|
|
Purpose is on the one hand side to provide testing facilities like XTest
|
|
on X11, but also to support use cases like remote control (a remote
|
|
desktop server). The compositor gates the interface: it is only exposed
|
|
to clients authorized through their .desktop X-KDE-Wayland-Interfaces, so
|
|
binding it is the authorization — no per-event confirmation dialog.
|
|
</description>
|
|
<request name="authenticate">
|
|
<description summary="Information about the application requesting fake input">
|
|
A FakeInput is required to authenticate itself by providing the
|
|
application name and the reason for fake input. The compositor may use
|
|
this information to decide whether to allow or deny the request.
|
|
</description>
|
|
<arg name="application" type="string" summary="user visible name of the application requesting fake input"/>
|
|
<arg name="reason" type="string" summary="reason of why fake input is requested"/>
|
|
</request>
|
|
<request name="pointer_motion">
|
|
<description summary="pointer motion event"/>
|
|
<arg name="delta_x" type="fixed" summary="X delta of the relative pointer motion"/>
|
|
<arg name="delta_y" type="fixed" summary="Y delta of the relative pointer motion"/>
|
|
</request>
|
|
<request name="button">
|
|
<description summary="pointer button event"/>
|
|
<arg name="button" type="uint" summary="evdev button code"/>
|
|
<arg name="state" type="uint" summary="button state, 0 released, 1 pressed"/>
|
|
</request>
|
|
<request name="axis">
|
|
<description summary="pointer axis (scroll) event"/>
|
|
<arg name="axis" type="uint" summary="wl_pointer.axis (0 vertical, 1 horizontal)"/>
|
|
<arg name="value" type="fixed" summary="axis value"/>
|
|
</request>
|
|
<request name="touch_down" since="2">
|
|
<description summary="touch down event"/>
|
|
<arg name="id" type="uint" summary="unique id of this touch point; must not be reused until up"/>
|
|
<arg name="x" type="fixed" summary="x coordinate in global compositor space"/>
|
|
<arg name="y" type="fixed" summary="y coordinate in global compositor space"/>
|
|
</request>
|
|
<request name="touch_motion" since="2">
|
|
<description summary="touch motion event"/>
|
|
<arg name="id" type="uint" summary="unique id of an existing touch point"/>
|
|
<arg name="x" type="fixed" summary="x coordinate in global compositor space"/>
|
|
<arg name="y" type="fixed" summary="y coordinate in global compositor space"/>
|
|
</request>
|
|
<request name="touch_up" since="2">
|
|
<description summary="touch up event"/>
|
|
<arg name="id" type="uint" summary="unique id of an existing touch point"/>
|
|
</request>
|
|
<request name="touch_cancel" since="2">
|
|
<description summary="cancel all current touch points"/>
|
|
</request>
|
|
<request name="touch_frame" since="2">
|
|
<description summary="end a set of touch events (atomic frame)"/>
|
|
</request>
|
|
<request name="pointer_motion_absolute" since="3">
|
|
<description summary="absolute pointer motion event"/>
|
|
<arg name="x" type="fixed" summary="x coordinate in global compositor space"/>
|
|
<arg name="y" type="fixed" summary="y coordinate in global compositor space"/>
|
|
</request>
|
|
<request name="keyboard_key" since="4">
|
|
<description summary="keyboard key event"/>
|
|
<arg name="button" type="uint" summary="evdev key code"/>
|
|
<arg name="state" type="uint" summary="key state, 0 released, 1 pressed"/>
|
|
</request>
|
|
</interface>
|
|
</protocol>
|