Use new keybingdings ipc interface (requires e16 >= 1.0.1).
SVN revision: 42580
This commit is contained in:
parent
1bf0c713bd
commit
3b46fecad8
136
viewer.c
136
viewer.c
|
@ -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, ¶ms);
|
gtk_clist_get_text(GTK_CLIST(clist), i, 3, ¶ms);
|
||||||
|
|
||||||
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),
|
||||||
|
|
Loading…
Reference in New Issue