mirror of
https://github.com/systemd/systemd.git
synced 2025-03-28 02:50:16 +03:00
switch from udev keymaps to hwdb
This commit is contained in:
parent
7080ea16b5
commit
ddc77f6224
1
.gitignore
vendored
1
.gitignore
vendored
@ -12,7 +12,6 @@
|
||||
/hostnamectl
|
||||
/install-tree
|
||||
/journalctl
|
||||
/keymap
|
||||
/libtool
|
||||
/localectl
|
||||
/loginctl
|
||||
|
137
Makefile.am
137
Makefile.am
@ -2154,7 +2154,8 @@ dist_udevhwdb_DATA = \
|
||||
hwdb/20-usb-classes.hwdb \
|
||||
hwdb/20-bluetooth-vendor-product.hwdb \
|
||||
hwdb/20-acpi-vendor.hwdb \
|
||||
hwdb/20-OUI.hwdb
|
||||
hwdb/20-OUI.hwdb \
|
||||
hwdb/60-keyboard.hwdb
|
||||
|
||||
udevconfdir = $(sysconfdir)/udev
|
||||
dist_udevconf_DATA = \
|
||||
@ -2602,140 +2603,6 @@ EXTRA_DIST += \
|
||||
src/gudev/seed-example-enum.js \
|
||||
src/gudev/seed-example.js
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
if ENABLE_KEYMAP
|
||||
keymap_SOURCES = \
|
||||
src/udev/keymap/keymap.c
|
||||
|
||||
keymap_CPPFLAGS = \
|
||||
$(AM_CPPFLAGS) -I src/udev/keymap
|
||||
|
||||
keymap_LDADD = \
|
||||
libsystemd-shared.la
|
||||
|
||||
nodist_keymap_SOURCES = \
|
||||
src/udev/keymap/keys-from-name.h \
|
||||
src/udev/keymap/keys-to-name.h
|
||||
|
||||
BUILT_SOURCES += \
|
||||
$(nodist_keymap_SOURCES)
|
||||
|
||||
udevlibexec_PROGRAMS += \
|
||||
keymap
|
||||
|
||||
dist_doc_DATA += \
|
||||
src/udev/keymap/README.keymap.txt
|
||||
|
||||
dist_udevrules_DATA += \
|
||||
src/udev/keymap/95-keymap.rules \
|
||||
src/udev/keymap/95-keyboard-force-release.rules
|
||||
|
||||
dist_udevhome_SCRIPTS = \
|
||||
src/udev/keymap/findkeyboards \
|
||||
src/udev/keymap/keyboard-force-release.sh
|
||||
|
||||
TESTS += \
|
||||
src/udev/keymap/check-keymaps.sh
|
||||
|
||||
CLEANFILES += \
|
||||
src/udev/keymap/keys.txt \
|
||||
src/udev/keymap/keys-from-name.gperf \
|
||||
src/udev/keymap/keyboard-force-release.sh
|
||||
|
||||
udevkeymapdir = $(udevlibexecdir)/keymaps
|
||||
dist_udevkeymap_DATA = \
|
||||
keymaps/acer \
|
||||
keymaps/acer-aspire_5720 \
|
||||
keymaps/acer-aspire_8930 \
|
||||
keymaps/acer-aspire_5920g \
|
||||
keymaps/acer-aspire_6920 \
|
||||
keymaps/acer-travelmate_c300 \
|
||||
keymaps/asus \
|
||||
keymaps/compaq-e_evo \
|
||||
keymaps/dell \
|
||||
keymaps/dell-latitude-xt2 \
|
||||
keymaps/everex-xt5000 \
|
||||
keymaps/fujitsu-amilo_li_2732 \
|
||||
keymaps/fujitsu-amilo_pa_2548 \
|
||||
keymaps/fujitsu-amilo_pro_edition_v3505 \
|
||||
keymaps/fujitsu-amilo_pro_v3205 \
|
||||
keymaps/fujitsu-amilo_si_1520 \
|
||||
keymaps/fujitsu-esprimo_mobile_v5 \
|
||||
keymaps/fujitsu-esprimo_mobile_v6 \
|
||||
keymaps/genius-slimstar-320 \
|
||||
keymaps/hewlett-packard \
|
||||
keymaps/hewlett-packard-2510p_2530p \
|
||||
keymaps/hewlett-packard-compaq_elitebook \
|
||||
keymaps/hewlett-packard-pavilion \
|
||||
keymaps/hewlett-packard-presario-2100 \
|
||||
keymaps/hewlett-packard-tablet \
|
||||
keymaps/hewlett-packard-tx2 \
|
||||
keymaps/hewlett-packard_elitebook-8440p \
|
||||
keymaps/hewlett-packard_elitebook-8460p \
|
||||
keymaps/hewlett-packard-hdx9494nr \
|
||||
keymaps/ibm-thinkpad-usb-keyboard-trackpoint \
|
||||
keymaps/inventec-symphony_6.0_7.0 \
|
||||
keymaps/lenovo-3000 \
|
||||
keymaps/lenovo-ideapad \
|
||||
keymaps/lenovo-thinkpad-usb-keyboard-trackpoint \
|
||||
keymaps/lenovo-thinkpad_x6_tablet \
|
||||
keymaps/lenovo-thinkpad_x200_tablet \
|
||||
keymaps/lg-x110 \
|
||||
keymaps/logitech-usb \
|
||||
keymaps/logitech-wave \
|
||||
keymaps/logitech-wave-cordless \
|
||||
keymaps/logitech-wave-pro-cordless \
|
||||
keymaps/maxdata-pro_7000 \
|
||||
keymaps/medion-fid2060 \
|
||||
keymaps/medionnb-a555 \
|
||||
keymaps/micro-star \
|
||||
keymaps/module-ibm \
|
||||
keymaps/module-lenovo \
|
||||
keymaps/module-sony \
|
||||
keymaps/module-sony-old \
|
||||
keymaps/module-sony-vgn \
|
||||
keymaps/module-sony-vpc \
|
||||
keymaps/olpc-xo \
|
||||
keymaps/onkyo \
|
||||
keymaps/oqo-model2 \
|
||||
keymaps/samsung-other \
|
||||
keymaps/samsung-series-9 \
|
||||
keymaps/samsung-series-3 \
|
||||
keymaps/samsung-sq1us \
|
||||
keymaps/samsung-sx20s \
|
||||
keymaps/toshiba-satellite_a100 \
|
||||
keymaps/toshiba-satellite_a110 \
|
||||
keymaps/toshiba-satellite_m30x \
|
||||
keymaps/zepto-znote
|
||||
|
||||
udevkeymapforcereldir = $(udevlibexecdir)/keymaps/force-release
|
||||
dist_udevkeymapforcerel_DATA = \
|
||||
keymaps-force-release/dell-touchpad \
|
||||
keymaps-force-release/dell-xps \
|
||||
keymaps-force-release/hp-other \
|
||||
keymaps-force-release/samsung-other \
|
||||
keymaps-force-release/samsung-series-9 \
|
||||
keymaps-force-release/samsung-series-3 \
|
||||
keymaps-force-release/common-volume-keys
|
||||
|
||||
src/udev/keymap/keys.txt: Makefile
|
||||
$(AM_V_at)$(MKDIR_P) $(dir $@)
|
||||
$(AM_V_GEN)$(CPP) $(CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) -dM -include linux/input.h - < /dev/null | $(AWK) '/^#define[ \t]+KEY_[^ ]+[ \t]+[0-9]/ { if ($$2 != "KEY_MAX") { print $$2 } }' | sed 's/^KEY_COFFEE$$/KEY_SCREENLOCK/' > $@
|
||||
|
||||
src/udev/keymap/keys-from-name.gperf: src/udev/keymap/keys.txt Makefile
|
||||
$(AM_V_GEN)$(AWK) 'BEGIN{ print "struct key { const char* name; unsigned short id; };"; print "%null-strings"; print "%%";} { print $$1 ", " $$1 }' < $< > $@
|
||||
|
||||
src/udev/keymap/keys-from-name.h: src/udev/keymap/keys-from-name.gperf Makefile
|
||||
$(AM_V_GPERF)$(GPERF) -L ANSI-C -t --ignore-case -N lookup_key -H hash_key_name -p -C < $< > $@
|
||||
|
||||
src/udev/keymap/keys-to-name.h: src/udev/keymap/keys.txt Makefile
|
||||
$(AM_V_GEN)$(AWK) 'BEGIN{ print "const char* const key_names[KEY_CNT] = { "} { print "[" $$1 "] = \"" $$1 "\"," } END{print "};"}' < $< > $@
|
||||
endif
|
||||
|
||||
EXTRA_DIST += \
|
||||
src/udev/keymap/check-keymaps.sh \
|
||||
src/udev/keymap/keyboard-force-release.sh.in
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
mtd_probe_SOURCES = \
|
||||
src/udev/mtd_probe/mtd_probe.c \
|
||||
|
15
configure.ac
15
configure.ac
@ -830,21 +830,6 @@ AS_IF([test "x$enable_gudev" = "xyes"], [ PKG_CHECK_MODULES([GLIB], [glib-2.0 >=
|
||||
AM_CONDITIONAL([ENABLE_GUDEV], [test "x$enable_gudev" = "xyes"])
|
||||
AS_IF([test "x$enable_gudev" = "xyes"], [ AC_DEFINE(HAVE_GLIB, 1, [Define if glib is available]) ])
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
AC_ARG_ENABLE([keymap],
|
||||
AS_HELP_STRING([--disable-keymap], [disable keymap fixup support @<:@default=enabled@:>@]),
|
||||
[], [enable_keymap=yes])
|
||||
AS_IF([test "x$enable_keymap" = "xyes"], [
|
||||
AC_PATH_PROG([GPERF], [gperf])
|
||||
if test -z "$GPERF"; then
|
||||
AC_MSG_ERROR([gperf is needed])
|
||||
fi
|
||||
|
||||
AC_CHECK_HEADER([linux/input.h], [:], AC_MSG_ERROR([kernel headers not found]))
|
||||
AC_SUBST([INCLUDE_PREFIX], [$(echo '#include <linux/input.h>' | eval $ac_cpp -E - | sed -n '/linux\/input.h/ {s:.*"\(.*\)/linux/input.h".*:\1:; p; q}')])
|
||||
])
|
||||
AM_CONDITIONAL([ENABLE_KEYMAP], [test "x$enable_keymap" = "xyes"])
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
have_manpages=no
|
||||
AC_ARG_ENABLE(manpages, AS_HELP_STRING([--disable-manpages], [disable manpages]))
|
||||
|
@ -448,7 +448,7 @@ keyboard:name:ThinkPad Extra Buttons:dmi:bvn*:bvr*:bd*:svnIBM*:pn*:pvr*
|
||||
KEYBOARD_KEY_17=prog1 # ThinkPad/ThinkVantage button (high keycode: "vendor")
|
||||
|
||||
# IBM Thinkpad USB Keyboard Trackpoint
|
||||
usb:v04B3p301[89]*
|
||||
keyboard:usb:v04B3p301[89]*
|
||||
KEYBOARD_KEY_900f0=screenlock
|
||||
KEYBOARD_KEY_900f1=wlan
|
||||
KEYBOARD_KEY_900f2=switchvideomode
|
||||
|
22
keymaps/acer
22
keymaps/acer
@ -1,22 +0,0 @@
|
||||
0xA5 help # Fn+F1
|
||||
0xA6 setup # Fn+F2 Acer eSettings
|
||||
0xA7 battery # Fn+F3 Power Management
|
||||
0xA9 switchvideomode # Fn+F5
|
||||
0xB3 euro
|
||||
0xB4 dollar
|
||||
0xCE brightnessup # Fn+Right
|
||||
0xD4 bluetooth # (toggle) off-to-on
|
||||
0xD5 wlan # (toggle) on-to-off
|
||||
0xD6 wlan # (toggle) off-to-on
|
||||
0xD7 bluetooth # (toggle) on-to-off
|
||||
0xD8 bluetooth # (toggle) off-to-on
|
||||
0xD9 brightnessup # Fn+Right
|
||||
0xEE brightnessup # Fn+Right
|
||||
0xEF brightnessdown # Fn+Left
|
||||
0xF1 f22 # Fn+F7 Touchpad toggle (off-to-on)
|
||||
0xF2 f23 # Fn+F7 Touchpad toggle (on-to-off)
|
||||
0xF3 prog2 # "P2" programmable button
|
||||
0xF4 prog1 # "P1" programmable button
|
||||
0xF5 presentation
|
||||
0xF8 fn
|
||||
0xF9 f23 # Launch NTI shadow
|
@ -1,5 +0,0 @@
|
||||
0x84 bluetooth # sent when bluetooth module missing, and key pressed
|
||||
0x92 media # Acer arcade
|
||||
0xD4 bluetooth # Bluetooth on
|
||||
0xD9 bluetooth # Bluetooth off
|
||||
0xF4 prog3 # e-key
|
@ -1,5 +0,0 @@
|
||||
0x8A media
|
||||
0x92 media
|
||||
0xA6 setup
|
||||
0xB2 www
|
||||
0xD9 bluetooth # (toggle) on-to-off
|
@ -1,5 +0,0 @@
|
||||
0xD9 bluetooth # (toggle) on-to-off
|
||||
0x92 media
|
||||
0x9E back
|
||||
0x83 rewind
|
||||
0x89 fastforward
|
@ -1,5 +0,0 @@
|
||||
0xCA prog3 # key 'HOLD' on CineDash Media Console
|
||||
0x83 rewind
|
||||
0x89 fastforward
|
||||
0x92 media # key 'ARCADE' on CineDash Media Console
|
||||
0x9E back
|
@ -1,5 +0,0 @@
|
||||
0x67 f24 # FIXME: rotate screen
|
||||
0x68 up
|
||||
0x69 down
|
||||
0x6B fn
|
||||
0x6C screenlock # FIXME: lock tablet device/buttons
|
@ -1,3 +0,0 @@
|
||||
0xED volumeup
|
||||
0xEE volumedown
|
||||
0xEF mute
|
@ -1,4 +0,0 @@
|
||||
0xA3 www # I key
|
||||
0x9A search
|
||||
0x9E email
|
||||
0x9F homepage
|
29
keymaps/dell
29
keymaps/dell
@ -1,29 +0,0 @@
|
||||
0x81 playpause # Play/Pause
|
||||
0x82 stopcd # Stop
|
||||
0x83 previoussong # Previous song
|
||||
0x84 nextsong # Next song
|
||||
0x85 brightnessdown # Fn+Down Brightness Down
|
||||
0x86 brightnessup # Fn+Up Brightness Up
|
||||
0x87 battery # Fn+F3 battery icon
|
||||
0x88 unknown # Fn+F2 Turn On/Off Wireless - handled in hardware
|
||||
0x89 ejectclosecd # Fn+F10 Eject CD
|
||||
0x8A suspend # Fn+F1 hibernate
|
||||
0x8B switchvideomode # Fn+F8 CRT/LCD (high keycode: "displaytoggle")
|
||||
0x8C f23 # Fn+Right Auto Brightness
|
||||
0x8F switchvideomode # Fn+F7 aspect ratio
|
||||
0x90 previoussong # Front panel previous song
|
||||
0x91 prog1 # Wi-Fi Catcher (Dell-specific)
|
||||
0x92 media # MediaDirect button (house icon)
|
||||
0x93 f23 # FIXME Fn+Left Auto Brightness
|
||||
0x95 camera # Shutter button - Takes a picture if optional camera available
|
||||
0x97 email # Tablet email button
|
||||
0x98 f21 # FIXME: Tablet screen rotation
|
||||
0x99 nextsong # Front panel next song
|
||||
0x9A setup # Tablet tools button
|
||||
0x9B switchvideomode # Display toggle button
|
||||
0x9E f21 # Touchpad toggle
|
||||
0xA2 playpause # Front panel play/pause
|
||||
0xA4 stopcd # Front panel stop
|
||||
0xED media # MediaDirect button
|
||||
0xD8 screenlock # FIXME: Tablet lock button
|
||||
0xD9 f21 # Touchpad toggle
|
@ -1,4 +0,0 @@
|
||||
0x9B up # tablet rocker up
|
||||
0x9E enter # tablet rocker press
|
||||
0x9F back # tablet back
|
||||
0xA3 down # tablet rocker down
|
@ -1,7 +0,0 @@
|
||||
0x5C media
|
||||
0x65 f21 # Fn+F5 Touchpad toggle
|
||||
0x67 prog3 # Fan speed control button
|
||||
0x6F brightnessup
|
||||
0x7F brightnessdown
|
||||
0xB2 www
|
||||
0xEC mail
|
@ -1,3 +0,0 @@
|
||||
0xD9 brightnessdown # Fn+F8 brightness down
|
||||
0xEF brightnessup # Fn+F9 brightness up
|
||||
0xA9 switchvideomode # Fn+F10 Cycle between available video outputs
|
@ -1,3 +0,0 @@
|
||||
0xE0 volumedown
|
||||
0xE1 volumeup
|
||||
0xE5 prog1
|
@ -1,4 +0,0 @@
|
||||
0xA5 help # Fn+F1
|
||||
0xA9 switchvideomode # Fn+F3
|
||||
0xD9 brightnessdown # Fn+F8
|
||||
0xE0 brightnessup # Fn+F9
|
@ -1,2 +0,0 @@
|
||||
0xF4 f21 # FIXME: silent-mode decrease CPU/GPU clock
|
||||
0xF7 switchvideomode # Fn+F3
|
@ -1,6 +0,0 @@
|
||||
0xE1 wlan
|
||||
0xF3 wlan
|
||||
0xEE brightnessdown
|
||||
0xE0 brightnessup
|
||||
0xE2 bluetooth
|
||||
0xF7 video
|
@ -1,4 +0,0 @@
|
||||
0xA9 switchvideomode
|
||||
0xD9 brightnessdown
|
||||
0xDF sleep
|
||||
0xEF brightnessup
|
@ -1,2 +0,0 @@
|
||||
0xCE brightnessup
|
||||
0xEF brightnessdown
|
@ -1,35 +0,0 @@
|
||||
# Genius SlimStar 320
|
||||
#
|
||||
# Only buttons which are not properly mapped yet are configured below
|
||||
|
||||
# "Scroll wheel", a circular up/down/left/right button. Aimed for scolling,
|
||||
# but since there are no scrollleft/scrollright, let's map to back/forward.
|
||||
0x900f0 scrollup
|
||||
0x900f1 scrolldown
|
||||
0x900f3 back
|
||||
0x900f2 forward
|
||||
|
||||
# Multimedia buttons, left side (from left to right)
|
||||
# [W]
|
||||
0x900f5 wordprocessor
|
||||
# [Ex]
|
||||
0x900f6 spreadsheet
|
||||
# [P]
|
||||
0x900f4 presentation
|
||||
# Other five (calculator, playpause, stop, mute and eject) are OK
|
||||
|
||||
# Right side, from left to right
|
||||
# [e]
|
||||
0xc0223 www
|
||||
# "man"
|
||||
0x900f7 chat
|
||||
# "Y"
|
||||
0x900fb prog1
|
||||
# [X]
|
||||
0x900f8 close
|
||||
# "picture"
|
||||
0x900f9 graphicseditor
|
||||
# "two windows"
|
||||
0x900fd scale
|
||||
# "lock"
|
||||
0x900fc screenlock
|
@ -1,12 +0,0 @@
|
||||
0x81 fn_esc
|
||||
0x89 battery # Fn+F8
|
||||
0x8A screenlock # Fn+F6
|
||||
0x8B camera
|
||||
0x8C media # music
|
||||
0x8E dvd
|
||||
0xB1 help
|
||||
0xB3 f23 # FIXME: Auto brightness
|
||||
0xD7 wlan
|
||||
0x92 brightnessdown # Fn+F7 (Fn+F9 on 6730b)
|
||||
0x97 brightnessup # Fn+F8 (Fn+F10 on 6730b)
|
||||
0xEE switchvideomode # Fn+F4
|
@ -1,2 +0,0 @@
|
||||
0xD8 f23 # touchpad off
|
||||
0xD9 f22 # touchpad on
|
@ -1,2 +0,0 @@
|
||||
0x88 presentation
|
||||
0xD9 help # I key (high keycode: "info")
|
@ -1,3 +0,0 @@
|
||||
0xB2 www # Fn+F3
|
||||
0xD8 f23 # touchpad off
|
||||
0xD9 f22 # touchpad on
|
@ -1,3 +0,0 @@
|
||||
0x88 media # FIXME: quick play
|
||||
0xD8 f23 # touchpad off
|
||||
0xD9 f22 # touchpad on
|
@ -1,3 +0,0 @@
|
||||
0xF0 help
|
||||
0xF1 screenlock
|
||||
0xF3 search
|
@ -1,6 +0,0 @@
|
||||
0x82 prog2 # Funny Key
|
||||
0x83 prog1 # Q
|
||||
0x84 tab
|
||||
0x85 esc
|
||||
0x86 pageup
|
||||
0x87 pagedown
|
@ -1,3 +0,0 @@
|
||||
0xC2 media
|
||||
0xD8 f23 # Toggle touchpad button on tx2 (OFF)
|
||||
0xD9 f22 # Toggle touchpad button on tx2 (ON)
|
@ -1,5 +0,0 @@
|
||||
0x88 www
|
||||
0xA0 mute
|
||||
0xAE volumedown
|
||||
0xB0 volumeup
|
||||
0xEC mail
|
@ -1,3 +0,0 @@
|
||||
0xF8 wlan # Wireless HW switch button
|
||||
0xB3 prog1 # Fn+F11 - Ambient Light Sensor button
|
||||
0xB1 prog2 # Fn+ESC - System information button
|
@ -1,7 +0,0 @@
|
||||
0x900f0 screenlock
|
||||
0x900f1 wlan
|
||||
0x900f2 switchvideomode
|
||||
0x900f3 suspend
|
||||
0x900f4 brightnessup
|
||||
0x900f5 brightnessdown
|
||||
0x900f8 zoom
|
@ -1,2 +0,0 @@
|
||||
0xF3 prog2
|
||||
0xF4 prog1
|
@ -1,5 +0,0 @@
|
||||
0x8B switchvideomode # Fn+F7 video
|
||||
0x96 wlan # Fn+F5 wireless
|
||||
0x97 sleep # Fn+F4 suspend
|
||||
0x98 suspend # Fn+F12 hibernate
|
||||
0xB4 prog1 # Lenovo Care
|
@ -1,8 +0,0 @@
|
||||
# Key codes observed on S10-3, assumed valid on other IdeaPad models
|
||||
0x81 rfkill # does nothing in BIOS
|
||||
0x83 display_off # BIOS toggles screen state
|
||||
0xB9 brightnessup # does nothing in BIOS
|
||||
0xBA brightnessdown # does nothing in BIOS
|
||||
0xF1 camera # BIOS toggles camera power
|
||||
0xf2 f21 # touchpad toggle (key alternately emits F2 and F3)
|
||||
0xf3 f21
|
@ -1,13 +0,0 @@
|
||||
0x90012 screenlock # Fn+F2
|
||||
0x90013 battery # Fn+F3
|
||||
0x90014 wlan # Fn+F5
|
||||
0x90016 switchvideomode # Fn+F7
|
||||
0x90017 f21 # Fn+F8 touchpad toggle
|
||||
0x90019 suspend # Fn+F12
|
||||
0x9001A brightnessup # Fn+Home
|
||||
0x9001B brightnessdown # Fn+End
|
||||
0x9001D zoom # Fn+Space
|
||||
0x90011 prog1 # ThinkVantage button
|
||||
|
||||
0x90015 camera # Fn+F6 headset/camera VoIP key ??
|
||||
0x90010 f20 # Microphone mute button; should be micmute, but see https://mail.gnome.org/archives/commits-list/2013-January/msg05822.html
|
@ -1,6 +0,0 @@
|
||||
0x5D menu
|
||||
0x63 fn
|
||||
0x66 screenlock
|
||||
0x67 cyclewindows # bezel circular arrow
|
||||
0x68 setup # bezel setup / menu
|
||||
0x6c direction # rotate screen
|
@ -1,8 +0,0 @@
|
||||
0x6C f21 # rotate
|
||||
0x68 screenlock # screenlock
|
||||
0x6B esc # escape
|
||||
0x6D right # right on d-pad
|
||||
0x6E left # left on d-pad
|
||||
0x71 up # up on d-pad
|
||||
0x6F down # down on d-pad
|
||||
0x69 enter # enter on d-pad
|
@ -1,12 +0,0 @@
|
||||
0xA0 mute # Fn+F9
|
||||
0xAE volumedown # Fn+Left
|
||||
0xAF search # Fn+F3
|
||||
0xB0 volumeup # Fn+Right
|
||||
0xB1 battery # Fn+F10 Info
|
||||
0xB3 suspend # Fn+F12
|
||||
0xDF sleep # Fn+F4
|
||||
# 0xE2 bluetooth # satellite dish2
|
||||
0xE4 f21 # Fn+F5 Touchpad toggle
|
||||
0xF6 wlan # Fn+F6
|
||||
0xF7 reserved # Fn+Down brightness down
|
||||
0xF8 reserved # Fn+Up brightness up
|
@ -1,6 +0,0 @@
|
||||
0x90001 shop # Shopping
|
||||
0x90002 config # iTouch
|
||||
0x90003 finance # Finance
|
||||
0x90004 prog1 # My Sites
|
||||
0x90005 prog2 # Community
|
||||
0xC0183 media # Media
|
@ -1,16 +0,0 @@
|
||||
0x9001C scale # expo
|
||||
0x9001F zoomout # zoom out
|
||||
0x90020 zoomin # zoom in
|
||||
0x9003D prog1 # gadget
|
||||
0x90005 camera # camera
|
||||
0x90018 media # media center
|
||||
0x90041 wordprocessor # Fn+F1 (Word)
|
||||
0x90042 spreadsheet # Fn+F2 (Excel)
|
||||
0x90043 calendar # Fn+F3 (calendar)
|
||||
0x90044 prog2 # Fn+F4 (program a)
|
||||
0x90045 prog3 # Fn+F5 (program b)
|
||||
0x90046 prog4 # Fn+F6 (program c)
|
||||
0x90048 messenger # Fn+F8 (MSN messenger)
|
||||
0x9002D find # Fn+F10 (search www)
|
||||
0x9004B search # Fn+F11 (search PC)
|
||||
0x9004C ejectclosecd # Fn+F12 (eject)
|
@ -1,15 +0,0 @@
|
||||
0xD4 zoomin
|
||||
0xCC zoomout
|
||||
0xC0183 media
|
||||
0xC1005 camera
|
||||
0xC101F zoomout
|
||||
0xC1020 zoomin
|
||||
0xC1041 wordprocessor
|
||||
0xC1042 spreadsheet
|
||||
0xC1043 calendar
|
||||
0xC1044 prog2 # Fn+F4 (program a)
|
||||
0xC1045 prog3 # Fn+F5 (program b)
|
||||
0xC1046 prog4 # Fn+F6 (program c)
|
||||
0xC1048 messenger
|
||||
0xC104A find # Fn+F10 (search www)
|
||||
0xC104C ejectclosecd
|
@ -1,12 +0,0 @@
|
||||
0xC01B6 camera
|
||||
0xC0183 media
|
||||
0xC0184 wordprocessor
|
||||
0xC0186 spreadsheet
|
||||
0xC018E calendar
|
||||
0xC0223 homepage
|
||||
0xC01BC messenger
|
||||
0xC018A mail
|
||||
0xC0221 search
|
||||
0xC00B8 ejectcd
|
||||
0xC022D zoomin
|
||||
0xC022E zoomout
|
@ -1,9 +0,0 @@
|
||||
0x97 prog2
|
||||
0x9F prog1
|
||||
0xA0 mute # Fn+F5
|
||||
0x82 www
|
||||
0xEC email
|
||||
0xAE volumedown # Fn+Down
|
||||
0xB0 volumeup # Fn+Up
|
||||
0xDF suspend # Fn+F2
|
||||
0xF5 help
|
@ -1,2 +0,0 @@
|
||||
0x6B channeldown # Thottle Down
|
||||
0x6D channelup # Thottle Up
|
@ -1,4 +0,0 @@
|
||||
0x63 www # N button
|
||||
0x66 prog1 # link 1 button
|
||||
0x67 email # envelope button
|
||||
0x69 prog2 # link 2 button
|
@ -1,13 +0,0 @@
|
||||
0xA0 mute # Fn+F9
|
||||
0xAE volumedown # Fn+F7
|
||||
0xB0 volumeup # Fn+F8
|
||||
0xB2 www # e button
|
||||
0xDF sleep # Fn+F12
|
||||
0xE2 bluetooth # satellite dish2
|
||||
0xE4 f21 # Fn+F3 Touchpad disable
|
||||
0xEC email # envelope button
|
||||
0xEE camera # Fn+F6 camera disable
|
||||
0xF6 wlan # satellite dish1
|
||||
0xF7 brightnessdown # Fn+F4
|
||||
0xF8 brightnessup # Fn+F5
|
||||
0xF9 search
|
@ -1,16 +0,0 @@
|
||||
0x01 battery # Fn+F2
|
||||
0x02 screenlock # Fn+F3
|
||||
0x03 sleep # Fn+F4
|
||||
0x04 wlan # Fn+F5
|
||||
0x06 switchvideomode # Fn+F7
|
||||
0x07 zoom # Fn+F8 screen expand
|
||||
0x08 f24 # Fn+F9 undock
|
||||
0x0B suspend # Fn+F12
|
||||
0x0F brightnessup # Fn+Home
|
||||
0x10 brightnessdown # Fn+End
|
||||
0x11 kbdillumtoggle # Fn+PgUp - ThinkLight
|
||||
0x13 zoom # Fn+Space
|
||||
0x14 volumeup
|
||||
0x15 volumedown
|
||||
0x16 mute
|
||||
0x17 prog1 # ThinkPad/ThinkVantage button (high keycode: "vendor")
|
@ -1,17 +0,0 @@
|
||||
0x1 screenlock # Fn+F2
|
||||
0x2 battery # Fn+F3
|
||||
0x3 sleep # Fn+F4
|
||||
0x4 wlan # Fn+F5
|
||||
0x6 switchvideomode # Fn+F7
|
||||
0x7 f21 # Fn+F8 touchpadtoggle
|
||||
0x8 f24 # Fn+F9 undock
|
||||
0xB suspend # Fn+F12
|
||||
0xF brightnessup # Fn+Home
|
||||
0x10 brightnessdown # Fn+End
|
||||
0x11 kbdillumtoggle # Fn+PgUp - ThinkLight
|
||||
0x13 zoom # Fn+Space
|
||||
0x14 volumeup
|
||||
0x15 volumedown
|
||||
0x16 mute
|
||||
0x17 prog1 # ThinkPad/ThinkVantage button (high keycode: "vendor")
|
||||
0x1A f20 # Microphone mute button; should be micmute, but see https://mail.gnome.org/archives/commits-list/2013-January/msg05822.html
|
@ -1,8 +0,0 @@
|
||||
0x06 mute # Fn+F2
|
||||
0x07 volumedown # Fn+F3
|
||||
0x08 volumeup # Fn+F4
|
||||
0x09 brightnessdown # Fn+F5
|
||||
0x0A brightnessup # Fn+F6
|
||||
0x0B switchvideomode # Fn+F7
|
||||
0x0E zoom # Fn+F10
|
||||
0x10 suspend # Fn+F12
|
@ -1,2 +0,0 @@
|
||||
0x06 battery
|
||||
0x07 mute
|
@ -1,8 +0,0 @@
|
||||
0x00 brightnessdown # Fn+F5
|
||||
0x10 brightnessup # Fn+F6
|
||||
0x11 switchvideomode # Fn+F7
|
||||
0x12 zoomout
|
||||
0x14 zoomin
|
||||
0x15 suspend # Fn+F12
|
||||
0x17 prog1
|
||||
0x20 media
|
@ -1,4 +0,0 @@
|
||||
# 0x05 touchpad_toggle # fn_f1 -> KEY_TOUCHPAD_TOGGLE
|
||||
0x05 f21 # fn_f1 -> KEY_F21 (The actual touchpad toggle)
|
||||
0x0d zoomout # fn_f9
|
||||
0x0e zoomin # fn_f10
|
@ -1,74 +0,0 @@
|
||||
0x59 fn
|
||||
0x81 fn_esc
|
||||
0xF9 camera
|
||||
0xF8 sound # Fn+CAMERA = Mic
|
||||
|
||||
|
||||
# Function key mappings, as per
|
||||
# http://dev.laptop.org/ticket/10213#comment:20
|
||||
#
|
||||
# Unmodified F1-F8 produce F1-F8, so no remap necessary.
|
||||
# Unmodified F9-F12 control brightness and volume.
|
||||
0x43 brightnessdown
|
||||
0x44 brightnessup
|
||||
0x57 volumedown
|
||||
0x58 volumeup
|
||||
|
||||
# Fn-modified fkeys all produce the unmodified version of the key.
|
||||
0xBB f1
|
||||
0xBC f2
|
||||
0xBD f3
|
||||
0xBE f4
|
||||
0xBF f5
|
||||
0xC0 f6
|
||||
0xC1 f7
|
||||
0xC2 f8
|
||||
0xC3 f9
|
||||
0xC4 f10
|
||||
0xD7 f11
|
||||
0xD8 f12
|
||||
|
||||
|
||||
# Using F13-F21 for the .5 F keys right now.
|
||||
0xF7 f13
|
||||
0xF6 f14
|
||||
0xF5 f15
|
||||
0xF4 f16
|
||||
0xF3 f17
|
||||
0xF2 f18
|
||||
0xF1 f19
|
||||
0xF0 f20
|
||||
0xEF f21
|
||||
|
||||
0xEE chat
|
||||
0xE4 chat # Just mapping Fn+Chat to Chat for now
|
||||
0xDD menu # Frame
|
||||
0xDA prog1 # Fn+Frame
|
||||
|
||||
# The Fn of some keys is other keys
|
||||
0xD3 delete
|
||||
0xD2 insert
|
||||
0xC9 pageup
|
||||
0xD1 pagedown
|
||||
0xC7 home
|
||||
0xCF end
|
||||
|
||||
# Language key - don't ask what they are doing as KEY_HP
|
||||
0x73 hp
|
||||
0x7E hp
|
||||
|
||||
0xDB leftmeta # left grab
|
||||
0xDC rightmeta # right grab
|
||||
0x85 rightmeta # Right grab releases on a different scancode
|
||||
0xD6 kbdillumtoggle # Fn+Space
|
||||
0x69 switchvideomode # Brightness key
|
||||
|
||||
# Game keys
|
||||
0x65 kp8 # up
|
||||
0x66 kp2 # down
|
||||
0x67 kp4 # left
|
||||
0x68 kp6 # right
|
||||
0xE5 kp9 # pgup
|
||||
0xE6 kp3 # pgdn
|
||||
0xE7 kp7 # home
|
||||
0xE8 kp1 # end
|
@ -1,14 +0,0 @@
|
||||
0xA0 mute # Fn+D
|
||||
0xAE volumedown # Fn+F
|
||||
0xB0 volumeup # Fn+G
|
||||
0xDF sleep # Fn+W
|
||||
0xE0 bluetooth # Fn+H
|
||||
0xE2 cyclewindows # Fn+Esc
|
||||
0xEE battery # Fn+Q
|
||||
0xF0 media # Fn+R
|
||||
0xF5 switchvideomode # Fn+E
|
||||
0xF6 camera # Fn+T
|
||||
0xF7 f21 # Fn+Y (touchpad toggle)
|
||||
0xF8 brightnessup # Fn+S
|
||||
0xF9 brightnessdown # Fn+A
|
||||
0xFB wlan # Fn+J
|
@ -1,5 +0,0 @@
|
||||
0x8E wlan
|
||||
0xF0 switchvideomode
|
||||
0xF1 mute
|
||||
0xF2 volumedown
|
||||
0xF3 volumeup
|
@ -1,14 +0,0 @@
|
||||
0x74 prog1 # User key
|
||||
0x75 www
|
||||
0x78 mail
|
||||
0x82 switchvideomode # Fn+F4 CRT/LCD (high keycode: "displaytoggle")
|
||||
0x83 battery # Fn+F2
|
||||
0x84 prog1 # Fn+F5 backlight on/off
|
||||
0x86 wlan # Fn+F9
|
||||
0x88 brightnessup # Fn+Up
|
||||
0x89 brightnessdown # Fn+Down
|
||||
0xB1 prog2 # Fn+F7 run Samsung Magic Doctor (keypressed event is generated twice)
|
||||
0xB3 prog3 # Fn+F8 switch power mode (battery/dynamic/performance)
|
||||
0xB4 wlan # Fn+F9 (X60P)
|
||||
0xF7 f22 # Fn+F10 Touchpad on
|
||||
0xF9 f23 # Fn+F10 Touchpad off
|
@ -1,3 +0,0 @@
|
||||
0xCE prog1 # Fn+F1 launch control setting
|
||||
0xB3 prog2 # Fn+F11 performance mode
|
||||
0xD5 wlan # Fn+F12 Wi-Fi toggle
|
@ -1,5 +0,0 @@
|
||||
0x96 kbdillumup # Fn+F8 keyboard backlight up
|
||||
0x97 kbdillumdown # Fn+F7 keyboard backlight down
|
||||
0xD5 wlan # Fn+F12 Wi-Fi toggle
|
||||
0xCE prog1 # Fn+F1 performance mode
|
||||
0x8D prog2 # Fn+F6 battery life extender
|
@ -1,7 +0,0 @@
|
||||
0xD4 menu
|
||||
0xD8 f1
|
||||
0xD9 f10
|
||||
0xD6 f3
|
||||
0xD7 f9
|
||||
0xE4 f5
|
||||
0xEE f11
|
@ -1,4 +0,0 @@
|
||||
0x74 mute
|
||||
0x75 mute
|
||||
0x77 f22 # Touchpad on
|
||||
0x79 f23 # Touchpad off
|
@ -1,2 +0,0 @@
|
||||
0xA4 stopcd
|
||||
0xB2 www
|
@ -1,10 +0,0 @@
|
||||
0x92 stop
|
||||
0x93 www
|
||||
0x94 media
|
||||
0x9E f22 # Touchpad on
|
||||
0x9F f23 # Touchpad off
|
||||
0xB9 nextsong
|
||||
0xD9 brightnessup
|
||||
0xEE screenlock
|
||||
0xF4 previoussong
|
||||
0xF7 playpause
|
@ -1,6 +0,0 @@
|
||||
0xef brightnessdown
|
||||
0xd9 brightnessup
|
||||
0xee screenlock
|
||||
0x93 media
|
||||
0x9e f22 # touchpad enable
|
||||
0x9f f23 # touchpad disable
|
@ -1,11 +0,0 @@
|
||||
0x93 switchvideomode # Fn+F3 Toggle Video Output
|
||||
0x95 brightnessdown # Fn+F4 Brightness Down
|
||||
0x91 brightnessup # Fn+F5 Brightness Up
|
||||
0xA5 f23 # Fn+F6 Disable Touchpad
|
||||
0xA6 f22 # Fn+F6 Enable Touchpad
|
||||
0xA7 bluetooth # Fn+F10 Enable Bluetooth
|
||||
0XA9 bluetooth # Fn+F10 Disable Bluetooth
|
||||
0xF1 wlan # RF Switch Off
|
||||
0xF2 wlan # RF Switch On
|
||||
0xF4 prog1 # P1 Button
|
||||
0xF3 prog2 # P2 Button
|
5
src/udev/keymap/.gitignore
vendored
5
src/udev/keymap/.gitignore
vendored
@ -1,5 +0,0 @@
|
||||
keyboard-force-release.sh
|
||||
keys-from-name.gperf
|
||||
keys-from-name.h
|
||||
keys-to-name.h
|
||||
keys.txt
|
@ -1,60 +0,0 @@
|
||||
# Set model specific atkbd force_release quirk
|
||||
#
|
||||
# Several laptops have hotkeys which don't generate release events,
|
||||
# which can cause problems with software key repeat.
|
||||
# The atkbd driver has a quirk handler for generating synthetic
|
||||
# release events, which can be configured via sysfs since 2.6.32.
|
||||
# Simply add a file with a list of scancodes for your laptop model
|
||||
# in /usr/lib/udev/keymaps, and add a rule here.
|
||||
# If the hotkeys also need a keymap assignment you can copy the
|
||||
# scancodes from the keymap file, otherwise you can run
|
||||
# /usr/lib/udev/keymap -i /dev/input/eventX
|
||||
# on a Linux vt to find out.
|
||||
|
||||
ACTION=="remove", GOTO="force_release_end"
|
||||
SUBSYSTEM!="serio", GOTO="force_release_end"
|
||||
KERNEL!="serio*", GOTO="force_release_end"
|
||||
DRIVER!="atkbd", GOTO="force_release_end"
|
||||
|
||||
ENV{DMI_VENDOR}="$attr{[dmi/id]sys_vendor}"
|
||||
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", RUN+="keyboard-force-release.sh $devpath samsung-other"
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*90X3A*|*900X3*|*900X4*", RUN+="keyboard-force-release.sh $devpath samsung-series-9"
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*300E5*|*300E4*|*300E7*|*270E5*|*270E4*", RUN+="keyboard-force-release.sh $devpath samsung-series-3"
|
||||
|
||||
ENV{DMI_VENDOR}=="Dell Inc.", ATTR{[dmi/id]product_name}=="Studio 1557|Studio 1558", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
ENV{DMI_VENDOR}=="Dell Inc.", ATTR{[dmi/id]product_name}=="*Latitude*|*Precision*", RUN+="keyboard-force-release.sh $devpath dell-touchpad"
|
||||
ENV{DMI_VENDOR}=="Dell Inc.", ATTR{[dmi/id]product_name}=="XPS*", RUN+="keyboard-force-release.sh $devpath dell-xps"
|
||||
|
||||
ENV{DMI_VENDOR}=="FUJITSU SIEMENS", ATTR{[dmi/id]product_name}=="AMILO*", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="FOXCONN", ATTR{[dmi/id]product_name}=="QBOOK", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="MTC", ATTR{[dmi/id]product_version}=="A0", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="Mio Technology", ATTR{[dmi/id]product_name}=="N890", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="PEGATRON CORP.", ATTR{[dmi/id]product_name}=="Spring Peak", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="TOSHIBA", ATTR{[dmi/id]product_name}=="Satellite [uU]300*|Satellite Pro [uU]300*|Satellite [uU]305*|SATELLITE [uU]500*", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="Viooo Corporation", ATTR{[dmi/id]product_name}=="PT17", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
# These are all the HP laptops that setup a touchpad toggle key
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*[pP][aA][vV][iI][lL][iI][oO][nN]*", RUN+="keyboard-force-release.sh $devpath hp-other"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*[tT][xX]2*", RUN+="keyboard-force-release.sh $devpath hp-other"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*2510p*|*2530p*|HP G60 Notebook PC|HDX9494NR", RUN+="keyboard-force-release.sh $devpath hp-other"
|
||||
|
||||
ENV{DMI_VENDOR}=="Zepto", ATTR{[dmi/id]product_name}=="Znote 6615WD", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="Zepto", ATTR{[dmi/id]product_name}=="Znote", ATTR{[dmi/id]product_version}=="6625WD", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="HANNspree", ATTR{[dmi/id]product_name}=="SN10E100", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="GIGABYTE", ATTR{[dmi/id]product_name}=="i1520M", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="BenQ", ATTR{[dmi/id]product_name}=="*nScreen*|Joybook Lite*", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
ENV{DMI_VENDOR}=="DIXONSP", ATTR{[dmi/id]product_name}=="DIXON*", RUN+="keyboard-force-release.sh $devpath common-volume-keys"
|
||||
|
||||
LABEL="force_release_end"
|
@ -1,181 +0,0 @@
|
||||
# Set model specific hotkey keycodes.
|
||||
#
|
||||
# Key map overrides can be specified by either giving scancode/keyname pairs
|
||||
# directly as keymap arguments (if there are just one or two to change), or as
|
||||
# a file name (in /usr/lib/udev/keymaps), which has to contain scancode/keyname
|
||||
# pairs.
|
||||
|
||||
ACTION=="remove", GOTO="keyboard_end"
|
||||
KERNEL!="event*", GOTO="keyboard_end"
|
||||
ENV{ID_INPUT_KEY}=="", GOTO="keyboard_end"
|
||||
SUBSYSTEMS=="bluetooth", GOTO="keyboard_end"
|
||||
|
||||
SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
|
||||
SUBSYSTEMS=="usb", GOTO="keyboard_usbcheck"
|
||||
GOTO="keyboard_modulecheck"
|
||||
|
||||
#
|
||||
# The following are external USB keyboards
|
||||
#
|
||||
|
||||
LABEL="keyboard_usbcheck"
|
||||
|
||||
ENV{ID_VENDOR}=="Genius", ENV{ID_MODEL_ID}=="0708", ENV{ID_USB_INTERFACE_NUM}=="01", RUN+="keymap $name genius-slimstar-320"
|
||||
ENV{ID_VENDOR}=="Logitech*", ATTRS{name}=="Logitech USB Multimedia Keyboard", RUN+="keymap $name logitech-wave"
|
||||
ENV{ID_VENDOR}=="Logitech*", ATTRS{name}=="Logitech USB Receiver", RUN+="keymap $name logitech-wave-cordless"
|
||||
ENV{ID_VENDOR}=="Logitech*", ATTRS{name}=="* Logitech USB Keyboard*", RUN+="keymap $name logitech-usb"
|
||||
# Logitech Cordless Wave Pro looks slightly weird; some hotkeys are coming through the mouse interface
|
||||
ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52[9b]", ATTRS{name}=="Logitech USB Receiver", RUN+="keymap $name logitech-wave-pro-cordless"
|
||||
|
||||
ENV{ID_VENDOR}=="Lite-On_Technology_Corp*", ATTRS{name}=="Lite-On Technology Corp. ThinkPad USB Keyboard with TrackPoint", RUN+="keymap $name lenovo-thinkpad-usb-keyboard-trackpoint"
|
||||
ENV{ID_VENDOR_ID}=="04b3", ENV{ID_MODEL_ID}=="301[89]", RUN+="keymap $name ibm-thinkpad-usb-keyboard-trackpoint"
|
||||
|
||||
ENV{ID_VENDOR}=="Microsoft", ENV{ID_MODEL_ID}=="00db", RUN+="keymap $name 0xc022d zoomin 0xc022e zoomout"
|
||||
|
||||
GOTO="keyboard_end"
|
||||
|
||||
#
|
||||
# The following are exposed as separate input devices with low key codes, thus
|
||||
# we need to check their input device product name
|
||||
#
|
||||
|
||||
LABEL="keyboard_modulecheck"
|
||||
|
||||
ENV{DMI_VENDOR}="$attr{[dmi/id]sys_vendor}"
|
||||
ENV{DMI_VENDOR}=="", GOTO="keyboard_end"
|
||||
|
||||
ENV{DMI_VENDOR}=="LENOVO*", KERNELS=="input*", ATTRS{name}=="ThinkPad Extra Buttons", RUN+="keymap $name module-lenovo"
|
||||
ENV{DMI_VENDOR}=="LENOVO*", KERNELS=="input*", ATTRS{name}=="Ideapad extra buttons", RUN+="keymap $name 0x42 f23 0x43 f22"
|
||||
|
||||
ENV{DMI_VENDOR}=="IBM*", KERNELS=="input*", ATTRS{name}=="ThinkPad Extra Buttons", RUN+="keymap $name module-ibm"
|
||||
ENV{DMI_VENDOR}=="Sony*", KERNELS=="input*", ATTRS{name}=="Sony Vaio Keys", RUN+="keymap $name module-sony"
|
||||
ENV{DMI_VENDOR}=="Acer*", KERNELS=="input*", ATTRS{name}=="Acer WMI hotkeys", RUN+="keymap $name 0x82 f21"
|
||||
ENV{DMI_VENDOR}=="MICRO-STAR*|Micro-Star*", KERNELS=="input*", ATTRS{name}=="MSI Laptop hotkeys", RUN+="keymap $name 0x213 f22 0x214 f23"
|
||||
|
||||
# Older Vaios have some different keys
|
||||
ENV{DMI_VENDOR}=="Sony*", ATTR{[dmi/id]product_name}=="*PCG-C1*|*PCG-K25*|*PCG-F1*|*PCG-F2*|*PCG-F3*|*PCG-F4*|*PCG-F5*|*PCG-F6*|*PCG-FX*|*PCG-FRV*|*PCG-GR*|*PCG-TR*|*PCG-NV*|*PCG-Z*|*VGN-S360*", ATTRS{name}=="Sony Vaio Keys", RUN+="keymap $name module-sony-old"
|
||||
|
||||
# Some Sony VGN/VPC models have yet another one
|
||||
ENV{DMI_VENDOR}=="Sony*", ATTR{[dmi/id]product_name}=="VGN-AR71*|VGN-FW*|VGN-Z21*", ATTRS{name}=="Sony Vaio Keys", RUN+="keymap $name module-sony-vgn"
|
||||
ENV{DMI_VENDOR}=="Sony*", ATTR{[dmi/id]product_name}=="VPC*", ATTRS{name}=="Sony Vaio Keys", RUN+="keymap $name module-sony-vpc"
|
||||
|
||||
|
||||
#
|
||||
# The following rules belong to standard i8042 AT keyboard with high key codes.
|
||||
#
|
||||
|
||||
DRIVERS=="atkbd", GOTO="keyboard_vendorcheck"
|
||||
GOTO="keyboard_end"
|
||||
|
||||
LABEL="keyboard_vendorcheck"
|
||||
|
||||
ENV{DMI_VENDOR}=="Dell*", RUN+="keymap $name dell"
|
||||
ENV{DMI_VENDOR}=="Dell*", ATTR{[dmi/id]product_name}=="Inspiron 910|Inspiron 1010|Inspiron 1011|Inspiron 1012|Inspiron 1110|Inspiron 1210", RUN+="keymap $name 0x84 wlan"
|
||||
ENV{DMI_VENDOR}=="Dell*", ATTR{[dmi/id]product_name}=="Latitude XT2", RUN+="keymap $name dell-latitude-xt2"
|
||||
|
||||
ENV{DMI_VENDOR}=="Compaq*", ATTR{[dmi/id]product_name}=="*E500*|*Evo N*", RUN+="keymap $name compaq-e_evo"
|
||||
|
||||
ENV{DMI_VENDOR}=="LENOVO*", ATTR{[dmi/id]product_version}=="*3000*", RUN+="keymap $name lenovo-3000"
|
||||
ENV{DMI_VENDOR}=="LENOVO*", ATTR{[dmi/id]product_version}=="ThinkPad X6*", ATTR{[dmi/id]product_version}=="* Tablet", RUN+="keymap $name lenovo-thinkpad_x6_tablet"
|
||||
ENV{DMI_VENDOR}=="LENOVO*", ATTR{[dmi/id]product_version}=="ThinkPad X2* Tablet*", ATTR{[dmi/id]product_version}=="* Tablet", RUN+="keymap $name lenovo-thinkpad_x200_tablet"
|
||||
ENV{DMI_VENDOR}=="LENOVO*", ATTR{[dmi/id]product_version}=="*IdeaPad*", RUN+="keymap $name lenovo-ideapad"
|
||||
ENV{DMI_VENDOR}=="LENOVO*", ATTR{[dmi/id]product_name}=="S10-*", RUN+="keymap $name lenovo-ideapad"
|
||||
ENV{DMI_VENDOR}=="LENOVO", ATTR{[dmi/id]product_version}=="*IdeaPad Y550*", RUN+="keymap $name 0x95 media 0xA3 play"
|
||||
ENV{DMI_VENDOR}=="LENOVO", ATTR{[dmi/id]product_version}=="*Lenovo V480*", RUN+="keymap $name 0xf1 f21"
|
||||
# 0xf1 is touchpad toggle, 0xCE is microphone mute in Lenovo U300s
|
||||
ENV{DMI_VENDOR}=="LENOVO", ATTR{[dmi/id]product_version}=="*IdeaPad U300s*", RUN+="keymap $name 0xf1 f21 0xCE f20"
|
||||
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", RUN+="keymap $name hewlett-packard"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*[tT][aA][bB][lL][eE][tT]*", RUN+="keymap $name hewlett-packard-tablet"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*[pP][aA][vV][iI][lL][iI][oO][nN]*", RUN+="keymap $name hewlett-packard-pavilion"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*Compaq*|*EliteBook*|*2230s*", RUN+="keymap $name hewlett-packard-compaq_elitebook"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*Presario*CQ*", RUN+="keymap $name 0xD8 f21 0xD9 f21"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*2510p*|*2530p*|HP G60 Notebook PC", RUN+="keymap $name hewlett-packard-2510p_2530p"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard*", ATTR{[dmi/id]product_name}=="*[tT][xX]2*", RUN+="keymap $name hewlett-packard-tx2"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard", ATTR{[dmi/id]product_name}=="Presario 2100*", RUN+="keymap $name hewlett-packard-presario-2100"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard", ATTR{[dmi/id]product_name}=="HP G62 Notebook PC", RUN+="keymap $name 0xB2 www"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard", ATTR{[dmi/id]product_name}=="HP ProBook*", RUN+="keymap $name 0xF8 rfkill 0xB2 www"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard", ATTR{[dmi/id]product_name}=="HP EliteBook 8440p", RUN+="keymap $name hewlett-packard_elitebook-8440p"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard", ATTR{[dmi/id]product_name}=="HP EliteBook 8460p", RUN+="keymap $name hewlett-packard_elitebook-8460p"
|
||||
ENV{DMI_VENDOR}=="Hewlett-Packard", ATTR{[dmi/id]product_name}=="HDX9494NR", RUN+="keymap $name hewlett-packard-hdx9494nr"
|
||||
# HP Pavilion dv6315ea has empty DMI_VENDOR
|
||||
ATTR{[dmi/id]board_vendor}=="Quanta", ATTR{[dmi/id]board_name}=="30B7", ATTR{[dmi/id]board_version}=="65.2B", RUN+="keymap $name 0x88 media" # "quick play
|
||||
|
||||
# Gateway clone of Acer Aspire One AOA110/AOA150
|
||||
ENV{DMI_VENDOR}=="Gateway*", ATTR{[dmi/id]product_name}=="*AOA1*", RUN+="keymap $name acer"
|
||||
|
||||
ENV{DMI_VENDOR}=="Acer*", RUN+="keymap $name acer"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="Extensa*", ATTR{[dmi/id]product_name}=="*5210*|*5220*|*5610*|*5620*|*5720*", RUN+="keymap $name 0xEE screenlock"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="TravelMate*C3[01]0*", RUN+="keymap $name acer-travelmate_c300"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="TravelMate*6292*|TravelMate*8471*|TravelMate*4720*|TravelMate*7720*|Aspire 1810T*|AO751h|AO531h", RUN+="keymap $name 0xD9 bluetooth"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="TravelMate*4720*", RUN+="keymap $name 0xB2 www 0xEE screenlock"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="TravelMate 6593|Aspire 1640", RUN+="keymap $name 0xB2 www 0xEE screenlock"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="Aspire 6920", RUN+="keymap $name acer-aspire_6920"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="Aspire 5920G", RUN+="keymap $name acer-aspire_5920g"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="Aspire 5720*", RUN+="keymap $name acer-aspire_5720"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_name}=="Aspire 8930", RUN+="keymap $name acer-aspire_8930"
|
||||
ENV{DMI_VENDOR}=="Acer*", ATTR{[dmi/id]product_serial}=="ZG8*", RUN+="keymap $name acer-aspire_5720"
|
||||
|
||||
ENV{DMI_VENDOR}=="*BenQ*", ATTR{[dmi/id]product_name}=="*Joybook R22*", RUN+="keymap $name 0x6E wlan"
|
||||
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="*AMILO Pro V3205*", RUN+="keymap $name fujitsu-amilo_pro_v3205"
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="*AMILO Pa 2548*", RUN+="keymap $name fujitsu-amilo_pa_2548"
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="*ESPRIMO Mobile V5*", RUN+="keymap $name fujitsu-esprimo_mobile_v5"
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="*ESPRIMO Mobile V6*", RUN+="keymap $name fujitsu-esprimo_mobile_v6"
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="*AMILO Pro Edition V3505*", RUN+="keymap $name fujitsu-amilo_pro_edition_v3505"
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="*Amilo Si 1520*", RUN+="keymap $name fujitsu-amilo_si_1520"
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="AMILO*M*", RUN+="keymap $name 0x97 prog2 0x9F prog1"
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="Amilo Li 1718", RUN+="keymap $name 0xD6 wlan"
|
||||
ENV{DMI_VENDOR}=="FUJITSU*", ATTR{[dmi/id]product_name}=="AMILO Li 2732", RUN+="keymap $name fujitsu-amilo_li_2732"
|
||||
|
||||
ENV{DMI_VENDOR}=="LG*", ATTR{[dmi/id]product_name}=="*X110*", RUN+="keymap $name lg-x110"
|
||||
|
||||
ENV{DMI_VENDOR}=="MEDION*", ATTR{[dmi/id]product_name}=="*FID2060*", RUN+="keymap $name medion-fid2060"
|
||||
ENV{DMI_VENDOR}=="MEDIONNB", ATTR{[dmi/id]product_name}=="A555*", RUN+="keymap $name medionnb-a555"
|
||||
|
||||
ENV{DMI_VENDOR}=="MICRO-STAR*|Micro-Star*", RUN+="keymap $name micro-star"
|
||||
ENV{DMI_VENDOR}=="MICRO-STAR*|Micro-Star*", ATTR{[dmi/id]product_name}=="GE60*|GE70*", RUN+="keymap $name 0xC2 ejectcd"
|
||||
|
||||
# some MSI models generate ACPI/input events on the LNXVIDEO input devices,
|
||||
# plus some extra synthesized ones on atkbd as an echo of actually changing the
|
||||
# brightness; so ignore those atkbd ones, to avoid loops
|
||||
ENV{DMI_VENDOR}=="MICRO-STAR*", ATTR{[dmi/id]product_name}=="*U-100*|*U100*|*N033", RUN+="keymap $name 0xF7 reserved 0xF8 reserved"
|
||||
|
||||
# MSI Wind U90/U100 generates separate touchpad on/off keycodes so ignore touchpad toggle keycode
|
||||
ENV{DMI_VENDOR}=="MICRO-STAR*", ATTR{[dmi/id]product_name}=="U90/U100", RUN+="keymap $name 0xE4 reserved"
|
||||
|
||||
ENV{DMI_VENDOR}=="INVENTEC", ATTR{[dmi/id]product_name}=="SYMPHONY 6.0/7.0", RUN+="keymap $name inventec-symphony_6.0_7.0"
|
||||
|
||||
ENV{DMI_VENDOR}=="MAXDATA", ATTR{[dmi/id]product_name}=="Pro 7000*", RUN+="keymap $name maxdata-pro_7000"
|
||||
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", RUN+="keymap $name samsung-other"
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*SX20S*", RUN+="keymap $name samsung-sx20s"
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="SQ1US", RUN+="keymap $name samsung-sq1us"
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*700Z*", RUN+="keymap $name 0xBA ejectcd 0x96 keyboardbrightnessup 0x97 keyboardbrightnessdown"
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*700T*", RUN+="keymap $name 0xAD leftmeta"
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*90X3A*|*900X3*|*900X4*", RUN+="keymap $name samsung-series-9"
|
||||
ENV{DMI_VENDOR}=="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}=="*300E5*|*300E4*|*300E7*|*270E5*|*270E4*", RUN+="keymap $name samsung-series-3"
|
||||
|
||||
ENV{DMI_VENDOR}=="TOSHIBA", ATTR{[dmi/id]product_name}=="SATELLITE A100", RUN+="keymap $name toshiba-satellite_a100"
|
||||
ENV{DMI_VENDOR}=="TOSHIBA", ATTR{[dmi/id]product_name}=="Satellite A110", RUN+="keymap $name toshiba-satellite_a110"
|
||||
ENV{DMI_VENDOR}=="TOSHIBA", ATTR{[dmi/id]product_name}=="Satellite M30X", RUN+="keymap $name toshiba-satellite_m30x"
|
||||
|
||||
ENV{DMI_VENDOR}=="OQO Inc.*", ATTR{[dmi/id]product_name}=="OQO Model 2*", RUN+="keymap $name oqo-model2"
|
||||
|
||||
ENV{DMI_VENDOR}=="ONKYO CORPORATION", ATTR{[dmi/id]product_name}=="ONKYOPC", RUN+="keymap $name onkyo"
|
||||
|
||||
ENV{DMI_VENDOR}=="ASUS", RUN+="keymap $name asus"
|
||||
|
||||
ENV{DMI_VENDOR}=="VIA", ATTR{[dmi/id]product_name}=="K8N800", ATTR{[dmi/id]product_version}=="VT8204B", RUN+="keymap $name 0x81 prog1"
|
||||
|
||||
ENV{DMI_VENDOR}=="Zepto", ATTR{[dmi/id]product_name}=="Znote", ATTR{[dmi/id]product_version}=="62*|63*", RUN+="keymap $name zepto-znote"
|
||||
|
||||
ENV{DMI_VENDOR}=="Everex", ATTR{[dmi/id]product_name}=="XT5000*", RUN+="keymap $name everex-xt5000"
|
||||
|
||||
ENV{DMI_VENDOR}=="COMPAL", ATTR{[dmi/id]product_name}=="HEL80I", RUN+="keymap $name 0x84 wlan"
|
||||
|
||||
ENV{DMI_VENDOR}=="OLPC", ATTR{[dmi/id]product_name}=="XO", RUN+="keymap $name olpc-xo"
|
||||
|
||||
ENV{DMI_VENDOR}=="Alienware*", ATTR{[dmi/id]product_name}=="M14xR1", RUN+="keymap $name 0x8A ejectcd"
|
||||
|
||||
LABEL="keyboard_end"
|
@ -1,97 +0,0 @@
|
||||
= The udev keymap tool =
|
||||
|
||||
== Introduction ==
|
||||
|
||||
This udev extension configures computer model specific key mappings. This is
|
||||
particularly necessary for the non-standard extra keys found on many laptops,
|
||||
such as "brightness up", "next song", "www browser", or "suspend". Often these
|
||||
are accessed with the Fn key.
|
||||
|
||||
Every key produces a "scan code", which is highly vendor/model specific for the
|
||||
nonstandard keys. This tool maintains mappings for these scan codes to standard
|
||||
"key codes", which denote the "meaning" of the key. The key codes are defined
|
||||
in /usr/include/linux/input.h.
|
||||
|
||||
If some of your keys on your keyboard are not working at all, or produce the
|
||||
wrong effect, then a very likely cause of this is that the scan code -> key
|
||||
code mapping is incorrect on your computer.
|
||||
|
||||
== Structure ==
|
||||
|
||||
udev-keymap consists of the following parts:
|
||||
|
||||
keymaps/*:: mappings of scan codes to key code names
|
||||
|
||||
95-keymap.rules:: udev rules for mapping system vendor/product names and
|
||||
input module names to one of the keymaps above
|
||||
|
||||
keymap:: manipulate an evdev input device:
|
||||
* write a key map file into a device (used by udev rules)
|
||||
* dump current scan → key code mapping
|
||||
* interactively display scan and key codes of pressed keys
|
||||
|
||||
findkeyboards:: display evdev input devices which belong to actual keyboards,
|
||||
i. e. those suitable for the keymap program
|
||||
|
||||
== Fixing broken keys ==
|
||||
|
||||
In order to make a broken key work on your system and send it back to upstream
|
||||
for inclusion you need to do the following steps:
|
||||
|
||||
1. Find the keyboard device.
|
||||
|
||||
Run /usr/lib/udev/findkeyboards. This should always give you an "AT
|
||||
keyboard" and possibly a "module". Some laptops (notably Thinkpads, Sonys, and
|
||||
Acers) have multimedia/function keys on a separate input device instead of the
|
||||
primary keyboard. The keyboard device should have a name like "input/event3".
|
||||
In the following commands, the name will be written as "input/eventX" (replace
|
||||
X with the appropriate number).
|
||||
|
||||
2. Find broken scan codes:
|
||||
|
||||
sudo /usr/lib/udev/keymap -i input/eventX
|
||||
|
||||
Press all multimedia/function keys and check if the key name that gets printed
|
||||
out is plausible. If it is unknown or wrong, write down the scan code (looks
|
||||
like "0x1E") and the intended functionality of this key. Look in
|
||||
/usr/include/linux/input.h for an available KEY_XXXXX constant which most
|
||||
closely approximates this functionality and write it down as the new key code.
|
||||
|
||||
For example, you might press a key labeled "web browser" which currently
|
||||
produces "unknown". Note down this:
|
||||
|
||||
0x1E www # Fn+F2 web browser
|
||||
|
||||
Repeat that for all other keys. Write the resulting list into a file. Look at
|
||||
/usr/lib/udev/keymaps/ for existing key map files and make sure that you use the
|
||||
same structure.
|
||||
|
||||
If the key only ever works once and then your keyboard (or the entire desktop)
|
||||
gets stuck for a long time, then it is likely that the BIOS fails to send a
|
||||
corresponding "key release" event after the key press event. Please note down
|
||||
this case as well, as it can be worked around in
|
||||
/usr/lib/udev/keymaps/95-keyboard-force-release.rules .
|
||||
|
||||
3. Find out your system vendor and product:
|
||||
|
||||
cat /sys/class/dmi/id/sys_vendor
|
||||
cat /sys/class/dmi/id/product_name
|
||||
|
||||
4. Generate a device dump with "udevadm info --export-db > /tmp/udev-db.txt".
|
||||
|
||||
6. Send the system vendor/product names, the key mapping from step 2,
|
||||
and /tmp/udev-db.txt from step 4 to the linux-hotplug@vger.kernel.org mailing
|
||||
list, so that they can be included in the next release.
|
||||
|
||||
For local testing, copy your map file to /usr/lib/udev/keymaps/ with an appropriate
|
||||
name, and add an appropriate udev rule to /usr/lib/udev/rules.d/95-keymap.rules:
|
||||
|
||||
* If you selected an "AT keyboard", add the rule to the section after
|
||||
'LABEL="keyboard_vendorcheck"'.
|
||||
|
||||
* If you selected a "module", add the rule to the top section where the
|
||||
"ThinkPad Extra Buttons" are.
|
||||
|
||||
== Author ==
|
||||
|
||||
keymap is written and maintained by Martin Pitt <martin.pitt@ubuntu.com>.
|
@ -1,38 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# check that all key names in keymaps/* are known in <linux/input.h>
|
||||
# and that all key maps listed in the rules are valid and present in
|
||||
# Makefile.am
|
||||
SRCDIR=${1:-.}
|
||||
KEYLIST=${2:-src/udev/keymap/keys.txt}
|
||||
KEYMAPS_DIR=$SRCDIR/keymaps
|
||||
RULES=$SRCDIR/src/udev/keymap/95-keymap.rules
|
||||
|
||||
[ -e "$KEYLIST" ] || {
|
||||
echo "need $KEYLIST please build first" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
missing=$(join -v 2 <(awk '{print tolower(substr($1,5))}' $KEYLIST | sort -u) \
|
||||
<(grep -hv '^#' ${KEYMAPS_DIR}/*| awk '{print $2}' | sort -u))
|
||||
[ -z "$missing" ] || {
|
||||
echo "ERROR: unknown key names in keymaps/*:" >&2
|
||||
echo "$missing" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# check that all maps referred to in $RULES exist
|
||||
maps=$(sed -rn '/keymap \$name/ { s/^.*\$name ([^"[:space:]]+).*$/\1/; p }' $RULES)
|
||||
for m in $maps; do
|
||||
# ignore inline mappings
|
||||
[ "$m" = "${m#0x}" ] || continue
|
||||
|
||||
[ -e ${KEYMAPS_DIR}/$m ] || {
|
||||
echo "ERROR: unknown map name in $RULES: $m" >&2
|
||||
exit 1
|
||||
}
|
||||
grep -q "keymaps/$m\>" $SRCDIR/Makefile.am || {
|
||||
echo "ERROR: map file $m is not added to Makefile.am" >&2
|
||||
exit 1
|
||||
}
|
||||
done
|
@ -1,68 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# Find "real" keyboard devices and print their device path.
|
||||
# Author: Martin Pitt <martin.pitt@ubuntu.com>
|
||||
#
|
||||
# Copyright (C) 2009, Canonical Ltd.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
|
||||
# returns OK if $1 contains $2
|
||||
strstr() {
|
||||
[ "${1#*$2*}" != "$1" ]
|
||||
}
|
||||
|
||||
# returns OK if $1 contains $2 at the beginning
|
||||
str_starts() {
|
||||
[ "${1#$2*}" != "$1" ]
|
||||
}
|
||||
|
||||
str_line_starts() {
|
||||
while read a; do str_starts "$a" "$1" && return 0;done
|
||||
return 1;
|
||||
}
|
||||
|
||||
# print a list of input devices which are keyboard-like
|
||||
keyboard_devices() {
|
||||
# standard AT keyboard
|
||||
for dev in `udevadm trigger --dry-run --verbose --property-match=ID_INPUT_KEYBOARD=1`; do
|
||||
env=`udevadm info --query=env --path=$dev`
|
||||
# filter out non-event devices, such as the parent input devices which have no devnode
|
||||
if ! echo "$env" | str_line_starts 'DEVNAME='; then
|
||||
continue
|
||||
fi
|
||||
walk=`udevadm info --attribute-walk --path=$dev`
|
||||
if strstr "$walk" 'DRIVERS=="atkbd"'; then
|
||||
echo -n 'AT keyboard: '
|
||||
elif echo "$env" | str_line_starts 'ID_USB_DRIVER=usbhid'; then
|
||||
echo -n 'USB keyboard: '
|
||||
else
|
||||
echo -n 'Unknown type: '
|
||||
fi
|
||||
udevadm info --query=name --path=$dev
|
||||
done
|
||||
|
||||
# modules
|
||||
module=$(udevadm trigger --verbose --dry-run --subsystem-match=input --attr-match=name='*Extra Buttons')
|
||||
module="$module
|
||||
$(udevadm trigger --verbose --dry-run --subsystem-match=input --attr-match=name='*extra buttons')"
|
||||
module="$module
|
||||
$(udevadm trigger --verbose --dry-run --subsystem-match=input --attr-match=name='Sony Vaio Keys')"
|
||||
for m in $module; do
|
||||
for evdev in $m/event*/dev; do
|
||||
if [ -e "$evdev" ]; then
|
||||
echo -n 'module: '
|
||||
udevadm info --query=name --path=${evdev%%/dev}
|
||||
fi
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
keyboard_devices
|
@ -1,22 +0,0 @@
|
||||
#!/bin/sh -e
|
||||
# read list of scancodes, convert hex to decimal and
|
||||
# append to the atkbd force_release sysfs attribute
|
||||
# $1 sysfs devpath for serioX
|
||||
# $2 file with scancode list (hex or dec)
|
||||
|
||||
case "$2" in
|
||||
/*) scf="$2" ;;
|
||||
*) scf="@udevlibexecdir@/keymaps/force-release/$2" ;;
|
||||
esac
|
||||
|
||||
read attr <"/sys/$1/force_release"
|
||||
while read scancode dummy; do
|
||||
case "$scancode" in
|
||||
\#*) ;;
|
||||
*)
|
||||
scancode=$(($scancode))
|
||||
attr="$attr${attr:+,}$scancode"
|
||||
;;
|
||||
esac
|
||||
done <"$scf"
|
||||
echo "$attr" >"/sys/$1/force_release"
|
@ -1,453 +0,0 @@
|
||||
/*
|
||||
* keymap - dump keymap of an evdev device or set a new keymap from a file
|
||||
*
|
||||
* Based on keyfuzz by Lennart Poettering <mzqrovna@0pointer.net>
|
||||
* Adapted for udev-extras by Martin Pitt <martin.pitt@ubuntu.com>
|
||||
*
|
||||
* Copyright (C) 2006, Lennart Poettering
|
||||
* Copyright (C) 2009, Canonical Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <fcntl.h>
|
||||
#include <getopt.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
static const struct key* lookup_key (const char *str, unsigned int len);
|
||||
|
||||
#include "keys-from-name.h"
|
||||
#include "keys-to-name.h"
|
||||
#include "macro.h"
|
||||
#include "util.h"
|
||||
|
||||
#define MAX_SCANCODES 1024
|
||||
|
||||
static int evdev_open(const char *dev)
|
||||
{
|
||||
int fd;
|
||||
char fn[PATH_MAX];
|
||||
|
||||
if (!startswith(dev, "/dev")) {
|
||||
snprintf(fn, sizeof(fn), "/dev/%s", dev);
|
||||
dev = fn;
|
||||
}
|
||||
|
||||
if ((fd = open(dev, O_RDWR)) < 0) {
|
||||
fprintf(stderr, "error open('%s'): %m\n", dev);
|
||||
return -1;
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
static int evdev_get_keycode(int fd, unsigned scancode, int e)
|
||||
{
|
||||
unsigned codes[2];
|
||||
|
||||
codes[0] = scancode;
|
||||
if (ioctl(fd, EVIOCGKEYCODE, codes) < 0) {
|
||||
if (e && errno == EINVAL) {
|
||||
return -2;
|
||||
} else {
|
||||
fprintf(stderr, "EVIOCGKEYCODE for scan code 0x%x: %m\n", scancode);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return codes[1];
|
||||
}
|
||||
|
||||
static int evdev_set_keycode(int fd, unsigned scancode, int keycode)
|
||||
{
|
||||
unsigned codes[2];
|
||||
|
||||
codes[0] = scancode;
|
||||
codes[1] = (unsigned) keycode;
|
||||
|
||||
if (ioctl(fd, EVIOCSKEYCODE, codes) < 0) {
|
||||
fprintf(stderr, "EVIOCSKEYCODE: %m\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int evdev_driver_version(int fd, char *v, size_t l)
|
||||
{
|
||||
int version;
|
||||
|
||||
if (ioctl(fd, EVIOCGVERSION, &version)) {
|
||||
fprintf(stderr, "EVIOCGVERSION: %m\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
snprintf(v, l, "%i.%i.%i.", version >> 16, (version >> 8) & 0xff, version & 0xff);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int evdev_device_name(int fd, char *n, size_t l)
|
||||
{
|
||||
if (ioctl(fd, EVIOCGNAME(l), n) < 0) {
|
||||
fprintf(stderr, "EVIOCGNAME: %m\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return a lower-case string with KEY_ prefix removed */
|
||||
static const char* format_keyname(const char* key) {
|
||||
static char result[101];
|
||||
const char* s;
|
||||
int len;
|
||||
|
||||
for (s = key+4, len = 0; *s && len < 100; ++len, ++s)
|
||||
result[len] = tolower(*s);
|
||||
result[len] = '\0';
|
||||
return result;
|
||||
}
|
||||
|
||||
static int dump_table(int fd) {
|
||||
char version[256], name[256];
|
||||
unsigned scancode;
|
||||
int r = -1;
|
||||
|
||||
if (evdev_driver_version(fd, version, sizeof(version)) < 0)
|
||||
goto fail;
|
||||
|
||||
if (evdev_device_name(fd, name, sizeof(name)) < 0)
|
||||
goto fail;
|
||||
|
||||
printf("### evdev %s, driver '%s'\n", version, name);
|
||||
|
||||
r = 0;
|
||||
for (scancode = 0; scancode < MAX_SCANCODES; scancode++) {
|
||||
int keycode;
|
||||
|
||||
if ((keycode = evdev_get_keycode(fd, scancode, 1)) < 0) {
|
||||
if (keycode == -2)
|
||||
continue;
|
||||
r = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (keycode < KEY_MAX && key_names[keycode])
|
||||
printf("0x%03x %s\n", scancode, format_keyname(key_names[keycode]));
|
||||
else
|
||||
printf("0x%03x 0x%03x\n", scancode, keycode);
|
||||
}
|
||||
fail:
|
||||
return r;
|
||||
}
|
||||
|
||||
static void set_key(int fd, const char* scancode_str, const char* keyname)
|
||||
{
|
||||
unsigned scancode;
|
||||
char *endptr;
|
||||
char t[105] = "KEY_UNKNOWN";
|
||||
const struct key *k;
|
||||
|
||||
scancode = (unsigned) strtol(scancode_str, &endptr, 0);
|
||||
if (*endptr != '\0') {
|
||||
fprintf(stderr, "ERROR: Invalid scancode\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
snprintf(t, sizeof(t), "KEY_%s", keyname);
|
||||
|
||||
if (!(k = lookup_key(t, strlen(t)))) {
|
||||
fprintf(stderr, "ERROR: Unknown key name '%s'\n", keyname);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (evdev_set_keycode(fd, scancode, k->id) < 0)
|
||||
fprintf(stderr, "setting scancode 0x%2X to key code %i failed\n",
|
||||
scancode, k->id);
|
||||
else
|
||||
printf("setting scancode 0x%2X to key code %i\n",
|
||||
scancode, k->id);
|
||||
}
|
||||
|
||||
static int merge_table(int fd, FILE *f) {
|
||||
int r = 0;
|
||||
int line = 0;
|
||||
|
||||
while (!feof(f)) {
|
||||
char s[256], *p;
|
||||
unsigned scancode;
|
||||
int new_keycode, old_keycode;
|
||||
|
||||
if (!fgets(s, sizeof(s), f))
|
||||
break;
|
||||
|
||||
line++;
|
||||
p = s+strspn(s, "\t ");
|
||||
if (*p == '#' || *p == '\n')
|
||||
continue;
|
||||
|
||||
if (sscanf(p, "%i %i", &scancode, &new_keycode) != 2) {
|
||||
char t[105] = "KEY_UNKNOWN";
|
||||
const struct key *k;
|
||||
|
||||
if (sscanf(p, "%i %100s", &scancode, t+4) != 2) {
|
||||
fprintf(stderr, "WARNING: Parse failure at line %i, ignoring.\n", line);
|
||||
r = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(k = lookup_key(t, strlen(t)))) {
|
||||
fprintf(stderr, "WARNING: Unknown key '%s' at line %i, ignoring.\n", t, line);
|
||||
r = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
new_keycode = k->id;
|
||||
}
|
||||
|
||||
|
||||
if ((old_keycode = evdev_get_keycode(fd, scancode, 0)) < 0) {
|
||||
r = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (evdev_set_keycode(fd, scancode, new_keycode) < 0) {
|
||||
r = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (new_keycode != old_keycode)
|
||||
fprintf(stderr, "Remapped scancode 0x%02x to 0x%02x (prior: 0x%02x)\n",
|
||||
scancode, new_keycode, old_keycode);
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
/* read one event; return 1 if valid */
|
||||
static int read_event(int fd, struct input_event* ev)
|
||||
{
|
||||
int ret;
|
||||
ret = read(fd, ev, sizeof(struct input_event));
|
||||
|
||||
if (ret < 0) {
|
||||
perror("read");
|
||||
return 0;
|
||||
}
|
||||
if (ret != sizeof(struct input_event)) {
|
||||
fprintf(stderr, "did not get enough data for event struct, aborting\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void print_key(unsigned scancode, uint16_t keycode, int has_scan, int has_key)
|
||||
{
|
||||
const char *keyname;
|
||||
|
||||
/* ignore key release events */
|
||||
if (has_key == 1)
|
||||
return;
|
||||
|
||||
if (has_key == 0 && has_scan != 0) {
|
||||
fprintf(stderr, "got scan code event 0x%02X without a key code event\n",
|
||||
scancode);
|
||||
return;
|
||||
}
|
||||
|
||||
if (has_scan != 0)
|
||||
printf("scan code: 0x%02X ", scancode);
|
||||
else
|
||||
printf("(no scan code received) ");
|
||||
|
||||
keyname = key_names[keycode];
|
||||
if (keyname != NULL)
|
||||
printf("key code: %s\n", format_keyname(keyname));
|
||||
else
|
||||
printf("key code: %03X\n", keycode);
|
||||
}
|
||||
|
||||
static void interactive(int fd)
|
||||
{
|
||||
struct input_event ev;
|
||||
unsigned last_scan = 0;
|
||||
uint16_t last_key = 0;
|
||||
int has_scan; /* boolean */
|
||||
int has_key; /* 0: none, 1: release, 2: press */
|
||||
|
||||
/* grab input device */
|
||||
ioctl(fd, EVIOCGRAB, 1);
|
||||
puts("Press ESC to finish, or Control-C if this device is not your primary keyboard");
|
||||
|
||||
has_scan = has_key = 0;
|
||||
while (read_event(fd, &ev)) {
|
||||
/* Drivers usually send the scan code first, then the key code,
|
||||
* then a SYN. Some drivers (like thinkpad_acpi) send the key
|
||||
* code first, and some drivers might not send SYN events, so
|
||||
* keep a robust state machine which can deal with any of those
|
||||
*/
|
||||
|
||||
if (ev.type == EV_MSC && ev.code == MSC_SCAN) {
|
||||
if (has_scan) {
|
||||
fputs("driver did not send SYN event in between key events; previous event:\n",
|
||||
stderr);
|
||||
print_key(last_scan, last_key, has_scan, has_key);
|
||||
has_key = 0;
|
||||
}
|
||||
|
||||
last_scan = ev.value;
|
||||
has_scan = 1;
|
||||
/*printf("--- got scan %u; has scan %i key %i\n", last_scan, has_scan, has_key); */
|
||||
}
|
||||
else if (ev.type == EV_KEY) {
|
||||
if (has_key) {
|
||||
fputs("driver did not send SYN event in between key events; previous event:\n",
|
||||
stderr);
|
||||
print_key(last_scan, last_key, has_scan, has_key);
|
||||
has_scan = 0;
|
||||
}
|
||||
|
||||
last_key = ev.code;
|
||||
has_key = 1 + ev.value;
|
||||
/*printf("--- got key %hu; has scan %i key %i\n", last_key, has_scan, has_key);*/
|
||||
|
||||
/* Stop on ESC */
|
||||
if (ev.code == KEY_ESC && ev.value == 0)
|
||||
break;
|
||||
}
|
||||
else if (ev.type == EV_SYN) {
|
||||
/*printf("--- got SYN; has scan %i key %i\n", has_scan, has_key);*/
|
||||
print_key(last_scan, last_key, has_scan, has_key);
|
||||
|
||||
has_scan = has_key = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* release input device */
|
||||
ioctl(fd, EVIOCGRAB, 0);
|
||||
}
|
||||
|
||||
_noreturn_ static void help(int error)
|
||||
{
|
||||
const char* h = "Usage: keymap <event device> [<map file>]\n"
|
||||
" keymap <event device> scancode keyname [...]\n"
|
||||
" keymap -i <event device>\n";
|
||||
if (error) {
|
||||
fputs(h, stderr);
|
||||
exit(2);
|
||||
} else {
|
||||
fputs(h, stdout);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
static const struct option options[] = {
|
||||
{ "help", no_argument, NULL, 'h' },
|
||||
{ "interactive", no_argument, NULL, 'i' },
|
||||
{}
|
||||
};
|
||||
int fd = -1;
|
||||
int opt_interactive = 0;
|
||||
int i;
|
||||
|
||||
while (1) {
|
||||
int option;
|
||||
|
||||
option = getopt_long(argc, argv, "hi", options, NULL);
|
||||
if (option == -1)
|
||||
break;
|
||||
|
||||
switch (option) {
|
||||
case 'h':
|
||||
help(0);
|
||||
|
||||
case 'i':
|
||||
opt_interactive = 1;
|
||||
break;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (argc < optind+1)
|
||||
help (1);
|
||||
|
||||
if ((fd = evdev_open(argv[optind])) < 0)
|
||||
return 3;
|
||||
|
||||
/* one argument (device): dump or interactive */
|
||||
if (argc == optind+1) {
|
||||
if (opt_interactive)
|
||||
interactive(fd);
|
||||
else
|
||||
dump_table(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* two arguments (device, mapfile): set map file */
|
||||
if (argc == optind+2) {
|
||||
const char *filearg = argv[optind+1];
|
||||
if (strchr(filearg, '/')) {
|
||||
/* Keymap file argument is a path */
|
||||
FILE *f = fopen(filearg, "re");
|
||||
if (f)
|
||||
merge_table(fd, f);
|
||||
else
|
||||
perror(filearg);
|
||||
} else {
|
||||
/* Keymap file argument is a filename */
|
||||
/* Open override file if present, otherwise default file */
|
||||
char keymap_path[PATH_MAX];
|
||||
FILE *f;
|
||||
|
||||
snprintf(keymap_path, sizeof(keymap_path), "/etc/udev/keymaps/%s", filearg);
|
||||
f = fopen(keymap_path, "re");
|
||||
if (f) {
|
||||
merge_table(fd, f);
|
||||
} else {
|
||||
snprintf(keymap_path, sizeof(keymap_path), UDEVLIBEXECDIR "/keymaps/%s", filearg);
|
||||
f = fopen(keymap_path, "re");
|
||||
if (f)
|
||||
merge_table(fd, f);
|
||||
else
|
||||
perror(keymap_path);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* more arguments (device, scancode/keyname pairs): set keys directly */
|
||||
if ((argc - optind - 1) % 2 == 0) {
|
||||
for (i = optind+1; i < argc; i += 2)
|
||||
set_key(fd, argv[i], argv[i+1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* invalid number of arguments */
|
||||
help(1);
|
||||
return 1; /* not reached */
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user