diff src/mbyte.c @ 12924:85a601f985ab v8.0.1338

patch 8.0.1338: USE_IM_CONTROL is confusing and incomplete commit https://github.com/vim/vim/commit/819edbe078c8579f3620d12dac830f12ccdc5a45 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Nov 25 17:14:33 2017 +0100 patch 8.0.1338: USE_IM_CONTROL is confusing and incomplete Problem: USE_IM_CONTROL is confusing and incomplete. Solution: Just use FEAT_MBYTE. Call 'imactivatefunc' also without GUI.
author Christian Brabandt <cb@256bit.org>
date Sat, 25 Nov 2017 17:15:05 +0100
parents 6bafba651e20
children 75ffa8ee989c
line wrap: on
line diff
--- a/src/mbyte.c
+++ b/src/mbyte.c
@@ -4794,6 +4794,26 @@ call_imactivatefunc(int active)
 	argv[0] = (char_u *)"0";
     (void)call_func_retnr(p_imaf, 1, argv, FALSE);
 }
+
+    static int
+call_imstatusfunc(void)
+{
+    int is_active;
+
+    /* FIXME: Don't execute user function in unsafe situation. */
+    if (exiting
+#   ifdef FEAT_AUTOCMD
+	    || is_autocmd_blocked()
+#   endif
+	    )
+	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);
+}
 #endif
 
 #if defined(FEAT_XIM) || defined(PROTO)
@@ -4838,14 +4858,7 @@ im_set_active(int active)
     im_is_active = (active && !p_imdisable);
 
     if (im_is_active != was_active)
-    {
-#ifdef FEAT_EVAL
-	if (p_imaf[0] != NUL)
-	    call_imactivatefunc(im_is_active);
-	else
-#endif
-	    xim_reset();
-    }
+	xim_reset();
 }
 
     void
@@ -5675,6 +5688,11 @@ im_synthesize_keypress(unsigned int keyv
     void
 xim_reset(void)
 {
+#ifdef FEAT_EVAL
+    if (p_imaf[0] != NUL)
+	call_imactivatefunc(im_is_active);
+    else
+#endif
     if (xic != NULL)
     {
 	gtk_im_context_reset(xic);
@@ -5685,12 +5703,7 @@ xim_reset(void)
 	{
 	    xim_set_focus(gui.in_focus);
 
-#  ifdef FEAT_EVAL
-	    if (p_imaf[0] != NUL)
-		call_imactivatefunc(im_is_active);
-	    else
-#  endif
-		if (im_activatekey_keyval != GDK_VoidSymbol)
+	    if (im_activatekey_keyval != GDK_VoidSymbol)
 	    {
 		if (im_is_active)
 		{
@@ -5856,23 +5869,7 @@ im_get_status(void)
 {
 #  ifdef FEAT_EVAL
     if (p_imsf[0] != NUL)
-    {
-	int is_active;
-
-	/* FIXME: Don't execute user function in unsafe situation. */
-	if (exiting
-#   ifdef FEAT_AUTOCMD
-		|| is_autocmd_blocked()
-#   endif
-		)
-	    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 call_imstatusfunc();
 #  endif
     return im_is_active;
 }
@@ -5894,30 +5891,45 @@ im_is_preediting(void)
 static int	xim_is_active = FALSE;  /* XIM should be active in the current
 					   mode */
 static int	xim_has_focus = FALSE;	/* XIM is really being used for Vim */
-#ifdef FEAT_GUI_X11
+#  ifdef FEAT_GUI_X11
 static XIMStyle	input_style;
 static int	status_area_enabled = TRUE;
-#endif
+#  endif
 
 /*
  * Switch using XIM on/off.  This is used by the code that changes "State".
+ * When 'imactivatefunc' is defined use that function instead.
  */
     void
-im_set_active(int active)
-{
-    if (xic == NULL)
-	return;
+im_set_active(int active_arg)
+{
+    int active = active_arg;
 
     /* If 'imdisable' is set, XIM is never active. */
     if (p_imdisable)
 	active = FALSE;
-#if !defined(FEAT_GUI_GTK)
+#  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
+#  endif
+
+#  if defined(FEAT_EVAL)
+    if (p_imaf[0] != NUL)
+    {
+	if (active != im_get_status())
+	{
+	    call_imactivatefunc(active);
+	    im_is_active = active;
+	}
+	return;
+    }
+#  endif
+
+    if (xic == NULL)
+	return;
 
     /* Remember the active state, it is needed when Vim gets keyboard focus. */
     xim_is_active = active;
@@ -6019,19 +6031,19 @@ xim_set_preedit(void)
     }
 }
 
-#if defined(FEAT_GUI_X11)
+#  if defined(FEAT_GUI_X11)
 static char e_xim[] = N_("E285: Failed to create input context");
-#endif
-
-#if defined(FEAT_GUI_X11) || defined(PROTO)
-# if defined(XtSpecificationRelease) && XtSpecificationRelease >= 6 && !defined(SUN_SYSTEM)
-#  define USE_X11R6_XIM
-# endif
+#  endif
+
+#  if defined(FEAT_GUI_X11) || defined(PROTO)
+#   if defined(XtSpecificationRelease) && XtSpecificationRelease >= 6 && !defined(SUN_SYSTEM)
+#    define USE_X11R6_XIM
+#   endif
 
 static int xim_real_init(Window x11_window, Display *x11_display);
 
 
-#ifdef USE_X11R6_XIM
+#  ifdef USE_X11R6_XIM
 static void xim_destroy_cb(XIM im, XPointer client_data, XPointer call_data);
 
     static void
@@ -6043,9 +6055,9 @@ xim_instantiate_cb(
     Window	x11_window;
     Display	*x11_display;
 
-#ifdef XIM_DEBUG
+#   ifdef XIM_DEBUG
     xim_log("xim_instantiate_cb()\n");
-#endif
+#   endif
 
     gui_get_x11_windis(&x11_window, &x11_display);
     if (display != x11_display)
@@ -6067,9 +6079,9 @@ xim_destroy_cb(
     Window	x11_window;
     Display	*x11_display;
 
-#ifdef XIM_DEBUG
+#   ifdef XIM_DEBUG
     xim_log("xim_destroy_cb()\n");
-#endif
+   #endif
     gui_get_x11_windis(&x11_window, &x11_display);
 
     xic = NULL;
@@ -6080,7 +6092,7 @@ xim_destroy_cb(
     XRegisterIMInstantiateCallback(x11_display, NULL, NULL, NULL,
 				   xim_instantiate_cb, NULL);
 }
-#endif
+#  endif
 
     void
 xim_init(void)
@@ -6088,9 +6100,9 @@ xim_init(void)
     Window	x11_window;
     Display	*x11_display;
 
-#ifdef XIM_DEBUG
+#  ifdef XIM_DEBUG
     xim_log("xim_init()\n");
-#endif
+#  endif
 
     gui_get_x11_windis(&x11_window, &x11_display);
 
@@ -6101,10 +6113,10 @@ xim_init(void)
 
     gui_set_shellsize(FALSE, FALSE, RESIZE_BOTH);
 
-#ifdef USE_X11R6_XIM
+#  ifdef USE_X11R6_XIM
     XRegisterIMInstantiateCallback(x11_display, NULL, NULL, NULL,
 				   xim_instantiate_cb, NULL);
-#endif
+#  endif
 }
 
     static int
@@ -6116,7 +6128,7 @@ xim_real_init(Window x11_window, Display
 		*ns,
 		*end,
 		tmp[1024];
-#define IMLEN_MAX 40
+#  define IMLEN_MAX 40
     char	buf[IMLEN_MAX + 7];
     XIM		xim = NULL;
     XIMStyles	*xim_styles;
@@ -6181,7 +6193,7 @@ xim_real_init(Window x11_window, Display
 	return FALSE;
     }
 
-#ifdef USE_X11R6_XIM
+#  ifdef USE_X11R6_XIM
     {
 	XIMCallback destroy_cb;
 
@@ -6190,7 +6202,7 @@ xim_real_init(Window x11_window, Display
 	if (XSetIMValues(xim, XNDestroyCallback, &destroy_cb, NULL))
 	    EMSG(_("E287: Warning: Could not set destroy callback to IM"));
     }
-#endif
+#  endif
 
     if (XGetIMValues(xim, XNQueryInputStyle, &xim_styles, NULL) || !xim_styles)
     {
@@ -6266,7 +6278,7 @@ xim_real_init(Window x11_window, Display
 
     /* A crash was reported when trying to pass gui.norm_font as XNFontSet,
      * thus that has been removed.  Hopefully the default works... */
-#ifdef FEAT_XFONTSET
+#  ifdef FEAT_XFONTSET
     if (gui.fontset != NOFONTSET)
     {
 	preedit_list = XVaCreateNestedList(0,
@@ -6282,7 +6294,7 @@ xim_real_init(Window x11_window, Display
 				NULL);
     }
     else
-#endif
+#  endif
     {
 	preedit_list = XVaCreateNestedList(0,
 				XNSpotLocation, &over_spot,
@@ -6324,7 +6336,7 @@ xim_real_init(Window x11_window, Display
     return TRUE;
 }
 
-#endif /* FEAT_GUI_X11 */
+#  endif /* FEAT_GUI_X11 */
 
 /*
  * Get IM status.  When IM is on, return TRUE.  Else return FALSE.
@@ -6335,6 +6347,10 @@ xim_real_init(Window x11_window, Display
     int
 im_get_status(void)
 {
+#  ifdef FEAT_EVAL
+    if (p_imsf[0] != NUL)
+	return call_imstatusfunc();
+#  endif
     return xim_has_focus;
 }
 
@@ -6458,38 +6474,29 @@ xim_get_status_area_height(void)
 #else /* !defined(FEAT_XIM) */
 
 # ifndef FEAT_GUI_W32
+static int im_was_set_active = FALSE;
+
     int
 im_get_status()
 {
 #  ifdef FEAT_EVAL
     if (p_imsf[0] != NUL)
-    {
-	int is_active;
-
-	/* FIXME: Don't execute user function in unsafe situation. */
-	if (exiting
-#   ifdef FEAT_AUTOCMD
-		|| is_autocmd_blocked()
-#   endif
-		)
-	    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 call_imstatusfunc();
 #  endif
-    return FALSE;
+    return im_was_set_active;
 }
 
     void
-im_set_active(int active)
-{
-#  if defined(USE_IM_CONTROL) && defined(FEAT_EVAL)
-    if (p_imaf[0] != NUL)
-	call_imactivatefunc(p_imdisable ? FALSE : active);
+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())
+    {
+	call_imactivatefunc(active);
+	im_was_set_active = active;
+    }
 #  endif
 }
 # endif