Mercurial > mplayer.hg
annotate gui/skin/skin.c @ 32856:559e0f6d9d8b
Cosmetic: Use more natural notations.
author | ib |
---|---|
date | Sun, 20 Feb 2011 01:10:52 +0000 |
parents | c31ad08f0a37 |
children | cf385b1901cb |
rev | line source |
---|---|
26458 | 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 */ | |
23077 | 18 |
19 #include <stdio.h> | |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 | |
23 #include "cut.h" | |
24 #include "font.h" | |
30529 | 25 #include "skin.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
23703
diff
changeset
|
26 #include "gui/app.h" |
23077 | 27 |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
28 #include "config.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
29 #include "mp_msg.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
30 #include "help_mp.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
23703
diff
changeset
|
31 #include "gui/mplayer/widgets.h" |
23703
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23077
diff
changeset
|
32 #include "libavutil/avstring.h" |
23077 | 33 |
34 //#define MSGL_DBG2 MSGL_STATUS | |
35 | |
36 listItems * skinAppMPlayer = &appMPlayer; | |
37 | |
38 // --- | |
39 | |
40 static int linenumber; | |
41 | |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
42 static unsigned char path[512]; |
23077 | 43 |
44 static listItems * defList = NULL; | |
45 static unsigned char window_name[32] = ""; | |
46 | |
47 static wItem * currSection = NULL; | |
48 static int * currSubItem = NULL; | |
49 static wItem * currSubItems = NULL; | |
50 | |
51 #include <stdarg.h> | |
52 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
53 static void ERRORMESSAGE( const char * format, ... ) |
23077 | 54 { |
55 char p[512]; | |
56 char tmp[512]; | |
57 va_list ap; | |
58 va_start( ap,format ); | |
32845 | 59 vsnprintf( p,sizeof(p),format,ap ); |
23077 | 60 va_end( ap ); |
61 mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_SKIN_ERRORMESSAGE,linenumber,p ); | |
32845 | 62 snprintf( tmp,sizeof(tmp),MSGTR_SKIN_ERRORMESSAGE,linenumber,p ); |
23077 | 63 gtkMessageBox( GTK_MB_FATAL,tmp ); |
64 } | |
65 | |
66 #define CHECKDEFLIST( str ) \ | |
67 { \ | |
68 if ( defList == NULL ) \ | |
69 { \ | |
70 mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_SKIN_WARNING1,linenumber,str ); \ | |
71 return 1; \ | |
72 } \ | |
73 } | |
74 | |
75 #define CHECKWINLIST( str ) \ | |
76 { \ | |
77 if ( !window_name[0] ) \ | |
78 { \ | |
79 mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_SKIN_WARNING2,linenumber,str ); \ | |
80 return 1; \ | |
81 } \ | |
82 } | |
83 | |
84 #define CHECK( name ) \ | |
85 { \ | |
86 if ( !strcmp( window_name,name ) ) \ | |
87 { \ | |
88 mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_SKIN_WARNING3,linenumber,name ); \ | |
89 return 1; \ | |
90 } \ | |
91 } | |
92 | |
93 static char * strlower( char * in ) | |
94 { | |
32853 | 95 char *p = in; |
96 while (*p) | |
97 { | |
98 if (*p >= 'A' && *p <= 'Z') *p += ' '; | |
99 p++; | |
100 } | |
23077 | 101 return in; |
102 } | |
103 | |
104 int skinBPRead( char * fname, txSample * bf ) | |
105 { | |
106 int i=bpRead( fname,bf ); | |
107 switch ( i ) | |
108 { | |
109 case -1: ERRORMESSAGE( MSGTR_SKIN_BITMAP_16bit,fname ); break; | |
110 case -2: ERRORMESSAGE( MSGTR_SKIN_BITMAP_FileNotFound,fname ); break; | |
111 case -3: ERRORMESSAGE( MSGTR_SKIN_BITMAP_BMPReadError,fname ); break; | |
112 case -4: ERRORMESSAGE( MSGTR_SKIN_BITMAP_TGAReadError,fname ); break; | |
113 case -5: ERRORMESSAGE( MSGTR_SKIN_BITMAP_PNGReadError,fname ); break; | |
114 case -6: ERRORMESSAGE( MSGTR_SKIN_BITMAP_RLENotSupported,fname ); break; | |
115 case -7: ERRORMESSAGE( MSGTR_SKIN_BITMAP_UnknownFileType,fname ); break; | |
116 case -8: ERRORMESSAGE( MSGTR_SKIN_BITMAP_ConversionError,fname ); break; | |
117 } | |
118 return i; | |
119 } | |
120 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
121 static int cmd_section( char * in ) |
23077 | 122 { |
123 strlower( in ); | |
124 defList=NULL; | |
125 if ( !strcmp( in,"movieplayer" ) ) defList=skinAppMPlayer; | |
126 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] sectionname: %s\n",in ); | |
127 return 0; | |
128 } | |
129 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
130 static int cmd_end( char * in ) |
23077 | 131 { |
132 if ( strlen( window_name ) ) { window_name[0]=0; currSection=NULL; currSubItem=NULL; currSubItems=NULL; } | |
133 else defList=NULL; | |
134 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] end section\n" ); | |
135 return 0; | |
136 } | |
137 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
138 static int cmd_window( char * in ) |
23077 | 139 { |
140 CHECKDEFLIST( "window" ); | |
141 | |
23703
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23077
diff
changeset
|
142 av_strlcpy( window_name,strlower( in ),sizeof( window_name ) ); |
23077 | 143 if ( !strncmp( in,"main",4 ) ) { currSection=&skinAppMPlayer->main; currSubItem=&skinAppMPlayer->NumberOfItems; currSubItems=skinAppMPlayer->Items; } |
144 else if ( !strncmp( in,"sub",3 ) ) currSection=&skinAppMPlayer->sub; | |
145 else if ( !strncmp( in,"playbar",7 ) ) { currSection=&skinAppMPlayer->bar; currSubItem=&skinAppMPlayer->NumberOfBarItems; currSubItems=skinAppMPlayer->barItems; } | |
146 else if ( !strncmp( in,"menu",4 ) ) { currSection=&skinAppMPlayer->menuBase; currSubItem=&skinAppMPlayer->NumberOfMenuItems; currSubItems=skinAppMPlayer->MenuItems; } | |
147 else ERRORMESSAGE( MSGTR_UNKNOWNWINDOWTYPE ); | |
148 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] window: %s\n",window_name ); | |
149 return 0; | |
150 } | |
151 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
152 static int cmd_base( char * in ) |
23077 | 153 { |
154 unsigned char fname[512]; | |
155 unsigned char tmp[512]; | |
156 int x,y; | |
157 int sx=0,sy=0; | |
158 | |
159 CHECKDEFLIST( "base" ); | |
160 CHECKWINLIST( "base" ); | |
161 | |
162 cutItem( in,fname,',',0 ); | |
163 x=cutItemToInt( in,',',1 ); | |
164 y=cutItemToInt( in,',',2 ); | |
165 sx=cutItemToInt( in,',',3 ); | |
166 sy=cutItemToInt( in,',',4 ); | |
167 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] base: %s x: %d y: %d ( %dx%d )\n",fname,x,y,sx,sy ); | |
168 if ( !strcmp( window_name,"main" ) ) | |
169 { | |
170 defList->main.x=x; | |
171 defList->main.y=y; | |
172 defList->main.type=itBase; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
173 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, fname, sizeof( tmp )); |
32856 | 174 if ( skinBPRead( tmp,&defList->main.Bitmap ) != 0 ) return 1; |
23077 | 175 defList->main.width=defList->main.Bitmap.Width; |
176 defList->main.height=defList->main.Bitmap.Height; | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
26458
diff
changeset
|
177 #ifdef CONFIG_XSHAPE |
23077 | 178 Convert32to1( &defList->main.Bitmap,&defList->main.Mask,0x00ff00ff ); |
179 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] mask: %dx%d\n",defList->main.Mask.Width,defList->main.Mask.Height ); | |
180 #else | |
181 defList->main.Mask.Image=NULL; | |
182 #endif | |
183 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] width: %d height: %d\n",defList->main.width,defList->main.height ); | |
184 } | |
185 if ( !strcmp( window_name,"sub" ) ) | |
186 { | |
187 defList->sub.type=itBase; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
188 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, fname, sizeof( tmp )); |
32856 | 189 if ( skinBPRead( tmp,&defList->sub.Bitmap ) != 0 ) return 1; |
23077 | 190 defList->sub.x=x; |
191 defList->sub.y=y; | |
192 defList->sub.width=defList->sub.Bitmap.Width; | |
193 defList->sub.height=defList->sub.Bitmap.Height; | |
194 if ( sx && sy ) | |
195 { | |
196 defList->sub.width=sx; | |
197 defList->sub.height=sy; | |
198 } | |
199 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] %d,%d %dx%d\n",defList->sub.x,defList->sub.y,defList->sub.width,defList->sub.height ); | |
200 } | |
201 if ( !strcmp( window_name,"menu" ) ) | |
202 { | |
203 defList->menuIsPresent=1; | |
204 defList->menuBase.type=itBase; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
205 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, fname, sizeof( tmp )); |
32856 | 206 if ( skinBPRead( tmp,&defList->menuBase.Bitmap ) != 0 ) return 1; |
23077 | 207 defList->menuBase.width=defList->menuBase.Bitmap.Width; |
208 defList->menuBase.height=defList->menuBase.Bitmap.Height; | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
26458
diff
changeset
|
209 #ifdef CONFIG_XSHAPE |
23077 | 210 Convert32to1( &defList->menuBase.Bitmap,&defList->menuBase.Mask,0x00ff00ff ); |
211 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] mask: %dx%d\n",defList->menuBase.Mask.Width,defList->menuBase.Mask.Height ); | |
212 #else | |
213 defList->menuBase.Mask.Image=NULL; | |
214 #endif | |
215 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] width: %d height: %d\n",defList->menuBase.width,defList->menuBase.height ); | |
216 } | |
217 if ( !strcmp( window_name,"playbar" ) ) | |
218 { | |
219 defList->barIsPresent=1; | |
220 defList->bar.x=x; | |
221 defList->bar.y=y; | |
222 defList->bar.type=itBase; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
223 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, fname, sizeof( tmp )); |
32856 | 224 if ( skinBPRead( tmp,&defList->bar.Bitmap ) != 0 ) return 1; |
23077 | 225 defList->bar.width=defList->bar.Bitmap.Width; |
226 defList->bar.height=defList->bar.Bitmap.Height; | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
26458
diff
changeset
|
227 #ifdef CONFIG_XSHAPE |
23077 | 228 Convert32to1( &defList->bar.Bitmap,&defList->bar.Mask,0x00ff00ff ); |
229 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] mask: %dx%d\n",defList->bar.Mask.Width,defList->bar.Mask.Height ); | |
230 #else | |
231 defList->bar.Mask.Image=NULL; | |
232 #endif | |
233 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] width: %d height: %d\n",defList->bar.width,defList->bar.height ); | |
234 } | |
235 return 0; | |
236 } | |
237 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
238 static int cmd_background( char * in ) |
23077 | 239 { |
240 CHECKDEFLIST( "background" ); | |
241 CHECKWINLIST( "background" ); | |
242 | |
243 CHECK( "menu" ); | |
244 CHECK( "main" ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
245 |
23077 | 246 currSection->R=cutItemToInt( in,',',0 ); |
247 currSection->G=cutItemToInt( in,',',1 ); | |
248 currSection->B=cutItemToInt( in,',',2 ); | |
249 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] background color is #%x%x%x.\n",currSection->R,currSection->G,currSection->B ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
250 |
23077 | 251 return 0; |
252 } | |
253 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
254 static int cmd_button( char * in ) |
23077 | 255 { |
256 unsigned char fname[512]; | |
257 unsigned char tmp[512]; | |
258 int x,y,sx,sy; | |
259 char msg[32]; | |
260 | |
261 CHECKDEFLIST( "button" ); | |
262 CHECKWINLIST( "button" ); | |
263 | |
264 CHECK( "sub" ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
265 CHECK( "menu" ); |
23077 | 266 |
267 cutItem( in,fname,',',0 ); | |
268 x=cutItemToInt( in,',',1 ); | |
269 y=cutItemToInt( in,',',2 ); | |
270 sx=cutItemToInt( in,',',3 ); | |
271 sy=cutItemToInt( in,',',4 ); | |
272 cutItem( in,msg,',',5 ); | |
273 | |
274 (*currSubItem)++; | |
275 currSubItems[ *currSubItem ].type=itButton; | |
276 currSubItems[ *currSubItem ].x=x; | |
277 currSubItems[ *currSubItem ].y=y; | |
278 currSubItems[ *currSubItem ].width=sx; | |
279 currSubItems[ *currSubItem ].height=sy; | |
280 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] button: fname: %s\n",fname ); | |
281 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] x: %d y: %d sx: %d sy: %d\n",x,y,sx,sy ); | |
282 | |
283 if ( ( currSubItems[ *currSubItem ].msg=appFindMessage( msg ) ) == -1 ) | |
284 { ERRORMESSAGE( MSGTR_SKIN_BITMAP_UnknownMessage,msg ); return 0; } | |
285 currSubItems[ *currSubItem ].pressed=btnReleased; | |
286 if ( currSubItems[ *currSubItem ].msg == evPauseSwitchToPlay ) currSubItems[ *currSubItem ].pressed=btnDisabled; | |
287 currSubItems[ *currSubItem ].tmp=1; | |
288 | |
289 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] message: %d\n",currSubItems[ *currSubItem ].msg ); | |
290 | |
291 currSubItems[ *currSubItem ].Bitmap.Image=NULL; | |
32856 | 292 if ( strcmp( fname,"NULL" ) != 0 ) |
23077 | 293 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
294 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, fname, sizeof( tmp )); |
32856 | 295 if ( skinBPRead( tmp,&currSubItems[ *currSubItem ].Bitmap ) != 0 ) return 1; |
23077 | 296 } |
297 | |
298 return 0; | |
299 } | |
300 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
301 static int cmd_selected( char * in ) |
23077 | 302 { |
303 unsigned char fname[512]; | |
304 unsigned char tmp[512]; | |
305 | |
306 CHECKDEFLIST( "selected" ); | |
307 CHECKWINLIST( "selected" ); | |
308 | |
309 CHECK( "main" ); | |
310 CHECK( "sub" ); | |
311 CHECK( "playbar" ); | |
312 | |
313 cutItem( in,fname,',',0 ); | |
314 defList->menuSelected.type=itBase; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
315 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, fname, sizeof( tmp )); |
23077 | 316 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] selected: %s\n",fname ); |
32856 | 317 if ( skinBPRead( tmp,&defList->menuSelected.Bitmap ) != 0 ) return 1; |
23077 | 318 defList->menuSelected.width=defList->menuSelected.Bitmap.Width; |
319 defList->menuSelected.height=defList->menuSelected.Bitmap.Height; | |
320 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] width: %d height: %d\n",defList->menuSelected.width,defList->menuSelected.height ); | |
321 return 0; | |
322 } | |
323 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
324 static int cmd_menu( char * in ) |
23077 | 325 { // menu = number,x,y,sx,sy,msg |
326 int x,y,sx,sy,msg; | |
327 unsigned char tmp[64]; | |
328 | |
329 CHECKDEFLIST( "menu" ); | |
330 CHECKWINLIST( "menu" ); | |
331 | |
332 CHECK( "main" ); | |
333 CHECK( "sub" ); | |
334 CHECK( "playbar" ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
335 |
23077 | 336 x=cutItemToInt( in,',',0 ); |
337 y=cutItemToInt( in,',',1 ); | |
338 sx=cutItemToInt( in,',',2 ); | |
339 sy=cutItemToInt( in,',',3 ); | |
340 cutItem( in,tmp,',',4 ); msg=appFindMessage( tmp ); | |
341 | |
342 defList->NumberOfMenuItems++; | |
343 defList->MenuItems[ defList->NumberOfMenuItems ].x=x; | |
344 defList->MenuItems[ defList->NumberOfMenuItems ].y=y; | |
345 defList->MenuItems[ defList->NumberOfMenuItems ].width=sx; | |
346 defList->MenuItems[ defList->NumberOfMenuItems ].height=sy; | |
347 | |
348 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] menuitem: %d\n",defList->NumberOfMenuItems ); | |
349 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] x: %d y: %d sx: %d sy: %d\n",x,y,sx,sy ); | |
350 | |
351 if ( ( defList->MenuItems[ defList->NumberOfMenuItems ].msg=msg ) == -1 ) | |
352 ERRORMESSAGE( MSGTR_SKIN_BITMAP_UnknownMessage,tmp ); | |
353 | |
354 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] message: %d\n",defList->Items[ defList->NumberOfItems ].msg ); | |
355 | |
356 defList->MenuItems[ defList->NumberOfMenuItems ].Bitmap.Image=NULL; | |
357 return 0; | |
358 } | |
359 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
360 static int cmd_hpotmeter( char * in ) |
23077 | 361 { // hpotmeter=buttonbitmaps,sx,sy,phasebitmaps,phases,default value,x,y,sx,sy,msg |
362 int x,y,psx,psy,ph,sx,sy,msg,d; | |
363 unsigned char tmp[512]; | |
364 unsigned char pfname[512]; | |
365 unsigned char phfname[512]; | |
366 wItem * item; | |
367 | |
368 CHECKDEFLIST( "hpotmeter" ); | |
369 CHECKWINLIST( "hpotmeter" ); | |
370 | |
371 CHECK( "sub" ); | |
372 CHECK( "menu" ); | |
373 | |
374 cutItem( in,pfname,',',0 ); | |
375 psx=cutItemToInt( in,',',1 ); | |
376 psy=cutItemToInt( in,',',2 ); | |
377 cutItem( in,phfname,',',3 ); | |
378 ph=cutItemToInt( in,',',4 ); | |
379 d=cutItemToInt( in,',',5 ); | |
380 x=cutItemToInt( in,',',6 ); | |
381 y=cutItemToInt( in,',',7 ); | |
382 sx=cutItemToInt( in,',',8 ); | |
383 sy=cutItemToInt( in,',',9 ); | |
384 cutItem( in,tmp,',',10 ); msg=appFindMessage( tmp ); | |
385 | |
386 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] h/v potmeter: pointer filename: '%s'\n",pfname ); | |
387 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] pointer size is %dx%d\n",psx,psy ); | |
388 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] phasebitmaps filename: '%s'\n",phfname ); | |
389 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] position: %d,%d %dx%d\n",x,y,sx,sy ); | |
390 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] default value: %d\n",d ); | |
391 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] message: %d\n",msg ); | |
392 | |
393 (*currSubItem)++; | |
394 item=&currSubItems[ *currSubItem ]; | |
395 | |
396 item->type=itHPotmeter; | |
397 item->x=x; item->y=y; item->width=sx; item->height=sy; | |
398 item->phases=ph; | |
399 item->psx=psx; item->psy=psy; | |
400 item->msg=msg; | |
401 item->value=(float)d; | |
402 item->pressed=btnReleased; | |
403 | |
404 item->Bitmap.Image=NULL; | |
32856 | 405 if ( strcmp( phfname,"NULL" ) != 0 ) |
23077 | 406 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
407 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, phfname, sizeof( tmp )); |
32856 | 408 if ( skinBPRead( tmp,&item->Bitmap ) != 0 ) return 1; |
23077 | 409 } |
410 | |
411 item->Mask.Image=NULL; | |
32856 | 412 if ( strcmp( pfname,"NULL" ) != 0 ) |
23077 | 413 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
414 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, pfname, sizeof( tmp )); |
32856 | 415 if ( skinBPRead( tmp,&item->Mask ) != 0 ) return 1; |
23077 | 416 } |
417 return 0; | |
418 } | |
419 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
420 static int cmd_vpotmeter( char * in ) |
23077 | 421 { |
422 int r = cmd_hpotmeter( in ); | |
423 wItem * item; | |
424 | |
425 item=&currSubItems[ *currSubItem ]; | |
426 item->type=itVPotmeter; | |
427 return r; | |
428 } | |
429 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
430 static int cmd_potmeter( char * in ) |
23077 | 431 { // potmeter=phasebitmaps,phases,default value,x,y,sx,sy,msg |
432 int x,y,ph,sx,sy,msg,d; | |
433 unsigned char tmp[512]; | |
434 unsigned char phfname[512]; | |
435 wItem * item; | |
436 | |
437 CHECKDEFLIST( "potmeter" ); | |
438 CHECKWINLIST( "potmeter" ); | |
439 | |
440 CHECK( "sub" ); | |
441 CHECK( "menu" ); | |
442 | |
443 cutItem( in,phfname,',',0 ); | |
444 ph=cutItemToInt( in,',',1 ); | |
445 d=cutItemToInt( in,',',2 ); | |
446 x=cutItemToInt( in,',',3 ); | |
447 y=cutItemToInt( in,',',4 ); | |
448 sx=cutItemToInt( in,',',5 ); | |
449 sy=cutItemToInt( in,',',6 ); | |
450 cutItem( in,tmp,',',7 ); msg=appFindMessage( tmp ); | |
451 | |
452 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] potmeter: phases filename: '%s'\n",phfname ); | |
453 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] position: %d,%d %dx%d\n",x,y,sx,sy ); | |
454 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] phases: %d\n",ph ); | |
455 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] default value: %d\n",d ); | |
456 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] message: %d\n",msg ); | |
457 | |
458 (*currSubItem)++; | |
459 item=&currSubItems[ *currSubItem ]; | |
460 | |
461 item->type=itPotmeter; | |
462 item->x=x; item->y=y; | |
463 item->width=sx; item->height=sy; | |
464 item->phases=ph; | |
465 item->msg=msg; | |
466 item->value=(float)d; | |
467 | |
468 item->Bitmap.Image=NULL; | |
32856 | 469 if ( strcmp( phfname,"NULL" ) != 0 ) |
23077 | 470 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27377
diff
changeset
|
471 av_strlcpy(tmp, path, sizeof( tmp )); av_strlcat(tmp, phfname, sizeof( tmp )); |
32856 | 472 if ( skinBPRead( tmp,&item->Bitmap ) != 0 ) return 1; |
23077 | 473 } |
474 return 0; | |
475 } | |
476 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
477 static int cmd_font( char * in ) |
32740 | 478 { // font=fontname |
23077 | 479 char name[512]; |
480 wItem * item; | |
481 | |
482 CHECKDEFLIST( "font" ); | |
483 CHECKWINLIST( "font" ); | |
484 | |
485 CHECK( "sub" ); | |
486 CHECK( "menu" ); | |
487 | |
488 cutItem( in,name,',',0 ); | |
489 | |
490 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] font\n" ); | |
491 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] name: %s\n",name ); | |
492 | |
493 (*currSubItem)++; | |
494 item=&currSubItems[ *currSubItem ]; | |
495 | |
496 item->type=itFont; | |
497 item->fontid=fntRead( path,name ); | |
498 switch ( item->fontid ) | |
499 { | |
500 case -1: ERRORMESSAGE( MSGTR_SKIN_FONT_NotEnoughtMemory ); return 1; | |
501 case -2: ERRORMESSAGE( MSGTR_SKIN_FONT_TooManyFontsDeclared ); return 1; | |
502 case -3: ERRORMESSAGE( MSGTR_SKIN_FONT_FontFileNotFound ); return 1; | |
503 case -4: ERRORMESSAGE( MSGTR_SKIN_FONT_FontImageNotFound ); return 1; | |
504 } | |
505 return 0; | |
506 } | |
507 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
508 static int cmd_slabel( char * in ) |
23077 | 509 { |
510 char tmp[512]; | |
32846 | 511 char sid[64]; |
23077 | 512 int x,y,id; |
513 wItem * item; | |
514 | |
515 CHECKDEFLIST( "slabel" ); | |
516 CHECKWINLIST( "slabel" ); | |
517 | |
518 CHECK( "sub" ); | |
519 CHECK( "menu" ); | |
520 | |
521 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] slabel\n" ); | |
522 | |
523 x=cutItemToInt( in,',',0 ); | |
524 y=cutItemToInt( in,',',1 ); | |
525 cutItem( in,sid,',',2 ); id=fntFindID( sid ); | |
526 if ( id < 0 ) { ERRORMESSAGE( MSGTR_SKIN_FONT_NonExistentFontID,sid ); return 1; } | |
527 cutItem( in,tmp,',',3 ); cutItem( tmp,tmp,'"',1 ); | |
528 | |
529 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] pos: %d,%d\n",x,y ); | |
530 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] id: %s ( %d )\n",sid,id ); | |
531 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] str: '%s'\n",tmp ); | |
532 | |
533 (*currSubItem)++; | |
534 item=&currSubItems[ *currSubItem ]; | |
535 | |
536 item->type=itSLabel; | |
537 item->fontid=id; | |
538 item->x=x; item->y=y; | |
539 item->width=-1; item->height=-1; | |
540 if ( ( item->label=malloc( strlen( tmp ) + 1 ) ) == NULL ) { ERRORMESSAGE( MSGTR_SKIN_FONT_NotEnoughtMemory ); return 1; } | |
541 strcpy( item->label,tmp ); | |
542 | |
543 return 0; | |
544 } | |
545 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
546 static int cmd_dlabel( char * in ) |
32740 | 547 { // dlabel=x,y,sx,align,fontfile,string ... |
23077 | 548 char tmp[512]; |
32846 | 549 char sid[64]; |
23077 | 550 int x,y,sx,id,a; |
551 wItem * item; | |
552 | |
553 CHECKDEFLIST( "dlabel" ); | |
554 CHECKWINLIST( "dlabel" ); | |
555 | |
556 CHECK( "sub" ); | |
557 CHECK( "menu" ); | |
558 | |
559 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] dlabel\n" ); | |
560 | |
561 x=cutItemToInt( in,',',0 ); | |
562 y=cutItemToInt( in,',',1 ); | |
563 sx=cutItemToInt( in,',',2 ); | |
564 a=cutItemToInt( in,',',3 ); | |
565 cutItem( in,sid,',',4 ); id=fntFindID( sid ); | |
566 if ( id < 0 ) { ERRORMESSAGE( MSGTR_SKIN_FONT_NonExistentFontID,sid ); return 1; } | |
567 cutItem( in,tmp,',',5 ); cutItem( tmp,tmp,'"',1 ); | |
568 | |
569 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] pos: %d,%d width: %d align: %d\n",x,y,sx,a ); | |
570 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] id: %s ( %d )\n",sid,id ); | |
571 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] str: '%s'\n",tmp ); | |
572 | |
573 (*currSubItem)++; | |
574 item=&currSubItems[ *currSubItem ]; | |
575 | |
576 item->type=itDLabel; | |
577 item->fontid=id; item->align=a; | |
578 item->x=x; item->y=y; | |
579 item->width=sx; item->height=-1; | |
580 if ( ( item->label=malloc( strlen( tmp ) + 1 ) ) == NULL ) { ERRORMESSAGE( MSGTR_SKIN_FONT_NotEnoughtMemory ); return 1; } | |
581 strcpy( item->label,tmp ); | |
582 | |
583 return 0; | |
584 } | |
585 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30529
diff
changeset
|
586 static int cmd_decoration( char * in ) |
23077 | 587 { |
588 char tmp[512]; | |
589 | |
590 CHECKDEFLIST( "decoration" ); | |
591 CHECKWINLIST( "decoration" ); | |
592 | |
593 CHECK( "sub" ); | |
594 CHECK( "menu" ); | |
595 CHECK( "playbar" ); | |
596 | |
597 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] window decoration is %s\n",in ); | |
598 strlower( in ); | |
599 cutItem( in,tmp,',',0 ); | |
32856 | 600 if ( strcmp( tmp,"enable" ) != 0&&strcmp( tmp,"disable" ) != 0 ) { ERRORMESSAGE( MSGTR_SKIN_UnknownParameter,tmp ); return 1; } |
601 if ( strcmp( tmp,"enable" ) != 0 ) defList->mainDecoration=0; | |
23077 | 602 else defList->mainDecoration=1; |
603 | |
604 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"\n[skin] window decoration is %s\n",(defList->mainDecoration?"enabled":"disabled") ); | |
605 return 0; | |
606 } | |
607 | |
608 typedef struct | |
609 { | |
610 const char * name; | |
611 int (*func)( char * in ); | |
612 } _item; | |
613 | |
614 _item skinItem[] = | |
615 { | |
616 { "section", cmd_section }, | |
617 { "end", cmd_end }, | |
618 { "window", cmd_window }, | |
619 { "base", cmd_base }, | |
620 { "button", cmd_button }, | |
621 { "selected", cmd_selected }, | |
622 { "background", cmd_background }, | |
623 { "vpotmeter", cmd_vpotmeter }, | |
624 { "hpotmeter", cmd_hpotmeter }, | |
625 { "potmeter", cmd_potmeter }, | |
626 { "font", cmd_font }, | |
627 { "slabel", cmd_slabel }, | |
628 { "dlabel", cmd_dlabel }, | |
629 { "decoration", cmd_decoration }, | |
630 { "menu", cmd_menu } | |
631 }; | |
632 | |
633 #define ITEMS (int)( sizeof( skinItem )/sizeof( _item ) ) | |
634 | |
635 char * strswap( char * in,char what,char whereof ) | |
636 { | |
637 int i; | |
638 if ( strlen( in ) == 0 ) return NULL; | |
639 for ( i=0;i<(int)strlen( in );i++ ) | |
640 if ( in[i] == what ) in[i]=whereof; | |
641 return in; | |
642 } | |
643 | |
644 char * trim( char * in ) | |
645 { | |
646 int c = 0,i = 0,id = 0; | |
647 if ( strlen( in ) == 0 ) return NULL; | |
648 while ( c != (int)strlen( in ) ) | |
649 { | |
650 if ( in[c] == '"' ) id=!id; | |
651 if ( ( in[c] == ' ' )&&( !id ) ) | |
652 { | |
653 for ( i=0;i<(int)strlen( in ) - c; i++ ) in[c+i]=in[c+i+1]; | |
654 continue; | |
655 } | |
656 c++; | |
657 } | |
658 return in; | |
659 } | |
660 | |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
661 static char *setname( char * item1, char * item2 ) |
23077 | 662 { |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
663 static char fn[512]; |
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
664 |
23703
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23077
diff
changeset
|
665 av_strlcpy(fn, item1, sizeof( fn )); |
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23077
diff
changeset
|
666 av_strlcat(fn, "/", sizeof( fn )); av_strlcat(fn, item2, sizeof( fn )); |
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23077
diff
changeset
|
667 av_strlcpy(path, fn, sizeof( path )); av_strlcat(path, "/", sizeof( path )); |
9fb716ab06a3
Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents:
23077
diff
changeset
|
668 av_strlcat(fn, "/skin", sizeof( fn )); |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
669 |
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
670 return fn; |
23077 | 671 } |
672 | |
673 int skinRead( char * dname ) | |
674 { | |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
675 char * fn; |
32855
c31ad08f0a37
Move declaration into scope of function where it's used.
ib
parents:
32853
diff
changeset
|
676 FILE * skinFile; |
32846 | 677 unsigned char tmp[256]; |
23077 | 678 unsigned char * ptmp; |
679 unsigned char command[32]; | |
680 unsigned char param[256]; | |
32843 | 681 int i; |
23077 | 682 |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
683 fn = setname( skinDirInHome,dname ); |
23077 | 684 if ( ( skinFile = fopen( fn,"rt" ) ) == NULL ) |
685 { | |
32850
48583fc18d1a
Make setname() directly return the string created instead of writing it
ib
parents:
32849
diff
changeset
|
686 fn = setname( skinMPlayerDir,dname ); |
23077 | 687 if ( ( skinFile = fopen( fn,"rt" ) ) == NULL ) |
688 { | |
32848 | 689 mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_SKIN_SkinFileNotFound,fn ); |
690 return -1; | |
23077 | 691 } |
692 } | |
693 | |
694 mp_dbg( MSGT_GPLAYER,MSGL_DBG2,"[skin] file: %s\n",fn ); | |
695 | |
696 appInitStruct( skinAppMPlayer ); | |
697 | |
698 linenumber=0; | |
32845 | 699 while (fgets(tmp, sizeof(tmp), skinFile)) |
23077 | 700 { |
701 linenumber++; | |
702 | |
30404
5fbb30fa62cc
Fix newline removal code that might read and write out of bounds.
reimar
parents:
29263
diff
changeset
|
703 // remove any kind of newline, if any |
5fbb30fa62cc
Fix newline removal code that might read and write out of bounds.
reimar
parents:
29263
diff
changeset
|
704 tmp[strcspn(tmp, "\n\r")] = 0; |
32843 | 705 strswap( tmp,'\t',' ' ); |
706 trim( tmp ); | |
707 ptmp = strchr(tmp, ';'); | |
708 if (ptmp) *ptmp = 0; | |
709 if (!*tmp) continue; | |
710 cutItem( tmp,command,'=',0 ); cutItem( tmp,param,'=',1 ); | |
23077 | 711 strlower( command ); |
712 for( i=0;i<ITEMS;i++ ) | |
713 if ( !strcmp( command,skinItem[i].name ) ) | |
32856 | 714 if ( skinItem[i].func( param ) != 0 ) return -2; |
23077 | 715 } |
716 if (linenumber == 0) { | |
717 mp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_SKIN_SkinFileNotReadable, fn); | |
718 return -1; | |
719 } | |
720 return 0; | |
721 } |