Bir klavye tuşunu fare düğmesine düzgün bir şekilde nasıl eşlerim?


14

Soru özeti: Fare düğmelerimden birinin Super_LX11 tarafından sol Windows düğmesi olarak kaydedilmesini istiyorum .


Pencere yöneticimde, "sol Windows düğmesini" (Sol Süper) basılı tutarak ve bir fareyi sol fare düğmesiyle sürükleyerek pencereleri hareket ettirebilirim. Bunu klavyeye dokunmadan yapabilmek istiyorum, bu yüzden sol Süper tuşu fare düğmesi 11 ile eşleştirmek istiyorum, böylece fare düğmesini 11 tutabilir ve pencereleri tıklatıp sürükleyebilirim.

En belirgin çözüm xbindkeys ve xte'yi böyle kullanmaktır ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

Bu şu şekilde çalışır:

  • Fare düğmesine 11 bastığımda Super_Lda basılı
  • Fare düğmesini 11 serbest bıraktığımda Super_Lda serbest bırakılıyor

Ancak bir sorun var: Fare düğmesi 11 gibi başka bir fare düğmesini basılı tutarsam Super_L+ tuşlarını kullanarak pencereleri hareket ettiremiyorum. Mouse1Yukarıdaki çözümü kullanarak fare düğmesi 11 basılı ve serbest bırakılmış olarak kaydediliyor ve pencere yöneticisi işlemleri çalışır.

Ben Tarçın ve Muhteşem WM ve ikisini de kullanarak denedim kesinlikle hiçbiri arasında Super_Laşağı tutuluyor fare düğmesi 10 ya da 11 iken klavye kombinasyonları çalışmaları.

Bir subpar hack

Şu anda fare 11 Super_Ldüğmesini belirli bir süre tutmak için tıklatarak bu soruna geçici olarak çalışıyorum . Bu şekilde , fare düğmesini tıklayabilir ve daha sonra kısa bir süre için eşyaları sürükleyebilirim:

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

Başka bir girişim

Totti tarafından önerildiği gibi, bu xbindkeysyapılandırmayı denedim :

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

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

Çalışmıyor. Super_LTuş basılı tutulduğu anlaşılıyor , çünkü 10 tuşunu bıraktığımda ( Super_Ltuşa tekrar klavyede basana kadar) sonsuza kadar basılı kalıyor , ancak fare düğmesi hala kaydediliyor, çünkü pencereleri tıklayıp sürükleyemiyorum . Ben kullanarak bu işi yapabilmek için gidiyorum sanmıyorum xbindkeysve xte.


1
Fare düğmesini süper tuşa bağlamak yerine yeniden eşleme yapın. Bunun için xmodmap kullanın . tam kurulum için arch wiki xmodmap sayfasına bakın.
totti

@totti: Arch wiki xmodmap sayfasında, tuşların diğer tuşlarla nasıl eşleştirileceği, değiştirici tuşların nasıl değiştirileceği ve ters kaydırmanın nasıl yapılacağı açıklanır, ancak klavye tuşlarının fare düğmelerine eşlenmesinden bahsedilmez
Hubro

@totti: xmodmap ile tuşları diğer tuşlarla eşleyebilirim ve X (ve xkbset) için XKB uzantısıyla fare düğmelerini klavye tuşlarına eşleyebilirim, ancak klavye tuşunu fare düğmesine eşlemeye çalışıyorum. Hala bunu yapmanın bir yolunu bulamadım.
Mart'ta Hubro

deneyin: Fare düğmesi 11 basılı tutulduğunda süper tutma + fare düğmesi 11 serbest bırakmayı simüle edin. Pencere yöneticisi artık fare 11'i değil süper ve fare 1'i algılayabilir.
totti

@totti: Denenmiş ve düzenlenmiş soru
Hubro

Yanıtlar:


5

Bir askubuntu gönderisi aşağıda özetleyeceğim bir cevap içeriyor .

Sorun xbindkeys tüm fare kapmak, değiştiriciler + fare tıklama haritalama belirsiz hale olmasıdır. Cevap , başparmak düğmesine tıklamayı izlemek ve anahtarı sanal klavyeye göndermek için python-uinput komut dosyası aracılığıyla uinput kullanır . Ayrıntılı adımlar şunlardır:/dev/my-mouseCtrl

1. udev kuralları yapın

Fare için dosya /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 aygıtlarını arayacaktır. SYMLINK /dev/my_mx_mousegrup tarafından okunabilen fareyi bulmak içindir mxgrabber.

Donanım bilgilerini bulmak için şöyle bir şey çalıştırın:

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

Uinput için dosya /etc/udev/rules.d/94-mxkey.rules:

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

Farenizi çıkarıp takın veya udev'i kuralları tetiklemeye zorlayın udevadm trigger.

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

sudo modprobe uinput

Ve içinde /etc/modules-load.d/uinput.conf:

uinput

3. Yeni grup oluştur

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login

4. Python betiği

Yükleyin python-uinput libraryve python-evdev library.

Aşağıdaki komut dosyasının düğmenin event.code kodunu tanımlaması 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. Son İşlem

Python dosyasını çalıştırılabilir yapın ve başlangıçta yüklendiğinden emin olun.


Ben fare düğmelerine kullanılmayan bir anahtar kodu atamak için komut dosyasını güncelledik (Ben onları kurmak F13, F14ve F15, ve kullanan fare işlevlerini devre dışı bırakarak xinput. Ben basit kullanılarak ihtiyaç ne olursa olsun Sonra sadece bu anahtarları yeniden atayabilirsiniz xmodmap. Ana fikir kaleme edilir içinde bir ana fikri (bazı kodlanmış değerleri vardır ve ben geri yok xinputsonradan fare işlevi) üzerinden burada bitti olacağım zaman bağlantısını senaryonun son hali ile bu konuda bir blog yazısı yapacağız (ve paylaşır. Teşekkür ☺ ♥
zmo

Ayrıca x11 tabanlı bir çözüm için diğer konudaki
Maxim

1

Bir fare tıklamasıyla komut dosyasını çalıştırabileceğiniz için aşağıdaki hileyi kullanabilirsiniz.
1. Basın Düğme 11 için tutun süper anahtarı . ( Düğme 11 bir komut dosyasını tetikler)
2. Diğer fare düğmelerini kullanarak pencereleri hareket ettirin
3. Süper tuşu serbest bırakmak için fare düğmesine 11 tekrar basın

script Süper tuşu basılı tutmak için
kullanın İlk Düğme tıklandığında geçici bir dosya oluşturun ve tuşu basılı tutun. Bir sonraki tıklamada tmp dosyasını silin ve anahtarı bırakın, xdotool

Güncelleme

Ubuntu yardım sayfasına göre (birçok düğme fare nasıl yapılır) imwheelbir anahtara yeniden eşleştirebilirsiniz.


Bununla ilgili birkaç sorun: # 1 Bu hala başka bir hack / geçici çözüm ve soruyu cevaplamıyor. # 2 xbindkeys süper anahtar basılıyken çalışmaz. Süper anahtar serbest bırakılıncaya kadar xbindkey'ler duraklatılır ve hiçbir şey kaydedilmez.
15'te Hubro

Tamam, yaklaşık 5 dakikalık bir araştırmadan sonra # 2 noktasını geri çekiyorum. Görünüşe göre + Mod4basılı tutulan süper anahtarı hesaba katmak için benim xbindkeys yapılandırma eklemek zorunda. Önerdiğiniz geçici çözüm benimkinden daha iyi ve buna geçiyorum :-) Ama yine de soruyu cevaplamıyor.
Mart'ta Hubro

1

Hata ayıklama önerisi: /dev/input/eventXBu tuşa basıp bıraktığınızda, özellikle ile kombinasyonlarda hangi olayların oluşturulduğunu görmek için dosyayı izlemeye çalışırım BTN_LEFT. İşte başlamanız için örnek bir kod. Açıkçası yalnızca tuşa basmakla kalmayıp tüm olayları günlüğe kaydedecek şekilde değiştirmeniz gerekir.

xevHenüz yapmadıysanız çıktıyı kontrol etmek de isteyebilirsiniz . Her iki günlüğün de analiz edilmesi, karşılaştığınız sorunu ortaya çıkarmalıdır.

Şansınız, birden fazla düğmeye basıldığında farenizin ekstra düğme bırakma olayları oluşturmasıdır. Bu durumda seçenekleriniz, anahtar bağlama geçici çözümlerini kullanmak veya xf86-input-evdevistenmeyen etkinlikleri filtrelemek (veya eksik olanları simüle etmek) için kitaplığı değiştirmek olabilir . Sürükleyip bırakmaya çalışırken "tıklama" olayları üreten bir dokunmatik ekran için benzer bir şey yaptım. Buradaki fikir, neredeyse aynı anda (küçük bir zaman aralığında) gelen "serbest bırakma" etkinliklerini "tıklama" etkinlikleriyle filtrelemekti. Tahminim doğruysa, aslında benzer bir şey uygulamanız gerekir.


1

Bunu bugün daha önce diğer değiştirici tuşlarla anladım. Sorun, değiştiriciyi sürümün düğme birleşimine dahil etmeniz gerektiğidir. Süper anahtarınızın Mod4 ile eşlendiğini varsayarsak (varsayılan afaik olmalıdır):

"xte 'keydown Super_L'"
  b:11

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

EDIT: b: 11 tuşunu basılı tutarken hala LMB kullanamayacağınız için bunun sorunuzu tamamen yanıtlamadığını fark ettiniz.

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.