Bagaimana cara memetakan kunci keyboard dengan benar ke tombol mouse?

14

Ringkasan pertanyaan: Saya ingin salah satu tombol tetikus saya didaftarkan sebagai tombol Windows kiri Super_Loleh X11.


Di window manager saya, saya dapat memindahkan windows dengan menahan "tombol kiri Windows" (Kiri Super) dan menyeret jendela dengan tombol kiri mouse. Saya ingin dapat melakukannya tanpa menyentuh keyboard, jadi saya ingin memetakan tombol Super kiri ke tombol mouse 11, dengan cara itu saya bisa menahan tombol mouse 11 dan klik + drag windows.

Solusi yang paling jelas adalah menggunakan xbindkeys dan xte seperti ini ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

Ini berfungsi seperti ini:

  • Ketika saya menekan tombol mouse 11, Super_Ljuga ditekan
  • Ketika saya melepaskan tombol mouse 11, Super_Ljuga dirilis

Tapi ada masalah: Saya tidak bisa memindahkan windows menggunakan Super_L+ Mouse1jika saya juga menekan tombol mouse lain, seperti tombol Mouse 11. Menggunakan solusi di atas, tombol mouse 11 masih terdaftar sebagai ditekan dan dilepaskan, jadi tidak ada operasi manajer jendela bekerja.

Saya telah mencoba ini menggunakan kedua Cinnamon dan mengagumkan WM, dan benar-benar tidak ada yang Super_Lkombinasi keyboard pekerjaan sementara tombol mouse 10 atau 11 sedang ditekan.

Peretasan di bawah standar

Saat ini saya sedang mengatasi masalah ini dengan menyebabkan klik mouse untuk menahan Super_Ltombol untuk jangka waktu tertentu. Dengan begitu saya bisa mengklik tombol mouse, lalu seret barang-barang untuk waktu yang singkat sesudahnya:

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

Upaya lain

Seperti yang disarankan oleh totti, saya mencoba xbindkeyskonfigurasi ini :

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

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

Itu tidak bekerja. Tampaknya Super_Ltombol sedang ditekan, karena segera setelah saya melepaskan tombol 10 itu tetap ditekan selama-lamanya (sampai saya menekan Super_Ltombol lagi pada keyboard) tetapi tombol mouse masih terdaftar, karena saya tidak dapat mengklik & seret windows . Saya tidak berpikir saya akan dapat membuat pekerjaan ini menggunakan xbindkeysdan xte.

Hubro
sumber
1
Alih-alih mengikat tombol mouse ke tombol super, lakukan pemetaan ulang. Untuk ini gunakan xmodmap . lihat halaman arch wiki xmodmap untuk pengaturan lengkap.
totti
@totti: Halaman arch wiki xmodmap menjelaskan cara memetakan kunci ke tombol lain, cara menukar tombol pengubah dan cara membalikkan pengguliran, tetapi tidak menyebutkan pemetaan tombol keyboard ke tombol mouse
Hubro
@totti: Dengan xmodmap saya dapat memetakan kunci ke tombol lain, dan dengan ekstensi XKB untuk X (dan xkbset) saya dapat memetakan tombol mouse ke tombol keyboard, tapi saya mencoba memetakan tombol keyboard ke tombol mouse. Saya masih belum menemukan cara untuk melakukan itu.
Hubro
coba: Pada tombol mouse 11 tahan, simulasi rilis super tahan + tombol mouse 11. Pengelola jendela sekarang dapat mendeteksi super & mouse 1 bukan mouse 11.
totti
@totti: Mencoba, dan mengedit pertanyaan
Hubro

Jawaban:

5

Posting askubuntu berisi jawaban yang akan saya ringkas di bawah ini.

Masalahnya adalah bahwa xbindkeys mengambil seluruh mouse, membuat pengubah + pemetaan klik mouse menjadi tidak pasti. Jawabannya menggunakan uinput melalui skrip python-uinput untuk memantau /dev/my-mouseklik tombol ibu jari dan mengirim Ctrlkunci ke keyboard virtual. Berikut langkah-langkah terperinci:

1. Buat aturan udev

Untuk mouse, 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 akan mencari perangkat kernel dengan nama seperti event5. SYMLINK adalah untuk menemukan mouse masuk /dev/my_mx_mouse, dapat dibaca oleh grup mxgrabber.

Untuk menemukan informasi perangkat keras, jalankan sesuatu seperti:

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

Untuk uinput, ajukan /etc/udev/rules.d/94-mxkey.rules:

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

Cabut dan pasang mouse Anda, atau paksa udev untuk memicu aturan udevadm trigger.

2. Aktifkan Modul UINPUT

sudo modprobe uinput

Dan di /etc/modules-load.d/uinput.conf:

uinput

3. Buat grup baru

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login

4. Skrip python

Pasang python-uinput librarydan python-evdev library.

Skrip di bawah ini memerlukan pengidentifikasian kode event.code tombol:

#!/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. Finishing

Buat file python dieksekusi dan pastikan itu dimuat saat startup.

harrymc
sumber
Saya telah memperbarui skrip untuk menetapkan kode kunci yang tidak digunakan ke tombol mouse (saya mengaturnya ke F13, F14dan F15, dan menonaktifkan fungsi mouse menggunakan xinput. Kemudian saya dapat dengan mudah menetapkan kembali kunci-kunci itu untuk apa pun yang saya butuhkan menggunakan sederhana xmodmap. Gagasan utama dirancang di intisari (ada beberapa nilai hardcoded dan saya tidak mengembalikan xinputfungsi mouse setelah itu), saya akan membuat posting blog tentang ini dengan versi final dari skrip (dan berbagi tautan di sini ketika akan dilakukan. Terima kasih kasih atas bantuan Anda! ☺ ♥
zmo
Periksa juga jawaban baru saya di utas lainnya untuk solusi berbasis x11 askubuntu.com/a/903389/269589
Maxim
1

Karena Anda dapat menjalankan skrip pada klik mouse, Anda dapat menggunakan trik berikut.
1. Tekan Tombol 11 untuk menahan tombol super . ( Tombol 11 memicu skrip)
2. Memindahkan windows menggunakan tombol mouse lainnya
3. Tekan tombol mouse 11 lagi untuk melepaskan tombol super

script
Gunakan xdotooluntuk menahan tombol super
Pada klik Tombol pertama, buat file temp dan tahan tombol. Pada klik selanjutnya hapus file tmp dan lepaskan kunci,

memperbarui

Menurut halaman bantuan ubuntu (banyak tombol mouse cara) imwheeldapat memetakan kembali ke tombol.

totti
sumber
Beberapa masalah dengan itu: # 1 Ini masih merupakan hack / solusi lain, dan tidak menjawab pertanyaan. # 2 xbindkeys tidak berfungsi saat tombol super ditekan. Seolah xbindkeys dijeda, dan tidak mendaftarkan apa pun, sampai kunci super dilepaskan.
Hubro
Ok, setelah sekitar 5 menit penelitian, saya menarik kembali poin # 2. Saya tampaknya harus menambahkan + Mod4konfigurasi xbindkeys saya ke akun untuk tombol super ditekan. Solusi yang Anda sarankan lebih baik daripada saya, dan saya beralih ke itu :-) Tapi itu masih tidak menjawab pertanyaan.
Hubro
1

Saran debug: Saya akan mencoba memonitor /dev/input/eventXfile untuk melihat peristiwa apa yang dihasilkan ketika Anda menekan dan melepaskan tombol itu, terutama dalam kombinasi dengan BTN_LEFT. Berikut adalah contoh kode untuk membantu Anda memulai. Anda jelas harus memodifikasinya untuk mencatat semua peristiwa, tidak hanya penekanan tombol.

Anda mungkin juga ingin memeriksa xevoutput, jika Anda belum melakukannya. Menganalisis kedua log harus mengungkapkan masalah yang Anda alami.

Kemungkinannya adalah mouse Anda menghasilkan acara pelepasan tombol tambahan saat beberapa tombol ditekan. Dalam hal ini, opsi Anda akan menggunakan solusi pengikatan kunci, atau memodifikasi xf86-input-evdevperpustakaan untuk memfilter acara yang tidak diinginkan (atau mensimulasikan yang hilang). Saya melakukan sesuatu yang serupa beberapa waktu lalu untuk layar sentuh yang menghasilkan acara "klik" ketika mencoba untuk menarik & melepas. Idenya adalah untuk menyaring peristiwa "rilis" yang datang hampir bersamaan (dalam jendela waktu kecil) dengan peristiwa "klik". Jika tebakan saya benar, Anda pada dasarnya perlu menerapkan sesuatu yang serupa.

Dmitry Grigoryev
sumber
1

Saya menemukan ini sebelumnya hari ini dengan kunci pengubah lainnya. Masalahnya adalah Anda harus menyertakan pengubah dalam kombinasi tombol untuk rilis. Dengan asumsi kunci Super Anda dipetakan ke Mod4 (yang seharusnya menjadi default, afaik):

"xte 'keydown Super_L'"
  b:11

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

EDIT: Baru menyadari bahwa ini tidak sepenuhnya menjawab pertanyaan Anda karena Anda masih tidak dapat menggunakan LMB sambil menahan b: 11

DreadPirateLynx
sumber