diff options
| author | Bram Moolenaar <Bram@vim.org> | 2013-06-26 19:18:05 +0200 |
|---|---|---|
| committer | Bram Moolenaar <Bram@vim.org> | 2013-06-26 19:18:05 +0200 |
| commit | abab85a4994fec3e95ab79c5cdf94a7f893c1aeb (patch) | |
| tree | cc4050290198250d686a91d7395b9d85f662845e /src/mbyte.c | |
| parent | a0169128d98669c753c899353127263e1ea289f9 (diff) | |
| download | vim-git-abab85a4994fec3e95ab79c5cdf94a7f893c1aeb.tar.gz | |
updated for version 7.3.1248v7.3.1248
Problem: Still have old hacking code for Input Method.
Solution: Add 'imactivatefunc' and 'imstatusfunc' as a generic solution to
Input Method activation. (Yukihiro Nakadaira)
Diffstat (limited to 'src/mbyte.c')
| -rw-r--r-- | src/mbyte.c | 57 |
1 files changed, 26 insertions, 31 deletions
diff --git a/src/mbyte.c b/src/mbyte.c index 2059da460..61d83cf01 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -4447,7 +4447,7 @@ im_set_active(int active) { int was_active; - was_active = !!im_is_active; + was_active = !!im_get_status(); im_is_active = (active && !p_imdisable); if (im_is_active != was_active) @@ -5071,44 +5071,25 @@ xim_reset(void) { if (xic != NULL) { - /* - * The third-party imhangul module (and maybe others too) ignores - * gtk_im_context_reset() or at least doesn't reset the active state. - * Thus sending imactivatekey would turn it off if it was on before, - * which is clearly not what we want. Fortunately we can work around - * that for imhangul by sending GDK_Escape, but I don't know if it - * works with all IM modules that support an activation key :/ - * - * An alternative approach would be to destroy the IM context and - * recreate it. But that means loading/unloading the IM module on - * every mode switch, which causes a quite noticeable delay even on - * my rather fast box... - * * - * Moreover, there are some XIM which cannot respond to - * im_synthesize_keypress(). we hope that they reset by - * xim_shutdown(). - */ - if (im_activatekey_keyval != GDK_VoidSymbol && im_is_active) - im_synthesize_keypress(GDK_Escape, 0U); - gtk_im_context_reset(xic); - /* - * HACK for Ami: This sequence of function calls makes Ami handle - * the IM reset graciously, without breaking loads of other stuff. - * It seems to force English mode as well, which is exactly what we - * want because it makes the Ami status display work reliably. - */ - gtk_im_context_set_use_preedit(xic, FALSE); - if (p_imdisable) im_shutdown(); else { - gtk_im_context_set_use_preedit(xic, TRUE); xim_set_focus(gui.in_focus); - if (im_activatekey_keyval != GDK_VoidSymbol) + if (p_imaf[0] != NUL) + { + char_u *argv[1]; + + if (im_is_active) + argv[0] = (char_u *)"1"; + else + argv[0] = (char_u *)"0"; + (void)call_func_retnr(p_imaf, 1, argv, FALSE); + } + else if (im_activatekey_keyval != GDK_VoidSymbol) { if (im_is_active) { @@ -5268,6 +5249,20 @@ xim_queue_key_press_event(GdkEventKey *event, int down) int im_get_status(void) { + if (p_imsf[0] != NUL) + { + int is_active; + + /* FIXME: Don't execute user function in unsafe situation. */ + if (exiting || is_autocmd_blocked()) + return FALSE; + /* FIXME: :py print 'xxx' is shown duplicate result. + * Use silent to avoid it. */ + ++msg_silent; + is_active = call_func_retnr(p_imsf, 0, NULL, FALSE); + --msg_silent; + return (is_active > 0); + } return im_is_active; } |
