static int file_list_handle_key(struct key_event * k) { int new_file = current_file; new_file = CLAMP(new_file, 0, flist.num_files - 1); if (k->mouse != MOUSE_NONE) { if (k->x >= 6 && k->x <= 67 && k->y >= 13 && k->y <= 47) { slash_search_mode = -1; if (k->mouse == MOUSE_SCROLL_UP) { new_file -= MOUSE_SCROLL_LINES; } else if (k->mouse == MOUSE_SCROLL_DOWN) { new_file += MOUSE_SCROLL_LINES; } else { new_file = top_file + (k->y - 13); } } } else if (slash_search_mode > -1) { int c = unicode_to_ascii(k->unicode); if (k->sym == SDLK_RETURN || k->sym == SDLK_ESCAPE) { if (k->state == KEY_PRESS) return 1; slash_search_mode = -1; status.flags |= NEED_UPDATE; return 1; } else if (k->sym == SDLK_BACKSPACE) { if (k->state == KEY_RELEASE) return 1; slash_search_mode--; status.flags |= NEED_UPDATE; reposition_at_slash_search(); return 1; } else if (c >= 32) { if (k->state == KEY_RELEASE) return 1; if (slash_search_mode < PATH_MAX) { slash_search_str[ slash_search_mode ] = c; slash_search_mode++; reposition_at_slash_search(); status.flags |= NEED_UPDATE; } return 1; } } switch (k->sym) { case SDLK_UP: new_file--; slash_search_mode = -1; break; case SDLK_DOWN: new_file++; slash_search_mode = -1; break; case SDLK_PAGEUP: new_file -= 35; slash_search_mode = -1; break; case SDLK_PAGEDOWN: new_file += 35; slash_search_mode = -1; break; case SDLK_HOME: new_file = 0; slash_search_mode = -1; break; case SDLK_END: new_file = flist.num_files - 1; slash_search_mode = -1; break; case SDLK_RETURN: if (k->state == KEY_PRESS) return 0; handle_enter_key(); slash_search_mode = -1; return 1; case SDLK_DELETE: if (k->state == KEY_RELEASE) return 1; slash_search_mode = -1; if (flist.num_files > 0) dialog_create(DIALOG_OK_CANCEL, "Delete file?", do_delete_file, NULL, 1, NULL); return 1; case SDLK_ESCAPE: slash_search_mode = -1; if (k->state == KEY_RELEASE && NO_MODIFIER(k->mod)) set_page(PAGE_INSTRUMENT_LIST); return 1; case SDLK_SLASH: if (k->orig_sym == SDLK_SLASH) { if (status.flags & CLASSIC_MODE) return 0; if (k->state == KEY_RELEASE) return 0; slash_search_mode = 0; status.flags |= NEED_UPDATE; return 1; } default: if (k->mouse == MOUSE_NONE) return 0; } if (k->mouse == MOUSE_CLICK) { if (k->state == KEY_RELEASE) return 0; } else if (k->mouse == MOUSE_DBLCLICK) { handle_enter_key(); return 1; } else { if (k->state == KEY_PRESS) return 0; } new_file = CLAMP(new_file, 0, flist.num_files - 1); if (new_file < 0) new_file = 0; if (new_file != current_file) { current_file = new_file; file_list_reposition(); status.flags |= NEED_UPDATE; } return 1; }
// Wait for input from user, quit if recieved 'q' keypress void Menu::get_keyboard_input() { while (! dying) { // Check if we need to resize window display if (is_term_resized(screen_lines, screen_cols)) { reframe_resized_window(); } // Check if we need to update content (i.e. been longer than 5 seconds) std::chrono::steady_clock::time_point current_time = std::chrono::steady_clock::now(); if (current_time > (last_update + std::chrono::seconds(5))) { get_lines(); } // Update window display after each key press print_window(); // This is blocking ch = getch(); switch(ch) { case KEY_UP: case 'k': move_cursor_up(); break; case KEY_DOWN: case 'j': move_cursor_down(); break; case KEY_LEFT: case 'h': move_cursor_left(); break; case KEY_RIGHT: case 'l': move_cursor_right(); break; case 'q': endwin(); dying = true; break; case KEY_PPAGE: handle_page_up(); break; case KEY_NPAGE: handle_page_down(); break; case KEY_HOME: handle_home(); break; case KEY_END: handle_end(); break; case KEY_ENTER: case 10: case 13: handle_enter_key(); break; default: // Uncoded key, ignore break; } } }