From 2877d334ad1321d1fcd5f903c0493bd0cdd787f8 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 26 Nov 2017 14:56:16 +0100 Subject: patch 8.0.1344: using 'imactivatefunc' in the GUI does not work Problem: Using 'imactivatefunc' in the GUI does not work. Solution: Do not use 'imactivatefunc' and 'imstatusfunc' in the GUI. --- runtime/doc/options.txt | 6 +++--- src/mbyte.c | 25 ++++++++++++++++--------- src/testdir/test_iminsert.vim | 9 ++++----- src/version.c | 2 ++ 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index f84421363..c4ceb5f39 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -4258,8 +4258,8 @@ A jump table for the options with a short description can be found at |Q_op|. {not in Vi} {only available when compiled with |+mbyte|} This option specifies a function that will be called to - activate/inactivate Input Method. - Does not work in the MS-Windows GUI version. + activate or deactivate the Input Method. + It is not used in the GUI. Example: > function ImActivateFunc(active) @@ -4375,7 +4375,7 @@ A jump table for the options with a short description can be found at |Q_op|. {only available when compiled with |+mbyte|} This option specifies a function that is called to obtain the status of Input Method. It must return a positive number when IME is active. - Does not work in the MS-Windows GUI version. + It is not used in the GUI. Example: > function ImStatusFunc() diff --git a/src/mbyte.c b/src/mbyte.c index 3ebd183c9..408c49ad7 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -4782,6 +4782,14 @@ iconv_end(void) #endif /* FEAT_MBYTE */ +#ifdef FEAT_GUI +# define USE_IMACTIVATEFUNC (!gui.in_use && *p_imaf != NUL) +# define USE_IMSTATUSFUNC (!gui.in_use && *p_imsf != NUL) +#else +# define USE_IMACTIVATEFUNC (*p_imaf != NUL) +# define USE_IMSTATUSFUNC (*p_imsf != NUL) +#endif + #ifdef FEAT_EVAL static void call_imactivatefunc(int active) @@ -5689,7 +5697,7 @@ im_synthesize_keypress(unsigned int keyval, unsigned int state) xim_reset(void) { #ifdef FEAT_EVAL - if (p_imaf[0] != NUL) + if (USE_IMACTIVATEFUNC) call_imactivatefunc(im_is_active); else #endif @@ -5868,7 +5876,7 @@ xim_queue_key_press_event(GdkEventKey *event, int down) im_get_status(void) { # ifdef FEAT_EVAL - if (p_imsf[0] != NUL) + if (USE_IMSTATUSFUNC) return call_imstatusfunc(); # endif return im_is_active; @@ -5908,16 +5916,14 @@ im_set_active(int active_arg) /* If 'imdisable' is set, XIM is never active. */ if (p_imdisable) active = FALSE; -# if !defined(FEAT_GUI_GTK) else if (input_style & XIMPreeditPosition) /* There is a problem in switching XIM off when preediting is used, * and it is not clear how this can be solved. For now, keep XIM on * all the time, like it was done in Vim 5.8. */ active = TRUE; -# endif # if defined(FEAT_EVAL) - if (p_imaf[0] != NUL) + if (USE_IMACTIVATEFUNC) { if (active != im_get_status()) { @@ -6328,7 +6334,8 @@ xim_real_init(Window x11_window, Display *x11_display) } else { - EMSG(_(e_xim)); + if (!is_not_a_term()) + EMSG(_(e_xim)); XCloseIM(xim); return FALSE; } @@ -6348,7 +6355,7 @@ xim_real_init(Window x11_window, Display *x11_display) im_get_status(void) { # ifdef FEAT_EVAL - if (p_imsf[0] != NUL) + if (USE_IMSTATUSFUNC) return call_imstatusfunc(); # endif return xim_has_focus; @@ -6480,7 +6487,7 @@ static int im_was_set_active = FALSE; im_get_status() { # ifdef FEAT_EVAL - if (p_imsf[0] != NUL) + if (USE_IMSTATUSFUNC) return call_imstatusfunc(); # endif return im_was_set_active; @@ -6492,7 +6499,7 @@ im_set_active(int active_arg) # if defined(FEAT_MBYTE) && defined(FEAT_EVAL) int active = !p_imdisable && active_arg; - if (p_imaf[0] != NUL && active != im_get_status()) + if (USE_IMACTIVATEFUNC && active != im_get_status()) { call_imactivatefunc(active); im_was_set_active = active; diff --git a/src/testdir/test_iminsert.vim b/src/testdir/test_iminsert.vim index 0676c03f1..142aec0ba 100644 --- a/src/testdir/test_iminsert.vim +++ b/src/testdir/test_iminsert.vim @@ -17,9 +17,6 @@ func IM_statusfunc() endfunc func Test_iminsert2() - if has('gui_win32') - return - endif set imactivatefunc=IM_activatefunc set imstatusfunc=IM_statusfunc set iminsert=2 @@ -27,6 +24,8 @@ func Test_iminsert2() set iminsert=0 set imactivatefunc= set imstatusfunc= - call assert_equal(1, s:imactivatefunc_called) - call assert_equal(1, s:imstatusfunc_called) + + let expected = has('gui_running') ? 0 : 1 + call assert_equal(expected, s:imactivatefunc_called) + call assert_equal(expected, s:imstatusfunc_called) endfunc diff --git a/src/version.c b/src/version.c index bcf6a81eb..f94ef27c0 100644 --- a/src/version.c +++ b/src/version.c @@ -771,6 +771,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1344, /**/ 1343, /**/ -- cgit v1.2.1