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_realize (ClutterActor *actor) { StIMTextPrivate *priv = ST_IM_TEXT (actor)->priv; priv->window = window_for_actor (actor); gtk_im_context_set_client_window (priv->im_context, priv->window); }
static void st_im_text_dispose (GObject *object) { StIMTextPrivate *priv = ST_IM_TEXT (object)->priv; G_OBJECT_CLASS (st_im_text_parent_class)->dispose (object); g_clear_object (&priv->im_context); }
static void st_im_text_unrealize (ClutterActor *actor) { StIMText *self = ST_IM_TEXT (actor); StIMTextPrivate *priv = self->priv; reset_im_context (self); gtk_im_context_set_client_window (priv->im_context, NULL); g_object_unref (priv->window); priv->window = NULL; }
static void st_im_text_paint (ClutterActor *actor) { StIMText *self = ST_IM_TEXT (actor); ClutterText *clutter_text = CLUTTER_TEXT (actor); /* This updates the cursor position as a side-effect */ if (CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->paint) CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->paint (actor); if (clutter_text_get_editable (clutter_text)) update_im_cursor_location (self); }
static void st_im_text_dispose (GObject *object) { StIMTextPrivate *priv = ST_IM_TEXT (object)->priv; g_signal_handlers_disconnect_by_func (priv->im_context, (void *) st_im_text_commit_cb, object); g_object_unref (priv->im_context); priv->im_context = NULL; G_OBJECT_CLASS (st_im_text_parent_class)->dispose (object); }
static void st_im_text_key_focus_out (ClutterActor *actor) { StIMTextPrivate *priv = ST_IM_TEXT (actor)->priv; ClutterText *clutter_text = CLUTTER_TEXT (actor); if (clutter_text_get_editable (clutter_text)) { priv->need_im_reset = TRUE; gtk_im_context_focus_out (priv->im_context); } if (CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_focus_out) CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->key_focus_out (actor); }
static gboolean st_im_text_button_press_event (ClutterActor *actor, ClutterButtonEvent *event) { /* The button press indicates the user moving the cursor, or selecting * etc, so we should abort any current preedit operation. ClutterText * treats all buttons identically, so so do we. */ reset_im_context (ST_IM_TEXT (actor)); if (CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->button_press_event) return CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->button_press_event (actor, event); else return FALSE; }
static gboolean 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 ((ClutterKeyEvent *)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); } old_position = clutter_text_get_cursor_position (clutter_text); if (!result && CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->captured_event) result = CLUTTER_ACTOR_CLASS (st_im_text_parent_class)->captured_event (actor, event); if (type == CLUTTER_KEY_PRESS && clutter_text_get_cursor_position (clutter_text) != old_position) reset_im_context (self); return result; }