static void _ibus_input_ctx_create(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *obj_path; Eldbus_Object *obj; Eldbus_Proxy *ibus_ctx; unsigned int capabilities = IBUS_CAP_FOCUS | IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_SURROUNDING_TEXT; _check_message_errors(msg); if (!eldbus_message_arguments_get(msg, "o", &obj_path)) { ERR("Error reading message arguments"); goto end; } DBG("Got new IBus input context: '%s'", obj_path); obj = eldbus_object_get(wkb_ibus->conn, IBUS_SERVICE_IBUS, obj_path); wkb_ibus->input_ctx->ibus_ctx = ibus_ctx = eldbus_proxy_get(obj, IBUS_INTERFACE_INPUT_CONTEXT); eldbus_proxy_signal_handler_add(ibus_ctx, "CommitText", _ibus_input_ctx_commit_text, NULL); eldbus_proxy_signal_handler_add(ibus_ctx, "ForwardKeyEvent", _ibus_input_ctx_forward_key_event, NULL); eldbus_proxy_signal_handler_add(ibus_ctx, "UpdatePreeditText", _ibus_input_ctx_update_preedit_text, NULL); eldbus_proxy_signal_handler_add(ibus_ctx, "ShowPreeditText", _ibus_input_ctx_show_preedit_text, NULL); eldbus_proxy_signal_handler_add(ibus_ctx, "HidePreeditText", _ibus_input_ctx_hide_preedit_text, NULL); eldbus_proxy_call(ibus_ctx, "FocusIn", NULL, NULL, -1, ""); eldbus_proxy_call(ibus_ctx, "SetCapabilities", NULL, NULL, -1, "u", capabilities); end: wkb_ibus->input_ctx->pending = NULL; }
void wkb_ibus_input_context_create(struct wl_input_method_context *wl_ctx) { const char *ctx_name = "wayland"; if (!wkb_ibus) return; if (wkb_ibus->input_ctx) { WRN("Input context already exists"); wkb_ibus_input_context_destroy(); } wkb_ibus->input_ctx = calloc(1, sizeof(*(wkb_ibus->input_ctx))); wkb_ibus->input_ctx->wl_ctx = wl_ctx; if (!wkb_ibus->conn) { ERR("Not connected"); return; } if (!wkb_ibus->ibus) { ERR("No IBus proxy"); return; } wkb_ibus->input_ctx->pending = eldbus_proxy_call(wkb_ibus->ibus, "CreateInputContext", _ibus_input_ctx_create, NULL, -1, "s", ctx_name); }
void wkb_ibus_input_context_process_key_event(const char *key_str) { static struct wkb_ibus_key key = { 0 }; if (!wkb_ibus || !wkb_ibus->input_ctx) return; _wkb_ibus_key_from_str(key_str, &key); if (key.code == KEY_RESERVED) { ERR("Unexpected key '%s'", key_str); return; } key.code += 8; INF("Process key event with '%s'", key_str); /* Key press */ if (!wkb_ibus->input_ctx->ibus_ctx) _ibus_input_ctx_key_press(&key, NULL, NULL); else eldbus_proxy_call(wkb_ibus->input_ctx->ibus_ctx, "ProcessKeyEvent", _ibus_input_ctx_key_press, &key, -1, "uuu", key.sym, key.code, key.modifiers); if (key.sym == XKB_KEY_Shift_L) key.modifiers = IBUS_SHIFT_MASK; /* Key release */ if (!wkb_ibus->input_ctx->ibus_ctx) _ibus_input_ctx_key_release(&key, NULL, NULL); else eldbus_proxy_call(wkb_ibus->input_ctx->ibus_ctx, "ProcessKeyEvent", _ibus_input_ctx_key_release, &key, -1, "uuu", key.sym, key.code, key.modifiers | IBUS_RELEASE_MASK); }
void wkb_ibus_input_context_destroy(void) { if (!wkb_ibus || !wkb_ibus->input_ctx) return; if (wkb_ibus->input_ctx->pending) eldbus_pending_cancel(wkb_ibus->input_ctx->pending); if (wkb_ibus->input_ctx->ibus_ctx) { eldbus_proxy_call(wkb_ibus->input_ctx->ibus_ctx, "FocusOut", NULL, NULL, -1, ""); eldbus_proxy_unref(wkb_ibus->input_ctx->ibus_ctx); } free(wkb_ibus->input_ctx->preedit); free(wkb_ibus->input_ctx); wkb_ibus->input_ctx = NULL; }
static void _ibus_global_engine(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { const char *error, *error_msg; Eldbus_Message_Iter *iter, *desc_iter; struct wkb_ibus_engine_desc *desc = NULL; if (eldbus_message_error_get(msg, &error, &error_msg)) { DBG("DBus message error: %s: %s", error, error_msg); goto end; } else if (!eldbus_message_arguments_get(msg, "v", &iter)) { DBG("Error reading message arguments"); goto end; } if (!eldbus_message_iter_arguments_get(iter, "v", &desc_iter)) { DBG("Error retrieving GlobalEngine property"); goto end; } desc = wkb_ibus_engine_desc_from_message_iter(desc_iter); if (!desc || !desc->name) { goto end; } DBG("Global engine is set to '%s'", desc->name); free(desc); return; end: INF("Global engine is not set, using default: '%s'", IBUS_DEFAULT_ENGINE); eldbus_proxy_call(wkb_ibus->ibus, "SetGlobalEngine", NULL, NULL, -1, "s", IBUS_DEFAULT_ENGINE); }
int efreet_cache_init(void) { char buf[PATH_MAX]; _efreet_cache_log_dom = eina_log_domain_register("efreet_cache", EFREET_DEFAULT_LOG_COLOR); if (_efreet_cache_log_dom < 0) return 0; if (!eina_lock_new(&_lock)) { ERR("Could not create lock"); goto error; } snprintf(buf, sizeof(buf), "%s/efreet", efreet_cache_home_get()); if (!ecore_file_mkpath(buf)) { ERR("Failed to create directory '%s'", buf); } EFREET_EVENT_ICON_CACHE_UPDATE = ecore_event_type_new(); EFREET_EVENT_DESKTOP_CACHE_UPDATE = ecore_event_type_new(); EFREET_EVENT_DESKTOP_CACHE_BUILD = ecore_event_type_new(); themes = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_theme_free)); icons = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_free)); fallbacks = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_fallback_free)); desktops = eina_hash_string_superfast_new(NULL); eldbus_init(); if (efreet_cache_update) { conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION); if (conn) { Eldbus_Object *obj; obj = eldbus_object_get(conn, BUS, PATH); proxy = eldbus_proxy_get(obj, INTERFACE); eldbus_proxy_signal_handler_add(proxy, "IconCacheUpdate", icon_cache_update, NULL); eldbus_proxy_signal_handler_add(proxy, "DesktopCacheUpdate", desktop_cache_update, NULL); eldbus_proxy_call(proxy, "Register", on_send_register, NULL, -1, "s", efreet_language_get()); /* * TODO: Needed? eldbus_name_owner_changed_callback_add(conn, BUS, on_name_owner_changed, conn, EINA_TRUE); */ } else { /* TODO: Run cache process directly */ } } return 1; error: if (themes) eina_hash_free(themes); themes = NULL; if (icons) eina_hash_free(icons); icons = NULL; if (fallbacks) eina_hash_free(fallbacks); fallbacks = NULL; if (desktops) eina_hash_free(desktops); desktops = NULL; efreet_cache_edd_shutdown(); return 0; }