52
62
#include "uim/uim-helper.h"
53
63
#include "uim/uim-im-switcher.h"
54
#include "uim/uim-compat-scm.h"
55
#include "uim/uim-stdint.h"
64
#include "uim/uim-scm.h"
65
#if UIM_XIM_USE_JAPANESE_KANA_KEYBOARD_HACK
66
#include "uim/uim-x-util.h"
70
#define XK_dead_horn 0xfe62
58
74
# ifdef HAVE_ALLOCA_H
144
160
// Updated global IM of XimServer
145
161
if (!strcmp(custom, "custom-preserved-default-im-name") &&
146
uim_scm_symbol_value_bool("custom-activate-default-im-name?"))
162
uim_scm_symbol_value_bool("custom-activate-default-im-name?"))
149
165
#if HAVE_XFT_UTF8_STRING
154
170
if (!strcmp(custom, "bridge-show-input-state?") &&
155
!uim_scm_symbol_value_bool("bridge-show-input-state?")) {
171
!uim_scm_symbol_value_bool("bridge-show-input-state?")) {
156
172
Canddisp *disp = canddisp_singleton();
157
173
disp->hide_caret_state();
391
407
uim_context uc = uim_create_context((void *) this, "UTF-8",
392
NULL, real_im, uim_iconv,
393
409
InputContext::commit_cb);
501
517
free(mLocaleName);
502
518
mLocaleName = locale;
504
if (!is_locale_included(engine_locales, client_locale))
505
changeContext(prev_engine);
520
if (!is_locale_included(engine_locales, client_locale)) {
522
uim_switch_im(mUc, prev_engine);
524
mEngineName = strdup(prev_engine);
507
527
free(prev_engine);
542
562
uim_prop_label_update(mUc);
543
563
if (hasActiveCandwin())
544
564
candidate_update();
565
uim_focus_in_context(mUc);
548
569
InputContext::focusOut()
571
uim_focus_out_context(mUc);
550
572
uim_helper_client_focus_out(mUc);
551
573
if (mFocusedContext == this) {
552
574
Canddisp *disp = canddisp_singleton();
607
629
void InputContext::candidate_select_cb(void *ptr, int index)
609
631
InputContext *ic = (InputContext *)ptr;
632
ic->set_need_hilite_selected_cand(true);
610
633
ic->candidate_select(index);
812
835
mDisplayLimit = display_limit;
813
836
if (display_limit)
814
837
mNumPage = (nr - 1) / display_limit + 1;
839
current_cand_selection = 0;
841
need_hilite_selected_cand = false;
817
844
void InputContext::candidate_update()
819
846
Canddisp *disp = canddisp_singleton();
821
848
disp->activate(active_candidates, mDisplayLimit);
822
disp->select(current_cand_selection);
849
disp->select(current_cand_selection, need_hilite_selected_cand);
826
853
void InputContext::candidate_select(int index)
828
855
Canddisp *disp = canddisp_singleton();
856
disp->select(index, need_hilite_selected_cand);
830
857
current_cand_selection = index;
831
858
if (mDisplayLimit)
832
859
current_page = current_cand_selection / mDisplayLimit;
858
885
current_cand_selection = new_index;
860
887
candidate_select(current_cand_selection);
861
uim_set_candidate_index(mUc, current_cand_selection);
888
if (need_hilite_selected_cand)
889
uim_set_candidate_index(mUc, current_cand_selection);
864
892
void InputContext::candidate_deactivate()
1072
1105
if (x->state & Mod5Mask)
1073
1106
mModifier |= (gMod5Mask & mPreModState);
1108
#if UIM_XIM_USE_JAPANESE_KANA_KEYBOARD_HACK
1109
mKey = uim_x_kana_input_hack_translate_key(x->key_sym,
1110
(KeyCode)x->ev.xkey.keycode);
1075
1112
if (x->key_sym < 128 && x->key_sym >= 32)
1076
1113
mKey = x->key_sym;
1077
1114
else if (x->key_sym >= XK_F1 && x->key_sym <= XK_F35)
1078
1115
mKey = x->key_sym - XK_F1 + UKey_F1;
1079
else if (x->key_sym >= 0xfe50 && x->key_sym <= 0xfe62)
1080
mKey = UKey_Other; // Don't forward deadkeys to libuim.
1116
// GTK+ and Qt don't support dead_stroke yet
1117
else if (x->key_sym >= XK_dead_grave && x->key_sym <= XK_dead_horn)
1118
mKey = x->key_sym - XK_dead_grave + UKey_Dead_Grave;
1119
else if (x->key_sym >= XK_Kanji && x->key_sym <= XK_Eisu_toggle)
1120
mKey = x->key_sym - XK_Kanji + UKey_Kanji;
1121
else if (x->key_sym >= XK_Hangul && x->key_sym <= XK_Hangul_Special)
1122
mKey = x->key_sym - XK_Hangul + UKey_Hangul;
1123
else if (x->key_sym >= XK_kana_fullstop && x->key_sym <= XK_semivoicedsound)
1124
mKey = x->key_sym - XK_kana_fullstop + UKey_Kana_Fullstop;
1082
1126
switch (x->key_sym) {
1127
case XK_yen: mKey = UKey_Yen; break;
1083
1128
case XK_BackSpace: mKey = UKey_Backspace; break;
1084
1129
case XK_Delete: mKey = UKey_Delete; break;
1130
case XK_Insert: mKey = UKey_Insert; break;
1085
1131
case XK_Escape: mKey = UKey_Escape; break;
1086
case XK_Tab: mKey = UKey_Tab; break;
1133
case XK_ISO_Left_Tab: mKey = UKey_Tab; break;
1087
1134
case XK_Return: mKey = UKey_Return; break;
1088
1135
case XK_Left: mKey = UKey_Left; break;
1089
1136
case XK_Up: mKey = UKey_Up; break;
1094
1141
case XK_Home: mKey = UKey_Home; break;
1095
1142
case XK_End: mKey = UKey_End; break;
1096
1143
case XK_Multi_key: mKey = UKey_Multi_key; break;
1144
case XK_Codeinput: mKey = UKey_Codeinput; break;
1145
case XK_SingleCandidate: mKey = UKey_SingleCandidate; break;
1146
case XK_MultipleCandidate: mKey = UKey_MultipleCandidate; break;
1147
case XK_PreviousCandidate: mKey = UKey_PreviousCandidate; break;
1097
1148
case XK_Mode_switch: mKey = UKey_Mode_switch; break;
1098
case XK_Kanji: mKey = UKey_Kanji; break;
1099
case XK_Muhenkan: mKey = UKey_Muhenkan; break;
1100
case XK_Henkan_Mode: mKey = UKey_Henkan_Mode; break;
1101
case XK_Romaji: mKey = UKey_Romaji; break;
1102
case XK_Hiragana: mKey = UKey_Hiragana; break;
1103
case XK_Katakana: mKey = UKey_Katakana; break;
1104
case XK_Hiragana_Katakana: mKey = UKey_Hiragana_Katakana; break;
1105
case XK_Zenkaku: mKey = UKey_Zenkaku; break;
1106
case XK_Hankaku: mKey = UKey_Hankaku; break;
1107
case XK_Zenkaku_Hankaku: mKey = UKey_Zenkaku_Hankaku; break;
1108
case XK_Touroku: mKey = UKey_Touroku; break;
1109
case XK_Massyo: mKey = UKey_Massyo; break;
1110
case XK_Kana_Lock: mKey = UKey_Kana_Lock; break;
1111
case XK_Kana_Shift: mKey = UKey_Kana_Shift; break;
1112
case XK_Eisu_Shift: mKey = UKey_Eisu_Shift; break;
1113
case XK_Eisu_toggle: mKey = UKey_Eisu_toggle; break;
1114
1149
case XK_Shift_L: mKey = UKey_Shift_key; break;
1115
1150
case XK_Shift_R: mKey = UKey_Shift_key; break;
1116
1151
case XK_Control_L: mKey = UKey_Control_key; break;
1123
1158
case XK_Super_R: mKey = UKey_Super_key; break;
1124
1159
case XK_Hyper_L: mKey = UKey_Hyper_key; break;
1125
1160
case XK_Hyper_R: mKey = UKey_Hyper_key; break;
1161
case XK_Caps_Lock: mKey = UKey_Caps_Lock; break;
1162
case XK_Num_Lock: mKey = UKey_Num_Lock; break;
1163
case XK_Scroll_Lock: mKey = UKey_Scroll_Lock; break;
1127
1165
mKey = UKey_Other;
1250
1288
gMod3Mask = check_modifier(Mod3MaskSyms);
1251
1289
gMod4Mask = check_modifier(Mod4MaskSyms);
1252
1290
gMod5Mask = check_modifier(Mod5MaskSyms);
1292
#if UIM_XIM_USE_JAPANESE_KANA_KEYBOARD_HACK
1293
// Init at here to sync with proper update timing although not a modifier.
1294
uim_x_kana_input_hack_init(XimServer::gDpy);