/* * Call this function after dlg_register_window(), for the list of button * labels associated with the widget. * * Ensure that dlg_lookup_key() will not accidentally translate a key that * we would like to use for a button abbreviation to some other key, e.g., * h/j/k/l for navigation into a cursor key. Do this by binding the key * to itself. * * See dlg_char_to_button(). */ void dlg_register_buttons(WINDOW *win, const char *name, const char **buttons) { int n; LIST_BINDINGS *p; DLG_KEYS_BINDING *q; if (buttons == 0) return; for (n = 0; buttons[n] != 0; ++n) { int curses_key = dlg_button_to_char(buttons[n]); /* ignore multibyte characters */ if (curses_key >= KEY_MIN) continue; /* if it is not bound in the widget, skip it (no conflicts) */ if (!key_is_bound(win, name, curses_key, FALSE)) continue; #ifdef HAVE_RC_FILE /* if it is bound in the rc-file, skip it */ if (key_is_bound(0, name, curses_key, FALSE)) continue; #endif if ((p = dlg_calloc(LIST_BINDINGS, 1)) != 0) { if ((q = dlg_calloc(DLG_KEYS_BINDING, 2)) != 0) { q[0].is_function_key = 0; q[0].curses_key = curses_key; q[0].dialog_key = curses_key; q[1] = end_keys_binding; p->win = win; p->name = name; p->buttons = TRUE; p->binding = q; /* put these at the beginning, to override the widget's table */ p->link = all_bindings; all_bindings = p; } else { free(p); } } } }
/* * Given a list of button labels, and a character which may be the abbreviation * for one, find it, if it exists. An abbreviation will be the first character * which happens to be capitalized in the label. */ int dlg_char_to_button(int ch, const char **labels) { if (labels != 0) { int j; ch = (int) dlg_toupper(dlg_last_getc()); for (j = 0; labels[j] != 0; ++j) { int cmp = dlg_button_to_char(labels[j]); if (ch == cmp) { dlg_flush_getc(); return j; } } } return DLG_EXIT_UNKNOWN; }