Değiştiricileri (örn. CTRL) xbindkeys kullanarak fare başparmak düğmeleriyle eşleme


13

Bu soru zaten sorulmuştur, ancak hiçbir zaman doğru cevaplanmamıştır. @Seth ile temizlendikten sonra şimdi tekrar soruyorum. Bu, soruyu çok daha kolay bir şekilde yanıtlamama ve değiştirmeme izin verecek. Orijinal soru burada bulunabilir:

Ctrl ve Alt tuşlarını fare başparmak düğmelerine eşleme


Konu:

Bununla birlikte, herhangi bir tuş vuruşunu bir fare düğmesiyle xbindkeysbirlikte kullanarak eşleştirmek çok basit olsa da xdotoolveya xtebir değiştirici anahtarı (örn. ALT , CTRL , SHIFT vb.) Eşlemek çok daha sorunlu görünmektedir .

Son çözüm, iAl CTRL + tıklatmasına (örneğin, bir listenin birden çok girişini seçmek için) yalnızca fare ile izin vermelidir .

Bunu çözmek için birkaç olası yaklaşım, Stack Exchange'de ve Linux ile ilgili diğer forumlarda bulunabilir. Ancak bunların hiçbiri, başka sorunlara ve yan etkilere yol açtığı için beklendiği gibi çalışmaz.

Notlar:

Aşağıdaki örneklerden bazıları, Şema sözdizimine sahip Guile içerir ve dosyaya güvenir, diğerleri ise sözdizimiyle dosyaya güvenir . Birlikte çalışmayacaklarının farkındayım..xbindkeysrc.scm.xbindkeysrc

Ayrıca, aşağıdaki snippet'ler xdotoolsadece güveniyor, ancak örneğin diğer uygulamaların da dahil olduğu yaklaşımlara açıkım xte- her ikisi de aynı sonuçlara yol açıyor gibi görünüyor ve bu nedenle xdotoolburada sadece eylemler kullanıyorum .

Yaklaşım A:

.xbindkeysrcDosya şu şekilde güncelleniyor :

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + b:8

Başlangıçta denedim bu ama değiştiricinin tutuluyor ve serbest bırakılamaz yan etkisi vardır.

Yaklaşım B:

.xbindkeysrc.scmDosya şu şekilde güncelleniyor :

(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")

En Bulunan http://www.linuxforums.org/forum/hardware-peripherals/169773-solved-map-mouse-button-modifier-key.html ve yaklaşımı adresinde belirtilen değiştirici (tutuluyor sorunu gidermek için çalışır a).

Başparmak düğmesine basılıyken başka fare tıklamaları yapmak mümkün olmadığından yalnızca kısmen çalıştığını düzeltmesine rağmen.

Yaklaşım C:

.xbindkeysrcDosya şu şekilde güncelleniyor :

"xdotool keydown ctrl"
  b:8

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

Askubuntu burada bağlantılı sorunun OP tarafından denendi. Değiştirici durumları içermediğinden çok daha basit ve daha sağlam. Yine de sorun devam ediyor, yani CTRL + tıklama mümkün değil.

Görünüşe göre xbindkeys, tıklamayı tanıdığı, ancak yürütmediği için kendisi problem. Bu xev | grep buttonve kullanılarak test edilebilir xbindkeys -v:

Tarafından kaydedildiği gibi normal bir fare tıklaması aşağıdaki gibi xevolmalıdır:

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

Başparmak düğmesinin yanı sıra:

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

Ancak yukarıdaki xbindkeysyapılandırmayı etkinleştirdiğinizde hiçbir şey kaydetmez. Başparmak düğmesi için CTRL ile eşleştirildiği ve bu nedenle artık bir fare düğmesi olmadığı için mantıklı olsa da, düğme 1'in de kaydedilmemesi gariptir . Bunun nedeni büyük olasılıkla xbindkeysyürütmemesi, ancak kendisini tanımasıdır:

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

Yaklaşım D:

.xbindkeysrcDosya şu şekilde güncelleniyor :

"xdotool keydown ctrl"
  b:8

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

"xdotool click 1"
  b:1

Çok basit ... ancak sonsuz bir tıklama döngüsüne yol açar.


GÜNCELLEME:

Bu arada bir Logitech G502 aldım ve Windows üzerinde sürücü aracılığıyla yapılandırıldıktan sonra sadece profilin kendisinin cihaz belleğinde değil, gerçek tuşa basma fare tarafından yapıldığını fark ettim. Aslında Linux'taki sorunumu çözdü!

Bunu yapabildiğini hatırladığım tek fare Razer Copperhead'di. Ama sanırım bugün aynısını yapabilen başka fareler de var.


1
: Burada Easystroke kullanarak bir çözüm askubuntu.com/a/1010647/27202
ATTI

Yanıtlar:


8

Bu bağlayıcı çalışmayı yapmak için çok zaman harcadım. Sonunda karmaşık ama iyi çalışan ve üçüncü taraf yazılımları ima etmeyen bir çözüm buldum. İnsanlara yardımcı olacağını umarak burada paylaşıyorum. Ayrıca, bunun güvenlik açısından mükemmel olmadığını biliyorum, bu nedenle herhangi bir yapıcı geri bildirim hoş geldiniz.

Burada önerilen gibi gerçekten çok güzel çözümler var , ancak her zaman tüm fareyi kaplayan xbindkeylerin sınırlandırılmasından muzdariptir, değiştiricileri + fare tıklaması eşlemesini belirsiz hale getirir. Ayrıca yukarıdaki bağlantıdan gelen guile tabanlı çözüm, örneğin Gimp tarafından tanınmayan ctrl + plus / ctrl + eksi kullanır.

İstediğimiz şeyin klavye gibi hareket eden bir fare düğmesi olduğunu anladım, bu yüzden python ile erişilebilen uinput kullandım , başparmak düğmesine tıklama için / dev / my-mouse'u izleyen ve ctrl anahtarını gönderen bir komut dosyası yazdım sanal klavyeye. Ayrıntılı adımlar şunlardır:

1. udev kuralları yapın

Cihazların erişilebilir olmasını istiyoruz (haklar ve konum).

Fare için:

/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 gibi adlara sahip çekirdek tarafından tanınan bir cihazı arayacak ve adımı kullanarak faremi seçeceğim. SYMLINK komutu, faremi / dev / my_mx_mouse içinde bulacağımı garanti eder. Cihaz, "mxgrabber" grubunun bir üyesi tarafından okunabilir.

Donanımınız hakkında bilgi bulmak için aşağıdaki gibi bir şey çalıştırmalısınız:

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

Uinput için:

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

Symlink'e gerek yok, uinput her zaman bulunduğunuz sisteme $/dev/uinputveya $/dev/input/uinputsisteme bağlı olacaktır . Ona gruba ve tabii ki okuma ve yazma hakları verin.

Farenizi fişten çekmeniz gerekir; yeni bağlantı / dev'de görünmelidir. Udev'i kurallarınızı tetiklemeye zorlayabilirsiniz$udevadm trigger

2. UINPUT Modülünü Etkinleştirin

sudo modprobe uinput

Ve önyüklemeyi kalıcı hale getirmek için:

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

3. Yeni grup oluştur

sudo groupadd mxgrabber

Veya erişim grubunuz ne dediyseniz. O zaman kendinizi buna eklemelisiniz:

sudo usermod -aG mxgrabber your_login

4. Python betiği

Sen yüklemeniz gerekir piton-uinput kitaplığı (besbelli) ve piton-evdev kütüphanesi . Pip veya dağıtım paketinizi kullanın.

Komut dosyası oldukça basittir, sadece düğmenizin event.code kodunu tanımlamanız gerekir.

#!/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. tadını çıkarın!

Şimdi tek ihtiyacınız python dosyanızı yürütülebilir hale getirmek ve masaüstü yöneticinizden dosyayı başlangıçta yüklemesini istemek. Belki de iyi işi kutlamak için bir kadeh şarap!

6. Ekstra ücretsiz

Ek davranış için xbindkeys kullanıyorum. Örneğin, tekerlek tarafı tıklamaları olan bir fareniz varsa aşağıdaki yapılandırma iyi olabilir:

~/.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

Bu son kombinasyonun çalışması için, python betiği için yapılandırdığınız düğmeyi devre dışı bırakmanız gerekir , aksi takdirde xbindkeys tarafından yakalanır. Yalnızca Ctrl tuşu kalmalıdır:

~/.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

İle yeniden yükle $ xmodmap ~/.Xmodmap

7. Karar

Başlangıçta söylediğim gibi, "mxgrabber" grubu düşünse bile, / dev / uinput'a yazmak için kendime yetki vermem gerektiği gerçeğinden pek memnun değilim. Eminim bunu yapmanın daha güvenli bir yolu vardır, ama nasıl yapacağımı bilmiyorum.

Parlak tarafta, gerçekten çok iyi çalışıyor. Klavyenin Ctrl düğmesi ile nasıl çalıştığı klavye veya fare tuşunun herhangi bir kombinasyonu şimdi farenin biri ile çalışır !!


Çaba ve bizimle paylaştığınız için çok teşekkürler! +1 ... Henüz test etmedim. BTW Neredeyse bu konuda vazgeçtim - beklendiği gibi çalışırsa harika olurdu :)
conceptdeluxe

Rica ederim ! Benim için kusursuz çalışıyor. Sorun yaşarsan bana haber ver. Cevabımı tamamlamaya çalışıyorum, ancak neredeyse iki gün geçirdim ve çalışmasını sağladığım için bir şeyler unutmuş olabilirim. Yayınıma yardımcı olmaktan / düzenlemekten memnuniyet duyarız.
Aurélien Cibrario

Yeni bir sekmede bir bağlantı açtığından ctrl + click1'in bir sekmeyi kapatmak için çok kötü bir seçim olduğunu fark ettim. Cevabımı python betiğinin son kısmını kaldırarak ve xbindkeys, daha temiz bir çözümle değiştirerek düzenledim
Aurélien Cibrario

Sadece bunu test etmek için vaktim olmadığını bilmenizi isterim - ama beklendiği gibi çalışırsa kabul edilen cevabı kesin olarak yapacağım - beklemek için özür dilerim - biraz meşgulüm atm
conceptdeluxe

Arızalı bir fare anahtarını kaldırmak için yukarıdaki komut dosyasını kullanabilir miyiz acaba? Yıpranmış bir farem var. Windows'da düzeltmek için bir otohotkey komut dosyası kullanıyorum, ancak Linux'ta düzeltmek için bir araç yok. İşte sol düğme düzeltmesi için Autohhotkey komut dosyası autohotkey.com/board/topic/63555-debounce-mouse-keys Umarım birisi python3 kullanarak Linux'a bağlar - evdev
kenn

4

PyUserInput ile bir çözüm buldum . Bu son derece basittir ve yönetim hakları gerektirmez. Python 2 ve PyUserInput yüklüyken, aşağıdaki komut dosyasını kullandım:

#!/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()

Komut dosyasına yürütme hakları verdikten sonra ~/.xsessionrc, örneğin bir satırda

~ / path / to / script.py &

Not . bu, fare düğmesi olayının tetiklenmesini engellemez. Benim durumumda xinput set-button-mapxinput düğme eşlemesini değiştirirdim ve ilgilendiğim düğmenin numarasını kullanılmayan bir şeye atardım.

Örneğin, farenizde düğme 8'i kullanmak istiyor ancak düğme 8'in zaten bir işlevi varsa (örneğin, page-next), aşağıdakileri kullanabilirsiniz.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 &

sağlanan düğme 12işletim sistemi için bir anlam taşımaz ve yukarıda tarif ettiğim komut dosyası 12içinde düğmeye özel bir işlev atar .xbuttonmodifier.py.


Ancak orijinal etkinliğin tetiklenmesini engellemez. Bu nedenle, Firefox'ta düğme 8'i kaydırmak ve basılı tutmak için eşleştirirsem, istenmeyen bir önceki sayfaya geri dönmeye çalışır.
user23013

1
Doğru. Bunu ele almak için, ilgilendiğim düğmenin kimliğini kullanılan bir düğmeye değiştirdim xinput. Düzenlenmiş soruya bakın.
Maxim

2

Kısmi bir çözümüm var. Mevcut düğmenin nasıl eşleştirileceğini bulamadım, böylece bir düğme tıklaması ve istediğiniz değiştirici ile sonuçlanırsınız. Bu fare düğmesinin mevcut bir amacı varsa, yine de ateş edecektir. Örneğin, sağ fare tuşunun bir kontrol anahtarıyla yeniden eşlenmesi, bir kontrol + tıklamasının gönderilmesine neden olur.

Her neyse, cevabın btnx'i kurmak ve değiştiricilerinizi bu şekilde yapılandırmak olduğu sorunuza benzer bir forum gönderisi buldum. Görünüşe göre btnx artık depoda mevcut değil. Bir ppa var, ama son ubuntu için çalışmıyor.

Forum yayını: posta: http://ubuntuforums.org/showthread.php?t=1245930

Ancak kaynak kullanılabilir:

Kaynaktan derleyebilirsiniz, ancak bu, sisteminize paket yöneticisinin koruyamayacağı dosyaları koyacaktır.

Yani, aşağıdaki dosyalar:

/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

Aşağıdaki semboller:

/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

Yani ... eğer kaynaktan inşa etmenin sakıncası yoksa ...

Btnx için bağımlılıkları alın:

sudo apt-get install libdaemon-dev git

Kaynaktan hiç bir şey inşa etmediyseniz, temel olarak da gerekli olabilir:

sudo apt-get install build-essential

Sonra btnx'i alın ve derleyin:

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

Ayrı bir GUI yapılandırma aracı vardır. Bunun için bağımlılıkları alın:

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

Şimdi gui yapılandırma aracını alın ve derleyin:

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

Şimdi aracı çalıştırın:

sudo btnx-config

Fare Düğmelerini Algıla'yı tıklatın Aracı kullanırken yönergeleri okuyabilmek için, açılan pencereyi yeniden boyutlandırın, iletişim kutusu daha sonra kırpılır ve algılama sırasında yeniden boyutlandırmaya çalışırsanız iptal edilir algılama. Pencereyi biraz büyüt.

Fare algılamayı başlatmak için Basın düğmesine tıklayın, ardından metin değişene kadar fareyi hareket ettirmemeye çalışın ... Yaklaşık 5-10 saniye sürer. Metin değişecektir. Böyle bir durumda, söylediklerini göz ardı edin ve Yönlendir'i tıklayın.

"Düğme algılamayı başlatmak için basın" düğmesini tıklayın

Burada farenizin bir düğmesini birkaç kez tıklayacaksınız (durum çubuğu dolana kadar). Ardından düğmenin adını daha sonra tanıyacağınız bir şeye ayarlayın (ör: LeftButton) Ekle düğmesini tıklayın.

Her fare düğmesi için bunu tekrarlayın (kaydırma tekerleğini, kaydırma tıklamalarını vb. Unutmayın). Yeniden eşlemek istemediğiniz düğmeleri atlayabilirsiniz.

Tüm düğmeleri eklediğinizde Tamam'ı tıklayın.

Ana GUI'de Düğmeler'e tıklayın, sol bölmede yeniden eşlemek istediğiniz düğmeyi seçin. Önceki adımlarda girdiğiniz adları kullanır. Amaçlarınız için, sağdaki Tuş kombinasyonu altında yalnızca bir Anahtar değiştirici seçmek istersiniz.

Bu ekranda sil'i tıklamayın, düğme kaldırılacaktır. Geri dönüp düğmeyi tekrar algılamanız gerekir.

Conrigurations ekranına geri dönün ve btnx'i yeniden başlat öğesine tıklayın.

Yeni düğmeyi deneyin.

Uygulamaları kaldırmak istiyorsanız, btnx programını durdurun ve ilgili git kullanıma alınmış dizinlere gidin ve kaldırma işlemini yapın:

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -

2
Yapıştırıcıya gönderdiğin detaylı cevap için çok teşekkürler. Ancak korkarım ki güvenilir olmayan bir ppa kullanmama veya cihazımda ayrıntılı olarak incelemeden bilinmeyen bir kaynaktan bir uygulama oluşturmama izin verilmiyor. Yine de, içine koyduğunuz çaba için size oy vereceğim. Bunun dışında cevabınızı burada güncellemenizi ve orada yazdıklarınızı kopyalamanızı tavsiye ederim, çünkü bu bilgiler başkaları için yararlı olabilir, ancak gözden kaçabilir. Sonunda paketin Ubuntu veya Debian altında bile derlenemeyeceğini okudum - bunu gerçekten denediniz mi?
conceptdeluxe

BTW: Askubuntu hesabınızı Linux & Unix gibi diğer Stack Exchange hesaplarına bağlayarak kolayca 100 itibar kazanabilirsiniz.
conceptdeluxe

Evet, Ubuntu 14.04 altında test ettim. Sağ fare düğmesini bir kontrol anahtarı gönderdim ve göndermeden önce çalıştığını onayladım. Ve sonra itibar gereksinimi nedeniyle görevi neredeyse terk etti.
Stephen
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.