Bagaimana cara saya memetakan tombol secara otomatis pada mouse saya saat startup?

30

Saya berjuang dengan ini selama akhir pekan, dan perlu memetakan kembali tombol mouse saya.

zerobandwidth
sumber

Jawaban:

47

Saya memiliki mouse Logitech dengan 9 tombol, dan menekan "tombol tengah" (# 2) melibatkan mengklik roda gulir. Saya tidak suka ini karena saya kikuk dan biasanya akhirnya menggulir jendela saya ketika saya mencoba mengklik roda. Jadi saya ingin secara otomatis memetakan kembali tombol sisi atas (# 9 dalam hal ini) ke tombol tengah (# 2). Saya juga ingin memetakan tombol sisi bawah (# 8) sehingga menjalankan klik dua kali tombol kiri (# 1).

Meskipun tujuan saya spesifik, solusi di bawah ini dapat digeneralisasi untuk situasi apa pun di mana Anda ingin memetakan ulang tombol mouse secara otomatis saat startup.

Memetakan Tombol Mouse ke Tombol Mouse Lainnya

Anda perlu xinputdiinstal untuk tugas ini. Ini bisa dilakukan sepenuhnya di .xsessionrcfile Anda . Pertama, gunakan xinputuntuk menemukan nama yang ditetapkan untuk mouse Anda, yang kemudian dikorelasikan dengan ID perangkat input. Di bawah ini adalah beberapa contoh keluaran dari laptop saya:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer            id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse              id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard           id=5    [slave  keyboard (3)]

Mouse saya memanggil dirinya sendiri Logitech USB Laser Mousedan ditampilkan sebagai id=11. Mouse Anda akan memiliki nama yang berbeda; mencari tahu yang tersisa sebagai latihan untuk pembaca.

Saat Anda masih mengetahui ID perangkat dalam sesi ini , cari tahu berapa banyak tombol yang dipikirkan oleh handler input yang dimiliki mouse Anda, dengan menggunakan . Ini mungkin berbeda dari jumlah tombol yang terlihat pada perangkat.xinput list deviceID

Logitech USB Laser Mouse                    id=11   [slave  pointer  (2)]
    Reporting 7 classes:
        Class originated from: 11. Type: XIButtonClass
        Buttons supported: 16
        Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"

Dengan mouse saya, hanya ada 9 tombol fisik yang jelas, tetapi xinputlaporan 16.

Mengingat sifat USB, ID ini dapat berubah setiap kali Anda memulai ulang, sehingga tidak cukup untuk skrip sesuatu yang secara statis dikunci ke ID yang Anda temukan sekali. Anda harus menguraikan ini secara dinamis saat memulai dan menjalankan peta ulang Anda berdasarkan ID saat ini.

Sekarang setelah Anda tahu namanya, Anda dapat menggunakannya xinput testuntuk mencari tahu kunci mana yang harus dipetakan. Tekan tombol mouse yang ingin Anda petakan dari dan ke, untuk mendapatkan indeksnya. (Untuk referensi, 1, 2, dan 3 "selalu" (yaitu, biasanya) merujuk ke tombol kiri, tengah, dan kanan mouse 3 tombol. Pemetaan ulang umum membalikkan ini untuk membuat mouse kidal. )

button press   2
button release 2
button press   9
button release 9

Dalam hal ini saya menemukan bahwa saya ingin memetakan tombol # 9 (samping, atas) ke tombol # 2 (tengah).

Sekarang setelah Anda tahu nama mouse Anda, dan tombol mana yang ingin Anda ubah, Anda dapat menulis ~/.xsessionrcskrip yang dipanggil xinputuntuk menjalankan pemetaan ulang tombol saat startup. Di bawah ini adalah naskah lengkap saya.

# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16

Baris pertama di sini menetapkan variabel sesi sementara sama dengan ID mouse seperti yang dilaporkan oleh xinput. Ini dilakukan dengan grepmemasukkan nama mouse yang diketahui dalam laporan xinput, lalu menggunakan seduntuk mengekstrak nomor ID dari id=xxxtoken itu dalam laporan. Nilai ini kemudian digunakan dalam xinput set-button-maparahan, yang mengeksekusi pemetaan ulang. Pada contoh di atas, satu-satunya perubahan adalah tombol # 9 sedang dipetakan kembali ke tombol meniru # 2. Semua lainnya tetap pada pengaturan standarnya.

Pembaruan: Seperti yang ditunjukkan @Lokasenna di bawah ini , jika perangkat Anda melaporkan dirinya sebagai mouse dan keyboard, Anda mungkin perlu membatasi jumlah hasil greppenggunaan -m 1.

Memetakan Tombol Mouse ke Fungsi Sewenang-wenang

Lihat juga jawaban ini .

Anda perlu xinput,, xbindkeysdan xautomation(termasuk xte) diinstal untuk tugas ini.

Gunakan xinput listdan xinput testuntuk menemukan ID perangkat mouse Anda dan jumlah tombol yang ingin Anda tetapkan. Dalam kasus saya, saya ingin memetakan tombol sisi bawah (# 8) menjadi klik dua kali tombol kiri (# 1).

Buat atau edit ~/.xbindkeysrc. Format file ini adalah serangkaian garis berpasangan. Baris pertama adalah perintah yang akan dieksekusi untuk suatu acara; baris kedua adalah deskripsi acara. Kami akan menggunakan xtekomponen xautomationuntuk mengirim acara langsung ke penangan input.

Untuk membuat acara klik dua kali ketika tombol dilepaskan, saya menambahkan yang berikut:

"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

Konfigurasi ini memetakan urutan dua klik mouse pada tombol # 1 hingga pelepasan tombol # 8. (Secara teori saya kira Anda dapat memetakan perintah apa pun ke tombol mouse, tetapi ini adalah kasus yang paling umum. Lihat jawaban ini untuk contoh praktis lainnya.)

Pembaruan untuk 16,04 Ubuntu

Untuk pengguna dengan banyak mouse yang terpasang pada sistem Anda, Anda juga harus memberikan ID perangkat. Ini mungkin tidak berlaku untuk semua pengguna dan ditemukan di Ubuntu 16.04 dengan Unity.

xinput list

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Kensington      Kensington Expert Mouse   id=9    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=14   [slave  pointer  (2)]

Kemudian modifikasi file .xbindkeysrc dengan mereferensikan id = nilai dari output perintah (id = 9 dalam contoh ini):

"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
zerobandwidth
sumber
7
Terima kasih untuk informasi. Awk Anda sepertinya perlu diubah berdasarkan jumlah kata di perangkat. Saya menggunakansed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112
Menurut uji ibu jari kunci xinput memicu tiga tekan tombol yang berbeda - bagaimana cara mengikat semuanya bersama-sama di .xbindkeysrc?
axltop
@ jbo5112 Saya baru saja mulai menggunakan beberapa mouse pada laptop kantor saya, dan memiliki alasan yang baik untuk meninjau kembali komentar Anda. Saya sekarang telah mengganti awkpernyataan lama saya dengan sedpernyataan Anda dalam contoh saya. Terima kasih atas peningkatannya!
zerobandwidth
2
Tidak perlu menggunakan id di set-tombol-peta; misal:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin
Masalah yang tidak biasa saya kira: xinputtidak menunjukkan mouse saya dua kali, seperti ini: ↳ USB OPTICAL MOUSE id = 12 [pointer slave (2)] ↳ USB OPTICAL MOUSE id = 13 [pointer slave (2)] Hanya ID 13 yang akan menangkap perintah xinput test. Script akan selalu menangkap ID pertama. Tapi mengapa itu dua kali? Keduanya menghilang ketika saya mencabut mouse ini dan muncul kembali saat terhubung.
langit-langit
6

Langkah singkat untuk ini adalah:

Ada utilitas yang disebut xinput. xinput listatau hanya xinputakan menampilkan semua perangkat input X dan ID mereka. Di sini Anda menemukan ID mouse yang ingin Anda remap.

Saya akan menggunakan ID saya sebagai contoh, dari pengaturan saya, yaitu 21, kemudian xinput --get-button-map 21akan ditampilkan

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Sekarang, jika Anda ingin, katakan, menukar tombol kiri dan kanan yang Anda jalankan

xinput --set-button-map 21 3 2 1

Di sinilah kita, pemetaan ulang dilakukan.

Untuk menjalankannya saat startup cukup masukkan ini ke dalam file:

echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh

berikan izin yang dapat dieksekusi

chmod +x leftmouseremap.sh 

Akhirnya, tambahkan ini ke Aplikasi Statrtup secara manual dari GUI atau, jika Anda menginginkannya dari CLI, letakkan teks di bawah ini (ubah jalur ke milik Anda) di dalam file Anda ~/.config/autostart, ini milik saya ( less .config/autostart/leftmouseremap.sh.desktop):

[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=

Perlu diingat, bahwa dengan KDE jalannya akan seperti ~/.kde/Autosart, bagi manajer Desktop lainnya ini mungkin terlihat sangat berbeda. Atau, menjalankan startup dapat dilakukan dengan pendekatan umum dengan menggunakan /etc/rc.local.

Ruslan Gerasimov
sumber
Ini memecahkan masalah tumpahan air saya. Saya memiliki tombol klik kiri / kanan di bawah touchpad laptop saya. Saya menumpahkan air dan sekarang kedua tombol mengirim sinyal klik tengah ke OS (saya menemukan ini menggunakan aplikasi 'keymon'). Saya menggunakan metode Anda untuk memetakan ulang klik tengah menjadi klik kiri, jadi setidaknya saya bisa menikmati pengalaman klik kiri. Saya tidak pernah menggunakan klik tengah jadi ini berfungsi dengan baik untuk saya :) Terima kasih atas instruksi sederhana. ID perangkat input saya adalah 11, jadi saya menjalankan "xinput --set-button-map 11 1 1 3" Terima kasih !!
Vahid Pazirandeh
3

Saat menggunakan jawaban hebat zerobandwidth , beberapa perangkat, seperti Logitech MX Ergo, muncul sebagai penunjuk dan perangkat keyboard :

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech MX Ergo                          id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [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)]
    ...
    ↳ Logitech MX Ergo                          id=15   [slave  keyboard (3)]

Akibatnya, grep "Logitech MX Ergo"akhirnya mengembalikan dua nilai. Yang terakhir akhirnya dimasukkan sebagai item pertama dalam string pemetaan dan mengacaukan semua tombol mouse Anda.

Cara mengatasinya mudah - hanya menggunakan grep's argumen maksimum-hitung, -m 1:

my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput --set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
Lokasenna
sumber
Tip yang bagus; Saya telah mengedit jawaban untuk memasukkannya. Terima kasih!
zerobandwidth
1

Saya dapat mengubah pemetaan tombol tengah mouse Logitech ke 'Return' menggunakan Easystroke Gesture Recognition yang saya unduh dari Ubuntu Software Center. Edit: Dalam aplikasi, Anda akan memilih Add Action, Beri nama, pilih jenis kunci, klik pada Detail dan tekan Enter, tekan Record Stroke, dan selama prompt tekan ke bawah pada tombol tengah.

atr15
sumber
1
Selamat datang di AskUbuntu. Anda perlu memberikan detail lebih banyak dengan jawaban Anda.
David
Ok, silakan lihat edit di atas.
atr15
Tangkapan yang bagus. Tetapi apa yang Anda gambarkan tidak sesuai dengan yang Anda perintahkan: sebenarnya tombol tengah adalah tombol default untuk meletakkan aplikasi itu ke 'mode pengenalan gerakan': ketika menekannya, aplikasi mulai mengenali gerakan yang Anda buat. Namun, +1 karena aplikasi itu memiliki modul untuk mengungkapkan ID tombol mouse; ini membantu ketika kita ingin menggunakan xinputdengan tombol yang tidak muncul saat menggunakan xinput list <devID>.
1111161171159459134
1
Oh, ini datang 1 tahun kemudian - jawaban Anda
bernilai
1

Sebelum 12,04 ada alat grafis mudah yang disebut "btnx" di repositori standar, yang ditambahkan sebagai "Properti tombol" di Konfigurasi Sistem. Namun sayangnya itu dijatuhkan. PPA "tidak dipercaya" saat ini dikelola untuk 14,04, 16,04, dan 18,04 ada di sini: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (ditemukan di https://launchpad.net/ubuntu/xenial/+source / btnx )

Ini tidak akan berintegrasi dengan pengaturan Sistem tetapi berfungsi cukup baik pada laptop saya dengan mouse 5 tombol murah. Itu dapat memetakan kembali ke penekanan tombol dan perintah juga dan konfigurasi jauh lebih sederhana daripada dengan metode lain!

a-langit
sumber
Saya ingin tahu apakah alat ini membuat perubahan yang sama, hanya di latar belakang. ^ _ ^
zerobandwidth
0

Saya memiliki HP elitebook 2570p, Ubuntu 18.04.2. Di sini saya memiliki trackpoint yang tidak berguna bagi saya dan di sini ada 2 tombol trackpoint yang tidak berguna di bawah spasi

Saya tidak menggunakan tombol ini karena saya memilikinya di bawah touchpad. Saya ingin memetakan kembali tombol ini ke kiri = back_button (Alt_L + Kiri), yang kanan = middle_mouse_button. Trackpoint dalam "xinput" adalah id = 11 dan tombol kiri adalah nomor 1, kanan adalah 3.

Bisakah seseorang menulis kepada saya kode yang benar untuk hanya menyalin ke terminal? Saya telah menggabungkan dengan xbindkeysrc tetapi itu menetapkan tindakan apa pun untuk kedua tombol (trackpoint dan touchpad)

Atom
sumber
Saya telah melakukan ini dan membuatnya secara sederhana: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </code> Itu membuat tombol touchpoint saya (id 11) menjadikan kiri sebagai tombol ke-8, tengah sebagai klik kiri (no 1), dan klik kanan sebagai middel dan kemudian 'kode' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'key Left' 'keyup Alt_L' & amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'code' Ini mengatur tombol no 8 (b: 8) menjadi Alt_L + Kiri => kembali :) Sekarang saya punya 2 tombol mouse yang berguna
Atom