diff options
| author | Po Lu | 2022-01-09 20:43:17 +0800 |
|---|---|---|
| committer | Po Lu | 2022-01-09 20:43:17 +0800 |
| commit | e91848344e096e23ad00a8a4e58299a33ed82e1c (patch) | |
| tree | e0b2a1066abf0328103a168984ec1a89831525b5 /src/gtkutil.c | |
| parent | 59ede5cce8e58eabc479ecca88c0ce67bc4bb928 (diff) | |
| download | emacs-e91848344e096e23ad00a8a4e58299a33ed82e1c.tar.gz emacs-e91848344e096e23ad00a8a4e58299a33ed82e1c.zip | |
Pass through caret position from native GTK input methods
* 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.
Diffstat (limited to 'src/gtkutil.c')
| -rw-r--r-- | src/gtkutil.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c index 5ed871a8226..c47386dae00 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c | |||
| @@ -6089,6 +6089,13 @@ xg_im_context_preedit_changed (GtkIMContext *imc, gpointer user_data) | |||
| 6089 | EVENT_INIT (inev); | 6089 | EVENT_INIT (inev); |
| 6090 | inev.kind = PREEDIT_TEXT_EVENT; | 6090 | inev.kind = PREEDIT_TEXT_EVENT; |
| 6091 | inev.arg = build_string_from_utf8 (str); | 6091 | inev.arg = build_string_from_utf8 (str); |
| 6092 | |||
| 6093 | Fput_text_property (make_fixnum (min (SCHARS (inev.arg), | ||
| 6094 | max (0, cursor))), | ||
| 6095 | make_fixnum (min (SCHARS (inev.arg), | ||
| 6096 | max (0, cursor) + 1)), | ||
| 6097 | Qcursor, Qt, inev.arg); | ||
| 6098 | |||
| 6092 | kbd_buffer_store_event (&inev); | 6099 | kbd_buffer_store_event (&inev); |
| 6093 | 6100 | ||
| 6094 | g_free (str); | 6101 | g_free (str); |
| @@ -6146,6 +6153,9 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent *event, | |||
| 6146 | inev.ie.modifiers | 6153 | inev.ie.modifiers |
| 6147 | |= x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), xstate); | 6154 | |= x_x_to_emacs_modifiers (FRAME_DISPLAY_INFO (f), xstate); |
| 6148 | 6155 | ||
| 6156 | if (event->key.is_modifier) | ||
| 6157 | goto done; | ||
| 6158 | |||
| 6149 | /* First deal with keysyms which have defined | 6159 | /* First deal with keysyms which have defined |
| 6150 | translations to characters. */ | 6160 | translations to characters. */ |
| 6151 | if (keysym >= 32 && keysym < 128) | 6161 | if (keysym >= 32 && keysym < 128) |
| @@ -6217,8 +6227,7 @@ xg_widget_key_press_event_cb (GtkWidget *widget, GdkEvent *event, | |||
| 6217 | || IsKeypadKey (keysym) /* 0xff80 <= x < 0xffbe */ | 6227 | || IsKeypadKey (keysym) /* 0xff80 <= x < 0xffbe */ |
| 6218 | || IsFunctionKey (keysym) /* 0xffbe <= x < 0xffe1 */ | 6228 | || IsFunctionKey (keysym) /* 0xffbe <= x < 0xffe1 */ |
| 6219 | /* Any "vendor-specific" key is ok. */ | 6229 | /* Any "vendor-specific" key is ok. */ |
| 6220 | || (keysym & (1 << 28))) | 6230 | || (keysym & (1 << 28)))) |
| 6221 | && !(event->key.is_modifier)) | ||
| 6222 | { | 6231 | { |
| 6223 | inev.ie.kind = NON_ASCII_KEYSTROKE_EVENT; | 6232 | inev.ie.kind = NON_ASCII_KEYSTROKE_EVENT; |
| 6224 | inev.ie.code = keysym; | 6233 | inev.ie.code = keysym; |