xinput을 사용하여 포인터만 나열

xinput을 사용하여 포인터만 나열

포인터를 특정 모니터로 제한하는 GUI 도구를 작성하려고 합니다. 예를 들어 터치스크린 포인터는 모든 모니터를 통합하는 대신 자체 화면에 매핑되어야 합니다. 이 도구는 Python(pygtk 사용)으로 작성되었습니다.

UI의 경우 원하는 포인터를 선택한 다음 를 호출할 수 있도록 모든 포인터를 나열해야 합니다 xinput map-to-output pointer_id monitor_id. 포인터가 아닌 장치에 대한 ID가 제공되면 이 명령에 오류가 발생하므로 해당 ID를 다음과 같이 제공하지 않으려고 합니다. 옵션.

출력은 xinput list다음과 같습니다.

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ ELAN Touchscreen                          id=18   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=21   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=22   [slave  pointer  (2)]
⎜   ↳ Cherry USB Optical Mouse Consumer Control id=10   [slave  pointer  (2)]
⎜   ↳ Cherry USB Optical Mouse                  id=12   [slave  pointer  (2)]
⎜   ↳ HID 04b4:3003 Consumer Control            id=14   [slave  pointer  (2)]
⎜   ↳ HID 04b4:3003 Mouse                       id=24   [slave  pointer  (2)]
⎜   ↳          WALTOP     Graphics Tablet  Pen (0)      id=26   [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)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ Integrated Camera: Integrated C           id=19   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=20   [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                    id=23   [slave  keyboard (3)]
    ↳ Cherry USB Optical Mouse System Control   id=9    [slave  keyboard (3)]
    ↳ Cherry USB Optical Mouse Consumer Control id=11   [slave  keyboard (3)]
    ↳ HID 04b4:3003 System Control              id=13   [slave  keyboard (3)]
    ↳ HID 04b4:3003 Consumer Control            id=15   [slave  keyboard (3)]
    ↳ HID 04b4:3003 Keyboard                    id=16   [slave  keyboard (3)]
    ↳ HID 04b4:3003                             id=17   [slave  keyboard (3)]
    ↳          WALTOP     Graphics Tablet       id=25   [slave  keyboard (3)]

메뉴를 만들려면 모든 포인터의 이름과 ID를 가져와야 합니다(슬레이브 포인터인 것 같은데, 가상 코어 포인터를 선택하면 어떤 일이 일어날지 모르겠습니다). 한편으로는 포인터가 아닌 ID와 이름을 필터링해야 한다는 점을 제외하고는 나에게 필요한 정확한 정보를 xinput list --id-only제공합니다 . xinput list --name-only반면에 xinput list | grep pointer관련 줄을 얻을 수 있지만 결과를 구문 분석하기가 쉽지 않습니다(외부 괄호와 이상한 ↳ 화살표 문자가 있음). man xinput필터링을 수행하거나 출력을 단순화하는 옵션을 찾아보았지만 아무 것도 찾을 수 없습니다.

내 프로젝트는 다음을 기반으로 합니다.ptxconf, 그들의 해결책은 다음과 같습니다. 좀 더 우아한 것을 찾고 싶었어요.

    def getPenTouchIds(self):
        """Returns a list of input id/name pairs for all available pen/tablet xinput devices"""
        retval = subprocess.Popen("xinput list", shell=True, stdout=subprocess.PIPE).stdout.read()

        ids = {}
        for line in retval.split("]"):
            if "pointer" in line.lower() and "master" not in line.lower():
                id = int(line.split("id=")[1].split("[")[0].strip())
                name = line.split("id=")[0].split("\xb3",1)[1].strip()
                if self.getPointerDeviceMode(id) == "absolute":
                    ids[name+"(%d)"%id]={"id":id}
        return ids

답변1

시간을 많이 들이지 않았는데도 답을 찾을 수가 없네요. xinput(여기서 많이 읽으셨을 거라 생각합니다.

그래서 제가 선택한 것은 awk맥락적인 문제에 기초한 단순한 선인 것 같습니다.

xinput list | awk 'BEGIN {is_pt=0}; /Virtual core pointer/ {is_pt=1}; /Virtual core keyboard/ {is_pt=0}; {if (is_pt==1) {print $0}} '

또는 더 나은 형식을 사용하십시오.

xinput list | awk '
  BEGIN {is_pt=0} 
  /Virtual core pointer/  {is_pt=1} 
  /Virtual core keyboard/ {is_pt=0} 
  { 
    if (is_pt==1) {
      print $0
    }
  }
'

{}후속 패턴이 일치하면 각 코드 블록이 실행됩니다( ). 블록이 있습니다(블록이 있고 if진행 모드가 없습니다. 각 라인에 대해 실행됩니다. $0모든 현재 레코드(라인)를 의미합니다. BEGIN는 파일의 시작입니다.

답변2

xinput 목록에서 마우스를 일치시키려고 시도하는 동안 동일한 문제가 발생했습니다. 이러한 문제를 해결하기 위해 sed를 사용하는 데 익숙하므로 여기에 sed 기반 접근 방식이 있습니다.

MOUSE_G903_ID=$(xinput --list | sed -rn '/^.*Virtual core pointer/,/^.*Virtual core keyboard/ s/^.*Logitech G903 LS[[:blank:]]+id=([[:digit:]]+).*/\1/p')

-n 스위치를 사용하면 sed가 모든 출력을 억제하므로 p 명령을 사용하거나 이 경우 s 명령의 p 플래그를 사용하여 원하는 내용을 명시적으로 인쇄해야 합니다.

작업 범위, 즉 두 "헤더 줄"(가상 코어 포인터, 가상 코어 키보드) 사이의 줄 범위를 먼저 정의하는 sed 표현식(작은따옴표로 묶음)이 있습니다.

범위 다음에 s 명령은 내 마우스에 해당하는 줄을 일치시키고 숫자 ID를 캡처하여 인쇄합니다.

관련 정보