X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fscreen_find.c;h=5f2277288bacd4905ca4b4c13f9f30b1d49a70c8;hb=f06ea973f90093fed3cf81954698c4139818064b;hp=0e93b4ff2f96d4b3aeddbc66b092c9f63ad8e9a1;hpb=b398de1a003fafd0b140dbe82f543f515102fed4;p=ncmpc.git diff --git a/src/screen_find.c b/src/screen_find.c index 0e93b4f..5f22772 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-2010 The Music Player Daemon Project * Project homepage: http://musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -19,7 +19,7 @@ #include "screen_find.h" #include "screen_utils.h" -#include "screen_message.h" +#include "screen_status.h" #include "screen.h" #include "i18n.h" #include "options.h" @@ -30,22 +30,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: @@ -58,11 +54,14 @@ screen_find(struct list_window *lw, 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 +71,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, @@ -96,12 +94,11 @@ screen_find(struct list_window *lw, void screen_jump(struct list_window *lw, list_window_callback_fn_t callback_fn, + list_window_paint_callback_t paint_callback, void *callback_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,47 @@ 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, callback_data); + else + list_window_paint(lw, callback_fn, callback_data); wrefresh(lw->w); } /* ncmpc should get the command */ ungetch(key); + + command_t cmd; if ((cmd=get_keyboard_command()) != CMD_NONE) do_input_event(cmd); + + char *temp = g_strdup(search_str); + g_free(screen.findbuf); + screen.findbuf = temp; }