enlightenment/src/bin/e_bindings.c

282 lines
6.9 KiB
C
Raw Normal View History

/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e.h"
/* local subsystem functions */
typedef struct _E_Binding_Mouse E_Binding_Mouse;
typedef struct _E_Binding_Key E_Binding_Key;
typedef struct _E_Binding_Signal E_Binding_Signal;
struct _E_Binding_Mouse
{
E_Binding_Context ctxt;
int button;
E_Binding_Modifier mod;
unsigned char any_mod : 1;
char *action;
char *params;
};
struct _E_Binding_Key
{
E_Binding_Context ctxt;
char *key;
E_Binding_Modifier mod;
unsigned char any_mod : 1;
char *action;
char *params;
};
struct _E_Binding_Signal
{
E_Binding_Context ctxt;
char *sig;
char *src;
char *action;
char *params;
};
static void _e_bindings_mouse_free(E_Binding_Mouse *bind);
static int _e_bindings_context_match(E_Binding_Context bctxt, E_Binding_Context ctxt);
/* local subsystem globals */
static Evas_List *mouse_bindings = NULL;
static Evas_List *key_bindings = NULL;
static Evas_List *signal_bindings = NULL;
/* externally accessible functions */
int
e_bindings_init(void)
{
e_bindings_mouse_add(E_BINDING_CONTEXT_BORDER,
1, E_BINDING_MODIFIER_ALT, 0,
"window_move", "");
e_bindings_mouse_add(E_BINDING_CONTEXT_BORDER,
2, E_BINDING_MODIFIER_ALT, 0,
"window_resize", "");
e_bindings_mouse_add(E_BINDING_CONTEXT_BORDER,
3, E_BINDING_MODIFIER_ALT, 0,
"window_menu", "");
return 1;
}
int
e_bindings_shutdown(void)
{
return 1;
}
void
e_bindings_mouse_add(E_Binding_Context ctxt, int button, E_Binding_Modifier mod, int any_mod, char *action, char *params)
{
E_Binding_Mouse *bind;
bind = calloc(1, sizeof(E_Binding_Mouse));
bind->ctxt = ctxt;
bind->button = button;
bind->mod = mod;
bind->any_mod = any_mod;
bind->action = strdup(action);
bind->params = strdup(params);
mouse_bindings = evas_list_append(mouse_bindings, bind);
}
void
e_bindings_mouse_del(E_Binding_Context ctxt, int button, E_Binding_Modifier mod, int any_mod, char *action, char *params)
{
Evas_List *l;
for (l = mouse_bindings; l; l = l->next)
{
E_Binding_Mouse *bind;
bind = l->data;
if ((bind->ctxt == ctxt) &&
(bind->button == button) &&
(bind->mod == mod) &&
(bind->any_mod == any_mod) &&
(!strcmp(bind->action, action)) &&
(!strcmp(bind->params, params)))
{
_e_bindings_mouse_free(bind);
mouse_bindings = evas_list_remove_list(mouse_bindings, l);
break;
}
}
}
void
e_bindings_mouse_grab(E_Binding_Context ctxt, Ecore_X_Window win)
{
Evas_List *l;
for (l = mouse_bindings; l; l = l->next)
{
E_Binding_Mouse *bind;
bind = l->data;
if (bind->ctxt == ctxt)
{
int mod;
mod = 0;
if (bind->mod & E_BINDING_MODIFIER_SHIFT) mod |= ECORE_X_MODIFIER_SHIFT;
if (bind->mod & E_BINDING_MODIFIER_CTRL) mod |= ECORE_X_MODIFIER_CTRL;
if (bind->mod & E_BINDING_MODIFIER_ALT) mod |= ECORE_X_MODIFIER_ALT;
if (bind->mod & E_BINDING_MODIFIER_WIN) mod |= ECORE_X_MODIFIER_WIN;
ecore_x_window_button_grab(win, bind->button,
ECORE_X_EVENT_MASK_MOUSE_DOWN |
ECORE_X_EVENT_MASK_MOUSE_UP |
ECORE_X_EVENT_MASK_MOUSE_MOVE,
mod, bind->any_mod);
}
}
}
void
e_bindings_mouse_ungrab(E_Binding_Context ctxt, Ecore_X_Window win)
{
Evas_List *l;
for (l = mouse_bindings; l; l = l->next)
{
E_Binding_Mouse *bind;
bind = l->data;
if (bind->ctxt == ctxt)
{
int mod;
mod = 0;
if (bind->mod & E_BINDING_MODIFIER_SHIFT) mod |= ECORE_X_MODIFIER_SHIFT;
if (bind->mod & E_BINDING_MODIFIER_CTRL) mod |= ECORE_X_MODIFIER_CTRL;
if (bind->mod & E_BINDING_MODIFIER_ALT) mod |= ECORE_X_MODIFIER_ALT;
if (bind->mod & E_BINDING_MODIFIER_WIN) mod |= ECORE_X_MODIFIER_WIN;
ecore_x_window_button_ungrab(win, bind->button,
mod, bind->any_mod);
}
}
}
int
e_bindings_mouse_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Down *ev)
{
E_Binding_Modifier mod = 0;
Evas_List *l;
if (ev->modifiers & ECORE_X_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_X_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_X_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_X_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
for (l = mouse_bindings; l; l = l->next)
{
E_Binding_Mouse *bind;
bind = l->data;
if ((bind->button == ev->button) &&
((bind->any_mod) || (bind->mod == mod)))
{
if (_e_bindings_context_match(bind->ctxt, ctxt))
{
E_Action *act;
act = e_action_find(bind->action);
if (act)
{
if (act->func.go_mouse)
act->func.go_mouse(obj, bind->params, ev);
else if (act->func.go)
act->func.go(obj, bind->params);
return 1;
}
return 0;
}
}
}
return 0;
}
int
e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Mouse_Button_Up *ev)
{
E_Binding_Modifier mod = 0;
Evas_List *l;
if (ev->modifiers & ECORE_X_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_X_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_X_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_X_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
for (l = mouse_bindings; l; l = l->next)
{
E_Binding_Mouse *bind;
bind = l->data;
if ((bind->button == ev->button) &&
((bind->any_mod) || (bind->mod == mod)))
{
if (_e_bindings_context_match(bind->ctxt, ctxt))
{
E_Action *act;
act = e_action_find(bind->action);
if (act)
{
if (act->func.end_mouse)
act->func.end_mouse(obj, bind->params, ev);
else if (act->func.end)
act->func.end(obj, bind->params);
return 1;
}
return 0;
}
}
}
return 0;
}
/* FIXME: finish off key bindings */
int
e_bindings_key_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Key_Down *ev)
{
E_Binding_Modifier mod = 0;
Evas_List *l;
if (ev->modifiers & ECORE_X_MODIFIER_SHIFT) mod |= E_BINDING_MODIFIER_SHIFT;
if (ev->modifiers & ECORE_X_MODIFIER_CTRL) mod |= E_BINDING_MODIFIER_CTRL;
if (ev->modifiers & ECORE_X_MODIFIER_ALT) mod |= E_BINDING_MODIFIER_ALT;
if (ev->modifiers & ECORE_X_MODIFIER_WIN) mod |= E_BINDING_MODIFIER_WIN;
return 0;
}
/* FIXME: finish off signal bindings */
int
e_bindings_signal_handle(E_Binding_Context ctxt, E_Object *obj, char *sig, char *src)
{
Evas_List *l;
return 0;
}
/* local subsystem functions */
static void
_e_bindings_mouse_free(E_Binding_Mouse *bind)
{
E_FREE(bind->action);
E_FREE(bind->params);
free(bind);
}
static int
_e_bindings_context_match(E_Binding_Context bctxt, E_Binding_Context ctxt)
{
if (bctxt) return 1;
if (ctxt == E_BINDING_CONTEXT_UNKNOWN) return 0;
if (bctxt == ctxt) return 1;
return 0;
}