Mercurial > mplayer.hg
annotate libmenu/menu_list.c @ 34462:f305c10d20f8
Simplify XShape handling and setting of wsUseXShape.
author | ib |
---|---|
date | Thu, 12 Jan 2012 16:01:32 +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 } |