changeset 12936:c53a80f39a52 v8.0.1344

patch 8.0.1344: using 'imactivatefunc' in the GUI does not work commit https://github.com/vim/vim/commit/2877d334ad1321d1fcd5f903c0493bd0cdd787f8 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Nov 26 14:56:16 2017 +0100 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.
author Christian Brabandt <cb@256bit.org>
date Sun, 26 Nov 2017 15:00:06 +0100
parents e952feb15951
children e5a87e955a15
files runtime/doc/options.txt src/mbyte.c src/testdir/test_iminsert.vim src/version.c
diffstat 4 files changed, 25 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -4258,8 +4258,8 @@ A jump table for the options with a shor
 			{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 shor
 			{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()
--- 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 keyv
 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 *e
 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
     }
     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
 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;
--- 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
--- a/src/version.c
+++ b/src/version.c
@@ -772,6 +772,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1344,
+/**/
     1343,
 /**/
     1342,