static int itunes_do_keystroke(GR_EVENT * event) { int ret = 0; struct menulist *oldml; switch (event->type) { case GR_EVENT_TYPE_TIMER: menu_draw_timer(currentml->itunes_menu); break; case GR_EVENT_TYPE_KEY_DOWN: switch (event->keystroke.ch) { case '\r': /* action key */ case '\n': currentml->select(currentml); break; case 'm': /* menu key */ ret = 1; pz_close_window(currentml->wid); oldml = currentml; currentml->itunes_menu = menu_destroy(currentml->itunes_menu); currentml = currentml->prevml; free(oldml); if (currentml) itunes_draw(currentml); break; case 'r': if(currentml->get_next(currentml)) { menu_shift_selected(currentml->itunes_menu, 1); itunes_do_draw(); ret |= KEY_CLICK; } break; case 'l': if(currentml->get_prev(currentml)) { menu_shift_selected(currentml->itunes_menu, -1); itunes_do_draw(); ret |= KEY_CLICK; } break; } break; } return ret; }
/* removes the referenced item from the menu */ void menu_delete_item(menu_st *menulist, int num) { int i, tmp; /* if num is off the end either way, do nothing */ if(num > menulist->num_items - 1 || num < 0) { Dprintf("menu_delete_item::Invalid item\n"); return; } if(menulist->alloc_items == 0) { Dprintf("menu_delete_item::Deleting from a static menu causes " "undefined behavior\n"); return; } /* assume removed item is onscreen */ tmp = menulist->pixmap_pos[num-menulist->top_item]; for(i = 0; i < (menulist->screen_items-(num-menulist->top_item))-1; i++) { menulist->pixmap_pos[(num-menulist->top_item) + i] = menulist->pixmap_pos[(num-menulist->top_item) + (i+1)]; menu_draw_item(menulist, num-menulist->top_item + i); } menulist->pixmap_pos[menulist->screen_items - 1] = tmp; /* actually remove the item */ for(i = num; i < menulist->num_items - 1; i++) menulist->items[i] = menulist->items[i + 1]; menulist->num_items--; /* if last item was selected, shift selected */ if(menulist->sel == menulist->num_items) menu_shift_selected(menulist, -1); /* erase pixmaps that are off the bottom of the list */ if(menulist->top_item + (menulist->screen_items - 1) > menulist->num_items - 1) menu_clear_pixmap(menulist, menulist->screen_items - 1); /* draw appropriate text to the bottom pixmap */ else menu_retext_pixmap(menulist, menulist->screen_items - 1, &menulist->items[menulist->top_item + (menulist->screen_items - 1)]); /* specify if scrollbar should draw */ if(menulist->num_items <= menulist->screen_items) menulist->scrollbar = 0; }
static int browser_do_keystroke(GR_EVENT * event) { int ret = 0; switch(event->type) { case GR_EVENT_TYPE_TIMER: if(((GR_EVENT_TIMER *)event)->tid == browser_key_timer) { GrDestroyTimer(browser_key_timer); browser_key_timer = 0; menu_handle_timer(browser_menu, 1); browser_action(browser_menu->items[browser_menu->sel].orig_pos); browser_do_draw(); } else menu_draw_timer(browser_menu); break; case GR_EVENT_TYPE_KEY_DOWN: switch (event->keystroke.ch) { case '\r': case '\n': if(browser_menu->parent == NULL) browser_key_timer = GrCreateTimer(browser_wid, 500); else { menu_handle_timer(browser_menu, 1); browser_menu = menu_handle_item(browser_menu, browser_menu->sel); if(browser_menu_overlay) { browser_menu = browser_menu_overlay; browser_menu_overlay = 0; } browser_do_draw(); } break; case 'm': case 'q': browser_menu = menu_destroy(browser_menu); ret |= KEY_CLICK; if(browser_menu != NULL) { browser_do_draw(); break; } browser_exit(); GrDestroyGC(browser_gc); pz_close_window(browser_wid); break; case 'r': if (menu_shift_selected(browser_menu, 1)) { menu_draw(browser_menu); ret |= KEY_CLICK; } break; case 'l': if (menu_shift_selected(browser_menu, -1)) { menu_draw(browser_menu); ret |= KEY_CLICK; } break; default: ret |= KEY_UNUSED; } break; case GR_EVENT_TYPE_KEY_UP: switch (event->keystroke.ch) { case '\r': case '\n': if(browser_key_timer) { GrDestroyTimer(browser_key_timer); browser_key_timer = 0; menu_handle_timer(browser_menu, 1); browser_selection_activated(browser_menu->items[browser_menu->sel].orig_pos); browser_do_draw(); } break; } break; default: ret |= EVENT_UNUSED; break; } return ret; }