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
Same as Detailed Description
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