Code

Added strcasestr prototype.
[ncmpc.git] / screen_utils.c
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);
29   
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);
54   
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;
131 int
132 my_waddstr(WINDOW *w, const char *text, int color)
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;
145 int
146 my_mvwaddstr(WINDOW *w, int x, int y, const char *text, int color)
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;