summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYichao Yu <yyc1992@gmail.com>2021-01-30 23:20:08 +0900
committerYuuki Harano <masm+github@masm11.me>2021-01-30 23:20:08 +0900
commit563a0d94c379292bd88e83f18560ed21c497cea9 (patch)
treeb2fb6a1f72bcad0ec80e89505ee23a4a8d41d878 /src
parente9608601e5d5f45be36a8f833a98230086e628a8 (diff)
downloademacs-563a0d94c379292bd88e83f18560ed21c497cea9.tar.gz
emacs-563a0d94c379292bd88e83f18560ed21c497cea9.tar.bz2
emacs-563a0d94c379292bd88e83f18560ed21c497cea9.zip
Add support for setting cursor location using Gtk IM Context
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.
Diffstat (limited to 'src')
-rw-r--r--src/pgtkim.c12
-rw-r--r--src/pgtkterm.c13
-rw-r--r--src/pgtkterm.h2
3 files changed, 23 insertions, 4 deletions
diff --git a/src/pgtkim.c b/src/pgtkim.c
index 68f83d2c6e1..ba69a27501a 100644
--- a/src/pgtkim.c
+++ b/src/pgtkim.c
@@ -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)
{
diff --git a/src/pgtkterm.c b/src/pgtkterm.c
index 44e1f3e2966..5d1716adcb8 100644
--- a/src/pgtkterm.c
+++ b/src/pgtkterm.c
@@ -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);
+ }
}
}
diff --git a/src/pgtkterm.h b/src/pgtkterm.h
index 5e71f939987..07d7fc10c65 100644
--- a/src/pgtkterm.h
+++ b/src/pgtkterm.h
@@ -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);