मैं एक माउस बटन की कीबोर्ड कुंजी को कैसे मैप करता हूं?


14

प्रश्न सारांश: मैं चाहता हूं कि मेरा एक माउस बटन Super_LX11 द्वारा बाएं विंडोज बटन के रूप में पंजीकृत हो ।


मेरे विंडो मैनेजर में, मैं "लेफ्ट विंडोज बटन" (लेफ्ट सुपर) को पकड़कर और बाईं माउस बटन के साथ विंडो को खींचकर इधर-उधर कर सकता हूं। मैं कीबोर्ड को छूने के बिना ऐसा करने में सक्षम होना चाहता हूं, इसलिए मैं माउस बटन 11 पर बाईं सुपर कुंजी को मैप करना चाहता हूं, इस तरह से मैं माउस बटन 11 पकड़ सकता हूं और विंडोज़ खींचें + पर क्लिक कर सकता हूं।

सबसे स्पष्ट समाधान xbindkeys और xte का उपयोग कर रहा है जैसे ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

यह इस तरह काम करता है:

  • जब मैं माउस बटन 11 दबाता हूं, Super_Lतो नीचे दबाया जाता है
  • जब मैं माउस बटन 11 जारी करता हूं, तब Super_Lभी जारी किया जाता है

लेकिन एक समस्या है: मैं विंडोज़ का उपयोग करके Super_L+ नहीं ले जा सकता Mouse1अगर मैं एक और माउस बटन दबाए रखता हूं, जैसे माउस बटन 11. ऊपर दिए गए समाधान का उपयोग करना, माउस बटन 11 को अभी भी दबाया और जारी किया गया है, और इसलिए इनमें से कोई भी पंजीकृत नहीं है खिड़की प्रबंधक संचालन कार्य।

मैंने इसे Cinnamon और Awesome WM दोनों का उपयोग करके आज़माया है और माउस बटन 10 या 11 को नीचे रखने पर कीबोर्ड संयोजनों में से कोई भीSuper_L काम नहीं करता है।

एक सबपर हैक

मैं वर्तमान में इस समस्या के आसपास काम कर रहा हूं, जिससे माउस 11 Super_Lएक निश्चित समय तक बटन को दबाए रख सकता है। इस तरह से मैं माउस बटन पर क्लिक कर सकता हूं , फिर बाद में थोड़े समय के लिए सामान खींचें:

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

एक और प्रयास

जैसा कि टोट्टी द्वारा सुझाया गया है, मैंने इस xbindkeysविन्यास की कोशिश की :

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

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

यह काम नहीं करता है। ऐसा लगता है कि Super_Lकुंजी को नीचे रखा जा रहा है, क्योंकि जैसे ही मैं बटन 10 जारी करता हूं, यह हमेशा के लिए नीचे रहता है (जब तक मैं Super_Lकीबोर्ड पर फिर से कुंजी दबाता हूं ) लेकिन माउस बटन अभी भी पंजीकृत है, क्योंकि मैं विंडोज़ पर क्लिक और ड्रैग नहीं कर सकता हूं । मुझे नहीं लगता कि मैं इस काम का उपयोग करने में सक्षम होने जा रहा हूं xbindkeysऔर xte


1
माउस बटन को सुपर की से बांधने के बजाय, रीमैपिंग करें। इसके लिए xmodmap का उपयोग करें । एक पूर्ण सेटअप के लिए आर्क विकी xmodmap पेज देखें।
totti

@totti: आर्क विकी xmodmap पेज में अन्य कुंजियों की मैपिंग,
मॉडिफ़ायर

@totti: xmodmap के साथ मैं अन्य कुंजियों के लिए कुंजी मैप कर सकता हूं, और X (और xkbset) के लिए XKB एक्सटेंशन के साथ मैं माउस बटन को कीबोर्ड कीज में मैप कर सकता हूं, लेकिन मैं कीबोर्ड बटन को माउस बटन पर मैप करने की कोशिश कर रहा हूं। मुझे अभी भी ऐसा करने का कोई तरीका नहीं मिला है।
हुब्रो

कोशिश करें: माउस बटन 11 होल्ड पर, सुपर होल्ड + माउस बटन 11 रिलीज़ करें। विंडो प्रबंधक अब 1 माउस 11. नहीं सुपर और माउस का पता लगा सकता है
totti

@totti: कोशिश की, और संपादित सवाल
20

जवाबों:


5

आस्कुबंटु पोस्ट में एक उत्तर है कि मैं नीचे संक्षेप में बताऊंगा ।

समस्या यह है कि xbindkeys पूरे माउस को पकड़ लेता है, जिससे मोडिफ़र + माउस अनिश्चित रूप से मैपिंग पर क्लिक करते हैं। यह जवाब अंगूठे बटन क्लिक की निगरानी करने और वर्चुअल कीबोर्ड को भेजने के लिए अजगर-यूनीपुट स्क्रिप्ट के माध्यम से uinput का उपयोग करता है । यहाँ विस्तृत कदम हैं:/dev/my-mouseCtrl

1. वासुदेव नियम बनाओ

माउस के लिए, फ़ाइल /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"

इवेंट 5 जैसे नामों वाले कर्नेल डिवाइसों के लिए Udev दिखेगा। SYMLINK /dev/my_mx_mouseसमूह द्वारा पठनीय माउस को खोजने के लिए है mxgrabber

हार्डवेयर जानकारी खोजने के लिए कुछ इस तरह से चलाएं:

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

Uinput के लिए, फ़ाइल /etc/udev/rules.d/94-mxkey.rules:

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

अपने माउस को अनप्लग करें और प्लग करें, या udev को नियमों को ट्रिगर करने के लिए मजबूर करें udevadm trigger

2. UINPUT मॉड्यूल को सक्रिय करें

sudo modprobe uinput

और में /etc/modules-load.d/uinput.conf:

uinput

3. नया ग्रुप बनाएं

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login

4. पायथन लिपि

स्थापित करें python-uinput libraryऔर python-evdev library

नीचे दी गई स्क्रिप्ट को बटन के event.code की पहचान करने की आवश्यकता है:

#!/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. परिष्करण

अजगर फ़ाइल को निष्पादन योग्य बनाएं और सुनिश्चित करें कि यह स्टार्टअप पर लोड है।


मैं माउस बटन करने के लिए एक अप्रयुक्त कीकोड आवंटित करने के लिए स्क्रिप्ट को नवीनीकृत किया है (मैं उन्हें करने के लिए सेट अप F13, F14और F15, और का उपयोग कर माउस कार्यों को निष्क्रिय करने xinput। तब मैं बस जो कुछ भी करने के लिए मैं एक साधारण का उपयोग कर की जरूरत है उन कुंजियों को पुन: असाइन कर सकते हैं xmodmap। मुख्य विचार का मसौदा तैयार किया गया है में एक सार (वहाँ कुछ हार्डकोडेड मूल्यों और मैं बहाल नहीं xinputमाउस समारोह बाद में), मैं स्क्रिप्ट के अंतिम संस्करण के साथ इस बारे में एक ब्लॉग पोस्ट बना देंगे (और यहाँ पर लिंक साझा जब यह किया जाएगा। धन्यवाद आपकी मदद के लिए!
zmo

इसके अलावा x11-
मैक्सिम

1

जैसा कि आप माउस क्लिक पर स्क्रिप्ट चला सकते हैं, आप निम्न चाल का उपयोग कर सकते हैं।
1. सुपर की रखने के लिए बटन 11 दबाएं । ( बटन 11 एक स्क्रिप्ट को ट्रिगर करता है) 2. अन्य माउस बटन का उपयोग करके विंडोज को स्थानांतरित करें 3. सुपर कुंजी जारी करने के लिए माउस बटन 11 को फिर से दबाएं

स्क्रिप्ट सुपर कुंजी को पकड़ने के लिए
उपयोग करें पहले बटन पर क्लिक करें, एक अस्थायी फ़ाइल बनाएं और कुंजी दबाए रखें। अगले क्लिक पर tmp फ़ाइल हटाएं और कुंजी जारी करें, xdotool

अपडेट करें

उबंटू सहायता पृष्ठ (कई बटन माउस कैसे करें) के अनुसार imwheelएक कुंजी को रीमैप कर सकते हैं।


उस के साथ समस्याओं की एक जोड़ी: # 1 यह अभी भी एक और हैक / समाधान है, और इस सवाल का जवाब नहीं है। # 2 xbindkeys काम नहीं करता है, जबकि सुपर की नीचे आयोजित किया जा रहा है। यह ऐसा है जैसे कि xbindkeys को रोक दिया जाता है, और तब तक कुछ भी पंजीकृत नहीं किया जाता है, जब तक कि सुपर कुंजी जारी नहीं हो जाती।
हुब्रो

ठीक है, लगभग 5 मिनट के शोध के बाद, मैं बिंदु # 2 को वापस लेता हूं। मुझे स्पष्ट रूप से + Mod4अपने xbindkeys कॉन्फिग को सुपर कुंजी के लिए खाते में जोड़ना होगा । आपके द्वारा सुझाया गया वर्कअराउंड मेरा से बेहतर है, और मैं इसे स्विच कर रहा हूं :-) लेकिन यह अभी भी सवाल का जवाब नहीं देता है।
हब्रो

1

डिबगिंग सुझाव: मैं यह देखने के लिए /dev/input/eventXफ़ाइल को मॉनिटर करने का प्रयास करूंगा कि जब आप उस बटन को दबाते हैं और जारी करते हैं, तो विशेष रूप से संयोजन में BTN_LEFTयहां आपको आरंभ करने के लिए एक नमूना कोड दिया गया है। आपको स्पष्ट रूप से सभी घटनाओं को लॉग करने के लिए इसे संशोधित करना होगा, न केवल कुंजी प्रेस।

xevयदि आप पहले से ही उत्पादन नहीं कर रहे हैं, तो आप आउटपुट की जांच करना चाहते हैं । दोनों लॉग का विश्लेषण करने से आपको होने वाली सटीक समस्या का पता चलता है।

संभावना है कि आपका माउस अतिरिक्त बटन रिलीज़ घटनाओं को उत्पन्न कर रहा है जब कई बटन दबाए जाते हैं। उस स्थिति में, आपके विकल्प महत्वपूर्ण बाध्यकारी वर्कअराउंड का उपयोग करना होगा, या xf86-input-evdevअवांछित घटनाओं को फ़िल्टर करने के लिए लाइब्रेरी को संशोधित करना होगा (या लापता लोगों को अनुकरण करना होगा)। मैंने टचस्क्रीन के लिए कुछ समय पहले ऐसा ही किया था जो ड्रैग एंड ड्रॉप की कोशिश करते समय "क्लिक" ईवेंट उत्पन्न करता था। यह विचार "रिलीज़" घटनाओं को फ़िल्टर करने के लिए था जो "क्लिक" घटनाओं के साथ लगभग एक साथ (एक छोटी समय खिड़की के भीतर) आया था। यदि मेरा अनुमान सही है, तो आपको अनिवार्य रूप से कुछ समान लागू करने की आवश्यकता होगी।


1

मुझे यह पहले अन्य संशोधक कुंजियों के साथ आज लगा। मुद्दा यह है कि आपको रिलीज के लिए बटन संयोजन में संशोधक को शामिल करना होगा। मान लें कि आपकी सुपर कुंजी को mod4 में मैप किया गया है (जो कि डिफ़ॉल्ट, afaik होना चाहिए):

"xte 'keydown Super_L'"
  b:11

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

संपादित करें: बस एहसास हुआ कि यह आपके सवाल का पूरी तरह से जवाब नहीं देता है क्योंकि आप अभी भी बी: ​​11 को पकड़े हुए एलएमबी का उपयोग नहीं कर पाएंगे

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.