diff options
-rw-r--r-- | .gitlab-ci.yml | 20 | ||||
-rwxr-xr-x | .gitlab-ci/generate-evdev-keycodes.py | 212 | ||||
-rw-r--r-- | keycodes/evdev | 483 | ||||
-rw-r--r-- | keycodes/evdev.in | 217 | ||||
-rw-r--r-- | meson.build | 2 |
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 |