Başlangıçta faremin üzerindeki düğmeleri otomatik olarak nasıl yeniden eşlerim?


Yanıtlar:


47

9 düğmeli bir Logitech farem var ve "orta düğmeye" (# 2) basmak kaydırma tekerleğine tıklamayı içeriyor. Bunu sevmedim çünkü beceriksizim ve genelde tekerleği tıklamaya çalıştığım pencereyi kaydırıyorum. Bu yüzden otomatik olarak üstteki düğmeyi (bu durumda # 9) ortadaki düğmeye (# 2) yeniden eşlemek istedim. Ayrıca alt taraftaki düğmeyi (# 8) eşlemek istedim, böylece sol tuşa (# 1) çift tıklayacaktı.

Hedeflerim belirli olsa da, aşağıdaki çözümler başlangıçta fare düğmelerini otomatik olarak yeniden eşleştirmek istediğiniz herhangi bir duruma genelleştirilebilir.

Fare Düğmelerini Diğer Fare Düğmelerine Eşleme

xinputBu görev için yüklü olması gerekir . Bu tamamen .xsessionrcdosyanızda yapılabilir . İlk xinputönce, farenize atanmış olan adı bulmak için kullanın, bu daha sonra bir giriş aygıtı kimliğiyle ilişkilendirilir. Aşağıda dizüstü bilgisayarımdan bazı örnek çıktılar var:

⎡ 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)]

Farem kendisini çağırıyor Logitech USB Laser Mouseve olarak gösterilir id=11. Farenizin farklı bir adı olacak; Bunun, okuyucu için bir egzersiz olarak bırakıldığını bulmak.

Bu oturumda cihazın kimliğini hala biliyor olsanız da , giriş işleyicisinin farenizi kullanarak ne kadar butonu olduğunu öğrenin . Bu, cihazda görünen buton sayısından farklı olabilir.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"

Farem ile, sadece 9 bariz fiziksel düğme var, ancak xinput16 rapor ediyor.

USB'nin niteliği göz önüne alındığında, bu kimlik, her yeniden başlatışınızda değişebilir, bu nedenle bir kez keşfettiğiniz bir kimliğe statik olarak anahtarlanmış bir şeyi kodlamak yeterli değildir. Bunu başlangıçta dinamik olarak ayrıştırmanız ve mevcut kimliğe dayalı olarak yeniden haritanızı yürütmeniz gerekir.

Artık adını bildiğinize göre, xinput testhangi anahtarın yeniden eşleştirileceğini bulmak için kullanabilirsiniz. Dizinlerini almak için, haritadan eşlemek istediğiniz fare düğmelerine basın. (Referans için, 1, 2 ve 3 "her zaman" (yani, genellikle), 3 düğmeli bir farenin sol, orta ve sağ düğmelerini gösterir. Sık kullanılan bir harita, fareyi solak yapmak için bunları tersine çevirir. )

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

Bu durumda # 9 (yan, üst) butonunu # 2 (orta) butonu ile eşlemek istediğimi öğrendim.

Artık farenizin ne olduğunu ve hangi düğmeleri değiştirmek istediğinizi bildiğinize göre , başlangıçta düğmenin yeniden eşlenmesini yürütmek için ~/.xsessionrcçağıran bir komut dosyası yazabilirsiniz xinput. Komple betiğim aşağıda.

# 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

Buradaki ilk satır, bildirildiği gibi farenin kimliğine eşit bir geçici oturum değişkeni belirler xinput. Bu, greprapordaki farenin bilinen adı için girilerek xinput, daha sonra rapordaki belirteçten sedkimlik numarasını çıkarmak için kullanılarak yapılır id=xxx. Bu değer daha sonra xinput set-button-mapyeniden haritalamayı yürüten bir yönergede kullanılır . Yukarıdaki örnekte, tek değişiklik, # 9 düğmesinin # 2 mimik düğmesiyle yeniden eşleştirilmesidir. Diğerleri varsayılan ayarlarında kalır.

Güncelleme: As @Lokasenna işaret aşağıya Cihazınız fare ve bir klavye hem kendisini bildiriyorsa, sen sonucu sayımını sınırlamak gerekebilir grepkullanarak -m 1.

Fare Düğmelerini İsteğe Bağlı İşlevlere Eşleme

Ayrıca bu cevaba bakınız .

Sen gerekir xinput, xbindkeysve xautomation(dahil xte) bu görev için yüklü.

Kullanım xinput listve xinput testFarenizin cihaz kimliğini ve atamak istediğiniz düğmenin sayısını bulmak için. Benim durumumda, alt taraftaki düğmeyi (# 8) soldaki düğmeyi (# 1) çift tıklatarak eşlemek istedim.

Oluştur ya da düzenle ~/.xbindkeysrc. Bu dosyanın formatı bir dizi eşleştirilmiş çizgidir. İlk satır bir olay için yürütülecek komuttur; ikinci satır olay açıklamasıdır. Olaylarını doğrudan girdi işleyicisine göndermek için xtebileşenini kullanacağız xautomation.

Bir düğme bırakıldığında çift tıklatma olayı oluşturmak için aşağıdakileri ekledim:

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

Bu yapılandırma # 1 düğmesine iki fare tıklamasıyla # 8 düğmesinin serbest bırakılmasını gösterir. (Teoride sanırım herhangi bir komutu bir fare düğmesine eşleyebilirsiniz , ancak bu en yaygın durumdur. Diğer pratik örnekler için bu cevaba bakınız .)

16.04 Ubuntu Güncellemesi

Sisteminize bağlı birden fazla fare bulunan kullanıcılar için, cihazın kimliğini de girmeniz gerekir. Bu, tüm kullanıcılar için geçerli olmayabilir ve Unity ile Ubuntu 16.04'te keşfedildi.

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)]

Ardından .xbindkeysrc dosyasını, komut çıkışındaki id = değerine başvurarak değiştirin (bu örnekte id = 9):

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

7
Bilgi için teşekkürler. Awk cihazınızdaki sözcük sayısına bağlı olarak değişmesi gerekecek gibi görünüyor. Kullandımsed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112

Xinput testine göre thumb tuşu üç farklı tuş basışını tetikler - hepsini nasıl birlikte bağlayacağız .xbindkeysrc?
axltop

@ jbo5112 Çalışma dizüstü bilgisayarımda birden çok fareyi kullanmaya başladım ve yorumunuzu tekrar ziyaret etmek için iyi bir nedenim vardı. Şimdi eski awkifademi, sedörneklerimdeki ifadenizle değiştirdim. Gelişme için teşekkürler!
Sıfır bant genişliği

2
Set-buton-haritada bir kimlik kullanmaya gerek yoktur; eg:xinput set-button-map "Logitech Trackball" 1 3 3
jaustin

Alışılmadık bir sorun sanırım: xinputfaremi iki kere gösteriyor, bunun gibi: ↳ USB OPTICAL MOUSE id = 12 [slave pointer (2)] ↳ USB OPTICAL MOUSE id = 13 [slave pointer (2)] Yalnızca ID 13 komutları yakalar xinput test. Betik daima ilk kimliği yakalar. Ama neden yine de iki kere? Her ikisi de bu fareyi çıkardığımda kayboluyor ve bağlandığımda yeniden beliriyor.
w-sky

6

Bunun için kısa adımlar:

Denilen bir yardımcı program var xinput. xinput listya da sadece xinputtüm X giriş aygıtlarını ve kimliklerini gösterecektir. Burada yeniden eşlemek istediğiniz farenin kimliğini bulabilirsiniz.

Kimliğimi örnek olarak kullanacağım, 21 olan kurulumumdan sonra xinput --get-button-map 21çıkacak

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

Şimdi, söylemek istiyorsan, sola ve sağa düğmelerini değiştir

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

İşte burdayız, yeniden yapılanma tamamlandı.

Başlangıçta çalıştırmak için bu sadece bir dosyaya koyun:

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

çalıştırılabilir izin vermek

chmod +x leftmouseremap.sh 

Son olarak, CLI dan eğer istersen, GUI elle Statrtup Uygulamaya bu ekleyebilir veya aşağıda koymak metin Gözlerinde farklı bir dosya inti (sizinkine değişim yolları) ~/.config/autostartburada (mayın olduğunu 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=

KDE ile yolun böyle olacağını ~/.kde/Autosart, başkalarının Masaüstü yöneticileri için bu durumun farklı olabileceğini unutmayın. Alternatif olarak, başlangıçta çalıştırma kullanarak genel bir yaklaşımla yapılabilir /etc/rc.local.


Bu su dökülme sorunumu çözdü. Dizüstü bilgisayarımın dokunmatik yüzeyinin altındaki sol / sağ düğmelerine sahibim. Su döktüm ve şimdi her iki düğme de işletim sistemine orta tıklama sinyali gönderiyor (bunu 'keymon' uygulamasını kullanarak buldum). Yöntemi sol tıklamaya orta tıklamayı yeniden eşleştirmek için kullandım, böylece en azından sol tıklama deneyiminin tadını çıkarabilirim. Asla orta tıklamayı kullanmam, bu yüzden benim için mükemmel çalışıyor :) Basit talimatlar için teşekkürler. Giriş cihazı kimliğim 11 idi, bu yüzden "xinput --set-button-map 11 1 1 3" koştum, Teşekkürler !!
Vahid Pazirandeh

3

Kullanırken zerobandwidth harika cevabı , bu tür Logitech'in MX Ergo gibi bazı cihazlar, bir ikisi olarak gösterilir pointer ve bir klavye cihazına:

⎡ 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)]

Sonuç olarak, grep "Logitech MX Ergo"iki değer döndürerek sona erer. İkincisi, eşleme dizisine ilk öğe olarak dahil edilir ve tüm fare düğmelerinizi mahveder.

Düzeltme kolaydır - sadece grepmaksimum sayım argümanını kullanın -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

Harika bir ipucu; Yanıtı eklemek için cevabı değiştirdim. Teşekkürler!
sıfır bant genişliği,

1

Logitech faremin orta düğmesinin eşlemesini Ubuntu Yazılım Merkezi'nden indirdiğim Easystroke Hareket Tanıma özelliğini kullanarak 'Geri' olarak değiştirebildim. Düzenleme: Uygulamada, Eylem Ekle, Adlandır, anahtar türünü seçin, Ayrıntılar'a tıklayın ve Enter tuşuna basın, Kayıt Strokuna basın ve komut istemi sırasında orta düğmeye basın.


1
AskUbuntu'ya hoş geldiniz. Cevabınızla daha fazla ayrıntı vermeniz gerekir.
David

Tamam, lütfen yukarıdaki düzenlemeye bakın.
atr15

İyi yakalama. Ancak açıkladığınız şey, söylediğiniz gibi titiz değildir: aslında ortadaki düğme, bu uygulamayı 'hareket tanıma moduna' koymak için kullanılan varsayılan düğmedir: basıldığında, uygulama yaptığınız hareketi algılamaya başlar. Ancak, + 1, çünkü bu uygulama fare düğmeleri kimliklerini ortaya çıkarmak için bir modüle sahip; Bu, kullanırken xinputgörünmeyen düğmelerle kullanmak istediğimizde yardımcı olur xinput list <devID>.
1111161171159459134 29:15

1
Oh, bu 1 yıl sonra geldi - cevabınız +1
1111161171159459134

1

12.04'ten önce, standart depoda "btnx" adı verilen ve Sistem Yapılandırmasında "Düğme özellikleri" olarak eklenen kolay bir grafik aracı vardı. Ne yazık ki, ancak bırakıldı. Şu anda 14.04, 16.04 ve 18.04'te tutulan bir "güvenilmeyen" PPA burada: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa ( https://launchpad.net/ubuntu/xenial/+source adresinde bulunur. / btnx )

Sistem ayarlarıyla bütünleşmeyecek, ancak ucuz bir 5 düğmeli fare ile dizüstü bilgisayarımda gayet iyi çalışıyor. Tuş vuruşlarına ve komutlarına da yeniden basılabilir ve yapılandırma diğer yöntemlerden çok daha basittir!


Aracın aynı arka planda sadece aynı değişiklikleri yapıp yapmadığını merak ediyorum. ^ _ ^
zerobandwidth

0

HP elitebook 2570p, Ubuntu 18.04.2 var. Burada benim için işe yaramaz bir iz puanım var ve işte alanın altında 2 işe yaramaz iz düğmesi

Bu tuşları kullanmıyorum çünkü dokunmatik yüzeyin altında. Bu düğmeyi left = back_button (Alt_L + Left), sağdaki = middle_mouse_button olarak yeniden eşlemek istiyorum. "Xinput" içindeki iz noktası id = 11 ve sol düğme 1, sağ 3'tür.

Biri sadece terminale kopyalamak için bana doğru kodu yazabilir mi? Xbindkeysrc ile birleştirdim ancak bu, her iki işlemi de (izleme noktası ve dokunmatik yüzey) düğmelere göre ayarlıyor


Bunu yaptım ve basit bir şekilde yaptım: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </code> Temas noktası düğmelerimi (id 11) sola 8'inci düğme yapar. sol klik gibi orta (1) ve ortadaki gibi sağ clisk ve sonra 'kod' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'key Sol' 'keyup Alt_L' & amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'code' 8 no'lu düğmeyi (b: 8) Alt_L + Left => geri döndürür ayarlar :) Şimdi 2 fare düğmesini kullandım
Atom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.