]> git.eshelyaron.com Git - emacs.git/commitdiff
Make `x-gtk-use-native-input' take effect immediately
authorPo Lu <luangruo@yahoo.com>
Fri, 4 Feb 2022 02:11:31 +0000 (10:11 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 4 Feb 2022 02:12:08 +0000 (10:12 +0800)
* lisp/term/x-win.el (x-internal-focus-input-context): New
declaration.
(x-gtk-use-native-input-watcher): New variable watcher.
* src/xfns.c (Fx_internal_focus_input_context): New function.
(syms_of_xfns): Define new subr.

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

index 019a01e22ca39e57a8e4895482cd869347ca3ba3..80a7d81d08418b0f1724185b44421b51ba3ccc2a 100644 (file)
@@ -1563,6 +1563,20 @@ 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")
+
+(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))))
+
+(add-variable-watcher 'x-gtk-use-native-input
+                      #'x-gtk-use-native-input-watcher)
+
 (provide 'x-win)
 (provide 'term/x-win)
 
index 7007f70b1912c5dff6f36363647de76a508d20f5..7ca791afa18a7fc517a1655ccbe1a43eebdb7f64 100644 (file)
@@ -8565,6 +8565,22 @@ DEFUN ("x-gtk-debug", Fx_gtk_debug, Sx_gtk_debug, 1, 1, 0,
 #endif /* GTK_CHECK_VERSION (3, 14, 0) */
 #endif /* HAVE_GTK3 */
 #endif /* USE_GTK */
+
+DEFUN ("x-internal-focus-input-context", Fx_internal_focus_input_context,
+       Sx_internal_focus_input_context, 1, 1, 0,
+       doc: /* Focus and set the client window of FRAME's GTK input context.
+This should be called from a variable watcher for `x-gtk-use-native-input'.  */)
+  (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));
+#endif
+}
 \f
 /***********************************************************************
                            Initialization
@@ -8942,6 +8958,8 @@ eliminated in future versions of Emacs.  */);
   defsubr (&Sx_select_font);
 #endif
 
+  defsubr (&Sx_internal_focus_input_context);
+
 #ifdef USE_CAIRO
   defsubr (&Sx_export_frames);
 #ifdef USE_GTK