Linux의 두 번째 키보드에서 매크로와 단축키를 실행할 수 있나요?

Linux의 두 번째 키보드에서 매크로와 단축키를 실행할 수 있나요?

일반 키보드 옆에 매크로와 단축키를 실행하는 데 사용하는 작은 숫자 패드가 있습니다. 이 키에 매크로와 단축키를 첨부할 수 있습니다(예를 들어 숫자 키패드 1은 활성 창을 최소화합니다.), 하지만 내 기본 키보드 숫자 키패드도 바로가기를 활성화합니다.

보조 키보드를 완전히 독립적으로 실행한 다음 단축키를 연결하는 방법을 원합니다.

이것이 내가 얻은 결과입니다 xinput.

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ LVT Recon gaming mouse                    id=10   [slave  pointer  (2)]
⎜   ↳ LVT Recon gaming mouse                    id=11   [slave  pointer  (2)]
⎜   ↳ Corsair Corsair K30A Gaming Keyboard      id=13   [slave  pointer  (2)]
⎜   ↳ SIGMACHIP USB Keyboard                    id=18   [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)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=12   [slave  keyboard (3)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=14   [slave  keyboard (3)]
    ↳ LVT Recon gaming mouse                    id=15   [slave  keyboard (3)]
    ↳ Corsair Corsair K30A Gaming Keyboard      id=16   [slave  keyboard (3)]
    ↳ SIGMACHIP USB Keyboard                    id=17   [slave  keyboard (3)]
    ↳ SIGMACHIP USB Keyboard                    id=19   [slave  keyboard (3)]

답변1

하지만내 다른 답변아마도 대부분의 Linux에서 실행될 것입니다. 비록 오래되었지만 SystemD와 udev는 실제로 작업을 더 쉽게 만듭니다.

  • lsusb추가 키보드의 공급업체 및 제품 코드를 찾는 데 사용됩니다 . (제 경우에는 Supply 145F, Product 0177 입니다. 반드시 대문자로 입력해주세요.)

  • /etc/udev/hwdb.d/90-extra-keyboard.hwdb다음과 유사한 내용으로 파일을 만듭니다 .

evdev:input:b0003v145Fp0177*
 KEYBOARD_KEY_7005b=stopcd

첫 번째 줄은 장치를 식별합니다. v 다음의 네 글자는 공급업체 코드이고, p 뒤에는 이전 단계의 제품 코드가 옵니다. 각 라인은 스캔 코드를 기호 이름에 매핑합니다. 스캔코드를 얻으려면 다음을 실행하세요 evtest:

Event: time 1553711252.888538, -------------- SYN_REPORT ------------
Event: time 1553711257.656558, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70059
Event: time 1553711257.656558, type 1 (EV_KEY), code 79 (KEY_KP1), value 1

기호 이름의 목적을 이해하려면 #define KEY_…다음 행 목록을 살펴보십시오 /usr/include/linux/input-event-codes.h.

#define KEY_PLAYPAUSE           164
#define KEY_PREVIOUSSONG        165
#define KEY_STOPCD              166
#define KEY_RECORD              167
  • 다음을 실행하여 내부 데이터베이스를 다시 빌드하고 로드합니다.systemd-hwdb update; udevadm trigger

  • evtest새 설정을 다시 실행하거나 설정에서 바로가기를 할당하여 새 설정이 작동하는지 확인하세요.

응용 프로그램에서 이를 시도할 때 데스크탑 환경이 이미 바로가기를 사용하고 있다면 응용 프로그램은 키 누르기조차 인식하지 못한다는 점을 명심하십시오.

답변2

원칙적으로 그렇습니다. 내가 마지막으로 언제2012년에 이런 짓을 했어갈 방법은 두 번째 키보드가 keypress 등을 XF86VolumeUp보낼 때 실제로 무엇을 의미하는지 Linux에 알려주는 것입니다 . Num 1다행스럽게도 표준 키보드에는 존재하지 않는 이런 방식으로 사용할 수 있는 키코드가 많이 있습니다.

단일 키에 대해 이것을 실행해 보겠습니다.

  • 추가 키보드에서 키를 찾는 데 사용되는 xev | grep -i key키코드 입니다. 예를 들어 keypap 9여기에는 키코드 81을 사용하겠습니다. (참고: 내 추가 키보드에는 "00"이라고 표시된 키가 있지만 "0"을 두 번 전송하므로 어떻게 처리해야 할지 모르겠습니다.)
      KeyPress event, serial 38, synthetic NO, window 0x4400001,
        state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
      KeyRelease event, serial 39, synthetic NO, window 0x4400001,
        state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
        request MappingKeyboard, first_keycode 8, count 248
  • setxkbmap -query(메인) 키보드의 규칙을 확인하세요 . 우리는 이 레이아웃에서 여분의 키보드를 12개의 미디어 키로 바꾸려고 노력할 것입니다. 나에게는 그렇다
rules:      evdev
model:      pc105
layout:     de
variant:    nodeadkeys
  • 에서 충분한 항목을 찾았습니다 /usr/share/X11/xkb/symbols/inet. 오른쪽에는 Shift 키 수정자 등을 사용하여 애플리케이션에 표시되는 내용이 있고 왼쪽에는 스캔 코드가 있습니다. 내 키보드에는 "계산기" 키가 없으므로 이것을 선택하겠습니다.
key <I148>   {      [ XF86Calculator        ]       };
  • /usr/share/X11/xkb/keycodes/스캔 코드를 키 코드에 매핑하는 파일을 만듭니다 (1단계의). 네, 거꾸로 된 것 같습니다. 내 파일은 trustkeypad라고 하며 다음과 같습니다.
default xkb_keycodes "trustkeypad" {
    minimum= 8;
    maximum= 255;

    // keypad 9
    <I148> = 81;
};
  • 이 파일을 컴파일xkbcomp -xkb trustkeypad

  • 시도 해봐 setxkbmap -v -v -device 17 -keycodes (filename). (17은 귀하의 ID입니다 xinput.) 내 결과는 다음과 같습니다.

Warning! Multiple definitions of keycodes
         Using command line, ignoring rules file
Applied rules from evdev:
rules:      evdev
model:      pc105
layout:     de
variant:    nodeadkeys
Trying to build keymap using the following components:
keycodes:   trustkeypad
types:      complete
compat:     complete
symbols:    pc+de(nodeadkeys)+inet(evdev)
geometry:   pc(pc105)

특히 키코드 행이 좋아 보입니다. 지금 실행 하면 xev새 기호가 생성되는 것을 볼 수 있습니다. 아아, 이제 나는 절반의 승리만을 거두었습니다.

KeyPress event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043275, (1666,897), root:(1670,950),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
    state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043411, (1666,897), root:(1670,950),
    state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

그러나 실수로 X를 몇 번 충돌시킨 후에(키코드 파일에서 최소값을 더 높게 설정하는 것이 도움이 될 것이라고 생각하지 마십시오) 이 문제는 사라졌습니다. 이 시점에서는 간단한 재부팅이 도움이 될 수 있습니다. 성공하면 다음과 같은 결과를 얻을 수 있습니다.

KeyPress event, serial 38, synthetic NO, window 0x3e00001,
    root 0x168, subw 0x0, time 26443862, (930,972), root:(934,1025),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x3e00001,
    root 0x168, subw 0x0, time 26444022, (930,972), root:(934,1025),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

사용자 설정에서 이제 해당 키에 단축키를 할당할 수 있으며 계산기 키에 할당되었다는 메시지가 표시되는지 확인할 수 있습니다.

여기서 아직 누락된 사항: 표준 설정으로 만드는 방법과 재부팅 시 방법을 알아내는 것입니다. 여기에는 udev를 살펴보는 것이 포함될 수 있습니다.https://help.ubuntu.com/community/Custom%20keyboard%20layout%20definitions2014년부터 "구식" 라벨이 붙어 있지만 유용할 수 있습니다.

답변3

나는 Linux 전문가가 아니라 단지 사용자일 뿐이라고 가정합니다. 그러나 나는 내 필요에 따라 이 문제에 대한 해결책을 공유하고 싶습니다. 이것은 실제로 다른 사용자가 제안한 솔루션과 같은 솔루션이 아니라 문제를 해결하는 방법에 더 가깝습니다. 나는이 소프트웨어를 찾았습니다입력 리매퍼이를 통해 2개의 키보드 매핑을 변경할 수 있습니다.각기, 장치 메뉴에서 선택하세요.

입력 리매퍼 GUI 스크린샷

프로그램은 트리거 구문을 제공합니다키 조합선택적인 사용자 정의가 있는 것 같습니다.매크로 언어.

그러나 나는 단 한 줄의 코드도 작성할 수 없기 때문에 매크로를 다음에 할당했을 뿐입니다.키 조합내 기본 키보드는 아직 사용되지 않습니다. 예를 들어 우분투 22.10에서.

여기에 이미지 설명을 입력하세요.

그런 다음 할당키 조합입력 리매퍼 소프트웨어와 key_combination-sintax를 사용하여 두 번째 키보드의 키(이미지 KP_BEGIN)에:

여기에 이미지 설명을 입력하세요.

확실히 우아한 솔루션은 아니지만 나처럼 터미널에 익숙하지 않은 사람에게는 구현하기가 더 쉬울 것입니다.

답변4

설명된 수정 방법 hwdb은 연결된 여러 USB 키보드에서는 작동하지 않습니다. 왜냐하면 동일한 버튼에 대한 스캔 코드가 다른 USB 키보드에서 동일하고 연결된 모든 USB 키보드의 버튼을 다시 매핑하게 되기 때문입니다.

내장 노트북 키보드와 USB 키보드의 스캔 코드만 다릅니다.

나는 이 Python 방법을 시도해 볼 것입니다 (댓글에서 찾으십시오)https://www.youtube.com/watch?v=Arn8ExQ2Gjg)

  1. Python 및 해당 evdev모듈 설치(나중에 필요함)

  2. cd/dev/input/by-id/로

  3. 키보드가 연결되어 있지 않으면 ls.

  4. 키보드를 연결한 다음 ls. 두 개의 새로운 기호 링크가 있습니다. 파일 시스템의 절대 위치를 기록해 두십시오(예: /dev/input/by-id/usb-0c45_USB_WIRED_KEYBOARD_event-kbd)

  5. 터미널을 종료합니다. Python 파일을 만들고 다음 내용을 넣으세요.

    from evdev import InputDevice, categorize, ecodes
    dev = InputDevice('/absolute/position/of/device')
    dev.grab()
    
    
    for event in dev.read_loop():
         if event.type == ecodes.EV_KEY:
              key = categorize(event)
         if key.keystate == key.key_down:
              if key.keycode == 'KEY_ESC':
                   print("Hello, world!")
    
  6. 이제 두 번째 키보드에서 Esc 키를 누르면 "Hello, world!"가 인쇄됩니다.

관련 정보