add bool return for mouse-based E_Action callbacks

in many cases, a mouse action's callback will fail to execute as a result of multiple
objects being under the pointer at the time of the event. in this case,
the callback should be able to determine whether action callback processing should
continue.

as an example, when attempting to execute an action which only activates for
client objects, if the passed object is not a client then the callback should return
false to indicate that it was not able to perform the action for the given object,
allowing further actions to be attempted on this object
This commit is contained in:
Mike Blumenkrantz 2016-02-03 17:58:34 -05:00
parent 39c6f1c33a
commit fe5d2e6e61
6 changed files with 101 additions and 77 deletions

View File

@ -15,7 +15,7 @@
if (act) act->func.go_mouse = _e_actions_act_##name##_go_mouse; \
}
#define ACT_FN_GO_MOUSE(act, use) \
static void _e_actions_act_##act##_go_mouse(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Mouse_Button * ev EINA_UNUSED)
static Eina_Bool _e_actions_act_##act##_go_mouse(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Mouse_Button * ev EINA_UNUSED)
#define ACT_GO_WHEEL(name) \
{ \
@ -23,7 +23,7 @@
if (act) act->func.go_wheel = _e_actions_act_##name##_go_wheel; \
}
#define ACT_FN_GO_WHEEL(act, use) \
static void _e_actions_act_##act##_go_wheel(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Wheel * ev EINA_UNUSED)
static Eina_Bool _e_actions_act_##act##_go_wheel(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Wheel * ev EINA_UNUSED)
#define ACT_GO_EDGE(name) \
{ \
@ -63,7 +63,7 @@
if (act) act->func.end_mouse = _e_actions_act_##name##_end_mouse; \
}
#define ACT_FN_END_MOUSE(act, use) \
static void _e_actions_act_##act##_end_mouse(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Mouse_Button * ev EINA_UNUSED)
static Eina_Bool _e_actions_act_##act##_end_mouse(E_Object * obj EINA_UNUSED, const char *params use, E_Binding_Event_Mouse_Button * ev EINA_UNUSED)
#define ACT_END_KEY(name) \
{ \
@ -103,9 +103,10 @@ ACT_FN_GO(window_move, EINA_UNUSED)
ACT_FN_GO_MOUSE(window_move, EINA_UNUSED)
{
if (!obj) obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE) return EINA_FALSE;
e_client_act_move_begin((E_Client *)obj, ev);
return EINA_TRUE;
}
ACT_FN_GO_SIGNAL(window_move, )
@ -136,9 +137,10 @@ ACT_FN_END(window_move, EINA_UNUSED)
ACT_FN_END_MOUSE(window_move, EINA_UNUSED)
{
if (!obj) obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE) return EINA_FALSE;
e_client_act_move_end((E_Client *)obj, ev);
return EINA_TRUE;
}
ACT_FN_GO_KEY(window_move, EINA_UNUSED, EINA_UNUSED)
@ -167,10 +169,11 @@ ACT_FN_GO(window_resize, EINA_UNUSED)
ACT_FN_GO_MOUSE(window_resize, EINA_UNUSED)
{
if (!obj) obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE) return EINA_FALSE;
if (!((E_Client *)obj)->lock_user_size)
e_client_act_resize_begin((E_Client *)obj, ev);
return EINA_TRUE;
}
ACT_FN_GO_SIGNAL(window_resize, )
@ -204,9 +207,10 @@ ACT_FN_END(window_resize, EINA_UNUSED)
ACT_FN_END_MOUSE(window_resize, EINA_UNUSED)
{
if (!obj) obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (obj->type != E_CLIENT_TYPE) return;
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE) return EINA_FALSE;
e_client_act_resize_end((E_Client *)obj, ev);
return EINA_TRUE;
}
ACT_FN_GO_KEY(window_resize, EINA_UNUSED, EINA_UNUSED)
@ -238,13 +242,14 @@ ACT_FN_GO(window_menu, EINA_UNUSED)
ACT_FN_GO_MOUSE(window_menu, EINA_UNUSED)
{
if (!obj) obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!obj) return EINA_FALSE;
if (obj->type != E_CLIENT_TYPE)
{
obj = E_OBJECT(e_client_focused_get());
if (!obj) return;
if (!obj) return EINA_FALSE;
}
e_client_act_menu_begin((E_Client *)obj, ev, 0);
return EINA_TRUE;
}
ACT_FN_GO_KEY(window_menu, EINA_UNUSED, EINA_UNUSED)
@ -1909,31 +1914,24 @@ ACT_FN_GO(menu_show, )
ACT_FN_GO_MOUSE(menu_show, )
{
E_Zone *zone;
/* menu is active - abort */
if (e_comp_util_kbd_grabbed() || e_comp_util_mouse_grabbed()) return;
zone = _e_actions_zone_get(obj);
if (zone)
{
if (params)
{
E_Menu *m = NULL;
m = _e_actions_menu_find(params);
if (m)
{
int x, y;
/* FIXME: this is a bit of a hack... setting m->c - bad hack */
/* menu is active - abort */
if (e_comp_util_kbd_grabbed() || e_comp_util_mouse_grabbed()) return EINA_TRUE;
zone = _e_actions_zone_get(obj);
if (!zone) return EINA_TRUE;
if (!params) return EINA_TRUE;
m = _e_actions_menu_find(params);
if (!m) return EINA_TRUE;
/* FIXME: this is a bit of a hack... setting m->zone - bad hack */
m->zone = zone;
x = ev->canvas.x;
y = ev->canvas.y;
e_menu_post_deactivate_callback_set(m, _e_actions_cb_menu_end, NULL);
e_menu_activate_mouse(m, zone, x, y, 1, 1,
E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
}
}
}
return EINA_TRUE;
}
ACT_FN_GO_KEY(menu_show, , EINA_UNUSED)
@ -2866,6 +2864,7 @@ ACT_FN_GO_KEY(delayed_action, , )
ACT_FN_GO_MOUSE(delayed_action, )
{
_delayed_action_mouse_add(obj, params, ev);
return EINA_TRUE;
}
ACT_FN_END_KEY(delayed_action, )
@ -2876,6 +2875,7 @@ ACT_FN_END_KEY(delayed_action, )
ACT_FN_END_MOUSE(delayed_action, )
{
_delayed_action_mouse_del(obj, params, ev);
return EINA_TRUE;
}
ACT_FN_GO(dim_screen, EINA_UNUSED)
@ -2956,7 +2956,7 @@ ACT_FN_GO_MOUSE(mouse_to_key, )
};
int modifiers = 0, mod = 0;
if ((!params) || (!params[0]) || (params[0] == '+')) return;
if ((!params) || (!params[0]) || (params[0] == '+')) return EINA_TRUE;
for (p = params; p; p = nextp)
{
const char **m;
@ -2975,7 +2975,7 @@ ACT_FN_GO_MOUSE(mouse_to_key, )
key++;
else
key = params;
if (!key[0]) return;
if (!key[0]) return EINA_TRUE;
mod |= (ECORE_EVENT_MODIFIER_SHIFT * !!(modifiers & E_BINDING_MODIFIER_SHIFT));
mod |= (ECORE_EVENT_MODIFIER_CTRL * !!(modifiers & E_BINDING_MODIFIER_CTRL));
@ -2984,6 +2984,7 @@ ACT_FN_GO_MOUSE(mouse_to_key, )
mod |= (ECORE_EVENT_MODIFIER_ALTGR * !!(modifiers & E_BINDING_MODIFIER_ALTGR));
e_comp_wl_input_keyboard_event_generate(key, mod, 0);
e_comp_wl_input_keyboard_event_generate(key, mod, 1);
return EINA_TRUE;
}
#endif

View File

@ -18,14 +18,14 @@ struct _E_Action
struct
{
void (*go)(E_Object *obj, const char *params);
void (*go_mouse)(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev);
void (*go_wheel)(E_Object *obj, const char *params, E_Binding_Event_Wheel *ev);
Eina_Bool (*go_mouse)(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev);
Eina_Bool (*go_wheel)(E_Object *obj, const char *params, E_Binding_Event_Wheel *ev);
void (*go_edge)(E_Object *obj, const char *params, E_Event_Zone_Edge *ev);
void (*go_key)(E_Object *obj, const char *params, Ecore_Event_Key *ev);
void (*go_signal)(E_Object *obj, const char *params, const char *sig, const char *src);
void (*go_acpi)(E_Object *obj, const char *params, E_Event_Acpi *ev);
void (*end)(E_Object *obj, const char *params);
void (*end_mouse)(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev);
Eina_Bool (*end_mouse)(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev);
void (*end_key)(E_Object *obj, const char *params, Ecore_Event_Key *ev);
} func;
};

View File

@ -423,10 +423,13 @@ E_API E_Action *
e_bindings_mouse_button_find(E_Binding_Context ctxt, E_Binding_Event_Mouse_Button *ev, E_Binding_Mouse **bind_ret)
{
E_Binding_Mouse *binding;
Eina_List *l;
Eina_List *start = NULL, *l;
E_Action *act = NULL;
EINA_LIST_FOREACH(mouse_bindings, l, binding)
if (bind_ret && *bind_ret)
start = eina_list_data_find_list(mouse_bindings, *bind_ret);
if (start) start = start->next;
EINA_LIST_FOREACH(start ?: mouse_bindings, l, binding)
{
if ((binding->button == (int)ev->button) &&
((binding->any_mod) || (binding->mod == ev->modifiers)))
@ -446,17 +449,21 @@ E_API E_Action *
e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Binding_Event_Mouse_Button *ev)
{
E_Action *act;
E_Binding_Mouse *binding;
E_Binding_Mouse *binding = NULL;
if (bindings_disabled) return NULL;
act = e_bindings_mouse_button_find(ctxt, ev, &binding);
if (act)
while (1)
{
act = e_bindings_mouse_button_find(ctxt, ev, &binding);
if (!act) break;
if (act->func.go_mouse)
act->func.go_mouse(obj, binding->params, ev);
{
if (!act->func.go_mouse(obj, binding->params, ev))
continue;
}
else if (act->func.go)
act->func.go(obj, binding->params);
return act;
break;
}
return act;
}
@ -488,14 +495,18 @@ e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Bindin
E_Binding_Mouse *binding;
if (bindings_disabled) return NULL;
act = e_bindings_mouse_button_find(ctxt, ev, &binding);
if (act)
while (1)
{
if (act->func.end_mouse)
act->func.end_mouse(obj, binding->params, ev);
else if (act->func.end)
act->func.end(obj, binding->params);
return act;
act = e_bindings_mouse_button_find(ctxt, ev, &binding);
if (!act) break;
if (act->func.go_mouse)
{
if (!act->func.go_mouse(obj, binding->params, ev))
continue;
}
else if (act->func.go)
act->func.go(obj, binding->params);
break;
}
return act;
}
@ -1171,10 +1182,13 @@ E_API E_Action *
e_bindings_wheel_find(E_Binding_Context ctxt, E_Binding_Event_Wheel *ev, E_Binding_Wheel **bind_ret)
{
E_Binding_Wheel *binding;
Eina_List *l;
Eina_List *start = NULL, *l;
E_Action *act = NULL;
EINA_LIST_FOREACH(wheel_bindings, l, binding)
if (bind_ret && *bind_ret)
start = eina_list_data_find_list(wheel_bindings, *bind_ret);
if (start) start = start->next;
EINA_LIST_FOREACH(start ?: wheel_bindings, l, binding)
{
if ((binding->direction == ev->direction) &&
(((binding->z < 0) && (ev->z < 0)) || ((binding->z > 0) && (ev->z > 0))) &&
@ -1198,14 +1212,18 @@ e_bindings_wheel_event_handle(E_Binding_Context ctxt, E_Object *obj, E_Binding_E
E_Binding_Wheel *binding;
if (bindings_disabled) return NULL;
act = e_bindings_wheel_find(ctxt, ev, &binding);
if (act)
while (1)
{
act = e_bindings_wheel_find(ctxt, ev, &binding);
if (!act) break;
if (act->func.go_wheel)
act->func.go_wheel(obj, binding->params, ev);
{
if (!act->func.go_wheel(obj, binding->params, ev))
continue;
}
else if (act->func.go)
act->func.go(obj, binding->params);
return act;
break;
}
return act;
}

View File

@ -771,10 +771,11 @@ _e_mod_action_cb_key(E_Object *obj EINA_UNUSED, const char *params, Ecore_Event_
_e_mod_action(params);
}
static void
static Eina_Bool
_e_mod_action_cb_mouse(E_Object *obj EINA_UNUSED, const char *params, E_Binding_Event_Mouse_Button *ev EINA_UNUSED)
{
_e_mod_action(params);
return EINA_TRUE;
}
static Eina_Bool

View File

@ -708,7 +708,7 @@ _e_mod_action_toggle_floating_cb(E_Object *obj EINA_UNUSED,
static E_Client *_go_mouse_client = NULL;
static void
static Eina_Bool
_e_mod_action_swap_window_go_mouse(E_Object *obj EINA_UNUSED,
const char *params EINA_UNUSED,
E_Binding_Event_Mouse_Button *ev EINA_UNUSED)
@ -718,12 +718,13 @@ _e_mod_action_swap_window_go_mouse(E_Object *obj EINA_UNUSED,
Client_Extra *extra = tiling_entry_func(ec);
if (!extra || !extra->tiled)
return;
return EINA_FALSE;
_go_mouse_client = ec;
return EINA_TRUE;
}
static void
static Eina_Bool
_e_mod_action_swap_window_end_mouse(E_Object *obj EINA_UNUSED,
const char *params EINA_UNUSED,
E_Binding_Event_Mouse_Button *ev EINA_UNUSED)
@ -734,33 +735,34 @@ _e_mod_action_swap_window_end_mouse(E_Object *obj EINA_UNUSED,
_go_mouse_client = NULL;
if (!first_ec)
return;
return EINA_FALSE;
Client_Extra *extra = tiling_entry_func(ec);
if (!extra || !extra->tiled)
return;
return EINA_FALSE;
/* XXX: Only support swap on the first desk for now. */
if (ec->desk != first_ec->desk)
return;
return EINA_FALSE;
Window_Tree *item, *first_item;
item = tiling_window_tree_client_find(_G.tinfo->tree, ec);
if (!item)
return;
return EINA_FALSE;
first_item = tiling_window_tree_client_find(_G.tinfo->tree, first_ec);
if (!first_item)
return;
return EINA_FALSE;
item->client = first_ec;
first_item->client = ec;
_reapply_tree();
return EINA_TRUE;
}
static void

View File

@ -3,7 +3,7 @@
/* actual module specifics */
static void _e_mod_action_winlist_cb(E_Object *obj, const char *params);
static void _e_mod_action_winlist_mouse_cb(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev);
static Eina_Bool _e_mod_action_winlist_mouse_cb(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev);
static void _e_mod_action_winlist_key_cb(E_Object *obj, const char *params, Ecore_Event_Key *ev);
static void _e_mod_action_winlist_edge_cb(E_Object *obj, const char *params, E_Event_Zone_Edge *ev);
static void _e_mod_action_winlist_signal_cb(E_Object *obj, const char *params, const char *sig, const char *src);
@ -106,7 +106,7 @@ e_modapi_save(E_Module *m EINA_UNUSED)
}
/* action callback */
static void
static Eina_Bool
_e_mod_action_winlist_cb_helper(E_Object *obj EINA_UNUSED, const char *params, int modifiers, E_Winlist_Activate_Type type)
{
E_Zone *zone = NULL;
@ -116,7 +116,7 @@ _e_mod_action_winlist_cb_helper(E_Object *obj EINA_UNUSED, const char *params, i
Eina_Bool ok = EINA_TRUE;
zone = e_zone_current_get();
if (!zone) return;
if (!zone) return EINA_FALSE;
if (params)
{
if (!strcmp(params, "next"))
@ -139,7 +139,7 @@ _e_mod_action_winlist_cb_helper(E_Object *obj EINA_UNUSED, const char *params, i
udlr = 2;
else if (!strcmp(params, "right"))
udlr = 3;
else return;
else return EINA_FALSE;
}
else
direction = 1;
@ -147,9 +147,9 @@ _e_mod_action_winlist_cb_helper(E_Object *obj EINA_UNUSED, const char *params, i
ok = !e_winlist_show(zone, filter);
if (!ok)
{
if (!type) return;
if (!type) return EINA_FALSE;
e_winlist_modifiers_set(modifiers, type);
return;
return EINA_TRUE;
}
if (direction == 1)
e_winlist_next();
@ -157,6 +157,7 @@ _e_mod_action_winlist_cb_helper(E_Object *obj EINA_UNUSED, const char *params, i
e_winlist_prev();
else
e_winlist_direction_select(zone, udlr);
return EINA_TRUE;
}
static void
@ -165,10 +166,11 @@ _e_mod_action_winlist_cb(E_Object *obj, const char *params)
_e_mod_action_winlist_cb_helper(obj, params, 0, 0);
}
static void
static Eina_Bool
_e_mod_action_winlist_mouse_cb(E_Object *obj, const char *params, E_Binding_Event_Mouse_Button *ev)
{
_e_mod_action_winlist_cb_helper(obj, params, e_bindings_modifiers_to_ecore_convert(ev->modifiers), E_WINLIST_ACTIVATE_TYPE_MOUSE);
return _e_mod_action_winlist_cb_helper(obj, params,
e_bindings_modifiers_to_ecore_convert(ev->modifiers), E_WINLIST_ACTIVATE_TYPE_MOUSE);
}
static void