1 /*
2 * $Id: screen_utils.c,v 1.4 2004/03/16 13:57:24 kalle Exp $
3 *
4 */
6 #include <stdlib.h>
7 #include <string.h>
8 #include <glib.h>
9 #include <ncurses.h>
11 #include "libmpdclient.h"
12 #include "mpc.h"
13 #include "command.h"
14 #include "screen.h"
16 #if 0
17 #include <readline/readline.h>
18 #endif
21 list_window_t *
22 list_window_init(WINDOW *w, int width, int height)
23 {
24 list_window_t *lw;
26 lw = malloc(sizeof(list_window_t));
27 memset(lw, 0, sizeof(list_window_t));
28 lw->w = w;
29 lw->cols = width;
30 lw->rows = height;
31 lw->clear = 1;
32 return lw;
33 }
35 list_window_t *
36 list_window_free(list_window_t *lw)
37 {
38 if( lw )
39 {
40 memset(lw, 0, sizeof(list_window_t));
41 free(lw);
42 }
43 return NULL;
44 }
46 void
47 list_window_reset(list_window_t *lw)
48 {
49 lw->selected = 0;
50 lw->start = 0;
51 lw->clear = 1;
52 }
54 void
55 list_window_set_selected(list_window_t *lw, int n)
56 {
57 lw->selected=n;
58 }
60 void
61 list_window_paint(list_window_t *lw,
62 list_window_callback_fn_t callback,
63 void *callback_data)
64 {
65 int i;
67 while( lw->selected < lw->start )
68 {
69 lw->start--;
70 lw->clear=1;
71 }
72 while( lw->selected >= lw->start+lw->rows )
73 {
74 lw->start++;
75 lw->clear=1;
76 }
77 if( lw->clear )
78 {
79 wclear(lw->w);
80 lw->clear=0;
81 }
83 for(i=0; i<lw->rows; i++)
84 {
85 int highlight;
86 char *label;
88 label = (callback) (lw->start+i, &highlight, callback_data);
89 if( label )
90 {
91 wmove(lw->w, i, 0);
92 if( highlight )
93 wattron(lw->w, A_BOLD);
94 if( lw->start+i == lw->selected )
95 wattron(lw->w, A_REVERSE);
97 waddnstr(lw->w, label, lw->cols);
99 if( highlight )
100 wattroff(lw->w, A_BOLD);
101 if( lw->start+i == lw->selected )
102 wattroff(lw->w, A_REVERSE);
103 }
104 }
105 }
107 void
108 list_window_next(list_window_t *lw, int length)
109 {
110 if( lw->selected < length-1 )
111 lw->selected++;
112 }
114 void
115 list_window_previous(list_window_t *lw)
116 {
117 if( lw->selected > 0 )
118 lw->selected--;
119 }
121 void
122 list_window_first(list_window_t *lw)
123 {
124 lw->selected = 0;
125 }
127 void
128 list_window_last(list_window_t *lw, int length)
129 {
130 lw->selected = length-1;
131 }
133 void
134 list_window_next_page(list_window_t *lw, int length)
135 {
136 int step = lw->rows-1;
137 if( step<= 0 )
138 return;
139 if( lw->selected+step < length-1 )
140 lw->selected+=step;
141 else
142 return list_window_last(lw,length);
143 }
145 void
146 list_window_previous_page(list_window_t *lw)
147 {
148 int step = lw->rows-1;
149 if( step<= 0 )
150 return;
151 if( lw->selected-step > 0 )
152 lw->selected-=step;
153 else
154 list_window_first(lw);
155 }
157 int
158 list_window_find(list_window_t *lw,
159 list_window_callback_fn_t callback,
160 void *callback_data,
161 char *str)
162 {
163 int i = lw->selected+1;
165 while( i< lw->rows )
166 {
167 int h;
168 char *label = (callback) (i,&h,callback_data);
170 if( str && label && strstr(label, str) )
171 {
172 lw->selected = i;
173 return 0;
174 }
175 i++;
176 }
177 return 1;
178 }
181 char *
182 screen_readln(WINDOW *w, char *prompt)
183 {
184 char buf[256], *line = NULL;
185 int prompt_len = strlen(prompt);
187 wclear(w);
188 wmove(w, 0, 0);
189 waddstr(w, prompt);
190 wmove(w, 0, prompt_len);
192 echo();
193 curs_set(1);
195 if( wgetnstr(w, buf, 256) == OK )
196 line = strdup(buf);
198 noecho();
199 curs_set(0);
201 return line;
202 }