8197
|
1
|
|
2 #include "../config.h"
|
|
3
|
|
4 #include <stdlib.h>
|
|
5 #include <stdio.h>
|
|
6 #include <string.h>
|
|
7 #include <ctype.h>
|
|
8
|
|
9 #include "img_format.h"
|
|
10 #include "mp_image.h"
|
|
11
|
|
12 #include "../m_struct.h"
|
|
13 #include "../m_option.h"
|
|
14 #include "menu.h"
|
|
15
|
|
16 #include "../libvo/font_load.h"
|
|
17 #include "../linux/keycodes.h"
|
|
18 #include "../input/input.h"
|
|
19 #include "../linux/timer.h"
|
|
20
|
|
21 struct menu_priv_s {
|
|
22 char** lines; // Our buffer
|
|
23 int last_line;
|
|
24 int num_lines;
|
|
25 char* input; // input buffer
|
|
26 int input_size; // size of the input buffer in lines
|
|
27 unsigned int hide_ts;
|
|
28 unsigned int show_ts;
|
|
29
|
|
30 //int max_lines; // Max number of lines with the last mpi
|
|
31
|
|
32 char* prompt;
|
|
33 int buf_lines; // Buffer size (in line)
|
|
34 int height; // Display size in %
|
|
35 int minb;
|
|
36 int vspace;
|
|
37 unsigned int hide_time;
|
|
38 unsigned int show_time;
|
|
39 };
|
|
40
|
|
41 static struct menu_priv_s cfg_dflt = {
|
|
42 NULL,
|
|
43 0,
|
|
44 0,
|
|
45 NULL,
|
|
46 0,
|
|
47 0,
|
|
48 0,
|
|
49
|
|
50 "# ",
|
|
51 50, // lines
|
|
52 33, // %
|
|
53 3,
|
|
54 3,
|
|
55 500,
|
|
56 500,
|
|
57 };
|
|
58
|
|
59 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m)
|
|
60
|
|
61 static m_option_t cfg_fields[] = {
|
|
62 { "prompt", ST_OFF(prompt), CONF_TYPE_STRING, M_OPT_MIN, 1, 0, NULL },
|
|
63 { "buffer-lines", ST_OFF(buf_lines), CONF_TYPE_INT, M_OPT_MIN, 5, 0, NULL },
|
|
64 { "height", ST_OFF(height), CONF_TYPE_INT, M_OPT_RANGE, 1, 100, NULL },
|
|
65 { "minbor", ST_OFF(minb), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
|
|
66 { "vspace", ST_OFF(vspace), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
|
|
67 { "show-time",ST_OFF(show_time), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
|
|
68 { "hide-time",ST_OFF(hide_time), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
|
|
69 { NULL, NULL, NULL, 0,0,0,NULL }
|
|
70 };
|
|
71
|
|
72 #define mpriv (menu->priv)
|
|
73
|
|
74 static void add_line(struct menu_priv_s* priv, char* l) {
|
|
75
|
|
76 if(priv->num_lines >= priv->buf_lines && priv->lines[priv->last_line])
|
|
77 free(priv->lines[priv->last_line]);
|
|
78 else
|
|
79 priv->num_lines++;
|
|
80
|
|
81 priv->lines[priv->last_line] = strdup(l);
|
|
82 priv->last_line = (priv->last_line + 1) % priv->buf_lines;
|
|
83 }
|
|
84
|
|
85 static void draw(menu_t* menu, mp_image_t* mpi) {
|
|
86 int h = mpi->h*mpriv->height/100;
|
|
87 int w = mpi->w - 2* mpriv->minb;
|
|
88 int x = mpriv->minb, y;
|
|
89 int lw,lh,i, ll = mpriv->last_line - 1;
|
|
90
|
|
91 if(mpriv->hide_ts) {
|
|
92 unsigned int t = GetTimerMS() - mpriv->hide_ts;
|
|
93 if(t >= mpriv->hide_time) {
|
|
94 mpriv->hide_ts = 0;
|
|
95 menu->show = 0;
|
|
96 return;
|
|
97 }
|
|
98 h = mpi->h*(mpriv->height - (mpriv->height * t /mpriv->hide_time))/100;
|
|
99 } else if(mpriv->show_time && mpriv->show_ts == 0) {
|
|
100 mpriv->show_ts = GetTimerMS();
|
|
101 return;
|
|
102 } else if(mpriv->show_ts > 0) {
|
|
103 unsigned int t = GetTimerMS() - mpriv->show_ts;
|
|
104 if(t > mpriv->show_time)
|
|
105 mpriv->show_ts = -1;
|
|
106 else
|
|
107 h = mpi->h*(mpriv->height * t /mpriv->hide_time)/100;
|
|
108 }
|
|
109
|
|
110 y = h - mpriv->vspace;
|
|
111
|
|
112 if(x < 0 || y < 0 || w <= 0 || h <= 0 )
|
|
113 return;
|
|
114
|
|
115 menu_text_size(mpriv->input,w,mpriv->vspace,1,&lw,&lh);
|
|
116 menu_draw_text_full(mpi,mpriv->input,x,y,w,h,mpriv->vspace,1,
|
|
117 MENU_TEXT_BOT|MENU_TEXT_LEFT,
|
|
118 MENU_TEXT_BOT|MENU_TEXT_LEFT);
|
|
119 y -= lh + mpriv->vspace;
|
|
120
|
|
121 for( i = 0 ; y > mpriv->minb && i < mpriv->num_lines ; i++){
|
|
122 int c = (ll - i) >= 0 ? ll - i : mpriv->buf_lines + ll - i;
|
|
123 menu_text_size(mpriv->lines[c],w,mpriv->vspace,1,&lw,&lh);
|
|
124 menu_draw_text_full(mpi,mpriv->lines[c],x,y,w,h,mpriv->vspace,1,
|
|
125 MENU_TEXT_BOT|MENU_TEXT_LEFT,
|
|
126 MENU_TEXT_BOT|MENU_TEXT_LEFT);
|
|
127 y -= lh + mpriv->vspace;
|
|
128 }
|
|
129 return;
|
|
130 }
|
|
131
|
|
132 static void read_cmd(menu_t* menu,int cmd) {
|
|
133 switch(cmd) {
|
|
134 case MENU_CMD_UP:
|
|
135 break;
|
|
136 case MENU_CMD_DOWN:
|
|
137 case MENU_CMD_OK:
|
|
138 break;
|
|
139 case MENU_CMD_CANCEL:
|
|
140 menu->show = 0;
|
|
141 menu->cl = 1;
|
|
142 break;
|
|
143 }
|
|
144 }
|
|
145
|
|
146 static void read_key(menu_t* menu,int c) {
|
|
147 switch(c) {
|
|
148 case KEY_ESC:
|
|
149 if(mpriv->hide_time)
|
|
150 mpriv->hide_ts = GetTimerMS();
|
|
151 else
|
|
152 menu->show = 0;
|
|
153 mpriv->show_ts = 0;
|
|
154 return;
|
|
155 case KEY_ENTER: {
|
|
156 mp_cmd_t* c = mp_input_parse_cmd(&mpriv->input[strlen(mpriv->prompt)]);
|
|
157 add_line(mpriv,mpriv->input);
|
|
158 if(!c)
|
|
159 add_line(mpriv,"Invalid command try help");
|
|
160 else {
|
|
161 switch(c->id) {
|
|
162 case MP_CMD_CHELP:
|
|
163 add_line(mpriv,"Mplayer console 0.01");
|
|
164 add_line(mpriv,"TODO: Write some mainful help msg ;)");
|
|
165 add_line(mpriv,"Enter any mplayer command");
|
|
166 add_line(mpriv,"exit close this console");
|
|
167 break;
|
|
168 case MP_CMD_CEXIT:
|
|
169 menu->show = 0;
|
|
170 menu->cl = 1;
|
|
171 break;
|
|
172 case MP_CMD_CHIDE:
|
|
173 if(mpriv->hide_time)
|
|
174 mpriv->hide_ts = GetTimerMS();
|
|
175 else
|
|
176 menu->show = 0;
|
|
177 mpriv->show_ts = 0;
|
|
178 break;
|
|
179 default: // Send the other commands to mplayer
|
|
180 mp_input_queue_cmd(c);
|
|
181 }
|
|
182 }
|
|
183 mpriv->input[strlen(mpriv->prompt)] = '\0';
|
|
184 return;
|
|
185 }
|
|
186 case KEY_DELETE:
|
|
187 case KEY_BS: {
|
|
188 unsigned int i = strlen(mpriv->input);
|
|
189 if(i > strlen(mpriv->prompt))
|
|
190 mpriv->input[i-1] = '\0';
|
|
191 return;
|
|
192 }
|
|
193 }
|
|
194
|
|
195 if(isascii(c)) {
|
|
196 int l = strlen(mpriv->input);
|
|
197 mpriv->input[l] = (char)c;
|
|
198 mpriv->input[l+1] = '\0';
|
|
199 }
|
|
200
|
|
201 }
|
|
202
|
|
203
|
|
204 static int open(menu_t* menu, char* args) {
|
|
205
|
|
206
|
|
207 menu->draw = draw;
|
|
208 menu->read_cmd = read_cmd;
|
|
209 menu->read_key = read_key;
|
|
210
|
|
211 mpriv->lines = calloc(mpriv->buf_lines,sizeof(char*));
|
|
212 mpriv->input_size = 1024;
|
|
213 mpriv->input = calloc(mpriv->input_size,sizeof(char));
|
|
214 strcpy(mpriv->input,mpriv->prompt);
|
|
215
|
|
216 if(args)
|
|
217 add_line(mpriv,args);
|
|
218
|
|
219 return 1;
|
|
220 }
|
|
221
|
|
222 const menu_info_t menu_info_console = {
|
|
223 "MPlayer console",
|
|
224 "console",
|
|
225 "Albeu",
|
|
226 "",
|
|
227 {
|
|
228 "console_cfg",
|
|
229 sizeof(struct menu_priv_s),
|
|
230 &cfg_dflt,
|
|
231 cfg_fields
|
|
232 },
|
|
233 open,
|
|
234 };
|