Index: src_plugins/hid_gtk/ghid-main-menu.c =================================================================== --- src_plugins/hid_gtk/ghid-main-menu.c (revision 1566) +++ src_plugins/hid_gtk/ghid-main-menu.c (revision 1567) @@ -62,19 +62,16 @@ gchar mnemonic = 0; int j; GtkAction *action = NULL; - const gchar *accel = NULL; + const char *accel = NULL; char *menu_label; lht_node_t *n_action = hid_cfg_menu_field(sub_res, MF_ACTION, NULL); lht_node_t *n_keydesc = hid_cfg_menu_field(sub_res, MF_ACCELERATOR, NULL); /* Resolve accelerator and save it */ - tmp_val = hid_cfg_menu_field_str(sub_res, MF_ACCELERATOR); - if (tmp_val != NULL) { - assert(node != NULL); + if (n_keydesc != NULL) { if (n_action != NULL) { hid_cfg_keys_add_by_desc(&ghid_keymap, n_keydesc, n_action, NULL, 0); -#warning TODO: this has to be a functio that respects lists - accel = tmp_val; + accel = hid_cfg_keys_gen_accel(&ghid_keymap, n_keydesc, 1, NULL); } else hid_cfg_error(sub_res, "No action specified for key accel\n"); @@ -149,6 +146,7 @@ else { /* NORMAL ITEM */ GtkWidget *item = gtk_menu_item_new_gschem(menu_label, accel); + accel = NULL; gtk_menu_shell_append(shell, item); sub_res->user_data = item; g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(menu->action_cb), (gpointer)n_action); @@ -169,6 +167,10 @@ sub_res->user_data = item; } + /* unused accel key - generated, but never stored, time to free it */ + if (accel != NULL) + free(accel); + return action; } Index: src_plugins/hid_gtk/gui-top-window.c =================================================================== --- src_plugins/hid_gtk/gui-top-window.c (revision 1566) +++ src_plugins/hid_gtk/gui-top-window.c (revision 1567) @@ -1500,6 +1500,15 @@ return key; } +int ghid_key_name(unsigned short int key_char, char *out, int out_len) +{ + char *name = gdk_keyval_name(key_char); + if (name == NULL) + return -1; + strncpy(out, name, out_len); + out[out_len-1] = '\0'; + return 0; +} void ghid_do_export(HID_Attr_Val * options) { @@ -1507,6 +1516,7 @@ hid_cfg_keys_init(&ghid_keymap); ghid_keymap.translate_key = ghid_translate_key; + ghid_keymap.key_name = ghid_key_name; ghid_keymap.auto_chr = 1; ghid_keymap.auto_tr = hid_cfg_key_default_trans; Index: src_plugins/hid_lesstif/main.c =================================================================== --- src_plugins/hid_lesstif/main.c (revision 1566) +++ src_plugins/hid_lesstif/main.c (revision 1567) @@ -1695,6 +1695,15 @@ return key; } +int lesstif_key_name(unsigned short int key_char, char *out, int out_len) +{ + char *name = XKeysymToString(key_char); + if (name == NULL) + return -1; + strncpy(out, name, out_len); + out[out_len-1] = '\0'; + return 0; +} extern Widget lesstif_menubar; @@ -1710,6 +1719,7 @@ hid_cfg_keys_init(&lesstif_keymap); lesstif_keymap.translate_key = lesstif_translate_key; + lesstif_keymap.key_name = lesstif_key_name; lesstif_keymap.auto_chr = 1; lesstif_keymap.auto_tr = hid_cfg_key_default_trans; Index: src_plugins/hid_lesstif/menu.c =================================================================== --- src_plugins/hid_lesstif/menu.c (revision 1566) +++ src_plugins/hid_lesstif/menu.c (revision 1567) @@ -806,9 +806,9 @@ static void add_res2menu_named(Widget menu, lht_node_t *node, XtCallbackProc callback, int level) { - const char *v, *r; + const char *v; Widget sub, btn = NULL; - lht_node_t *act; + lht_node_t *act, *kacc; stdarg_n = 0; v = hid_cfg_menu_field_str(node, MF_FOREGROUND); @@ -832,12 +832,16 @@ if (v != NULL) stdarg(XmNmnemonic, v); - r = hid_cfg_menu_field_str(node, MF_ACCELERATOR); - if (r != NULL) { - XmString as = XmStringCreatePCB(strdup(r)); - stdarg(XmNacceleratorText, as); - /*stdarg(XmNaccelerator, r->v[1].value); */ -#warning TODO: pass lht_node_t here, build the string from the transformed variant above + kacc = hid_cfg_menu_field(node, MF_ACCELERATOR, NULL); + if (kacc != NULL) { + char *acc_str = hid_cfg_keys_gen_accel(&lesstif_keymap, kacc, 1, NULL); + + if (acc_str != NULL) { + XmString as = XmStringCreatePCB(acc_str); + stdarg(XmNacceleratorText, as); + } + +#warning TODO: remove this call note_accelerator(node); }