두 개의 포인터 xinput 장치를 하나의 장치로 결합할 수 있습니까?

두 개의 포인터 xinput 장치를 하나의 장치로 결합할 수 있습니까?

VirtualBox mouse integration저는 기존 포인터 입력 외에 두 번째 포인터 입력을 생성하는 "마우스 통합" 기능이 있는 VirtualBox를 사용하고 있습니다 .

$ xinput
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ VirtualBox mouse integration              id=9    [slave  pointer  (2)]
⎜   ↳ ImExPS/2 Generic Explorer Mouse           id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Sleep Button                              id=7    [slave  keyboard (3)]
    ↳ Video Bus                                 id=8    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=10   [slave  keyboard (3)]

이 스레드에는 "VirtualBox의 다중 커서 입력" 문제에 대한 자세한 내용이 있습니다.마우스를 움직일 때 스크롤할 수 없음 - Win10의 Fedora 28 VM 게스트

이 스레드에 따르면 VirtualBox mouse integration이동 이벤트만 수신되고 다른 장치는 스크롤 이벤트만 수신됩니다. 그러므로,마우스가 움직일 때 스크롤이 작동하지 않습니다, 많은 프로그램이 한 번에 하나의 활성 입력 장치만 허용하기 때문입니다.

데스크탑 프로그램이 해당 장치를 활성 입력 장치로 사용할 수 있도록 이 두 입력 장치를 "가상" 입력 장치로 결합하는 것이 가능합니까?

마우스 입력 이벤트는 다음을 통해 확인할 수 있습니다.

xinput test-xi2 --root

내 컴퓨터에서는 다른 장치에서 보낸 마우스 위치와 스크롤 이벤트가 명확하게 표시됩니다.

EVENT type 17 (RawMotion)
    device: 2 (9)
    detail: 0
    flags: 
    valuators:
          0: 1704.97 (1704.97)
          1: 39323.40 (39323.40)

EVENT type 6 (Motion)
    device: 9 (9)
    detail: 0
    flags: 
    root: 55.23/570.23
    event: 55.23/570.23
    buttons:
    modifiers: locked 0x10 latched 0 base 0 effective: 0x10
    group: locked 0 latched 0 base 0 effective: 0
    valuators:
        0: 1704.97
        1: 39323.40
    windows: root 0x532 event 0x532 child 0x4600003
EVENT type 17 (RawMotion)
    device: 2 (12)
    detail: 0
    flags: 
    valuators:
          3: 15.00 (15.00)

EVENT type 6 (Motion)
    device: 12 (12)
    detail: 0
    flags: 
    root: 55.23/571.23
    event: 55.23/571.23
    buttons:
    modifiers: locked 0x10 latched 0 base 0 effective: 0x10
    group: locked 0 latched 0 base 0 effective: 0
    valuators:
        3: -1470.00
    windows: root 0x532 event 0x532 child 0x4600003
EVENT type 15 (RawButtonPress)
    device: 2 (12)
    detail: 5
    flags: emulated
    valuators:

EVENT type 4 (ButtonPress)
    device: 12 (12)
    detail: 5
    flags: emulated
    root: 55.23/571.23
    event: 55.23/571.23
    buttons:
    modifiers: locked 0x10 latched 0 base 0 effective: 0x10
    group: locked 0 latched 0 base 0 effective: 0
    valuators:
    windows: root 0x532 event 0x532 child 0x4600003
EVENT type 16 (RawButtonRelease)
    device: 2 (12)
    detail: 5
    flags: emulated
    valuators:

EVENT type 5 (ButtonRelease)
    device: 12 (12)
    detail: 5
    flags: emulated
    root: 55.23/571.23
    event: 55.23/571.23
    buttons: 5
    modifiers: locked 0x10 latched 0 base 0 effective: 0x10
    group: locked 0 latched 0 base 0 effective: 0
    valuators:
    windows: root 0x532 event 0x532 child 0x4600003

답변1

다음을 사용하여 코딩이 필요하므로 완전한 답변은 아닙니다.레비데프그러나 두 입력 장치의 독점 읽기를 "잡아" 해당 이벤트를 단일 스트림으로 결합하는 새로운 Uinput 가상 장치를 생성하는 것이 가능해야 합니다. 별도의 읽기 이벤트와 쓰기 이벤트를 사용할 수 있는 C 예제가 있지만 이 Python 단일 페이지지도 시간흥미로운 빌딩 블록 예제 섹션이 많이 있습니다(동일한 URL, 페이지의 다른 지점).

  1. 여러 장치에서 이벤트 읽기여기

  2. 귀하의 장치에 독점적으로 액세스하십시오여기

  3. 다른 장치의 기능을 사용하여 uinput 장치 만들기여기

  4. 입력 주입여기

Rust 프로그램이 있습니다효과적인evdev 장치의 많은 병합 및 매핑을 수행할 수 있습니다. 필요한 작업을 수행하도록 구성할 수 있는지 확인해야 합니다.

관련 정보