summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-05-28 16:10:54 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-05-28 17:08:33 -0400
commit506d73cf327d9b34a137b3c6dd537f794e36877f (patch)
treed481af57d1bb5c2a28746ab5a6dadf426a03c51b /gtk
parent266a3a5267e5ba043912291879731f14b54a3e6b (diff)
downloadgtk+-506d73cf327d9b34a137b3c6dd537f794e36877f.tar.gz
Add gtk_im_context_filter_key
An event-less variant of the filtering api.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkimcontext.c96
-rw-r--r--gtk/gtkimcontext.h13
2 files changed, 108 insertions, 1 deletions
diff --git a/gtk/gtkimcontext.c b/gtk/gtkimcontext.c
index 986608e718..dc31fd3c2c 100644
--- a/gtk/gtkimcontext.c
+++ b/gtk/gtkimcontext.c
@@ -523,6 +523,102 @@ gtk_im_context_filter_keypress (GtkIMContext *context,
}
/**
+ * gtk_im_context_filter_key:
+ * @context: a #GtkIMContext
+ * @press: whether to forward a key press or release event
+ * @surface: the surface the event is for
+ * @device: the device that the event is for
+ * @time: the timestamp for the event
+ * @keycode: the keycode for the event
+ * @state: modifier state for the event
+ * @group: the active keyboard group for the event
+ *
+ * Allow an input method to forward key press and release events
+ * to another input method, without necessarily having a GdkEvent
+ * available.
+ *
+ * Returns: %TRUE if the input method handled the key event.
+ */
+gboolean
+gtk_im_context_filter_key (GtkIMContext *context,
+ gboolean press,
+ GdkSurface *surface,
+ GdkDevice *device,
+ guint32 time,
+ guint keycode,
+ GdkModifierType state,
+ int group)
+{
+ GdkDevice *source_device;
+ GdkTranslatedKey translated, no_lock;
+ GdkEvent *key;
+ gboolean ret;
+ guint keyval;
+ int layout;
+ int level;
+ GdkModifierType consumed;
+
+ g_return_val_if_fail (GTK_IS_IM_CONTEXT (context), FALSE);
+
+ if (gdk_device_get_device_type (device) == GDK_DEVICE_TYPE_MASTER)
+ {
+ source_device = NULL;
+ }
+ else
+ {
+ source_device = device;
+ device = gdk_device_get_associated_device (source_device);
+ }
+
+ if (!gdk_display_translate_key (gdk_surface_get_display (surface),
+ keycode,
+ state,
+ group,
+ &keyval,
+ &layout,
+ &level,
+ &consumed))
+ return FALSE;
+
+ translated.keyval = keyval;
+ translated.layout = layout;
+ translated.level = level;
+ translated.consumed = consumed;
+
+ if (!gdk_display_translate_key (gdk_surface_get_display (surface),
+ keycode,
+ state & ~GDK_LOCK_MASK,
+ group,
+ &keyval,
+ &layout,
+ &level,
+ &consumed))
+ return FALSE;
+
+ no_lock.keyval = keyval;
+ no_lock.layout = layout;
+ no_lock.level = level;
+ no_lock.consumed = consumed;
+
+ key = gdk_key_event_new (press ? GDK_KEY_PRESS : GDK_KEY_RELEASE,
+ surface,
+ device,
+ source_device,
+ time,
+ keycode,
+ state,
+ FALSE, /* FIXME */
+ &translated,
+ &no_lock);
+
+ ret = GTK_IM_CONTEXT_GET_CLASS (context)->filter_keypress (context, key);
+
+ gdk_event_unref (key);
+
+ return ret;
+}
+
+/**
* gtk_im_context_focus_in:
* @context: a #GtkIMContext
*
diff --git a/gtk/gtkimcontext.h b/gtk/gtkimcontext.h
index 33b41d5895..fee5cf2046 100644
--- a/gtk/gtkimcontext.h
+++ b/gtk/gtkimcontext.h
@@ -106,7 +106,18 @@ void gtk_im_context_get_preedit_string (GtkIMContext *context,
gint *cursor_pos);
GDK_AVAILABLE_IN_ALL
gboolean gtk_im_context_filter_keypress (GtkIMContext *context,
- GdkEvent *event);
+ GdkEvent *event);
+
+GDK_AVAILABLE_IN_ALL
+gboolean gtk_im_context_filter_key (GtkIMContext *context,
+ gboolean press,
+ GdkSurface *surface,
+ GdkDevice *device,
+ guint32 time,
+ guint keycode,
+ GdkModifierType state,
+ int group);
+
GDK_AVAILABLE_IN_ALL
void gtk_im_context_focus_in (GtkIMContext *context);
GDK_AVAILABLE_IN_ALL