ClutterIMContext *scim_bridge_client_imcontext_new () { scim_bridge_pdebugln (4, "scim_bridge_client_imcontext_new ()"); ScimBridgeClientIMContext *ic = SCIM_BRIDGE_CLIENT_IMCONTEXT (g_object_new (CLUTTER_TYPE_SCIM_CLIENT_IMCONTEXT, NULL)); return CLUTTER_IM_CONTEXT (ic); }
void _fcitx_im_context_forward_key_cb(DBusGProxy* proxy, guint keyval, guint state, gint type, void* user_data) { FcitxLog(LOG_LEVEL, "_fcitx_im_context_forward_key_cb"); ClutterIMContext* context = CLUTTER_IM_CONTEXT(user_data); const char* signal_name; gboolean consumed = FALSE; FcitxKeyEventType tp = (FcitxKeyEventType) type; ClutterKeyEvent clutter_key_event; clutter_key_event.flags = 0; clutter_key_event.source = NULL; clutter_key_event.keyval = keyval; clutter_key_event.hardware_keycode = 0; clutter_key_event.unicode_value = 0; clutter_key_event.modifier_state = state; clutter_key_event.device = NULL; struct timeval current_time; gettimeofday(¤t_time, NULL); clutter_key_event.time = current_time.tv_sec * 1000 + current_time.tv_usec / 1000; if (tp == FCITX_PRESS_KEY) { clutter_key_event.type = CLUTTER_KEY_PRESS; signal_name = "key-press-event"; } else { clutter_key_event.type = CLUTTER_KEY_RELEASE; clutter_key_event.modifier_state |= CLUTTER_RELEASE_MASK; signal_name = "key-release-event"; } clutter_key_event.modifier_state |= FcitxKeyState_IgnoredMask; clutter_key_event.stage = CLUTTER_STAGE (clutter_actor_get_stage(context->actor)); g_signal_emit_by_name(context->actor, signal_name, &clutter_key_event, &consumed); }
void scim_bridge_client_imcontext_finalize (GObject *object) { scim_bridge_pdebugln (5, "scim_bridge_client_imcontext_finalize ()"); ScimBridgeClientIMContext *imcontext = SCIM_BRIDGE_CLIENT_IMCONTEXT (object); if (imcontext == focused_imcontext) scim_bridge_client_imcontext_focus_out (CLUTTER_IM_CONTEXT (imcontext)); if (!scim_bridge_client_is_messenger_opened ()) { scim_bridge_perrorln ("The messenger is now down"); } else if (scim_bridge_client_deregister_imcontext (imcontext)) { scim_bridge_perrorln ("Failed to deregister an IMContext"); } else { scim_bridge_pdebugln (3, "IMContext deregistered: id = %d", imcontext->id); } if (imcontext->client_stage) g_object_unref (imcontext->client_stage); free (imcontext->preedit_string); free (imcontext->commit_string); if (imcontext->preedit_attributes != NULL) pango_attr_list_unref (imcontext->preedit_attributes); imcontext->preedit_attributes = NULL; root_klass->finalize (object); }
static retval_t filter_key_event (ScimBridgeClientIMContext *imcontext, ClutterKeyEvent *event, boolean *consumed) { scim_bridge_pdebugln (5, "filter_key_event ()"); if (focused_imcontext != imcontext) scim_bridge_client_imcontext_focus_in (CLUTTER_IM_CONTEXT (imcontext)); /* if the source is null, then it's the event we forward out, and we do not handle it again */ if (clutter_event_get_source ((ClutterEvent*) event) == NULL) return RETVAL_SUCCEEDED; focused_actor = clutter_event_get_source ((ClutterEvent*) event); if (scim_bridge_client_is_messenger_opened ()) { ScimBridgeKeyEvent *bridge_key_event = scim_bridge_alloc_key_event (); scim_bridge_key_event_clutter_to_bridge (bridge_key_event, imcontext->client_stage, event); *consumed = FALSE; const retval_t retval_error = scim_bridge_client_handle_key_event (imcontext, bridge_key_event, consumed); scim_bridge_free_key_event (bridge_key_event); if (retval_error) { scim_bridge_perrorln ("An IOException at filter_key_event ()"); } else { return RETVAL_SUCCEEDED; } } return RETVAL_FAILED; }
static void _set_cursor_location_internal(FcitxIMContext *fcitxcontext) { ClutterIMContext* context = CLUTTER_IM_CONTEXT(fcitxcontext); ClutterActor *stage = clutter_actor_get_stage (context->actor); Window current_window, root, parent, *childs; unsigned int nchild; XWindowAttributes winattr; Display *xdpy; float fx, fy; gint x, y; if (!stage) return; clutter_actor_get_transformed_position (context->actor, &fx, &fy); x = fx; y = fy; xdpy = clutter_x11_get_default_display (); current_window = clutter_x11_get_stage_window(CLUTTER_STAGE(stage)); if (!xdpy || !current_window) return; while(1) { XGetWindowAttributes (xdpy, current_window, &winattr); x += winattr.x; y += winattr.y; XQueryTree(xdpy, current_window, &root, &parent, &childs, &nchild); current_window = parent; if (root == parent) break; } if (fcitxcontext->area.x != x || fcitxcontext->area.y != y) { fcitxcontext->area.x = x; fcitxcontext->area.y = y; } if (context->actor == NULL || !IsFcitxIMClientValid(fcitxcontext->client)) { return; } ClutterIMRectangle area = fcitxcontext->area; if (area.x == -1 && area.y == -1 && area.width == 0 && area.height == 0) { area.y = 0; area.x = 0; } FcitxIMClientSetCursorLocation(fcitxcontext->client, area.x, area.y + area.height); return; }
void scim_bridge_client_imcontext_imengine_status_changed (ScimBridgeClientIMContext *imcontext, boolean enabled) { if (imcontext->preedit_shown) { if (imcontext->enabled) { scim_bridge_client_imcontext_set_preedit_shown (imcontext, FALSE); scim_bridge_client_imcontext_update_preedit (imcontext); } else { clutter_im_context_reset (CLUTTER_IM_CONTEXT (fallback_imcontext)); } } imcontext->enabled = enabled; }
boolean scim_bridge_client_imcontext_get_surrounding_text (ScimBridgeClientIMContext *imcontext, int before_max, int after_max, char **string, int *cursor_position) { char *str; int cur_pos_in_utf8; if (clutter_im_context_get_surrounding (CLUTTER_IM_CONTEXT (imcontext), &str, &cur_pos_in_utf8)) { const size_t fetch_wstr_length = g_utf8_strlen (str, -1); const size_t after_wstr_length = g_utf8_strlen (str + cur_pos_in_utf8, -1); const size_t before_wstr_length = fetch_wstr_length - after_wstr_length; size_t before_copy_wstr_length; size_t after_copy_wstr_length; if (after_wstr_length > after_max) { after_copy_wstr_length = after_max; } else { after_copy_wstr_length = after_wstr_length; } if (before_wstr_length > before_max) { before_copy_wstr_length = before_max; } else { before_copy_wstr_length = before_wstr_length; } const size_t begin_wstr_index = before_wstr_length - before_copy_wstr_length; const size_t end_wstr_index = fetch_wstr_length - (after_wstr_length - after_copy_wstr_length); char* begin_str_ptr = g_utf8_offset_to_pointer (str, begin_wstr_index); char* end_str_ptr = g_utf8_offset_to_pointer (str, end_wstr_index); size_t str_length = end_str_ptr - begin_str_ptr; *string = malloc (sizeof (char) * (str_length + 1)); strncpy (*string, begin_str_ptr, str_length); (*string)[str_length] = '\0'; *cursor_position = before_copy_wstr_length; g_free (str); return TRUE; } else { *string = NULL; return FALSE; } }
void scim_bridge_client_imcontext_focus_out (ClutterIMContext *context) { scim_bridge_pdebugln (8, "scim_bridge_client_imcontext_focus_out ()"); ScimBridgeClientIMContext *imcontext = SCIM_BRIDGE_CLIENT_IMCONTEXT (context); focused_actor = NULL; focused_imcontext = imcontext; if (imcontext->preedit_shown) { if (imcontext->enabled) { scim_bridge_client_imcontext_set_preedit_shown (imcontext, FALSE); scim_bridge_client_imcontext_update_preedit (imcontext); } else { clutter_im_context_reset (CLUTTER_IM_CONTEXT (fallback_imcontext)); } } if (scim_bridge_client_is_messenger_opened () && imcontext != NULL) { if (scim_bridge_client_change_focus (imcontext, FALSE)) { scim_bridge_perrorln ("An IOException occurred at scim_bridge_client_imcontext_focus_out ()"); } } focused_imcontext = NULL; }
void scim_bridge_client_imcontext_focus_in (ClutterIMContext *context) { scim_bridge_pdebugln (8, "scim_bridge_client_imcontext_focus_in ()"); ScimBridgeClientIMContext *imcontext = SCIM_BRIDGE_CLIENT_IMCONTEXT (context); if (focused_imcontext != NULL && focused_imcontext != imcontext) scim_bridge_client_imcontext_focus_out (CLUTTER_IM_CONTEXT (focused_imcontext)); focused_imcontext = imcontext; if (!scim_bridge_client_is_messenger_opened () && scim_bridge_client_is_reconnection_enabled ()) { scim_bridge_pdebugln (7, "Trying to open the connection again..."); scim_bridge_client_open_messenger (); } if (scim_bridge_client_is_messenger_opened () && imcontext != NULL) { if (scim_bridge_client_change_focus (imcontext, TRUE)) { scim_bridge_perrorln ("An IOException occurred at scim_bridge_client_imcontext_focus_in ()"); } } }
boolean scim_bridge_client_imcontext_replace_surrounding_text (ScimBridgeClientIMContext *imcontext, int cursor_position, const char *string) { clutter_im_context_set_surrounding (CLUTTER_IM_CONTEXT (imcontext), string, -1, cursor_position); return TRUE; }
boolean scim_bridge_client_imcontext_delete_surrounding_text (ScimBridgeClientIMContext *imcontext, int offset, int length) { boolean retval = clutter_im_context_delete_surrounding (CLUTTER_IM_CONTEXT (imcontext), offset, length); return retval; }