コード例 #1
0
ファイル: wkb-ibus.c プロジェクト: antognolli/weekeyboard
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;
}
コード例 #2
0
ファイル: wkb-ibus.c プロジェクト: antognolli/weekeyboard
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);
}
コード例 #3
0
ファイル: wkb-ibus.c プロジェクト: antognolli/weekeyboard
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);
}
コード例 #4
0
ファイル: wkb-ibus.c プロジェクト: etrunko/weekeyboard
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;
}
コード例 #5
0
ファイル: wkb-ibus.c プロジェクト: antognolli/weekeyboard
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);
}
コード例 #6
0
ファイル: efreet_cache.c プロジェクト: jgfenix/efl
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;
}