Masalah saat mengikat pintasan ke fungsi / tombol multimedia

8

Saya ingin menghubungkan skrip batch ke pintasan. Ketika saya mengikatnya di Pengaturan Sistem> Keyboard> Pintasan berfungsi dengan setiap tombol, kecuali tombol kecerahan saya dari keyboard Apple eksternal saya.

Tombol kecerahan dikenali pada showkey dengan kode kunci 224 dan 225 .

output 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 

Ada saran yang bisa saya lakukan?

Remi
sumber

Jawaban:

6

Solusi menggunakan halevt

Menurut halaman manual halevtadalah penangan generik untuk acara HAL. Itu sudah usang dan digantikan oleh udev, tetapi karena saya tidak cukup tahu tentang udevsaya akan memberikan halevtsolusi.

EDIT: setelah keringat yang serius, saya berhasil melakukannya udev. Lihat jawaban saya yang lain .

Saya akan gunakan vimuntuk mengedit file, tetapi jika Anda tidak tahu vimAnda bisa menggantinya dengan nanoatau gedit.

Instalasi terhenti

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

Menentukan peristiwa mana yang ingin Anda ikat ke skrip
Hentikan halevtdaemon yang sudah berjalan:

sudo /etc/init.d/halevt stop

Sekarang lihat apakah halevtdapat mengenali peristiwa tombol yang ingin Anda gunakan, mulai pendengar:

sudo -u halevt halevt -fig:plugdev

Sekarang tekan tombol fungsi di papan ketik yang ingin Anda ikat skrip. Saya tahu bahwa OP ingin mendapatkan kunci kecerahannya bekerja, jadi mari kita pergi dengan itu. Output untuk tombol kecerahan akan terlihat seperti ini:

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)

Anda dapat melihat bahwa brightness-downdan brightness-upperistiwa ditransmisikan.

Bind event ke skrip
Sekarang edit file /etc/halevt/halevt.xml:

sudo vim /etc/halevt/halevt.xml

dan tambahkan baris berikut (saya melakukannya di bagian bawah, tepat sebelum </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>

di mana tentu saja Anda harus mengubah valueke acara yang Anda dapatkan dari pendengar, dan execdengan perintah yang ingin Anda jalankan.

Berikan izin pengguna yang terhenti untuk melakukan perintah atau skrip
Karena halevtdaemon dijalankan sebagai halevtpengguna, Anda harus memberinya izin untuk melakukan apa yang Anda tentukan exec.

Jalankan (ingat untuk mengganti vimdengan editor pilihan Anda)

sudo EDITOR=vim visudo

dan tambahkan baris berikut di bagian bawah

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

dan simpan dan keluar.

Pastikan skrip Anda dapat dieksekusi

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

Mulai daemon yang terhenti lagi

sudo /etc/init.d/halevt start

Dan itu seharusnya bekerja!

Gerhard Burger
sumber
bekerja dengan sempurna. sekali lagi terima kasih atas jawaban yang tepat.
Remi
Sama-sama, lihat juga jawaban baru saya menggunakan udev. Tapi jangan ragu untuk tetap dengan solusi yang lain, yang penting itu berhasil;)
Gerhard Burger
E: Unable to locate package halevtpada 14,04.
umpirsky
Sejak Ubuntu 13.10 halevt tidak lagi disertakan ( packages.ubuntu.com/search?keywords=halevt )
Gerhard Burger
11

Solusi menggunakan udev

Karena HAL sudah usang dan udevsekarang digunakan, pendekatan ini lebih disukai daripada jawaban saya yang lain (walaupun saya pikir solusi menggunakan HAL lebih sederhana).

Namun untuk banyak tombol fungsi Anda cukup menggunakan Pengaturan Sistem> Keyboard> Pintasan untuk mengikat skrip, coba ini dulu! Ini menghemat banyak masalah. Misalnya, tombol kecerahan ini tidak berfungsi (saya tidak tahu mengapa tidak), jadi jika Anda ingin tahu cara mengubah perilaku misalnya tombol kecerahan, baca terus.

CATATAN : Jika Anda menjalankan notebook Samsung, Anda dapat memperbaiki semua tombol fungsi (tergantung model) dengan menginstal samsung-toolspaket dari http://www.voria.org/forum/

Howto ini mengasumsikan Anda tahu cara menggunakan terminal, dan menggunakan vimeditor. Jika Anda tidak tahu, vimharap ganti dengan perintah dengan salah satu geditatau nano.


Menentukan keyboard Anda

/lib/udev/findkeyboards

harus mencetak keyboard yang terhubung ke komputer, dalam kasus saya

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

Sekarang ada dua opsi:

  • Keyboard USB :
    Jika Anda ingin memetakan kembali keyboard USB Anda, periksa dengan menjalankan

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

    di mana Anda harus mengganti angka 9 dalam pernyataan awk dengan nomor yang benar. Outputnya harus sama dengan

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

    yang dengan benar menunjukkan bahwa keyboard saya ditangani melalui Logitech USB Receiver saya (input / event7 ternyata adalah mouse Logitech G9 saya yang memiliki beberapa tombol yang dapat diprogram).

  • Keyboard Laptop :
    Jika Anda ingin memetakan kembali keyboard laptop Anda, Anda harus mengingat angka AT keyboard4 di dalam kasus saya. Dapatkan juga informasi dmi untuk laptop Anda:

    cat /sys/class/dmi/id/sys_vendor
    

    yang ada dalam kasus saya

    SAMSUNG ELECTRONICS CO., LTD.
    

    dan

    cat /sys/class/dmi/id/product_name
    

    yang ada dalam kasus saya

    305U1A
    

Tentukan pemetaan Anda saat ini dari tombol fungsi Anda

Sekarang kita dapat menentukan penekanan tombol kita saat ini dengan mendengarkan keyboard (masukkan nomor yang benar)

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

Anda dapat keluar dari perintah ini dengan menggunakan Escdi keyboard, atau Ctrl+ cdi keyboard lain.

Jika layar Anda mulai bergulir sangat keras, tekan Escdan Ctrl+ cbeberapa kali dan coba lagi dengan

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

atau, jika Anda masih memiliki masalah pengguliran

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

Dalam kasus terakhir Anda masih akan memiliki scroll tetapi jika Anda menekan tombol fungsi mereka harus pergi ke ~/keymap.logtempat Anda dapat membacanya nanti.

Sekarang kita dapat memeriksa pemetaan saat tombol Fungsi Anda dengan menekan mereka, yang harus memberikan daftar seperti (ini saya Fn+ F1melalui 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

Sekarang tulis kode pindai yang ingin Anda ubah perilaku.


Mengubah kode kunci untuk kode pindai

Jika Anda melihat kode kunci dengan jelas tidak mencakup apa yang Anda harapkan dari kunci tersebut, Anda dapat melihat di /usr/include/linux/input.hbawah Tombol dan tombol untuk melihat apakah ada kode kunci yang lebih cocok dengan apa yang sebenarnya Anda inginkan terjadi. Kode kunci ada dalam format KEY_KEYCODEdan Anda harus menuliskan bagian setelah KEY_dalam huruf kecil. Terkadang mengubah ini sudah cukup untuk menyelesaikan masalah.

Namun tombol kecerahan seringkali memiliki kode kunci yang tepat yang terkait dengannya, dan inilah yang tidak memungkinkannya untuk dipetakan kembali. Jadi kita perlu mengubahnya ke kode kunci lain. Kami akan menggunakan prog1dan prog2untuk contoh ini karena ini tidak digunakan di komputer saya, namun Anda juga dapat menggunakan f13melalui f24, atau f20melalui f24jika Anda memiliki keyboard Apple yang memiliki F1melalui F19tombol.

  1. Buat custom keymap :
    Buat file keymap di direktori /lib/udev/keymapsdengan nama yang cocok, lihat output ls /lib/udev/keymapsuntuk melihat nama yang cocok. Saya pergi dengan custom-brightnesstujuan dari pertanyaan ini.

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

    dan masukkan kode pindaian dari tombol yang ingin Anda ubah diikuti oleh scancode yang Anda inginkan. custom-brightnessPenampilan saya seperti ini:

    # /lib/udev/keymaps/custom-brightness
    
    0x89 prog1
    0x88 prog2
    
  2. Buat file rilis kunci khusus. Hanya jika Anda
    mengganti keyboard laptop Anda : Terkadang acara pelepasan kunci tidak terkirim dengan benar, menyebabkan komputer macet. Untuk menghindari ini, kami juga akan menulis file rilis kunci khusus

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

    file ini harus berisi kode pindai yang sama, seperti milik saya

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

Pastikan bahwa pemetaan baru dimuat dalam file aturan
Sekarang kita perlu memastikan bahwa pemetaan Anda dimuat. Kita dapat melakukan ini dengan mengedit /lib/udev/rules.d/95-keymap.rules, jadi pintar untuk membuat cadangan

Sekali lagi kami memiliki dua opsi:

  • Keyboard USB :
    Karena Anda memiliki keyboard USB, Anda harus menambahkan entri Anda di bawah LABEL="keyboard_usbcheck"dan itu harus melewati entri lain dari produsen keyboard Anda. Ini karena keyboard saya dengan

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

    sudah dicocokkan dengan salah satu aturan, dan jika tidak maka akan ditimpa.
    Tambahkan aturan berikut, di mana Anda harus mengubah ID_VENDOR_IDdan ID_MODEL_IDdan nama keymap Anda dengan tepat

    ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
    
  • Keyboard laptop :
    Jika /lib/udev/findkeyboardsdilaporkan keyboard laptop AT keyboardAnda sebagai aturan Anda harus di bawah LABEL="keyboard_vendorcheck", jika tidak, letakkan di bawah LABEL="keyboard_modulecheck". Sekali lagi letakkan di bawah entri lain untuk produsen laptop Anda. Tambahkan aturan berikut ( SAMSUNG ELECTRONICS CO., LTD.agak panjang jadi saya menggunakan wildcard`)

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

    Sekarang juga tambahkan aturan /lib/udev/rules.d/95-keyboard-force-release.rulessetelah mencadangkannya

    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
    

    Lagi di bawah entri lain dari pabrikan Anda tambahkan

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

Pastikan udev memuat aturan baru
Untuk memuat aturan baru berjalan

sudo adevadm trigger

CATATAN: udevadm control --reload-rules(masih dalam instruksi di banyak situs web) tidak berfungsi.

Sekarang periksa apakah aturan berhasil diterapkan oleh

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

yang sekarang seharusnya melaporkan untuk tombol kecerahan

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

Memetakan kembali kunci dalam Pengaturan Sistem
Jika langkah terakhir melaporkan kode kunci yang benar, salah satu kunci mulai bekerja secara otomatis (jika mereka pertama kali memiliki kode kunci yang salah).

Untuk kecerahan Anda masih harus mengikat tombol ke skrip yang sekarang mungkin menggunakan Pengaturan Sistem> Keyboard> Pintasan .

Nikmati



Catatan :

  • Jika kunci Anda salah kode kunci dan diperbaiki dengan pendekatan ini, silakan ikuti petunjuk di /usr/share/doc/udev/README.keymap.txt.gz(Anda dapat membuka ini tanpa mengekstraksi menggunakan zless) dan mengirimkan hasil Anda alamat email yang disebutkan di sana, maka perubahan dapat dimasukkan dalam rilis berikutnya. Banyak pengguna akan mendapat manfaat!

  • Terima kasih banyak untuk posting bermanfaat ini oleh Vaidas Jablonskis.

Gerhard Burger
sumber
1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directoryjuga$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky
Terima kasih atas komentar Anda, saya melihat ke dalamnya dan tampaknya udev akan digabungkan ke dalam systemd dan pengaturan keymap akan dikelola di hwdb sebagai gantinya. Menurut bbs.archlinux.org/viewtopic.php?id=168720 dimungkinkan untuk mengekstrak papan ketik dari versi systemd yang lebih lama, tetapi saya tidak yakin sisa jawabannya masih berlaku ...
Gerhard Burger