[gnome-shell] st-im-text: Replace key-* handler with captured-event



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]