#99 Japanese text input support on Solaris

open
keyboard (10)
5
12 hours ago
2006-06-25
Manabu Fujiwara
No

In the Japanese text input environment, Caps Lock key
and Katakana key have indispensable function.
Additionally, In the Solaris Japanese text input
environment, Mode_switch key is assigned as Katakana
key.
And both Caps Lock and Mode_switch key are pseudo-
lock key then differ from remote Windows environment
key event behavior.
Not only that, Even in same Solaris environment,
These keys have different behavior between Xsun and
Xorg.
These behavior ruins remote Windows Japanese text
input environment of Solaris rdesktop RDP client.

It's possible to fix Windows Japanese text input
environment behavior of Solaris rdesktop by change
Solaris OS X keymap.
But that solution restrict functionality of, and
change behavior on Solaris-side Japanese text input
environment.

To fix these issues without change X keymaps of
Solaris OS, I'd like to suggest following changes.

regards,

diff from xkeymap.c 1.92

681a682,835
> /* Handle pseudo lock keys
> Certain Xserver handle pseudo lock key motion to
the event like this:
> (pattern A)
> key motion press -> release -> press -
> release
> key event Pressed+Released
Pressed+Released
> While other does:
> (pattern B)
> key motion press -> release -> press -
> release
> key event Pressed Released
> Therefore, We must handle this Key Released event
as Key Pressed,
> while ignoring Released event of Pressed+Released
combination events.
> In addition, In certain Xserver, if shift is
pressed, pattern A becomes:
> (pattern C)
> key motion press -> release -> press -
> release
> key event Pressed Released
Pressed Released
> Following functions distiguish these patterns and
determine
> if Key Released event is treated as Pressed.
> */
> BOOL
> is_ensure_duration_time( long sec, long usec )
> {
> struct timeval st;
> static long prev_tv_sec = 0;
> static long prev_tv_usec = 0;
> long long llt;
> long long prevllt;
> long long durationllt;
>
> gettimeofday(&st,0);
> llt = (long long)1000000 * (long long)
st.tv_sec + (long long)st.tv_usec;
> prevllt = (long long)1000000 * (long long)
prev_tv_sec + (long long)prev_tv_usec;
> durationllt = (long long)1000000 * (long long)
sec + (long long)usec;
> prev_tv_sec = st.tv_sec;
> prev_tv_usec = st.tv_usec;
> if( llt - prevllt > durationllt ){
> return True;
> }else return False;
> }
>
> BOOL
> handle_pseudo_lock_keys(uint32 keysym, unsigned int
state, uint32 ev_time, BOOL pressed)
> {
> static BOOL first_capslock = 1;
> static BOOL shift_used = 0;
> static BOOL first_caps_release = 1;
> static BOOL first_caps_press = 1;
> static BOOL prev_caps_state_1 = 0;
> static BOOL prev_caps_state_2 = 0;
> static BOOL prev_caps_state_3 = 0;
> BOOL current_caps_state;
> BOOL current_shift_state;
> key_translation tr = { 0, 0, 0, 0 };
> key_translation *ptr;
>
> switch (keysym)
> {
> /* Not a pseudo lock keys, but used
to distiguish shift+CapsLock patterns. */
> case XK_Shift_L:
> case XK_Shift_R:
>
> shift_used = 1;
> break;
>
> case XK_Caps_Lock:
>
> current_caps_state =
get_key_state(state, XK_Caps_Lock);
> current_shift_state =
get_key_state(state, XK_Shift_L) || get_key_state
(state, XK_Shift_L);
>
> if( first_capslock ){
> first_capslock = 0;
> if(
current_caps_state ){
>
prev_caps_state_1 = 0;
>
prev_caps_state_2 = 1;
>
prev_caps_state_3 = 0;
> }else{
>
prev_caps_state_1 = 1;
>
prev_caps_state_2 = 0;
>
prev_caps_state_3 = 1;
> }
> }
> DEBUG_KBD(( "CapsLock state =
%d ", prev_caps_state_1));
> DEBUG_KBD(( "%d ",
prev_caps_state_2));
> DEBUG_KBD(( "%d ",
prev_caps_state_3));
> DEBUG_KBD(( "%d ",
current_caps_state));
> DEBUG_KBD(( "shift used(%d)
\n", shift_used));
>
> if( pressed ){
> if( first_caps_press )
{
>
first_caps_press = 0;
> shift_used =
0;
>
is_ensure_duration_time(0,0);
> }
> }else{
> if(prev_caps_state_1
== 0
> &&
prev_caps_state_2 == 1
> &&
prev_caps_state_3 == 0
> &&
current_caps_state == 1){
> if(
first_caps_release ){
>
first_caps_release = 0;
> if(
current_shift_state && shift_used ){
>
pressed = 1;
>
DEBUG_KBD(("1st Treate Caps_Lock KeyRelease event
as KeyPress by shift key usage.\n"));
> }else
if( is_ensure_duration_time(0,100000) ){
>
pressed = 1;
>
DEBUG_KBD(("1st Treate Caps_Lock KeyRelease event
as KeyPress by duration time.\n"));
> }
> }
> else{
>
pressed = 1;
>
DEBUG_KBD(("Treate Caps_Lock KeyRelease event as
KeyPress by lock state pattern.\n"));
> }
> }
> }
> prev_caps_state_1 =
prev_caps_state_2;
> prev_caps_state_2 =
prev_caps_state_3;
> prev_caps_state_3 =
current_caps_state;
>
> if(pressed){
>
> ptr = keymap[keysym &
KEYMAP_MASK];
> if(ptr){
> tr = *ptr;
>
rdp_send_scancode(ev_time, RDP_KEYPRESS, tr.scancode);
>
rdp_send_scancode(ev_time, RDP_KEYRELEASE,
tr.scancode);
> }
> }
> return True;
> break;
>
> case XK_Mode_switch:
>
> if( !pressed ){
> if(
is_ensure_duration_time(0,100000) ){
> pressed = 1;
> DEBUG_KBD
(("Treate Mode_Switch KeyRelease event as KeyPress by
duration time.\n"));
> }
> }else{
>
is_ensure_duration_time(0,0);
> }
>
> if(pressed){
> ptr = keymap[keysym &
KEYMAP_MASK];
> if(ptr){
> tr = *ptr;
>
rdp_send_scancode(ev_time, RDP_KEYPRESS, tr.scancode);
>
rdp_send_scancode(ev_time, RDP_KEYRELEASE,
tr.scancode);
> }
> }
> return True;
> break;
> }
> return False;
> }
>
694a849,851
> if (handle_pseudo_lock_keys(keysym,
state, ev_time, pressed))
> return;
>
696a854,858
> /* Handle Caps_Lock and
Mode_switch Key state */
> if( get_key_state(state,
XK_Caps_Lock) || get_key_state(state,
XK_Mode_switch) ) {
> rdp_send_scancode
(ev_time, RDP_KEYPRESS, tr.scancode);
> return;
> }

diff from keymaps/ja 1.8

8c8
< kana_NU 0x02 altgr
---
> kana_NU 0x02 localstate
10c10
< kana_FU 0x03 altgr
---
> kana_FU 0x03 localstate
12,13c12,13
< kana_A 0x04 altgr
< kana_a 0x04 shift altgr
---
> kana_A 0x04 localstate
> kana_a 0x04 localstate
15,16c15,16
< kana_U 0x05 altgr
< kana_u 0x05 shift altgr
---
> kana_U 0x05 localstate
> kana_u 0x05 localstate
18,19c18,19
< kana_E 0x06 altgr
< kana_e 0x06 shift altgr
---
> kana_E 0x06 localstate
> kana_e 0x06 localstate
21,22c21,22
< kana_O 0x07 altgr
< kana_o 0x07 shift altgr
---
> kana_O 0x07 localstate
> kana_o 0x07 localstate
24,25c24,25
< kana_YA 0x08 altgr
< kana_ya 0x08 shift altgr
---
> kana_YA 0x08 localstate
> kana_ya 0x08 localstate
27,28c27,28
< kana_YU 0x09 altgr
< kana_yu 0x09 shift altgr
---
> kana_YU 0x09 localstate
> kana_yu 0x09 localstate
30,31c30,31
< kana_YO 0x0a altgr
< kana_yo 0x0a shift altgr
---
> kana_YO 0x0a localstate
> kana_yo 0x0a localstate
33,34c33,34
< kana_WA 0x0b altgr
< kana_WO 0x0b shift altgr
---
> kana_WA 0x0b localstate
> kana_WO 0x0b localstate
37c37
< kana_HO 0x0c altgr
---
> kana_HO 0x0c localstate
40,51c40,51
< kana_HE 0x0d altgr
< kana_TA 0x10 altgr
< kana_TE 0x11 altgr
< kana_I 0x12 altgr
< kana_i 0x12 shift altgr
< kana_SU 0x13 altgr
< kana_KA 0x14 altgr
< kana_N 0x15 altgr
< kana_NA 0x16 altgr
< kana_NI 0x17 altgr
< kana_RA 0x18 altgr
< kana_SE 0x19 altgr
---
> kana_HE 0x0d localstate
> kana_TA 0x10 localstate
> kana_TE 0x11 localstate
> kana_I 0x12 localstate
> kana_i 0x12 localstate
> kana_SU 0x13 localstate
> kana_KA 0x14 localstate
> kana_N 0x15 localstate
> kana_NA 0x16 localstate
> kana_NI 0x17 localstate
> kana_RA 0x18 localstate
> kana_SE 0x19 localstate
58,67c58,67
< kana_openingbracket 0x1b shift altgr
< kana_CHI 0x1e altgr
< kana_TO 0x1f altgr
< kana_SHI 0x20 altgr
< kana_HA 0x21 altgr
< kana_KI 0x22 altgr
< kana_KU 0x23 altgr
< kana_MA 0x24 altgr
< kana_NO 0x25 altgr
< kana_RI 0x26 altgr
---
> kana_openingbracket 0x1b localstate
> kana_CHI 0x1e localstate
> kana_TO 0x1f localstate
> kana_SHI 0x20 localstate
> kana_HA 0x21 localstate
> kana_KI 0x22 localstate
> kana_KU 0x23 localstate
> kana_MA 0x24 localstate
> kana_NO 0x25 localstate
> kana_RI 0x26 localstate
70c70
< kana_RE 0x27 altgr
---
> kana_RE 0x27 localstate
73c73
< kana_KE 0x28 altgr
---
> kana_KE 0x28 localstate
77,86c77,86
< kana_MU 0x2b altgr
< kana_closingbracket 0x2b shift altgr
< kana_TSU 0x2c altgr
< kana_tsu 0x2c shift altgr
< kana_SA 0x2d altgr
< kana_SO 0x2e altgr
< kana_HI 0x2f altgr
< kana_KO 0x30 altgr
< kana_MI 0x31 altgr
< kana_MO 0x32 altgr
---
> kana_MU 0x2b localstate
> kana_closingbracket 0x2b localstate
> kana_TSU 0x2c localstate
> kana_tsu 0x2c localstate
> kana_SA 0x2d localstate
> kana_SO 0x2e localstate
> kana_HI 0x2f localstate
> kana_KO 0x30 localstate
> kana_MI 0x31 localstate
> kana_MO 0x32 localstate
89,90c89,90
< kana_NE 0x33 altgr
< kana_comma 0x33 shift altgr
---
> kana_NE 0x33 localstate
> kana_comma 0x33 localstate
93,94c93,94
< kana_RU 0x34 altgr
< kana_fullstop 0x34 shift altgr
---
> kana_RU 0x34 localstate
> kana_fullstop 0x34 localstate
97,101c97,101
< kana_ME 0x35 altgr
< kana_conjunctive 0x35 shift altgr
< Eisu_toggle 0x3a shift
< Execute 0x54 shift
< Kanji 0x70
---
> kana_ME 0x35 localstate
> kana_conjunctive 0x35 localstate
> Eisu_toggle 0x3a
> Execute 0x7b
> Kanji 0x79
105c105
< Henkan_Mode 0x79
---
> Henkan_Mode 0x29
107a108,144
> Hiragana 0x70 localstate
> Mode_switch 0x70 localstate
> SunSys_Req 0xb7 localstate
> Multi_key 0xdd
> kana_RO 0x73 localstate
> prolongedsound 0x7d altgr
> yen 0x7d
> Caps_Lock 0x3a localstate
> Alt_R 0x38
> Kana_Lock 0x70 localstate
> 0 0x0b localstate
> Q 0x10 localstate
> W 0x11 localstate
> E 0x12 localstate
> R 0x13 localstate
> T 0x14 localstate
> Y 0x15 localstate
> U 0x16 localstate
> I 0x17 localstate
> O 0x18 localstate
> P 0x19 localstate
> A 0x1e localstate
> S 0x1f localstate
> D 0x20 localstate
> F 0x21 localstate
> G 0x22 localstate
> H 0x23 localstate
> J 0x24 localstate
> K 0x25 localstate
> L 0x26 localstate
> Z 0x2c localstate
> X 0x2d localstate
> C 0x2e localstate
> V 0x2f localstate
> B 0x30 localstate
> N 0x31 localstate
> M 0x32 localstate

Discussion

  • Same as Detailed Description

     
    Attachments
  • Logged In: YES
    user_id=1545652

    here is some correction.

    keymaps/ja of my test environment.

    # generated from XKB map jp106
    include common
    map 0xe0010411
    keyboard_type 0x7
    keyboard_subtype 0x2
    keyboard_functionkeys 0xc
    exclam 0x02 shift
    kana_NU 0x02 altgr
    quotedbl 0x03 shift
    kana_FU 0x03 altgr
    numbersign 0x04 shift
    kana_A 0x04 altgr
    kana_a 0x04 shift altgr
    dollar 0x05 shift
    kana_U 0x05 altgr
    kana_u 0x05 shift altgr
    percent 0x06 shift
    kana_E 0x06 altgr
    kana_e 0x06 shift altgr
    ampersand 0x07 shift
    kana_O 0x07 altgr
    kana_o 0x07 shift altgr
    apostrophe 0x08 shift
    kana_YA 0x08 altgr
    kana_ya 0x08 shift altgr
    parenleft 0x09 shift
    kana_YU 0x09 altgr
    kana_yu 0x09 shift altgr
    parenright 0x0a shift
    kana_YO 0x0a altgr
    kana_yo 0x0a shift altgr
    asciitilde 0x0b shift
    kana_WA 0x0b altgr
    kana_WO 0x0b shift altgr
    minus 0x0c
    equal 0x0c shift
    kana_HO 0x0c altgr
    asciicircum 0x0d
    asciitilde 0x0d shift
    kana_HE 0x0d altgr
    kana_TA 0x10 altgr
    kana_TE 0x11 altgr
    kana_I 0x12 altgr
    kana_i 0x12 shift altgr
    kana_SU 0x13 altgr
    kana_KA 0x14 altgr
    kana_N 0x15 altgr
    kana_NA 0x16 altgr
    kana_NI 0x17 altgr
    kana_RA 0x18 altgr
    kana_SE 0x19 altgr
    at 0x1a
    grave 0x1a shift
    voicedsound 0x1a altgr
    bracketleft 0x1b
    braceleft 0x1b shift
    semivoicedsound 0x1b altgr
    kana_openingbracket 0x1b shift altgr
    kana_CHI 0x1e altgr
    kana_TO 0x1f altgr
    kana_SHI 0x20 altgr
    kana_HA 0x21 altgr
    kana_KI 0x22 altgr
    kana_KU 0x23 altgr
    kana_MA 0x24 altgr
    kana_NO 0x25 altgr
    kana_RI 0x26 altgr
    semicolon 0x27
    plus 0x27 shift
    kana_RE 0x27 altgr
    colon 0x28
    asterisk 0x28 shift
    kana_KE 0x28 altgr
    Zenkaku_Hankaku 0x29
    bracketright 0x2b
    braceright 0x2b shift
    kana_MU 0x2b altgr
    kana_closingbracket 0x2b shift altgr
    kana_TSU 0x2c altgr
    kana_tsu 0x2c shift altgr
    kana_SA 0x2d altgr
    kana_SO 0x2e altgr
    kana_HI 0x2f altgr
    kana_KO 0x30 altgr
    kana_MI 0x31 altgr
    kana_MO 0x32 altgr
    comma 0x33
    less 0x33 shift
    kana_NE 0x33 altgr
    kana_comma 0x33 shift altgr
    period 0x34
    greater 0x34 shift
    kana_RU 0x34 altgr
    kana_fullstop 0x34 shift altgr
    slash 0x35
    question 0x35 shift
    kana_ME 0x35 altgr
    kana_conjunctive 0x35 shift altgr
    Eisu_toggle 0x3a shift
    Execute 0x54 shift
    Kanji 0x70
    backslash 0x73
    bar 0x7d shift
    underscore 0x73 shift
    Henkan_Mode 0x79
    Katakana 0x70
    Muhenkan 0x7b
    Henkan_Mode 0x29 localstate
    F21 0x45 localstate
    Pause 0x45 localstate
    Break 0x46 localstate
    Prior 0xc9 localstate
    Next 0xd1 localstate
    Num_Lock 0xc5 localstate
    F25 0xb5 localstate
    F26 0x37 localstate
    F24 0x4a localstate
    F33 0x4f localstate
    F34 0x50 localstate
    F35 0x51 localstate
    F30 0x4b localstate
    F31 0x4c localstate
    F32 0x4d localstate
    F27 0x47 localstate
    F28 0x48 localstate
    F29 0x49 localstate
    Multi_key 0xdd localstate
    kana_RO 0x73 localstate
    Mode_switch 0x70 localstate
    yen 0x7d localstate
    prolongedsound 0x7d localstate
    Kanji 0x79 localstate
    Execute 0x7b localstate
    Caps_Lock 0x3a localstate
    0 0x0b localstate

    xmodmap -pke output of my test environment

    keycode 8 =
    keycode 9 =
    keycode 10 =
    keycode 11 = a A kana_CHI
    keycode 12 = b B kana_KO
    keycode 13 = c C kana_SO
    keycode 14 = d D kana_SHI
    keycode 15 = e E kana_I kana_i
    keycode 16 = f F kana_HA
    keycode 17 = g G kana_KI
    keycode 18 = h H kana_KU
    keycode 19 = i I kana_NI
    keycode 20 = j J kana_MA
    keycode 21 = k K kana_NO
    keycode 22 = l L kana_RI
    keycode 23 = m M kana_MO
    keycode 24 = n N kana_MI
    keycode 25 = o O kana_RA
    keycode 26 = p P kana_SE
    keycode 27 = q Q kana_TA
    keycode 28 = r R kana_SU
    keycode 29 = s S kana_TO
    keycode 30 = t T kana_KA
    keycode 31 = u U kana_NA
    keycode 32 = v V kana_HI
    keycode 33 = w W kana_TE
    keycode 34 = x X kana_SA
    keycode 35 = y Y kana_N
    keycode 36 = z Z kana_TSU kana_tsu
    keycode 37 = 1 exclam kana_NU
    keycode 38 = 2 quotedbl kana_FU
    keycode 39 = 3 numbersign kana_A kana_a
    keycode 40 = 4 dollar kana_U kana_u
    keycode 41 = 5 percent kana_E kana_e
    keycode 42 = 6 ampersand kana_O kana_o
    keycode 43 = 7 apostrophe kana_YA kana_ya
    keycode 44 = 8 parenleft kana_YU kana_yu
    keycode 45 = 9 parenright kana_YO kana_yo
    keycode 46 = 0 NoSymbol kana_WA kana_WO
    keycode 47 = Return
    keycode 48 = Escape
    keycode 49 = BackSpace
    keycode 50 = Tab
    keycode 51 = space
    keycode 52 = minus equal kana_HO
    keycode 53 = asciicircum asciitilde kana_HE
    keycode 54 = at grave voicedsound
    keycode 55 = bracketleft braceleft semivoicedsound
    kana_openingbracket
    keycode 56 =
    keycode 57 = bracketright braceright kana_MU
    kana_closingbracket
    keycode 58 = semicolon plus kana_RE
    keycode 59 = colon asterisk kana_KE
    keycode 60 = Henkan_Mode
    keycode 61 = comma less kana_NE kana_comma
    keycode 62 = period greater kana_RU kana_fullstop
    keycode 63 = slash question kana_ME kana_conjunctive
    keycode 64 = Caps_Lock
    keycode 65 = F1
    keycode 66 = F2
    keycode 67 = F3
    keycode 68 = F4
    keycode 69 = F5
    keycode 70 = F6
    keycode 71 = F7
    keycode 72 = F8
    keycode 73 = F9
    keycode 74 = F10
    keycode 75 = SunF36
    keycode 76 = SunF37
    keycode 77 = F22 F22 Print SunSys_Req
    keycode 78 = F23 F23 Scroll_Lock
    keycode 79 = F21 F21 Pause Break
    keycode 80 = Insert
    keycode 81 = Home
    keycode 82 = Prior
    keycode 83 = Delete
    keycode 84 = End
    keycode 85 = Next
    keycode 86 = Right
    keycode 87 = Left
    keycode 88 = Down
    keycode 89 = Up
    keycode 90 = Num_Lock
    keycode 91 = F25 F25 KP_Divide
    keycode 92 = F26 F26 KP_Multiply
    keycode 93 = F24 F24 KP_Subtract
    keycode 94 = KP_Add
    keycode 95 = KP_Enter
    keycode 96 = F33 F33 KP_1 End
    keycode 97 = Down F34 KP_2
    keycode 98 = F35 F35 KP_3 Next
    keycode 99 = Left F30 KP_4
    keycode 100 = F31 F31 KP_5
    keycode 101 = Right F32 KP_6
    keycode 102 = F27 F27 KP_7 Home
    keycode 103 = Up F28 KP_8
    keycode 104 = F29 F29 KP_9 Prior
    keycode 105 = KP_Insert KP_Insert KP_0
    keycode 106 = Delete Delete KP_Decimal
    keycode 107 =
    keycode 108 = Multi_key
    keycode 109 = SunPowerSwitch SunPowerSwitchShift
    keycode 110 =
    keycode 111 =
    keycode 112 =
    keycode 113 =
    keycode 114 =
    keycode 115 =
    keycode 116 =
    keycode 117 =
    keycode 118 =
    keycode 119 =
    keycode 120 =
    keycode 121 =
    keycode 122 =
    keycode 123 = F17 F17 SunOpen
    keycode 124 = Help
    keycode 125 = F13 F13 SunProps
    keycode 126 = F15 F15 SunFront
    keycode 127 = F11 F11 Cancel
    keycode 128 = F12 F12 Redo
    keycode 129 = F14 F14 Undo
    keycode 130 = F20 F20 SunCut
    keycode 131 = F16 F16 SunCopy
    keycode 132 = F18 F18 SunPaste
    keycode 133 = F19 F19 Find
    keycode 134 = SunAudioMute SunVideoDegauss
    keycode 135 = SunAudioRaiseVolume SunVideoRaiseBrightness
    keycode 136 = SunAudioLowerVolume SunVideoLowerBrightness
    keycode 137 =
    keycode 138 =
    keycode 139 =
    keycode 140 =
    keycode 141 =
    keycode 142 = backslash underscore kana_RO
    keycode 143 = Mode_switch
    keycode 144 = backslash bar prolongedsound
    keycode 145 = Kanji
    keycode 146 = Execute
    keycode 147 =
    keycode 148 =
    keycode 149 =
    keycode 150 =
    keycode 151 =
    keycode 152 =
    keycode 153 =
    keycode 154 =
    keycode 155 =
    keycode 156 =
    keycode 157 =
    keycode 158 =
    keycode 159 =
    keycode 160 =
    keycode 161 =
    keycode 162 =
    keycode 163 =
    keycode 164 =
    keycode 165 =
    keycode 166 =
    keycode 167 =
    keycode 168 =
    keycode 169 =
    keycode 170 =
    keycode 171 =
    keycode 172 =
    keycode 173 =
    keycode 174 =
    keycode 175 =
    keycode 176 =
    keycode 177 =
    keycode 178 =
    keycode 179 =
    keycode 180 =
    keycode 181 =
    keycode 182 =
    keycode 183 =
    keycode 184 =
    keycode 185 =
    keycode 186 =
    keycode 187 =
    keycode 188 =
    keycode 189 =
    keycode 190 =
    keycode 191 =
    keycode 192 =
    keycode 193 =
    keycode 194 =
    keycode 195 =
    keycode 196 =
    keycode 197 =
    keycode 198 =
    keycode 199 =
    keycode 200 =
    keycode 201 =
    keycode 202 =
    keycode 203 =
    keycode 204 =
    keycode 205 =
    keycode 206 =
    keycode 207 =
    keycode 208 =
    keycode 209 =
    keycode 210 =
    keycode 211 =
    keycode 212 =
    keycode 213 =
    keycode 214 =
    keycode 215 =
    keycode 216 =
    keycode 217 =
    keycode 218 =
    keycode 219 =
    keycode 220 =
    keycode 221 =
    keycode 222 =
    keycode 223 =
    keycode 224 =
    keycode 225 =
    keycode 226 =
    keycode 227 =
    keycode 228 =
    keycode 229 =
    keycode 230 =
    keycode 231 = Control_L
    keycode 232 = Shift_L
    keycode 233 = Alt_L
    keycode 234 = Meta_L
    keycode 235 = Control_R
    keycode 236 = Shift_R
    keycode 237 = Alt_R
    keycode 238 = Meta_R
    keycode 239 =
    keycode 240 =
    keycode 241 =
    keycode 242 =
    keycode 243 =
    keycode 244 =
    keycode 245 =
    keycode 246 =
    keycode 247 =
    keycode 248 =
    keycode 249 =
    keycode 250 =
    keycode 251 =
    keycode 252 =
    keycode 253 =
    keycode 254 =

    regards,

    manabu