ปัญหาผูกพันทางลัดไปยังคีย์ฟังก์ชัน / มัลติมีเดีย


8

ฉันต้องการเชื่อมต่อสคริปต์ชุดงานกับทางลัด เมื่อฉันผูกไว้ภายใต้การตั้งค่าระบบ> แป้นพิมพ์> ทางลัดมันทำงานได้กับทุกปุ่มยกเว้นปุ่มปรับความสว่างของฉันจากแป้นพิมพ์ Apple ภายนอก

กุญแจความสว่างได้รับการยอมรับใน showkey กับ keycode 224และ225

xev เอาท์พุท:

FocusOut event, serial 41, synthetic NO, window 0x4000001,
mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 41, synthetic NO, window 0x4000001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 41, synthetic NO, window 0x0,
    keys:  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 

ข้อเสนอแนะใด ๆ ที่ฉันสามารถทำได้?

คำตอบ:


6

วิธีแก้ปัญหาโดยใช้ halevt

ตามหน้า man halevtเป็นตัวจัดการทั่วไปสำหรับเหตุการณ์ HAL มันเลิกใช้แล้วและถูกแทนที่ด้วยudevแต่เนื่องจากฉันไม่รู้เพียงพอเกี่ยวกับudevฉันจะให้halevtทางออก

แก้ไข:หลังจากเหงื่อออกรุนแรงฉันก็สามารถทำสิ่งนี้udevได้ ดูคำตอบอื่น ๆ ของฉัน

ฉันจะใช้vimในการแก้ไขไฟล์ แต่ถ้าคุณไม่ทราบว่าvimคุณสามารถแทนที่มันด้วยหรือnanogedit

การติดตั้ง halevt

sudo apt-get update && sudo apt-get install halevt

การพิจารณาว่าเหตุการณ์ใดที่คุณต้องการผูกกับสคริปต์
หยุดhalevtdaemon ที่กำลังทำงานอยู่:

sudo /etc/init.d/halevt stop

ตอนนี้ดูว่าhalevtสามารถรับรู้เหตุการณ์ของปุ่มที่คุณต้องการใช้หรือไม่ให้เริ่มฟัง:

sudo -u halevt halevt -fig:plugdev

ตอนนี้กดปุ่มฟังก์ชั่นบนแป้นพิมพ์ของคุณที่คุณต้องการผูกสคริปต์ ฉันรู้ว่า OP ต้องการให้ปุ่มความสว่างของเขาทำงานดังนั้นไปด้วยกัน เอาต์พุตสำหรับปุ่มปรับความสว่างควรมีลักษณะดังนี้:

Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-down)
Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-up)

คุณสามารถเห็นว่าbrightness-downและbrightness-upกิจกรรมถูกส่ง

ผูกเหตุการณ์กับสคริปต์
ตอนนี้แก้ไขไฟล์/etc/halevt/halevt.xml:

sudo vim /etc/halevt/halevt.xml

และเพิ่มบรรทัดต่อไปนี้ (ฉันทำที่ด้านล่างก่อนหน้านี้</halevt:Configuration>):

<halevt:Device match="hal.info.category = input">

    <halevt:Condition name="ButtonPressed" value="brightness-up" exec="sudo /home/user/brightness-script.sh up"/>

    <halevt:Condition name="ButtonPressed" value="brightness-down" exec="sudo /home/user/brightness-script.sh down"/>

</halevt:Device>

คุณควรเปลี่ยนvalueเป็นเหตุการณ์ที่คุณได้รับจากผู้ฟังและexecโดยคำสั่งที่คุณต้องการดำเนินการ

อนุญาตให้ผู้ใช้ halevt ที่จะทำคำสั่งหรือสคริปต์
ตั้งแต่halevtภูตจะดำเนินการเป็นผู้ใช้ที่คุณต้องให้มันได้รับอนุญาตให้ทำในสิ่งที่คุณระบุไว้ในhalevtexec

เรียกใช้ (อย่าลืมแทนที่vimโดยบรรณาธิการที่คุณเลือก)

sudo EDITOR=vim visudo

และเพิ่มบรรทัดต่อไปนี้ที่ด้านล่าง

halevt ALL=(root) NOPASSWD: /home/user/brightness-script.sh 

และบันทึกและออก

ตรวจสอบให้แน่ใจว่าสคริปต์ของคุณทำงานได้

sudo chmod +x /home/user/brightness-script.sh

เริ่ม halevt daemon อีกครั้ง

sudo /etc/init.d/halevt start

และมันควรจะทำงาน!


ทำงานได้อย่างไร้ที่ติ ขอบคุณอีกครั้งสำหรับคำตอบที่แม่นยำ
Remi

ยินดีต้อนรับคุณกำลังเห็นคำตอบใหม่ของฉันudevใช้ แต่อย่าลังเลที่จะยึดติดกับโซลูชันอื่น ๆ สิ่งสำคัญคือมันใช้งานได้)
แกร์ฮาร์ดเบอร์เกอร์

E: Unable to locate package halevtใน 14.04
umpirsky

ตั้งแต่ Ubuntu 13.10 halevt ไม่รวมอยู่อีกต่อไป ( packages.ubuntu.com/search?keywords=halevt )
Gerhard Burger

11

โซลูชันที่ใช้ udev

เนื่องจาก HAL เลิกใช้แล้วและudevตอนนี้ใช้วิธีนี้จึงเป็นที่ต้องการมากกว่าคำตอบอื่น ๆ ของฉัน (แม้ว่าฉันคิดว่าโซลูชันที่ใช้ HAL นั้นเรียบง่ายกว่า)

อย่างไรก็ตามสำหรับปุ่มฟังก์ชั่นมากมายคุณสามารถใช้การตั้งค่าระบบ> คีย์บอร์ด> ทางลัดเพื่อผูกสคริปต์ให้ลองใช้วิธีนี้ก่อน! ช่วยให้คุณประหยัดปัญหามาก ตัวอย่างเช่นปุ่มความสว่างมันไม่ทำงาน (ฉันไม่มีเงื่อนงำทำไมไม่) ดังนั้นถ้าคุณต้องการทราบวิธีการเปลี่ยนพฤติกรรมของตัวอย่างเช่นปุ่มความสว่างให้อ่าน

หมายเหตุ : หากคุณใช้งานโน้ตบุ๊ก Samsung คุณสามารถแก้ไขปุ่มฟังก์ชั่นทั้งหมด (ขึ้นอยู่กับรุ่น) โดยติดตั้งsamsung-toolsแพคเกจจากhttp://www.voria.org/forum/

วิธีนี้จะถือว่าคุณรู้วิธีใช้เทอร์มินัลและใช้vimโปรแกรมแก้ไข หากคุณไม่ทราบvimโปรดแทนที่ในคำสั่งโดยทั้งหรือgeditnano


การกำหนดแป้นพิมพ์ของคุณ

/lib/udev/findkeyboards

ควรพิมพ์แป้นพิมพ์ที่เชื่อมต่อกับคอมพิวเตอร์ในกรณีของฉัน

USB keyboard: input/event9
USB keyboard: input/event7
AT keyboard: input/event4

ขณะนี้มีสองตัวเลือก:

  • แป้นพิมพ์ USB :
    หากคุณต้องการทำการแมปแป้นพิมพ์ USB ใหม่อีกครั้งให้ตรวจสอบโดยการเรียกใช้

    udevadm info --export-db | awk '/event9/' RS="" | grep -P 'ID_(VENDOR|MODEL)(?!_ENC)'
    

    โดยที่คุณต้องแทนที่ 9 ในคำสั่ง awk ด้วยหมายเลขที่ถูกต้อง ผลลัพธ์ควรคล้ายกับ

    E: ID_MODEL=USB_Receiver
    E: ID_MODEL_ID=c52b
    E: ID_VENDOR=Logitech
    E: ID_VENDOR_ID=046d
    

    ซึ่งแสดงให้เห็นอย่างถูกต้องว่าแป้นพิมพ์ของฉันได้รับการจัดการผ่าน Logitech USB Receiver (อินพุต / event7 กลายเป็นเมาส์ Logitech G9 ซึ่งมีปุ่มที่ตั้งโปรแกรมได้)

  • แป้นพิมพ์แล็ปท็อป :
    หากคุณต้องการตั้งค่าแป้นพิมพ์แล็ปท็อปใหม่คุณควรจำหมายเลขAT keyboardที่เป็น 4 ในกรณีของฉัน รับข้อมูล dmi สำหรับแล็ปท็อปของคุณด้วย:

    cat /sys/class/dmi/id/sys_vendor
    

    ซึ่งในกรณีของฉัน

    SAMSUNG ELECTRONICS CO., LTD.
    

    และ

    cat /sys/class/dmi/id/product_name
    

    ซึ่งในกรณีของฉัน

    305U1A
    

กำหนดการทำแผนที่ปัจจุบันของปุ่มฟังก์ชั่นของคุณ

ตอนนี้เราสามารถกำหนด keymapping ปัจจุบันของเราโดยการฟังแป้นพิมพ์ (ใส่หมายเลขที่ถูกต้อง)

sudo /lib/udev/keymap -i input/event4

คุณสามารถออกจากคำสั่งนี้โดยใช้Escบนแป้นพิมพ์หรือCtrl+ cบนแป้นพิมพ์อื่น

หากหน้าจอของคุณเริ่มเลื่อนลงอย่างหนักให้กดEscและCtrl+ cสองสามครั้งแล้วลองอีกครั้งด้วย

sudo /lib/udev/keymap -i input/event4 2> /dev/null

หรือถ้าคุณยังมีปัญหาการเลื่อน

sudo /lib/udev/keymap -i input/event4 > ~/keymap.log

ในกรณีสุดท้ายคุณจะยังคงมีการเลื่อน แต่ถ้าคุณกดปุ่มฟังก์ชั่นพวกเขาควรไป~/keymap.logที่ที่คุณสามารถอ่านได้ในภายหลัง

ตอนนี้เราสามารถตรวจสอบการแมปปุ่มฟังก์ชั่นปัจจุบันของคุณได้โดยกดที่ปุ่มซึ่งจะให้รายการเช่น (นี่คือFn+ ของฉันF1ผ่านFn+ F12):

scan code: 0xCE   key code: kpplusminus
scan code: 0x89   key code: brightnessdown
scan code: 0x88   key code: brightnessup
scan code: 0x82   key code: switchvideomode
scan code: 0xF9   key code: f23
scan code: 0xA0   key code: mute
scan code: 0xAE   key code: volumedown
scan code: 0xB0   key code: volumeup
scan code: 0x43   key code: f9
scan code: 0x44   key code: f10
scan code: 0xB3   key code: prog3
scan code: 0x86   key code: wlan

ตอนนี้จดรหัสสแกนที่คุณต้องการเปลี่ยนพฤติกรรม


การเปลี่ยนรหัสคีย์สำหรับรหัสสแกน

หากคุณเห็นรหัสคีย์อย่างชัดเจนไม่ครอบคลุมสิ่งที่คุณคาดหวังว่าจะต้องทำคุณสามารถดูได้/usr/include/linux/input.hภายใต้คีย์และปุ่มเพื่อดูว่ามีรหัสคีย์ที่ตรงกับสิ่งที่คุณต้องการจะเกิดขึ้นจริงหรือไม่ รหัสคีย์ที่มีอยู่ในรูปแบบKEY_KEYCODEและคุณต้องจดบันทึกส่วนหลังลงKEY_ในตัวพิมพ์เล็ก บางครั้งการเปลี่ยนแปลงนี้ก็เพียงพอที่จะแก้ปัญหา

ปุ่มความสว่างมักจะมีรหัสที่ถูกต้องที่เกี่ยวข้องกับพวกเขาและนี่คือสิ่งที่ไม่อนุญาตให้ทำการแมปใหม่ ดังนั้นเราต้องเปลี่ยนเป็นรหัสอื่น ๆ เราจะใช้prog1และprog2สำหรับตัวอย่างนี้เพราะสิ่งเหล่านี้ไม่ได้อยู่ในการใช้งานบนคอมพิวเตอร์ของฉัน แต่คุณยังสามารถใช้f13ผ่านf24หรือf20ผ่านf24ถ้าคุณมีแป้นพิมพ์แอปเปิ้ลที่มีF1ผ่านF19ปุ่ม

  1. สร้าง keymap ที่กำหนดเอง :
    สร้างไฟล์ keymap ในไดเรกทอรีที่/lib/udev/keymapsมีชื่อที่เหมาะสมดูที่ผลลัพธ์ของls /lib/udev/keymapsเพื่อดูชื่อที่เหมาะสม ฉันจะไปด้วยcustom-brightnessเพื่อจุดประสงค์ของคำถามนี้

    sudo vim /lib/udev/keymaps/custom-brightness
    

    และป้อนรหัสสแกนของปุ่มที่คุณต้องการเปลี่ยนตามด้วย scancodes ที่คุณต้องการให้มี custom-brightnessหน้าตาของฉันเป็นแบบนี้:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. สร้างไฟล์รีลีสคีย์แบบกำหนดเอง เฉพาะในกรณีที่คุณเปลี่ยนแป้นพิมพ์แล็ปท็อปของคุณ :
    บางครั้งเหตุการณ์การปล่อยปุ่มไม่ถูกต้องส่งผลให้คอมพิวเตอร์วางสาย เพื่อหลีกเลี่ยงปัญหานี้เราจะเขียนไฟล์การปล่อยกุญแจที่กำหนดเอง

    sudo vim /lib/udev/keymaps/force-release/custom-brightness
    

    ไฟล์นี้ควรมีรหัสสแกนที่เหมือนกันกับของฉัน

    # /lib/udev/keymaps/force-release/custom-brightness
    
    0x89
    0x88
    

ตรวจสอบให้แน่ใจว่ามีการโหลดการแมปใหม่ในไฟล์กฎ
ตอนนี้เราต้องตรวจสอบให้แน่ใจว่าการโหลดการแมปของคุณ เราสามารถทำได้โดยการแก้ไข/lib/udev/rules.d/95-keymap.rulesดังนั้นจึงเป็นการดีที่จะทำการสำรองข้อมูล

อีกครั้งเรามีสองตัวเลือก:

  • แป้นพิมพ์ USB :
    เนื่องจากคุณมีแป้นพิมพ์ USB คุณควรเพิ่มรายการของคุณภายใต้LABEL="keyboard_usbcheck"และควรอยู่เหนือรายการอื่น ๆ ของผู้ผลิตแป้นพิมพ์ของคุณ นี่เป็นเพราะคีย์บอร์ดของฉันด้วย

    E: ID_MODEL=USB_Receiver
    E: ID_MODEL_ID=c52b
    E: ID_VENDOR=Logitech
    E: ID_VENDOR_ID=046d
    

    ถูกจับคู่โดยกฎข้อใดข้อหนึ่งแล้วมิฉะนั้นจะถูกเขียนทับ
    เพิ่มกฎต่อไปนี้ซึ่งคุณควรเปลี่ยนID_VENDOR_IDและID_MODEL_IDและชื่อของ keymap ของคุณอย่างเหมาะสม

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • แป้นพิมพ์แล็ปท็อป :
    ถ้า/lib/udev/findkeyboardsรายงานแป้นพิมพ์แล็ปท็อปของคุณเป็นAT keyboardกฎของคุณควรจะไปอยู่ภายใต้การมิฉะนั้นวางไว้ใต้LABEL="keyboard_vendorcheck" LABEL="keyboard_modulecheck"ใส่ไว้ในรายการอื่น ๆ สำหรับผู้ผลิตแล็ปท็อปของคุณอีกครั้ง เพิ่มกฎต่อไปนี้ ( SAMSUNG ELECTRONICS CO., LTD.ยาวหน่อยดังนั้นฉันจึงใช้สัญลักษณ์แทน)

    ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keymap $name custom_brightness"
    

    ตอนนี้เพิ่มกฎเพื่อ/lib/udev/rules.d/95-keyboard-force-release.rulesสำรองข้อมูลด้วย

    sudo cp /lib/udev/rules.d/95-keyboard-force-release.rules /lib/udev/rules.d/95-keyboard-force-release.rules.bak
    sudo vim /lib/udev/rules.d/95-keyboard-force-release.rules
    

    อีกครั้งภายใต้รายการอื่น ๆ ของผู้ผลิตของคุณเพิ่ม

    ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keyboard-force-release.sh $devpath custom_test"
    

ตรวจสอบให้แน่ใจ udev โหลดกฎใหม่
เพื่อโหลดกฎใหม่ทำงาน

sudo adevadm trigger

หมายเหตุ: udevadm control --reload-rules(ยังอยู่ในคำแนะนำในเว็บไซต์หลายแห่ง) ไม่ทำงาน

ตอนนี้ตรวจสอบว่ากฎถูกนำไปใช้เรียบร้อยแล้วโดย

sudo /lib/udev/keymap -i input/event4

ซึ่งตอนนี้ควรรายงานถึงปุ่มความสว่าง

scan code: 0x89   key code: prog1
scan code: 0x88   key code: prog2

ทำการแมปคีย์ใหม่อีกครั้งในการตั้งค่าระบบ
หากขั้นตอนสุดท้ายแจ้งรหัสคีย์ที่ถูกต้องคีย์นั้นจะเริ่มทำงานโดยอัตโนมัติ

เพื่อความสว่างที่คุณยังคงต้องผูกกุญแจสู่ใบซึ่งเป็นไปได้ตอนนี้ใช้ระบบการตั้งค่า> คีย์บอร์ด> ทางลัด

สนุก



หมายเหตุ :

  • หากคีย์ของคุณมีรหัสคีย์ผิดและได้รับการแก้ไขโดยวิธีการนี้โปรดปฏิบัติตามคำแนะนำใน/usr/share/doc/udev/README.keymap.txt.gz(คุณสามารถเปิดได้โดยไม่ต้องคลายการใช้zless) และส่งผลลัพธ์ของคุณทางอีเมลที่กล่าวถึงที่นั่นการเปลี่ยนแปลงสามารถรวมไว้ในรุ่นถัดไป ผู้ใช้หลายคนจะได้รับประโยชน์!

  • ขอบคุณมากสำหรับโพสต์ที่เป็นประโยชน์นี้โดย Vaidas Jablonskis


1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directoryยัง$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky

ขอบคุณสำหรับความคิดเห็นของคุณฉันดูมันและดูเหมือนว่า udev จะถูกรวมเข้ากับ systemd และการตั้งค่า keymap จะได้รับการจัดการใน hwdb แทน ตามbbs.archlinux.org/viewtopic.php?id=168720เป็นไปได้ที่จะแยก findkeyboards จาก systemd รุ่นเก่า แต่ฉันไม่แน่ใจว่าคำตอบที่เหลือยังคงใช้ ...
Gerhard Burger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.