key and mouse bindings are configurable via ipc. now. :)

SVN revision: 14608
This commit is contained in:
Carsten Haitzler 2005-05-05 06:45:47 +00:00
parent 9a8fe8a324
commit 4c91972c07
6 changed files with 350 additions and 1 deletions

View File

@ -1308,6 +1308,34 @@ e_border_act_kill_begin(E_Border *bd)
e_object_del(E_OBJECT(bd));
}
void
e_border_button_bindings_ungrab_all(void)
{
Evas_List *l;
for (l = borders; l; l = l->next)
{
E_Border *bd;
bd = l->data;
e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win);
}
}
void
e_border_button_bindings_grab_all(void)
{
Evas_List *l;
for (l = borders; l; l = l->next)
{
E_Border *bd;
bd = l->data;
e_bindings_mouse_grab(E_BINDING_CONTEXT_BORDER, bd->win);
}
}
/* local subsystem functions */
static void
_e_border_free(E_Border *bd)

View File

@ -357,6 +357,9 @@ EAPI void e_border_act_resize_end(E_Border *bd, Ecore_X_Event_Mouse_Button_Up *e
EAPI void e_border_act_menu_begin(E_Border *bd, Ecore_X_Event_Mouse_Button_Down *ev, int key);
EAPI void e_border_act_close_begin(E_Border *bd);
EAPI void e_border_act_kill_begin(E_Border *bd);
EAPI void e_border_button_bindings_ungrab_all(void);
EAPI void e_border_button_bindings_grab_all(void);
extern EAPI int E_EVENT_BORDER_RESIZE;
extern EAPI int E_EVENT_BORDER_MOVE;

View File

@ -732,6 +732,48 @@ e_config_domain_save(char *domain, E_Config_DD *edd, void *data)
return ok;
}
E_Config_Binding_Mouse *
e_config_binding_mouse_match(E_Config_Binding_Mouse *eb_in)
{
Evas_List *l;
for (l = e_config->mouse_bindings; l; l = l->next)
{
E_Config_Binding_Mouse *eb;
eb = l->data;
if ((eb->context == eb_in->context) &&
(eb->button == eb_in->button) &&
(eb->modifiers == eb_in->modifiers) &&
(eb->any_mod == eb_in->any_mod) &&
(!strcmp(eb->action, eb_in->action)) &&
(!strcmp(eb->action, eb_in->action)))
return eb;
}
return NULL;
}
E_Config_Binding_Key *
e_config_binding_key_match(E_Config_Binding_Key *eb_in)
{
Evas_List *l;
for (l = e_config->key_bindings; l; l = l->next)
{
E_Config_Binding_Key *eb;
eb = l->data;
if ((eb->context == eb_in->context) &&
(eb->modifiers == eb_in->modifiers) &&
(eb->any_mod == eb_in->any_mod) &&
(!strcmp(eb->key, eb_in->key)) &&
(!strcmp(eb->action, eb_in->action)) &&
(!strcmp(eb->action, eb_in->action)))
return eb;
}
return NULL;
}
/* local subsystem functions */
static void
_e_config_save_cb(void *data)

View File

@ -108,6 +108,9 @@ EAPI int e_config_save(void);
EAPI void e_config_save_flush(void);
EAPI void e_config_save_queue(void);
EAPI E_Config_Binding_Mouse *e_config_binding_mouse_match(E_Config_Binding_Mouse *eb_in);
EAPI E_Config_Binding_Key *e_config_binding_key_match(E_Config_Binding_Key *eb_in);
extern EAPI E_Config *e_config;
#endif

View File

@ -471,10 +471,50 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
break;
case E_IPC_OP_BINDING_MOUSE_ADD:
{
E_Config_Binding_Mouse bind, *eb;
_e_ipc_mouse_binding_dec(e->data, e->size, &bind);
{
eb = e_config_binding_mouse_match(&bind);
if (!eb)
{
eb = E_NEW(E_Config_Binding_Key, 1);
e_config->mouse_bindings = evas_list_append(e_config->mouse_bindings, eb);
eb->context = bind.context;
eb->button = bind.button;
eb->modifiers = bind.modifiers;
eb->any_mod = bind.any_mod;
eb->action = strdup(bind.action);
eb->params = strdup(bind.params);
e_border_button_bindings_ungrab_all();
e_bindings_mouse_add(bind.context, bind.button, bind.modifiers,
bind.any_mod, bind.action, bind.params);
e_border_button_bindings_grab_all();
e_config_save_queue();
}
}
}
break;
case E_IPC_OP_BINDING_MOUSE_DEL:
{
E_Config_Binding_Mouse bind, *eb;
_e_ipc_mouse_binding_dec(e->data, e->size, &bind);
{
eb = e_config_binding_mouse_match(&bind);
if (eb)
{
e_config->mouse_bindings = evas_list_remove(e_config->mouse_bindings, eb);
IF_FREE(eb->action);
IF_FREE(eb->params);
IF_FREE(eb);
e_border_button_bindings_ungrab_all();
e_bindings_mouse_del(bind.context, bind.button, bind.modifiers,
bind.any_mod, bind.action, bind.params);
e_border_button_bindings_grab_all();
e_config_save_queue();
}
}
}
break;
case E_IPC_OP_BINDING_KEY_LIST:
@ -495,10 +535,51 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
break;
case E_IPC_OP_BINDING_KEY_ADD:
{
E_Config_Binding_Key bind, *eb;
_e_ipc_key_binding_dec(e->data, e->size, &bind);
{
eb = e_config_binding_key_match(&bind);
if (!eb)
{
eb = E_NEW(E_Config_Binding_Key, 1);
e_config->key_bindings = evas_list_append(e_config->key_bindings, eb);
eb->context = bind.context;
eb->modifiers = bind.modifiers;
eb->any_mod = bind.any_mod;
eb->key = strdup(bind.key);
eb->action = strdup(bind.action);
eb->params = strdup(bind.params);
e_managers_keys_ungrab();
e_bindings_key_add(bind.context, bind.key, bind.modifiers,
bind.any_mod, bind.action, bind.params);
e_managers_keys_grab();
e_config_save_queue();
}
}
}
break;
case E_IPC_OP_BINDING_KEY_DEL:
{
E_Config_Binding_Key bind, *eb;
_e_ipc_key_binding_dec(e->data, e->size, &bind);
{
eb = e_config_binding_key_match(&bind);
if (eb)
{
e_config->key_bindings = evas_list_remove(e_config->key_bindings, eb);
IF_FREE(eb->key);
IF_FREE(eb->action);
IF_FREE(eb->params);
IF_FREE(eb);
e_managers_keys_ungrab();
e_bindings_key_del(bind.context, bind.key, bind.modifiers,
bind.any_mod, bind.action, bind.params);
e_managers_keys_grab();
e_config_save_queue();
}
}
}
break;
default:

View File

@ -49,6 +49,194 @@ static const char *display_name = NULL;
static int reply_count = 0;
static int reply_expect = 0;
static void
_e_opt_binding_mouse_parse(E_Config_Binding_Mouse *eb, char **params)
{
if (!strcmp(params[0], "NONE")) eb->context = E_BINDING_CONTEXT_NONE;
else if (!strcmp(params[0], "UNKNOWN")) eb->context = E_BINDING_CONTEXT_UNKNOWN;
else if (!strcmp(params[0], "BORDER")) eb->context = E_BINDING_CONTEXT_BORDER;
else if (!strcmp(params[0], "ZONE")) eb->context = E_BINDING_CONTEXT_ZONE;
else if (!strcmp(params[0], "MANAGER")) eb->context = E_BINDING_CONTEXT_MANAGER;
else if (!strcmp(params[0], "ANY")) eb->context = E_BINDING_CONTEXT_ANY;
else
{
printf("OPT1 (CONTEXT) is not a valid context. Must be:\n"
" NONE UNKNOWN BORDER ZONE MANAGER ANY\n");
exit(-1);
}
eb->button = atoi(params[1]);
/* M1[|M2...] */
{
char *p, *pp;
eb->modifiers = 0;
pp = params[2];
for (;;)
{
p = strchr(pp, '|');
if (p)
{
if (!strncmp(pp, "SHIFT|", 6)) eb->modifiers |= E_BINDING_MODIFIER_SHIFT;
else if (!strncmp(pp, "CTRL|", 5)) eb->modifiers |= E_BINDING_MODIFIER_CTRL;
else if (!strncmp(pp, "ALT|", 4)) eb->modifiers |= E_BINDING_MODIFIER_ALT;
else if (!strncmp(pp, "WIN|", 4)) eb->modifiers |= E_BINDING_MODIFIER_WIN;
else
{
printf("OPT3 moidifier unknonw. Must be or mask of:\n"
" SHIFT CTRL ALT WIN\n");
exit(-1);
}
pp = p + 1;
}
else
{
if (!strcmp(pp, "SHIFT")) eb->modifiers |= E_BINDING_MODIFIER_SHIFT;
else if (!strcmp(pp, "CTRL")) eb->modifiers |= E_BINDING_MODIFIER_CTRL;
else if (!strcmp(pp, "ALT")) eb->modifiers |= E_BINDING_MODIFIER_ALT;
else if (!strcmp(pp, "WIN")) eb->modifiers |= E_BINDING_MODIFIER_WIN;
else
{
printf("OPT3 moidifier unknonw. Must be or mask of:\n"
" SHIFT CTRL ALT WIN\n");
exit(-1);
}
break;
}
}
}
eb->any_mod = atoi(params[3]);
eb->action = params[4];
eb->params = params[5];
}
static void
_e_opt_binding_mouse_add(char **params)
{
E_Config_Binding_Mouse bind;
int bytes;
char *data;
_e_opt_binding_mouse_parse(&bind, params);
data = _e_ipc_mouse_binding_enc(&bind, &bytes);
ecore_ipc_server_send(_e_ipc_server,
E_IPC_DOMAIN_REQUEST,
E_IPC_OP_BINDING_MOUSE_ADD,
0/*ref*/, 0/*ref_to*/, 0/*response*/,
data, bytes);
free(data);
}
static void
_e_opt_binding_mouse_del(char **params)
{
E_Config_Binding_Mouse bind;
int bytes;
char *data;
_e_opt_binding_mouse_parse(&bind, params);
data = _e_ipc_mouse_binding_enc(&bind, &bytes);
ecore_ipc_server_send(_e_ipc_server,
E_IPC_DOMAIN_REQUEST,
E_IPC_OP_BINDING_MOUSE_DEL,
0/*ref*/, 0/*ref_to*/, 0/*response*/,
data, bytes);
free(data);
}
static void
_e_opt_binding_key_parse(E_Config_Binding_Key *eb, char **params)
{
if (!strcmp(params[0], "NONE")) eb->context = E_BINDING_CONTEXT_NONE;
else if (!strcmp(params[0], "UNKNOWN")) eb->context = E_BINDING_CONTEXT_UNKNOWN;
else if (!strcmp(params[0], "BORDER")) eb->context = E_BINDING_CONTEXT_BORDER;
else if (!strcmp(params[0], "ZONE")) eb->context = E_BINDING_CONTEXT_ZONE;
else if (!strcmp(params[0], "MANAGER")) eb->context = E_BINDING_CONTEXT_MANAGER;
else if (!strcmp(params[0], "ANY")) eb->context = E_BINDING_CONTEXT_ANY;
else
{
printf("OPT1 (CONTEXT) is not a valid context. Must be:\n"
" NONE UNKNOWN BORDER ZONE MANAGER ANY\n");
exit(-1);
}
eb->key = params[1];
/* M1[|M2...] */
{
char *p, *pp;
eb->modifiers = 0;
pp = params[2];
for (;;)
{
p = strchr(pp, '|');
if (p)
{
if (!strncmp(pp, "SHIFT|", 6)) eb->modifiers |= E_BINDING_MODIFIER_SHIFT;
else if (!strncmp(pp, "CTRL|", 5)) eb->modifiers |= E_BINDING_MODIFIER_CTRL;
else if (!strncmp(pp, "ALT|", 4)) eb->modifiers |= E_BINDING_MODIFIER_ALT;
else if (!strncmp(pp, "WIN|", 4)) eb->modifiers |= E_BINDING_MODIFIER_WIN;
else
{
printf("OPT3 moidifier unknonw. Must be or mask of:\n"
" SHIFT CTRL ALT WIN\n");
exit(-1);
}
pp = p + 1;
}
else
{
if (!strcmp(pp, "SHIFT")) eb->modifiers |= E_BINDING_MODIFIER_SHIFT;
else if (!strcmp(pp, "CTRL")) eb->modifiers |= E_BINDING_MODIFIER_CTRL;
else if (!strcmp(pp, "ALT")) eb->modifiers |= E_BINDING_MODIFIER_ALT;
else if (!strcmp(pp, "WIN")) eb->modifiers |= E_BINDING_MODIFIER_WIN;
else
{
printf("OPT3 moidifier unknonw. Must be or mask of:\n"
" SHIFT CTRL ALT WIN\n");
exit(-1);
}
break;
}
}
}
eb->any_mod = atoi(params[3]);
eb->action = params[4];
eb->params = params[5];
}
static void
_e_opt_binding_key_add(char **params)
{
E_Config_Binding_Key bind;
int bytes;
char *data;
_e_opt_binding_key_parse(&bind, params);
data = _e_ipc_key_binding_enc(&bind, &bytes);
ecore_ipc_server_send(_e_ipc_server,
E_IPC_DOMAIN_REQUEST,
E_IPC_OP_BINDING_KEY_ADD,
0/*ref*/, 0/*ref_to*/, 0/*response*/,
data, bytes);
free(data);
}
static void
_e_opt_binding_key_del(char **params)
{
E_Config_Binding_Key bind;
int bytes;
char *data;
_e_opt_binding_key_parse(&bind, params);
data = _e_ipc_key_binding_enc(&bind, &bytes);
ecore_ipc_server_send(_e_ipc_server,
E_IPC_DOMAIN_REQUEST,
E_IPC_OP_BINDING_KEY_DEL,
0/*ref*/, 0/*ref_to*/, 0/*response*/,
data, bytes);
free(data);
}
#define SIMPLE_REQ 0
#define SIMPLE_STR_REQ 1
#define FULL_FUNC 2
@ -87,7 +275,11 @@ E_IPC_Opt_Handler handlers[] =
OREQ("-lang-list", "List all available languages", E_IPC_OP_LANG_LIST, 1),
OSTR("-lang-set", "Set the current language", E_IPC_OP_LANG_SET, 0),
OREQ("-binding-mouse-list", "List all mouse bindings", E_IPC_OP_BINDING_MOUSE_LIST, 1),
OREQ("-binding-key-list", "List all key bindings", E_IPC_OP_BINDING_KEY_LIST, 1)
OFNC("-binding-mouse-add", "Add or replace an existing mouse binding. OPT1 = Context, OPT2 = button, OPT3 = modifiers, OPT4 = any modifier ok, OPT5 = action, OPT6 = action parameters", 6, _e_opt_binding_mouse_add, 0),
OFNC("-binding-mouse-del", "Delete an existing mouse binding. OPT1 = Context, OPT2 = button, OPT3 = modifiers, OPT4 = any modifier ok, OPT5 = action, OPT6 = action parameters", 6, _e_opt_binding_mouse_del, 0),
OREQ("-binding-key-list", "List all key bindings", E_IPC_OP_BINDING_KEY_LIST, 1),
OFNC("-binding-key-add", "Add or replace an existing key binding. OPT1 = Context, OPT2 = key, OPT3 = modifiers, OPT4 = any modifier ok, OPT5 = action, OPT6 = action parameters", 6, _e_opt_binding_key_add, 0),
OFNC("-binding-key-del", "Delete an existing key binding. OPT1 = Context, OPT2 = key, OPT3 = modifiers, OPT4 = any modifier ok, OPT5 = action, OPT6 = action parameters", 6, _e_opt_binding_key_del, 0)
};
/* externally accessible functions */