X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_find.c;h=b838421f4f94eadae78b382a7f086ec656f44925;hb=HEAD;hp=0e93b4ff2f96d4b3aeddbc66b092c9f63ad8e9a1;hpb=b398de1a003fafd0b140dbe82f543f515102fed4;p=ncmpc.git diff --git a/src/screen_find.c b/src/screen_find.c index 0e93b4f..b838421 100644 --- a/src/screen_find.c +++ b/src/screen_find.c @@ -1,5 +1,5 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2009 The Music Player Daemon Project + * (c) 2004-2017 The Music Player Daemon Project * Project homepage: http://musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -19,8 +19,9 @@ #include "screen_find.h" #include "screen_utils.h" -#include "screen_message.h" +#include "screen_status.h" #include "screen.h" +#include "keyboard.h" #include "i18n.h" #include "options.h" #include "ncmpc.h" @@ -30,22 +31,18 @@ #define JUMP_PROMPT _("Jump") /* query user for a string and find it in a list window */ -int -screen_find(struct list_window *lw, - int rows, - command_t findcmd, +bool +screen_find(struct list_window *lw, command_t findcmd, list_window_callback_fn_t callback_fn, void *callback_data) { - int reversed = 0; bool found; const char *prompt = FIND_PROMPT; - char *value = options.find_show_last_pattern ? (char *) -1 : NULL; - if (findcmd == CMD_LIST_RFIND || findcmd == CMD_LIST_RFIND_NEXT) { + const bool reversed = + findcmd == CMD_LIST_RFIND || findcmd == CMD_LIST_RFIND_NEXT; + if (reversed) prompt = RFIND_PROMPT; - reversed = 1; - } switch (findcmd) { case CMD_LIST_FIND: @@ -53,16 +50,19 @@ screen_find(struct list_window *lw, if (screen.findbuf) { g_free(screen.findbuf); screen.findbuf=NULL; - } - /* continue... */ + } + /* fall through */ case CMD_LIST_FIND_NEXT: case CMD_LIST_RFIND_NEXT: - if (!screen.findbuf) + if (!screen.findbuf) { + char *value = options.find_show_last_pattern + ? (char *) -1 : NULL; screen.findbuf=screen_readln(prompt, value, &screen.find_history, NULL); + } if (screen.findbuf == NULL) return 1; @@ -72,8 +72,7 @@ screen_find(struct list_window *lw, callback_fn, callback_data, screen.findbuf, options.find_wrap, - options.bell_on_wrap, - rows) + options.bell_on_wrap) : list_window_find(lw, callback_fn, callback_data, screen.findbuf, @@ -95,13 +94,11 @@ screen_find(struct list_window *lw, * which begins with this string while the users types */ void screen_jump(struct list_window *lw, - list_window_callback_fn_t callback_fn, - void *callback_data) + list_window_callback_fn_t callback_fn, void *callback_data, + list_window_paint_callback_t paint_callback, void *paint_data) { - char *search_str, *iter; const int WRLN_MAX_LINE_SIZE = 1024; int key = 65; - command_t cmd; if (screen.findbuf) { g_free(screen.findbuf); @@ -110,36 +107,43 @@ screen_jump(struct list_window *lw, screen.findbuf = g_malloc0(WRLN_MAX_LINE_SIZE); /* In screen.findbuf is the whole string which is displayed in the status_window * and search_str is the string the user entered (without the prompt) */ - search_str = screen.findbuf + g_snprintf(screen.findbuf, WRLN_MAX_LINE_SIZE, "%s: ", JUMP_PROMPT); - iter = search_str; + char *search_str = screen.findbuf + g_snprintf(screen.findbuf, WRLN_MAX_LINE_SIZE, "%s: ", JUMP_PROMPT); + char *iter = search_str; - /* unfortunately wgetch returns "next/previous-page" not as an ascii-char */ - while(!g_ascii_iscntrl(key) && key != KEY_NPAGE && key != KEY_PPAGE) { + while(1) { key = screen_getch(screen.findbuf); - /* if backspace or delete was pressed */ - if (key == KEY_BACKSPACE || key == 330) { + /* if backspace or delete was pressed, process instead of ending loop */ + if (key == KEY_BACKSPACE || key == KEY_DC) { int i; - /* don't end the loop */ - key = 65; if (search_str <= g_utf8_find_prev_char(screen.findbuf, iter)) iter = g_utf8_find_prev_char(screen.findbuf, iter); for (i = 0; *(iter + i) != '\0'; i++) *(iter + i) = '\0'; continue; } + /* if a control key was pressed, end loop */ + else if (g_ascii_iscntrl(key) || key == KEY_NPAGE || key == KEY_PPAGE) { + break; + } else { *iter = key; if (iter < screen.findbuf + WRLN_MAX_LINE_SIZE - 3) ++iter; } list_window_jump(lw, callback_fn, callback_data, search_str); + /* repaint the list_window */ - list_window_paint(lw, callback_fn, callback_data); + if (paint_callback != NULL) + list_window_paint2(lw, paint_callback, paint_data); + else + list_window_paint(lw, callback_fn, callback_data); wrefresh(lw->w); } + char *temp = g_strdup(search_str); + g_free(screen.findbuf); + screen.findbuf = temp; + /* ncmpc should get the command */ - ungetch(key); - if ((cmd=get_keyboard_command()) != CMD_NONE) - do_input_event(cmd); + keyboard_unread(key); }