use event-finding functions to simplify key/edge binding handlers

This commit is contained in:
Mike Blumenkrantz 2016-01-25 13:00:11 -05:00
parent 93b106f17e
commit 37394b26c3
1 changed files with 64 additions and 161 deletions

View File

@ -643,69 +643,33 @@ e_bindings_key_ungrab(E_Binding_Context ctxt, Ecore_X_Window win)
E_API E_Action * E_API E_Action *
e_bindings_key_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_Event_Key *ev) e_bindings_key_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_Event_Key *ev)
{ {
E_Binding_Modifier mod = 0;
E_Binding_Key *binding; E_Binding_Key *binding;
Eina_List *l; E_Action *act;
if (bindings_disabled) return NULL; if (bindings_disabled) return NULL;
mod = _e_bindings_modifiers(ev->modifiers); act = e_bindings_key_event_find(ctxt, ev, &binding);
EINA_LIST_FOREACH(key_bindings, l, binding) if (!act) return NULL;
{ if (act->func.go_key)
if ((binding->key) && ((!strcmp(binding->key, ev->key)) || (!strcmp(binding->key, ev->keyname))) && act->func.go_key(obj, binding->params, ev);
((binding->any_mod) || (binding->mod == mod))) else if (act->func.go)
{ act->func.go(obj, binding->params);
if (_e_bindings_context_match(binding->ctxt, ctxt)) return act;
{
E_Action *act;
act = e_action_find(binding->action);
if (act)
{
if (act->func.go_key)
act->func.go_key(obj, binding->params, ev);
else if (act->func.go)
act->func.go(obj, binding->params);
return act;
}
return NULL;
}
}
}
return NULL;
} }
E_API E_Action * E_API E_Action *
e_bindings_key_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_Event_Key *ev) e_bindings_key_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_Event_Key *ev)
{ {
E_Binding_Modifier mod = 0;
E_Binding_Key *binding; E_Binding_Key *binding;
Eina_List *l; E_Action *act;
if (bindings_disabled) return NULL; if (bindings_disabled) return NULL;
mod = _e_bindings_modifiers(ev->modifiers); act = e_bindings_key_event_find(ctxt, ev, &binding);
EINA_LIST_FOREACH(key_bindings, l, binding) if (!act) return NULL;
{ if (act->func.end_key)
if ((binding->key) && (!strcmp(binding->key, ev->key)) && act->func.end_key(obj, binding->params, ev);
((binding->any_mod) || (binding->mod == mod))) else if (act->func.end)
{ act->func.end(obj, binding->params);
if (_e_bindings_context_match(binding->ctxt, ctxt)) return act;
{
E_Action *act;
act = e_action_find(binding->action);
if (act)
{
if (act->func.end_key)
act->func.end_key(obj, binding->params, ev);
else if (act->func.end)
act->func.end(obj, binding->params);
return act;
}
return NULL;
}
}
}
return NULL;
} }
E_API E_Action * E_API E_Action *
@ -896,161 +860,100 @@ e_bindings_edge_event_find(E_Binding_Context ctxt, E_Event_Zone_Edge *ev, Eina_B
E_API E_Action * E_API E_Action *
e_bindings_edge_in_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev) e_bindings_edge_in_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev)
{ {
E_Binding_Modifier mod = 0;
E_Binding_Edge *binding; E_Binding_Edge *binding;
E_Desk *current = NULL; E_Desk *current = NULL;
E_Action *act = NULL; E_Action *act = NULL;
Eina_List *l; E_Binding_Edge_Data *ed;
E_Event_Zone_Edge *ev2;
if (bindings_disabled) return NULL; if (bindings_disabled) return NULL;
current = e_desk_at_xy_get(ev->zone, ev->zone->desk_x_current, ev->zone->desk_y_current); current = e_desk_at_xy_get(ev->zone, ev->zone->desk_x_current, ev->zone->desk_y_current);
if (current->fullscreen_clients && (!e_config->fullscreen_flip)) return NULL; if (current->fullscreen_clients && (!e_config->fullscreen_flip)) return NULL;
act = e_bindings_edge_event_find(ctxt, ev, 0, &binding);
if (!act) return NULL;
ed = E_NEW(E_Binding_Edge_Data, 1);
ev2 = E_NEW(E_Event_Zone_Edge, 1);
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT; /* The original event will be freed before it can be
if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL; * used again */
if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT; ev2->zone = ev->zone;
if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN; ev2->edge = ev->edge;
EINA_LIST_FOREACH(edge_bindings, l, binding) ev2->x = ev->x;
{ ev2->y = ev->y;
/* A value of <= -1.0 for the delay indicates it as a mouse-click binding on that edge */
if (((binding->edge == ev->edge)) && (binding->delay >= 0.0) &&
((binding->drag_only == ev->drag) || ev->drag) &&
((binding->any_mod) || (binding->mod == mod)))
{
if (_e_bindings_context_match(binding->ctxt, ctxt))
{
act = e_action_find(binding->action);
if (act)
{
E_Binding_Edge_Data *ed = E_NEW(E_Binding_Edge_Data, 1);
E_Event_Zone_Edge *ev2 = E_NEW(E_Event_Zone_Edge, 1);
/* The original event will be freed before it can be ed->bind = binding;
* used again */ ed->obj = obj;
ev2->zone = ev->zone; ed->act = act;
ev2->edge = ev->edge; ed->ev = ev2;
ev2->x = ev->x; binding->timer = ecore_timer_add(((double)binding->delay), _e_bindings_edge_cb_timer, ed);
ev2->y = ev->y;
ed->bind = binding;
ed->obj = obj;
ed->act = act;
ed->ev = ev2;
binding->timer = ecore_timer_add(((double)binding->delay), _e_bindings_edge_cb_timer, ed);
}
}
}
}
return act; return act;
} }
E_API E_Action * E_API E_Action *
e_bindings_edge_out_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev) e_bindings_edge_out_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev)
{ {
E_Binding_Modifier mod = 0;
E_Binding_Edge *binding; E_Binding_Edge *binding;
E_Action *act = NULL; E_Action *act = NULL;
Eina_List *l; E_Desk *current = NULL;
if (bindings_disabled) return NULL; if (bindings_disabled) return NULL;
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT; current = e_desk_at_xy_get(ev->zone, ev->zone->desk_x_current, ev->zone->desk_y_current);
if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL; if (current->fullscreen_clients && (!e_config->fullscreen_flip)) return NULL;
if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT; act = e_bindings_edge_event_find(ctxt, ev, 0, &binding);
if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN; if (!act) return NULL;
EINA_LIST_FOREACH(edge_bindings, l, binding) if (binding->timer)
{ {
/* A value of <= -1.0 for the delay indicates it as a mouse-click binding on that edge */ E_Binding_Edge_Data *ed;
if ((binding->edge == ev->edge) && (binding->delay >= 0.0) &&
((binding->any_mod) || (binding->mod == mod))) ed = ecore_timer_del(binding->timer);
if (ed)
{ {
if (_e_bindings_context_match(binding->ctxt, ctxt)) E_FREE(ed->ev);
{ E_FREE(ed);
if (binding->timer)
{
E_Binding_Edge_Data *ed;
ed = ecore_timer_del(binding->timer);
if (ed)
{
E_FREE(ed->ev);
E_FREE(ed);
}
}
binding->timer = NULL;
act = e_action_find(binding->action);
if (act && act->func.end)
act->func.end(obj, binding->params);
}
} }
} }
binding->timer = NULL;
act = e_action_find(binding->action);
if (act && act->func.end)
act->func.end(obj, binding->params);
return act; return act;
} }
E_API E_Action * E_API E_Action *
e_bindings_edge_down_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev) e_bindings_edge_down_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev)
{ {
E_Binding_Modifier mod = 0;
E_Binding_Edge *binding; E_Binding_Edge *binding;
E_Desk *current = NULL; E_Desk *current = NULL;
E_Action *act = NULL; E_Action *act = NULL;
Eina_List *l;
if (bindings_disabled) return NULL; if (bindings_disabled) return NULL;
current = e_desk_at_xy_get(ev->zone, ev->zone->desk_x_current, ev->zone->desk_y_current); current = e_desk_at_xy_get(ev->zone, ev->zone->desk_x_current, ev->zone->desk_y_current);
if (current->fullscreen_clients && (!e_config->fullscreen_flip)) return NULL; if (current->fullscreen_clients && (!e_config->fullscreen_flip)) return NULL;
act = e_bindings_edge_event_find(ctxt, ev, 1, &binding);
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT; if (!act) return NULL;
if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL; if (act->func.go_edge)
if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT; act->func.go_edge(obj, binding->params, ev);
if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN; else if (act->func.go)
EINA_LIST_FOREACH(edge_bindings, l, binding) act->func.go(obj, binding->params);
{
if (((binding->edge == ev->edge)) && (binding->delay == -1.0 * ev->button) &&
(!binding->drag_only) && ((binding->any_mod) || (binding->mod == mod)))
{
if (_e_bindings_context_match(binding->ctxt, ctxt))
{
act = e_action_find(binding->action);
if (act)
{
if (act->func.go_edge)
act->func.go_edge(obj, binding->params, ev);
else if (act->func.go)
act->func.go(obj, binding->params);
}
}
}
}
return act; return act;
} }
E_API E_Action * E_API E_Action *
e_bindings_edge_up_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev) e_bindings_edge_up_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Event_Zone_Edge *ev)
{ {
E_Binding_Modifier mod = 0;
E_Binding_Edge *binding; E_Binding_Edge *binding;
E_Action *act = NULL; E_Action *act = NULL;
Eina_List *l; E_Desk *current = NULL;
if (bindings_disabled) return NULL; if (bindings_disabled) return NULL;
if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT; current = e_desk_at_xy_get(ev->zone, ev->zone->desk_x_current, ev->zone->desk_y_current);
if (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL; if (current->fullscreen_clients && (!e_config->fullscreen_flip)) return NULL;
if (ev->modifiers & ECORE_EVENT_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT; act = e_bindings_edge_event_find(ctxt, ev, 1, &binding);
if (ev->modifiers & ECORE_EVENT_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN; if (!act) return NULL;
EINA_LIST_FOREACH(edge_bindings, l, binding) act = e_action_find(binding->action);
{ if (act && act->func.end)
if (((binding->edge == ev->edge)) && (binding->delay == -1.0 * ev->button) && act->func.end(obj, binding->params);
((binding->any_mod) || (binding->mod == mod)))
{
if (_e_bindings_context_match(binding->ctxt, ctxt))
{
act = e_action_find(binding->action);
if (act && act->func.end)
act->func.end(obj, binding->params);
}
}
}
return act; return act;
} }