]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix toggling `x-gtk-use-native-input'.
authorPo Lu <luangruo@yahoo.com>
Fri, 4 Feb 2022 05:13:06 +0000 (13:13 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 4 Feb 2022 05:13:49 +0000 (13:13 +0800)
* lisp/term/x-win.el (x-internal-focus-input-context):
(x-gtk-use-native-input-watcher): Update for changes to
`x-internal-focus-input-context'.

* src/xfns.c (Fx_internal_focus_input_context): New parameter
`focus'.

lisp/term/x-win.el
src/xfns.c

index 80a7d81d08418b0f1724185b44421b51ba3ccc2a..298c23566ed824b129716aebd477e135e9553505 100644 (file)
@@ -1563,16 +1563,15 @@ EVENT is a preedit-text event."
 
 (defvaralias 'x-gtk-use-system-tooltips 'use-system-tooltips)
 
-(declare-function x-internal-focus-input-context (frame) "xfns.c")
+(declare-function x-internal-focus-input-context (focus frame) "xfns.c")
 
 (defun x-gtk-use-native-input-watcher (_symbol newval &rest _ignored)
   "Variable watcher for `x-gtk-use-native-input'.
 If NEWVAL is non-nil and the selected frame is displayed through X,
 focus the GTK input context."
   (when (and (featurep 'gtk)
-             newval
              (eq (framep (selected-frame)) 'x))
-    (x-internal-focus-input-context (selected-frame))))
+    (x-internal-focus-input-context newval (selected-frame))))
 
 (add-variable-watcher 'x-gtk-use-native-input
                       #'x-gtk-use-native-input-watcher)
index deaf4204a9f3e59aea16b226c9d7582f4a8a6c89..4b10f5035a7a8f05ae855fad8849b654176d6c02 100644 (file)
@@ -8567,18 +8567,28 @@ DEFUN ("x-gtk-debug", Fx_gtk_debug, Sx_gtk_debug, 1, 1, 0,
 #endif /* USE_GTK */
 
 DEFUN ("x-internal-focus-input-context", Fx_internal_focus_input_context,
-       Sx_internal_focus_input_context, 1, 1, 0,
+       Sx_internal_focus_input_context, 2, 2, 0,
        doc: /* Focus and set the client window of FRAME's GTK input context.
+If FOCUS is nil, focus out and remove the client window instead.
 This should be called from a variable watcher for `x-gtk-use-native-input'.  */)
-  (Lisp_Object frame)
+  (Lisp_Object focus, Lisp_Object frame)
 {
 #ifdef USE_GTK
   struct frame *f = decode_window_system_frame (frame);
   GtkWidget *widget = FRAME_GTK_OUTER_WIDGET (f);
 
-  gtk_im_context_focus_in (FRAME_X_OUTPUT (f)->im_context);
-  gtk_im_context_set_client_window (FRAME_X_OUTPUT (f)->im_context,
-                                   gtk_widget_get_window (widget));
+  if (!NILP (focus))
+    {
+      gtk_im_context_focus_in (FRAME_X_OUTPUT (f)->im_context);
+      gtk_im_context_set_client_window (FRAME_X_OUTPUT (f)->im_context,
+                                       gtk_widget_get_window (widget));
+    }
+  else
+    {
+      gtk_im_context_focus_out (FRAME_X_OUTPUT (f)->im_context);
+      gtk_im_context_set_client_window (FRAME_X_OUTPUT (f)->im_context,
+                                       NULL);
+    }
 #endif
 
   return Qnil;