Sự cố ràng buộc một lối tắt đến một phím chức năng / đa phương tiện


8

Tôi muốn kết nối một tập lệnh bó với một phím tắt. Khi tôi liên kết nó trong Cài đặt hệ thống> Bàn phím> Phím tắt, nó hoạt động với mọi phím, ngoại trừ các phím độ sáng từ bàn phím Apple bên ngoài của tôi.

Các phím độ sáng được nhận dạng trong showkey với mã khóa 224225 .

đầu ra 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 

Bất kỳ đề nghị những gì tôi có thể làm?

Câu trả lời:


6

Giải pháp sử dụng halevt

Theo các trang người đàn ông halevtlà một xử lý chung cho các sự kiện HAL. Nó không được chấp nhận và được thay thế bởi udev, nhưng vì tôi không biết đủ về udevtôi nên sẽ đưa ra halevtgiải pháp.

EDIT: sau một số mồ hôi nghiêm trọng, tôi quản lý để làm điều này trong udev. Xem câu trả lời khác của tôi .

Tôi sẽ sử dụng vimđể chỉnh sửa các tập tin, nhưng nếu bạn không biết vimbạn có thể thay thế nó bằng nanohoặc gedit.

Cài đặt halevt

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

Xác định sự kiện nào bạn muốn liên kết với tập lệnh
Dừng halevttrình nền đang chạy:

sudo /etc/init.d/halevt stop

Bây giờ hãy xem nếu halevtcó thể nhận ra các sự kiện của các phím bạn muốn sử dụng, hãy khởi động trình nghe:

sudo -u halevt halevt -fig:plugdev

Bây giờ hãy nhấn phím chức năng trên bàn phím mà bạn muốn liên kết tập lệnh. Tôi biết rằng OP muốn làm cho các phím sáng của anh ấy hoạt động, vì vậy hãy đi với điều đó. Đầu ra cho các phím độ sáng sẽ trông giống như thế này:

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)

Bạn có thể thấy rằng brightness-downbrightness-upcác sự kiện được truyền đi.

Liên kết sự kiện với tập lệnh
Bây giờ chỉnh sửa tệp /etc/halevt/halevt.xml:

sudo vim /etc/halevt/halevt.xml

và thêm các dòng sau (tôi đã làm nó ở dưới cùng, ngay trước đó </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>

tất nhiên bạn nên thay đổi valuethành sự kiện mà bạn nhận được từ người nghe và execbằng lệnh bạn muốn thực thi.

Cấp quyền cho người dùng halevt để thực hiện lệnh hoặc tập lệnh
halevttrình nền được chạy với tư cách là halevtngười dùng, bạn phải cấp cho nó quyền để thực hiện những gì bạn đã chỉ định exec.

Chạy (nhớ thay thế vimbởi biên tập viên bạn chọn)

sudo EDITOR=vim visudo

và thêm các dòng sau ở dưới cùng

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

và lưu và bỏ.

Hãy chắc chắn rằng tập lệnh của bạn có thể thực thi được

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

Bắt đầu trình nền halevt một lần nữa

sudo /etc/init.d/halevt start

Và nó nên được làm việc!


làm việc hoàn hảo cảm ơn bạn một lần nữa cho câu trả lời chính xác của bạn.
remi

Bạn được chào đón, xem thêm câu trả lời mới của tôi bằng cách sử dụng udev. Nhưng hãy thoải mái gắn bó với giải pháp khác, điều quan trọng là nó hoạt động;)
Gerhard Burger

E: Unable to locate package halevtngày 14.04.
umpirsky

Kể từ khi Ubuntu 13.10 halevt không còn được bao gồm ( packages.ubuntu.com/search?keywords=halevt )
Gerhard Burger

11

Giải pháp sử dụng udev

Vì HAL không được dùng nữa và udevhiện đang được sử dụng, nên cách tiếp cận này được ưa thích hơn câu trả lời khác của tôi (mặc dù tôi nghĩ rằng giải pháp sử dụng HAL đơn giản hơn).

Tuy nhiên, đối với nhiều phím chức năng, bạn chỉ cần sử dụng Cài đặt hệ thống> Bàn phím> Phím tắt để liên kết tập lệnh, trước tiên hãy thử điều này! Nó giúp bạn tiết kiệm rất nhiều rắc rối. Ví dụ, các phím độ sáng không hoạt động (tôi không biết tại sao không), vì vậy nếu bạn muốn biết cách thay đổi hành vi của ví dụ như các phím độ sáng, hãy đọc tiếp.

LƯU Ý : Nếu bạn đang chạy một máy tính xách tay Samsung, bạn có thể sửa tất cả các phím chức năng (tùy theo kiểu máy) bằng cách cài đặt samsung-toolsgói từ http://www.voria.org/forum/

Điều này giả định rằng bạn biết cách sử dụng thiết bị đầu cuối và sử dụng vimtrình chỉnh sửa. Nếu bạn không biết vimhãy thay thế nó trong các lệnh bằng một trong hai gedithoặc nano.


Xác định bàn phím của bạn

/lib/udev/findkeyboards

nên in bàn phím được kết nối với máy tính, trong trường hợp của tôi

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

Bây giờ có hai lựa chọn:

  • Bàn phím USB :
    Nếu bạn muốn sắp xếp lại bàn phím USB, hãy kiểm tra chúng bằng cách chạy

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

    trong đó bạn phải thay thế số 9 trong câu lệnh awk bằng số chính xác. Đầu ra phải tương tự như

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

    điều này cho biết chính xác rằng bàn phím của tôi được xử lý thông qua Bộ thu USB Logitech của tôi (đầu vào / event7 hóa ra là chuột Logitech G9 có một số nút có thể lập trình được).

  • Bàn phím máy tính xách tay :
    Nếu bạn muốn sắp xếp lại bàn phím máy tính xách tay của mình, bạn nên nhớ số cho số AT keyboard4 trong trường hợp của tôi. Cũng nhận được thông tin dmi cho máy tính xách tay của bạn:

    cat /sys/class/dmi/id/sys_vendor
    

    đó là trong trường hợp của tôi

    SAMSUNG ELECTRONICS CO., LTD.
    

    cat /sys/class/dmi/id/product_name
    

    đó là trong trường hợp của tôi

    305U1A
    

Xác định ánh xạ hiện tại của các phím chức năng của bạn

Bây giờ chúng tôi có thể xác định sơ đồ bàn phím hiện tại của mình bằng cách nghe bàn phím (chèn số chính xác)

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

bạn có thể thoát lệnh này bằng cách sử dụng Esctrên bàn phím hoặc Ctrl+ ctrên bàn phím khác.

Nếu màn hình của bạn bắt đầu cuộn xuống rất mạnh, hãy bấm EscCtrl+ cmột vài lần và thử lại với

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

hoặc, nếu bạn vẫn gặp sự cố cuộn

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

Trong trường hợp cuối cùng, bạn vẫn sẽ có cuộn nhưng nếu bạn nhấn các phím chức năng thì chúng sẽ đi vào ~/keymap.lognơi bạn có thể đọc chúng sau này.

Bây giờ chúng tôi có thể kiểm tra ánh xạ hiện tại của các phím Chức năng của bạn bằng cách nhấn chúng, danh sách này sẽ cung cấp cho bạn một danh sách như (đây là từ Fn+ F1đến Fn+ F12) của tôi:

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

Bây giờ hãy viết mã quét mà bạn muốn thay đổi hành vi.


Thay đổi mã khóa cho mã quét

Nếu bạn thấy mã khóa rõ ràng không bao gồm những gì bạn mong đợi khóa sẽ làm, bạn có thể xem /usr/include/linux/input.hbên dưới Phím và nút để xem có mã khóa nào phù hợp hơn với những gì bạn thực sự muốn xảy ra không. Các mã khóa có định dạng KEY_KEYCODEvà bạn phải ghi lại phần sau KEY_bằng chữ thường. Đôi khi thay đổi điều này là đủ để giải quyết vấn đề.

Tuy nhiên, các phím độ sáng thường có mã khóa phù hợp với chúng và đây là thứ không cho phép chúng được ánh xạ lại. Vì vậy, chúng ta cần thay đổi chúng thành các mã khóa khác. Chúng tôi sẽ sử dụng prog1prog2cho ví dụ này vì đây không phải là được sử dụng trên máy tính của tôi, tuy nhiên bạn cũng có thể sử dụng f13thông qua f24, hoặc f20thông qua f24nếu bạn có một bàn phím của Apple trong đó có F1thông qua F19phím.

  1. Tạo một sơ đồ bàn phím tùy chỉnh :
    Tạo một tệp sơ đồ bàn phím trong thư mục /lib/udev/keymapsvới một tên phù hợp, hãy xem đầu ra của ls /lib/udev/keymapsđể xem các tên phù hợp. Tôi đi với custom-brightnessmục đích của câu hỏi này.

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

    và nhập mã quét của các phím bạn muốn thay đổi theo sau là các đoạn mã bạn muốn chúng có. Tôi custom-brightnesstrông như thế này:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Tạo một tệp phát hành khóa tùy chỉnh. Chỉ khi bạn thay đổi bàn phím máy tính xách tay của bạn :
    Đôi khi, sự kiện phát hành khóa không được gửi đúng cách, khiến máy tính bị treo. Để tránh điều này, chúng tôi cũng sẽ viết một tệp phát hành khóa tùy chỉnh

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

    tập tin này nên chứa các mã quét giống nhau, tôi trông giống như

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

Đảm bảo rằng ánh xạ mới được tải trong các tệp quy tắc
Bây giờ chúng tôi cần đảm bảo rằng ánh xạ của bạn đã được tải. Chúng tôi có thể làm điều này bằng cách chỉnh sửa /lib/udev/rules.d/95-keymap.rules, vì vậy thật thông minh khi tạo bản sao lưu

Một lần nữa chúng ta có hai lựa chọn:

  • Bàn phím USB :
    Vì bạn có bàn phím USB, bạn nên thêm mục nhập bên dưới LABEL="keyboard_usbcheck"và nó sẽ vượt qua các mục khác của nhà sản xuất bàn phím của bạn. Điều này là do bàn phím của tôi với

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

    đã được khớp với một trong các quy tắc và nếu không, nó sẽ bị ghi đè.
    Thêm quy tắc sau đây, nơi bạn nên thay đổi ID_VENDOR_IDID_MODEL_IDvà tên của sơ đồ bàn phím của bạn một cách phù hợp

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Bàn phím máy tính xách tay :
    Nếu /lib/udev/findkeyboardsbáo cáo bàn phím máy tính xách tay của bạn là AT keyboardquy tắc của bạn nên đi theo LABEL="keyboard_vendorcheck", nếu không hãy đặt nó dưới LABEL="keyboard_modulecheck". Một lần nữa đặt nó dưới các mục khác cho nhà sản xuất máy tính xách tay của bạn. Thêm quy tắc sau ( SAMSUNG ELECTRONICS CO., LTD.hơi dài nên tôi đã sử dụng ký tự đại diện)

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

    Bây giờ cũng thêm một quy tắc để /lib/udev/rules.d/95-keyboard-force-release.rulessau khi sao lưu nó

    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
    

    Một lần nữa dưới các mục khác của nhà sản xuất của bạn thêm

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

Đảm bảo udev tải các quy tắc mới
Để tải các quy tắc mới chạy

sudo adevadm trigger

LƯU Ý: udevadm control --reload-rules(vẫn trong hướng dẫn trên nhiều trang web) không hoạt động.

Bây giờ hãy kiểm tra xem các quy tắc đã được áp dụng thành công chưa

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

Bây giờ sẽ báo cáo cho các phím độ sáng

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

Ánh xạ lại các phím trong Cài đặt hệ thống
Nếu bước cuối cùng báo cáo mã khóa chính xác, các phím sẽ tự động hoạt động (trong trường hợp đầu tiên chúng có mã khóa sai).

Đối với độ sáng, bạn vẫn phải liên kết các phím với một đoạn mã có thể sử dụng bằng Cài đặt hệ thống> Bàn phím> Phím tắt .

Thưởng thức



Ghi chú :

  • Nếu khóa của bạn có mã khóa sai và được sửa theo phương pháp này, vui lòng làm theo hướng dẫn trong /usr/share/doc/udev/README.keymap.txt.gz(bạn có thể mở mã này mà không cần giải nén zless) và gửi kết quả của bạn các địa chỉ email được đề cập ở đó, sau đó có thể đưa vào các thay đổi trong bản phát hành tiếp theo. Nhiều người dùng sẽ được hưởng lợi!

  • Rất cám ơn bài viết hữu ích này của Vaidas Jablonskis.


1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directorycũng vậy$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky

Cảm ơn bình luận của bạn, tôi đã xem xét và có vẻ như udev sẽ được hợp nhất vào systemd và cài đặt sơ đồ bàn phím sẽ được quản lý trong hwdb thay thế. Theo bbs.archlinux.org/viewtopic.php?id=168720 có thể trích xuất bảng tìm kiếm từ phiên bản cũ hơn của systemd, nhưng tôi không chắc phần còn lại của câu trả lời vẫn được áp dụng ...
Gerhard Burger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.