]> git.eshelyaron.com Git - emacs.git/commitdiff
Add support for setting cursor location using Gtk IM Context
authorYichao Yu <yyc1992@gmail.com>
Sat, 30 Jan 2021 14:20:08 +0000 (23:20 +0900)
committerYuuki Harano <masm+github@masm11.me>
Sat, 30 Jan 2021 14:20:08 +0000 (23:20 +0900)
The existing XIC implementation doesn't work when using Gtk IM Context.
Instead, `gtk_im_context_set_cursor_location` should be used
to update the cursor information for the input method.

* src/pgtkim.c (pgtk_im_set_cursor_location): New function to tell gtk
cursor location.
* src/pgtkterm.c (pgtk_draw_window_cursor): Remove invalid code and
add new code to call the function.
* src/pgtkterm.h: Add the function declaration.

src/pgtkim.c
src/pgtkterm.c
src/pgtkterm.h

index 68f83d2c6e1482d7f66c3fcfc5e3570aefa8d20f..ba69a27501a3ac8637445c8208d567486649bdfe 100644 (file)
@@ -210,6 +210,18 @@ pgtk_im_filter_keypress (struct frame *f, GdkEventKey * ev)
   return false;
 }
 
+void
+pgtk_im_set_cursor_location (struct frame *f, int x, int y, int width,
+                            int height)
+{
+  struct pgtk_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
+  if (dpyinfo->im.context != NULL && dpyinfo->im.focused_frame == f)
+    {
+      GdkRectangle area = { x, y, width, height };
+      gtk_im_context_set_cursor_location (dpyinfo->im.context, &area);
+    }
+}
+
 static void
 pgtk_im_use_context (struct pgtk_display_info *dpyinfo, bool use_p)
 {
index 44e1f3e2966b5af9e1c8f1d6fcc30625421ebd75..5d1716adcb806221a319b8572da439b9a723b1f1 100644 (file)
@@ -2878,6 +2878,7 @@ pgtk_draw_window_cursor (struct window *w, struct glyph_row *glyph_row, int x,
                         int y, enum text_cursor_kinds cursor_type,
                         int cursor_width, bool on_p, bool active_p)
 {
+  struct frame *f = XFRAME (w->frame);
   PGTK_TRACE ("draw_window_cursor: %d, %d, %d, %d, %d, %d.",
              x, y, cursor_type, cursor_width, on_p, active_p);
   if (on_p)
@@ -2922,11 +2923,15 @@ pgtk_draw_window_cursor (struct window *w, struct glyph_row *glyph_row, int x,
            }
        }
 
-#ifdef HAVE_X_I18N
       if (w == XWINDOW (f->selected_window))
-       if (FRAME_XIC (f) && (FRAME_XIC_STYLE (f) & XIMPreeditPosition))
-         xic_set_preeditarea (w, x, y);
-#endif
+       {
+         int frame_x =
+           WINDOW_TO_FRAME_PIXEL_X (w, x) + WINDOW_LEFT_FRINGE_WIDTH (w);
+         int frame_y = WINDOW_TO_FRAME_PIXEL_Y (w, y);
+         pgtk_im_set_cursor_location (f, frame_x, frame_y,
+                                      w->phys_cursor_width,
+                                      w->phys_cursor_height);
+       }
     }
 
 }
index 5e71f9399870e0aca282c01b518b91c441863821..07d7fc10c65862aa45ea8a3094a3577e937ad822 100644 (file)
@@ -653,6 +653,8 @@ extern void pgtk_enqueue_preedit (struct frame *f, Lisp_Object image_data);
 extern void pgtk_im_focus_in (struct frame *f);
 extern void pgtk_im_focus_out (struct frame *f);
 extern bool pgtk_im_filter_keypress (struct frame *f, GdkEventKey * ev);
+extern void pgtk_im_set_cursor_location (struct frame *f, int x, int y,
+                                        int width, int height);
 extern void pgtk_im_init (struct pgtk_display_info *dpyinfo);
 extern void pgtk_im_finish (struct pgtk_display_info *dpyinfo);