1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

BFU UTF-8: select_button_by_key() folds the case of Unicode characters.

This causes the documented-slow cp2u() to be called in a loop, which
fortunately doesn't have very many iterations.  If this is too slow,
then cp2u() can be rewritten, or the hotkeys can be cached in struct
widget or struct widget_data.

Note that check_kbd_label_key() does not yet allow non-ASCII
characters when CONFIG_UTF_8 is defined.  Before they are allowed,
menu.c should also be updated.
This commit is contained in:
Kalle Olavi Niemitalo 2006-08-13 20:30:19 +03:00 committed by Kalle Olavi Niemitalo
parent c8584a1c7e
commit 4d80fe6453

View File

@ -285,16 +285,33 @@ select_button_by_flag(struct dialog_data *dlg_data, int flag)
static void static void
select_button_by_key(struct dialog_data *dlg_data) select_button_by_key(struct dialog_data *dlg_data)
{ {
#ifdef CONFIG_UTF_8
unicode_val_T key;
int codepage;
#else
unsigned char key; unsigned char key;
#endif
struct widget_data *widget_data; struct widget_data *widget_data;
struct term_event *ev = dlg_data->term_event; struct term_event *ev = dlg_data->term_event;
if (!check_kbd_label_key(ev)) return; if (!check_kbd_label_key(ev)) return;
#ifdef CONFIG_UTF_8
key = unicode_fold_label_case(get_kbd_key(ev));
codepage = get_opt_codepage_tree(dlg_data->win->term->spec, "charset");
#else
key = toupper(get_kbd_key(ev)); key = toupper(get_kbd_key(ev));
#endif
foreach_widget(dlg_data, widget_data) { foreach_widget(dlg_data, widget_data) {
int hk_pos; int hk_pos;
unsigned char *hk_ptr;
#ifdef CONFIG_UTF_8
unicode_val_T hk_char;
#else
unsigned char hk_char;
#endif
if (widget_data->widget->type != WIDGET_BUTTON) if (widget_data->widget->type != WIDGET_BUTTON)
continue; continue;
@ -303,16 +320,26 @@ select_button_by_key(struct dialog_data *dlg_data)
* one else we fallback to first character in button * one else we fallback to first character in button
* name. */ * name. */
hk_pos = widget_data->widget->info.button.hotkey_pos; hk_pos = widget_data->widget->info.button.hotkey_pos;
if (hk_pos >= 0) { if (hk_pos >= 0)
if (toupper(widget_data->widget->text[hk_pos + 1]) != key) hk_ptr = &widget_data->widget->text[hk_pos + 1];
continue; else
} else { hk_ptr = widget_data->widget->text;
if (toupper(widget_data->widget->text[0]) != key)
continue;
}
select_dlg_item(dlg_data, widget_data); #ifdef CONFIG_UTF_8
break; if (is_cp_utf8(codepage))
hk_char = utf_8_to_unicode(&hk_ptr,
strchr(hk_ptr, '\0'));
else
hk_char = cp2u(codepage, *hk_ptr);
hk_char = unicode_fold_label_case(hk_char);
#else
hk_char = toupper(*hk_ptr);
#endif
if (hk_char == key) {
select_dlg_item(dlg_data, widget_data);
break;
}
} }
} }