รหัสสำคัญถูกแมปกับการกระทำที่เหมาะสมอย่างไร


18

หลังจากหาวิธีเปลี่ยนการแมปรหัสสแกนเป็นรหัสคีย์โดยใช้udevดูคำถามนี้ฉันสงสัยว่ารหัสคีย์เหล่านั้น (หรือเหตุการณ์ถ้าคุณจะ) ถูกแมปกับการกระทำที่เหมาะสม

ตัวอย่างเช่นหากคุณกดvolume upแป้นพิมพ์รหัสสแกนจะถูกส่งซึ่งจะถูกแปลงเป็นvolumeupรหัสคีย์ แต่รหัสคีย์นี้ถูกดักจับ, ปริมาณที่ปรากฏขึ้นและการแจ้งเตือนที่เหมาะสมปรากฏขึ้น?

ฉันเดาว่าจะต้องเรียกสคริปต์ที่ไหนสักแห่งดังนั้นฉันอยากรู้ว่าสคริปต์เหล่านั้นอยู่ที่ไหน

แก้ไข: รหัสสำคัญที่ฉันพูดถึงจะไม่สับสนกับการxevส่งคืนรหัสคีย์แต่ฉันก็สนใจเช่นนั้น;)


3
ฉันไม่เห็นด้วยตัวอย่างเช่นการแจ้งเตือนนั้นเฉพาะเจาะจงกับ Ubuntu ดังนั้นฉันต้องการทราบว่าการแจ้งเตือนนั้นส่งไปอย่างไร ฉันเดาว่าจะต้องเรียกสคริปต์ที่ไหนสักแห่งดังนั้นฉันอยากรู้ว่าสคริปต์เหล่านั้นอยู่ที่ไหน
แกร์ฮาร์ดเบอร์เกอร์

2
นี่เป็นคำถามเฉพาะของ Ubuntu ที่ถูกต้องเนื่องจากวิธีที่ Ubuntu จัดการกับสิ่งนี้ได้เปลี่ยนแปลงไปหลายปี IIRC เป็นเรื่องที่น่าสนใจมากที่รู้ว่าลำดับเหตุการณ์ในอูบุนตูในกรณีที่กดฮอตคีย์เป็นการกระทำที่เหมาะสม วัตถุประสงค์ที่เป็นไปได้: การควบคุมความสว่างที่กำหนดเอง , การดีบักปัญหาคีย์ลัด ฯลฯ
gertvdijk

2
@Seth ดูเหมือนว่าล้าสมัย HAL จะเลิกนานแล้วตั้งแต่ 10.04 นอกจากนี้ยังขาดข้อมูลวิธีเรียกใช้การแจ้งเตือนบนเดสก์ท็อป
gertvdijk

1
วันนี้ฉันเจอwiki.ubuntu.com/Hotkeys/Troubleshootingซึ่งให้พอยน์เตอร์ที่ดี (มีลิงค์ไปที่wiki.ubuntu.com/Hotkeys/Ar Architectureซึ่งให้ข้อมูลมาก) ผมคิดว่าคำตอบของสตีเฟ่น Ostermiller อยู่ในทิศทางที่ถูกต้อง แต่ผมต้องการที่จะหาสคริปต์เหล่านั้นและสามารถที่จะเปลี่ยนพวกเขา;)
แกร์ฮาร์ดเบอร์เกอร์

1
^^ ข้อมูลนี้ดูเหมือนว่าจะล้าสมัยไม่มีการเชื่อมโยงคีย์ภายใต้ gnome-settings-daemon ที่นี่ ... ความนิยมจำนวนมากสำหรับความสว่างภายใต้ส่วนคอมพิวเตอว่า (ฉันเดาความเป็นเอกภาพหรือไม่) ใครจะรู้ว่าnotify-osdทำงานอย่างไร ฉันคิดว่านั่นคือที่ที่มีการส่งการแจ้งเตือนความสว่าง ...
Gerhard Burger

คำตอบ:


6

ตกลงพบสิ่งนี้ที่ https://help.ubuntu.com/community/MultimediaKeys

เมื่อคุณกดปุ่มบนแป้นพิมพ์ของคุณเคอร์เนล linux จะสร้าง scancode แบบดิบ (ถ้าได้รับการกำหนด) แต่ละ scancode สามารถแม็พกับ keycode นี่คือที่ระดับเคอร์เนล X มีวิธีการทำแผนที่คีย์อิสระทั้งหมด (เสมือน): X อ่านตารางรหัสเคอร์เนลเมื่อเริ่มต้นจากนั้นจับคู่รหัสไปยังตารางรหัสคีย์อิสระ (เหมือนกับรหัสเคอร์เนล แต่แตกต่างกัน :)) จากนั้นแต่ละรหัสสามารถแมปไปยัง keysym เช่นสตริงที่เป็นตัวแทนของคีย์หรือแนะนำการกระทำ ดังนั้นเพื่อให้คีย์ของเราทำงานได้อย่างสมบูรณ์พวกเขาต้องการเคอร์เนล scancode / keycode บวก X keycode / keysym อาจดูเหมือนแปลก แต่นักพัฒนา X มีเหตุผลในการแยกการแมปคีย์บอร์ดจากเคอร์เนล มันไม่ยากเลยเพียงแค่ขั้นตอนที่ค่อนข้างน่าเบื่อ

ดังนั้นรหัสของจะถูกแมปไปยัง keysym's ดังนั้นรหัสของอยู่ที่ไหน ฉันพบและตอบคำถามนี้: ฉันจะค้นหารายการ X keysyms ทั้งหมดได้ที่ไหน เนื่องจากเรากำลังพูดถึงปุ่มปรับระดับเสียงมันจะอยู่XF86keysym.hในซอร์สโค้ดที่กล่าวถึงในคำตอบ

ในไฟล์นั้นบนคอมพิวเตอร์ของฉันฉันพบดังต่อไปนี้สำหรับไดรฟ์ข้อมูล:

#define XF86XK_AudioLowerVolume 0x1008FF11   /* Volume control down        */
#define XF86XK_AudioMute    0x1008FF12   /* Mute sound from the system */
#define XF86XK_AudioRaiseVolume 0x1008FF13   /* Volume control up          */

แปลก ... ค่าแตกต่างจากอย่างอื่นอาจมีหลายระบบสำหรับการจัดการคีย์? http://crunchbang.org/forums/viewtopic.php?id=16656


ฉันใช้ Xubuntu และเพื่อควบคุมปุ่มฉันต้องแมปการกระทำด้วยตนเอง (เช่นนี้ ฉันจะเปลี่ยนแป้นพิมพ์ลัดใน xubuntu ได้อย่างไร ) อย่างไรก็ตามการแจ้งเตือนดูเหมือนจะเป็นอิสระราวกับว่าพวกเขากำลังหยิบขึ้นมากดปุ่มและดำเนินการตามนั้นมันอาจหมายความว่าโปรแกรมอื่น ๆ ในอูบุนตูได้รับการตั้งค่าด้วยวิธีนี้ดังนั้นจึงไม่จำเป็นต้องแมปสคริปต์กับคีย์

ดังนั้นฉันค่อนข้างแน่ใจว่าตอนนี้โปรแกรมกำลังรวบรวมคีย์ (ดังนั้นจึงไม่สามารถพบเหรียญได้)

ใน Xubuntu ฉันมีปัญหากับ Pulse Audio และใช้สคริปต์ที่กำหนดเองเพื่อเปลี่ยนระดับเสียงดูเหมือนว่า Pulse กำลังสกัดกั้นปุ่มปิดเสียงปุ่มปิดเสียงปิดเสียง Alsa และ PulseAudio แต่เปิดเสียงเฉพาะ Alsa ที่สร้างขึ้นเพื่อแก้ไขปัญหาที่น่าสนใจ


ลองใช้งาน NotifyOSD ดู https://wiki.ubuntu.com/NotifyOSD#Volume_changes

ถ้าคุณดูไดอะแกรมเหล่านี้: https://wiki.ubuntu.com/NotifyOSD#Ar Architecture

โดยเฉพาะอันนี้ ป้อนคำอธิบายรูปภาพที่นี่

มันแสดงให้เห็นว่ามี "ผู้ฟังคีย์ฮาร์ดแวร์" ซึ่งได้รับแบบฟอร์ม DBus หรือ HAL? จากนั้น "ดึงองค์ประกอบภาพจากระบบ" ซึ่งไอคอนเสียงและความสว่างอยู่ในแหล่งที่มาของ Notify-OSD จากนั้นสร้างฟองอากาศจากที่นั่น


นี่คือความสับสนอย่างบ้าคลั่ง แต่เท่าที่ฉันเข้าใจ (จนถึง):

raw scancode (เช่น e016)> keycode (เช่น 160)> keysym (เช่น XF86AudioMute)> gnome-settings-daemon (เช่นเพิ่มระดับเสียง)> สัญญาณ DBus> ฮาร์ดแวร์คีย์ - ฟังสำหรับแจ้งเตือน -osd (หรืออื่น ๆ โปรแกรมฟัง)


ดูเหมือนว่านี่กำลังจะไปที่ไหนซักแห่ง! ทำเครื่องหมายว่าเป็น CW ตั้งแต่เริ่มต้นดังนั้นฉันเดาว่าคุณยังคงพัฒนาอยู่หรือไม่ :)
gertvdijk

อ๋อฉันต้องดูรายละเอียดเพิ่มเติมแผนภาพมีเครื่องหมายคำถามมากมาย
Mateo

คุณทำให้มันกลายเป็นคำตอบของวิกิชุมชนโดยไม่ตั้งใจได้หรือไม่? อาจขอให้ตัวดัดแปลงเลิกทำ ... โอ้และกราฟเหล่านั้นน่าจะล้าสมัยไปแล้วเนื่องจาก HAL เลิกใช้มานานแล้ว ... อย่างน้อยเราก็ไปถึงที่ไหนสักแห่ง: D
Gerhard Burger


@gertvdijk ฉันรู้ แต่มันจะเป็นความอัปยศสำหรับทุก upvotes ที่เขาจะพลาด;)
แกร์ฮาร์ดเบอร์เกอร์

1

ในกรณีส่วนใหญ่ไม่มีสคริปต์ที่ทำงานอยู่ ซึ่งจะทำให้เหตุการณ์ถูกส่งไปยังตัวจัดการหน้าต่างหรือภูตการตั้งค่า เวลาเดียวที่ฉันทราบเกี่ยวกับการสร้างสคริปต์ในกระบวนการคือเมื่อคุณกำหนดค่าการเชื่อมโยงคีย์แบบกำหนดเอง สำหรับการโยงคีย์แบบกำหนดเองคุณสามารถเพิ่มบรรทัดคำสั่ง (ไฟล์เรียกทำงานหรือสคริปต์) และกำหนดให้กับคีย์

โปรดดูคำตอบนี้ที่ฉันเขียนถึงคำถามเกี่ยวกับการสำรองการโยงคีย์ใน Ubuntu: แป้นพิมพ์ลัดของ GNOME ถูกเก็บไว้ที่ไหน ฉันมีสคริปต์ที่สำรองหรือกู้คืน keybindings ทั้งหมดรวมถึง keybindings ที่กำหนดเอง หากคุณเรียกใช้สคริปต์คุณสามารถดูได้ว่ามีการจัดเก็บคีย์บิลด์ไว้ในที่ใดและแอปพลิเคชันใดที่ได้รับแจ้งเกี่ยวกับเหตุการณ์สำคัญ


การแจ้งเตือนบนเดสก์ท็อปจะเริ่มขึ้นอย่างไร
แกร์ฮาร์ดเบอร์เกอร์

ฉันเชื่อว่า daemon การตั้งค่า gnome มีหน้าที่ในการเรียกสิ่งเหล่านั้นในกรณีของปริมาณและความสว่าง
Stephen Ostermiller

2
ฉันรันสคริปต์ของคุณแล้ว แต่สิ่งที่ดูเหมือนจะทำคือการได้รับทางลัดที่คุณสามารถเข้าถึงได้ด้วยการตั้งค่าระบบ> คีย์บอร์ด> ทางลัดฉันไม่พบการอ้างอิงถึงความสว่างใด ๆ
Gerhard Burger

สคริปต์สุดเจ๋งสำหรับการรับกุญแจ shoutcut
Mateo

0

คำตอบที่เกี่ยวข้องกับไดร์เวอร์

ฮาร์ดแวร์ทุกตัวจะต้องมีไดรเวอร์เพื่อที่จะโต้ตอบกับระบบปฏิบัติการ

การอ้างถึงhttp://www.linuxforu.com/2010/11/understanding-linux-device-drivers/ :

ไดรฟ์เวอร์ควบคุมจัดการควบคุมและควบคุมเอนทิตีภายใต้คำสั่ง สิ่งที่คนขับรถประจำทางทำกับรถบัสคนขับอุปกรณ์ทำอะไรกับอุปกรณ์คอมพิวเตอร์ (ชิ้นส่วนของฮาร์ดแวร์ใด ๆ ที่เชื่อมต่อกับคอมพิวเตอร์) เช่นเมาส์คีย์บอร์ดจอมอนิเตอร์ฮาร์ดดิสก์กล้องเว็บนาฬิกาและอื่น ๆ

นอกจากนี้“ นักบิน” อาจเป็นบุคคลหรือแม้แต่ระบบอัตโนมัติที่ถูกตรวจสอบโดยบุคคล (เช่นระบบนำร่องอัตโนมัติในสายการบินเป็นต้น) ในทำนองเดียวกันชิ้นส่วนของฮาร์ดแวร์ที่เฉพาะเจาะจงสามารถควบคุมได้โดยชิ้นส่วนของซอฟต์แวร์ (ไดรเวอร์อุปกรณ์) หรือสามารถควบคุมได้โดยอุปกรณ์ฮาร์ดแวร์อื่นซึ่งจะสามารถจัดการได้โดยไดรเวอร์อุปกรณ์ซอฟต์แวร์ ในกรณีหลังอุปกรณ์ควบคุมดังกล่าวมักเรียกว่าตัวควบคุมอุปกรณ์ การเป็นอุปกรณ์ตัวเองมักต้องการไดรเวอร์ซึ่งมักเรียกกันว่าไดรเวอร์บัส

อุปกรณ์มีการลงทะเบียนอุปกรณ์ซึ่งเก็บบิตการควบคุม / สถานะและบิตข้อมูล เมื่อใดก็ตามที่ข้อมูลบางอย่างจำเป็นต้องมีการถ่ายโอนข้อมูลมักจะถูกส่งโดยการตั้งค่าบิตข้อมูล

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

ลิงค์:

  • หากคุณสนใจผมขอแนะนำให้คุณอ่านชุดนี้ในไดรเวอร์ของอุปกรณ์ซึ่งประกอบด้วย 17 เขียนบทความที่ดีโดยlinuxforu : http://www.linuxforu.com/tag/linux-device-drivers-series/

  • คุณสามารถอ่านเอกสารเฉพาะที่มีคำแนะนำเกี่ยวกับวิธีการเขียนไดรเวอร์อุปกรณ์สำหรับแป้นพิมพ์ USB: http://www.emntech.com/docs/USB_KeyBoard_Driver_eMNTech.pdf

  • หากคุณตื่นเต้นมากเกี่ยวกับไดรเวอร์อุปกรณ์ linux อ่านหนังสือ"ไดรเวอร์อุปกรณ์ Linux"ซึ่งมีให้บริการในรูปแบบ pdf ฟรี: http://lwn.net/Kernel/LDD3/


3
อืมม ... ฉันไม่คิดว่าผู้ขับขี่จะมีความคิดเกี่ยวกับความหมายของปุ่มกดบนแป้นพิมพ์ของฉัน อุปกรณ์ฮอตคีย์พิเศษบางอย่างในโน้ตบุ๊กอาจต้องใช้ไดรเวอร์สำหรับสิ่งนี้ - แต่มันไม่ครอบคลุมปุ่มลัดมัลติมีเดียทั่วไปเช่น "เพิ่มระดับเสียง" สิ่งนี้จะต้องครอบคลุมในพื้นที่ทั่วไปของเคอร์เนล / X / DE ฉันยังคิดว่าข้อมูลอ้างอิงนั้นกว้างมากเกี่ยวกับการเขียนโปรแกรมไดรเวอร์อุปกรณ์ Linux kerner
gertvdijk

ฉันคิดว่าคีย์บอร์ดที่ทันสมัยที่สุดอูบุนตูใช้evdevไดรเวอร์ แต่ฉันไม่เห็นว่ามันจะมีประโยชน์อย่างไรที่นี่ ...
Gerhard Burger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.