diff -Nuarp server/menu.c server.HKEY/menu.c --- server/menu.c 2006-01-26 19:47:59.000000000 -0800 +++ server.HKEY/menu.c 2006-02-21 09:21:25.000000000 -0800 @@ -40,6 +40,13 @@ #include "widget.h" +#ifndef HKEY //hybrid keys +#include "shared/configfile.h" + +extern int hybrid_left_key; +extern int hybrid_right_key; +#endif //HKEY + extern Menu *custom_main_menu; /** Basicly a patched version of LL_GetByIndex() that ignores hidden @@ -565,12 +572,86 @@ return MENURESULT_ERROR; switch (token) { + case MENUTOKEN_LEFT: + if (!extended) + return MENURESULT_NONE; +#ifndef HKEY //hybrid key left + /* + * hybrid left key just fall through to menu key + */ + if (!hybrid_left_key) { + subitem = menu_get_subitem(menu, menu->data.menu.selector_pos); + if (subitem == NULL) + break; + switch (subitem->type) { + case MENUITEM_CHECKBOX: + /* note: this dangerous looking code works since + * CheckboxValue is an enum >= 0. */ + if (subitem->data.checkbox.allow_gray) { + subitem->data.checkbox.value = (subitem->data.checkbox.value - 1) % 3; + } + else { + subitem->data.checkbox.value = (subitem->data.checkbox.value - 1) % 2; + } + if (subitem->event_func) + subitem->event_func(subitem, MENUEVENT_UPDATE); + return MENURESULT_NONE; + case MENUITEM_RING: + /* ring: jump to the end if beginning is reached */ + subitem->data.ring.value = (subitem->data.ring.value < 1) + ? LL_Length(subitem->data.ring.strings) - 1 + : (subitem->data.ring.value - 1) % LL_Length(subitem->data.ring.strings); + if (subitem->event_func) + subitem->event_func(subitem, MENUEVENT_UPDATE); + return MENURESULT_NONE; + default: + break; + } + return MENURESULT_NONE; + } +#endif //HKEY case MENUTOKEN_MENU: subitem = menu_get_item_for_predecessor_check(menu); if (! subitem) return MENURESULT_ERROR; return menuitem_predecessor2menuresult( subitem->predecessor_id, MENURESULT_CLOSE); + case MENUTOKEN_RIGHT: +#ifndef HKEY //hybrid key right + /* + * hybrid right key just fall through to enter key + */ + if (!hybrid_right_key) { + if (!extended) /* Can you get a MENUTOKEN_RIGHT w/o a RightKey defined, this code maybe be unecessary */ + return MENURESULT_NONE; + + subitem = menu_get_subitem(menu, menu->data.menu.selector_pos); + if (subitem == NULL) + break; + switch (subitem->type) { + case MENUITEM_CHECKBOX: + if (subitem->data.checkbox.allow_gray) { + subitem->data.checkbox.value = (subitem->data.checkbox.value + 1) % 3; + } + else { + subitem->data.checkbox.value = (subitem->data.checkbox.value + 1) % 2; + } + if (subitem->event_func) + subitem->event_func(subitem, MENUEVENT_UPDATE); + return MENURESULT_NONE; + case MENUITEM_RING: + subitem->data.ring.value = (subitem->data.ring.value + 1) % LL_Length (subitem->data.ring.strings); + if (subitem->event_func) + subitem->event_func(subitem, MENUEVENT_UPDATE); + return MENURESULT_NONE; + case MENUITEM_MENU: + return MENURESULT_ENTER; + default: + break; + } + return MENURESULT_NONE; + } +#endif //HKEY case MENUTOKEN_ENTER: subitem = menu_get_subitem(menu, menu->data.menu.selector_pos); if (!subitem) @@ -615,6 +696,18 @@ menu->data.menu.scroll --; } else if (menu->data.menu.selector_pos == 0) { +#ifndef HKEY //hybrid key left + if (hybrid_left_key) { + /* + * If this menu has only checkbox's and/or rings + * need a key to get back from this menu on a 4 key pad + */ + subitem = menu_get_item_for_predecessor_check(menu); + if (subitem && ((subitem->type == MENUITEM_CHECKBOX) || (subitem->type == MENUITEM_RING))) + return menuitem_predecessor2menuresult( + subitem->predecessor_id, MENURESULT_CLOSE); + } +#endif // HKEY // wrap around to last menu entry menu->data.menu.selector_pos = menu_visible_item_count(menu) - 1; menu->data.menu.scroll = menu->data.menu.selector_pos + 2 - display_props->height; @@ -632,67 +725,6 @@ menu->data.menu.scroll = 0; } return MENURESULT_NONE; - case MENUTOKEN_LEFT: - if (!extended) - return MENURESULT_NONE; - - subitem = menu_get_subitem(menu, menu->data.menu.selector_pos); - if (subitem == NULL) - break; - switch (subitem->type) { - case MENUITEM_CHECKBOX: - /* note: this dangerous looking code works since - * CheckboxValue is an enum >= 0. */ - if (subitem->data.checkbox.allow_gray) { - subitem->data.checkbox.value = (subitem->data.checkbox.value - 1) % 3; - } - else { - subitem->data.checkbox.value = (subitem->data.checkbox.value - 1) % 2; - } - if (subitem->event_func) - subitem->event_func(subitem, MENUEVENT_UPDATE); - return MENURESULT_NONE; - case MENUITEM_RING: - /* ring: jump to the end if beginning is reached */ - subitem->data.ring.value = (subitem->data.ring.value < 1) - ? LL_Length(subitem->data.ring.strings) - 1 - : (subitem->data.ring.value - 1) % LL_Length(subitem->data.ring.strings); - if (subitem->event_func) - subitem->event_func(subitem, MENUEVENT_UPDATE); - return MENURESULT_NONE; - default: - break; - } - return MENURESULT_NONE; - case MENUTOKEN_RIGHT: - if (!extended) - return MENURESULT_NONE; - - subitem = menu_get_subitem(menu, menu->data.menu.selector_pos); - if (subitem == NULL) - break; - switch (subitem->type) { - case MENUITEM_CHECKBOX: - if (subitem->data.checkbox.allow_gray) { - subitem->data.checkbox.value = (subitem->data.checkbox.value + 1) % 3; - } - else { - subitem->data.checkbox.value = (subitem->data.checkbox.value + 1) % 2; - } - if (subitem->event_func) - subitem->event_func(subitem, MENUEVENT_UPDATE); - return MENURESULT_NONE; - case MENUITEM_RING: - subitem->data.ring.value = (subitem->data.ring.value + 1) % LL_Length(subitem->data.ring.strings); - if (subitem->event_func) - subitem->event_func(subitem, MENUEVENT_UPDATE); - return MENURESULT_NONE; - case MENUITEM_MENU: - return MENURESULT_ENTER; - default: - break; - } - return MENURESULT_NONE; case MENUTOKEN_OTHER: /* TODO: move to the selected number and enter it */ return MENURESULT_NONE; diff -Nuarp server/menuitem.c server.HKEY/menuitem.c --- server/menuitem.c 2006-01-26 19:47:59.000000000 -0800 +++ server.HKEY/menuitem.c 2006-02-21 09:22:53.000000000 -0800 @@ -84,6 +84,10 @@ const IpSstringProperties IPinfo[] = { { 39, ':', 16, 4, 65535, { 4096, 256, 16, 1, 0 }, "%04x", verify_ipv6, "0:0:0:0:0:0:0:0" } }; +#ifndef HKEY // hybrid keys +extern int hybrid_left_key; +extern int hybrid_right_key; +#endif //HKEY /******** MENU UTILITY FUNCTIONS ********/ @@ -983,26 +987,38 @@ MenuResult menuitem_process_input_slider return MENURESULT_ERROR; switch (token) { - case MENUTOKEN_MENU: - return menuitem_predecessor2menuresult( - item->predecessor_id, MENURESULT_CLOSE); - case MENUTOKEN_ENTER: - return menuitem_successor2menuresult( - item->successor_id, MENURESULT_CLOSE); case MENUTOKEN_UP: case MENUTOKEN_RIGHT: - item->data.slider.value = min(item->data.slider.maxvalue, +#ifndef HKEY //hybrid key right + if (!hybrid_right_key || token == MENUTOKEN_UP) { +#endif /*HKEY*/ + item->data.slider.value = min(item->data.slider.maxvalue, item->data.slider.value + item->data.slider.stepsize); - if (item->event_func) - item->event_func(item, MENUEVENT_PLUS); - return MENURESULT_NONE; + if (item->event_func) + item->event_func(item, MENUEVENT_PLUS); + return MENURESULT_NONE; +#ifndef HKEY //hybrid key right + } /* hybrid right key fall through to enter */ +#endif /*HKEY*/ + case MENUTOKEN_ENTER: + return menuitem_successor2menuresult( + item->successor_id, MENURESULT_CLOSE); case MENUTOKEN_DOWN: case MENUTOKEN_LEFT: - item->data.slider.value = max(item->data.slider.minvalue, +#ifndef HKEY //hybrid key left + if (!hybrid_left_key || token == MENUTOKEN_DOWN) { +#endif /*HKEY*/ + item->data.slider.value = max(item->data.slider.minvalue, item->data.slider.value - item->data.slider.stepsize); - if (item->event_func) - item->event_func(item, MENUEVENT_MINUS); - return MENURESULT_NONE; + if (item->event_func) + item->event_func(item, MENUEVENT_MINUS); + return MENURESULT_NONE; +#ifndef HKEY //hybrid key left + } /* hybrid left key fall through to menu */ +#endif /*HKEY*/ + case MENUTOKEN_MENU: + return menuitem_predecessor2menuresult( + item->predecessor_id, MENURESULT_CLOSE); case MENUTOKEN_OTHER: default: break; @@ -1037,6 +1053,21 @@ MenuResult menuitem_process_input_numeri item->data.numeric.error_code = 0; switch (token) { + case MENUTOKEN_LEFT: + /* The user wants to go to back a digit */ + if (pos > 0) { + item->data.numeric.edit_pos--; + if (item->data.numeric.edit_offs > item->data.numeric.edit_pos) + item->data.numeric.edit_offs = item->data.numeric.edit_pos; +#ifndef HKEY //hybrid key left + if( hybrid_left_key ) return MENURESULT_NONE; + } + if( !hybrid_left_key ) return MENURESULT_NONE; + /* fall through to MENU */ +#else + } + return MENURESULT_NONE; +#endif /*HKEY*/ case MENUTOKEN_MENU: if (pos == 0) { return menuitem_predecessor2menuresult( @@ -1047,6 +1078,21 @@ MenuResult menuitem_process_input_numeri menuitem_reset_numeric(item); } return MENURESULT_NONE; + case MENUTOKEN_RIGHT: + /* The user wants to go to next digit */ + if (str[pos] != '\0' && pos < max_len) { + item->data.numeric.edit_pos++; + if (pos >= display_props->width - 2) + item->data.numeric.edit_offs++; +#ifndef HKEY //hybrid key right + if( hybrid_right_key ) return MENURESULT_NONE; + } + if( !hybrid_right_key ) return MENURESULT_NONE; + /* fall through to ENTER */ +#else + } + return MENURESULT_NONE; +#endif /*HKEY*/ case MENUTOKEN_ENTER: if ((extended) || (str[pos] == '\0')) { int value; @@ -1131,22 +1177,6 @@ MenuResult menuitem_process_input_numeri } } return MENURESULT_NONE; - case MENUTOKEN_RIGHT: - /* The user wants to go to next digit */ - if (str[pos] != '\0' && pos < max_len) { - item->data.numeric.edit_pos++; - if (pos >= display_props->width - 2) - item->data.numeric.edit_offs++; - } - return MENURESULT_NONE; - case MENUTOKEN_LEFT: - /* The user wants to go to back a digit */ - if (pos > 0) { - item->data.numeric.edit_pos--; - if (item->data.numeric.edit_offs > item->data.numeric.edit_pos) - item->data.numeric.edit_offs = item->data.numeric.edit_pos; - } - return MENURESULT_NONE; case MENUTOKEN_OTHER: if (pos >= max_len) { /* We're not allowed to add anything anymore */ @@ -1196,6 +1226,21 @@ MenuResult menuitem_process_input_alpha item->data.alpha.error_code = 0; switch (token) { + case MENUTOKEN_LEFT: + /* The user wants to go to back a digit */ + if (pos > 0) { + item->data.alpha.edit_pos--; + if (item->data.alpha.edit_offs > item->data.alpha.edit_pos) + item->data.alpha.edit_offs = item->data.alpha.edit_pos; +#ifndef HKEY //hybrid key left + if( hybrid_left_key ) return MENURESULT_NONE; + } + if( !hybrid_left_key ) return MENURESULT_NONE; + /* fall through to MENU */ +#else + } + return MENURESULT_NONE; +#endif /*HKEY*/ case MENUTOKEN_MENU: if (pos == 0) { return menuitem_predecessor2menuresult( @@ -1206,6 +1251,22 @@ MenuResult menuitem_process_input_alpha menuitem_reset_alpha(item); } return MENURESULT_NONE; + case MENUTOKEN_RIGHT: + /* The user wants to go to next digit */ + if (str[item->data.alpha.edit_pos] != '\0' && + pos < item->data.alpha.maxlength - 1) { + item->data.alpha.edit_pos++; + if (pos >= display_props->width - 2) + item->data.alpha.edit_offs++; +#ifndef HKEY //hybrid key right + if( hybrid_right_key ) return MENURESULT_NONE; + } + if( !hybrid_right_key ) return MENURESULT_NONE; + /* fall through to ENTER */ +#else + } + return MENURESULT_NONE; +#endif /*HKEY*/ case MENUTOKEN_ENTER: if ((extended) || (str[item->data.alpha.edit_pos] == '\0')) { /* The user completed his input */ @@ -1278,23 +1339,6 @@ MenuResult menuitem_process_input_alpha } } return MENURESULT_NONE; - case MENUTOKEN_RIGHT: - /* The user wants to go to next digit */ - if (str[item->data.alpha.edit_pos] != '\0' && - pos < item->data.alpha.maxlength - 1) { - item->data.alpha.edit_pos++; - if (pos >= display_props->width - 2) - item->data.alpha.edit_offs++; - } - return MENURESULT_NONE; - case MENUTOKEN_LEFT: - /* The user wants to go to back a digit */ - if (pos > 0) { - item->data.alpha.edit_pos--; - if (item->data.alpha.edit_offs > item->data.alpha.edit_pos) - item->data.alpha.edit_offs = item->data.alpha.edit_pos; - } - return MENURESULT_NONE; case MENUTOKEN_OTHER: if (pos >= item->data.alpha.maxlength) { /* We're not allowed to add anything anymore */ @@ -1333,7 +1377,24 @@ MenuResult menuitem_process_input_ip (Me item->data.ip.error_code = 0; switch (token) { - case MENUTOKEN_MENU: + case MENUTOKEN_LEFT: + /* The user wants to go to back a digit */ + if (pos > 0) { + item->data.ip.edit_pos--; + if (str[item->data.ip.edit_pos] == ipinfo->sep) + item->data.ip.edit_pos--; + if (item->data.ip.edit_offs > item->data.ip.edit_pos) + item->data.ip.edit_offs = item->data.ip.edit_pos; +#ifndef HKEY //hybrid key left + if( hybrid_left_key ) return MENURESULT_NONE; + } + if( !hybrid_left_key ) return MENURESULT_NONE; + /* fall through to MENU */ +#else + } + return MENURESULT_NONE; +#endif /*HKEY*/ + case MENUTOKEN_MENU: if (pos == 0) { return menuitem_predecessor2menuresult( item->predecessor_id, MENURESULT_CLOSE); @@ -1343,6 +1404,22 @@ MenuResult menuitem_process_input_ip (Me menuitem_reset_ip(item); } return MENURESULT_NONE; + case MENUTOKEN_RIGHT: + if (pos < item->data.ip.maxlength - 1) { + item->data.ip.edit_pos++; + if (str[item->data.ip.edit_pos] == ipinfo->sep) + item->data.ip.edit_pos++; + while (item->data.ip.edit_pos - item->data.ip.edit_offs > display_props->width - 2) + item->data.ip.edit_offs++; +#ifndef HKEY //hybrid key right + if( hybrid_right_key ) return MENURESULT_NONE; + } + if( !hybrid_right_key ) return MENURESULT_NONE; + /* fall through to ENTER */ +#else + } + return MENURESULT_NONE; +#endif /*HKEY*/ case MENUTOKEN_ENTER: if (extended || (pos >= item->data.ip.maxlength - 1)) { // remove the leading spaces/zeros in each octet-representing string @@ -1409,25 +1486,6 @@ MenuResult menuitem_process_input_ip (Me snprintf(numstr, 5, ipinfo->format, num); memcpy(&str[pos - (pos % (ipinfo->width + 1))], numstr, ipinfo->width); return MENURESULT_NONE; - case MENUTOKEN_RIGHT: - if (pos < item->data.ip.maxlength - 1) { - item->data.ip.edit_pos++; - if (str[item->data.ip.edit_pos] == ipinfo->sep) - item->data.ip.edit_pos++; - while (item->data.ip.edit_pos - item->data.ip.edit_offs > display_props->width - 2) - item->data.ip.edit_offs++; - } - return MENURESULT_NONE; - case MENUTOKEN_LEFT: - /* The user wants to go to back a digit */ - if (pos > 0) { - item->data.ip.edit_pos--; - if (str[item->data.ip.edit_pos] == ipinfo->sep) - item->data.ip.edit_pos--; - if (item->data.ip.edit_offs > item->data.ip.edit_pos) - item->data.ip.edit_offs = item->data.ip.edit_pos; - } - return MENURESULT_NONE; case MENUTOKEN_OTHER: /* process other keys */ if ((strlen(key) == 1) && diff -Nuarp server/menuscreens.c server.HKEY/menuscreens.c --- server/menuscreens.c 2006-01-26 19:47:59.000000000 -0800 +++ server.HKEY/menuscreens.c 2006-02-21 09:33:21.000000000 -0800 @@ -48,6 +48,15 @@ char *left_key; char *right_key; +#ifndef HKEY //hybrid keys +/* + * hybrid left becomes menu key at left edge of screen + * hybrid right becomes enter key at right edge of screen + */ +int hybrid_left_key = 0; +int hybrid_right_key = 0; +#endif //HKEY + Screen *menuscreen = NULL; MenuItem *active_menuitem = NULL; /** the "real" main_menu */ @@ -91,6 +100,10 @@ if (tmp) right_key = strdup(tmp); +#ifndef HKEY //get hybrid keys from config file + hybrid_right_key = config_get_bool("menu", "HybridRightKey", 0, 0); + hybrid_left_key = config_get_bool("menu", "HybridLeftKey", 0, 0); +#endif /* Now reserve keys */ input_reserve_key(menu_key, true, NULL); @@ -186,6 +199,11 @@ bool is_menu_key(const char *key) { +#ifndef HKEY //hybrid keys, any key wake-up menus + /* any key wakes up menus */ + if (key && (hybrid_left_key || hybrid_right_key)) + return true; +#endif //HKEY if (menu_key && key && strcmp(key, menu_key) == 0) return true; else