]> git.eshelyaron.com Git - emacs.git/commitdiff
Pass through caret position from native GTK input methods
authorPo Lu <luangruo@yahoo.com>
Sun, 9 Jan 2022 12:43:17 +0000 (20:43 +0800)
committerPo Lu <luangruo@yahoo.com>
Sun, 9 Jan 2022 12:43:17 +0000 (20:43 +0800)
* src/gtkutil.c (xg_im_context_preedit_changed): Set caret
position appropriately.
* src/xfns.c (xg_widget_key_press_event_cb): Ignore modifier
keys.
(xic_preedit_caret_callback, xic_preedit_draw_callback):
Constrain caret position to the string length as well.

src/gtkutil.c
src/xfns.c

index 5ed871a8226d0341c73bfdedddfdb4f26979ec97..c47386dae00f1b3b97a3fc9a1ad9dc0b84609441 100644 (file)
@@ -6089,6 +6089,13 @@ xg_im_context_preedit_changed (GtkIMContext *imc, gpointer user_data)
   EVENT_INIT (inev);
   inev.kind = PREEDIT_TEXT_EVENT;
   inev.arg = build_string_from_utf8 (str);
+
+  Fput_text_property (make_fixnum (min (SCHARS (inev.arg),
+                                       max (0, cursor))),
+                     make_fixnum (min (SCHARS (inev.arg),
+                                       max (0, cursor) + 1)),
+                     Qcursor, Qt, inev.arg);
+
   kbd_buffer_store_event (&inev);
 
   g_free (str);
@@ -6146,6 +6153,9 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent *event,
   inev.ie.modifiers
     |= x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), xstate);
 
+  if (event->key.is_modifier)
+    goto done;
+
   /* First deal with keysyms which have defined
      translations to characters.  */
   if (keysym >= 32 && keysym < 128)
@@ -6217,8 +6227,7 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent *event,
        || IsKeypadKey (keysym) /* 0xff80 <= x < 0xffbe */
        || IsFunctionKey (keysym)       /* 0xffbe <= x < 0xffe1 */
        /* Any "vendor-specific" key is ok.  */
-       || (keysym & (1 << 28)))
-      && !(event->key.is_modifier))
+       || (keysym & (1 << 28))))
     {
       inev.ie.kind = NON_ASCII_KEYSTROKE_EVENT;
       inev.ie.code = keysym;
index 293a1b586a4a990868a0e012944f2de965029630..7540816416d81b94197c06d5547f98ad74da0e3d 100644 (file)
@@ -2973,7 +2973,8 @@ xic_preedit_caret_callback (XIC xic, XPointer client_data,
          ie.arg = make_string_from_utf8 (output->preedit_chars,
                                          output->preedit_size);
 
-         Fput_text_property (make_fixnum (max (0, output->preedit_caret)),
+         Fput_text_property (make_fixnum (min (SCHARS (ie.arg),
+                                               max (0, output->preedit_caret))),
                              make_fixnum (max (SCHARS (ie.arg),
                                                max (0, output->preedit_caret) + 1)),
                              Qcursor, Qt, ie.arg);
@@ -3195,7 +3196,8 @@ xic_preedit_draw_callback (XIC xic, XPointer client_data,
       ie.arg = make_string_from_utf8 (output->preedit_chars,
                                      output->preedit_size);
 
-      Fput_text_property (make_fixnum (max (0, output->preedit_caret)),
+      Fput_text_property (make_fixnum (min (SCHARS (ie.arg),
+                                           max (0, output->preedit_caret))),
                          make_fixnum (min (SCHARS (ie.arg),
                                            max (0, output->preedit_caret) + 1)),
                          Qcursor, Qt, ie.arg);