[gnome-shell] st-im-text: Replace key-* handler with captured-event
- From: Florian MÃllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] st-im-text: Replace key-* handler with captured-event
- Date: Wed, 12 Sep 2012 16:50:52 +0000 (UTC)
commit 49df72ceda79d866056888b2561d134f39383893
Author: Florian MÃllner <fmuellner gnome org>
Date: Wed Sep 12 14:35:52 2012 +0200
st-im-text: Replace key-* handler with captured-event
When using an input method like IBus, the IM is expected to process
key events before anything else. Currently this doesn't always work
as expected, as the event filtering is done in the default handlers
of the key-press and key-release events, e.g. only after other
handlers have been run.
To allow the IM to filter events earlier, move the code to a
captured-event handler instead.
https://bugzilla.gnome.org/show_bug.cgi?id=658325
src/st/st-im-text.c | 50 ++++++++++++--------------------------------------
1 files changed, 12 insertions(+), 38 deletions(-)
---
diff --git a/src/st/st-im-text.c b/src/st/st-im-text.c
index 0e13f42..874b841 100644
--- a/src/st/st-im-text.c
+++ b/src/st/st-im-text.c
@@ -355,18 +355,22 @@ st_im_text_button_press_event (ClutterActor *actor,
}
static gboolean
-st_im_text_key_press_event (ClutterActor *actor,
- ClutterKeyEvent *event)
+st_im_text_captured_event (ClutterActor *actor,
+ ClutterEvent *event)
{
StIMText *self = ST_IM_TEXT (actor);
StIMTextPrivate *priv = self->priv;
ClutterText *clutter_text = CLUTTER_TEXT (actor);
+ ClutterEventType type = clutter_event_type (event);
gboolean result = FALSE;
int old_position;
+ if (type != CLUTTER_KEY_PRESS && type != CLUTTER_KEY_RELEASE)
+ return FALSE;
+
if (clutter_text_get_editable (clutter_text))
{
- GdkEventKey *event_gdk = key_event_to_gdk (event);
+ GdkEventKey *event_gdk = key_event_to_gdk ((ClutterKeyEvent *)event);
if (gtk_im_context_filter_keypress (priv->im_context, event_gdk))
{
@@ -380,45 +384,16 @@ st_im_text_key_press_event (ClutterActor *actor,
old_position = clutter_text_get_cursor_position (clutter_text);
if (!result &&
- CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_press_event)
- result = CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_press_event (actor, event);
+ CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->captured_event)
+ result = CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->captured_event (actor, event);
- if (clutter_text_get_cursor_position (clutter_text) != old_position)
+ if (type == CLUTTER_KEY_PRESS &&
+ clutter_text_get_cursor_position (clutter_text) != old_position)
reset_im_context (self);
return result;
}
-static gboolean
-st_im_text_key_release_event (ClutterActor *actor,
- ClutterKeyEvent *event)
-{
- StIMText *self = ST_IM_TEXT (actor);
- StIMTextPrivate *priv = self->priv;
- ClutterText *clutter_text = CLUTTER_TEXT (actor);
- GdkEventKey *event_gdk;
- gboolean result = FALSE;
-
- if (clutter_text_get_editable (clutter_text))
- {
- event_gdk = key_event_to_gdk (event);
-
- if (gtk_im_context_filter_keypress (priv->im_context, event_gdk))
- {
- priv->need_im_reset = TRUE;
- result = TRUE;
- }
-
- gdk_event_free ((GdkEvent *)event_gdk);
- }
-
- if (!result &&
- CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_release_event)
- result = CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_release_event (actor, event);
-
- return result;
-}
-
static void
st_im_text_key_focus_in (ClutterActor *actor)
{
@@ -467,8 +442,7 @@ st_im_text_class_init (StIMTextClass *klass)
actor_class->unrealize = st_im_text_unrealize;
actor_class->button_press_event = st_im_text_button_press_event;
- actor_class->key_press_event = st_im_text_key_press_event;
- actor_class->key_release_event = st_im_text_key_release_event;
+ actor_class->captured_event = st_im_text_captured_event;
actor_class->key_focus_in = st_im_text_key_focus_in;
actor_class->key_focus_out = st_im_text_key_focus_out;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]