~ubuntu-branches/ubuntu/maverick/uim/maverick

« back to all changes in this revision

Viewing changes to xim/ximserver.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Masahito Omote
  • Date: 2008-06-25 19:56:33 UTC
  • mfrom: (3.1.18 intrepid)
  • Revision ID: james.westby@ubuntu.com-20080625195633-8jljph4rfq00l8o7
Tags: 1:1.5.1-2
* uim-tcode: provide tutcode-custom.scm, tutcode-bushudic.scm
  and tutcode-rule.scm (Closes: #482659)
* Fix FTBFS: segv during compile (Closes: #483078).
  I personally think this bug is not specific for uim but is a optimization
  problem on gcc-4.3.1. (https://bugs.freedesktop.org/show_bug.cgi?id=16477)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 
3
 
  Copyright (c) 2003-2006 uim Project http://uim.freedesktop.org/
 
3
  Copyright (c) 2003-2008 uim Project http://code.google.com/p/uim/
4
4
 
5
5
  All rights reserved.
6
6
 
34
34
# include <config.h>
35
35
#endif
36
36
 
 
37
#define UIM_XIM_USE_JAPANESE_KANA_KEYBOARD_HACK 1
 
38
 
37
39
#include <stdio.h>
38
40
#include <ctype.h>
39
41
#include <locale.h>
40
42
#include <X11/Xlib.h>
41
43
#include <X11/Xatom.h>
42
44
#include <X11/Xutil.h>
 
45
 
 
46
/* workaround for pre X11R6.7 */
 
47
#ifndef XK_KOREAN
 
48
#define XK_KOREAN
 
49
#endif
 
50
#ifndef XK_KATAKANA
 
51
#define XK_KATAKANA
 
52
#endif
43
53
#include <X11/keysymdef.h>
44
54
 
45
55
#include "xim.h"
51
61
 
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"
 
67
#endif
 
68
 
 
69
#ifndef XK_dead_horn
 
70
#define XK_dead_horn    0xfe62
 
71
#endif
56
72
 
57
73
#ifndef __GNUC__
58
74
# ifdef HAVE_ALLOCA_H
143
159
 
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?"))
147
163
        set_im(++val);
148
164
 
149
165
#if HAVE_XFT_UTF8_STRING
152
168
#endif
153
169
 
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();
158
174
    }
162
178
}
163
179
 
164
180
void XimServer::reloadConfigs() {
165
 
#if 0
166
 
    // uim_prop_reload_configs() seems broken... --ekato Aug 19 2005
 
181
#if 1
167
182
    uim_prop_reload_configs();
 
183
    reload_uim(0);
168
184
#else
169
 
    reload_uim(0);
 
185
    reload_uim(1);
170
186
#endif
171
187
 
172
188
    // Updated global IM of XimServer
389
405
    }
390
406
 
391
407
    uim_context uc = uim_create_context((void *) this, "UTF-8",
392
 
                                        NULL, real_im, uim_iconv,
 
408
                                        NULL, real_im, NULL,
393
409
                                        InputContext::commit_cb);
394
410
 
395
411
    if (uc) {
501
517
        free(mLocaleName);
502
518
        mLocaleName = locale;
503
519
    } else {
504
 
        if (!is_locale_included(engine_locales, client_locale))
505
 
            changeContext(prev_engine);
 
520
        if (!is_locale_included(engine_locales, client_locale)) {
 
521
            clear();
 
522
            uim_switch_im(mUc, prev_engine);
 
523
            free(mEngineName);
 
524
            mEngineName = strdup(prev_engine);
 
525
        }
506
526
    }
507
527
    free(prev_engine);
508
528
}
542
562
    uim_prop_label_update(mUc); 
543
563
    if (hasActiveCandwin())
544
564
        candidate_update();
 
565
    uim_focus_in_context(mUc);
545
566
}
546
567
 
547
568
void
548
569
InputContext::focusOut()
549
570
{
 
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)
608
630
{
609
631
    InputContext *ic = (InputContext *)ptr;
 
632
    ic->set_need_hilite_selected_cand(true);
610
633
    ic->candidate_select(index);
611
634
}
612
635
 
812
835
    mDisplayLimit = display_limit;
813
836
    if (display_limit)
814
837
        mNumPage = (nr - 1) / display_limit + 1;
 
838
 
 
839
    current_cand_selection = 0;
 
840
    current_page = 0;
 
841
    need_hilite_selected_cand = false;
815
842
}
816
843
 
817
844
void InputContext::candidate_update()
819
846
    Canddisp *disp = canddisp_singleton();
820
847
 
821
848
    disp->activate(active_candidates, mDisplayLimit);
822
 
    disp->select(current_cand_selection);
 
849
    disp->select(current_cand_selection, need_hilite_selected_cand);
823
850
    disp->show();
824
851
}
825
852
 
826
853
void InputContext::candidate_select(int index)
827
854
{
828
855
    Canddisp *disp = canddisp_singleton();
829
 
    disp->select(index);
 
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;
859
886
    }
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);
862
890
}
863
891
 
864
892
void InputContext::candidate_deactivate()
876
904
    }
877
905
}
878
906
 
 
907
void InputContext::set_need_hilite_selected_cand(bool set)
 
908
{
 
909
    need_hilite_selected_cand = set;
 
910
}
 
911
 
879
912
char *InputContext::get_caret_state_label_from_prop_list(const char *str)
880
913
{
881
914
    const char *p, *q;
1072
1105
    if (x->state & Mod5Mask)
1073
1106
        mModifier |= (gMod5Mask & mPreModState);
1074
1107
 
 
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);
 
1111
#endif
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;
1081
1125
    else {
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;
 
1132
        case XK_Tab:
 
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;
1126
1164
        default:
1127
1165
            mKey = UKey_Other;
1128
1166
        }
1250
1288
    gMod3Mask = check_modifier(Mod3MaskSyms);
1251
1289
    gMod4Mask = check_modifier(Mod4MaskSyms);
1252
1290
    gMod5Mask = check_modifier(Mod5MaskSyms);
 
1291
 
 
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);
 
1295
#endif
1253
1296
}
1254
1297
 
1255
1298