ฉันจะแมปคีย์ของแป้นพิมพ์กับปุ่มเมาส์อย่างถูกต้องได้อย่างไร


14

สรุปคำถาม:ฉันต้องการให้ปุ่มเมาส์ปุ่มใดปุ่มหนึ่งของฉันลงทะเบียนเป็นปุ่ม Windows ด้านซ้ายSuper_Lโดย X11


ในโปรแกรมจัดการหน้าต่างฉันสามารถย้ายหน้าต่างไปรอบ ๆ ได้โดยกดปุ่ม "left Windows" (Left Super) ค้างไว้แล้วลากหน้าต่างด้วยปุ่มซ้ายของเมาส์ ฉันต้องการที่จะทำเช่นนั้นโดยไม่ต้องสัมผัสแป้นพิมพ์ดังนั้นฉันต้องการแมปปุ่ม Super key ที่ปุ่มซ้ายของเมาส์ 11 เพื่อที่ฉันจะสามารถกดปุ่มเมาส์ค้างไว้ 11 แล้วคลิก + ลากหน้าต่าง

ทางออกที่ชัดเจนที่สุดคือการใช้ xbindkeys และ xte เช่นนี้ ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

สิ่งนี้ได้ผลเช่นนี้:

  • เมื่อฉันกดปุ่มเม้าส์ 11 Super_Lก็กดลงเช่นกัน
  • เมื่อฉันปล่อยปุ่มเมาส์ 11 Super_Lก็จะถูกปล่อยออกมาเช่นกัน

แต่มีปัญหา: ฉันไม่สามารถย้ายหน้าต่างโดยใช้Super_L+ Mouse1หากฉันกดปุ่มเมาส์ค้างไว้อีกปุ่มหนึ่งเช่นปุ่มเมาส์ 11 โดยใช้วิธีการแก้ปัญหาด้านบนปุ่มเมาส์ 11 ยังคงถูกลงทะเบียนเป็นแบบกดและปล่อยออกมา การทำงานของตัวจัดการหน้าต่างทำงาน

ฉันได้ลองแล้วโดยใช้ทั้ง Cinnamon และ Awesome WM และไม่มีการSuper_Lรวมแป้นพิมพ์ใด ๆ เลยในขณะที่ปุ่มเมาส์ 10 หรือ 11 ถูกระงับ

แฮ็ค subpar

ขณะนี้ฉันกำลังแก้ไขปัญหานี้โดยทำให้เมาส์ 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แป้นค้างไว้เพราะทันทีที่ฉันปล่อยปุ่ม 10 มันจะยังคงค้างอยู่ตลอดกาล (จนกว่าฉันจะกดSuper_Lปุ่มอีกครั้งบนแป้นพิมพ์) แต่ปุ่มเมาส์ยังคงลงทะเบียนเพราะฉันไม่สามารถคลิก & ลากหน้าต่าง . ฉันไม่คิดว่าฉันจะสามารถใช้งานxbindkeysและใช้งานxteได้


1
แทนที่จะทำการผูกปุ่มเมาส์กับซุปเปอร์คีย์แล้วทำการแมปใหม่ สำหรับการใช้งานนี้xmodmap ดูหน้า arch wiki xmodmap สำหรับการตั้งค่าที่สมบูรณ์
totti

@totti: หน้า arch wiki xmodmap อธิบายวิธีการแมปคีย์ไปยังคีย์อื่น ๆ วิธีการสลับคีย์ตัวดัดแปลงและวิธีย้อนกลับการเลื่อน แต่ไม่ได้พูดถึงการแม็พปุ่มคีย์บอร์ดกับปุ่มเมาส์
Hubro

@totti: ด้วย xmodmap ฉันสามารถแมปคีย์กับคีย์อื่น ๆ ได้และด้วยส่วนขยาย XKB สำหรับ X (และ xkbset) ฉันสามารถแมปปุ่มเมาส์กับแป้นคีย์บอร์ดได้ แต่ฉันพยายามแมปแป้นคีย์บอร์ดกับปุ่มเมาส์ ฉันยังไม่พบวิธีที่จะทำเช่นนั้น
Hubro

ลอง: กดปุ่มเมาส์ 11 ค้าง, จำลองปุ่มค้างสุด + ปุ่มเมาส์ 11 ออก ผู้จัดการหน้าต่างอาจตรวจจับซุปเปอร์ & เม้าส์ 1 ไม่ใช่เมาส์ 11.
totti

@totti: คำถามที่พยายามแล้วและแก้ไข
Hubro

คำตอบ:


5

โพสต์ askubuntu มีคำตอบที่ฉันจะสรุปด้านล่าง

ปัญหาคือ xbindkeys จับเมาส์ทั้งหมดทำให้ตัวแก้ไขแผนที่และการคลิกเมาส์ไม่แน่ใจ คำตอบนั้นใช้ uinput ผ่านสคริปต์python-uinputเพื่อตรวจสอบ/dev/my-mouseการคลิกปุ่มหัวแม่มือและส่งCtrlกุญแจไปยังแป้นพิมพ์เสมือนจริง นี่คือขั้นตอนโดยละเอียด:

1. สร้างกฎ udev

สำหรับเมาส์ไฟล์/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_mousemxgrabber

ในการค้นหาข้อมูลฮาร์ดแวร์ให้ทำดังนี้:

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

การติดตั้งและpython-uinput librarypython-evdev library

สคริปต์ด้านล่างนี้จะต้องระบุรหัสเหตุการณ์ของปุ่ม:

#!/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. การตกแต่ง

ทำให้ไฟล์ python สามารถทำงานได้และตรวจสอบให้แน่ใจว่าได้โหลดเมื่อเริ่มต้น


ผมได้ปรับปรุงสคริปต์เพื่อกำหนด keycode ที่ไม่ได้ใช้ปุ่มเมาส์ (ผมตั้งพวกเขาขึ้นไปF13, F14และF15และปิดการใช้งานฟังก์ชั่นการใช้เมาส์xinput. แล้วฉันก็สามารถกำหนดคีย์เหล่านั้นสิ่งที่ฉันจำเป็นต้องใช้ง่ายxmodmap. ความคิดหลักเป็นร่าง ในส่วนสำคัญ (มีบางค่าฮาร์ดโค้ดและฉันไม่คืนค่าxinputฟังก์ชั่นเมาส์หลังจากนั้น) ฉันจะทำให้บล็อกโพสต์เกี่ยวกับเรื่องนี้กับรุ่นสุดท้ายของสคริปต์ (และแชร์ลิงก์มากกว่าที่นี่เมื่อมันจะทำได้. ขอขอบคุณ คุณสำหรับความช่วยเหลือของคุณ! ☺♥
zmo

ตรวจสอบคำตอบใหม่ของฉันในเธรดอื่นสำหรับโซลูชันที่ใช้ x11 askubuntu.com/a/903389/269589
Maxim

1

ในขณะที่คุณสามารถเรียกใช้สคริปต์ในการคลิกเมาส์คุณสามารถใช้เคล็ดลับต่อไปนี้
1. กดปุ่ม 11จะถือที่สำคัญสุด ( ปุ่ม 11เรียกสคริปต์)
2. ย้ายหน้าต่างโดยใช้ปุ่มเมาส์อื่น ๆ
3. กดปุ่มเมาส์ 11อีกครั้งเพื่อปล่อย ซุปเปอร์คีย์

สคริปต์
ใช้xdotoolเพื่อถือซูเปอร์คีย์
เมื่อคลิกปุ่มแรกให้สร้างไฟล์ชั่วคราวและกดปุ่มค้างไว้ ในการคลิกถัดไปลบไฟล์ tmp และปล่อยกุญแจ

ปรับปรุง

ตามหน้าช่วยเหลือของอูบุนตู (ปุ่มเมาส์หลายวิธี) imwheelสามารถแมปไปยังคีย์ได้


ปัญหาสองสามข้อต่อไปนี้: # 1 นี่ยังเป็นเพียงการแฮ็ค / วิธีแก้ปัญหาอื่นและไม่ตอบคำถาม # 2 xbindkeys ไม่ทำงานในขณะที่กดปุ่มค้างไว้ มันเหมือนกับว่า xbindkeys ถูกหยุดชั่วคราวและไม่ได้ลงทะเบียนอะไรจนกว่าจะมีการปล่อยซุปเปอร์คีย์
Hubro

ตกลงหลังจากการวิจัยประมาณ 5 นาทีฉันก็ถอนจุดที่ 2 เห็นได้ชัดว่าฉันต้องเพิ่มการกำหนดค่า+ Mod4xbindkeys ของฉันไปยังบัญชีสำหรับซุปเปอร์คีย์ที่ถูกระงับ วิธีแก้ปัญหาที่คุณแนะนำดีกว่าของฉันและฉันเปลี่ยนเป็น :-) แต่ก็ยังไม่ตอบคำถาม
Hubro

1

แก้จุดบกพร่องข้อเสนอแนะ: ฉันจะพยายามที่จะตรวจสอบไฟล์เพื่อดูว่าเหตุการณ์ที่เกิดขึ้นจะถูกสร้างขึ้นเมื่อคุณกดและปล่อยปุ่มที่โดยเฉพาะอย่างยิ่งในการอยู่รวมกันพร้อม/dev/input/eventX นี่คือตัวอย่างรหัสเพื่อให้คุณเริ่มต้น คุณจะต้องแก้ไขเพื่อบันทึกเหตุการณ์ทั้งหมดไม่เพียงแค่กดปุ่มเท่านั้นBTN_LEFT

คุณอาจต้องการตรวจสอบxevผลลัพธ์ถ้าคุณยังไม่ได้ การวิเคราะห์บันทึกทั้งสองควรเปิดเผยปัญหาที่แน่นอนที่คุณมี

โอกาสที่เมาส์ของคุณกำลังสร้างเหตุการณ์การปล่อยปุ่มพิเศษเมื่อมีการกดหลายปุ่ม ในกรณีดังกล่าวตัวเลือกของคุณคือใช้วิธีแก้ปัญหาการเชื่อมโยงคีย์หรือแก้ไขxf86-input-evdevไลบรารีเพื่อกรองเหตุการณ์ที่ไม่ต้องการ (หรือจำลองเหตุการณ์ที่ขาดหายไป) ฉันทำสิ่งที่คล้ายกันสักพักสำหรับหน้าจอสัมผัสซึ่งสร้างเหตุการณ์ "คลิก" เมื่อพยายามลากและวาง แนวคิดคือการกรองเหตุการณ์ "ปล่อย" ซึ่งเกือบจะมาพร้อมกัน (ภายในหน้าต่างเวลาเล็ก ๆ ) ด้วย "คลิก" เหตุการณ์ หากการเดาของฉันถูกต้องคุณต้องใช้สิ่งที่คล้ายกันเป็นหลัก


1

ฉันพบสิ่งนี้ก่อนหน้านี้วันนี้ด้วยปุ่มตัวดัดแปลงอื่น ๆ ปัญหาคือคุณต้องรวมโมดิฟายเออร์ในการรวมกันของปุ่มสำหรับการเปิดตัว สมมติว่า Super key ของคุณถูกแมปกับ Mod4 (ซึ่งควรเป็นค่าเริ่มต้น afaik):

"xte 'keydown Super_L'"
  b:11

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

แก้ไข: เพิ่งรู้ว่านี่ไม่ได้ตอบคำถามของคุณอย่างสมบูรณ์เนื่องจากคุณยังคงไม่สามารถใช้ LMB ในขณะที่กด b: 11

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.