1 #include <stdlib.h>
2 #include <unistd.h>
3 #include <string.h>
4 #include <glib.h>
5 #include <ncurses.h>
7 #include "config.h"
8 #include "libmpdclient.h"
9 #include "mpc.h"
10 #include "support.h"
11 #include "command.h"
12 #include "options.h"
13 #include "list_window.h"
14 #include "screen.h"
16 #define FIND_PROMPT "Find: "
17 #define RFIND_PROMPT "Find backward: "
19 int
20 screen_getch(WINDOW *w, char *prompt)
21 {
22 int key = -1;
23 int prompt_len = strlen(prompt);
25 wclear(w);
26 wmove(w, 0, 0);
27 waddstr(w, prompt);
28 wmove(w, 0, prompt_len);
30 echo();
31 curs_set(1);
32 timeout(-1);
34 key = wgetch(w);
36 noecho();
37 curs_set(0);
38 timeout(SCREEN_TIMEOUT);
40 return key;
41 }
44 char *
45 screen_getstr(WINDOW *w, char *prompt)
46 {
47 char buf[256], *line = NULL;
48 int prompt_len = strlen(prompt);
50 wclear(w);
51 wmove(w, 0, 0);
52 waddstr(w, prompt);
53 wmove(w, 0, prompt_len);
55 echo();
56 curs_set(1);
58 if( wgetnstr(w, buf, 256) == OK )
59 line = g_strdup(buf);
61 noecho();
62 curs_set(0);
64 return line;
65 }
68 /* query user for a string and find it in a list window */
69 int
70 screen_find(screen_t *screen,
71 mpd_client_t *c,
72 list_window_t *lw,
73 int rows,
74 command_t findcmd,
75 list_window_callback_fn_t callback_fn)
76 {
77 int reversed = 0;
78 int retval = 0;
79 char *prompt = FIND_PROMPT;
81 if( findcmd==CMD_LIST_RFIND ||findcmd==CMD_LIST_RFIND_NEXT )
82 {
83 prompt = RFIND_PROMPT;
84 reversed = 1;
85 }
87 switch(findcmd)
88 {
89 case CMD_LIST_FIND:
90 case CMD_LIST_RFIND:
91 if( screen->findbuf )
92 {
93 g_free(screen->findbuf);
94 screen->findbuf=NULL;
95 }
96 /* continue... */
97 case CMD_LIST_FIND_NEXT:
98 case CMD_LIST_RFIND_NEXT:
99 if( !screen->findbuf )
100 screen->findbuf=screen_getstr(screen->status_window.w, prompt);
101 if( reversed )
102 retval = list_window_rfind(lw,
103 callback_fn,
104 c,
105 screen->findbuf,
106 options.find_wrap,
107 rows);
108 else
109 retval = list_window_find(lw,
110 callback_fn,
111 c,
112 screen->findbuf,
113 options.find_wrap);
114 if( retval == 0 )
115 {
116 lw->repaint = 1;
117 }
118 else
119 {
120 screen_status_printf("Unable to find \'%s\'", screen->findbuf);
121 beep();
122 }
123 return 1;
124 default:
125 break;
126 }
127 return 0;
128 }
131 int
132 my_waddstr(WINDOW *w, const char *text, int color)
133 {
134 int ret;
136 if( options.enable_colors )
137 wattron(w, color);
138 ret = waddstr(w, text);
139 if( options.enable_colors )
140 wattroff(w, color);
142 return ret;
143 }
145 int
146 my_mvwaddstr(WINDOW *w, int x, int y, const char *text, int color)
147 {
148 int ret;
150 if( options.enable_colors )
151 wattron(w, color);
152 ret = mvwaddstr(w, x, y, text);
153 if( options.enable_colors )
154 wattroff(w, color);
156 return ret;
157 }