annotate libmenu/menu_console.c @ 30795:1001c606f94c

Make emulated Win32 critical sections thread safe. Earlier, cs->locked was accessed outside the mutex to get around the problem that default pthread mutexes are not recursive (ie., you cannot do a double-lock from the same thread), causing a thread-safety problem, as both detected by Helgrind and showing up in some multithreaded codecs. The ideal solution here would be to simply use recursive pthread mutexes, but there were concerns about reduced debuggability and possibly portability. Thus, instead, rewrite the critical sections to be a simple lock count (with owner) protected by a regular mutex. Whenever a thread wants to enter the critical section and lock_count is not 0, it sleeps on a special event that tells it when the critical section is available.
author sesse
date Thu, 04 Mar 2010 15:57:08 +0000
parents 0f1b5b68af32
children 45b93bea8082
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28113
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
1 /*
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
2 * This file is part of MPlayer.
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
3 *
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
5 * it under the terms of the GNU General Public License as published by
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
7 * (at your option) any later version.
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
8 *
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
12 * GNU General Public License for more details.
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
13 *
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
14 * You should have received a copy of the GNU General Public License along
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
f8b6c7045cf8 Add standard GPL headers.
diego
parents: 25502
diff changeset
17 */
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
18
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 14087
diff changeset
19 #include "config.h"
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
20 #include "mp_msg.h"
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
21 #include "help_mp.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
22
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
23 #include <stdlib.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
24 #include <stdio.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
25 #include <string.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
26 #include <ctype.h>
8229
rfelker
parents: 8227
diff changeset
27 #include <sys/time.h>
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
28 #include <sys/types.h>
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 10333
diff changeset
29 #ifndef __MINGW32__
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
30 #include <sys/wait.h>
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 10333
diff changeset
31 #endif
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
32 #include <unistd.h>
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
33 #include <errno.h>
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
34
19431
ac69ba536915 Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents: 18858
diff changeset
35 #include "libmpcodecs/img_format.h"
ac69ba536915 Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents: 18858
diff changeset
36 #include "libmpcodecs/mp_image.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
37
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 14087
diff changeset
38 #include "m_struct.h"
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 14087
diff changeset
39 #include "m_option.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
40 #include "menu.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
41
16862
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 14087
diff changeset
42 #include "libvo/font_load.h"
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 14087
diff changeset
43 #include "osdep/keycodes.h"
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 14087
diff changeset
44 #include "input/input.h"
931bdbc37ee0 Unify include paths, -I.. is in CFLAGS.
diego
parents: 14087
diff changeset
45 #include "osdep/timer.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
46
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
47 typedef struct history_st history_t;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
48
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
49 struct history_st {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
50 char* buffer;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
51 int size;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
52 history_t* next;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
53 history_t* prev;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
54 };
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
55
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
56 struct menu_priv_s {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
57 char** lines; // Our buffer
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
58 int last_line;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
59 int num_lines;
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
60 int add_line;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
61 unsigned int hide_ts;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
62 unsigned int show_ts;
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
63 pid_t child; // Child process if we are running a shell cmd
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
64 int child_fd[3]; // The 3 default fd
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
65 char* prompt;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
66 //int max_lines; // Max number of lines with the last mpi
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
67 history_t* history;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
68 history_t* cur_history;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
69 int history_size;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
70
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
71 char* mp_prompt;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
72 char* child_prompt;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
73 int buf_lines; // Buffer size (in line)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
74 int height; // Display size in %
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
75 int minb;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
76 int vspace;
17993
98eb966a4024 Add a function to draw flat boxes and use it to make the list
albeu
parents: 16862
diff changeset
77 int bg,bg_alpha;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
78 unsigned int hide_time;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
79 unsigned int show_time;
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
80 int history_max;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
81 int raw_child;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
82 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
83
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
84 static struct menu_priv_s cfg_dflt = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
85 NULL,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
86 0,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
87 0,
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
88 1,
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
89 0,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
90 0,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
91 0,
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
92 { 0 , 0, 0 },
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
93 NULL,
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
94 NULL,
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
95 NULL,
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
96 0,
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
97
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
98 "# ",
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
99 "$ ",
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
100 50, // lines
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
101 33, // %
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
102 3,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
103 3,
17993
98eb966a4024 Add a function to draw flat boxes and use it to make the list
albeu
parents: 16862
diff changeset
104 0x80,0x40,
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
105 500,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
106 500,
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
107 10,
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
108 0
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
109 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
110
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
111 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
112
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
113 static m_option_t cfg_fields[] = {
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
114 { "prompt", ST_OFF(mp_prompt), CONF_TYPE_STRING, M_OPT_MIN, 1, 0, NULL },
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
115 { "child-prompt", ST_OFF(child_prompt), CONF_TYPE_STRING, M_OPT_MIN, 1, 0, NULL },
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
116 { "buffer-lines", ST_OFF(buf_lines), CONF_TYPE_INT, M_OPT_MIN, 5, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
117 { "height", ST_OFF(height), CONF_TYPE_INT, M_OPT_RANGE, 1, 100, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
118 { "minbor", ST_OFF(minb), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
119 { "vspace", ST_OFF(vspace), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
17993
98eb966a4024 Add a function to draw flat boxes and use it to make the list
albeu
parents: 16862
diff changeset
120 { "bg", ST_OFF(bg), CONF_TYPE_INT, M_OPT_RANGE, -1, 255, NULL },
98eb966a4024 Add a function to draw flat boxes and use it to make the list
albeu
parents: 16862
diff changeset
121 { "bg-alpha", ST_OFF(bg_alpha), CONF_TYPE_INT, M_OPT_RANGE, 0, 255, NULL },
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
122 { "show-time",ST_OFF(show_time), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
123 { "hide-time",ST_OFF(hide_time), CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL },
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
124 { "history-size",ST_OFF(history_max), CONF_TYPE_INT, M_OPT_MIN, 1, 0, NULL },
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
125 { "raw-child", ST_OFF(raw_child), CONF_TYPE_FLAG, 0, 0, 1, NULL },
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
126 { NULL, NULL, NULL, 0,0,0,NULL }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
127 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
128
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
129 #define mpriv (menu->priv)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
130
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
131 static void check_child(menu_t* menu);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
132
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
133 static void add_line(struct menu_priv_s* priv, char* l) {
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
134 char* eol = strchr(l,'\n');
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
135
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
136 if(eol) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
137 if(eol != l) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
138 eol[0] = '\0';
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
139 add_line(priv,l);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
140 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
141 if(eol[1]) add_line(priv,eol+1);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
142 return;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
143 }
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
144
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
145 if(priv->num_lines >= priv->buf_lines && priv->lines[priv->last_line])
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
146 free(priv->lines[priv->last_line]);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
147 else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
148 priv->num_lines++;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
149
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
150 priv->lines[priv->last_line] = strdup(l);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
151 priv->last_line = (priv->last_line + 1) % priv->buf_lines;
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
152 priv->add_line = 1;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
153 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
154
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
155 static void add_string(struct menu_priv_s* priv, char* l) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
156 char* eol = strchr(l,'\n');
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
157 int ll = priv->last_line > 0 ? priv->last_line - 1 : priv->buf_lines-1;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
158
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
159 if(priv->num_lines <= 0 || priv->add_line || eol == l) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
160 add_line(priv,l);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
161 priv->add_line = 0;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
162 return;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
163 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
164
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
165 if(eol) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
166 eol[0] = '\0';
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
167 add_string(priv,l);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
168 if(eol[1]) {
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
169 add_line(priv,eol+1);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
170 priv->add_line = 0;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
171 } else
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
172 priv->add_line = 1;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
173 return;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
174 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
175 priv->lines[ll] = realloc(priv->lines[ll],strlen(priv->lines[ll]) + strlen(l) + 1);
12646
9a495bdc3a1e string handling security fixes
diego
parents: 10864
diff changeset
176 if ( priv->lines[ll] != NULL )
9a495bdc3a1e string handling security fixes
diego
parents: 10864
diff changeset
177 {
9a495bdc3a1e string handling security fixes
diego
parents: 10864
diff changeset
178 strcat(priv->lines[ll],l);
9a495bdc3a1e string handling security fixes
diego
parents: 10864
diff changeset
179 }
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
180 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
181
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
182 static void draw(menu_t* menu, mp_image_t* mpi) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
183 int h = mpi->h*mpriv->height/100;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
184 int w = mpi->w - 2* mpriv->minb;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
185 int x = mpriv->minb, y;
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
186 int lw,lh,i, ll;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
187
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
188 if(mpriv->child) check_child(menu);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
189
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
190 ll = mpriv->last_line - 1;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
191
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
192 if(mpriv->hide_ts) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
193 unsigned int t = GetTimerMS() - mpriv->hide_ts;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
194 if(t >= mpriv->hide_time) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
195 mpriv->hide_ts = 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
196 menu->show = 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
197 return;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
198 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
199 h = mpi->h*(mpriv->height - (mpriv->height * t /mpriv->hide_time))/100;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
200 } else if(mpriv->show_time && mpriv->show_ts == 0) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
201 mpriv->show_ts = GetTimerMS();
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
202 return;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
203 } else if(mpriv->show_ts > 0) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
204 unsigned int t = GetTimerMS() - mpriv->show_ts;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
205 if(t > mpriv->show_time)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
206 mpriv->show_ts = -1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
207 else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
208 h = mpi->h*(mpriv->height * t /mpriv->hide_time)/100;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
209 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
210
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
211 y = h - mpriv->vspace;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
212
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
213 if(x < 0 || y < 0 || w <= 0 || h <= 0 )
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
214 return;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
215
17993
98eb966a4024 Add a function to draw flat boxes and use it to make the list
albeu
parents: 16862
diff changeset
216 if(mpriv->bg >= 0)
98eb966a4024 Add a function to draw flat boxes and use it to make the list
albeu
parents: 16862
diff changeset
217 menu_draw_box(mpi,mpriv->bg,mpriv->bg_alpha,0,0,mpi->w,h);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
218
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
219 if(!mpriv->child || !mpriv->raw_child){
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
220 char input[strlen(mpriv->cur_history->buffer) + strlen(mpriv->prompt) + 1];
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
221 sprintf(input,"%s%s",mpriv->prompt,mpriv->cur_history->buffer);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
222 menu_text_size(input,w,mpriv->vspace,1,&lw,&lh);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
223 menu_draw_text_full(mpi,input,x,y,w,h,mpriv->vspace,1,
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
224 MENU_TEXT_BOT|MENU_TEXT_LEFT,
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
225 MENU_TEXT_BOT|MENU_TEXT_LEFT);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
226 y -= lh + mpriv->vspace;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
227 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
228
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
229
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
230 for( i = 0 ; y > mpriv->minb && i < mpriv->num_lines ; i++){
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
231 int c = (ll - i) >= 0 ? ll - i : mpriv->buf_lines + ll - i;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
232 menu_text_size(mpriv->lines[c],w,mpriv->vspace,1,&lw,&lh);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
233 menu_draw_text_full(mpi,mpriv->lines[c],x,y,w,h,mpriv->vspace,1,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
234 MENU_TEXT_BOT|MENU_TEXT_LEFT,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
235 MENU_TEXT_BOT|MENU_TEXT_LEFT);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
236 y -= lh + mpriv->vspace;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
237 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
238 return;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
239 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
240
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
241 static void check_child(menu_t* menu) {
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 10333
diff changeset
242 #ifndef __MINGW32__
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
243 fd_set rfd;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
244 struct timeval tv;
8297
879f88c3212e fix 100l typo :)
colin
parents: 8229
diff changeset
245 int max_fd = mpriv->child_fd[2] > mpriv->child_fd[1] ? mpriv->child_fd[2] :
879f88c3212e fix 100l typo :)
colin
parents: 8229
diff changeset
246 mpriv->child_fd[1];
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
247 int i,r,child_status,w;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
248 char buffer[256];
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
249
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
250 if(!mpriv->child) return;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
251
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
252 memset(&tv,0,sizeof(struct timeval));
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
253 FD_ZERO(&rfd);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
254 FD_SET(mpriv->child_fd[1],&rfd);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
255 FD_SET(mpriv->child_fd[2],&rfd);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
256
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
257 r = select(max_fd+1,&rfd, NULL, NULL, &tv);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
258 if(r == 0) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
259 r = waitpid(mpriv->child,&child_status,WNOHANG);
13391
b6c3752d9544 handle sigchld in mplayer.c
faust3
parents: 12874
diff changeset
260 if(r < 0){
23871
426c20bcfddf typo fix: childs --> children
diego
parents: 19431
diff changeset
261 if(errno==ECHILD){ ///exiting children get handled in mplayer.c
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
262 for(i = 0 ; i < 3 ; i++)
13391
b6c3752d9544 handle sigchld in mplayer.c
faust3
parents: 12874
diff changeset
263 close(mpriv->child_fd[i]);
b6c3752d9544 handle sigchld in mplayer.c
faust3
parents: 12874
diff changeset
264 mpriv->child = 0;
b6c3752d9544 handle sigchld in mplayer.c
faust3
parents: 12874
diff changeset
265 mpriv->prompt = mpriv->mp_prompt;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
266 //add_line(mpriv,"Child process exited");
13391
b6c3752d9544 handle sigchld in mplayer.c
faust3
parents: 12874
diff changeset
267 }
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
268 else mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_WaitPidError,strerror(errno));
13391
b6c3752d9544 handle sigchld in mplayer.c
faust3
parents: 12874
diff changeset
269 }
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
270 } else if(r < 0) {
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
271 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_SelectError);
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
272 return;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
273 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
274
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
275 w = 0;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
276 for(i = 1 ; i < 3 ; i++) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
277 if(FD_ISSET(mpriv->child_fd[i],&rfd)){
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
278 if(w) mpriv->add_line = 1;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
279 r = read(mpriv->child_fd[i],buffer,255);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
280 if(r < 0)
23874
702707dc7521 Give message string a more meaningful name.
diego
parents: 23871
diff changeset
281 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_ReadErrorOnChildFD, i == 1 ? "stdout":"stderr");
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
282 else if(r>0) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
283 buffer[r] = '\0';
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
284 add_string(mpriv,buffer);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
285 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
286 w = 1;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
287 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
288 }
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 10333
diff changeset
289 #endif
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
290
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
291 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
292
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
293 #define close_pipe(pipe) close(pipe[0]); close(pipe[1])
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
294
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
295 static int run_shell_cmd(menu_t* menu, char* cmd) {
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 10333
diff changeset
296 #ifndef __MINGW32__
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
297 int in[2],out[2],err[2];
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
298
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
299 mp_msg(MSGT_GLOBAL,MSGL_INFO,MSGTR_LIBMENU_ConsoleRun,cmd);
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
300 if(mpriv->child) {
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
301 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_AChildIsAlreadyRunning);
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
302 return 0;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
303 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
304
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
305 pipe(in);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
306 pipe(out);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
307 pipe(err);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
308
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
309 mpriv->child = fork();
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
310 if(mpriv->child < 0) {
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
311 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_ForkFailed);
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
312 close_pipe(in);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
313 close_pipe(out);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
314 close_pipe(err);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
315 return 0;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
316 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
317 if(!mpriv->child) { // Chlid process
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
318 int err_fd = dup(2);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
319 FILE* errf = fdopen(err_fd,"w");
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
320 // Bind the std fd to our pipes
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
321 dup2(in[0],0);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
322 dup2(out[1],1);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
323 dup2(err[1],2);
10333
7b8a3f2101b6 64bit support
alex
parents: 9380
diff changeset
324 execl("/bin/sh","sh","-c",cmd,(void*)NULL);
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
325 fprintf(errf,"exec failed : %s\n",strerror(errno));
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
326 exit(1);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
327 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
328 // MPlayer
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
329 mpriv->child_fd[0] = in[1];
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
330 mpriv->child_fd[1] = out[0];
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
331 mpriv->child_fd[2] = err[0];
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
332 mpriv->prompt = mpriv->child_prompt;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
333 //add_line(mpriv,"Child process started");
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 10333
diff changeset
334 #endif
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
335 return 1;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
336 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
337
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
338 static void enter_cmd(menu_t* menu) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
339 history_t* h;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
340 char input[strlen(mpriv->cur_history->buffer) + strlen(mpriv->prompt) + 1];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
341
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
342 sprintf(input,"%s%s",mpriv->prompt,mpriv->cur_history->buffer);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
343 add_line(mpriv,input);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
344
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
345 if(mpriv->history == mpriv->cur_history) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
346 if(mpriv->history_size >= mpriv->history_max) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
347 history_t* i;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
348 for(i = mpriv->history ; i->prev ; i = i->prev)
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
349 /**/;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
350 i->next->prev = NULL;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
351 free(i->buffer);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
352 free(i);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
353 } else
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
354 mpriv->history_size++;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
355 h = calloc(1,sizeof(history_t));
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
356 h->size = 255;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
357 h->buffer = calloc(h->size,1);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
358 h->prev = mpriv->history;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
359 mpriv->history->next = h;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
360 mpriv->history = h;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
361 } else
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
362 mpriv->history->buffer[0] = '\0';
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
363
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
364 mpriv->cur_history = mpriv->history;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
365 //mpriv->input = mpriv->cur_history->buffer;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
366 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
367
25263
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
368 static void read_cmd(menu_t* menu,int cmd) {
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
369 switch(cmd) {
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
370 case MENU_CMD_CANCEL:
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
371 if(mpriv->hide_time)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
372 mpriv->hide_ts = GetTimerMS();
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
373 else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
374 menu->show = 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
375 mpriv->show_ts = 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
376 return;
25263
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
377 case MENU_CMD_OK: {
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
378 mp_cmd_t* c;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
379 if(mpriv->child) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
380 char *str = mpriv->cur_history->buffer;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
381 int l = strlen(str);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
382 while(l > 0) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
383 int w = write(mpriv->child_fd[0],str,l);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
384 if(w < 0) {
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
385 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_WriteError);
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
386 break;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
387 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
388 l -= w;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
389 str += w;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
390 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
391 if(write(mpriv->child_fd[0],"\n",1) < 0)
17994
6927fabaef92 Part1 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu
reynaldo
parents: 17993
diff changeset
392 mp_msg(MSGT_GLOBAL,MSGL_ERR,MSGTR_LIBMENU_WriteError);
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
393 enter_cmd(menu);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
394 return;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
395 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
396 c = mp_input_parse_cmd(mpriv->cur_history->buffer);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
397 enter_cmd(menu);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
398 if(!c)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
399 add_line(mpriv,"Invalid command try help");
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
400 else {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
401 switch(c->id) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
402 case MP_CMD_CHELP:
12874
4e8887e99fef Fix typos and better explanatory text.
diego
parents: 12646
diff changeset
403 add_line(mpriv,"MPlayer console 0.01");
4e8887e99fef Fix typos and better explanatory text.
diego
parents: 12646
diff changeset
404 add_line(mpriv,"TODO: meaningful help message ;)");
4e8887e99fef Fix typos and better explanatory text.
diego
parents: 12646
diff changeset
405 add_line(mpriv,"Enter any slave command");
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
406 add_line(mpriv,"exit close this console");
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
407 break;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
408 case MP_CMD_CEXIT:
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
409 menu->show = 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
410 menu->cl = 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
411 break;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
412 case MP_CMD_CHIDE:
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
413 if(mpriv->hide_time)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
414 mpriv->hide_ts = GetTimerMS();
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
415 else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
416 menu->show = 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
417 mpriv->show_ts = 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
418 break;
14087
26937d8c5c9e enable the run slave commande even without libmenu
aurel
parents: 13391
diff changeset
419 case MP_CMD_RUN:
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
420 run_shell_cmd(menu,c->args[0].v.s);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
421 break;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
422 default: // Send the other commands to mplayer
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
423 mp_input_queue_cmd(c);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
424 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
425 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
426 return;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
427 }
25263
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
428 case MENU_CMD_UP:
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
429 if(mpriv->cur_history->prev)
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
430 mpriv->cur_history = mpriv->cur_history->prev;
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
431 break;
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
432 case MENU_CMD_DOWN:
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
433 if(mpriv->cur_history->next)
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
434 mpriv->cur_history = mpriv->cur_history->next;
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
435 break;
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
436 }
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
437 }
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
438
25502
605d4e3e403f From now on, libmenu does not steal all input keys from input modules.
ulion
parents: 25263
diff changeset
439 static int read_key(menu_t* menu,int c) {
25263
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
440 if(mpriv->child && mpriv->raw_child) {
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
441 write(mpriv->child_fd[0],&c,sizeof(int));
25502
605d4e3e403f From now on, libmenu does not steal all input keys from input modules.
ulion
parents: 25263
diff changeset
442 return 1;
25263
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
443 }
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
444
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
445 if (c == KEY_DELETE || c == KEY_BS) {
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
446 unsigned int i = strlen(mpriv->cur_history->buffer);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
447 if(i > 0)
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
448 mpriv->cur_history->buffer[i-1] = '\0';
25502
605d4e3e403f From now on, libmenu does not steal all input keys from input modules.
ulion
parents: 25263
diff changeset
449 return 1;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
450 }
25263
96d0992c7920 Remove hardcoded key->cmd bindings in libmenu, support custom key bindings
ulion
parents: 23874
diff changeset
451 if (menu_dflt_read_key(menu, c))
25502
605d4e3e403f From now on, libmenu does not steal all input keys from input modules.
ulion
parents: 25263
diff changeset
452 return 1;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
453
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
454 if(isascii(c)) {
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
455 int l = strlen(mpriv->cur_history->buffer);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
456 if(l >= mpriv->cur_history->size) {
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
457 mpriv->cur_history->size += 255;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
458 mpriv->cur_history->buffer = realloc(mpriv->cur_history,mpriv->cur_history->size);
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
459 }
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
460 mpriv->cur_history->buffer[l] = (char)c;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
461 mpriv->cur_history->buffer[l+1] = '\0';
25502
605d4e3e403f From now on, libmenu does not steal all input keys from input modules.
ulion
parents: 25263
diff changeset
462 return 1;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
463 }
25502
605d4e3e403f From now on, libmenu does not steal all input keys from input modules.
ulion
parents: 25263
diff changeset
464 return 0;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
465 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
466
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
467
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 10333
diff changeset
468 static int openMenu(menu_t* menu, char* args) {
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
469
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
470
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
471 menu->draw = draw;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
472 menu->read_cmd = read_cmd;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
473 menu->read_key = read_key;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
474
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
475 mpriv->lines = calloc(mpriv->buf_lines,sizeof(char*));
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
476 mpriv->prompt = mpriv->mp_prompt;
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
477 mpriv->cur_history = mpriv->history = calloc(1,sizeof(history_t));
18858
ac17673b640d gets ride of a few more sizeof(char)s
reynaldo
parents: 17994
diff changeset
478 mpriv->cur_history->buffer = calloc(255,1);
8227
3050cfda3c61 A new command to run shell process and a command history.
albeu
parents: 8197
diff changeset
479 mpriv->cur_history->size = 255;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28113
diff changeset
480
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
481 if(args)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
482 add_line(mpriv,args);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
483
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
484 return 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
485 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
486
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
487 const menu_info_t menu_info_console = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
488 "MPlayer console",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
489 "console",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
490 "Albeu",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
491 "",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
492 {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
493 "console_cfg",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
494 sizeof(struct menu_priv_s),
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
495 &cfg_dflt,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
496 cfg_fields
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
497 },
10864
a2537e7d2d76 make menu work on mingw (run command is still disabled), based on patch by Christophe Perinaud
faust3
parents: 10333
diff changeset
498 openMenu,
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
499 };