/* converts libfdisk FDISK_ASKTYPE_MENU to cfdisk menu and returns user's * responseback to libfdisk */ static int ask_menu(struct fdisk_ask *ask, struct cfdisk *cf) { struct cfdisk_menuitem *d, *cm; int key; size_t i = 0, nitems; const char *name, *desc; assert(ask); assert(cf); /* create cfdisk menu according to libfdisk ask-menu, note that the * last cm[] item has to be empty -- so nitems + 1 */ nitems = fdisk_ask_menu_get_nitems(ask); cm = xcalloc(nitems + 1, sizeof(struct cfdisk_menuitem)); for (i = 0; i < nitems; i++) { if (fdisk_ask_menu_get_item(ask, i, &key, &name, &desc)) break; cm[i].key = key; cm[i].desc = desc; cm[i].name = name; } /* make the new menu active */ menu_push(cf, cm); ui_draw_menu(cf); refresh(); /* wait for keys */ do { int key = getch(); if (ui_resize) ui_menu_resize(cf); if (ui_menu_move(cf, key) == 0) continue; switch (key) { case KEY_ENTER: case '\n': case '\r': d = menu_get_menuitem(cf, cf->menu->idx); if (d) fdisk_ask_menu_set_result(ask, d->key); menu_pop(cf); free(cm); return 0; } } while (1); menu_pop(cf); free(cm); return -1; }
int menu_button_handler(unsigned char MsgOptions) { char refresh = 0; if(menu_current() == app_menu) { tHostMsg* pOutgoingMsg; app_menu = NULL; BPL_AllocMessageBuffer(&pOutgoingMsg); pOutgoingMsg->Type = IdleUpdate; RouteMsg(&pOutgoingMsg); } else { if(MsgOptions < MENU_ITEMS) { refresh = menu_handle_button(&(menu_current()->items[MsgOptions])); } else if(MsgOptions == MENU_BUTTON_EXIT) { if(istop()) { tHostMsg* pOutgoingMsg; /* Only save stuff if it's been changed */ /* save all of the non-volatile items */ // FIXME SAVE STUFF!! //BPL_AllocMessageBuffer(&pOutgoingMsg); //pOutgoingMsg->Type = PariringControlMsg; //pOutgoingMsg->Options = PAIRING_CONTROL_OPTION_SAVE_SPP; //RouteMsg(&pOutgoingMsg); //SaveLinkAlarmEnable(); //SaveRstNmiConfiguration(); //SaveIdleBufferInvert(); //SaveDisplaySeconds(); //SaveTimeFormat(); /* go back to the normal idle screen */ BPL_AllocMessageBuffer(&pOutgoingMsg); pOutgoingMsg->Type = IdleUpdate; RouteMsg(&pOutgoingMsg); } else { menu_pop(); refresh = 1; } } } return refresh; }
void menu_handle_joystick(uint8_t key) { uint8_t menu_line[MLINESIZE+1]; //////////////////////////////////////// // Scrolling up/down. if(key == KEY_DOWN || key == KEY_UP) { menu_setbg(menu_curitem); lcd_putchar(menu_curitem-menu_topitem+1, ' '); uint8_t insert_line = 0; if(key == KEY_DOWN) { if(menu_curitem == menu_nitems-1) menu_curitem = 0; else menu_curitem++; if(menu_curitem - menu_topitem >= BODY_LINES) { menu_topitem++; insert_line = 9; } } if(key == KEY_UP) { if(menu_curitem == 0) menu_curitem = menu_nitems-1; else menu_curitem--; if(menu_topitem > menu_curitem) { menu_topitem--; insert_line = 10; } } menu_setbg(menu_curitem); if(insert_line) { uint8_t dpybuf[17]; menu_get_line(menu_item_offset[menu_curitem], menu_line, sizeof(menu_line)); menu_getlineword(1, menu_line, dpybuf+1, sizeof(dpybuf)-1); dpybuf[0] = ' '; lcd_putline(insert_line, (char *)dpybuf); } lcd_putchar(menu_curitem-menu_topitem+1, '>'); } //////////////////////////////////////// // Exec current command if(key == KEY_RIGHT) { // Save the current position menu_lastsel[menu_stack[menu_stackidx-1]] = menu_curitem; menu_get_line(menu_item_offset[menu_curitem], menu_line, sizeof(menu_line)); uint8_t arg[MLINESIZE]; menu_getlineword(2, menu_line, arg, sizeof(arg)); if(menu_line[0] == 'S') { // submenu uint8_t sm; fromhex((char *)arg, &sm, 1); menu_push(sm); } if(menu_line[0] == 'C') { // Command lcd_invon(); callfn((char *)arg); lcd_invoff(); } if(menu_line[0] == 'm') { // Macro uint8_t idx; uint16_t off; lcd_invon(); fromhex((char *)arg, &idx, 1); off = menu_get_line(menu_offset[idx], menu_line, sizeof(menu_line)); while(off && menu_line[0]) { off = menu_get_line(off, menu_line, sizeof(menu_line)); if(off == 0 || !menu_line[0]) break; callfn((char *)menu_line); } lcd_invoff(); } } if(key == KEY_LEFT) { // pop menu stack // Save the current position menu_lastsel[menu_stack[menu_stackidx-1]] = menu_curitem; menu_pop(); } //////////////////////////////////////// // Switch display on / off if(key == KEY_ENTER) { if(lcd_on) { if(lcd_on == 0xff) { lcd_switch(1); lcd_cls(); lcd_contrast(0xfc); menu_stackidx = 0; menu_push(0); } else { dosleep(); } } else { lcd_switch(1); } bat_drawstate(); } }