Mercurial > mplayer.hg
annotate libmenu/menu_list.c @ 36607:6b17e4932555
Improve the dialog for font encodings.
In case iconv is available, add only available encodings from the
full list to avoid possible confusion.
In any case (and especially if iconv isn't available) add UNICODE,
since this is internally provided by MPlayer.
author | ib |
---|---|
date | Thu, 23 Jan 2014 12:09:37 +0000 |
parents | 9e627a1793b1 |
children |
rev | line source |
---|---|
28113 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
8197 | 18 |
19 #include <stdlib.h> | |
20 #include <stdio.h> | |
21 #include <ctype.h> | |
8623
440301fef3fe
Added/reordered #includes to silence warnings about "implicit declaration".
rathann
parents:
8197
diff
changeset
|
22 #include <string.h> |
8197 | 23 |
16862 | 24 #include "config.h" |
8197 | 25 |
19431
ac69ba536915
Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents:
18204
diff
changeset
|
26 #include "libmpcodecs/img_format.h" |
ac69ba536915
Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents:
18204
diff
changeset
|
27 #include "libmpcodecs/mp_image.h" |
8197 | 28 |
29 #include "m_struct.h" | |
30 #include "menu.h" | |
31 | |
32466
9e627a1793b1
Move font_load.[ch], font_load_ft.c and osd_font.h from libvo to sub.
cigaes
parents:
32000
diff
changeset
|
32 #include "sub/font_load.h" |
16862 | 33 #include "osdep/keycodes.h" |
8197 | 34 |
35 #define IMPL 1 | |
36 #include "menu_list.h" | |
37 | |
25461 | 38 static int mouse_x; |
39 static int mouse_y; | |
40 static int selection_x; | |
41 static int selection_y; | |
42 static int selection_w; | |
43 static int selection_h; | |
44 | |
8197 | 45 #define mpriv (menu->priv) |
46 | |
47 void menu_list_draw(menu_t* menu,mp_image_t* mpi) { | |
48 int x = mpriv->x; | |
49 int y = mpriv->y; | |
50 int i; | |
51 int h = mpriv->h; | |
52 int w = mpriv->w; | |
53 int dh = 0,dw = 0; | |
25438
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
54 int bx, dx, dy = 0; |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
55 int need_h = 0,need_w = 0,ptr_l,sidx = 0; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
56 int th,count = 0; |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
57 int bg_w; |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
58 int line_h; |
8197 | 59 list_entry_t* m; |
60 | |
61 if(mpriv->count < 1) | |
62 return; | |
63 | |
64 if(h <= 0) h = mpi->height; | |
65 if(w <= 0) w = mpi->width; | |
66 dh = h - 2*mpriv->minb; | |
67 dw = w - 2*mpriv->minb; | |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
68 ptr_l = mpriv->ptr ? menu_text_length(mpriv->ptr) : 0; |
8197 | 69 // mpi is too small |
70 if(h - vo_font->height <= 0 || w - ptr_l <= 0 || dw <= 0 || dh <= 0) | |
71 return; | |
72 | |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
73 line_h = mpriv->vspace + vo_font->height; |
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
74 th = menu_text_num_lines(mpriv->title,dw) * line_h + mpriv->vspace; |
8197 | 75 |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
76 // the selected item is hidden, find a visible one |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
77 if(mpriv->current->hide) { |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
78 // try the next |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
79 for(m = mpriv->current->next ; m ; m = m->next) |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
80 if(!m->hide) break; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
81 if(!m) // or the previous |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
82 for(m = mpriv->current->prev ; m ; m = m->prev) |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
83 if(!m->hide) break; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
84 if(m) mpriv->current = m; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
85 else ptr_l = 0; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
86 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
87 |
8197 | 88 for(i = 0, m = mpriv->menu ; m ; m = m->next, i++) { |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
89 int ll; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
90 if(m->hide) continue; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
91 ll = menu_text_length(m->txt); |
8197 | 92 if(ptr_l + ll > need_w) need_w = ptr_l + ll; |
93 if(m == mpriv->current) sidx = i; | |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
94 count++; |
8197 | 95 } |
96 if(need_w > dw) need_w = dw; | |
25421
cc1b8a9d0ae2
Here should add the minb to x when x>=0 because in later code
ulion
parents:
25263
diff
changeset
|
97 if(x >= 0) |
8197 | 98 x += mpriv->minb; |
99 if(y > 0) | |
100 y += mpriv->minb; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
101 else |
8197 | 102 y = mpriv->minb; |
103 | |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
104 need_h = count * line_h - mpriv->vspace; |
8197 | 105 if( need_h + th > dh) { |
106 int start,end; | |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
107 mpriv->disp_lines = (dh + mpriv->vspace - th) / line_h; |
24979
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
108 if(mpriv->disp_lines < 4) { |
8197 | 109 th = 0; |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
110 mpriv->disp_lines = (dh + mpriv->vspace) / line_h; |
8197 | 111 } |
112 // Too smoll | |
24979
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
113 if(mpriv->disp_lines < 1) return; |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
114 need_h = mpriv->disp_lines * line_h - mpriv->vspace; |
8197 | 115 |
24979
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
116 start = sidx - (mpriv->disp_lines/2); |
8197 | 117 if(start < 0) start = 0; |
24979
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
118 end = start + mpriv->disp_lines; |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
119 if(end > count) { |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
120 end = count; |
24979
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
121 if(end - start < mpriv->disp_lines) |
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
122 start = end - mpriv->disp_lines < 0 ? 0 : end - mpriv->disp_lines; |
8197 | 123 } |
124 m = mpriv->menu; | |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
125 for(i = 0 ; m->next && i < start ; ) { |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
126 if(!m->hide) i++; |
8197 | 127 m = m->next; |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
128 } |
24979
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
129 } else { |
8197 | 130 m = mpriv->menu; |
24979
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
131 mpriv->disp_lines = count; |
476d4922566a
Make page up and down with proper page size instead of always 10 rows.
ulion
parents:
19431
diff
changeset
|
132 } |
8197 | 133 |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
134 bg_w = need_w+2*mpriv->minb; |
8197 | 135 if(th > 0) { |
25435
5779358c3f86
Currently menu title did not align center together with menu items when x>=0.
ulion
parents:
25421
diff
changeset
|
136 int tw,th2; |
5779358c3f86
Currently menu title did not align center together with menu items when x>=0.
ulion
parents:
25421
diff
changeset
|
137 menu_text_size(mpriv->title,dw,mpriv->vspace,1,&tw,&th2); |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
138 if(mpriv->title_bg >= 0) { |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
139 if(tw+2*mpriv->minb > bg_w) bg_w = tw+2*mpriv->minb; |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
140 menu_draw_box(mpi,mpriv->title_bg,mpriv->title_bg_alpha, |
18204 | 141 x < 0 ? (mpi->w-bg_w)/2 : x-mpriv->minb,dy+y-mpriv->vspace/2,bg_w,th); |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
142 } |
8197 | 143 menu_draw_text_full(mpi,mpriv->title, |
144 x < 0 ? mpi->w / 2 : x, | |
25435
5779358c3f86
Currently menu title did not align center together with menu items when x>=0.
ulion
parents:
25421
diff
changeset
|
145 dy+y, x < 0 ? dw : (tw > need_w ? tw : need_w), 0, |
8197 | 146 mpriv->vspace,1, |
147 MENU_TEXT_TOP|MENU_TEXT_HCENTER, | |
148 MENU_TEXT_TOP|(x < 0 ? MENU_TEXT_HCENTER :MENU_TEXT_LEFT)); | |
149 dy += th; | |
150 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
151 |
25438
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
152 dx = x < 0 ? (mpi->w - need_w) / 2 : x; |
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
153 bx = x < 0 ? (mpi->w - bg_w) / 2 : x - mpriv->minb; |
25461 | 154 |
155 // If mouse moved, try to update selected menu item by the mouse position. | |
156 if (menu_mouse_pos_updated) { | |
157 mouse_x = menu_mouse_x * mpi->width; | |
158 mouse_y = menu_mouse_y * mpi->height; | |
159 if (mouse_x >= bx && mouse_x < bx + bg_w) { | |
160 int by = dy + y - mpriv->vspace / 2; | |
161 int max_by = dh + y + mpriv->vspace / 2; | |
162 if (mouse_y >= by && mouse_y < max_by) { | |
163 int cur_no = (mouse_y - by) / line_h; | |
164 list_entry_t* e = m; | |
165 for (i = 0; e != NULL; e = e->next) { | |
166 if (e->hide) continue; | |
167 if (i == cur_no) { | |
168 mpriv->current = e; | |
169 break; | |
170 } | |
171 ++i; | |
172 } | |
173 } | |
174 } | |
175 menu_mouse_pos_updated = 0; | |
176 } | |
177 | |
8197 | 178 for( ; m != NULL && dy + vo_font->height < dh ; m = m->next ) { |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
179 if(m->hide) continue; |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
180 if(m == mpriv->current) { |
25461 | 181 // Record rectangle of current selection box. |
182 selection_x = bx; | |
183 selection_y = dy + y - mpriv->vspace / 2; | |
184 selection_w = bg_w; | |
185 selection_h = line_h; | |
186 | |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
187 if(mpriv->ptr_bg >= 0) |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
188 menu_draw_box(mpi,mpriv->ptr_bg,mpriv->ptr_bg_alpha, |
25438
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
189 bx, dy + y - mpriv->vspace / 2, |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
190 bg_w, line_h); |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
191 if(ptr_l > 0) |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
192 menu_draw_text_full(mpi,mpriv->ptr, |
25438
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
193 dx, |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
194 dy+y,dw,dh - dy, |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
195 mpriv->vspace,0, |
25438
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
196 MENU_TEXT_TOP|MENU_TEXT_LEFT, |
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
197 MENU_TEXT_TOP|MENU_TEXT_LEFT); |
17993
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
198 } else if(mpriv->item_bg >= 0) |
98eb966a4024
Add a function to draw flat boxes and use it to make the list
albeu
parents:
17980
diff
changeset
|
199 menu_draw_box(mpi,mpriv->item_bg,mpriv->item_bg_alpha, |
25438
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
200 bx, dy + y - mpriv->vspace / 2, |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
201 bg_w, line_h); |
8197 | 202 menu_draw_text_full(mpi,m->txt, |
25438
11cd0fdfcb4a
Add variable bx, dx to simplify code of function menu_draw_list.
ulion
parents:
25437
diff
changeset
|
203 dx + ptr_l, |
8197 | 204 dy+y,dw-ptr_l,dh - dy, |
205 mpriv->vspace,0, | |
206 MENU_TEXT_TOP|MENU_TEXT_LEFT, | |
207 MENU_TEXT_TOP|MENU_TEXT_LEFT); | |
25437
2664bccccb80
Add local variable 'line_h' to simplify code of function menu_list_draw.
ulion
parents:
25435
diff
changeset
|
208 dy += line_h; |
8197 | 209 } |
210 | |
211 } | |
212 | |
213 void menu_list_read_cmd(menu_t* menu,int cmd) { | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
214 list_entry_t* m; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
215 int i; |
8197 | 216 switch(cmd) { |
217 case MENU_CMD_UP: | |
17980 | 218 while(mpriv->current->prev) { |
219 mpriv->current = mpriv->current->prev; | |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
220 if(!mpriv->current->hide) return; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
221 } |
17980 | 222 for( ; mpriv->current->next != NULL ; mpriv->current = mpriv->current->next) |
223 /* NOTHING */; | |
224 if(!mpriv->current->hide) return; | |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
225 while(mpriv->current->prev) { |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
226 mpriv->current = mpriv->current->prev; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
227 if(!mpriv->current->hide) return; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
228 } |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
229 break; |
8197 | 230 case MENU_CMD_DOWN: |
17980 | 231 while(mpriv->current->next) { |
232 mpriv->current = mpriv->current->next; | |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
233 if(!mpriv->current->hide) return; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
234 } |
17980 | 235 mpriv->current = mpriv->menu; |
236 if(!mpriv->current->hide) return; | |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
237 while(mpriv->current->next) { |
8197 | 238 mpriv->current = mpriv->current->next; |
17946
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
239 if(!mpriv->current->hide) return; |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
240 } |
0afe12256464
Allow hiding list elements and disableing the pointer.
albeu
parents:
17945
diff
changeset
|
241 break; |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
242 case MENU_CMD_HOME: |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
243 mpriv->current = mpriv->menu; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
244 break; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
245 case MENU_CMD_END: |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
246 for(m = mpriv->current ; m && m->next ; m = m->next) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
247 /**/; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
248 if(m) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
249 mpriv->current = m; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
250 break; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
251 case MENU_CMD_PAGE_UP: |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
252 for(i = 0, m = mpriv->current ; m && m->prev && i < mpriv->disp_lines ; m = m->prev, i++) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
253 /**/; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
254 if(m) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
255 mpriv->current = m; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
256 break; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
257 case MENU_CMD_PAGE_DOWN: |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
258 for(i = 0, m = mpriv->current ; m && m->next && i < mpriv->disp_lines ; m = m->next, i++) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
259 /**/; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
260 if(m) |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
261 mpriv->current = m; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
262 break; |
17945
98f4e3704a76
Allow 6 ways (up/down/left/right/ok/cancel) navigation.
albeu
parents:
16862
diff
changeset
|
263 case MENU_CMD_LEFT: |
8197 | 264 case MENU_CMD_CANCEL: |
265 menu->show = 0; | |
266 menu->cl = 1; | |
267 break; | |
25461 | 268 case MENU_CMD_CLICK: |
269 if (mouse_x >= selection_x && mouse_x < selection_x + selection_w && | |
270 mouse_y >= selection_y && mouse_y < selection_y + selection_h) | |
271 menu_read_cmd(menu, MENU_CMD_OK); | |
272 break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
273 } |
8197 | 274 } |
275 | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
276 int menu_list_jump_to_key(menu_t* menu,int c) { |
10935
ec8a1e6443d5
Fix long-known bug with handling 'down key' in lists.
lumag
parents:
9380
diff
changeset
|
277 if(c < 256 && isalnum(c)) { |
8197 | 278 list_entry_t* e = mpriv->current; |
279 if(e->txt[0] == c) e = e->next; | |
280 for( ; e ; e = e->next) { | |
281 if(e->txt[0] == c) { | |
282 mpriv->current = e; | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
283 return 1; |
8197 | 284 } |
285 } | |
286 for(e = mpriv->menu ; e ; e = e->next) { | |
287 if(e->txt[0] == c) { | |
288 mpriv->current = e; | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
289 return 1; |
8197 | 290 } |
291 } | |
25263
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
292 return 1; |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
293 } |
96d0992c7920
Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents:
24979
diff
changeset
|
294 return 0; |
8197 | 295 } |
296 | |
297 void menu_list_add_entry(menu_t* menu,list_entry_t* entry) { | |
298 list_entry_t* l; | |
299 mpriv->count++; | |
300 | |
301 if(mpriv->menu == NULL) { | |
302 mpriv->menu = mpriv->current = entry; | |
303 return; | |
304 } | |
305 | |
306 for(l = mpriv->menu ; l->next != NULL ; l = l->next) | |
307 /* NOP */; | |
308 l->next = entry; | |
309 entry->prev = l; | |
310 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
311 |
8197 | 312 void menu_list_init(menu_t* menu) { |
313 if(!mpriv) | |
314 mpriv = calloc(1,sizeof(struct menu_priv_s)); | |
315 | |
316 } | |
317 | |
318 void menu_list_uninit(menu_t* menu,free_entry_t free_func) { | |
319 list_entry_t *i,*j; | |
320 | |
321 if(!free_func) free_func = (free_entry_t)free; | |
322 | |
323 for(i = mpriv->menu ; i != NULL ; ) { | |
324 j = i->next; | |
325 free_func(i); | |
326 i = j; | |
327 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28113
diff
changeset
|
328 |
8197 | 329 mpriv->menu = mpriv->current = NULL; |
330 | |
331 } |