summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml20
-rwxr-xr-x.gitlab-ci/generate-evdev-keycodes.py212
-rw-r--r--keycodes/evdev483
-rw-r--r--keycodes/evdev.in217
-rw-r--r--meson.build2
5 files changed, 828 insertions, 106 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 21a6376..d6e9684 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -23,7 +23,7 @@ variables:
# Changing the tag will rebuild the container images. The value is just a
# string, but we use the date for human benefits.
- FDO_DISTRIBUTION_TAG: '2020-11-06.0'
+ FDO_DISTRIBUTION_TAG: '2021-01-08.0'
stages:
@@ -43,7 +43,7 @@ container-prep:
# minimal set of packages required to build xkeyboard-config.
BASE_PACKAGES: 'xorg-util-macros autoconf automake make gettext pkg-config gcc grep m4 python meson ninja git'
# extra packages we need for various tests
- EXTRA_PACKAGES: 'tree libxml2 bison xorg-xkbcomp python-pytest'
+ EXTRA_PACKAGES: 'tree libxml2 bison xorg-xkbcomp python-pytest python-libevdev'
FDO_DISTRIBUTION_PACKAGES: $BASE_PACKAGES $EXTRA_PACKAGES
@@ -162,6 +162,22 @@ meson_from_tarball:
TARBALL: "xkeyboard-config-master.tar.bz2"
GIT_STRATEGY: none
+# Checks for new evdev keycodes to be added to keycodes/evdev
+evdev keycode check:
+ extends:
+ - .default_setup
+ stage: test
+ script:
+ - .gitlab-ci/generate-evdev-keycodes.py --verbose || (echo "keycodes/evdev file needs to be updated" && false)
+ allow_failure: true
+ artifacts:
+ when: on_failure
+ name: Updated evdev keycodes
+ expire_in: 2 weeks
+ paths:
+ - keycodes/evdev
+ needs: ['container-prep']
+
xmllint:
extends:
- .default_setup
diff --git a/.gitlab-ci/generate-evdev-keycodes.py b/.gitlab-ci/generate-evdev-keycodes.py
new file mode 100755
index 0000000..fd8b0af
--- /dev/null
+++ b/.gitlab-ci/generate-evdev-keycodes.py
@@ -0,0 +1,212 @@
+#!/usr/bin/env python3
+#
+# Generate the keycodes/evdev file from the names defined in
+# linux/input-event-codes.h
+#
+# Note that this script relies on libevdev to provide the key names and
+# those are compiled in. Ensure you have a recent-enough libevdev to
+# generate this list.
+#
+
+import argparse
+import contextlib
+import re
+import sys
+try:
+ import libevdev
+except ImportError:
+ print('WARNING: python-libevdev not available, cannot check for new evdev keycodes', file=sys.stderr)
+ sys.exit(77)
+
+
+# The marker to search for in the template file, replaced with our generated
+# codes.
+replacement_marker = '@evdevkeys@'
+
+# These markers are put into the result file and are used to detect
+# the section that we added when parsing an existing file.
+section_header = 'Key codes below are autogenerated'
+section_footer = 'End of autogenerated key codes'
+
+
+def evdev_codes():
+ '''
+ Return the dict {code, name} for all known evdev codes.
+
+ The list of names is compiled into libevdev.so, use a recent libevdev
+ release to get the most up-to-date list.
+ '''
+ codes = {}
+ for c in libevdev.EV_KEY.codes:
+ # 112 because that's where our 1:1 keycode entries historically
+ # started.
+ # Undefined keys are those with a code < KEY_MAX but without a
+ # #define in the kernel header file
+ if c.value < 112 or not c.is_defined:
+ continue
+
+ if c.name.startswith('BTN_') or c.name == 'KEY_MAX':
+ continue
+
+ codes[c.value] = c.name
+
+ return codes
+
+
+def existing_keys(lines):
+ '''
+ Return the dict {code, name} for all existing keycodes in the templates
+ file.
+
+ This is a very simple parser, good enough for the keycodes/evdev file
+ but that's about it.
+ '''
+ pattern = re.compile(r'\s+\<([^>]+)\>\s+=\s+(\d+);')
+ keys = {}
+ for line in lines:
+ match = re.match(pattern, line)
+ if not match:
+ continue
+ keys[int(match.group(2))] = match.group(1)
+
+ return keys
+
+
+def generate_keycodes_file(template, codes):
+ '''
+ Generate a new keycodes/evdev file with line containing @evdevkeys@
+ replaced by the full list of known evdev key codes, including our
+ section_header/footer. Expected output:
+
+ ::
+
+ // $section_header
+ <I$keycode> = <$keycode + 8> // #define $kernel_name
+ ...
+ // $section_footer
+
+ '''
+ lines = template.readlines()
+ existing = existing_keys(lines)
+
+ output = []
+ for line in lines:
+ if replacement_marker not in line:
+ output.append(line)
+ continue
+
+ output.append(f'\t// {section_header}\n')
+
+ warned = False
+ for code, name in codes.items():
+ xkeycode = code + 8
+
+ if xkeycode > 255 and not warned:
+ warned = True
+ output.append('\n')
+ output.append('\t// Key codes below cannot be used in X\n')
+ output.append('\n')
+
+ if xkeycode in existing:
+ output.append(f'\talias <I{xkeycode}> = <{existing[xkeycode]}>; // #define {name:23s} {code}\n')
+ continue
+
+ # Special keys that need a comment
+ special_keys = {
+ 211: 'conflicts with AB11',
+ }
+
+ comment = special_keys.get(xkeycode, '')
+ if comment:
+ comment = f' {comment}'
+
+ output.append(f'\t<I{xkeycode}> = {xkeycode};\t\t// #define {name:23s} {code}{comment}\n')
+ output.append(f'\t// {section_footer}\n')
+
+ return output
+
+
+def extract_generated_keycodes(fp):
+ """
+ Return an iterator the keycode of any <I123> keys between the section
+ header and footer.
+ """
+ in_generated_section = False
+ pattern = re.compile('.*<I([0-9]*)>.*')
+
+ for line in fp:
+ if section_header in line:
+ in_generated_section = True
+ continue
+ elif section_footer in line:
+ return
+ elif in_generated_section:
+ match = pattern.match(line)
+ if match:
+ yield int(match[1])
+
+
+def compare_with(codes, oldfile):
+ '''
+ Extract the <I123> keycodes from between the section_header/footer of
+ oldfile and return a list of keycodes that are in codes but not in
+ oldfile.
+ '''
+ old_keycodes = extract_generated_keycodes(oldfile)
+ keycodes = [c + 8 for c in codes] # X keycode offset
+
+ # This does not detect keycodes in old_keycode but not in the new
+ # generated list - should never happen anyway.
+ return sorted(set(keycodes).difference(old_keycodes))
+
+
+def log_msg(msg):
+ print(msg, file=sys.stderr)
+
+
+def main():
+ parser = argparse.ArgumentParser(description='Generate the evdev keycode lists.')
+ parser.add_argument('--template', type=argparse.FileType('r'),
+ default=open('keycodes/evdev.in'),
+ help='The template file (default: keycodes/evdev.in)')
+ parser.add_argument('--output', type=str, default='keycodes/evdev', required=False,
+ help='The file to be written to (default: keycodes/evdev)')
+ parser.add_argument('--compare-with', type=argparse.FileType('r'),
+ default=open('keycodes/evdev'),
+ help='Compare generated output with the given file (default: keycodes/evdev)')
+ parser.add_argument('--verbose', action=argparse.BooleanOptionalAction,
+ help='Print verbose output to stderr')
+ ns = parser.parse_args()
+
+ codes = evdev_codes()
+ rc = 0
+ if ns.verbose:
+ kmin, kmax = min(codes.keys()), max(codes.keys())
+ log_msg(f'evdev keycode range: {kmin} ({kmin:#x}) → {kmax} ({kmax:#x})')
+
+ # We compare before writing so we can use the same filename for
+ # --compare-with and --output. That's also why --output has to be type
+ # str instead of FileType('w').
+ if ns.compare_with:
+ diff = compare_with(codes, ns.compare_with)
+ if diff:
+ rc = 1
+ if ns.verbose:
+ log_msg(f'File {ns.compare_with.name} is out of date, missing keycodes:')
+ for k in diff:
+ name = codes[k - 8] # remove the X offset
+ log_msg(f' <I{k}> // #define {name}')
+
+ with contextlib.ExitStack() as stack:
+ if ns.output == '-':
+ fd = sys.stdout
+ else:
+ fd = stack.enter_context(open(ns.output, 'w'))
+ output = generate_keycodes_file(ns.template, codes)
+ fd.write(''.join(output))
+
+ sys.exit(rc)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/keycodes/evdev b/keycodes/evdev
index ed16ea9..e7a42d9 100644
--- a/keycodes/evdev
+++ b/keycodes/evdev
@@ -190,109 +190,386 @@ default xkb_keycodes "evdev" {
// evdev has standardize names for these.
<LNFD> = 109; // #define KEY_LINEFEED 101
- <I120> = 120; // #define KEY_MACRO 112
- <I126> = 126; // #define KEY_KPPLUSMINUS 118
- <I128> = 128; // #define KEY_SCALE 120
- <I129> = 129; // #define KEY_KPCOMMA 121
- <I147> = 147; // #define KEY_MENU 139
- <I148> = 148; // #define KEY_CALC 140
- <I149> = 149; // #define KEY_SETUP 141
- <I150> = 150; // #define KEY_SLEEP 142
- <I151> = 151; // #define KEY_WAKEUP 143
- <I152> = 152; // #define KEY_FILE 144
- <I153> = 153; // #define KEY_SENDFILE 145
- <I154> = 154; // #define KEY_DELETEFILE 146
- <I155> = 155; // #define KEY_XFER 147
- <I156> = 156; // #define KEY_PROG1 148
- <I157> = 157; // #define KEY_PROG2 149
- <I158> = 158; // #define KEY_WWW 150
- <I159> = 159; // #define KEY_MSDOS 151
- <I160> = 160; // #define KEY_COFFEE 152
- <I161> = 161; // #define KEY_DIRECTION 153
- <I162> = 162; // #define KEY_CYCLEWINDOWS 154
- <I163> = 163; // #define KEY_MAIL 155
- <I164> = 164; // #define KEY_BOOKMARKS 156
- <I165> = 165; // #define KEY_COMPUTER 157
- <I166> = 166; // #define KEY_BACK 158
- <I167> = 167; // #define KEY_FORWARD 159
- <I168> = 168; // #define KEY_CLOSECD 160
- <I169> = 169; // #define KEY_EJECTCD 161
- <I170> = 170; // #define KEY_EJECTCLOSECD 162
- <I171> = 171; // #define KEY_NEXTSONG 163
- <I172> = 172; // #define KEY_PLAYPAUSE 164
- <I173> = 173; // #define KEY_PREVIOUSSONG 165
- <I174> = 174; // #define KEY_STOPCD 166
- <I175> = 175; // #define KEY_RECORD 167
- <I176> = 176; // #define KEY_REWIND 168
- <I177> = 177; // #define KEY_PHONE 169
- <I178> = 178; // #define KEY_ISO 170
- <I179> = 179; // #define KEY_CONFIG 171
- <I180> = 180; // #define KEY_HOMEPAGE 172
- <I181> = 181; // #define KEY_REFRESH 173
- <I182> = 182; // #define KEY_EXIT 174
- <I183> = 183; // #define KEY_MOVE 175
- <I184> = 184; // #define KEY_EDIT 176
- <I185> = 185; // #define KEY_SCROLLUP 177
- <I186> = 186; // #define KEY_SCROLLDOWN 178
- <I187> = 187; // #define KEY_KPLEFTPAREN 179
- <I188> = 188; // #define KEY_KPRIGHTPAREN 180
- <I189> = 189; // #define KEY_NEW 181
- <I190> = 190; // #define KEY_REDO 182
- <I208> = 208; // #define KEY_PLAYCD 200
- <I209> = 209; // #define KEY_PAUSECD 201
- <I210> = 210; // #define KEY_PROG3 202
- <I211> = 211; // #define KEY_PROG4 203 conflicts with AB11
- <I212> = 212; // #define KEY_DASHBOARD 204
- <I213> = 213; // #define KEY_SUSPEND 205
- <I214> = 214; // #define KEY_CLOSE 206
- <I215> = 215; // #define KEY_PLAY 207
- <I216> = 216; // #define KEY_FASTFORWARD 208
- <I217> = 217; // #define KEY_BASSBOOST 209
- <I218> = 218; // #define KEY_PRINT 210
- <I219> = 219; // #define KEY_HP 211
- <I220> = 220; // #define KEY_CAMERA 212
- <I221> = 221; // #define KEY_SOUND 213
- <I222> = 222; // #define KEY_QUESTION 214
- <I223> = 223; // #define KEY_EMAIL 215
- <I224> = 224; // #define KEY_CHAT 216
- <I225> = 225; // #define KEY_SEARCH 217
- <I226> = 226; // #define KEY_CONNECT 218
- <I227> = 227; // #define KEY_FINANCE 219
- <I228> = 228; // #define KEY_SPORT 220
- <I229> = 229; // #define KEY_SHOP 221
- <I230> = 230; // #define KEY_ALTERASE 222
- <I231> = 231; // #define KEY_CANCEL 223
- <I232> = 232; // #define KEY_BRIGHTNESSDOWN 224
- <I233> = 233; // #define KEY_BRIGHTNESSUP 225
- <I234> = 234; // #define KEY_MEDIA 226
- <I235> = 235; // #define KEY_SWITCHVIDEOMODE 227
- <I236> = 236; // #define KEY_KBDILLUMTOGGLE 228
- <I237> = 237; // #define KEY_KBDILLUMDOWN 229
- <I238> = 238; // #define KEY_KBDILLUMUP 230
- <I239> = 239; // #define KEY_SEND 231
- <I240> = 240; // #define KEY_REPLY 232
- <I241> = 241; // #define KEY_FORWARDMAIL 233
- <I242> = 242; // #define KEY_SAVE 234
- <I243> = 243; // #define KEY_DOCUMENTS 235
- <I244> = 244; // #define KEY_BATTERY 236
- <I245> = 245; // #define KEY_BLUETOOTH 237
- <I246> = 246; // #define KEY_WLAN 238
- <I247> = 247; // #define KEY_UWB 239
- <I248> = 248; // #define KEY_UNKNOWN 240
- <I249> = 249; // #define KEY_VIDEO_NEXT 241
- <I250> = 250; // #define KEY_VIDEO_PREV 242
- <I251> = 251; // #define KEY_BRIGHTNESS_CYCLE 243
- <I252> = 252; // #define KEY_BRIGHTNESS_ZERO 244
- <I253> = 253; // #define KEY_DISPLAY_OFF 245
- <I254> = 254; // #define KEY_WWAN 246
- <I255> = 255; // #define KEY_RFKILL 247
-
- <I372> = 372; // #define KEY_FAVORITES 364
- <I380> = 380; // #define KEY_FULL_SCREEN 372
- <I382> = 382; // #define KEY_KEYBOARD 374
- <I442> = 442; // #define KEY_DOLLAR 434
- <I443> = 443; // #define KEY_EURO 435
- <I569> = 569; // #define KEY_ROTATE_LOCK_TOGGLE 561
+
+ // Key codes below are autogenerated
+ <I120> = 120; // #define KEY_MACRO 112
+ alias <I121> = <MUTE>; // #define KEY_MUTE 113
+ alias <I122> = <VOL->; // #define KEY_VOLUMEDOWN 114
+ alias <I123> = <VOL+>; // #define KEY_VOLUMEUP 115
+ alias <I124> = <POWR>; // #define KEY_POWER 116
+ alias <I125> = <KPEQ>; // #define KEY_KPEQUAL 117
+ <I126> = 126; // #define KEY_KPPLUSMINUS 118
+ alias <I127> = <PAUS>; // #define KEY_PAUSE 119
+ <I128> = 128; // #define KEY_SCALE 120
+ <I129> = 129; // #define KEY_KPCOMMA 121
+ alias <I130> = <HNGL>; // #define KEY_HANGEUL 122
+ alias <I131> = <HJCV>; // #define KEY_HANJA 123
+ alias <I132> = <AE13>; // #define KEY_YEN 124
+ alias <I133> = <LWIN>; // #define KEY_LEFTMETA 125
+ alias <I134> = <RWIN>; // #define KEY_RIGHTMETA 126
+ alias <I135> = <COMP>; // #define KEY_COMPOSE 127
+ alias <I136> = <STOP>; // #define KEY_STOP 128
+ alias <I137> = <AGAI>; // #define KEY_AGAIN 129
+ alias <I138> = <PROP>; // #define KEY_PROPS 130
+ alias <I139> = <UNDO>; // #define KEY_UNDO 131
+ alias <I140> = <FRNT>; // #define KEY_FRONT 132
+ alias <I141> = <COPY>; // #define KEY_COPY 133
+ alias <I142> = <OPEN>; // #define KEY_OPEN 134
+ alias <I143> = <PAST>; // #define KEY_PASTE 135
+ alias <I144> = <FIND>; // #define KEY_FIND 136
+ alias <I145> = <CUT>; // #define KEY_CUT 137
+ alias <I146> = <HELP>; // #define KEY_HELP 138
+ <I147> = 147; // #define KEY_MENU 139
+ <I148> = 148; // #define KEY_CALC 140
+ <I149> = 149; // #define KEY_SETUP 141
+ <I150> = 150; // #define KEY_SLEEP 142
+ <I151> = 151; // #define KEY_WAKEUP 143
+ <I152> = 152; // #define KEY_FILE 144
+ <I153> = 153; // #define KEY_SENDFILE 145
+ <I154> = 154; // #define KEY_DELETEFILE 146
+ <I155> = 155; // #define KEY_XFER 147
+ <I156> = 156; // #define KEY_PROG1 148
+ <I157> = 157; // #define KEY_PROG2 149
+ <I158> = 158; // #define KEY_WWW 150
+ <I159> = 159; // #define KEY_MSDOS 151
+ <I160> = 160; // #define KEY_COFFEE 152
+ <I161> = 161; // #define KEY_ROTATE_DISPLAY 153
+ <I162> = 162; // #define KEY_CYCLEWINDOWS 154
+ <I163> = 163; // #define KEY_MAIL 155
+ <I164> = 164; // #define KEY_BOOKMARKS 156
+ <I165> = 165; // #define KEY_COMPUTER 157
+ <I166> = 166; // #define KEY_BACK 158
+ <I167> = 167; // #define KEY_FORWARD 159
+ <I168> = 168; // #define KEY_CLOSECD 160
+ <I169> = 169; // #define KEY_EJECTCD 161
+ <I170> = 170; // #define KEY_EJECTCLOSECD 162
+ <I171> = 171; // #define KEY_NEXTSONG 163
+ <I172> = 172; // #define KEY_PLAYPAUSE 164
+ <I173> = 173; // #define KEY_PREVIOUSSONG 165
+ <I174> = 174; // #define KEY_STOPCD 166
+ <I175> = 175; // #define KEY_RECORD 167
+ <I176> = 176; // #define KEY_REWIND 168
+ <I177> = 177; // #define KEY_PHONE 169
+ <I178> = 178; // #define KEY_ISO 170
+ <I179> = 179; // #define KEY_CONFIG 171
+ <I180> = 180; // #define KEY_HOMEPAGE 172
+ <I181> = 181; // #define KEY_REFRESH 173
+ <I182> = 182; // #define KEY_EXIT 174
+ <I183> = 183; // #define KEY_MOVE 175
+ <I184> = 184; // #define KEY_EDIT 176
+ <I185> = 185; // #define KEY_SCROLLUP 177
+ <I186> = 186; // #define KEY_SCROLLDOWN 178
+ <I187> = 187; // #define KEY_KPLEFTPAREN 179
+ <I188> = 188; // #define KEY_KPRIGHTPAREN 180
+ <I189> = 189; // #define KEY_NEW 181
+ <I190> = 190; // #define KEY_REDO 182
+ alias <I191> = <FK13>; // #define KEY_F13 183
+ alias <I192> = <FK14>; // #define KEY_F14 184
+ alias <I193> = <FK15>; // #define KEY_F15 185
+ alias <I194> = <FK16>; // #define KEY_F16 186
+ alias <I195> = <FK17>; // #define KEY_F17 187
+ alias <I196> = <FK18>; // #define KEY_F18 188
+ alias <I197> = <FK19>; // #define KEY_F19 189
+ alias <I198> = <FK20>; // #define KEY_F20 190
+ alias <I199> = <FK21>; // #define KEY_F21 191
+ alias <I200> = <FK22>; // #define KEY_F22 192
+ alias <I201> = <FK23>; // #define KEY_F23 193
+ alias <I202> = <FK24>; // #define KEY_F24 194
+ <I208> = 208; // #define KEY_PLAYCD 200
+ <I209> = 209; // #define KEY_PAUSECD 201
+ <I210> = 210; // #define KEY_PROG3 202
+ <I211> = 211; // #define KEY_PROG4 203 conflicts with AB11
+ <I212> = 212; // #define KEY_DASHBOARD 204
+ <I213> = 213; // #define KEY_SUSPEND 205
+ <I214> = 214; // #define KEY_CLOSE 206
+ <I215> = 215; // #define KEY_PLAY 207
+ <I216> = 216; // #define KEY_FASTFORWARD 208
+ <I217> = 217; // #define KEY_BASSBOOST 209
+ <I218> = 218; // #define KEY_PRINT 210
+ <I219> = 219; // #define KEY_HP 211
+ <I220> = 220; // #define KEY_CAMERA 212
+ <I221> = 221; // #define KEY_SOUND 213
+ <I222> = 222; // #define KEY_QUESTION 214
+ <I223> = 223; // #define KEY_EMAIL 215
+ <I224> = 224; // #define KEY_CHAT 216
+ <I225> = 225; // #define KEY_SEARCH 217
+ <I226> = 226; // #define KEY_CONNECT 218
+ <I227> = 227; // #define KEY_FINANCE 219
+ <I228> = 228; // #define KEY_SPORT 220
+ <I229> = 229; // #define KEY_SHOP 221
+ <I230> = 230; // #define KEY_ALTERASE 222
+ <I231> = 231; // #define KEY_CANCEL 223
+ <I232> = 232; // #define KEY_BRIGHTNESSDOWN 224
+ <I233> = 233; // #define KEY_BRIGHTNESSUP 225
+ <I234> = 234; // #define KEY_MEDIA 226
+ <I235> = 235; // #define KEY_SWITCHVIDEOMODE 227
+ <I236> = 236; // #define KEY_KBDILLUMTOGGLE 228
+ <I237> = 237; // #define KEY_KBDILLUMDOWN 229
+ <I238> = 238; // #define KEY_KBDILLUMUP 230
+ <I239> = 239; // #define KEY_SEND 231
+ <I240> = 240; // #define KEY_REPLY 232
+ <I241> = 241; // #define KEY_FORWARDMAIL 233
+ <I242> = 242; // #define KEY_SAVE 234
+ <I243> = 243; // #define KEY_DOCUMENTS 235
+ <I244> = 244; // #define KEY_BATTERY 236
+ <I245> = 245; // #define KEY_BLUETOOTH 237
+ <I246> = 246; // #define KEY_WLAN 238
+ <I247> = 247; // #define KEY_UWB 239
+ <I248> = 248; // #define KEY_UNKNOWN 240
+ <I249> = 249; // #define KEY_VIDEO_NEXT 241
+ <I250> = 250; // #define KEY_VIDEO_PREV 242
+ <I251> = 251; // #define KEY_BRIGHTNESS_CYCLE 243
+ <I252> = 252; // #define KEY_BRIGHTNESS_AUTO 244
+ <I253> = 253; // #define KEY_DISPLAY_OFF 245
+ <I254> = 254; // #define KEY_WWAN 246
+ <I255> = 255; // #define KEY_RFKILL 247
+
+ // Key codes below cannot be used in X
+
+ <I256> = 256; // #define KEY_MICMUTE 248
+ <I360> = 360; // #define KEY_OK 352
+ <I361> = 361; // #define KEY_SELECT 353
+ <I362> = 362; // #define KEY_GOTO 354
+ <I363> = 363; // #define KEY_CLEAR 355
+ <I364> = 364; // #define KEY_POWER2 356
+ <I365> = 365; // #define KEY_OPTION 357
+ <I366> = 366; // #define KEY_INFO 358
+ <I367> = 367; // #define KEY_TIME 359
+ <I368> = 368; // #define KEY_VENDOR 360
+ <I369> = 369; // #define KEY_ARCHIVE 361
+ <I370> = 370; // #define KEY_PROGRAM 362
+ <I371> = 371; // #define KEY_CHANNEL 363
+ <I372> = 372; // #define KEY_FAVORITES 364
+ <I373> = 373; // #define KEY_EPG 365
+ <I374> = 374; // #define KEY_PVR 366
+ <I375> = 375; // #define KEY_MHP 367
+ <I376> = 376; // #define KEY_LANGUAGE 368
+ <I377> = 377; // #define KEY_TITLE 369
+ <I378> = 378; // #define KEY_SUBTITLE 370
+ <I379> = 379; // #define KEY_ANGLE 371
+ <I380> = 380; // #define KEY_FULL_SCREEN 372
+ <I381> = 381; // #define KEY_MODE 373
+ <I382> = 382; // #define KEY_KEYBOARD 374
+ <I383> = 383; // #define KEY_ASPECT_RATIO 375
+ <I384> = 384; // #define KEY_PC 376
+ <I385> = 385; // #define KEY_TV 377
+ <I386> = 386; // #define KEY_TV2 378
+ <I387> = 387; // #define KEY_VCR 379
+ <I388> = 388; // #define KEY_VCR2 380
+ <I389> = 389; // #define KEY_SAT 381
+ <I390> = 390; // #define KEY_SAT2 382
+ <I391> = 391; // #define KEY_CD 383
+ <I392> = 392; // #define KEY_TAPE 384
+ <I393> = 393; // #define KEY_RADIO 385
+ <I394> = 394; // #define KEY_TUNER 386
+ <I395> = 395; // #define KEY_PLAYER 387
+ <I396> = 396; // #define KEY_TEXT 388
+ <I397> = 397; // #define KEY_DVD 389
+ <I398> = 398; // #define KEY_AUX 390
+ <I399> = 399; // #define KEY_MP3 391
+ <I400> = 400; // #define KEY_AUDIO 392
+ <I401> = 401; // #define KEY_VIDEO 393
+ <I402> = 402; // #define KEY_DIRECTORY 394
+ <I403> = 403; // #define KEY_LIST 395
+ <I404> = 404; // #define KEY_MEMO 396
+ <I405> = 405; // #define KEY_CALENDAR 397
+ <I406> = 406; // #define KEY_RED 398
+ <I407> = 407; // #define KEY_GREEN 399
+ <I408> = 408; // #define KEY_YELLOW 400
+ <I409> = 409; // #define KEY_BLUE 401
+ <I410> = 410; // #define KEY_CHANNELUP 402
+ <I411> = 411; // #define KEY_CHANNELDOWN 403
+ <I412> = 412; // #define KEY_FIRST 404
+ <I413> = 413; // #define KEY_LAST 405
+ <I414> = 414; // #define KEY_AB 406
+ <I415> = 415; // #define KEY_NEXT 407
+ <I416> = 416; // #define KEY_RESTART 408
+ <I417> = 417; // #define KEY_SLOW 409
+ <I418> = 418; // #define KEY_SHUFFLE 410
+ <I419> = 419; // #define KEY_BREAK 411
+ <I420> = 420; // #define KEY_PREVIOUS 412
+ <I421> = 421; // #define KEY_DIGITS 413
+ <I422> = 422; // #define KEY_TEEN 414
+ <I423> = 423; // #define KEY_TWEN 415
+ <I424> = 424; // #define KEY_VIDEOPHONE 416
+ <I425> = 425; // #define KEY_GAMES 417
+ <I426> = 426; // #define KEY_ZOOMIN 418
+ <I427> = 427; // #define KEY_ZOOMOUT 419
+ <I428> = 428; // #define KEY_ZOOMRESET 420
+ <I429> = 429; // #define KEY_WORDPROCESSOR 421
+ <I430> = 430; // #define KEY_EDITOR 422
+ <I431> = 431; // #define KEY_SPREADSHEET 423
+ <I432> = 432; // #define KEY_GRAPHICSEDITOR 424
+ <I433> = 433; // #define KEY_PRESENTATION 425
+ <I434> = 434; // #define KEY_DATABASE 426
+ <I435> = 435; // #define KEY_NEWS 427
+ <I436> = 436; // #define KEY_VOICEMAIL 428
+ <I437> = 437; // #define KEY_ADDRESSBOOK 429
+ <I438> = 438; // #define KEY_MESSENGER 430
+ <I439> = 439; // #define KEY_DISPLAYTOGGLE 431
+ <I440> = 440; // #define KEY_SPELLCHECK 432
+ <I441> = 441; // #define KEY_LOGOFF 433
+ <I442> = 442; // #define KEY_DOLLAR 434
+ <I443> = 443; // #define KEY_EURO 435
+ <I444> = 444; // #define KEY_FRAMEBACK 436
+ <I445> = 445; // #define KEY_FRAMEFORWARD 437
+ <I446> = 446; // #define KEY_CONTEXT_MENU 438
+ <I447> = 447; // #define KEY_MEDIA_REPEAT 439
+ <I448> = 448; // #define KEY_10CHANNELSUP 440
+ <I449> = 449; // #define KEY_10CHANNELSDOWN 441
+ <I450> = 450; // #define KEY_IMAGES 442
+ <I452> = 452; // #define KEY_NOTIFICATION_CENTER 444
+ <I453> = 453; // #define KEY_PICKUP_PHONE 445
+ <I454> = 454; // #define KEY_HANGUP_PHONE 446
+ <I456> = 456; // #define KEY_DEL_EOL 448
+ <I457> = 457; // #define KEY_DEL_EOS 449
+ <I458> = 458; // #define KEY_INS_LINE 450
+ <I459> = 459; // #define KEY_DEL_LINE 451
+ <I472> = 472; // #define KEY_FN 464
+ <I473> = 473; // #define KEY_FN_ESC 465
+ <I474> = 474; // #define KEY_FN_F1 466
+ <I475> = 475; // #define KEY_FN_F2 467
+ <I476> = 476; // #define KEY_FN_F3 468
+ <I477> = 477; // #define KEY_FN_F4 469
+ <I478> = 478; // #define KEY_FN_F5 470
+ <I479> = 479; // #define KEY_FN_F6 471
+ <I480> = 480; // #define KEY_FN_F7 472
+ <I481> = 481; // #define KEY_FN_F8 473
+ <I482> = 482; // #define KEY_FN_F9 474
+ <I483> = 483; // #define KEY_FN_F10 475
+ <I484> = 484; // #define KEY_FN_F11 476
+ <I485> = 485; // #define KEY_FN_F12 477
+ <I486> = 486; // #define KEY_FN_1 478
+ <I487> = 487; // #define KEY_FN_2 479
+ <I488> = 488; // #define KEY_FN_D 480
+ <I489> = 489; // #define KEY_FN_E 481
+ <I490> = 490; // #define KEY_FN_F 482
+ <I491> = 491; // #define KEY_FN_S 483
+ <I492> = 492; // #define KEY_FN_B 484
+ <I493> = 493; // #define KEY_FN_RIGHT_SHIFT 485
+ <I505> = 505; // #define KEY_BRL_DOT1 497
+ <I506> = 506; // #define KEY_BRL_DOT2 498
+ <I507> = 507; // #define KEY_BRL_DOT3 499
+ <I508> = 508; // #define KEY_BRL_DOT4 500
+ <I509> = 509; // #define KEY_BRL_DOT5 501
+ <I510> = 510; // #define KEY_BRL_DOT6 502
+ <I511> = 511; // #define KEY_BRL_DOT7 503
+ <I512> = 512; // #define KEY_BRL_DOT8 504
+ <I513> = 513; // #define KEY_BRL_DOT9 505
+ <I514> = 514; // #define KEY_BRL_DOT10 506
+ <I520> = 520; // #define KEY_NUMERIC_0 512
+ <I521> = 521; // #define KEY_NUMERIC_1 513
+ <I522> = 522; // #define KEY_NUMERIC_2 514
+ <I523> = 523; // #define KEY_NUMERIC_3 515
+ <I524> = 524; // #define KEY_NUMERIC_4 516
+ <I525> = 525; // #define KEY_NUMERIC_5 517
+ <I526> = 526; // #define KEY_NUMERIC_6 518
+ <I527> = 527; // #define KEY_NUMERIC_7 519
+ <I528> = 528; // #define KEY_NUMERIC_8 520
+ <I529> = 529; // #define KEY_NUMERIC_9 521
+ <I530> = 530; // #define KEY_NUMERIC_STAR 522
+ <I531> = 531; // #define KEY_NUMERIC_POUND 523
+ <I532> = 532; // #define KEY_NUMERIC_A 524
+ <I533> = 533; // #define KEY_NUMERIC_B 525
+ <I534> = 534; // #define KEY_NUMERIC_C 526
+ <I535> = 535; // #define KEY_NUMERIC_D 527
+ <I536> = 536; // #define KEY_CAMERA_FOCUS 528
+ <I537> = 537; // #define KEY_WPS_BUTTON 529
+ <I538> = 538; // #define KEY_TOUCHPAD_TOGGLE 530
+ <I539> = 539; // #define KEY_TOUCHPAD_ON 531
+ <I540> = 540; // #define KEY_TOUCHPAD_OFF 532
+ <I541> = 541; // #define KEY_CAMERA_ZOOMIN 533
+ <I542> = 542; // #define KEY_CAMERA_ZOOMOUT 534
+ <I543> = 543; // #define KEY_CAMERA_UP 535
+ <I544> = 544; // #define KEY_CAMERA_DOWN 536
+ <I545> = 545; // #define KEY_CAMERA_LEFT 537
+ <I546> = 546; // #define KEY_CAMERA_RIGHT 538
+ <I547> = 547; // #define KEY_ATTENDANT_ON 539
+ <I548> = 548; // #define KEY_ATTENDANT_OFF 540
+ <I549> = 549; // #define KEY_ATTENDANT_TOGGLE 541
+ <I550> = 550; // #define KEY_LIGHTS_TOGGLE 542
+ <I568> = 568; // #define KEY_ALS_TOGGLE 560
+ <I569> = 569; // #define KEY_ROTATE_LOCK_TOGGLE 561
+ <I584> = 584; // #define KEY_BUTTONCONFIG 576
+ <I585> = 585; // #define KEY_TASKMANAGER 577
+ <I586> = 586; // #define KEY_JOURNAL 578
+ <I587> = 587; // #define KEY_CONTROLPANEL 579
+ <I588> = 588; // #define KEY_APPSELECT 580
+ <I589> = 589; // #define KEY_SCREENSAVER 581
+ <I590> = 590; // #define KEY_VOICECOMMAND 582
+ <I591> = 591; // #define KEY_ASSISTANT 583
+ <I592> = 592; // #define KEY_KBD_LAYOUT_NEXT 584
+ <I600> = 600; // #define KEY_BRIGHTNESS_MIN 592
+ <I601> = 601; // #define KEY_BRIGHTNESS_MAX 593
+ <I616> = 616; // #define KEY_KBDINPUTASSIST_PREV 608
+ <I617> = 617; // #define KEY_KBDINPUTASSIST_NEXT 609
+ <I618> = 618; // #define KEY_KBDINPUTASSIST_PREVGROUP 610
+ <I619> = 619; // #define KEY_KBDINPUTASSIST_NEXTGROUP 611
+ <I620> = 620; // #define KEY_KBDINPUTASSIST_ACCEPT 612
+ <I621> = 621; // #define KEY_KBDINPUTASSIST_CANCEL 613
+ <I622> = 622; // #define KEY_RIGHT_UP 614
+ <I623> = 623; // #define KEY_RIGHT_DOWN 615
+ <I624> = 624; // #define KEY_LEFT_UP 616
+ <I625> = 625; // #define KEY_LEFT_DOWN 617
+ <I626> = 626; // #define KEY_ROOT_MENU 618
+ <I627> = 627; // #define KEY_MEDIA_TOP_MENU 619
+ <I628> = 628; // #define KEY_NUMERIC_11 620
+ <I629> = 629; // #define KEY_NUMERIC_12 621
+ <I630> = 630; // #define KEY_AUDIO_DESC 622
+ <I631> = 631; // #define KEY_3D_MODE 623
+ <I632> = 632; // #define KEY_NEXT_FAVORITE 624
+ <I633> = 633; // #define KEY_STOP_RECORD 625
+ <I634> = 634; // #define KEY_PAUSE_RECORD 626
+ <I635> = 635; // #define KEY_VOD 627
+ <I636> = 636; // #define KEY_UNMUTE 628
+ <I637> = 637; // #define KEY_FASTREVERSE 629
+ <I638> = 638; // #define KEY_SLOWREVERSE 630
+ <I639> = 639; // #define KEY_DATA 631
+ <I640> = 640; // #define KEY_ONSCREEN_KEYBOARD 632
+ <I641> = 641; // #define KEY_PRIVACY_SCREEN_TOGGLE 633
+ <I642> = 642; // #define KEY_SELECTIVE_SCREENSHOT 634
+ <I664> = 664; // #define KEY_MACRO1 656
+ <I665> = 665; // #define KEY_MACRO2 657
+ <I666> = 666; // #define KEY_MACRO3 658
+ <I667> = 667; // #define KEY_MACRO4 659
+ <I668> = 668; // #define KEY_MACRO5 660
+ <I669> = 669; // #define KEY_MACRO6 661
+ <I670> = 670; // #define KEY_MACRO7 662
+ <I671> = 671; // #define KEY_MACRO8 663
+ <I672> = 672; // #define KEY_MACRO9 664
+ <I673> = 673; // #define KEY_MACRO10 665
+ <I674> = 674; // #define KEY_MACRO11 666
+ <I675> = 675; // #define KEY_MACRO12 667
+ <I676> = 676; // #define KEY_MACRO13 668
+ <I677> = 677; // #define KEY_MACRO14 669
+ <I678> = 678; // #define KEY_MACRO15 670
+ <I679> = 679; // #define KEY_MACRO16 671
+ <I680> = 680; // #define KEY_MACRO17 672
+ <I681> = 681; // #define KEY_MACRO18 673
+ <I682> = 682; // #define KEY_MACRO19 674
+ <I683> = 683; // #define KEY_MACRO20 675
+ <I684> = 684; // #define KEY_MACRO21 676
+ <I685> = 685; // #define KEY_MACRO22 677
+ <I686> = 686; // #define KEY_MACRO23 678
+ <I687> = 687; // #define KEY_MACRO24 679
+ <I688> = 688; // #define KEY_MACRO25 680
+ <I689> = 689; // #define KEY_MACRO26 681
+ <I690> = 690; // #define KEY_MACRO27 682
+ <I691> = 691; // #define KEY_MACRO28 683
+ <I692> = 692; // #define KEY_MACRO29 684
+ <I693> = 693; // #define KEY_MACRO30 685
+ <I696> = 696; // #define KEY_MACRO_RECORD_START 688
+ <I697> = 697; // #define KEY_MACRO_RECORD_STOP 689
+ <I698> = 698; // #define KEY_MACRO_PRESET_CYCLE 690
+ <I699> = 699; // #define KEY_MACRO_PRESET1 691
+ <I700> = 700; // #define KEY_MACRO_PRESET2 692
+ <I701> = 701; // #define KEY_MACRO_PRESET3 693
+ <I704> = 704; // #define KEY_KBD_LCD_MENU1 696
+ <I705> = 705; // #define KEY_KBD_LCD_MENU2 697
+ <I706> = 706; // #define KEY_KBD_LCD_MENU3 698
+ <I707> = 707; // #define KEY_KBD_LCD_MENU4 699
+ <I708> = 708; // #define KEY_KBD_LCD_MENU5 700
+ // End of autogenerated key codes
// Fake keycodes for virtual keys
<LVL3> = 92;
diff --git a/keycodes/evdev.in b/keycodes/evdev.in
new file mode 100644
index 0000000..477152b
--- /dev/null
+++ b/keycodes/evdev.in
@@ -0,0 +1,217 @@
+// translation from evdev scancodes to something resembling xfree86 keycodes.
+
+default xkb_keycodes "evdev" {
+ minimum = 8;
+ maximum = 255;
+
+ # Added for pc105 compatibility
+ <LSGT> = 94;
+
+ <TLDE> = 49;
+ <AE01> = 10;
+ <AE02> = 11;
+ <AE03> = 12;
+ <AE04> = 13;
+ <AE05> = 14;
+ <AE06> = 15;
+ <AE07> = 16;
+ <AE08> = 17;
+ <AE09> = 18;
+ <AE10> = 19;
+ <AE11> = 20;
+ <AE12> = 21;
+ <BKSP> = 22;
+
+ <TAB> = 23;
+ <AD01> = 24;
+ <AD02> = 25;
+ <AD03> = 26;
+ <AD04> = 27;
+ <AD05> = 28;
+ <AD06> = 29;
+ <AD07> = 30;
+ <AD08> = 31;
+ <AD09> = 32;
+ <AD10> = 33;
+ <AD11> = 34;
+ <AD12> = 35;
+ <BKSL> = 51;
+ alias <AC12> = <BKSL>;
+ <RTRN> = 36;
+
+ <CAPS> = 66;
+ <AC01> = 38;
+ <AC02> = 39;
+ <AC03> = 40;
+ <AC04> = 41;
+ <AC05> = 42;
+ <AC06> = 43;
+ <AC07> = 44;
+ <AC08> = 45;
+ <AC09> = 46;
+ <AC10> = 47;
+ <AC11> = 48;
+
+ <LFSH> = 50;
+ <AB01> = 52;
+ <AB02> = 53;
+ <AB03> = 54;
+ <AB04> = 55;
+ <AB05> = 56;
+ <AB06> = 57;
+ <AB07> = 58;
+ <AB08> = 59;
+ <AB09> = 60;
+ <AB10> = 61;
+ <RTSH> = 62;
+
+ <LALT> = 64;
+ <LCTL> = 37;
+ <SPCE> = 65;
+ <RCTL> = 105;
+ <RALT> = 108;
+ // Microsoft keyboard extra keys
+ <LWIN> = 133;
+ <RWIN> = 134;
+ <COMP> = 135;
+ alias <MENU> = <COMP>;
+
+ <ESC> = 9;
+ <FK01> = 67;
+ <FK02> = 68;
+ <FK03> = 69;
+ <FK04> = 70;
+ <FK05> = 71;
+ <FK06> = 72;
+ <FK07> = 73;
+ <FK08> = 74;
+ <FK09> = 75;
+ <FK10> = 76;
+ <FK11> = 95;
+ <FK12> = 96;
+
+ <PRSC> = 107;
+ // <SYRQ> = 107;
+ <SCLK> = 78;
+ <PAUS> = 127;
+ // <BRK> = 419;
+
+ <INS> = 118;
+ <HOME> = 110;
+ <PGUP> = 112;
+ <DELE> = 119;
+ <END> = 115;
+ <PGDN> = 117;
+
+ <UP> = 111;
+ <LEFT> = 113;
+ <DOWN> = 116;
+ <RGHT> = 114;
+
+ <NMLK> = 77;
+ <KPDV> = 106;
+ <KPMU> = 63;
+ <KPSU> = 82;
+
+ <KP7> = 79;
+ <KP8> = 80;
+ <KP9> = 81;
+ <KPAD> = 86;
+
+ <KP4> = 83;
+ <KP5> = 84;
+ <KP6> = 85;
+
+ <KP1> = 87;
+ <KP2> = 88;
+ <KP3> = 89;
+ <KPEN> = 104;
+
+ <KP0> = 90;
+ <KPDL> = 91;
+ <KPEQ> = 125;
+
+ <FK13> = 191;
+ <FK14> = 192;
+ <FK15> = 193;
+ <FK16> = 194;
+ <FK17> = 195;
+ <FK18> = 196;
+ <FK19> = 197;
+ <FK20> = 198;
+ <FK21> = 199;
+ <FK22> = 200;
+ <FK23> = 201;
+ <FK24> = 202;
+
+ // Keys that are generated on Japanese keyboards
+
+ //<HZTG> = 93; // Hankaku/Zenkakau toggle - not actually used
+ alias <HZTG> = <TLDE>;
+ <HKTG> = 101; // Hiragana/Katakana toggle
+ <AB11> = 97; // backslash/underscore
+ <HENK> = 100; // Henkan
+ <MUHE> = 102; // Muhenkan
+ <AE13> = 132; // Yen
+ <KATA> = 98; // Katakana
+ <HIRA> = 99; // Hiragana
+ <JPCM> = 103; // KPJPComma
+ //<RO> = 97; // Romaji
+
+ // Keys that are generated on Korean keyboards
+
+ <HNGL> = 130; // Hangul Latin toggle
+ <HJCV> = 131; // Hangul to Hanja conversion
+
+ // Solaris compatibility
+
+ alias <LMTA> = <LWIN>;
+ alias <RMTA> = <RWIN>;
+ <MUTE> = 121;
+ <VOL-> = 122;
+ <VOL+> = 123;
+ <POWR> = 124;
+ <STOP> = 136;
+ <AGAI> = 137;
+ <PROP> = 138;
+ <UNDO> = 139;
+ <FRNT> = 140;
+ <COPY> = 141;
+ <OPEN> = 142;
+ <PAST> = 143;
+ <FIND> = 144;
+ <CUT> = 145;
+ <HELP> = 146;
+
+ // Extended keys that may be generated on "Internet" keyboards.
+ // evdev has standardize names for these.
+
+ <LNFD> = 109; // #define KEY_LINEFEED 101
+
+ @evdevkeys@
+
+ // Fake keycodes for virtual keys
+ <LVL3> = 92;
+ <MDSW> = 203;
+ <ALT> = 204;
+ <META> = 205;
+ <SUPR> = 206;
+ <HYPR> = 207;
+
+ indicator 1 = "Caps Lock";
+ indicator 2 = "Num Lock";
+ indicator 3 = "Scroll Lock";
+ indicator 4 = "Compose";
+ indicator 5 = "Kana";
+ indicator 6 = "Sleep";
+ indicator 7 = "Suspend";
+ indicator 8 = "Mute";
+ indicator 9 = "Misc";
+ indicator 10 = "Mail";
+ indicator 11 = "Charging";
+
+ alias <ALGR> = <RALT>;
+
+ // For Brazilian ABNT2
+ alias <KPPT> = <I129>;
+};
diff --git a/meson.build b/meson.build
index 2a63f85..1950d85 100644
--- a/meson.build
+++ b/meson.build
@@ -28,7 +28,7 @@ pkgconfig.generate(
# KcGST only need to be installed as-is
foreach dir: ['compat', 'geometry', 'keycodes', 'symbols', 'types']
install_subdir(dir,
- exclude_files: ['Makefile.am'],
+ exclude_files: ['Makefile.am', 'evdev.in'],
install_dir: dir_xkb_base)
endforeach