Merge pull request #3138 from matt335672/update_scancode_processing

Update scancode processing
This commit is contained in:
matt335672 2024-08-06 09:39:41 +01:00 committed by GitHub
commit 8fd941632d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
50 changed files with 1409 additions and 546 deletions

View File

@ -20,6 +20,7 @@ include_HEADERS = \
xrdp_client_info.h \
xrdp_constants.h \
xrdp_rail.h \
xrdp_scancode_defs.h \
xrdp_sockets.h
AM_CPPFLAGS = \

View File

@ -480,13 +480,10 @@
#define RDP_INPUT_MOUSEX 0x8002
/* Keyboard Event: keyboardFlags (2.2.8.1.1.3.1.1.1) */
/* TODO: to be renamed */
#define KBD_FLAG_RIGHT 0x0001
#define KBD_FLAG_EXT 0x0100 /* KBDFLAGS_EXTENDED */
#define KBD_FLAG_EXT1 0x0200 /* KBDFLAGS_EXTENDED1 */
#define KBD_FLAG_QUIET 0x1000
#define KBD_FLAG_DOWN 0x4000
#define KBD_FLAG_UP 0x8000
#define KBDFLAGS_EXTENDED 0x0100
#define KBDFLAGS_EXTENDED1 0x0200
#define KBDFLAGS_DOWN 0x4000
#define KBDFLAGS_RELEASE 0x8000
/* Mouse Event: pointerFlags (2.2.8.1.1.3.1.1.3) */
#define PTRFLAGS_HWHEEL 0x0400
@ -505,10 +502,9 @@
#define PTRXFLAGS_BUTTON2 0x0002
/* Synchronize Event: toggleFlags (2.2.8.1.1.3.1.1.5) */
/* TODO: to be renamed */
#define KBD_FLAG_SCROLL 0x0001 /* TS_SYNC_SCROLL_LOCK */
#define KBD_FLAG_NUMLOCK 0x0002
#define KBD_FLAG_CAPITAL 0x0004
#define TS_SYNC_SCROLL_LOCK 0x0001
#define TS_SYNC_NUM_LOCK 0x0002
#define TS_SYNC_CAPS_LOCK 0x0004
#define TS_SYNC_KANA_LOCK 0x0008
/* Client Fast-Path Input Event PDU 2.2.8.1.2 */

View File

@ -137,6 +137,7 @@ static const struct scancode_to_keycode
{ 0x079, 100 }, // - HENK
{ 0x07b, 102 }, // VK_OEM_PA1 MUHE
{ 0x07d, 132 }, // - AE13
{ 0x07e, 129 }, // VK_ABNT_C2 KPPT (Brazil ABNT2)
{ 0x110, 173 }, // VK_MEDIA_PREV_TRACK I173 (KEY_PREVIOUSSONG)
{ 0x119, 171 }, // VK_MEDIA_NEXT_TRACK I171 (KEY_NEXTSONG)
{ 0x11c, 104 }, // VK_RETURN KPEN
@ -167,7 +168,8 @@ static const struct scancode_to_keycode
{ 0x165, 225 }, // VK_BROWSER_SEARCH I225 (KEY_SEARCH)
{ 0x166, 164 }, // VK_BROWSER_FAVORITES I164 (KEY_BOOKMARKS)
{ 0x16b, 165 }, // VK_LAUNCH_APP1 I165 (KEY_COMPUTER)
{ 0x16c, 163 } // VK_LAUNCH_MAIL I163 (KEY_MAIL)
{ 0x16c, 163 }, // VK_LAUNCH_MAIL I163 (KEY_MAIL)
{ 0x21d, 127 } // VK_PAUSE PAUS (KEY_PAUSE)
};
// Sources:-
@ -271,6 +273,7 @@ static const struct scancode_to_keycode
{ 0x079, 129 }, // - XFER
{ 0x07b, 131 }, // VK_OEM_PA1 NFER
{ 0x07d, 133 }, // - AE13
{ 0x07e, 134 }, // VK_ABNT_C2 KPPT (Brazil ABNT2)
{ 0x11c, 108 }, // VK_RETURN KPEN
{ 0x11d, 109 }, // VK_RCONTROL RCTL
{ 0x120, 141 }, // VK_VOLUME_MUTE MUTE
@ -291,7 +294,8 @@ static const struct scancode_to_keycode
{ 0x153, 107 }, // VK_DELETE DELE
{ 0x15b, 115 }, // VK_LWIN LWIN
{ 0x15c, 116 }, // VK_RWIN RWIN
{ 0x15d, 117 } // VK_APPS COMP
{ 0x15d, 117 }, // VK_APPS COMP
{ 0x21d, 110 } // VK_PAUSE PAUS (KEY_PAUSE)
};
struct map_settings
@ -326,9 +330,63 @@ const struct map_settings global_settings[] =
// Default mapping set is "evdev"
const struct map_settings *settings = &global_settings[SI_EVDEV];
/*****************************************************************************/
int
scancode_to_index(unsigned short scancode)
{
if (scancode <= 0x7f)
{
return scancode;
}
if (scancode <= 0xff)
{
// 0x80 - 0xff : Invalid code
return -1;
}
if (scancode <= 0x177)
{
// 01x100 - 0x177 : Move bit 9 to bit 8
return (scancode & 0x7f) | 0x80;
}
if (scancode == SCANCODE_PAUSE_KEY)
{
return SCANCODE_INDEX_PAUSE_KEY;
}
// This leaves the following which are all rejected
// 0x178 - 0x17f (currently unused). These would map to indexes 0xf8
// to 0xff which we are reserving for extended1 keys.
// 0x180 - 0x1ff Illegal format
// >0x200 Anything not mentioned explicitly above (e.g.
// SCANCODE_PAUSE_KEY)
return -1;
}
/*****************************************************************************/
unsigned short
scancode_to_keycode(unsigned short scancode)
scancode_from_index(int index)
{
index &= 0xff;
unsigned short result;
if (index == SCANCODE_INDEX_PAUSE_KEY)
{
result = SCANCODE_PAUSE_KEY;
}
else if (index < 0x80)
{
result = index;
}
else
{
result = (index & 0x7f) | 0x100;
}
return result;
}
/*****************************************************************************/
unsigned short
scancode_to_x11_keycode(unsigned short scancode)
{
unsigned int min = 0;
unsigned int max = settings->size;
@ -419,3 +477,12 @@ scancode_get_keycode_set(void)
{
return settings->name;
}
/*****************************************************************************/
const char *
scancode_get_xkb_rules(void)
{
// Currently supported keycods map directly to the same name for
// the rules which use them.
return settings->name;
}

View File

@ -18,13 +18,32 @@
* @file common/scancode.h
* @brief Scancode handling
*
* Convert between RDP scancodes and X11 keycodes.
* This module provides functionality for the following:-
* 1) Mapping from TS_KEYBOARD_EVENT PDU values to an 'RDP scancode'
* 2) Handling RDP scancodes
* 3) Convert between RDP scancodes and X11 keycodes.
*
* RDP scancodes are largely the same as Windows scancodes. These are
* indirectly documented in the Microsoft "Keyboard Scan Code Specification",
* Rev 1.3a (March 16th 2000) and are otherwise known as "Scan code set
* 1" scancodes. This document no longer appears to be available directly from
* the Microsoft website.
* The values received in TS_KEYBOARD_EVENT PDUs are largely the same as
* Windows scancodes. These are indirectly documented in the Microsoft
* "Keyboard Scan Code Specification", Rev 1.3a (March 16th 2000) and
* are otherwise known as "Scan code set 1" scancodes. This document no
* longer appears to be available directly from the Microsoft website.
*
* A TS_KEYBOARD_EVENT_PDU contains two important values:-
* 1) key_code This is not unique. For example, left-shift and
* right-shift share a key_code of 0x2a
* 2) keyboard_flags Among other flags, contains KBDFLAGS_EXTENDED and
* KBDFLAGS_EXTENDED1. These combine with the key_code
* to allow a specific key to be determined.
*
* An 'RDP scancode' as defined by this module is a mapping of the
* Windows key_code and keyboard_flags into a single value which
* represents a unique key. For example:-
* Left control : key_code=0x1d, KBDFLAGS_EXTENDED=0 scancode = 0x1d
* Right control : key_code=0x1d, KBDFLAGS_EXTENDED=1 scancode = 0x11d
*
* This model of unique keys more closely maps what X11 does with its
* own keycodes.
*
* X11 keycodes are the X11 equivalent of RDP scancodes. In general, these
* are specific to an X server. In practice however, these are nowadays
@ -39,15 +58,69 @@
#if !defined(SCANCODE_H)
#define SCANCODE_H
#include "xrdp_scancode_defs.h"
enum
{
/**
* Scancodes for keys used in the code are defined in the global
* file xrdp_scancode_defs.h
*/
/**
* Scancode indexes for some of the keys in xrdp_scancode_defs.h
*/
SCANCODE_INDEX_LSHIFT_KEY = SCANCODE_LSHIFT_KEY,
SCANCODE_INDEX_RSHIFT_KEY = SCANCODE_RSHIFT_KEY,
SCANCODE_INDEX_RALT_KEY = (SCANCODE_RALT_KEY & 0x7f) | 0x80,
SCANCODE_INDEX_PAUSE_KEY = 0xf8,
// 0xf9 - 0xff reserved for future extended1 mappings
/**
* Maximum value returned by scancode_to_index()
*/
SCANCODE_MAX_INDEX = 255
};
/**
* Looks up an RDP scancode
* Convert a scancode to an index
* @param scancode scancode in the range 0x00 - 0x2ff
* @return index in the range 0..SCANCODE_MAX_INDEX (inclusive) or -1
*
* This function converts a 10-bit scancode into an 8-bit array index,
* independent of the currently loaded keymap
*
* This is possible as the scancodes from 0x80 - 0x2ff are sparsely allocated.
*
* For scancodes in the range 0x00 - 0x7f, the index is identical to the
* scancode. This includes scancodes for all the keys affected by
* numlock.
*/
int
scancode_to_index(unsigned short scancode);
/**
* Convert an index back to a scancode.
* @param index in the range 0..SCANCODE_MAX_INDEX
*
* @result scancode which is mapped to the index value
*
* The result is always a valid scancode, even if the index is
* not valid.
*/
unsigned short
scancode_from_index(int index);
/**
* Looks up an RDP scancode and converts to an x11 keycode
*
* @param scancode Scancode. Extended scancodes have bit 9 set
* (i.e. are in 0x100 - 0x1ff)
* (i.e. are in 0x100 - 0x1ff). Extended1 scancodes
* (currently just the pause key) are in the range 0x200-0x2ff
* @return keycode, or 0 for no keycode
*/
unsigned short
scancode_to_keycode(unsigned short scancode);
scancode_to_x11_keycode(unsigned short scancode);
/**
* Gets the next valid scancode from the list of valid scancodes
@ -84,4 +157,13 @@ scancode_set_keycode_set(const char *kk_set);
const char *
scancode_get_keycode_set(void);
/**
* Gets the XKB rules set which can be used to access the currently
* loaded keycode set
*
* @result "evdev", or "base"
*/
const char *
scancode_get_xkb_rules(void);
#endif /* SCANCODE_H */

View File

@ -200,6 +200,11 @@ struct xrdp_client_info
char layout[16];
char variant[16];
char options[256];
char xkb_rules[32];
// A few x11 keycodes are needed by the xup module
int x11_keycode_caps_lock;
int x11_keycode_num_lock;
int x11_keycode_scroll_lock;
/* ==================================================================== */
/* Private to xrdp below this line */
@ -269,6 +274,6 @@ enum xrdp_encoder_flags
/* yyyymmdd of last incompatible change to xrdp_client_info */
/* also used for changes to all the xrdp installed headers */
#define CLIENT_INFO_CURRENT_VERSION 20240514
#define CLIENT_INFO_CURRENT_VERSION 20240805
#endif

View File

@ -63,9 +63,6 @@
#define XRDP_MAX_BITMAP_CACHE_IDX 2000
#define XRDP_BITMAP_CACHE_ENTRIES 2048
#define XR_MIN_KEY_CODE 8
#define XR_MAX_KEY_CODE 256
/*
* Constants come from ITU-T Recommendations
*/
@ -288,12 +285,6 @@
#define FASTPATH_MAX_PACKET_SIZE 0x3fff
#define XR_RDP_SCAN_LSHIFT 42
#define XR_RDP_SCAN_ALT 56
// scancodes affected by numlock
#define XR_RDP_SCAN_MIN_NUMLOCK 71 // KP7
#define XR_RDP_SCAN_MAX_NUMLOCK 83 // KPDL
// Since we're not guaranteed to have pixman, copy these directives.
#define XRDP_PIXMAN_TYPE_ARGB 2
#define XRDP_PIXMAN_TYPE_ABGR 3

View File

@ -0,0 +1,88 @@
/**
* Copyright (C) 2024 Matt Burt, all xrdp contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file common/xrdp_scancode_defs.h
* @brief Scancode global definitions, shared with xorgxrdp
*/
#if !defined(XRDP_SCANCODE_DEFS_H)
#define XRDP_SCANCODE_DEFS_H
enum
{
/**
* Scancodes for keys received from the RDP client
*/
SCANCODE_LSHIFT_KEY = 0x2a,
SCANCODE_RSHIFT_KEY = 0x36,
SCANCODE_LCTRL_KEY = 0x1d,
SCANCODE_RCTRL_KEY = 0x11d,
SCANCODE_CAPS_KEY = 0x3a,
SCANCODE_NUMLOCK_KEY = 0x45,
SCANCODE_SCROLL_KEY = 0x46, // Scroll lock
SCANCODE_LALT_KEY = 0x38,
SCANCODE_RALT_KEY = 0x138,
SCANCODE_LWIN_KEY = 0x15b,
SCANCODE_RWIN_KEY = 0x15c,
SCANCODE_MENU_KEY = 0x15d,
SCANCODE_ESC_KEY = 0x01,
SCANCODE_BACKSPACE_KEY = 0x0e,
SCANCODE_ENTER_KEY = 0x1c,
SCANCODE_TAB_KEY = 0x0f,
SCANCODE_PAUSE_KEY = 0x21d,
SCANCODE_KP_ENTER_KEY = 0x11c,
SCANCODE_KP_DEL_KEY = 0x53,
SCANCODE_KP_1_KEY = 0x4f,
SCANCODE_KP_2_KEY = 0x50,
SCANCODE_KP_4_KEY = 0x4b,
SCANCODE_KP_6_KEY = 0x4d,
SCANCODE_KP_7_KEY = 0x47,
SCANCODE_KP_8_KEY = 0x48,
SCANCODE_LEFT_ARROW_KEY = 0x14b,
SCANCODE_RIGHT_ARROW_KEY = 0x14d,
SCANCODE_UP_ARROW_KEY = 0x148,
SCANCODE_DOWN_ARROW_KEY = 0x150,
SCANCODE_HOME_KEY = 0x147,
SCANCODE_DEL_KEY = 0x153,
SCANCODE_END_KEY = 0x14f,
/**
* Keys affected by numlock
* (this is not the whole keypad)
*/
SCANCODE_MIN_NUMLOCK = SCANCODE_KP_7_KEY,
SCANCODE_MAX_NUMLOCK = SCANCODE_KP_DEL_KEY
};
// Convert key_code and flags values received from a TS_KEYBOARD_EVENT
// into a value suitable for use by this module
#define SCANCODE_FROM_KBD_EVENT(key_code,keyboard_flags) \
(((key_code) & 0x7f) | ((keyboard_flags) & 0x300))
// Convert a scancode used by this module back into a
// TS_KEYBOARD_EVENT keyCode value
#define SCANCODE_TO_KBD_EVENT_KEY_CODE(scancode) ((scancode) & 0x7f)
// Convert a scancode used by this module back into a
// TS_KEYBOARD_EVENT keyboardFlags value
#define SCANCODE_TO_KBD_EVENT_KBD_FLAGS(scancode) ((scancode) & 0x300)
#endif /* XRDP_SCANCODE_DEFS_H */

View File

@ -390,6 +390,11 @@ use of \fBxrdp\-chansrv\fR facilities in the VNC session.
The first form of this setting is recommended, replacing \fIn\fR with the
X11 display number of the session.
.TP
\fBkeycode_set\fR=\fI<string>\fR
[Xorg only] Asks for the specified keycode set to be used by the X server.
Normally "evdev" or "base". The default should be correct for your system.
.SH "EXAMPLES"
This is an example \fBxrdp.ini\fR:

View File

@ -64,7 +64,7 @@
// Scancodes affected by numlock
#define IS_KEYPAD_SCANCODE(s) \
((s) >= XR_RDP_SCAN_MIN_NUMLOCK && (s) <= XR_RDP_SCAN_MAX_NUMLOCK)
((s) >= SCANCODE_MIN_NUMLOCK && (s) <= SCANCODE_MAX_NUMLOCK)
#define MAX_COMMENTS 10
@ -279,7 +279,7 @@ output_file_section(FILE *outf,
continue;
}
e.keycode = scancode_to_keycode(scancode);
e.keycode = scancode_to_x11_keycode(scancode);
nbytes = XLookupString(&e, text, 255, &ks, NULL);
if (ks == NoSymbol)
{
@ -299,7 +299,11 @@ output_file_section(FILE *outf,
unicode = wtext[0];
}
if (scancode > 0xff)
if (scancode > 0x1ff)
{
fputs("E1_", outf);
}
else if (scancode > 0xff)
{
fputs("E0_", outf);
}

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -706,6 +716,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -737,6 +748,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -828,6 +840,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -859,6 +872,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -950,6 +964,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -981,6 +996,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -707,6 +717,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -738,6 +749,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -829,6 +841,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -860,6 +873,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -951,6 +965,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -982,6 +997,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -340,6 +344,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -371,6 +376,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -459,6 +465,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -490,6 +497,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -581,6 +589,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -612,6 +621,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -701,6 +711,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -732,6 +743,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -823,6 +835,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -854,6 +867,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -942,6 +956,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -973,6 +988,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -826,6 +838,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -857,6 +870,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -948,6 +962,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -979,6 +994,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -99,6 +99,7 @@ version=2
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7D="165:U+00A5" # yen
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -130,6 +131,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -223,6 +225,7 @@ E0_6C="269025049" # XF86Mail
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7D="124:U+007C" # bar
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -254,6 +257,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -347,6 +351,7 @@ E0_6C="269025049" # XF86Mail
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7D="165:U+00A5" # yen
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -378,6 +383,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -471,6 +477,7 @@ E0_6C="269025049" # XF86Mail
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7D="124:U+007C" # bar
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -502,6 +509,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -595,6 +603,7 @@ E0_6C="269025049" # XF86Mail
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7D="165:U+00A5" # yen
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -626,6 +635,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -719,6 +729,7 @@ E0_6C="269025049" # XF86Mail
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7D="165:U+00A5" # yen
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -750,6 +761,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -843,6 +855,7 @@ E0_6C="269025049" # XF86Mail
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7D="124:U+007C" # bar
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -874,6 +887,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -967,6 +981,7 @@ E0_6C="269025049" # XF86Mail
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7D="124:U+007C" # bar
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -998,6 +1013,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -707,6 +717,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -738,6 +749,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -829,6 +841,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -860,6 +873,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -951,6 +965,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -982,6 +997,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -218,6 +220,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -249,6 +252,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -338,6 +342,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -368,6 +373,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -459,6 +465,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -490,6 +497,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -581,6 +589,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -612,6 +621,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -699,6 +709,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -729,6 +740,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -819,6 +831,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -850,6 +863,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -941,6 +955,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -972,6 +987,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -98,6 +98,7 @@ version=2
73="47:U+002F" # slash
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -129,6 +130,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -221,6 +223,7 @@ E0_6C="269025049" # XF86Mail
73="63:U+003F" # question
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -252,6 +255,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -344,6 +348,7 @@ E0_6C="269025049" # XF86Mail
73="176:U+00B0" # degree
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -375,6 +380,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -467,6 +473,7 @@ E0_6C="269025049" # XF86Mail
73="191:U+00BF" # questiondown
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -498,6 +505,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -590,6 +598,7 @@ E0_6C="269025049" # XF86Mail
73="47:U+002F" # slash
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -621,6 +630,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -711,6 +721,7 @@ E0_6C="269025049" # XF86Mail
73="176:U+00B0" # degree
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -742,6 +753,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -834,6 +846,7 @@ E0_6C="269025049" # XF86Mail
73="63:U+003F" # question
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -865,6 +878,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -956,6 +970,7 @@ E0_6C="269025049" # XF86Mail
73="191:U+00BF" # questiondown
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -987,6 +1002,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -462,6 +468,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -493,6 +500,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -584,6 +592,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -615,6 +624,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -706,6 +716,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -737,6 +748,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -828,6 +840,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -859,6 +872,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -218,6 +220,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -249,6 +252,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -338,6 +342,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -368,6 +373,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -459,6 +465,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -490,6 +497,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -580,6 +588,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -611,6 +620,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -699,6 +709,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -729,6 +740,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -819,6 +831,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -850,6 +863,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -941,6 +955,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -972,6 +987,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -584,6 +592,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -615,6 +624,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -463,6 +469,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -494,6 +501,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -585,6 +593,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -616,6 +625,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -705,6 +715,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -736,6 +747,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -827,6 +839,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -858,6 +871,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -341,6 +345,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -372,6 +377,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -462,6 +468,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -493,6 +500,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -584,6 +592,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -615,6 +624,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -706,6 +716,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -737,6 +748,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -828,6 +840,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -859,6 +872,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -949,6 +963,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -980,6 +995,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65463:U+0037" # KP_7

View File

@ -97,6 +97,7 @@ version=2
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -128,6 +129,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shift]
01="65307:U+001B" # Escape
@ -219,6 +221,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -250,6 +253,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[altgr]
01="65307:U+001B" # Escape
@ -338,6 +342,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -369,6 +374,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftaltgr]
01="65307:U+001B" # Escape
@ -449,6 +455,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -480,6 +487,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslock]
01="65307:U+001B" # Escape
@ -571,6 +579,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -602,6 +611,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[capslockaltgr]
01="65307:U+001B" # Escape
@ -684,6 +694,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -715,6 +726,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslock]
01="65307:U+001B" # Escape
@ -806,6 +818,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -837,6 +850,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[shiftcapslockaltgr]
01="65307:U+001B" # Escape
@ -923,6 +937,7 @@ E0_6C="269025049" # XF86Mail
70="65319" # Hiragana_Katakana
79="65315" # Henkan_Mode
7B="65314" # Muhenkan
7E="65454:U+002E" # KP_Decimal
E0_10="269025046" # XF86AudioPrev
E0_19="269025047" # XF86AudioNext
E0_1C="65421:U+000D" # KP_Enter
@ -954,6 +969,7 @@ E0_65="269025051" # XF86Search
E0_66="269025072" # XF86Favorites
E0_6B="269025075" # XF86MyComputer
E0_6C="269025049" # XF86Mail
E1_1D="65299" # Pause
[numlock]
47="65457:U+0031" # KP_1

@ -1 +1 @@
Subproject commit c6b41afa6986d5e6df18778a342b407cae40e1b5
Subproject commit e8208bfc0b9d122b1c393a659427fbb135e9cd75

View File

@ -151,6 +151,38 @@ xrdp_fastpath_send(struct xrdp_fastpath *self, struct stream *s)
return 0;
}
/*****************************************************************************/
/**
* Converts the fastpath keyboard event flags to slowpath event flags
* @param Faspath flags
* @return slowpath flags
*
* See [MMS-RDPBCGR] 2.2.8.1.1.3.1.1.1 and 2.2.8.1.2.2.1
*/
static int
get_slowpath_keyboard_event_flags(int fp_flags)
{
int flags = 0;
if (fp_flags & FASTPATH_INPUT_KBDFLAGS_RELEASE)
{
// Assume the key was down prior to this event - the fastpath
// message doesn't have a separate flag which maps to
// KBDFLAGS_DOWN
flags |= KBDFLAGS_DOWN | KBDFLAGS_RELEASE;
}
if (fp_flags & FASTPATH_INPUT_KBDFLAGS_EXTENDED)
{
flags |= KBDFLAGS_EXTENDED;
}
if (fp_flags & FASTPATH_INPUT_KBDFLAGS_EXTENDED1)
{
flags |= KBDFLAGS_EXTENDED1;
}
return flags;
}
/*****************************************************************************/
/* FASTPATH_INPUT_EVENT_SCANCODE */
static int
@ -159,7 +191,6 @@ xrdp_fastpath_process_EVENT_SCANCODE(struct xrdp_fastpath *self,
{
int flags;
int code;
flags = 0;
if (!s_check_rem_and_log(s, 1, "Parsing [MS-RDPBCGR] TS_FP_KEYBOARD_EVENT"))
{
@ -170,24 +201,7 @@ xrdp_fastpath_process_EVENT_SCANCODE(struct xrdp_fastpath *self,
"eventHeader.eventFlags 0x%2.2x, eventHeader.eventCode (ignored), "
"keyCode %d", eventFlags, code);
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
{
flags |= KBD_FLAG_UP;
}
else
{
flags |= KBD_FLAG_DOWN;
}
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_EXTENDED))
{
flags |= KBD_FLAG_EXT;
}
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_EXTENDED1))
{
flags |= KBD_FLAG_EXT1;
}
flags = get_slowpath_keyboard_event_flags(eventFlags);
xrdp_fastpath_session_callback(self, RDP_INPUT_SCANCODE,
code, 0, flags, 0);
@ -296,7 +310,6 @@ xrdp_fastpath_process_EVENT_UNICODE(struct xrdp_fastpath *self,
int flags;
int code;
flags = 0;
if (!s_check_rem_and_log(s, 2, "Parsing [MS-RDPBCGR] TS_FP_UNICODE_KEYBOARD_EVENT"))
{
return 1;
@ -307,18 +320,8 @@ xrdp_fastpath_process_EVENT_UNICODE(struct xrdp_fastpath *self,
"unicodeCode %d",
eventFlags, code);
if (eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE)
{
flags |= KBD_FLAG_UP;
}
else
{
flags |= KBD_FLAG_DOWN;
}
if (eventFlags & FASTPATH_INPUT_KBDFLAGS_EXTENDED)
{
flags |= KBD_FLAG_EXT;
}
flags = get_slowpath_keyboard_event_flags(eventFlags);
xrdp_fastpath_session_callback(self, RDP_INPUT_UNICODE,
code, 0, flags, 0);
return 0;

View File

@ -155,246 +155,6 @@ hex_str_to_bin(char *in, char *out, int out_len)
}
}
/*****************************************************************************/
static void
xrdp_load_keyboard_layout(struct xrdp_client_info *client_info)
{
int fd;
int index = 0;
int bytes;
struct list *names = (struct list *)NULL;
struct list *items = (struct list *)NULL;
struct list *values = (struct list *)NULL;
char *item = (char *)NULL;
char *value = (char *)NULL;
char *q = (char *)NULL;
char keyboard_cfg_file[256] = { 0 };
char rdp_layout[256] = { 0 };
const struct xrdp_keyboard_overrides *ko =
&client_info->xrdp_keyboard_overrides;
LOG(LOG_LEVEL_INFO, "xrdp_load_keyboard_layout: Keyboard information sent"
" by the RDP client, keyboard_type:[0x%02X], keyboard_subtype:[0x%02X],"
" keylayout:[0x%08X]",
client_info->keyboard_type, client_info->keyboard_subtype,
client_info->keylayout);
if (ko->type != -1)
{
LOG(LOG_LEVEL_INFO, "overrode keyboard_type 0x%02X"
" with 0x%02X", client_info->keyboard_type, ko->type);
client_info->keyboard_type = ko->type;
}
if (ko->subtype != -1)
{
LOG(LOG_LEVEL_INFO, "overrode keyboard_subtype 0x%02X"
" with 0x%02X", client_info->keyboard_subtype,
ko->subtype);
client_info->keyboard_subtype = ko->subtype;
}
if (ko->layout != -1)
{
LOG(LOG_LEVEL_INFO, "overrode keylayout 0x%08X"
" with 0x%08X", client_info->keylayout, ko->layout);
client_info->keylayout = ko->layout;
}
/* infer model/variant */
/* TODO specify different X11 keyboard models/variants */
g_memset(client_info->model, 0, sizeof(client_info->model));
g_memset(client_info->variant, 0, sizeof(client_info->variant));
g_strncpy(client_info->layout, "us", sizeof(client_info->layout) - 1);
if (client_info->keyboard_subtype == 3)
{
/* macintosh keyboard */
bytes = sizeof(client_info->variant);
g_strncpy(client_info->variant, "mac", bytes - 1);
}
else if (client_info->keyboard_subtype == 0)
{
/* default - standard subtype */
client_info->keyboard_subtype = 1;
}
g_snprintf(keyboard_cfg_file, 255, "%s/xrdp_keyboard.ini", XRDP_CFG_PATH);
LOG(LOG_LEVEL_DEBUG, "keyboard_cfg_file %s", keyboard_cfg_file);
fd = g_file_open_ro(keyboard_cfg_file);
if (fd >= 0)
{
int section_found = -1;
char section_rdp_layouts[256] = { 0 };
char section_layouts_map[256] = { 0 };
names = list_create();
names->auto_free = 1;
items = list_create();
items->auto_free = 1;
values = list_create();
values->auto_free = 1;
file_read_sections(fd, names);
for (index = 0; index < names->count; index++)
{
q = (char *)list_get_item(names, index);
if (g_strncasecmp("default", q, 8) != 0)
{
int i;
file_read_section(fd, q, items, values);
for (i = 0; i < items->count; i++)
{
item = (char *)list_get_item(items, i);
value = (char *)list_get_item(values, i);
LOG(LOG_LEVEL_DEBUG, "xrdp_load_keyboard_layout: item %s value %s",
item, value);
if (g_strcasecmp(item, "keyboard_type") == 0)
{
int v = g_atoi(value);
if (v == client_info->keyboard_type)
{
section_found = index;
}
}
else if (g_strcasecmp(item, "keyboard_subtype") == 0)
{
int v = g_atoi(value);
if (v != client_info->keyboard_subtype &&
section_found == index)
{
section_found = -1;
break;
}
}
else if (g_strcasecmp(item, "rdp_layouts") == 0)
{
if (section_found != -1 && section_found == index)
{
g_strncpy(section_rdp_layouts, value, 255);
}
}
else if (g_strcasecmp(item, "layouts_map") == 0)
{
if (section_found != -1 && section_found == index)
{
g_strncpy(section_layouts_map, value, 255);
}
}
else if (g_strcasecmp(item, "model") == 0)
{
if (section_found != -1 && section_found == index)
{
bytes = sizeof(client_info->model);
g_memset(client_info->model, 0, bytes);
g_strncpy(client_info->model, value, bytes - 1);
}
}
else if (g_strcasecmp(item, "variant") == 0)
{
if (section_found != -1 && section_found == index)
{
bytes = sizeof(client_info->variant);
g_memset(client_info->variant, 0, bytes);
g_strncpy(client_info->variant, value, bytes - 1);
}
}
else if (g_strcasecmp(item, "options") == 0)
{
if (section_found != -1 && section_found == index)
{
bytes = sizeof(client_info->options);
g_memset(client_info->options, 0, bytes);
g_strncpy(client_info->options, value, bytes - 1);
}
}
else
{
/*
* mixing items from different sections will result in
* skipping over current section.
*/
LOG(LOG_LEVEL_DEBUG, "xrdp_load_keyboard_layout: skipping "
"configuration item - %s, continuing to next "
"section", item);
break;
}
}
list_clear(items);
list_clear(values);
}
}
if (section_found == -1)
{
g_memset(section_rdp_layouts, 0, sizeof(char) * 256);
g_memset(section_layouts_map, 0, sizeof(char) * 256);
// read default section
file_read_section(fd, "default", items, values);
for (index = 0; index < items->count; index++)
{
item = (char *)list_get_item(items, index);
value = (char *)list_get_item(values, index);
if (g_strcasecmp(item, "rdp_layouts") == 0)
{
g_strncpy(section_rdp_layouts, value, 255);
}
else if (g_strcasecmp(item, "layouts_map") == 0)
{
g_strncpy(section_layouts_map, value, 255);
}
}
list_clear(items);
list_clear(values);
}
/* load the map */
file_read_section(fd, section_rdp_layouts, items, values);
for (index = 0; index < items->count; index++)
{
int rdp_layout_id;
item = (char *)list_get_item(items, index);
value = (char *)list_get_item(values, index);
rdp_layout_id = g_htoi(value);
if (rdp_layout_id == client_info->keylayout)
{
g_strncpy(rdp_layout, item, 255);
break;
}
}
list_clear(items);
list_clear(values);
file_read_section(fd, section_layouts_map, items, values);
for (index = 0; index < items->count; index++)
{
item = (char *)list_get_item(items, index);
value = (char *)list_get_item(values, index);
if (g_strcasecmp(item, rdp_layout) == 0)
{
bytes = sizeof(client_info->layout);
g_strncpy(client_info->layout, value, bytes - 1);
break;
}
}
list_delete(names);
list_delete(items);
list_delete(values);
LOG(LOG_LEVEL_INFO, "xrdp_load_keyboard_layout: model [%s] variant [%s] "
"layout [%s] options [%s]", client_info->model,
client_info->variant, client_info->layout, client_info->options);
g_file_close(fd);
}
else
{
LOG(LOG_LEVEL_ERROR, "xrdp_load_keyboard_layout: error opening %s",
keyboard_cfg_file);
}
}
/*****************************************************************************/
struct xrdp_sec *
xrdp_sec_create(struct xrdp_rdp *owner, struct trans *trans)
@ -2496,7 +2256,6 @@ xrdp_sec_in_mcs_data(struct xrdp_sec *self)
client_info->keyboard_type,
client_info->keyboard_subtype);
xrdp_load_keyboard_layout(client_info);
s->p = s->data;
return 0;

View File

@ -30,6 +30,7 @@
#define CURRENT_MOD_VER 3
struct source_info;
struct xrdp_client_info;
/* Defined in xrdp_client_info.h */
struct monitor_info;
@ -98,7 +99,9 @@ struct mod
int total_data_len, int flags);
int (*server_bell_trigger)(struct mod *v);
int (*server_chansrv_in_use)(struct mod *v);
tintptr server_dumby[100 - 28]; /* align, 100 minus the number of server
void (*server_init_xkb_layout)(struct mod *v,
struct xrdp_client_info *client_info);
tintptr server_dumby[100 - 29]; /* align, 100 minus the number of server
functions above */
/* common */
tintptr handle; /* pointer to self as long */

View File

@ -143,6 +143,8 @@ struct mod
int total_data_len, int flags);
int (*server_bell_trigger)(struct mod *v);
int (*server_chansrv_in_use)(struct mod *v);
void (*server_init_xkb_layout)(struct mod *v,
struct xrdp_client_info *client_info);
/* off screen bitmaps */
int (*server_create_os_surface)(struct mod *v, int rdpindex,
int width, int height);
@ -197,7 +199,7 @@ struct mod
int flags, int frame_id);
int (*server_session_info)(struct mod *v, const char *data,
int data_bytes);
tintptr server_dumby[100 - 47]; /* align, 100 minus the number of server
tintptr server_dumby[100 - 48]; /* align, 100 minus the number of server
functions above */
/* common */
tintptr handle; /* pointer to self as long */

View File

@ -7,6 +7,57 @@
#include "test_common.h"
// Max supported scancode value
#define MAX_SUPPORTED_SCANCODE 0x2ff
// Checks conversions to-and-from scancode indexes
START_TEST(test_scancode__scancode_to_index)
{
int i;
// In the range 0x00 - 0x7f, scancodes are the same as indexes
for (i = 0x0; i <= 0x7f; ++i)
{
ck_assert_int_eq(scancode_to_index(i), i);
ck_assert_int_eq(scancode_from_index(i), i);
}
// Scancodes from 0x80 - 0xff are not supported
for (i = 0x80; i <= 0xff; ++i)
{
ck_assert_int_eq(scancode_to_index(i), -1);
}
// 0x100 - 0x177 map to 0x80 - 0xf7
for (i = 0x100; i <= 0x177; ++i)
{
ck_assert_int_eq(scancode_to_index(i), i - 0x80);
ck_assert_int_eq(scancode_from_index(i - 0x80), i);
}
// Scancodes from 0x178 - 0x1ff are not supported
for (i = 0x178; i <= 0x1ff; ++i)
{
ck_assert_int_eq(scancode_to_index(i), -1);
}
// In the range 0x200 up, only SCANCODE_PAUSE_KEY is
// supported
ck_assert_int_ge(SCANCODE_PAUSE_KEY, 0x200);
ck_assert_int_le(SCANCODE_PAUSE_KEY, MAX_SUPPORTED_SCANCODE);
for (i = 0x200; i <= MAX_SUPPORTED_SCANCODE; ++i)
{
if (i == SCANCODE_PAUSE_KEY)
{
ck_assert_int_eq(scancode_to_index(i), SCANCODE_INDEX_PAUSE_KEY);
ck_assert_int_eq(scancode_from_index(SCANCODE_INDEX_PAUSE_KEY), i);
}
else
{
ck_assert_int_eq(scancode_to_index(i), -1);
}
}
}
// Checks all returned evdev scancodes are mapped to a keycode
START_TEST(test_scancode__keycode_sets)
{
@ -31,7 +82,9 @@ START_TEST(test_scancode__evdev_all_values_returned)
iter = 0;
while ((scancode = scancode_get_next(&iter)) != 0)
{
unsigned short keycode = scancode_to_keycode(scancode);
ck_assert_int_ge(scancode, 0);
ck_assert_int_le(scancode, MAX_SUPPORTED_SCANCODE);
unsigned short keycode = scancode_to_x11_keycode(scancode);
ck_assert_int_ne(keycode, 0);
}
}
@ -40,8 +93,8 @@ END_TEST
// Checks all invalid evdev scancodes return 0
START_TEST(test_scancode__evdev_bad_values_mapped_to_0)
{
// Store valid scancodes which are between 0 and 0x1ff
int valid[512] = {0};
// Store valid scancodes which are between 0 and MAX_SUPPORTED_SCANCODE
char valid[MAX_SUPPORTED_SCANCODE + 1] = {0};
unsigned int iter;
unsigned int scancode;
@ -50,14 +103,16 @@ START_TEST(test_scancode__evdev_bad_values_mapped_to_0)
iter = 0;
while ((scancode = scancode_get_next(&iter)) != 0)
{
ck_assert_int_ge(scancode, 0);
ck_assert_int_le(scancode, MAX_SUPPORTED_SCANCODE);
valid[scancode] = 1;
}
for (scancode = 0 ; scancode < 512; ++scancode)
for (scancode = 0 ; scancode <= MAX_SUPPORTED_SCANCODE; ++scancode)
{
if (!valid[scancode])
{
ck_assert_int_eq(scancode_to_keycode(scancode), 0);
ck_assert_int_eq(scancode_to_x11_keycode(scancode), 0);
}
}
}
@ -74,7 +129,9 @@ START_TEST(test_scancode__base_all_values_returned)
iter = 0;
while ((scancode = scancode_get_next(&iter)) != 0)
{
unsigned short keycode = scancode_to_keycode(scancode);
ck_assert_int_ge(scancode, 0);
ck_assert_int_le(scancode, MAX_SUPPORTED_SCANCODE);
unsigned short keycode = scancode_to_x11_keycode(scancode);
ck_assert_int_ne(keycode, 0);
}
}
@ -83,8 +140,8 @@ END_TEST
// Checks all invalid base scancodes return 0
START_TEST(test_scancode__base_bad_values_mapped_to_0)
{
// Store valid scancodes which are between 0 and 0x1ff
int valid[512] = {0};
// Store valid scancodes which are between 0 and MAX_SUPPORTED_SCANCODE
char valid[MAX_SUPPORTED_SCANCODE + 1] = {0};
unsigned int iter;
unsigned int scancode;
@ -93,14 +150,16 @@ START_TEST(test_scancode__base_bad_values_mapped_to_0)
iter = 0;
while ((scancode = scancode_get_next(&iter)) != 0)
{
ck_assert_int_ge(scancode, 0);
ck_assert_int_le(scancode, MAX_SUPPORTED_SCANCODE);
valid[scancode] = 1;
}
for (scancode = 0 ; scancode < 512; ++scancode)
for (scancode = 0 ; scancode <= MAX_SUPPORTED_SCANCODE; ++scancode)
{
if (!valid[scancode])
{
ck_assert_int_eq(scancode_to_keycode(scancode), 0);
ck_assert_int_eq(scancode_to_x11_keycode(scancode), 0);
}
}
}
@ -118,6 +177,7 @@ make_suite_test_scancode(void)
tc = tcase_create("scancode");
suite_add_tcase(s, tc);
tcase_add_test(tc, test_scancode__scancode_to_index);
tcase_add_test(tc, test_scancode__keycode_sets);
tcase_add_test(tc, test_scancode__evdev_all_values_returned);
tcase_add_test(tc, test_scancode__evdev_bad_values_mapped_to_0);

View File

@ -5,6 +5,8 @@ AM_CPPFLAGS = \
-DXRDP_PID_PATH=\"${localstatedir}/run\" \
-I$(top_srcdir)/common
AM_CFLAGS = $(X_CFLAGS)
module_LTLIBRARIES = \
libvnc.la

115
vnc/vnc.c
View File

@ -30,6 +30,8 @@
#include <config_ac.h>
#endif
#include <X11/keysym.h>
#include "vnc.h"
#include "vnc_clip.h"
#include "rfb.h"
@ -443,13 +445,90 @@ resize_server_to_client_layout(struct vnc *v)
return error;
}
/*****************************************************************************/
/**
* Process keysym messages
* @param v Module
* @param keysym Keysym of keypress
* @param keydown boolean - is key down?
* @return != 0 for error
*/
static int
process_keysym_msg(struct vnc *v, int keysym, int keydown)
{
struct stream *s = NULL;
int error = 0;
if (keysym > 0)
{
make_stream(s);
/* Break key processing [MS-RDPBCGR] 2.2.8.1.1.3.1.1.1 */
if (v->ignore_next_numlock)
{
v->ignore_next_numlock = 0;
if (keysym == XK_Num_Lock)
{
goto end_keysym_msg;
}
}
if (keysym == XK_ISO_Level3_Shift) /* altgr */
{
if (v->shift_state)
{
/* fix for mstsc sending left control down with altgr */
init_stream(s, 64);
out_uint8(s, RFB_C2S_KEY_EVENT);
out_uint8(s, 0); /* down flag */
out_uint8s(s, 2);
out_uint32_be(s, XK_Control_L); /* left control */
s_mark_end(s);
error = lib_send_copy(v, s);
if (error != 0)
{
goto end_keysym_msg;
}
}
}
init_stream(s, 64);
out_uint8(s, RFB_C2S_KEY_EVENT);
out_uint8(s, keydown ? 1 : 0);
out_uint8s(s, 2);
out_uint32_be(s, keysym);
s_mark_end(s);
error = lib_send_copy(v, s);
switch (keysym)
{
case XK_Control_L: /* left control */
v->shift_state = keydown;
break;
case XK_Pause:
// [MS-RDPBCGR] 2.2.8.1.1.3.1.1.1 - A pause key scancode
// (up or down) is always immediately followed by a
// numlock key which we should ignore
v->ignore_next_numlock = 1;
break;
default:
break;
}
}
end_keysym_msg:
free_stream(s);
return error;
}
/*****************************************************************************/
static int
lib_mod_event(struct vnc *v, int msg, long param1, long param2,
long param3, long param4)
{
struct stream *s;
int key;
int error;
int x;
int y;
@ -492,38 +571,7 @@ lib_mod_event(struct vnc *v, int msg, long param1, long param2,
}
else if ((msg >= 15) && (msg <= 16)) /* key events */
{
key = param2;
if (key > 0)
{
if (key == 65027) /* altgr */
{
if (v->shift_state)
{
/* fix for mstsc sending left control down with altgr */
init_stream(s, 8192);
out_uint8(s, RFB_C2S_KEY_EVENT);
out_uint8(s, 0); /* down flag */
out_uint8s(s, 2);
out_uint32_be(s, 65507); /* left control */
s_mark_end(s);
lib_send_copy(v, s);
}
}
init_stream(s, 8192);
out_uint8(s, RFB_C2S_KEY_EVENT);
out_uint8(s, msg == 15); /* down flag */
out_uint8s(s, 2);
out_uint32_be(s, key);
s_mark_end(s);
error = lib_send_copy(v, s);
if (key == 65507) /* left control */
{
v->shift_state = msg == 15;
}
}
error = process_keysym_msg(v, param2, (msg == 15));
}
/* mouse events
*
@ -613,7 +661,6 @@ lib_mod_event(struct vnc *v, int msg, long param1, long param2,
error = lib_send_copy(v, s);
}
}
free_stream(s);
return error;
}

View File

@ -69,6 +69,7 @@ enum vnc_resize_support_status
};
struct source_info;
struct xrdp_client_info;
/* Defined in vnc_clip.c */
struct vnc_clipboard_data;
@ -151,7 +152,9 @@ struct vnc
int total_data_len, int flags);
int (*server_bell_trigger)(struct vnc *v);
int (*server_chansrv_in_use)(struct vnc *v);
tintptr server_dumby[100 - 28]; /* align, 100 minus the number of server
void (*server_init_xkb_layout)(struct vnc *v,
struct xrdp_client_info *client_info);
tintptr server_dumby[100 - 29]; /* align, 100 minus the number of server
functions above */
/* common */
tintptr handle; /* pointer to self as long */
@ -170,6 +173,7 @@ struct vnc
char port[256];
int sck_closed;
int shift_state; /* 0 up, 1 down */
int ignore_next_numlock; /* Used in pause key processing */
int keylayout;
int clip_chanid;
struct vnc_clipboard_data *vc;

View File

@ -39,58 +39,62 @@
/*****************************************************************************/
struct xrdp_key_info *
get_key_info_from_scan_code(int device_flags, int scan_code, int *keys,
get_key_info_from_kbd_event(int keyboard_flags, int key_code, int *keys,
int caps_lock, int num_lock, int scroll_lock,
struct xrdp_keymap *keymap)
{
struct xrdp_key_info *rv;
int shift;
int altgr;
int ext;
int index;
ext = device_flags & KBD_FLAG_EXT; /* 0x0100 */
shift = keys[42] || keys[54];
altgr = keys[56] & KBD_FLAG_EXT; /* right alt */
shift = keys[SCANCODE_INDEX_LSHIFT_KEY] || keys[SCANCODE_INDEX_RSHIFT_KEY];
altgr = keys[SCANCODE_INDEX_RALT_KEY]; /* right alt */
rv = 0;
index = INDEX_FROM_SCANCODE(scan_code, ext);
if (num_lock &&
index >= XR_RDP_SCAN_MIN_NUMLOCK && index <= XR_RDP_SCAN_MAX_NUMLOCK)
index = scancode_to_index(SCANCODE_FROM_KBD_EVENT(key_code, keyboard_flags));
if (index >= 0)
{
rv = &(keymap->keys_numlock[index - XR_RDP_SCAN_MIN_NUMLOCK]);
}
else if (shift && caps_lock && altgr)
{
rv = &(keymap->keys_shiftcapslockaltgr[index]);
}
else if (shift && caps_lock)
{
rv = &(keymap->keys_shiftcapslock[index]);
}
else if (shift && altgr)
{
rv = &(keymap->keys_shiftaltgr[index]);
}
else if (shift)
{
rv = &(keymap->keys_shift[index]);
}
else if (caps_lock && altgr)
{
rv = &(keymap->keys_capslockaltgr[index]);
}
else if (caps_lock)
{
rv = &(keymap->keys_capslock[index]);
}
else if (altgr)
{
rv = &(keymap->keys_altgr[index]);
}
else
{
rv = &(keymap->keys_noshift[index]);
// scancode_to_index() guarantees to map numlock scancodes
// to the same index values.
if (num_lock &&
index >= SCANCODE_MIN_NUMLOCK &&
index <= SCANCODE_MAX_NUMLOCK)
{
rv = &(keymap->keys_numlock[index - SCANCODE_MIN_NUMLOCK]);
}
else if (shift && caps_lock && altgr)
{
rv = &(keymap->keys_shiftcapslockaltgr[index]);
}
else if (shift && caps_lock)
{
rv = &(keymap->keys_shiftcapslock[index]);
}
else if (shift && altgr)
{
rv = &(keymap->keys_shiftaltgr[index]);
}
else if (shift)
{
rv = &(keymap->keys_shift[index]);
}
else if (caps_lock && altgr)
{
rv = &(keymap->keys_capslockaltgr[index]);
}
else if (caps_lock)
{
rv = &(keymap->keys_capslock[index]);
}
else if (altgr)
{
rv = &(keymap->keys_altgr[index]);
}
else
{
rv = &(keymap->keys_noshift[index]);
}
}
return rv;
@ -98,13 +102,13 @@ get_key_info_from_scan_code(int device_flags, int scan_code, int *keys,
/*****************************************************************************/
int
get_keysym_from_scan_code(int device_flags, int scan_code, int *keys,
get_keysym_from_kbd_event(int keyboard_flags, int key_code, int *keys,
int caps_lock, int num_lock, int scroll_lock,
struct xrdp_keymap *keymap)
{
struct xrdp_key_info *ki;
ki = get_key_info_from_scan_code(device_flags, scan_code, keys,
ki = get_key_info_from_kbd_event(keyboard_flags, key_code, keys,
caps_lock, num_lock, scroll_lock,
keymap);
@ -118,13 +122,13 @@ get_keysym_from_scan_code(int device_flags, int scan_code, int *keys,
/*****************************************************************************/
char32_t
get_char_from_scan_code(int device_flags, int scan_code, int *keys,
get_char_from_kbd_event(int keyboard_flags, int key_code, int *keys,
int caps_lock, int num_lock, int scroll_lock,
struct xrdp_keymap *keymap)
{
struct xrdp_key_info *ki;
ki = get_key_info_from_scan_code(device_flags, scan_code, keys,
ki = get_key_info_from_kbd_event(keyboard_flags, key_code, keys,
caps_lock, num_lock, scroll_lock,
keymap);
@ -138,28 +142,34 @@ get_char_from_scan_code(int device_flags, int scan_code, int *keys,
/*****************************************************************************/
/**
* Tests a table key to see if it's a valid scancode
* Converts a table key to a scancode index value
*
* @param key Table key
* @param[out] scancode scancode index value (0..255) if 1 is returned
* @return Boolean != 0 if the key is valid
* @return index >= 0, or < 0 for an invalid key
*/
static int
is_valid_scancode(const char *key, int *scancode)
key_to_scancode_index(const char *key)
{
int rv = 0;
int extended = 0;
if ((key[0] == 'E' || key[0] == 'e') && key[1] == '0' && key[2] == '_')
int rv = -1;
int keyboard_flags = 0;
if ((key[0] == 'E' || key[0] == 'e') && key[2] == '_')
{
extended = 1;
key += 3;
if (key[1] == '0')
{
keyboard_flags |= KBDFLAGS_EXTENDED;
key += 3;
}
else if (key[1] == '1')
{
keyboard_flags |= KBDFLAGS_EXTENDED1;
key += 3;
}
}
if (isxdigit(key[0]) && isxdigit(key[1]) && key[2] == '\0')
{
rv = 1;
*scancode = XDIGIT_TO_VAL(key[0]) * 16 + XDIGIT_TO_VAL(key[1]);
*scancode = INDEX_FROM_SCANCODE(*scancode, extended);
int code = XDIGIT_TO_VAL(key[0]) * 16 + XDIGIT_TO_VAL(key[1]);
rv = scancode_to_index(SCANCODE_FROM_KBD_EVENT(code, keyboard_flags));
}
return rv;
}
@ -248,13 +258,14 @@ km_read_section(toml_table_t *tfile, const char *section_name,
{
const char *key;
toml_datum_t val;
int index;
int scancode; // index value 0..255
int i;
char *p;
const char *unicode_str;
for (index = 0 ; (key = toml_key_in(section, index)) != NULL; ++index)
for (i = 0 ; (key = toml_key_in(section, i)) != NULL; ++i)
{
if (!is_valid_scancode(key, &scancode))
// Get a scancode index from the key if possible
int sindex = key_to_scancode_index(key);
if (sindex < 0)
{
LOG(LOG_LEVEL_WARNING,
"Can't parse value '%s' in [%s] in keymap file",
@ -283,7 +294,7 @@ km_read_section(toml_table_t *tfile, const char *section_name,
/* Parse both values and add them to the keymap, logging any
* errors */
if (!is_valid_keysym(val.u.s, &keymap[scancode].sym))
if (!is_valid_keysym(val.u.s, &keymap[sindex].sym))
{
LOG(LOG_LEVEL_WARNING,
"Can't read KeySym for [%s]:%s in keymap file",
@ -291,7 +302,7 @@ km_read_section(toml_table_t *tfile, const char *section_name,
}
if (unicode_str != NULL &&
!is_valid_unicode_char(unicode_str, &keymap[scancode].chr))
!is_valid_unicode_char(unicode_str, &keymap[sindex].chr))
{
LOG(LOG_LEVEL_WARNING,
"Can't read unicode character for [%s]:%s in keymap file",
@ -383,19 +394,19 @@ km_load_file(const char *filename, struct xrdp_keymap *keymap)
keymap->keys_shiftcapslockaltgr);
/* The numlock map is much smaller and offset by
* XR_RDP_SCAN_MAX_NUMLOCK. Read the section into a temporary
* SCANCODE_MIX_NUMLOCK. Read the section into a temporary
* area and copy it over */
struct xrdp_key_info keys_numlock[256];
struct xrdp_key_info keys_numlock[SCANCODE_MAX_INDEX + 1];
int i;
for (i = XR_RDP_SCAN_MIN_NUMLOCK; i <= XR_RDP_SCAN_MAX_NUMLOCK; ++i)
for (i = SCANCODE_MIN_NUMLOCK; i <= SCANCODE_MAX_NUMLOCK; ++i)
{
keys_numlock[i].sym = 0;
keys_numlock[i].chr = 0;
}
km_read_section(tfile, "numlock", keys_numlock);
for (i = XR_RDP_SCAN_MIN_NUMLOCK; i <= XR_RDP_SCAN_MAX_NUMLOCK; ++i)
for (i = SCANCODE_MIN_NUMLOCK; i <= SCANCODE_MAX_NUMLOCK; ++i)
{
keymap->keys_numlock[i - XR_RDP_SCAN_MIN_NUMLOCK] = keys_numlock[i];
keymap->keys_numlock[i - SCANCODE_MIN_NUMLOCK] = keys_numlock[i];
}
toml_free(tfile);
@ -403,3 +414,253 @@ km_load_file(const char *filename, struct xrdp_keymap *keymap)
return rv;
}
/*****************************************************************************/
void
xrdp_init_xkb_layout(struct xrdp_client_info *client_info)
{
int fd;
int index = 0;
int bytes;
struct list *names = (struct list *)NULL;
struct list *items = (struct list *)NULL;
struct list *values = (struct list *)NULL;
char *item = (char *)NULL;
char *value = (char *)NULL;
char *q = (char *)NULL;
char keyboard_cfg_file[256] = { 0 };
char rdp_layout[256] = { 0 };
const struct xrdp_keyboard_overrides *ko =
&client_info->xrdp_keyboard_overrides;
LOG(LOG_LEVEL_INFO, "xrdp_init_xkb_layout: Keyboard information sent"
" by the RDP client, keyboard_type:[0x%02X], keyboard_subtype:[0x%02X],"
" keylayout:[0x%08X]",
client_info->keyboard_type, client_info->keyboard_subtype,
client_info->keylayout);
if (ko->type != -1)
{
LOG(LOG_LEVEL_INFO, "overrode keyboard_type 0x%02X"
" with 0x%02X", client_info->keyboard_type, ko->type);
client_info->keyboard_type = ko->type;
}
if (ko->subtype != -1)
{
LOG(LOG_LEVEL_INFO, "overrode keyboard_subtype 0x%02X"
" with 0x%02X", client_info->keyboard_subtype,
ko->subtype);
client_info->keyboard_subtype = ko->subtype;
}
if (ko->layout != -1)
{
LOG(LOG_LEVEL_INFO, "overrode keylayout 0x%08X"
" with 0x%08X", client_info->keylayout, ko->layout);
client_info->keylayout = ko->layout;
}
/* infer model/variant */
/* TODO specify different X11 keyboard models/variants */
g_memset(client_info->model, 0, sizeof(client_info->model));
g_memset(client_info->variant, 0, sizeof(client_info->variant));
g_strncpy(client_info->layout, "us", sizeof(client_info->layout) - 1);
if (client_info->keyboard_subtype == 3)
{
/* macintosh keyboard */
bytes = sizeof(client_info->variant);
g_strncpy(client_info->variant, "mac", bytes - 1);
}
else if (client_info->keyboard_subtype == 0)
{
/* default - standard subtype */
client_info->keyboard_subtype = 1;
}
g_snprintf(keyboard_cfg_file, 255, "%s/xrdp_keyboard.ini", XRDP_CFG_PATH);
LOG(LOG_LEVEL_DEBUG, "keyboard_cfg_file %s", keyboard_cfg_file);
fd = g_file_open_ro(keyboard_cfg_file);
if (fd >= 0)
{
int section_found = -1;
char section_rdp_layouts[256] = { 0 };
char section_layouts_map[256] = { 0 };
names = list_create();
names->auto_free = 1;
items = list_create();
items->auto_free = 1;
values = list_create();
values->auto_free = 1;
file_read_sections(fd, names);
for (index = 0; index < names->count; index++)
{
q = (char *)list_get_item(names, index);
if (g_strncasecmp("default", q, 8) != 0)
{
int i;
file_read_section(fd, q, items, values);
for (i = 0; i < items->count; i++)
{
item = (char *)list_get_item(items, i);
value = (char *)list_get_item(values, i);
LOG(LOG_LEVEL_DEBUG, "xrdp_init_xkb_layout: item %s value %s",
item, value);
if (g_strcasecmp(item, "keyboard_type") == 0)
{
int v = g_atoi(value);
if (v == client_info->keyboard_type)
{
section_found = index;
}
}
else if (g_strcasecmp(item, "keyboard_subtype") == 0)
{
int v = g_atoi(value);
if (v != client_info->keyboard_subtype &&
section_found == index)
{
section_found = -1;
break;
}
}
else if (g_strcasecmp(item, "rdp_layouts") == 0)
{
if (section_found != -1 && section_found == index)
{
g_strncpy(section_rdp_layouts, value, 255);
}
}
else if (g_strcasecmp(item, "layouts_map") == 0)
{
if (section_found != -1 && section_found == index)
{
g_strncpy(section_layouts_map, value, 255);
}
}
else if (g_strcasecmp(item, "model") == 0)
{
if (section_found != -1 && section_found == index)
{
bytes = sizeof(client_info->model);
g_memset(client_info->model, 0, bytes);
g_strncpy(client_info->model, value, bytes - 1);
}
}
else if (g_strcasecmp(item, "variant") == 0)
{
if (section_found != -1 && section_found == index)
{
bytes = sizeof(client_info->variant);
g_memset(client_info->variant, 0, bytes);
g_strncpy(client_info->variant, value, bytes - 1);
}
}
else if (g_strcasecmp(item, "options") == 0)
{
if (section_found != -1 && section_found == index)
{
bytes = sizeof(client_info->options);
g_memset(client_info->options, 0, bytes);
g_strncpy(client_info->options, value, bytes - 1);
}
}
else
{
/*
* mixing items from different sections will result in
* skipping over current section.
*/
LOG(LOG_LEVEL_DEBUG, "xrdp_init_xkb_layout: skipping "
"configuration item - %s, continuing to next "
"section", item);
break;
}
}
list_clear(items);
list_clear(values);
}
}
if (section_found == -1)
{
g_memset(section_rdp_layouts, 0, sizeof(char) * 256);
g_memset(section_layouts_map, 0, sizeof(char) * 256);
// read default section
file_read_section(fd, "default", items, values);
for (index = 0; index < items->count; index++)
{
item = (char *)list_get_item(items, index);
value = (char *)list_get_item(values, index);
if (g_strcasecmp(item, "rdp_layouts") == 0)
{
g_strncpy(section_rdp_layouts, value, 255);
}
else if (g_strcasecmp(item, "layouts_map") == 0)
{
g_strncpy(section_layouts_map, value, 255);
}
}
list_clear(items);
list_clear(values);
}
/* load the map */
file_read_section(fd, section_rdp_layouts, items, values);
for (index = 0; index < items->count; index++)
{
int rdp_layout_id;
item = (char *)list_get_item(items, index);
value = (char *)list_get_item(values, index);
rdp_layout_id = g_htoi(value);
if (rdp_layout_id == client_info->keylayout)
{
g_strncpy(rdp_layout, item, 255);
break;
}
}
list_clear(items);
list_clear(values);
file_read_section(fd, section_layouts_map, items, values);
for (index = 0; index < items->count; index++)
{
item = (char *)list_get_item(items, index);
value = (char *)list_get_item(values, index);
if (g_strcasecmp(item, rdp_layout) == 0)
{
bytes = sizeof(client_info->layout);
g_strncpy(client_info->layout, value, bytes - 1);
break;
}
}
list_delete(names);
list_delete(items);
list_delete(values);
LOG(LOG_LEVEL_INFO, "xrdp_init_xkb_layout: model [%s] variant [%s] "
"layout [%s] options [%s]", client_info->model,
client_info->variant, client_info->layout, client_info->options);
g_file_close(fd);
}
else
{
LOG(LOG_LEVEL_ERROR, "xrdp_init_xkb_layout: error opening %s",
keyboard_cfg_file);
}
// Initialise the rules and a few keycodes for xorgxrdp
snprintf(client_info->xkb_rules, sizeof(client_info->xkb_rules),
"%s", scancode_get_xkb_rules());
client_info->x11_keycode_caps_lock =
scancode_to_x11_keycode(SCANCODE_CAPS_KEY);
client_info->x11_keycode_num_lock =
scancode_to_x11_keycode(SCANCODE_NUMLOCK_KEY);
client_info->x11_keycode_scroll_lock =
scancode_to_x11_keycode(SCANCODE_SCROLL_KEY);
}

View File

@ -147,8 +147,14 @@ int
xrdp_wm_mouse_touch(struct xrdp_wm *self, int gesture, int param);
int
xrdp_wm_mouse_click(struct xrdp_wm *self, int x, int y, int but, int down);
/**
* Handle a TS_KEYBOARD_EVENT ([MS-RDPBCGR] 2.2.8.1.1.3.1.1.1)
*
* @param device_flags keyboardFlags value from PDU
* @param key_code keyCode value from PDU
*/
int
xrdp_wm_key(struct xrdp_wm *self, int device_flags, int scan_code);
xrdp_wm_key(struct xrdp_wm *self, int keyboard_flags, int key_code);
int
xrdp_wm_key_sync(struct xrdp_wm *self, int device_flags, int key_flags);
int
@ -424,15 +430,15 @@ set_string(char **in_str, const char *in);
/* in lang.c */
struct xrdp_key_info *
get_key_info_from_scan_code(int device_flags, int scan_code, int *keys,
get_key_info_from_kbd_event(int keyboard_flags, int key_code, int *keys,
int caps_lock, int num_lock, int scroll_lock,
struct xrdp_keymap *keymap);
int
get_keysym_from_scan_code(int device_flags, int scan_code, int *keys,
get_keysym_from_kbd_event(int keyboard_flags, int key_code, int *keys,
int caps_lock, int num_lock, int scroll_lock,
struct xrdp_keymap *keymap);
char32_t
get_char_from_scan_code(int device_flags, int scan_code, int *keys,
get_char_from_kbd_event(int keyboard_flags, int key_code, int *keys,
int caps_lock, int num_lock, int scroll_lock,
struct xrdp_keymap *keymap);
int
@ -441,6 +447,19 @@ get_keymaps(int keylayout, struct xrdp_keymap *keymap);
int
km_load_file(const char *filename, struct xrdp_keymap *keymap);
/**
* initialise the XKB layout
*
* Not all backends need to use XKB for keyboard mapping. This
* call is used by those modules that do need an XKB mapping.
*
* Other modules and the login screen use other routines in
* lang.c to interpret incoming RDP scancodes
* @param client_info Client info struct to initialise
*/
void
xrdp_init_xkb_layout(struct xrdp_client_info *client_info);
/* xrdp_login_wnd.c */
/**
* Gets the DPI of the login (primary) monitor
@ -522,6 +541,9 @@ int
server_bell_trigger(struct xrdp_mod *mod);
int
server_chansrv_in_use(struct xrdp_mod *mod);
void
server_init_xkb_layout(struct xrdp_mod *mod,
struct xrdp_client_info *client_info);
int
server_fill_rect(struct xrdp_mod *mod, int x, int y, int cx, int cy);
int

View File

@ -248,6 +248,7 @@ username=ask
password=ask
port=-1
code=20
#keycode_set=evdev
[Xvnc]
name=Xvnc

View File

@ -1024,9 +1024,6 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
{
int n;
int i;
int shift;
int ext;
int scan_code;
struct xrdp_bitmap *b;
struct xrdp_bitmap *focus_out_control;
@ -1044,12 +1041,13 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
{
if (msg == WM_KEYDOWN)
{
scan_code = param1 % 128;
int scan_code = SCANCODE_FROM_KBD_EVENT(param1, param2);
int shift = self->wm->keys[SCANCODE_INDEX_LSHIFT_KEY] ||
self->wm->keys[SCANCODE_INDEX_RSHIFT_KEY];
if (scan_code == 15) /* tab */
if (scan_code == SCANCODE_TAB_KEY) /* tab */
{
/* move to next tab stop */
shift = self->wm->keys[42] || self->wm->keys[54];
i = -1;
if (self->child_list != 0)
@ -1114,7 +1112,8 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
}
}
else if (scan_code == 28) /* enter */
else if (scan_code == SCANCODE_ENTER_KEY ||
scan_code == SCANCODE_KP_ENTER_KEY)
{
if (self->default_button != 0)
{
@ -1126,7 +1125,7 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
}
}
else if (scan_code == 1) /* esc */
else if (scan_code == SCANCODE_ESC_KEY)
{
if (self->esc_button != 0)
{
@ -1149,12 +1148,13 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
{
if (msg == WM_KEYDOWN)
{
scan_code = param1 % 128;
ext = param2 & 0x0100;
int scan_code = SCANCODE_FROM_KBD_EVENT(param1, param2);
int num_lock = self->wm->num_lock;
/* left or up arrow */
if ((scan_code == 75 || scan_code == 72) &&
(ext || self->wm->num_lock == 0))
if ((scan_code == SCANCODE_LEFT_ARROW_KEY) ||
(scan_code == SCANCODE_UP_ARROW_KEY) ||
(!num_lock && (scan_code == SCANCODE_KP_4_KEY)) ||
(!num_lock && (scan_code == SCANCODE_KP_8_KEY)))
{
if (self->edit_pos > 0)
{
@ -1163,8 +1163,10 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
}
/* right or down arrow */
else if ((scan_code == 77 || scan_code == 80) &&
(ext || self->wm->num_lock == 0))
else if ((scan_code == SCANCODE_RIGHT_ARROW_KEY) ||
(scan_code == SCANCODE_DOWN_ARROW_KEY) ||
(!num_lock && (scan_code == SCANCODE_KP_6_KEY)) ||
(!num_lock && (scan_code == SCANCODE_KP_2_KEY)))
{
if (self->edit_pos < (int)utf8_char_count(self->caption1))
{
@ -1173,7 +1175,7 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
}
/* backspace */
else if (scan_code == 14)
else if (scan_code == SCANCODE_BACKSPACE_KEY)
{
n = utf8_char_count(self->caption1);
@ -1188,8 +1190,9 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
}
/* delete */
else if (scan_code == 83 &&
(ext || self->wm->num_lock == 0))
else if ((scan_code == SCANCODE_DEL_KEY) ||
(!num_lock && (scan_code == SCANCODE_KP_DEL_KEY)))
{
n = utf8_char_count(self->caption1);
@ -1203,8 +1206,8 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
}
/* end */
else if (scan_code == 79 &&
(ext || self->wm->num_lock == 0))
else if ((scan_code == SCANCODE_END_KEY) ||
(!num_lock && (scan_code == SCANCODE_KP_1_KEY)))
{
n = utf8_char_count(self->caption1);
@ -1215,8 +1218,8 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
}
/* home */
else if ((scan_code == 71) &&
(ext || (self->wm->num_lock == 0)))
else if ((scan_code == SCANCODE_HOME_KEY) ||
(!num_lock && (scan_code == SCANCODE_KP_7_KEY)))
{
if (self->edit_pos > 0)
{
@ -1226,8 +1229,8 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
else
{
char32_t c = get_char_from_scan_code
(param2, scan_code, self->wm->keys, self->wm->caps_lock,
char32_t c = get_char_from_kbd_event
(param2, param1, self->wm->keys, self->wm->caps_lock,
self->wm->num_lock, self->wm->scroll_lock,
&(self->wm->keymap));
// Add a printing character to the string. If successful,
@ -1245,12 +1248,14 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
{
if (msg == WM_KEYDOWN)
{
scan_code = param1 % 128;
ext = param2 & 0x0100;
int scan_code = SCANCODE_FROM_KBD_EVENT(param1, param2);
int num_lock = self->wm->num_lock;
/* left or up arrow */
if (((scan_code == 75) || (scan_code == 72)) &&
(ext || (self->wm->num_lock == 0)))
if ((scan_code == SCANCODE_LEFT_ARROW_KEY) ||
(scan_code == SCANCODE_UP_ARROW_KEY) ||
(!num_lock && (scan_code == SCANCODE_KP_4_KEY)) ||
(!num_lock && (scan_code == SCANCODE_KP_8_KEY)))
{
if (self->item_index > 0)
{
@ -1264,8 +1269,10 @@ xrdp_bitmap_def_proc(struct xrdp_bitmap *self, int msg,
}
}
/* right or down arrow */
else if ((scan_code == 77 || scan_code == 80) &&
(ext || self->wm->num_lock == 0))
else if ((scan_code == SCANCODE_RIGHT_ARROW_KEY) ||
(scan_code == SCANCODE_DOWN_ARROW_KEY) ||
(!num_lock && (scan_code == SCANCODE_KP_6_KEY)) ||
(!num_lock && (scan_code == SCANCODE_KP_2_KEY)))
{
if ((self->item_index + 1) < self->string_list->count)
{

View File

@ -384,6 +384,7 @@ xrdp_mm_setup_mod1(struct xrdp_mm *self)
self->mod->server_end_update = server_end_update;
self->mod->server_bell_trigger = server_bell_trigger;
self->mod->server_chansrv_in_use = server_chansrv_in_use;
self->mod->server_init_xkb_layout = server_init_xkb_layout;
self->mod->server_fill_rect = server_fill_rect;
self->mod->server_screen_blt = server_screen_blt;
self->mod->server_paint_rect = server_paint_rect;
@ -525,6 +526,18 @@ xrdp_mm_setup_mod2(struct xrdp_mm *self)
if (self->mod->mod_connect(self->mod) == 0)
{
rv = 0; /* connect success */
// If we've received a recent TS_SYNC_EVENT, pass it on to
// the module so (e.g.) NumLock starts in the right state.
if (self->last_sync_saved)
{
int key_flags = self->last_sync_key_flags;
int device_flags = self->last_sync_device_flags;
self->last_sync_saved = 0;
self->mod->mod_event(self->mod, WM_KEYBRD_SYNC, key_flags,
device_flags, key_flags, device_flags);
}
}
else
{
@ -3986,6 +3999,15 @@ server_chansrv_in_use(struct xrdp_mod *mod)
return wm->mm->use_chansrv;
}
/*****************************************************************************/
/* Init the XKB layout */
void
server_init_xkb_layout(struct xrdp_mod *mod,
struct xrdp_client_info *client_info)
{
xrdp_init_xkb_layout(client_info);
}
/*****************************************************************************/
int

View File

@ -28,6 +28,7 @@
#include "xrdp_constants.h"
#include "fifo.h"
#include "guid.h"
#include "scancode.h"
#include "xrdp_client_info.h"
#define MAX_NR_CHANNELS 16
@ -123,6 +124,8 @@ struct xrdp_mod
int total_data_len, int flags);
int (*server_bell_trigger)(struct xrdp_mod *v);
int (*server_chansrv_in_use)(struct xrdp_mod *v);
void (*server_init_xkb_layout)(struct xrdp_mod *v,
struct xrdp_client_info *client_info);
/* off screen bitmaps */
int (*server_create_os_surface)(struct xrdp_mod *v, int rdpindex,
int width, int height);
@ -191,7 +194,7 @@ struct xrdp_mod
int (*server_egfx_cmd)(struct xrdp_mod *v,
char *cmd, int cmd_bytes,
char *data, int data_bytes);
tintptr server_dumby[100 - 50]; /* align, 100 minus the number of server
tintptr server_dumby[100 - 51]; /* align, 100 minus the number of server
functions above */
/* common */
tintptr handle; /* pointer to self as int */
@ -444,6 +447,10 @@ struct xrdp_mm
struct display_control_monitor_layout_data *resize_data;
struct list *resize_queue;
tbus resize_ready;
/* Last sync event if a module isn't loaded */
int last_sync_saved;
int last_sync_key_flags;
int last_sync_device_flags;
};
struct xrdp_key_info
@ -452,28 +459,20 @@ struct xrdp_key_info
char32_t chr;
};
/**
* Keyboard description
*
* Each section maps an RDP scancode to a KeySym and a Unicode
* character.
*/
#define INDEX_FROM_SCANCODE(scancode,extended) \
(((scancode) & 0x7f) | ((extended) ? 0x80 : 0))
struct xrdp_keymap
{
struct xrdp_key_info keys_noshift[256];
struct xrdp_key_info keys_shift[256];
struct xrdp_key_info keys_altgr[256];
struct xrdp_key_info keys_shiftaltgr[256];
struct xrdp_key_info keys_capslock[256];
struct xrdp_key_info keys_capslockaltgr[256];
struct xrdp_key_info keys_shiftcapslock[256];
struct xrdp_key_info keys_shiftcapslockaltgr[256];
// These arrays are indexed by a return from scancode_to_index()
struct xrdp_key_info keys_noshift[SCANCODE_MAX_INDEX + 1];
struct xrdp_key_info keys_shift[SCANCODE_MAX_INDEX + 1];
struct xrdp_key_info keys_altgr[SCANCODE_MAX_INDEX + 1];
struct xrdp_key_info keys_shiftaltgr[SCANCODE_MAX_INDEX + 1];
struct xrdp_key_info keys_capslock[SCANCODE_MAX_INDEX + 1];
struct xrdp_key_info keys_capslockaltgr[SCANCODE_MAX_INDEX + 1];
struct xrdp_key_info keys_shiftcapslock[SCANCODE_MAX_INDEX + 1];
struct xrdp_key_info keys_shiftcapslockaltgr[SCANCODE_MAX_INDEX + 1];
// NumLock is restricted to a much smaller set of keys
struct xrdp_key_info keys_numlock[XR_RDP_SCAN_MAX_NUMLOCK -
XR_RDP_SCAN_MIN_NUMLOCK + 1];
struct xrdp_key_info keys_numlock[SCANCODE_MAX_NUMLOCK -
SCANCODE_MIN_NUMLOCK + 1];
};
/* the window manager */
@ -554,11 +553,12 @@ struct xrdp_wm
int current_pointer;
int mouse_x;
int mouse_y;
/* keyboard info */
int keys[256]; /* key states 0 up 1 down*/
/* keyboard info (indexed by a return from scancode_to_index()) */
int keys[SCANCODE_MAX_INDEX + 1]; /* key states 0 up 1 down*/
int caps_lock;
int scroll_lock;
int num_lock;
/* Unicode input */
int last_high_surrogate_key_up;
int last_high_surrogate_key_down;

View File

@ -1569,15 +1569,26 @@ xrdp_wm_mouse_click(struct xrdp_wm *self, int x, int y, int but, int down)
/*****************************************************************************/
int
xrdp_wm_key(struct xrdp_wm *self, int device_flags, int scan_code)
xrdp_wm_key(struct xrdp_wm *self, int keyboard_flags, int key_code)
{
int msg;
struct xrdp_key_info *ki;
LOG_DEVEL(LOG_LEVEL_DEBUG,
"xrdp_wm_key: RDP scancode:0x%04x, flags: 0x%04x",
scan_code, device_flags);
scan_code = scan_code % 128;
"xrdp_wm_key: RDP key_code:0x%04x, keyboard_flags: 0x%04x",
key_code, keyboard_flags);
int scancode = SCANCODE_FROM_KBD_EVENT(key_code, keyboard_flags);
int keyup = ((keyboard_flags & KBDFLAGS_RELEASE) != 0);
int sindex = scancode_to_index(scancode);
if (sindex < 0)
{
// The scancode doesn't map to an index, so we can't handle it here.
// Log this so we can investigate
LOG(LOG_LEVEL_WARNING, "Ignoring unusable scancode %x (%s)",
scancode, (keyup ? "up" : "down"));
return 0;
}
if (self->popup_wnd != 0)
{
@ -1585,32 +1596,25 @@ xrdp_wm_key(struct xrdp_wm *self, int device_flags, int scan_code)
return 0;
}
// workaround odd shift behavior
// see https://github.com/neutrinolabs/xrdp/issues/397
if (scan_code == 42 && device_flags == (KBD_FLAG_UP | KBD_FLAG_EXT))
if (keyup)
{
return 0;
}
if (device_flags & KBD_FLAG_UP) /* 0x8000 */
{
self->keys[scan_code] = 0;
self->keys[sindex] = 0;
msg = WM_KEYUP;
}
else /* key down */
{
self->keys[scan_code] = 1 | device_flags;
self->keys[sindex] = 1;
msg = WM_KEYDOWN;
switch (scan_code)
switch (scancode)
{
case 58:
case SCANCODE_CAPS_KEY:
self->caps_lock = !self->caps_lock;
break; /* caps lock */
case 69:
case SCANCODE_NUMLOCK_KEY:
self->num_lock = !self->num_lock;
break; /* num lock */
case 70:
case SCANCODE_SCROLL_KEY:
self->scroll_lock = !self->scroll_lock;
break; /* scroll lock */
}
@ -1618,24 +1622,28 @@ xrdp_wm_key(struct xrdp_wm *self, int device_flags, int scan_code)
if (self->mm->mod != 0)
{
// Backend module loaded...
if (self->mm->mod->mod_event != 0)
{
ki = get_key_info_from_scan_code
(device_flags, scan_code, self->keys, self->caps_lock,
// ..and able to take events. Check the scancode maps to
// a real key in the currently loaded keymap
ki = get_key_info_from_kbd_event
(keyboard_flags, key_code, self->keys, self->caps_lock,
self->num_lock, self->scroll_lock,
&(self->keymap));
if (ki != 0)
{
self->mm->mod->mod_event(self->mm->mod, msg, ki->chr, ki->sym,
scan_code, device_flags);
key_code, keyboard_flags);
}
}
}
else if (self->focused_window != 0)
{
// Pass keypress on to a widget in the login window
xrdp_bitmap_def_proc(self->focused_window,
msg, scan_code, device_flags);
msg, key_code, keyboard_flags);
}
return 0;
@ -1665,13 +1673,18 @@ xrdp_wm_key_sync(struct xrdp_wm *self, int device_flags, int key_flags)
self->caps_lock = 1;
}
if (self->mm->mod != 0)
if (self->mm->mod != 0 && self->mm->mod->mod_event != 0)
{
if (self->mm->mod->mod_event != 0)
{
self->mm->mod->mod_event(self->mm->mod, WM_KEYBRD_SYNC, key_flags,
device_flags, key_flags, device_flags);
}
self->mm->mod->mod_event(self->mm->mod, WM_KEYBRD_SYNC, key_flags,
device_flags, key_flags, device_flags);
}
else
{
// Save the event for when the module is loaded
self->mm->last_sync_saved = 1;
self->mm->last_sync_key_flags = key_flags;
self->mm->last_sync_device_flags = device_flags;
}
return 0;
@ -1687,7 +1700,7 @@ get_unicode_character(struct xrdp_wm *self, int device_flags, char16_t c16)
char32_t c32 = 0;
int *high_ptr;
if (device_flags & KBD_FLAG_UP)
if (device_flags & KBDFLAGS_RELEASE)
{
high_ptr = &self->last_high_surrogate_key_up;
}
@ -1720,6 +1733,29 @@ get_unicode_character(struct xrdp_wm *self, int device_flags, char16_t c16)
return c32;
}
/*****************************************************************************/
/**
* Takes a scancode index and fakes a keyboard event to represent it
* @param self module pointer
* @param device_flags default flags to pass in for the keyboard event.
* @param index scancode index
*
* Some of the device_flags are overridden by the scancode derived from the
* scancode index
*/
static void
fake_kbd_event_from_scancode_index(struct xrdp_wm *self, int device_flags,
int index)
{
unsigned short scancode = scancode_from_index(index);
int key_code = SCANCODE_TO_KBD_EVENT_KEY_CODE(scancode);
device_flags &= ~(KBDFLAGS_EXTENDED | KBDFLAGS_EXTENDED1);
device_flags |= SCANCODE_TO_KBD_EVENT_KBD_FLAGS(scancode);
xrdp_wm_key(self, device_flags, key_code);
}
/*****************************************************************************/
static int
xrdp_wm_key_unicode(struct xrdp_wm *self, int device_flags, char32_t c16)
@ -1734,69 +1770,74 @@ xrdp_wm_key_unicode(struct xrdp_wm *self, int device_flags, char32_t c16)
// See if we can find the character in the existing keymap,
// and if so, generate normal key event(s) for it
for (index = XR_MIN_KEY_CODE; index < XR_MAX_KEY_CODE; index++)
for (index = 0; index <= SCANCODE_MAX_INDEX; ++index)
{
if (c32 == self->keymap.keys_noshift[index].chr)
{
xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE);
fake_kbd_event_from_scancode_index(self, device_flags, index);
return 0;
}
}
for (index = XR_MIN_KEY_CODE; index < XR_MAX_KEY_CODE; index++)
for (index = 0; index <= SCANCODE_MAX_INDEX; ++index)
{
if (c32 == self->keymap.keys_shift[index].chr)
{
if (device_flags & KBD_FLAG_UP)
if (device_flags & KBDFLAGS_RELEASE)
{
xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE);
xrdp_wm_key(self, KBD_FLAG_UP, XR_RDP_SCAN_LSHIFT);
fake_kbd_event_from_scancode_index(self, device_flags, index);
fake_kbd_event_from_scancode_index(self, device_flags,
SCANCODE_INDEX_LSHIFT_KEY);
}
else
{
xrdp_wm_key(self, KBD_FLAG_DOWN, XR_RDP_SCAN_LSHIFT);
xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE);
fake_kbd_event_from_scancode_index(self, device_flags,
SCANCODE_INDEX_LSHIFT_KEY);
fake_kbd_event_from_scancode_index(self, device_flags, index);
}
return 0;
}
}
for (index = XR_MIN_KEY_CODE; index < XR_MAX_KEY_CODE; index++)
for (index = 0; index <= SCANCODE_MAX_INDEX; ++index)
{
if (c32 == self->keymap.keys_altgr[index].chr)
{
if (device_flags & KBD_FLAG_UP)
if (device_flags & KBDFLAGS_RELEASE)
{
xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE);
xrdp_wm_key(self, KBD_FLAG_UP | KBD_FLAG_EXT,
XR_RDP_SCAN_ALT);
fake_kbd_event_from_scancode_index(self, device_flags, index);
fake_kbd_event_from_scancode_index(self, device_flags,
SCANCODE_INDEX_RALT_KEY);
}
else
{
xrdp_wm_key(self, KBD_FLAG_DOWN | KBD_FLAG_EXT,
XR_RDP_SCAN_ALT);
xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE);
fake_kbd_event_from_scancode_index(self, device_flags,
SCANCODE_INDEX_RALT_KEY);
fake_kbd_event_from_scancode_index(self, device_flags, index);
}
return 0;
}
}
for (index = XR_MIN_KEY_CODE; index < XR_MAX_KEY_CODE; index++)
for (index = 0; index <= SCANCODE_MAX_INDEX; ++index)
{
if (c32 == self->keymap.keys_shiftaltgr[index].chr)
{
if (device_flags & KBD_FLAG_UP)
if (device_flags & KBDFLAGS_RELEASE)
{
xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE);
xrdp_wm_key(self, KBD_FLAG_UP | KBD_FLAG_EXT, XR_RDP_SCAN_ALT);
xrdp_wm_key(self, KBD_FLAG_UP, XR_RDP_SCAN_LSHIFT);
fake_kbd_event_from_scancode_index(self, device_flags, index);
fake_kbd_event_from_scancode_index(self, device_flags,
SCANCODE_INDEX_RALT_KEY);
fake_kbd_event_from_scancode_index(self, device_flags,
SCANCODE_INDEX_LSHIFT_KEY);
}
else
{
xrdp_wm_key(self, KBD_FLAG_DOWN, XR_RDP_SCAN_LSHIFT);
xrdp_wm_key(self, KBD_FLAG_DOWN | KBD_FLAG_EXT,
XR_RDP_SCAN_ALT);
xrdp_wm_key(self, device_flags, index - XR_MIN_KEY_CODE);
fake_kbd_event_from_scancode_index(self, device_flags,
SCANCODE_INDEX_LSHIFT_KEY);
fake_kbd_event_from_scancode_index(self, device_flags,
SCANCODE_INDEX_RALT_KEY);
fake_kbd_event_from_scancode_index(self, device_flags, index);
}
return 0;
}
@ -1809,7 +1850,7 @@ xrdp_wm_key_unicode(struct xrdp_wm *self, int device_flags, char32_t c16)
self->mm->chan_trans->status == TRANS_STATUS_UP)
{
xrdp_mm_send_unicode_to_chansrv(self->mm,
!(device_flags & KBD_FLAG_UP), c32);
!(device_flags & KBDFLAGS_RELEASE), c32);
return 0;
}

View File

@ -171,6 +171,26 @@ lib_mod_connect(struct mod *mod)
return 1;
}
// This is a good place to finalise any parameters that need to
// be set.
//
// Load the XKB layout
if (mod->keycode_set[0] != '\0')
{
if (scancode_set_keycode_set(mod->keycode_set) == 0)
{
LOG(LOG_LEVEL_INFO, "Loaded '%s' keycode set", mod->keycode_set);
}
else
{
LOG(LOG_LEVEL_WARNING, "Unable to load '%s' keycode set",
mod->keycode_set);
}
}
mod->server_init_xkb_layout(mod, &(mod->client_info));
LOG(LOG_LEVEL_INFO, "XKB rules '%s' will be used by the module",
mod->client_info.xkb_rules);
make_stream(s);
g_sprintf(con_port, "%s", mod->port);
@ -266,6 +286,7 @@ lib_mod_event(struct mod *mod, int msg, tbus param1, tbus param2,
int len;
int key;
int rv;
int scancode;
LOG_DEVEL(LOG_LEVEL_TRACE, "in lib_mod_event");
make_stream(s);
@ -311,15 +332,8 @@ lib_mod_event(struct mod *mod, int msg, tbus param1, tbus param2,
/* xup doesn't need the Unicode character mapping in param1. Send
* the X11 scancode instead, so xorgxrdp doesn't have to do this
* work again */
if ((param4 & KBD_FLAG_EXT) != 0)
{
// Extended key - set bit 9 of the scancode for the lookup
param1 = scancode_to_keycode(param3 | 0x100);
}
else
{
param1 = scancode_to_keycode(param3);
}
scancode = SCANCODE_FROM_KBD_EVENT(param3, param4);
param1 = scancode_to_x11_keycode(scancode);
}
init_stream(s, 8192);
@ -1869,6 +1883,10 @@ lib_mod_set_param(struct mod *mod, const char *name, const char *value)
{
g_strncpy(mod->port, value, 255);
}
else if (g_strcasecmp(name, "keycode_set") == 0)
{
g_snprintf(mod->keycode_set, sizeof(mod->keycode_set), "%s", value);
}
else if (g_strcasecmp(name, "client_info") == 0)
{
g_memcpy(&(mod->client_info), value, sizeof(mod->client_info));

View File

@ -34,6 +34,7 @@
#define CURRENT_MOD_VER 4
struct source_info;
struct xrdp_client_info;
struct mod
{
@ -111,6 +112,8 @@ struct mod
int total_data_len, int flags);
int (*server_bell_trigger)(struct mod *v);
int (*server_chansrv_in_use)(struct mod *v);
void (*server_init_xkb_layout)(struct mod *v,
struct xrdp_client_info *client_info);
/* off screen bitmaps */
int (*server_create_os_surface)(struct mod *v, int rdpindex,
int width, int height);
@ -176,7 +179,7 @@ struct mod
int (*server_egfx_cmd)(struct mod *v,
char *cmd, int cmd_bytes,
char *data, int data_bytes);
tintptr server_dumby[100 - 50]; /* align, 100 minus the number of server
tintptr server_dumby[100 - 51]; /* align, 100 minus the number of server
functions above */
/* common */
tintptr handle; /* pointer to self as long */
@ -198,6 +201,7 @@ struct mod
int screen_shmem_id_mapped; /* boolean */
char *screen_shmem_pixels;
struct trans *trans;
char keycode_set[32];
};
#endif // XUP_H