Use new keybingdings ipc interface (requires e16 >= 1.0.1).

SVN revision: 42580
This commit is contained in:
Kim Woelders 2009-09-20 09:27:00 +00:00
parent 1bf0c713bd
commit 3b46fecad8
1 changed files with 74 additions and 62 deletions

136
viewer.c
View File

@ -36,6 +36,12 @@ static char dont_update = 0;
static int last_row = 0; static int last_row = 0;
static int real_rows = 0; static int real_rows = 0;
typedef struct
{
const char *name_short;
const char *name_long;
} Modifier;
typedef struct typedef struct
{ {
const char *text; const char *text;
@ -44,32 +50,35 @@ typedef struct
const char *command; const char *command;
} ActionOpt; } ActionOpt;
static const char *mod_str[] = {
"",
"CTRL",
"ALT",
"SHIFT",
"CTRL+ALT",
"CTRL+SHIFT",
"ALT+SHIFT",
"CTRL+ALT+SHIFT",
"WIN",
"MOD3",
"MOD4",
"MOD5",
"WIN+SHIFT",
"WIN+CTRL",
"WIN+ALT",
"MOD4+SHIFT",
"MOD4+CTRL",
"MOD4+CTRL+SHIFT",
"MOD5+SHIFT",
"MOD5+CTRL",
"MOD5+CTRL+SHIFT",
};
#define N_MODIFIERS (sizeof(mod_str)/sizeof(char*))
/* *INDENT-OFF* */ /* *INDENT-OFF* */
static const Modifier modifiers[] = {
{"-", ""},
{"C", "CTRL"},
{"S", "SHIFT"},
{"A", "ALT"},
{"CS", "CTRL+SHIFT"},
{"CA", "CTRL+ALT"},
{"SA", "ALT+SHIFT"},
{"CSA", "CTRL+ALT+SHIFT"},
{"2", "MOD2"},
{"3", "MOD3"},
{"4", "MOD4"},
{"5", "MOD5"},
{"C2", "MOD2+CTRL"},
{"S2", "MOD2+SHIFT"},
{"A2", "MOD2+ALT"},
{"C4", "MOD4+CTRL"},
{"S4", "MOD4+SHIFT"},
{"A4", "MOD4+ALT"},
{"CS4", "MOD4+CTRL+SHIFT"},
{"C5", "MOD5+CTRL"},
{"S5", "MOD5+SHIFT"},
{"A5", "MOD5+ALT"},
{"CS5", "MOD5+CTRL+SHIFT"},
};
#define N_MODIFIERS (sizeof(modifiers)/sizeof(Modifier))
#define MOD_TEXT(mod) modifiers[mod].name_long
static const ActionOpt actions_default[] = { static const ActionOpt actions_default[] = {
{"Run command", 1, NULL, "exec "}, {"Run command", 1, NULL, "exec "},
@ -161,7 +170,7 @@ static unsigned int *action_index_to_row = NULL;
static unsigned int *action_row_to_index = NULL; static unsigned int *action_row_to_index = NULL;
static int static int
match_action_by_binding(int opcode, const char *params) match_action_by_binding(const char *params)
{ {
int k, len; int k, len;
@ -193,6 +202,20 @@ match_action_by_selection(const char *text)
return -1; return -1;
} }
static unsigned
mod_short_to_index(const char *name_short)
{
unsigned int k;
for (k = 0; k < N_MODIFIERS; k++)
{
if (!strcmp(name_short, modifiers[k].name_short))
return k;
}
return 0; /* Discard modifier */
}
static void static void
e_cb_key_change(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__) e_cb_key_change(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
{ {
@ -248,7 +271,7 @@ e_cb_modifier(GtkWidget * widget __UNUSED__, gpointer data)
gint value; gint value;
value = (gint) (glong) data; value = (gint) (glong) data;
gtk_clist_set_text(GTK_CLIST(clist), last_row, 0, mod_str[value]); gtk_clist_set_text(GTK_CLIST(clist), last_row, 0, MOD_TEXT(value));
} }
static gchar * static gchar *
@ -314,13 +337,12 @@ on_save_data(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
char *buf = NULL; char *buf = NULL;
int i; int i;
buf = dupcat(buf, "set_keybindings "); buf = dupcat(buf, "ac kb set\nAclass KEYBINDINGS global\n");
for (i = 0; i < real_rows; i++) for (i = 0; i < real_rows; i++)
{ {
char tmp[1024]; char tmp[1024];
char *params; char *params;
char params_tmp[1024];
char *action;
char *key; char *key;
char *mod; char *mod;
int modifier = 0; int modifier = 0;
@ -329,26 +351,24 @@ on_save_data(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
gtk_clist_get_text(GTK_CLIST(clist), i, 0, &mod); gtk_clist_get_text(GTK_CLIST(clist), i, 0, &mod);
for (j = 0; j < 21; j++) for (j = 0; j < 21; j++)
{ {
if (!strcmp(mod_str[j], mod)) if (!strcmp(MOD_TEXT(j), mod))
{ {
modifier = j; modifier = j;
} }
} }
gtk_clist_get_text(GTK_CLIST(clist), i, 1, &key); gtk_clist_get_text(GTK_CLIST(clist), i, 1, &key);
gtk_clist_get_text(GTK_CLIST(clist), i, 2, &action);
j = match_action_by_selection(action);
gtk_clist_get_text(GTK_CLIST(clist), i, 3, &params); gtk_clist_get_text(GTK_CLIST(clist), i, 3, &params);
if (*params == '*') snprintf(tmp, sizeof(tmp), "%s %s %s %s\n", "KeyDown",
continue; modifiers[modifier].name_short, key, params);
snprintf(tmp, sizeof(tmp), "%s %i %i %s\n", key, modifier, 0, params);
buf = dupcat(buf, tmp); buf = dupcat(buf, tmp);
} }
#if DEBUG > 0 #if DEBUG > 0
printf("%s", buf); printf("%s", buf);
#else #endif
CommsSend(buf); CommsSend(buf);
#if 0
CommsSend("save_config"); CommsSend("save_config");
#endif #endif
free(buf); free(buf);
@ -371,7 +391,7 @@ selection_made(GtkWidget * my_clist __UNUSED__, gint row,
gtk_option_menu_set_history(GTK_OPTION_MENU(act_mod), 0); gtk_option_menu_set_history(GTK_OPTION_MENU(act_mod), 0);
for (i = 1; i < 21; i++) for (i = 1; i < 21; i++)
{ {
if (!strcmp(mod_str[i], modstring)) if (!strcmp(MOD_TEXT(i), modstring))
{ {
gtk_option_menu_set_history(GTK_OPTION_MENU(act_mod), i); gtk_option_menu_set_history(GTK_OPTION_MENU(act_mod), i);
} }
@ -627,52 +647,44 @@ create_list_window(void)
{ {
char *msg, *buf; char *msg, *buf;
int i, j, k, modifier, opcode; int i, j, k, modifier;
char event[128], mod[128], key[128], *params;
const char *stuff[4];
int len;
CommsSend("get_keybindings"); CommsSend("ac kb");
msg = wait_for_ipc_msg(); msg = wait_for_ipc_msg();
i = 0; i = 0;
while ((buf = get_line(msg, i++))) while ((buf = get_line(msg, i++)))
{ {
/* stuff[0] = modifier */
/* stuff[1] = key */
/* stuff[2] = action */
/* stuff[3] = params */
char key[128], *params;
const char *stuff[4];
int len;
if (strlen(buf) < 1) if (strlen(buf) < 1)
break; break;
opcode = modifier = -1; j = sscanf(buf, "%127s %127s %127s %n", event, mod, key, &len);
j = sscanf(buf, "%127s %d %d %n", key, &modifier, &opcode, &len);
#if DEBUG > 0 #if DEBUG > 0
printf("buf(%d): %s\n", j, buf); printf("buf(%d): %s\n", j, buf);
#endif #endif
if (j < 3 || opcode < 0) if (j < 3)
continue; continue;
if (strcmp(event, "KeyDown"))
if (modifier < 0 || modifier >= (int)N_MODIFIERS)
continue; continue;
params = buf + len; params = buf + len;
if (opcode == 9 && !strncmp(params, "named ", 6)) /* Hack for e16 < 0.16.8 */
params += 6;
#if DEBUG > 0 #if DEBUG > 0
printf("key: %s, mod: %s, opc=%d, params: %s\n", key, printf("event: %s, mod: %s, key: %s, params: %s\n",
mod_str[modifier], opcode, params); event, mod, key, params);
#endif #endif
k = match_action_by_binding(opcode, params); modifier = mod_short_to_index(mod);
k = match_action_by_binding(params);
#if DEBUG > 1 #if DEBUG > 1
printf("key: %s, mod: %s, act=%d, params: %s\n", key, printf("key: %s, mod: %s, act=%d, params: %s\n", key,
mod_str[modifier], k, params); MOD_TEXT(modifier), k, params);
#endif #endif
stuff[0] = mod_str[modifier]; stuff[0] = MOD_TEXT(modifier);
stuff[1] = key; stuff[1] = key;
stuff[2] = (k >= 0) ? actions[k].text : "* Not recognised *"; stuff[2] = (k >= 0) ? actions[k].text : "* Not recognised *";
stuff[3] = params; stuff[3] = params;
@ -759,7 +771,7 @@ create_list_window(void)
for (i = 1; i < 21; i++) for (i = 1; i < 21; i++)
{ {
mi = gtk_menu_item_new_with_label(mod_str[i]); mi = gtk_menu_item_new_with_label(MOD_TEXT(i));
gtk_widget_show(mi); gtk_widget_show(mi);
gtk_signal_connect(GTK_OBJECT(mi), "activate", gtk_signal_connect(GTK_OBJECT(mi), "activate",
GTK_SIGNAL_FUNC(e_cb_modifier), GTK_SIGNAL_FUNC(e_cb_modifier),