efl/src/lib/elementary/efl_access_widget_action.c

142 lines
3.6 KiB
C

#ifdef HAVE_CONFIG_H
#include "elementary_config.h"
#endif
#define EFL_ACCESS_ACTION_PROTECTED
#define EFL_ACCESS_WIDGET_ACTION_PROTECTED
#include "elm_priv.h"
extern Eina_Hash *_elm_key_bindings;
EOLIAN static Eina_Bool
_efl_access_widget_action_efl_access_action_action_do(Eo *obj, void *pd EINA_UNUSED, int id)
{
const Efl_Access_Action_Data *actions = NULL;
const char *param;
Eina_Bool (*func)(Eo *eo, const char *params) = NULL;
int tmp = 0;
actions = efl_access_widget_action_elm_actions_get(obj);
if (!actions) return EINA_FALSE;
while (actions[tmp].name)
{
if (tmp == id)
{
func = actions[tmp].func;
param = actions[tmp].param;
break;
}
tmp++;
}
if (!func)
return EINA_FALSE;
return func(obj, param);
}
EOLIAN static char*
_efl_access_widget_action_efl_access_action_action_keybinding_get(Eo *obj, void *pd EINA_UNUSED, int id)
{
const Efl_Access_Action_Data *actions = NULL;
Eina_List *l1, *binding_list;
const char *action = NULL, *param = NULL;
Elm_Config_Binding_Key *binding;
int tmp = 0;
if (!efl_isa(obj, EFL_UI_WIDGET_CLASS))
return NULL;
actions = efl_access_widget_action_elm_actions_get(obj);
if (!actions) return NULL;
while (actions[tmp].name)
{
if (tmp == id)
{
action = actions[tmp].action;
param = actions[tmp].param;
break;
}
tmp++;
}
if (!action) return NULL;
binding_list = eina_hash_find(_elm_key_bindings, elm_widget_type_get(obj));
if (binding_list)
{
EINA_LIST_FOREACH(binding_list, l1, binding)
{
if (!strcmp(binding->action, action) && (!param ||
!strcmp(binding->params, param)))
{
Eina_List *l2;
Elm_Config_Binding_Modifier *bm;
char *ret;
Eina_Strbuf *buf = eina_strbuf_new();
eina_strbuf_append_printf(buf, "%s", binding->key);
EINA_LIST_FOREACH(binding->modifiers, l2, bm)
if (bm->flag) eina_strbuf_append_printf(buf, "+%s", bm->mod);
ret = eina_strbuf_string_steal(buf);
eina_strbuf_free(buf);
return ret;
}
}
}
return NULL;
}
EOLIAN static const char *
_efl_access_widget_action_efl_access_action_action_name_get(const Eo *obj, void *pd EINA_UNUSED, int id)
{
const Efl_Access_Action_Data *actions = NULL;
int tmp = 0;
actions = efl_access_widget_action_elm_actions_get(obj);
if (!actions) return NULL;
while (actions[tmp].name)
{
if (tmp == id) return actions[tmp].name;
tmp++;
}
return NULL;
}
EOLIAN static Eina_Bool
_efl_access_widget_action_efl_access_action_action_description_set(Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, int id EINA_UNUSED, const char *description EINA_UNUSED)
{
return EINA_FALSE;
}
EOLIAN static const char *
_efl_access_widget_action_efl_access_action_action_description_get(const Eo *obj EINA_UNUSED, void *pd EINA_UNUSED, int id EINA_UNUSED)
{
return NULL;
}
EOLIAN static Eina_List*
_efl_access_widget_action_efl_access_action_actions_get(const Eo *obj, void *pd EINA_UNUSED)
{
const Efl_Access_Action_Data *actions = NULL;
Eina_List *ret = NULL;
int tmp = 0;
actions = efl_access_widget_action_elm_actions_get(obj);
if (!actions) return NULL;
while (actions[tmp].name)
{
ret = eina_list_append(ret, actions[tmp].name);
tmp++;
}
return ret;
}
#include "efl_access_widget_action.eo.c"