Cara memetakan pengubah (misalnya CTRL) ke tombol ibu jari menggunakan xbindkeys

13

Pertanyaan ini sudah ditanyakan tetapi tidak pernah dijawab dengan benar. Setelah izin dengan @Seth saya sekarang bertanya lagi. Ini akan memungkinkan saya untuk merespons dan mungkin memodifikasi pertanyaan lebih mudah. Pertanyaan asli dapat ditemukan di sini:

Peta Ctrl dan Alt untuk tombol ibu jari mouse


Isu:

Meskipun sangat sederhana untuk memetakan penekanan tombol apa pun ke tombol mouse yang digunakan xbindkeysbersama dengan xdotoolatau xtetampaknya jauh lebih bermasalah untuk memetakan kunci pengubah (misalnya ALT , CTRL , SHIFT dll) untuk itu.

Soloution terakhir harus memungkinkan ia klik CTRL + (misalnya untuk memilih beberapa entri dari daftar) hanya dengan mouse.

Beberapa pendekatan yang mungkin untuk menyelesaikan masalah ini dapat ditemukan di sini di Stack Exchange dan juga di forum terkait Linux lainnya. Tetapi tidak satu pun dari mereka yang berfungsi seperti yang diharapkan karena mengarah pada masalah lain dan efek samping.

Catatan:

Beberapa contoh di bawah ini melibatkan Guile dengan sintaks Skema dan bergantung pada .xbindkeysrc.scmfile sedangkan yang lain bergantung pada .xbindkeysrcfile dengan sintaks masing-masing. Saya sadar mereka tidak akan bekerja sama.

Selain itu, cuplikan di bawah ini xdotoolhanya mengandalkan pada tetapi saya terbuka untuk pendekatan yang melibatkan aplikasi lain seperti misalnya xte- meskipun tampaknya keduanya mengarah pada hasil yang sama dan karena itu saya menggunakan xdotooltindakan yang adil di sini.

Pendekatan a:

Memperbarui .xbindkeysrcfile dengan:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + b:8

Itulah yang awalnya saya coba tetapi memiliki efek samping bahwa pengubah ditahan dan tidak dapat dirilis.

Pendekatan B:

Memperbarui .xbindkeysrc.scmfile dengan:

(xbindkey '("b:8") "xdotool keydown ctrl")
(xbindkey '(release "b:8") "xdotool keyup ctrl")

(xbindkey '("m:0x14" "b:8") "xdotool keydown ctrl")
(xbindkey '(release "m:0x14" "b:8") "xdotool keyup ctrl")

Ditemukan di http://www.linuxforums.org/forum/hardware-peripherals/169773-solved-map-mouse-button-modifier-key.html dan mencoba untuk mengatasi masalah di mana pengubah ditahan (seperti dijelaskan pada pendekatan Sebuah).

Meskipun itu diperbaiki bahwa itu hanya berfungsi sebagian karena tidak mungkin untuk melakukan klik mouse lainnya saat tombol ibu jari ditekan.

Pendekatan C:

Memperbarui .xbindkeysrcfile dengan:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

Dicoba oleh OP dari pertanyaan terkait di sini di askubuntu. Jauh lebih sederhana dan lebih solid karena tidak melibatkan negara pengubah. Namun demikian masalahnya tetap ada, yaitu klik CTRL + tidak dimungkinkan.

Tampaknya itu xbindkeyssendiri adalah masalah di sini karena mengenali klik tetapi tidak akan menjalankannya. Ini dapat diuji menggunakan xev | grep buttondan xbindkeys -v:

Klik mouse normal sebagaimana dicatat oleh xevakan terlihat seperti:

state 0x10, button 1, same_screen YES
state 0x110, button 1, same_screen YES

Serta untuk tombol ibu jari:

state 0x10, button 8, same_screen YES
state 0x10, button 8, same_screen YES

Tetapi ketika memiliki xbindkeyskonfigurasi di atas diaktifkan itu tidak merekam apa pun. Meskipun masuk akal untuk tombol jempol karena dipetakan ke CTRL dan karena itu bukan tombol mouse lagi aneh bahwa tombol 1 tidak direkam juga. Ini mungkin karena xbindkeystidak menjalankannya tetapi ia sendiri yang mengenalinya:

Button press !
e.xbutton.button=8
e.xbutton.state=16
"xdotool keydown ctrl"
    m:0x0 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Button press !
e.xbutton.button=1
e.xbutton.state=20
Button release !
e.xbutton.button=1
e.xbutton.state=276
Button release !
e.xbutton.button=8
e.xbutton.state=20
"xdotool keyup ctrl"
    Release + m:0x4 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call

Pendekatan D:

Memperbarui .xbindkeysrcfile dengan:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

"xdotool click 1"
  b:1

Terlalu sederhana ... tetapi mengarah ke loop klik tanpa batas.


MEMPERBARUI:

Sementara itu saya sudah membeli Logitech G502 dan memperhatikan bahwa setelah dikonfigurasi melalui driver pada Windows tidak hanya profil itu sendiri yang disimpan pada memori perangkat tetapi penekanan tombol yang sebenarnya dilakukan oleh mouse. Itu sebenarnya memecahkan masalah saya di Linux!

Satu-satunya tikus lain yang saya ingat yang dapat melakukan itu adalah Razer Copperhead pada masa itu. Tapi saya rasa ada tikus lain yang tersedia saat ini yang dapat melakukan hal yang sama.

conceptdeluxe
sumber
1
inilah solusi menggunakan Easystroke: askubuntu.com/a/1010647/27202
atti

Jawaban:

8

Saya menghabiskan banyak waktu untuk mencoba membuat ikatan itu berhasil. Saya akhirnya menemukan solusi, yang rumit tetapi berfungsi dengan baik dan tidak menyiratkan perangkat lunak pihak ketiga. Saya membagikannya di sini berharap ini akan membantu orang. Selain itu, saya tahu ini tidak sempurna dalam hal keamanan, jadi umpan balik yang membangun lebih dari diterima.

Ada solusi yang sangat bagus, seperti yang diusulkan di sini , tetapi Selalu menderita dari keterbatasan xbindkeys yang mengambil seluruh mouse, membuat pengubah + pemetaan klik mouse tidak pasti. Ditambah solusi berbasis tipu daya dari tautan di atas menggunakan ctrl + plus / ctrl + minus yang tidak dikenali oleh Gimp misalnya.

Saya tahu bahwa yang kami inginkan adalah tombol mouse yang bertindak sebagai keyboard, jadi saya menggunakan uinput, yang dapat diakses melalui python , menulis skrip yang memantau / dev / my-mouse untuk klik tombol jempol dan mengirim tombol ctrl ke keyboard virtual. Berikut langkah-langkah terperinci:

1. Buat aturan udev

Kami ingin perangkat dapat diakses (hak dan lokasi).

Untuk mouse:

/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 yang dikenali oleh kernel dengan nama seperti event5, dan saya memilih mouse saya dengan nama tersebut. Instruksi SYMLINK memastikan saya akan menemukan mouse saya di / dev / my_mx_mouse. Perangkat akan dapat dibaca oleh anggota grup "mxgrabber".

Untuk menemukan informasi tentang perangkat keras Anda, Anda harus menjalankan sesuatu seperti

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

Untuk uinput:

/etc/udev/rules.d/94-mxkey.rules
----------------------------------------------------
KERNEL=="uinput", GROUP="mxgrabber", MODE="660"

Tidak perlu untuk symlink, uinput akan selalu di $/dev/uinputatau$/dev/input/uinput tergantung pada sistem yang Anda . Cukup beri dia grup dan hak untuk membaca DAN menulis tentu saja.

Anda harus mencabut steker - mouse Anda, dan tautan baru akan muncul di / dev. Anda dapat memaksa udev untuk memicu aturan Anda$udevadm trigger

2. Aktifkan Modul UINPUT

sudo modprobe uinput

Dan untuk membuatnya tahan boot:

/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput

3. Buat grup baru

sudo groupadd mxgrabber

Atau apa pun yang Anda sebut grup akses Anda. Maka Anda harus menambahkan diri Anda ke dalamnya:

sudo usermod -aG mxgrabber your_login

4. Skrip python

Anda perlu menginstal pustaka python-uinput (jelas) dan pustaka python-evdev . Gunakan pip atau paket distribusi Anda.

Scriptnya cukup mudah, Anda hanya perlu mengidentifikasi kode event.code Anda.

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

Yang Anda butuhkan sekarang adalah membuat file python Anda dapat dieksekusi, dan minta manajer desktop Anda untuk memuat file saat startup. Mungkin juga segelas anggur untuk merayakan pekerjaan yang baik!

6. Ekstra gratis

Saya menggunakan xbindkeys untuk perilaku tambahan. Misalnya, konfigurasi berikut mungkin bagus jika Anda memiliki mouse dengan klik sisi roda:

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

Agar kombinasi terakhir ini berfungsi, Anda harus menonaktifkan tombol yang Anda konfigurasi untuk skrip python , jika tidak, tombol itu masih akan diambil oleh xbindkeys. Hanya tombol Ctrl yang harus tetap:

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

Muat ulang dengan $ xmodmap ~/.Xmodmap

7. Kesimpulan

Seperti yang saya katakan di awal, saya tidak sepenuhnya senang dengan kenyataan bahwa saya harus memberikan diri saya hak untuk menulis ke / dev / uinput, bahkan jika itu dianggap sebagai grup "mxgrabber". Saya yakin ada cara yang lebih aman untuk melakukan itu, tetapi saya tidak tahu caranya.

Sisi baiknya, ini bekerja sangat, sangat baik. Kombinasi tombol keyboard atau mouse apa pun yang berfungsi dengan tombol Ctrl keyboard sekarang bekerja dengan salah satu mouse !!

Aurélien Cibrario
sumber
Terima kasih banyak atas upaya dan berbagi dengan kami! +1 ... Meskipun saya belum mengujinya. BTW Saya hampir menyerah pada ini - akan lebih baik jika itu bekerja seperti yang diharapkan :)
conceptdeluxe
Sama-sama ! Bagi saya, itu bekerja dengan sempurna. Jika Anda memiliki masalah, beri tahu saya. Saya mencoba untuk membuat jawaban saya lengkap, tetapi ketika saya menghabiskan hampir dua hari mencoba membuatnya bekerja, saya mungkin telah melupakan sesuatu. Dengan senang hati akan membantu / mengedit posting saya.
Aurélien Cibrario
Saya baru menyadari bahwa ctrl + click1 adalah pilihan yang sangat buruk untuk menutup tab karena membuka tautan di tab baru. Saya mengedit jawaban saya menghapus bagian terakhir dari skrip python dan mengutak-atik xbindkeys, solusi bersih
Aurélien Cibrario
hanya ingin memberi tahu Anda, bahwa saya belum punya waktu untuk mengujinya - tetapi saya pasti akan membuatnya menjadi jawaban yang diterima jika berfungsi seperti yang diharapkan - maaf untuk menunggu - saya agak sibuk atm
conceptdeluxe
Saya bertanya-tanya apakah kita dapat menggunakan skrip di atas untuk menghapus sakelar mouse yang rusak. Saya punya mouse yang aus. Saya menggunakan skrip autohotkey untuk memperbaikinya di Windows tetapi tidak ada alat untuk memperbaikinya di Linux. Berikut ini adalah skrip Autohhotkey untuk perbaikan tombol kiri autohotkey.com/board/topic/63555-debounce-mouse-keys Saya harap seseorang port ke Linux menggunakan python3 - evdev
kenn
4

Saya menemukan solusi dengan PyUserInput . Ini akhirnya menjadi sangat sederhana dan tidak memerlukan hak administrasi. Dengan python 2 dan PyUserInput terinstal, saya menggunakan skrip berikut:

#!/usr/bin/python
from pymouse import PyMouseEvent
from pykeyboard import PyKeyboard

k = PyKeyboard()
class MouseToButton(PyMouseEvent):
    def click(self, x, y, button, press):
        if button == 8:
            if press:    # press
                k.press_key(k.control_l_key)
            else:        # release
                k.release_key(k.control_l_key)

C = MouseToButton()
C.run()

Setelah memberikan hak eksekusi pada skrip, saya menyebutnya dengan garis ~/.xsessionrc, misalnya

~ / path / ke / script.py &

Catatan . ini tidak mencegah peristiwa tombol mouse dari penembakan. Dalam kasus saya, saya biasa xinput set-button-mapmengubah pemetaan tombol xinput dan menetapkan jumlah tombol yang saya minati untuk sesuatu yang tidak digunakan.

Misalnya, jika Anda ingin menggunakan tombol 8 pada mouse Anda tetapi tombol 8 sudah memiliki fungsi (misalnya, page-next ), Anda dapat menggunakan yang berikut ini.xsessionrc

logitech_mouse_id=$(xinput | grep "Logitech M705" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
xinput set-button-map $logitech_mouse_id 1 2 3 4 5 6 7 12 9 10 11 12 13 14 15 16 17 18 19 20
./.xbuttonmodifier.py &

asalkan tombol 12tidak membawa arti ke OS, dan menetapkan fungsi kustom untuk tombol 12dalam .xbuttonmodifier.py, skrip yang saya jelaskan di atas.

Pepatah
sumber
Tapi itu tidak mencegah acara asli dari penembakan. Jadi jika saya memetakan tombol 8 untuk menggeser, dan menahan tombol 8 di Firefox, itu juga mencoba untuk kembali ke halaman sebelumnya, yang tidak diinginkan.
user23013
1
Benar. Untuk mengatasi ini saya menggunakan mengubah id tombol saya tertarik ke tombol yang digunakan di xinput. Lihat pertanyaan yang diedit.
Maxim
2

Saya punya solusi parsial. Saya belum menemukan cara menghapus peta tombol yang ada, jadi Anda berakhir dengan klik tombol dan pengubah yang Anda inginkan. Jadi jika tombol mouse itu memiliki beberapa tujuan yang sudah ada, itu masih akan menyala. Misalnya, memetakan kembali tombol mouse kanan ke tombol kontrol akan menghasilkan kontrol + klik yang dikirim.

Bagaimanapun, saya menemukan posting forum yang mirip dengan pertanyaan Anda yang jawabannya adalah menginstal btnx dan mengkonfigurasi pengubah Anda melalui itu. Sepertinya btnx tidak lagi tersedia melalui repo. Ada ppa, tetapi tidak berfungsi untuk ubuntu terbaru.

Posting forum: posting: http://ubuntuforums.org/showthread.php?t=1245930

Tetapi sumber tersedia:

Anda bisa mengkompilasinya dari sumber, tetapi ini akan menempatkan file di sistem Anda yang tidak bisa dikelola oleh pengelola paket.

Yaitu, file-file berikut:

/usr/local/sbin/btnx
/etc/init.d/btnx
/usr/share/pixmaps/btnx.png
/usr/share/btnx-config (directory, multiple files)
/usr/share/applications/btnx-config.desktop
/usr/share/omf/btnx-config/btnx-manual-C.omf
/usr/share/locale/de/LC_MESSAGES/btnx-config.mo
/usr/share/locale/fr/LC_MESSAGES/btnx-config.mo
/usr/share/locale/nl/LC_MESSAGES/btnx-config.mo
/usr/share/locale/ru/LC_MESSAGES/btnx-config.mo

Symlink berikut:

/etc/rc0.d/K49btnx -> ../init.d/btnx
/etc/rc1.d/K49btnx -> ../init.d/btnx
/etc/rc6.d/K49btnx -> ../init.d/btnx
/etc/rc2.d/S49btnx -> ../init.d/btnx
/etc/rc3.d/S49btnx -> ../init.d/btnx
/etc/rc4.d/S49btnx -> ../init.d/btnx
/etc/rc5.d/S49btnx -> ../init.d/btnx

Jadi ... jika Anda tidak keberatan membangun dari sumber ...

Dapatkan dependensi untuk btnx:

sudo apt-get install libdaemon-dev git

Jika Anda belum pernah membangun sesuatu dari sumber, Anda mungkin perlu build-essential juga:

sudo apt-get install build-essential

Lalu dapatkan dan kompilasi btnx:

git clone https://github.com/cdobrich/btnx
cd btnx
./configure
make
sudo make install
cd -

Ini memiliki alat konfigurasi GUI yang terpisah. Dapatkan dependensi untuk itu:

sudo apt-get install libgtk2.0-dev libglade2-dev

Sekarang dapatkan dan kompilasi alat config gui:

git clone https://github.com/cdobrich/btnx-config
./configure
make
sudo make install

Sekarang jalankan alat:

sudo btnx-config

Klik pada Detect Mouse Buttons Jika Anda ingin dapat membaca petunjuk saat Anda menggunakan alat, mengubah ukuran jendela yang muncul, teks dialog akan terpotong kemudian jika Anda tidak dan jika Anda mencoba untuk mengubah ukuran selama deteksi itu akan membatalkan deteksi. Jadikan jendela sedikit lebih besar.

Klik pada Tekan untuk memulai deteksi tetikus, kemudian cobalah untuk tidak menggerakkan tetikus sampai teks berubah ... Membutuhkan waktu sekitar 5-10 detik. Teks akan berubah. Ketika itu terjadi, abaikan apa yang dikatakannya dan klik Forward.

Klik tombol "Tekan untuk memulai deteksi tombol"

Di sini Anda akan mengklik satu tombol mouse Anda beberapa kali (hingga bilah status terisi). Kemudian atur nama tombol ke sesuatu yang akan Anda kenali nanti (mis: LeftButton) Klik tombol Tambah.

Ulangi ini untuk setiap tombol mouse (jangan lupa gulir roda, gulir klik, dll). Anda mungkin dapat melewati tombol apa saja yang tidak ingin Anda remap.

Setelah Anda menambahkan semua tombol, klik OK.

Di GUI utama, klik Tombol, di panel kiri pilih tombol yang ingin Anda remap. Ini akan menggunakan nama yang Anda masukkan pada langkah sebelumnya. Untuk keperluan Anda, Anda hanya perlu memilih Pengubah kunci di bawah Kombinasi tombol di sebelah kanan.

Jangan klik hapus pada layar ini, itu akan menghapus tombol. Anda harus kembali dan mendeteksi tombol lagi jika Anda melakukannya.

Kembali ke layar Conrigurations dan klik restart btnx.

Coba tombol baru.

Jika Anda ingin menghapus instalan aplikasi, hentikan program btnx dan kemudian masuk ke direktori masing-masing memeriksa direktori dan lakukan uninstall:

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -
Stephen
sumber
2
Terima kasih banyak untuk jawaban terperinci yang Anda posting di pastebin. Tetapi saya khawatir bahwa saya tidak diizinkan untuk menggunakan ppa yang tidak tepercaya atau membuat aplikasi dari sumber yang tidak dikenal tanpa memeriksanya secara rinci di perangkat saya. Namun demikian saya akan memberi Anda suara untuk upaya yang telah Anda lakukan. Selain itu saya sarankan Anda memperbarui jawaban Anda di sini dan menyalin apa yang Anda tulis di sana karena informasi ini mungkin bermanfaat bagi orang lain tetapi mungkin diabaikan. Akhirnya saya telah membaca bahwa paket tersebut mungkin tidak dapat dikompilasi di Ubuntu atau Debian - sudahkah Anda mencobanya?
conceptdeluxe
Btw: Anda dapat memperoleh 100 reputasi tambahan dengan mudah dengan menautkan akun askubuntu Anda dengan akun Stack Exchange lainnya seperti misalnya Linux & Unix.
conceptdeluxe
Ya, saya mengujinya di bawah Ubuntu 14.04. Saya membuat tombol kanan mouse mengirim kunci kontrol dan mengkonfirmasi bahwa itu berfungsi sebelum memposting. Dan kemudian hampir meninggalkan pos karena persyaratan reputasi.
Stephen