키보드 키를 마우스 버튼에 올바르게 어떻게 매핑합니까?


14

질문 요약 :Super_L X11 에서 마우스 버튼 중 하나를 왼쪽 Windows 버튼으로 등록하고 싶습니다 .


창 관리자에서 "왼쪽 Windows 단추"(왼쪽 슈퍼)를 누른 상태에서 마우스 왼쪽 단추로 창을 드래그하여 창을 이동할 수 있습니다. 키보드를 건드리지 않고 그렇게 할 수 있기를 원하므로 왼쪽 Super 키를 마우스 버튼 11에 매핑하고 마우스 버튼 11을 누르고 창을 클릭 + 드래그 할 수 있습니다.

가장 확실한 해결책은 xbindkeys와 xte를 다음과 같이 사용하는 것입니다 ( .xbindkeysrc) :

"xte 'keydown Super_L'"
  b:11

"xte 'keyup Super_L'"
  b:11 + release

이것은 다음과 같이 작동합니다.

  • 마우스 버튼 11 Super_L을 누르면
  • 마우스 버튼 11에서 손 Super_L을 떼면

그러나 문제가 있습니다. 마우스 버튼 11과 같은 다른 마우스 버튼을 누른 상태에서 Super_L+를 사용하여 창을 이동할 수 없습니다 Mouse1. 위의 솔루션을 사용하면 마우스 버튼 11이 여전히 눌렀다 놓은 것으로 등록되어 있으므로 창 관리자 작업이 작동합니다.

나는 계피와 최고 WM, 모두 사용이 시도 절대적으로 아무도Super_L아래로 개최되고 마우스 버튼 (10) 또는 (11) 동안 키보드 조합의 일을.

하위 해킹

현재 마우스 11 클릭으로 Super_L버튼을 일정 시간 동안 누르고 있으면이 문제를 해결하고 있습니다. 그렇게 하면 마우스 버튼을 클릭 한 다음 잠시 동안 물건을 드래그 할 수 있습니다 .

"xte 'keydown Super_L' 'usleep 250000' 'keyup Super_L'"
  b:11

다른 시도

totti가 제안한 대로이 xbindkeys구성을 시도했습니다 .

"xte 'mouseup 10' 'keydown Super_L'"
  b:10

"xte 'keyup Super_L'"
  b:10 + Release

작동하지 않습니다. 보이는 Super_L키 때문에 (내가 누를 때까지 곧이 영원히 누르고 유지 I 해제 버튼 (10)로, 아래로 개최되고 Super_L키보드의 키를 다시)하지만 난 클릭 & 드래그 창 수 없기 때문에 마우스 버튼 여전히 등록되고 . 나는 xbindkeysand 를 사용 하여이 작업을 수행 할 수있을 것이라고 생각하지 않습니다 xte.


1
마우스 버튼을 수퍼 키에 바인딩하는 대신 다시 매핑하십시오. 이를 위해 xmodmap을 사용하십시오 . 완전한 설정은 arch wiki xmodmap 페이지를 참조하십시오.
totti

@totti : 아치 위키 xmodmap 페이지는 키를 다른 키에 매핑하는 방법, 수정 자 키를 바꾸는 방법 및 스크롤을 반대로하는 방법을 설명하지만 키보드 키를 마우스 버튼에 매핑하는 것은 언급하지 않습니다
Hubro

@ totti : xmodmap을 사용하면 키를 다른 키에 매핑 할 수 있으며 X 용 XKB 확장명 (및 xkbset)을 사용하면 마우스 버튼을 키보드 키에 매핑 할 수 있지만 키보드 키를 마우스 버튼에 매핑하려고합니다. 나는 아직도 그 방법을 찾지 못했습니다.
Hubro

시도 : 마우스 버튼 11을 누른 상태에서 수퍼 홀드 + 마우스 버튼 11을 시뮬레이션하십시오. 창 관리자는 이제 마우스 11이 아닌 슈퍼 & 마우스 1을 감지 할 수 있습니다.
totti

@totti : 시도하고 편집 한 질문
Hubro

답변:


5

askubuntu 게시물에는 아래에 요약 할 답변 이 포함 되어 있습니다.

문제는 xbindkeys가 마우스 전체를 잡아서 수정 자 + 마우스 클릭 매핑을 불확실하게 만든다는 것입니다. 대답은 python-uinput 스크립트를 통해 uinput을 사용 /dev/my-mouse하여 엄지 버튼 클릭 을 모니터링 하고 Ctrl키를 가상 키보드로 보냅니다 . 자세한 단계는 다음과 같습니다.

1. udev 규칙 만들기

마우스의 경우 file /etc/udev/rules.d/93-mxmouse.conf.rules:

KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input", 
ATTRS{name}=="Logitech Performance MX", SYMLINK+="my_mx_mouse", 
GROUP="mxgrabber", MODE="640"

Udev는 event5와 같은 이름의 커널 장치를 찾습니다. SYMLINK는 /dev/my_mx_mouse그룹이 읽을 수 있는 마우스를 찾기위한 것 mxgrabber입니다.

하드웨어 정보를 찾으려면 다음과 같이 실행하십시오.

udevadm info -a -n /dev/input/eventX

uinput의 경우 파일 /etc/udev/rules.d/94-mxkey.rules:

KERNEL=="uinput", GROUP="mxgrabber", MODE="660"

마우스를 뽑았다가 꽂거나로 udev가 규칙을 트리거하도록합니다 udevadm trigger.

2. UINPUT 모듈 활성화

sudo modprobe uinput

그리고 /etc/modules-load.d/uinput.conf:

uinput

3. 새로운 그룹 만들기

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login

4. 파이썬 스크립트

설치 python-uinput librarypython-evdev library.

아래 스크립트는 버튼의 event.code를 식별해야합니다.

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-

"""
Sort of mini driver.
Read a specific InputDevice (my_mx_mouse),
monitoring for special thumb button
Use uinput (virtual driver) to create a mini keyboard
Send ctrl keystroke on that keyboard
"""

from evdev import InputDevice, categorize, ecodes
import uinput

# Initialize keyboard, choosing used keys
ctrl_keyboard = uinput.Device([
    uinput.KEY_KEYBOARD,
    uinput.KEY_LEFTCTRL,
    uinput.KEY_F4,
    ])

# Sort of initialization click (not sure if mandatory)
# ( "I'm-a-keyboard key" )
ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)

# Useful to list input devices
#for i in range(0,15):
#    dev = InputDevice('/dev/input/event{}'.format(i))
#    print(dev)

# Declare device patch.
# I made a udev rule to assure it's always the same name
dev = InputDevice('/dev/my_mx_mouse')
#print(dev)
ctrlkey_on = False

# Infinite monitoring loop
for event in dev.read_loop():
    # My thumb button code (use "print(event)" to find)
    if event.code == 280 :
        # Button status, 1 is down, 0 is up
        if event.value == 1:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1)
            ctrlkey_on = True
        elif event.value == 0:
            ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0)
            ctrlkey_on = False

5. 마무리

파이썬 파일을 실행 가능하게 만들고 시작시로드되는지 확인하십시오.


나는 마우스 버튼에 사용되지 않은 키 코드를 할당하는 스크립트를 갱신했습니다 (나는 그들을 설정 F13, F14F15, 및 사용하여 마우스 기능을 사용하지 xinput. 나는 간단한을 사용하여 원하는 영역 그럼 난 단지 그 키를 재 할당 할 수 있습니다 xmodmap. 주요 아이디어가 초안을 작성한다 에서 요지 (일부 하드 코딩 된 값이 내가 복원하지 마십시오 xinput후 마우스 기능)를 통해 여기에 그것을 할 수 있습니다 때 링크를, 내가 스크립트의 최종 버전이에 대한 블로그 게시물을 만들거야 (와 공유 할 수 있습니다. 감사 ☺ ♥
zmo

또한 x11 기반 솔루션 askubuntu.com/a/903389/269589
Maxim

1

마우스 클릭으로 스크립트를 실행할 수 있으므로 다음과 같은 트릭을 사용할 수 있습니다.
1.의 버튼 (11)은 하기 잡고 슈퍼 키를 . ( 버튼 11 trigers 스크립트)
다른 마우스 버튼을 사용하여 2. 이동 창
3. 마우스 버튼 (11)을 다시 해제 슈퍼 키를

스크립트 수퍼 키 를 유지하는 데
사용 첫 번째 버튼에서을 클릭하고 임시 파일을 생성하고 키를 누릅니다. 다음에 tmp 파일 삭제를 클릭하고 키를 놓습니다. xdotool

최신 정보

우분투 도움말 페이지 (많은 버튼 마우스 사용 방법)에 따르면 imwheel키에 다시 매핑 할 수 있습니다.


이것에 대한 몇 가지 문제 : # 1 이것은 여전히 ​​또 다른 해킹 / 해결 방법이며 질문에 대답하지 않습니다. # 2 xbindkeys는 수퍼 키를 누르고있는 동안 작동하지 않습니다. 마치 xbindkeys가 일시 중지 된 것처럼 슈퍼 키가 해제 될 때까지 아무것도 등록하지 않습니다.
Hubro

좋아, 약 5 분의 연구 끝에, 포인트 2를 취소합니다. 나는 + Mod4xbindkeys 설정 을 추가 하여 수퍼 키가 억제되는 것을 설명해야합니다. 당신이 제안하는 해결 방법은 내 것보다 낫습니다. 나는 그것을 전환하고 있습니다 :-) 그러나 여전히 질문에 대답하지 않습니다.
Hubro

1

디버깅 제안 : /dev/input/eventX특히 버튼과 함께 버튼을 눌렀다 놓을 때 생성되는 이벤트를 확인 하기 위해 파일 을 모니터링하려고합니다 BTN_LEFT. 다음 은 시작하기위한 샘플 코드입니다. 키 누르기뿐만 아니라 모든 이벤트를 기록하도록 분명히 수정해야합니다.

xev아직 출력 을 체크 아웃 하지 않을 수도 있습니다 . 두 로그를 모두 분석하면 발생한 정확한 문제가 드러나야합니다.

여러 개의 버튼을 눌렀을 때 마우스가 추가 버튼 해제 이벤트를 생성 할 수 있습니다. 이 경우 키 바인딩 해결 방법을 사용하거나 xf86-input-evdev라이브러리를 수정 하여 원하지 않는 이벤트를 필터링하거나 누락 된 이벤트를 시뮬레이션하는 옵션이 있습니다 . 드래그 앤 드롭을 시도 할 때 "클릭"이벤트를 생성하는 터치 스크린에 대해 비슷한 작업을 수행했습니다. 아이디어는 "클릭"이벤트와 거의 동시에 (작은 시간 내에) 발생한 "릴리스"이벤트를 필터링하는 것입니다. 내 추측이 맞다면 본질적으로 비슷한 것을 구현해야합니다.


1

나는 오늘 다른 수정 자 키로 이것을 알아 냈습니다. 문제는 릴리스의 버튼 조합에 수정자를 포함시켜야한다는 것입니다. 수퍼 키가 Mod4에 매핑되었다고 가정합니다 (기본값은 afaik이어야 함).

"xte 'keydown Super_L'"
  b:11

"xte 'keyup Super_L'"
  Mod4 + b:11 + release

편집 : 방금 b : 11을 누른 상태에서 LMB를 사용할 수 없으므로 이것이 귀하의 질문에 완전히 대답하지 못한다는 것을 깨달았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.