enlightenment/src/bin/e_int_config_mousebindings.c

1043 lines
33 KiB
C

#include "e.h"
#define E_BINDING_CONTEXT_NUMBER 10
static void *_create_data(E_Config_Dialog *cfd);
static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
static void _fill_data(E_Config_Dialog_Data *cfdata);
static void _fill_action_ilist(E_Config_Dialog_Data *cfdata);
static void _update_binding_action_list(E_Config_Dialog_Data *cfdata);
static void _update_context_radios(E_Config_Dialog_Data *cfdata);
static void _update_mod_key_check_boxes(E_Config_Dialog_Data *cfdata);
static void _update_action_list(E_Config_Dialog_Data *cfdata);
static void _update_action_params(E_Config_Dialog_Data *cfdata);
static void _update_delete_button(E_Config_Dialog_Data *cfdata);
static void _apply_binding_changes(E_Config_Dialog_Data *cfdata);
static void _binding_change_cb(void *data, Evas_Object *obj);
static void _binding_action_ilist_change_cb(void *data);
static void _action_ilist_change_cb(void *data);
static void _add_binding_cb(void *data, void *data2);
static void _delete_binding_cb(void *data, void *data2);
#define E_ACTION_NUMBER 32
const char *action_to_name[E_ACTION_NUMBER][2] = {
{"window_move", "Move Window"}, {"window_resize", "Resize Window" },
{"window_raise", "Raise Window"}, {"window_menu", "Window Menu"},
{"window_lower", "Lower Window"}, {"window_close", "Close Window"},
{"window_kill", "Kill Window"}, {"window_sticky_toggle", "Sticky Window"},
{"window_iconic_toggle", "Iconify Window"}, {"window_shaded_toggle", "Shade Window"},
{"window_bordless_toggle", "Bordless Window"}, {"desk_flip_by", "Flip Desktop By #:#"},
{"desk_deskshow_toggle", "Show Desktop"}, {"desk_flip_to", "Flip To Desktop #:#"},
{"desk_linear_flip_by", "Flip Desktop By #"},
{"desk_linear_flip_to", "Flip To Desktop #"},
{"screen_send_to", "Move Mouse To Screen #"},
{"screen_send_by", "Move Mouse By Screen #"},
{"window_move_to", "Move Window To Position"}, {"window_move_by", "Shift Window"},
{"window_resize_by", "Resize Window By Size"},
{"window_drag_icon", "Drag Window Icon"},
{"window_desk_move_by", "Move Window By Desktop #"},
{"window_desk_move_to", "Move Window To Desktop #"}, {"menu_show", "Show Menu"},
{"exec", "Run User Command"}, {"app", "Launch Application"},
{"winlist", "Run Winlist Dialog"}, {"restart", "Restart Enlightenment"},
{"exit", "Exit Enlightenment"}, {"exebuf", "Run Command Dialog"},
{"desk_lock", "Lock Screen"}
};
struct _E_Config_Dialog_Data
{
E_Config_Dialog *cfd;
Evas *evas;
int mouse_binding;
E_Config_Binding_Mouse *current_mouse_binding;
E_Config_Binding_Wheel *current_wheel_binding;
E_Binding_Context context;
char *binding_ilist_value;
char *action_ilist_value;
int shift_mod, ctrl_mod, alt_mod, win_mod;
char *params;
Evas_List *mouse_bindings[5];
struct
{
Evas_Object *o_binding_action_list;
Evas_Object *o_action_list, *o_params;
Evas_Object *o_add, *o_del;
struct {
Evas_Object *o_any, *o_border, *o_menu, *o_winlist, *o_popup, *o_zone,
*o_container, *o_manager, *o_none;
} context;
struct {
Evas_Object *o_shift, *o_ctrl, *o_alt, *o_win;
} mod_key;
} gui;
};
EAPI E_Config_Dialog *
e_int_config_mousebindings(E_Container *con)
{
E_Config_Dialog *cfd;
E_Config_Dialog_View *v;
v = E_NEW(E_Config_Dialog_View, 1);
v->create_cfdata = _create_data;
v->free_cfdata = _free_data;
v->basic.apply_cfdata = _basic_apply_data;
v->basic.create_widgets = _basic_create_widgets;
v->override_auto_apply = 0;
cfd = e_config_dialog_new(con,
_("Mouse Binding Settings"),
"E", "_config_mousebindings_dialog",
"enlightenment/mouse_binding_left", 0, v, NULL);
return cfd;
}
static void
_fill_data(E_Config_Dialog_Data *cfdata)
{
Evas_List *l;
E_Config_Binding_Mouse *eb, *eb2;
E_Config_Binding_Wheel *bw, *bw2;
cfdata->mouse_binding = 0;
cfdata->context = E_BINDING_CONTEXT_ANY;
cfdata->binding_ilist_value = strdup("");
cfdata->shift_mod = 0;
cfdata->ctrl_mod = 0;
cfdata->alt_mod = 0;
cfdata->win_mod = 0;
cfdata->params = strdup("");
cfdata->current_mouse_binding = NULL;
cfdata->current_wheel_binding = NULL;
for (l = e_config->mouse_bindings; l; l = l->next)
{
eb = l->data;
if (!eb->action) continue;
eb2 = E_NEW(E_Config_Binding_Mouse, 1);
eb2->context = eb->context;
eb2->button = eb->button;
eb2->modifiers = eb->modifiers;
eb2->any_mod = eb->any_mod;
eb2->action = eb->action == NULL ? NULL : evas_stringshare_add(eb->action);
eb2->params = eb->params == NULL ? NULL : evas_stringshare_add(eb->params);
if (eb2->button == 1)
cfdata->mouse_bindings[0] = evas_list_append(cfdata->mouse_bindings[0], eb2);
else if (eb2->button == 2)
cfdata->mouse_bindings[1] = evas_list_append(cfdata->mouse_bindings[1], eb2);
else if (eb2->button == 3)
cfdata->mouse_bindings[2] = evas_list_append(cfdata->mouse_bindings[2], eb2);
}
for (l = e_config->wheel_bindings; l; l = l->next)
{
bw = l->data;
if (!bw) continue;
if (bw->direction == 1) continue;
bw2 = E_NEW(E_Config_Binding_Wheel, 1);
bw2->context = bw->context;
bw2->direction = bw->direction;
bw2->z = bw->z;
bw2->modifiers = bw->modifiers;
bw2->any_mod = bw->any_mod;
bw2->action = bw->action == NULL ? NULL : evas_stringshare_add(bw->action);
bw2->params = bw->params == NULL ? NULL : evas_stringshare_add(bw->params);
if (bw->z < 0)
cfdata->mouse_bindings[3] = evas_list_append(cfdata->mouse_bindings[3], bw2);
else
cfdata->mouse_bindings[4] = evas_list_append(cfdata->mouse_bindings[4], bw2);
}
}
static void *
_create_data(E_Config_Dialog *cfd)
{
E_Config_Dialog_Data *cfdata;
cfdata = E_NEW(E_Config_Dialog_Data, 1);
_fill_data(cfdata);
cfdata->cfd = cfd;
return cfdata;
}
static void
_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
int i;
E_Config_Binding_Mouse *bm;
E_Config_Binding_Wheel *bw;
for (i = 0; i < 5; i++)
{
while (cfdata->mouse_bindings[i])
{
switch (i)
{
case 0:
case 1:
case 2:
bm = cfdata->mouse_bindings[i]->data;
if (bm->action) evas_stringshare_del(bm->action);
if (bm->params) evas_stringshare_del(bm->params);
E_FREE(bm);
break;
case 3:
case 4:
bw = cfdata->mouse_bindings[i]->data;
if (bw->action) evas_stringshare_del(bw->action);
if (bw->params) evas_stringshare_del(bw->params);
E_FREE(bw);
break;
}
cfdata->mouse_bindings[i] =
evas_list_remove_list(cfdata->mouse_bindings[i], cfdata->mouse_bindings[i]);
}
}
if (cfdata->binding_ilist_value) free(cfdata->binding_ilist_value);
if (cfdata->action_ilist_value) free(cfdata->action_ilist_value);
if (cfdata->params) free(cfdata->params);
free(cfdata);
}
static int
_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
{
int i;
Evas_List *l;
E_Config_Binding_Mouse *bm, *bm2;
E_Config_Binding_Wheel *bw, *bw2;
if (!cfdata) return 0;
_apply_binding_changes(cfdata);
e_border_button_bindings_ungrab_all();
while (e_config->mouse_bindings)
{
bm = e_config->mouse_bindings->data;
e_bindings_mouse_del(bm->context, bm->button, bm->modifiers, bm->any_mod, bm->action,
bm->params);
if (bm->action) evas_stringshare_del(bm->action);
if (bm->params) evas_stringshare_del(bm->params);
E_FREE(bm);
e_config->mouse_bindings = evas_list_remove_list(e_config->mouse_bindings, e_config->mouse_bindings);
}
while (e_config->wheel_bindings)
{
bw = e_config->wheel_bindings->data;
e_bindings_wheel_del(bw->context, bw->direction, bw->z, bw->modifiers, bw->any_mod,
bw->action, bw->params);
if (bw->action) evas_stringshare_del(bw->action);
if (bw->params) evas_stringshare_del(bw->params);
E_FREE(bw);
e_config->wheel_bindings = evas_list_remove_list(e_config->wheel_bindings, e_config->wheel_bindings);
}
for (i = 0; i < 5; i++)
{
switch (i)
{
case 0:
case 1:
case 2:
for (l = cfdata->mouse_bindings[i]; l; l = l->next)
{
bm = l->data;
bm2 = E_NEW(E_Config_Binding_Mouse, 1);
bm2->context = bm->context;
bm2->button = bm->button;
bm2->modifiers = bm->modifiers;
bm2->any_mod = bm->any_mod;
bm2->action = bm->action == NULL ? NULL : evas_stringshare_add(bm->action);
bm2->params = bm->params == NULL ? NULL : evas_stringshare_add(bm->params);
e_config->mouse_bindings = evas_list_append(e_config->mouse_bindings, bm2);
e_bindings_mouse_add(bm2->context, bm2->button, bm2->modifiers, bm2->any_mod,
bm2->action, bm2->params);
}
break;
case 3:
case 4:
for (l = cfdata->mouse_bindings[i]; l; l = l->next)
{
bw = l->data;
bw2 = E_NEW(E_Config_Binding_Wheel, 1);
bw2->context = bw->context;
bw2->direction = 0;
bw2->z = bw->z;
bw2->modifiers = bw->modifiers;
bw2->any_mod = 0;//bw->any_mod;
bw2->action = bw->action == NULL ? NULL : evas_stringshare_add(bw->action);
bw2->params = bw->params == NULL ? NULL : evas_stringshare_add(bw->params);
e_config->wheel_bindings = evas_list_append(e_config->wheel_bindings, bw2);
e_bindings_wheel_add(bw2->context, bw2->direction, bw2->z, bw2->modifiers,
bw2->any_mod, bw2->action, bw2->params);
bw2 = E_NEW(E_Config_Binding_Wheel, 1);
bw2->context = bw->context;
bw2->direction = 1;
bw2->z = bw->z;
bw2->modifiers = bw->modifiers;
bw2->any_mod = 0;//bw->any_mod;
bw2->action = bw->action == NULL ? NULL : evas_stringshare_add(bw->action);
bw2->params = bw->params == NULL ? NULL : evas_stringshare_add(bw->params);
e_config->wheel_bindings = evas_list_append(e_config->wheel_bindings, bw2);
e_bindings_wheel_add(bw2->context, bw2->direction, bw2->z, bw2->modifiers,
bw2->any_mod, bw2->action, bw2->params);
}
break;
}
}
e_border_button_bindings_grab_all();
e_config_save_queue();
return 1;
}
static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *o, *ol, *ol2, *ol3, *of, *of2, *ot;
E_Radio_Group *rg;
cfdata->evas = evas;
ol = e_widget_list_add(evas, 0, 0);
ol2 = e_widget_list_add(evas, 0, 1);
of = e_widget_framelist_add(evas, _("Mouse Binding"), 0);
rg = e_widget_radio_group_new(&(cfdata->mouse_binding));
ol3 = e_widget_list_add(evas, 0, 1);
o = e_widget_radio_icon_add(evas, _("Left Button"), "enlightenment/mouse_binding_left",
48, 48, 0, rg);
e_widget_on_change_hook_set(o, _binding_change_cb, cfdata);
e_widget_list_object_append(ol3, o, 1, 1, 0.5);
o = e_widget_radio_icon_add(evas, _("Middle Button"), "enlightenment/mouse_binding_middle",
48, 48, 1, rg);
e_widget_on_change_hook_set(o, _binding_change_cb, cfdata);
e_widget_list_object_append(ol3, o, 1, 1, 0.5);
o = e_widget_radio_icon_add(evas, _("Right Button"), "enlightenment/mouse_binding_right",
48, 48, 2, rg);
e_widget_on_change_hook_set(o, _binding_change_cb, cfdata);
e_widget_list_object_append(ol3, o, 1, 1, 0.5);
e_widget_framelist_object_append(of, ol3);
ol3 = e_widget_list_add(evas, 0, 1);
o = e_widget_radio_icon_add(evas, _("Mouse Wheel Up"), "enlightenment/mouse_binding_scroll_up",
48, 48, 3, rg);
e_widget_on_change_hook_set(o, _binding_change_cb, cfdata);
e_widget_list_object_append(ol3, o, 1, 1, 0.5);
o = e_widget_radio_icon_add(evas, _("Mouse Wheel Down"),
"enlightenment/mouse_binding_scroll_down", 48, 48, 4, rg);
e_widget_on_change_hook_set(o, _binding_change_cb, cfdata);
e_widget_list_object_append(ol3, o, 1, 1, 0.5);
e_widget_framelist_object_append(of, ol3);
e_widget_list_object_append(ol2, of, 1, 1, 0.5);
of = e_widget_framelist_add(evas, _("Binding Action List"), 0);
o = e_widget_ilist_add(evas, 32, 32, &(cfdata->binding_ilist_value));
cfdata->gui.o_binding_action_list = o;
e_widget_min_size_set(o, 250, 100);
e_widget_ilist_go(o);
e_widget_framelist_object_append(of, o);
ol3 = e_widget_list_add(evas, 0, 1);
o = e_widget_button_add(evas, _("Add"), NULL, _add_binding_cb, cfdata, NULL);
cfdata->gui.o_add = o;
e_widget_list_object_append(ol3, o, 1, 1, 0.5);
o = e_widget_button_add(evas, _("Delete"), NULL, _delete_binding_cb, cfdata, NULL);
cfdata->gui.o_del = o;
e_widget_list_object_append(ol3, o, 1, 1, 0.5);
e_widget_disabled_set(o, 1);
e_widget_framelist_object_append(of, ol3);
e_widget_list_object_append(ol2, of, 1, 1, 0.5);
e_widget_list_object_append(ol, ol2, 1, 1, 0.5);
of = e_widget_framelist_add(evas, _("Action Settings"), 1);
ol2 = e_widget_list_add(evas, 0, 0);
of2 = e_widget_framelist_add(evas, _("Modifier Key"), 1);
o = e_widget_check_add(evas, _("Shift"), &(cfdata->shift_mod));
cfdata->gui.mod_key.o_shift = o;
e_widget_framelist_object_append(of2, o);
e_widget_disabled_set(o, 1);
o = e_widget_check_add(evas, _("Ctrl"), &(cfdata->ctrl_mod));
cfdata->gui.mod_key.o_ctrl = o;
e_widget_framelist_object_append(of2, o);
e_widget_disabled_set(o, 1);
o = e_widget_check_add(evas, _("Alt"), &(cfdata->alt_mod));
cfdata->gui.mod_key.o_alt = o;
e_widget_framelist_object_append(of2, o);
e_widget_disabled_set(o, 1);
o = e_widget_check_add(evas, _("Win"), &(cfdata->win_mod));
cfdata->gui.mod_key.o_win = o;
e_widget_framelist_object_append(of2, o);
e_widget_disabled_set(o, 1);
e_widget_list_object_append(ol2, of2, 1, 1, 0.5);
of2 = e_widget_framelist_add(evas, _("Context"), 0);
ot = e_widget_table_add(evas, 0);
rg = e_widget_radio_group_new((int*)(&(cfdata->context)));
o = e_widget_radio_add(evas, _("Any"), E_BINDING_CONTEXT_ANY, rg);
cfdata->gui.context.o_any = o;
e_widget_table_object_append(ot, o, 0, 0, 1, 1, 1, 1, 1, 1);
e_widget_disabled_set(o, 1);
o = e_widget_radio_add(evas, _("Border"), E_BINDING_CONTEXT_BORDER, rg);
cfdata->gui.context.o_border = o;
e_widget_table_object_append(ot, o, 0, 1, 1, 1, 1, 1, 1, 1);
e_widget_disabled_set(o, 1);
o = e_widget_radio_add(evas, _("Menu"), E_BINDING_CONTEXT_MENU, rg);
cfdata->gui.context.o_menu = o;
e_widget_table_object_append(ot, o, 0, 2, 1, 1, 1, 1, 1, 1);
e_widget_disabled_set(o, 1);
o = e_widget_radio_add(evas, _("Win List"), E_BINDING_CONTEXT_WINLIST, rg);
cfdata->gui.context.o_winlist = o;
e_widget_table_object_append(ot, o, 1, 0, 1, 1, 1, 1, 1, 1);
e_widget_disabled_set(o, 1);
o = e_widget_radio_add(evas, _("Popup"), E_BINDING_CONTEXT_POPUP, rg);
cfdata->gui.context.o_popup = o;
e_widget_table_object_append(ot, o, 1, 1, 1, 1, 1, 1, 1, 1);
e_widget_disabled_set(o, 1);
o = e_widget_radio_add(evas, _("Zone"), E_BINDING_CONTEXT_ZONE, rg);
cfdata->gui.context.o_zone = o;
e_widget_table_object_append(ot, o, 1, 2, 1, 1, 1, 1, 1, 1);
e_widget_disabled_set(o, 1);
o = e_widget_radio_add(evas, _("Container"), E_BINDING_CONTEXT_CONTAINER, rg);
cfdata->gui.context.o_container = o;
e_widget_table_object_append(ot, o, 2, 0, 1, 1, 1, 1, 1, 1);
e_widget_disabled_set(o, 1);
o = e_widget_radio_add(evas, _("Manager"), E_BINDING_CONTEXT_MANAGER, rg);
cfdata->gui.context.o_manager = o;
e_widget_table_object_append(ot, o, 2, 1, 1, 1, 1, 1, 1, 1);
e_widget_disabled_set(o, 1);
o = e_widget_radio_add(evas, _("None"), E_BINDING_CONTEXT_NONE, rg);
cfdata->gui.context.o_none = o;
e_widget_table_object_append(ot, o, 2, 2, 1, 1, 1, 1, 1, 1); e_widget_disabled_set(o, 1);
e_widget_framelist_object_append(of2, ot);
e_widget_list_object_append(ol2, of2, 1, 1, 0.5);
e_widget_framelist_object_append(of, ol2);
ol2 = e_widget_list_add(evas, 0, 0);
of2 = e_widget_framelist_add(evas, _("Action"), 0);
o = e_widget_ilist_add(evas, 32, 32, &(cfdata->action_ilist_value));
cfdata->gui.o_action_list = o;
e_widget_min_size_set(o, 250, 100);
e_widget_ilist_go(o);
e_widget_disabled_set(o, 1);
e_widget_framelist_object_append(of2, o);
e_widget_list_object_append(ol2, of2, 1, 1, 0.5);
of2 = e_widget_framelist_add(evas, _("Params"), 0);
o = e_widget_entry_add(evas, &(cfdata->params));
cfdata->gui.o_params = o;
e_widget_framelist_object_append(of2, o);
e_widget_disabled_set(o, 1);
e_widget_list_object_append(ol2, of2, 1, 1, 0.5);
e_widget_framelist_object_append(of, ol2);
e_widget_list_object_append(ol, of, 1, 1, 0.5);
_update_binding_action_list(cfdata);
_update_delete_button(cfdata);
return ol;
}
static void
_update_binding_action_list(E_Config_Dialog_Data *cfdata)
{
char buf[256] = "";
const char *action;
char indx[256];
Evas_List *l;
E_Config_Binding_Mouse *eb;
E_Config_Binding_Wheel *bw;
int i, j;
e_widget_ilist_clear(cfdata->gui.o_binding_action_list);
if (cfdata->mouse_binding < 3)
{
for (l = cfdata->mouse_bindings[cfdata->mouse_binding], i = 0; l; l = l->next, i++)
{
eb = l->data;
for (j = 0; j < E_ACTION_NUMBER; j++)
{
if (!strcmp(action_to_name[j][0], eb->action))
break;
}
if (j < E_ACTION_NUMBER)
action = action_to_name[j][1];
else
action = _("Unknown");
snprintf(buf, sizeof(buf), "%s %d: %s", _("Action"), i, action);
snprintf(indx, sizeof(indx), "%d", i);
e_widget_ilist_append(cfdata->gui.o_binding_action_list, NULL, buf,
_binding_action_ilist_change_cb, cfdata, indx);
}
}
else
{
for (l = cfdata->mouse_bindings[cfdata->mouse_binding], i = 0; l; l = l->next, i++)
{
bw = l->data;
for (j = 0; j < E_ACTION_NUMBER; j++)
{
if (!strcmp(action_to_name[j][0], bw->action))
break;
}
if (j < E_ACTION_NUMBER)
action = action_to_name[j][1];
else
action = _("Unknown");
snprintf(buf, sizeof(buf), "%s %d: %s", _("Action"), i, action);
snprintf(indx, sizeof(indx), "%d", i);
e_widget_ilist_append(cfdata->gui.o_binding_action_list, NULL, buf,
_binding_action_ilist_change_cb, cfdata, indx);
}
}
e_widget_ilist_go(cfdata->gui.o_binding_action_list);
if (!cfdata->mouse_bindings[cfdata->mouse_binding])
{
_update_context_radios(cfdata);
_update_mod_key_check_boxes(cfdata);
_update_action_list(cfdata);
_update_action_params(cfdata);
}
else
e_widget_ilist_selected_set(cfdata->gui.o_binding_action_list, 0);
}
static void
_update_context_radios(E_Config_Dialog_Data *cfdata)
{
E_Config_Binding_Mouse *eb;
E_Config_Binding_Wheel *bw;
e_widget_disabled_set(cfdata->gui.context.o_any, 1);
e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
e_widget_disabled_set(cfdata->gui.context.o_border, 1);
e_widget_disabled_set(cfdata->gui.context.o_menu, 1);
e_widget_disabled_set(cfdata->gui.context.o_winlist, 1);
e_widget_disabled_set(cfdata->gui.context.o_popup, 1);
e_widget_disabled_set(cfdata->gui.context.o_zone, 1);
e_widget_disabled_set(cfdata->gui.context.o_container, 1);
e_widget_disabled_set(cfdata->gui.context.o_manager, 1);
e_widget_disabled_set(cfdata->gui.context.o_none, 1);
if ((!cfdata->current_mouse_binding) && (!cfdata->current_wheel_binding))
return;
e_widget_disabled_set(cfdata->gui.context.o_any, 0);
e_widget_disabled_set(cfdata->gui.context.o_border, 0);
e_widget_disabled_set(cfdata->gui.context.o_menu, 0);
e_widget_disabled_set(cfdata->gui.context.o_winlist, 0);
e_widget_disabled_set(cfdata->gui.context.o_popup, 0);
e_widget_disabled_set(cfdata->gui.context.o_zone, 0);
e_widget_disabled_set(cfdata->gui.context.o_container, 0);
e_widget_disabled_set(cfdata->gui.context.o_manager, 0);
e_widget_disabled_set(cfdata->gui.context.o_none, 0);
if (cfdata->mouse_binding < 3)
{
eb = cfdata->current_mouse_binding;
if (eb->context == E_BINDING_CONTEXT_ANY)
e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
else if (eb->context == E_BINDING_CONTEXT_BORDER)
e_widget_radio_toggle_set(cfdata->gui.context.o_border, 1);
else if (eb->context == E_BINDING_CONTEXT_MENU)
e_widget_radio_toggle_set(cfdata->gui.context.o_menu, 1);
else if (eb->context == E_BINDING_CONTEXT_WINLIST)
e_widget_radio_toggle_set(cfdata->gui.context.o_winlist, 1);
else if (eb->context == E_BINDING_CONTEXT_POPUP)
e_widget_radio_toggle_set(cfdata->gui.context.o_popup, 1);
else if (eb->context == E_BINDING_CONTEXT_ZONE)
e_widget_radio_toggle_set(cfdata->gui.context.o_zone, 1);
else if (eb->context == E_BINDING_CONTEXT_CONTAINER)
e_widget_radio_toggle_set(cfdata->gui.context.o_container, 1);
else if (eb->context == E_BINDING_CONTEXT_MANAGER)
e_widget_radio_toggle_set(cfdata->gui.context.o_manager, 1);
else if (eb->context == E_BINDING_CONTEXT_NONE)
e_widget_radio_toggle_set(cfdata->gui.context.o_none, 1);
else
e_widget_radio_toggle_set(cfdata->gui.context.o_none, 1);
}
else
{
bw = cfdata->current_wheel_binding;
if (bw->context == E_BINDING_CONTEXT_ANY)
e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
else if (bw->context == E_BINDING_CONTEXT_BORDER)
e_widget_radio_toggle_set(cfdata->gui.context.o_border, 1);
else if (bw->context == E_BINDING_CONTEXT_MENU)
e_widget_radio_toggle_set(cfdata->gui.context.o_menu, 1);
else if (bw->context == E_BINDING_CONTEXT_WINLIST)
e_widget_radio_toggle_set(cfdata->gui.context.o_winlist, 1);
else if (bw->context == E_BINDING_CONTEXT_POPUP)
e_widget_radio_toggle_set(cfdata->gui.context.o_popup, 1);
else if (bw->context == E_BINDING_CONTEXT_ZONE)
e_widget_radio_toggle_set(cfdata->gui.context.o_zone, 1);
else if (bw->context == E_BINDING_CONTEXT_CONTAINER)
e_widget_radio_toggle_set(cfdata->gui.context.o_container, 1);
else if (bw->context == E_BINDING_CONTEXT_MANAGER)
e_widget_radio_toggle_set(cfdata->gui.context.o_manager, 1);
else if (bw->context == E_BINDING_CONTEXT_NONE)
e_widget_radio_toggle_set(cfdata->gui.context.o_none, 1);
else
e_widget_radio_toggle_set(cfdata->gui.context.o_none, 1);
}
}
static void
_update_mod_key_check_boxes(E_Config_Dialog_Data *cfdata)
{
E_Config_Binding_Mouse *eb;
E_Config_Binding_Wheel *bw;
e_widget_disabled_set(cfdata->gui.mod_key.o_shift, 1);
e_widget_disabled_set(cfdata->gui.mod_key.o_ctrl, 1);
e_widget_disabled_set(cfdata->gui.mod_key.o_alt, 1);
e_widget_disabled_set(cfdata->gui.mod_key.o_win, 1);
e_widget_check_checked_set(cfdata->gui.mod_key.o_shift, 0);
e_widget_check_checked_set(cfdata->gui.mod_key.o_ctrl, 0);
e_widget_check_checked_set(cfdata->gui.mod_key.o_alt, 0);
e_widget_check_checked_set(cfdata->gui.mod_key.o_win, 0);
if ((!cfdata->current_mouse_binding) && (!cfdata->current_wheel_binding))
return;
e_widget_disabled_set(cfdata->gui.mod_key.o_shift, 0);
e_widget_disabled_set(cfdata->gui.mod_key.o_ctrl, 0);
e_widget_disabled_set(cfdata->gui.mod_key.o_alt, 0);
e_widget_disabled_set(cfdata->gui.mod_key.o_win, 0);
if (cfdata->mouse_binding < 3)
{
eb = cfdata->current_mouse_binding;
if (eb->modifiers & E_BINDING_MODIFIER_SHIFT)
e_widget_check_checked_set(cfdata->gui.mod_key.o_shift, 1);
else
e_widget_check_checked_set(cfdata->gui.mod_key.o_shift, 0);
if (eb->modifiers & E_BINDING_MODIFIER_CTRL)
e_widget_check_checked_set(cfdata->gui.mod_key.o_ctrl, 1);
else
e_widget_check_checked_set(cfdata->gui.mod_key.o_ctrl, 0);
if (eb->modifiers & E_BINDING_MODIFIER_ALT)
e_widget_check_checked_set(cfdata->gui.mod_key.o_alt, 1);
else
e_widget_check_checked_set(cfdata->gui.mod_key.o_alt, 0);
if (eb->modifiers & E_BINDING_MODIFIER_WIN)
e_widget_check_checked_set(cfdata->gui.mod_key.o_win, 1);
else
e_widget_check_checked_set(cfdata->gui.mod_key.o_win, 0);
}
else
{
bw = cfdata->current_wheel_binding;
if (bw->modifiers & E_BINDING_MODIFIER_SHIFT)
e_widget_check_checked_set(cfdata->gui.mod_key.o_shift, 1);
else
e_widget_check_checked_set(cfdata->gui.mod_key.o_shift, 0);
if (bw->modifiers & E_BINDING_MODIFIER_CTRL)
e_widget_check_checked_set(cfdata->gui.mod_key.o_ctrl, 1);
else
e_widget_check_checked_set(cfdata->gui.mod_key.o_ctrl, 0);
if (bw->modifiers & E_BINDING_MODIFIER_ALT)
e_widget_check_checked_set(cfdata->gui.mod_key.o_alt, 1);
else
e_widget_check_checked_set(cfdata->gui.mod_key.o_alt, 0);
if (bw->modifiers & E_BINDING_MODIFIER_WIN)
e_widget_check_checked_set(cfdata->gui.mod_key.o_win, 1);
else
e_widget_check_checked_set(cfdata->gui.mod_key.o_win, 0);
}
}
static void
_update_action_list(E_Config_Dialog_Data *cfdata)
{
int i;
E_Config_Binding_Mouse *eb;
E_Config_Binding_Wheel *bw;
if ((cfdata->current_mouse_binding) || (cfdata->current_wheel_binding))
_fill_action_ilist(cfdata);
else
{
_update_action_params(cfdata);
e_widget_ilist_clear(cfdata->gui.o_action_list);
return;
}
if (cfdata->mouse_binding < 3)
{
eb = cfdata->current_mouse_binding;
for (i = 0; i < E_ACTION_NUMBER; i++)
{
if (!strcmp(eb->action, action_to_name[i][0]))
break;
}
e_widget_ilist_selected_set(cfdata->gui.o_action_list, i);
}
else
{
bw = cfdata->current_wheel_binding;
for (i = 0; i < E_ACTION_NUMBER; i++)
{
if (!strcmp(bw->action, action_to_name[i][0]))
break;
}
e_widget_ilist_selected_set(cfdata->gui.o_action_list, i);
}
}
static void
_update_action_params(E_Config_Dialog_Data *cfdata)
{
E_Config_Binding_Mouse *eb;
E_Config_Binding_Wheel *bw;
if ((!cfdata->current_mouse_binding) && (!cfdata->current_wheel_binding))
{
e_widget_entry_clear(cfdata->gui.o_params);
e_widget_disabled_set(cfdata->gui.o_params, 1);
return;
}
e_widget_disabled_set(cfdata->gui.o_params, 0);
if (cfdata->mouse_binding < 3)
{
eb = cfdata->current_mouse_binding;
if (eb->params)
e_widget_entry_text_set(cfdata->gui.o_params, eb->params);
else
e_widget_entry_clear(cfdata->gui.o_params);
}
else
{
bw = cfdata->current_wheel_binding;
if (bw->params)
e_widget_entry_text_set(cfdata->gui.o_params, bw->params);
else
e_widget_entry_clear(cfdata->gui.o_params);
}
}
static void
_fill_action_ilist(E_Config_Dialog_Data *cfdata)
{
char buf[256];
int j;
if (e_widget_ilist_count(cfdata->gui.o_action_list))
return;
for (j = 0; j < E_ACTION_NUMBER; j++)
{
snprintf(buf, sizeof(buf), "%d", j);
e_widget_ilist_append(cfdata->gui.o_action_list, NULL, action_to_name[j][1],
_action_ilist_change_cb, cfdata, buf);
}
e_widget_ilist_go(cfdata->gui.o_action_list);
}
static void
_apply_binding_changes(E_Config_Dialog_Data *cfdata)
{
E_Config_Binding_Mouse *eb;
E_Config_Binding_Wheel *bw;
if (cfdata->current_mouse_binding)
{
eb = cfdata->current_mouse_binding;
eb->context = cfdata->context;
eb->modifiers = E_BINDING_MODIFIER_NONE;
if (cfdata->shift_mod)
eb->modifiers |= E_BINDING_MODIFIER_SHIFT;
if (cfdata->ctrl_mod)
eb->modifiers |= E_BINDING_MODIFIER_CTRL;
if (cfdata->alt_mod)
eb->modifiers |= E_BINDING_MODIFIER_ALT;
if (cfdata->win_mod)
eb->modifiers |= E_BINDING_MODIFIER_WIN;
if (eb->action) evas_stringshare_del(eb->action);
eb->action = evas_stringshare_add(action_to_name[atoi(cfdata->action_ilist_value)][0]);
if (eb->params) evas_stringshare_del(eb->params);
eb->params = cfdata->params[0] ? evas_stringshare_add(cfdata->params) : NULL;
}
else if (cfdata->current_wheel_binding)
{
bw = cfdata->current_wheel_binding;
bw->context = cfdata->context;
bw->direction = 0;
bw->modifiers = E_BINDING_MODIFIER_NONE;
if (cfdata->shift_mod)
bw->modifiers |= E_BINDING_MODIFIER_SHIFT;
if (cfdata->ctrl_mod)
bw->modifiers |= E_BINDING_MODIFIER_CTRL;
if (cfdata->alt_mod)
bw->modifiers |= E_BINDING_MODIFIER_ALT;
if (cfdata->win_mod)
bw->modifiers |= E_BINDING_MODIFIER_WIN;
if (bw->action) evas_stringshare_del(bw->action);
bw->action = evas_stringshare_add(action_to_name[atoi(cfdata->action_ilist_value)][0]);
if (bw->params) evas_stringshare_del(bw->params);
bw->params = cfdata->params[0] ? evas_stringshare_add(cfdata->params) : NULL;
}
}
static void
_update_delete_button(E_Config_Dialog_Data *cfdata)
{
if (evas_list_count(cfdata->mouse_bindings[cfdata->mouse_binding]))
e_widget_disabled_set(cfdata->gui.o_del, 0);
else
e_widget_disabled_set(cfdata->gui.o_del, 1);
}
/* callbacks */
static void
_binding_change_cb(void *data, Evas_Object *obj)
{
E_Config_Dialog_Data *cfdata;
cfdata = data;
_apply_binding_changes(cfdata);
cfdata->current_mouse_binding = NULL;
cfdata->current_wheel_binding = NULL;
_update_binding_action_list(cfdata);
_update_delete_button(cfdata);
}
static void
_binding_action_ilist_change_cb(void *data)
{
E_Config_Dialog_Data *cfdata;
cfdata = data;
_apply_binding_changes(cfdata);
if (cfdata->mouse_binding < 3)
{
cfdata->current_mouse_binding =
evas_list_nth(cfdata->mouse_bindings[cfdata->mouse_binding],
atoi(cfdata->binding_ilist_value));
cfdata->current_wheel_binding = NULL;
}
else
{
cfdata->current_mouse_binding = NULL;
cfdata->current_wheel_binding =
evas_list_nth(cfdata->mouse_bindings[cfdata->mouse_binding],
atoi(cfdata->binding_ilist_value));
}
_update_context_radios(cfdata);
_update_mod_key_check_boxes(cfdata);
_update_action_list(cfdata);
_update_action_params(cfdata);
}
static void
_action_ilist_change_cb(void *data)
{
E_Config_Dialog_Data *cfdata;
cfdata = data;
_update_action_params(cfdata);
}
static void
_add_binding_cb(void *data, void *data2)
{
E_Config_Dialog_Data *cfdata;
E_Config_Binding_Mouse *bm;
E_Config_Binding_Wheel *bw;
cfdata = data;
if (cfdata->mouse_binding < 3)
{
bm = E_NEW(E_Config_Binding_Mouse, 1);
if (!bm) return;
bm->context = E_BINDING_CONTEXT_ANY;
switch (cfdata->mouse_binding)
{
case 0:
bm->button = 1;
break;
case 1:
bm->button = 2;
break;
case 2:
bm->button = 3;
break;
}
bm->modifiers = E_BINDING_MODIFIER_NONE;
bm->any_mod = 0;
bm->action = evas_stringshare_add(action_to_name[0][0]);
bm->params = NULL;
cfdata->mouse_bindings[cfdata->mouse_binding] =
evas_list_append(cfdata->mouse_bindings[cfdata->mouse_binding], bm);
}
else
{
bw = E_NEW(E_Config_Binding_Wheel, 1);
if (!bw) return;
bw->context = E_BINDING_CONTEXT_ANY;
bw->direction = 0;
if (cfdata->mouse_binding == 3)
bw->z = -1;
else if (cfdata->mouse_binding == 4)
bw->z = 1;
bw->modifiers = E_BINDING_MODIFIER_NONE;
bw->any_mod = 0;
bw->action = evas_stringshare_add(action_to_name[0][0]);
bw->params = NULL;
cfdata->mouse_bindings[cfdata->mouse_binding] =
evas_list_append(cfdata->mouse_bindings[cfdata->mouse_binding], bw);
}
_update_binding_action_list(cfdata);
_update_delete_button(cfdata);
e_widget_ilist_selected_set(cfdata->gui.o_binding_action_list,
e_widget_ilist_count(cfdata->gui.o_binding_action_list) - 1);
}
static void
_delete_binding_cb(void *data, void *data2)
{
int current_selection = 0;
E_Config_Dialog_Data *cfdata;
E_Config_Binding_Mouse *bm;
E_Config_Binding_Wheel *bw;
cfdata = data;
current_selection = e_widget_ilist_selected_get(cfdata->gui.o_binding_action_list);
if (cfdata->mouse_binding < 3)
{
bm = cfdata->current_mouse_binding;
cfdata->mouse_bindings[cfdata->mouse_binding] =
evas_list_remove(cfdata->mouse_bindings[cfdata->mouse_binding], bm);
if (bm->action) evas_stringshare_del(bm->action);
if (bm->params) evas_stringshare_del(bm->params);
E_FREE(bm);
cfdata->current_mouse_binding = NULL;
}
else
{
bw = cfdata->current_wheel_binding;
cfdata->mouse_bindings[cfdata->mouse_binding] =
evas_list_remove(cfdata->mouse_bindings[cfdata->mouse_binding], bw);
if (bw->action) evas_stringshare_del(bw->action);
if (bw->params) evas_stringshare_del(bw->params);
E_FREE(bw);
cfdata->current_wheel_binding = NULL;
}
_update_binding_action_list(cfdata);
if (!e_widget_ilist_count(cfdata->gui.o_binding_action_list))
{
_update_context_radios(cfdata);
_update_mod_key_check_boxes(cfdata);
_update_action_list(cfdata);
_update_action_params(cfdata);
_update_delete_button(cfdata);
}
else
{
if (current_selection >= e_widget_ilist_count(cfdata->gui.o_binding_action_list))
e_widget_ilist_selected_set(cfdata->gui.o_binding_action_list,
e_widget_ilist_count(cfdata->gui.o_binding_action_list) - 1);
else
e_widget_ilist_selected_set(cfdata->gui.o_binding_action_list, current_selection);
}
}