Index: trunk/src/hid_cfg_input.c =================================================================== --- trunk/src/hid_cfg_input.c (revision 1565) +++ trunk/src/hid_cfg_input.c (revision 1566) @@ -26,6 +26,7 @@ #include #include #include +#include #include "global.h" #include "hid.h" @@ -355,6 +356,63 @@ return -1; } +static void gen_accel(gds_t *s, hid_cfg_keys_t *km, const char *keydesc, int *cnt, const char *sep) +{ + hid_cfg_mod_t mods[HIDCFG_MAX_KEYSEQ_LEN]; + unsigned short int key_chars[HIDCFG_MAX_KEYSEQ_LEN]; + hid_cfg_keyseq_t *lasts; + int slen, n; + + slen = parse_keydesc(km, keydesc, mods, key_chars, HIDCFG_MAX_KEYSEQ_LEN); + if (slen <= 0) + return; + + if (*cnt > 0) + gds_append_str(s, sep); + + for(n = 0; n < slen; n++) { + char buff[64]; + + if (km->key_name(key_chars[n], buff, sizeof(buff)) != 0) + strcpy(buff, ""); + + if (mods[n] & M_Alt) gds_append_str(s, "Alt-"); + if (mods[n] & M_Ctrl) gds_append_str(s, "Ctrl-"); + if (mods[n] & M_Shift) gds_append_str(s, "Shift-"); + gds_append_str(s, buff); + } +} + +char *hid_cfg_keys_gen_accel(hid_cfg_keys_t *km, const lht_node_t *keydescn, unsigned long mask, const char *sep) +{ + gds_t s; + int cnt = 0; + + memset(&s, 0, sizeof(s)); + + switch(keydescn->type) { + case LHT_TEXT: + if (mask & 1) + gen_accel(&s, km, keydescn->data.text.value, &cnt, sep); + break; + case LHT_LIST: + { + int ret = -1, cnt; + lht_node_t *n; + for(n = keydescn->data.list.first, cnt = 0; n != NULL; n = n->next, cnt++, mask >>= 1) { + if (n->type != LHT_TEXT) + break; + if (!(mask & 1)) + continue; + gen_accel(&s, km, n->data.text.value, &cnt, sep); + } + } + default:; + } + return s.array; +} + + int hid_cfg_keys_input(hid_cfg_keys_t *km, hid_cfg_mod_t mods, unsigned short int key_char, hid_cfg_keyseq_t **seq, int *seq_len) { hid_cfg_keyseq_t *ns; Index: trunk/src/hid_cfg_input.h =================================================================== --- trunk/src/hid_cfg_input.h (revision 1565) +++ trunk/src/hid_cfg_input.h (revision 1566) @@ -77,6 +77,11 @@ on error. */ unsigned short int (*translate_key)(char *desc, int len); + /* convert a key_char to human readable name, copy the string to out/out_len. + Return 0 on success. */ + int (*key_name)(unsigned short int key_char, char *out, int out_len); + + int auto_chr; /* if non-zero: don't call translate_key() for 1-char symbols, handle the default way */ const hid_cfg_keytrans_t *auto_tr; /* apply this table before calling translate_key() */ } hid_cfg_keys_t; @@ -107,6 +112,14 @@ int hid_cfg_keys_add_by_desc(hid_cfg_keys_t *km, const lht_node_t *keydesc, const lht_node_t *action_node, hid_cfg_keyseq_t **out_seq, int out_seq_len); int hid_cfg_keys_add_by_strdesc(hid_cfg_keys_t *km, const char *keydesc, const lht_node_t *action_node, hid_cfg_keyseq_t **out_seq, int out_seq_len); + +/* Allocate a new string and generate a human readable accel-text; mask determines + which keys on the list are generated (when multiple key sequences are + specified for the same action; from LSB to MSB, at most 32 keys) + Caller needs to free the string; returns NULL on error. + */ +char *hid_cfg_keys_gen_accel(hid_cfg_keys_t *km, const lht_node_t *keydescn, unsigned long mask, const char *sep); + /* Process next input key stroke. Seq and seq_len must not be NULL as they are the internal state of multi-key processing. Load seq array with pointers pointing to each key in the