Mercurial > mplayer.hg
annotate gui/interface.c @ 32676:db882cd69776
Do not #define _WIN32 on the command line for Cygwin.
Newer Cygwin versions no longer do this and hopefully we should be able
to survive without this hack as well. This change necessitates adapting
two #ifdefs in the MPlayer codebase. It is committed untested as I do
not have access to a Cygwin system.
author | diego |
---|---|
date | Thu, 06 Jan 2011 12:42:59 +0000 |
parents | 18338ee51c9d |
children | 6ff3cc81d602 |
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 <inttypes.h> | |
20 #include <stdlib.h> | |
21 #include <stdio.h> | |
22 #include <string.h> | |
23 #include <sys/types.h> | |
24 | |
25 #include "wm/ws.h" | |
26 #include "wm/wsxdnd.h" | |
27 #include "interface.h" | |
28 #include "skin/skin.h" | |
29 | |
30 #include "mplayer/gtk/eq.h" | |
31 #include "mplayer/widgets.h" | |
32 #include "mplayer/gmplayer.h" | |
33 #include "mplayer/play.h" | |
34 | |
35 #include "access_mpcontext.h" | |
32461 | 36 #include "sub/ass_mp.h" |
23077 | 37 #include "app.h" |
38 #include "cfg.h" | |
39 #include "help_mp.h" | |
30901 | 40 #include "path.h" |
30516 | 41 #include "mp_core.h" |
32032 | 42 #include "mpcommon.h" |
30536
39a4dd7ec420
Move GUI-related extern declarations to a GUI header file.
diego
parents:
30535
diff
changeset
|
43 #include "mplayer.h" |
30653
3d23e24c5c60
Declare externally used variables from vd.c as extern in vd.h.
diego
parents:
30536
diff
changeset
|
44 #include "libmpcodecs/vd.h" |
31424
283eac48391d
Move extern declarations for vf.c variables to vf.h.
diego
parents:
31373
diff
changeset
|
45 #include "libmpcodecs/vf.h" |
23077 | 46 #include "libvo/x11_common.h" |
47 #include "libvo/video_out.h" | |
32466
9e627a1793b1
Move font_load.[ch], font_load_ft.c and osd_font.h from libvo to sub.
cigaes
parents:
32461
diff
changeset
|
48 #include "sub/font_load.h" |
32467 | 49 #include "sub/sub.h" |
23077 | 50 #include "input/input.h" |
51 #include "libao2/audio_out.h" | |
52 #include "mixer.h" | |
53 #include "libaf/af.h" | |
54 #include "libaf/equalizer.h" | |
55 | |
27393 | 56 #ifdef CONFIG_ICONV |
23077 | 57 #include <iconv.h> |
58 #endif | |
59 | |
60 #include "stream/stream.h" | |
61 #include "libmpdemux/demuxer.h" | |
62 #include "libmpdemux/stheader.h" | |
31425
2392ad3cec9c
Move af_cfg extern variable declaration to dec_audio.h.
diego
parents:
31424
diff
changeset
|
63 #include "libmpcodecs/dec_audio.h" |
23077 | 64 #include "libmpcodecs/dec_video.h" |
65 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
66 #ifdef CONFIG_DVDREAD |
23077 | 67 #include "stream/stream_dvd.h" |
68 #endif | |
69 | |
23603
c1221a031ab7
Add a (almost correct) prototype for vcd_seek_to_track
reimar
parents:
23341
diff
changeset
|
70 int vcd_seek_to_track(void *vcd, int track); |
23077 | 71 |
72 #include "m_config.h" | |
73 #include "m_option.h" | |
74 | |
75 | |
76 guiInterface_t guiIntfStruct; | |
77 int guiWinID=-1; | |
78 | |
79 int gstrcmp( const char * a,const char * b ) | |
80 { | |
81 if ( !a && !b ) return 0; | |
82 if ( !a || !b ) return -1; | |
83 return strcmp( a,b ); | |
84 } | |
85 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30516
diff
changeset
|
86 static int gstrncmp( const char * a, const char * b, int size ) |
23077 | 87 { |
88 if ( !a && !b ) return 0; | |
89 if ( !a || !b ) return -1; | |
90 return strncmp( a,b,size ); | |
91 } | |
92 | |
93 char * gstrdup( const char * str ) | |
94 { | |
95 if ( !str ) return NULL; | |
96 return strdup( str ); | |
97 } | |
98 | |
99 char * gstrchr( char * str,int c ) | |
100 { | |
101 if ( !str ) return NULL; | |
102 return strchr( str,c ); | |
103 } | |
104 | |
105 void gfree( void ** p ) | |
106 { | |
107 free( *p ); *p=NULL; | |
108 } | |
109 | |
110 /** | |
111 * \brief this actually creates a new list containing only one element... | |
112 */ | |
113 void gaddlist( char *** list,const char * entry ) | |
114 { | |
115 int i; | |
116 | |
117 if ( (*list) ) | |
118 { | |
119 for ( i=0;(*list)[i];i++ ) free( (*list)[i] ); | |
120 free( (*list) ); | |
121 } | |
122 | |
123 (*list)=malloc( 2 * sizeof(char **) ); | |
124 (*list)[0]=gstrdup( entry ); | |
125 (*list)[1]=NULL; | |
126 } | |
127 | |
128 /** | |
129 * \brief this replaces a string starting with search by replace. | |
130 * If not found, replace is appended. | |
131 */ | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30516
diff
changeset
|
132 static void greplace(char ***list, const char *search, const char *replace) |
23077 | 133 { |
134 int i = 0; | |
135 int len = (search) ? strlen(search) : 0; | |
136 | |
137 if (*list) { | |
138 for (i = 0; (*list)[i]; i++) { | |
139 if (search && (strncmp((*list)[i], search, len) == 0)) { | |
140 free((*list)[i]); | |
141 (*list)[i] = gstrdup(replace); | |
142 return; | |
143 } | |
144 } | |
145 *list = realloc(*list, (i + 2) * sizeof(char *)); | |
146 } | |
147 else | |
148 *list = malloc(2 * sizeof(char *)); | |
149 | |
150 (*list)[i] = gstrdup(replace); | |
151 (*list)[i + 1] = NULL; | |
152 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
153 |
23077 | 154 void guiInit( void ) |
155 { | |
156 int i; | |
157 | |
158 memset( &guiIntfStruct,0,sizeof( guiIntfStruct ) ); | |
159 guiIntfStruct.Balance=50.0f; | |
160 guiIntfStruct.StreamType=-1; | |
161 | |
162 memset( >kEquChannels,0,sizeof( gtkEquChannels ) ); | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
163 #ifdef CONFIG_DXR3 |
23077 | 164 if ( !gtkDXR3Device ) gtkDXR3Device=strdup( "/dev/em8300-0" ); |
165 #endif | |
166 if ( stream_cache_size > 0 ) { gtkCacheOn=1; gtkCacheSize=stream_cache_size; } | |
167 else if ( stream_cache_size == 0 ) gtkCacheOn = 0; | |
168 if ( autosync && autosync != gtkAutoSync ) { gtkAutoSyncOn=1; gtkAutoSync=autosync; } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
169 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
170 #ifdef CONFIG_ASS |
23077 | 171 gtkASS.enabled = ass_enabled; |
172 gtkASS.use_margins = ass_use_margins; | |
173 gtkASS.top_margin = ass_top_margin; | |
174 gtkASS.bottom_margin = ass_bottom_margin; | |
175 #endif | |
176 | |
177 gtkInit(); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
178 // --- initialize X |
23077 | 179 wsXInit( (void *)mDisplay ); |
180 // --- load skin | |
181 skinDirInHome=get_path("skins"); | |
182 skinDirInHome_obsolete=get_path("Skin"); | |
183 skinMPlayerDir=MPLAYER_DATADIR "/skins"; | |
184 skinMPlayerDir_obsolete=MPLAYER_DATADIR "/Skin"; | |
185 mp_msg( MSGT_GPLAYER,MSGL_V,"SKIN dir 1: '%s'\n",skinDirInHome); | |
186 mp_msg( MSGT_GPLAYER,MSGL_V,"SKIN dir 1 (obsolete): '%s'\n",skinDirInHome_obsolete); | |
187 mp_msg( MSGT_GPLAYER,MSGL_V,"SKIN dir 2: '%s'\n",skinMPlayerDir); | |
188 mp_msg( MSGT_GPLAYER,MSGL_V,"SKIN dir 2 (obsolete): '%s'\n",skinMPlayerDir_obsolete); | |
189 if ( !skinName ) skinName=strdup( "default" ); | |
190 i = skinRead( skinName ); | |
191 if ((i == -1) && strcmp(skinName,"default")) | |
192 { | |
193 mp_msg( MSGT_GPLAYER,MSGL_WARN,MSGTR_SKIN_SKINCFG_SelectedSkinNotFound, skinName); | |
194 skinName=strdup( "default" ); | |
195 i = skinRead( skinName ); | |
196 } | |
197 switch (i) { | |
198 case -1: mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_SKIN_SKINCFG_SkinNotFound,skinName ); exit( 0 ); | |
199 case -2: mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_SKIN_SKINCFG_SkinCfgReadError,skinName ); exit( 0 ); | |
200 } | |
201 // --- initialize windows | |
202 if ( ( mplDrawBuffer = malloc( appMPlayer.main.Bitmap.ImageSize ) ) == NULL ) | |
203 { | |
204 fprintf( stderr,MSGTR_NEMDB ); | |
205 exit( 0 ); | |
206 } | |
207 | |
208 if ( gui_save_pos ) | |
209 { | |
210 appMPlayer.main.x = gui_main_pos_x; | |
211 appMPlayer.main.y = gui_main_pos_y; | |
212 appMPlayer.sub.x = gui_sub_pos_x; | |
213 appMPlayer.sub.y = gui_sub_pos_y; | |
214 } | |
215 | |
216 if (WinID>0) | |
217 { | |
218 appMPlayer.subWindow.Parent=WinID; | |
219 appMPlayer.sub.x=0; | |
220 appMPlayer.sub.y=0; | |
221 } | |
222 if (guiWinID>=0) appMPlayer.mainWindow.Parent=guiWinID; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
223 |
23077 | 224 wsCreateWindow( &appMPlayer.subWindow, |
225 appMPlayer.sub.x,appMPlayer.sub.y,appMPlayer.sub.width,appMPlayer.sub.height, | |
226 wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsShowFrame|wsHideWindow,"MPlayer - Video" ); | |
227 | |
228 wsDestroyImage( &appMPlayer.subWindow ); | |
229 wsCreateImage( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Width,appMPlayer.sub.Bitmap.Height ); | |
230 wsXDNDMakeAwareness(&appMPlayer.subWindow); | |
231 | |
232 mplMenuInit(); | |
233 mplPBInit(); | |
234 | |
235 // i=wsHideFrame|wsMaxSize|wsHideWindow; | |
236 // if ( appMPlayer.mainDecoration ) i=wsShowFrame|wsMaxSize|wsHideWindow; | |
237 i=wsShowFrame|wsMaxSize|wsHideWindow; | |
238 wsCreateWindow( &appMPlayer.mainWindow, | |
239 appMPlayer.main.x,appMPlayer.main.y,appMPlayer.main.width,appMPlayer.main.height, | |
240 wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,i,"MPlayer" ); | |
241 | |
242 wsSetShape( &appMPlayer.mainWindow,appMPlayer.main.Mask.Image ); | |
243 wsXDNDMakeAwareness(&appMPlayer.mainWindow); | |
244 | |
245 #ifdef DEBUG | |
246 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] depth on screen: %d\n",wsDepthOnScreen ); | |
247 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] parent: 0x%x\n",(int)appMPlayer.mainWindow.WindowID ); | |
248 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] sub: 0x%x\n",(int)appMPlayer.subWindow.WindowID ); | |
249 #endif | |
250 | |
251 appMPlayer.mainWindow.ReDraw=(void *)mplMainDraw; | |
252 appMPlayer.mainWindow.MouseHandler=mplMainMouseHandle; | |
253 appMPlayer.mainWindow.KeyHandler=mplMainKeyHandle; | |
254 appMPlayer.mainWindow.DandDHandler=mplDandDHandler; | |
255 | |
256 appMPlayer.subWindow.ReDraw=(void *)mplSubDraw; | |
257 appMPlayer.subWindow.MouseHandler=mplSubMouseHandle; | |
258 appMPlayer.subWindow.KeyHandler=mplMainKeyHandle; | |
259 appMPlayer.subWindow.DandDHandler=mplDandDHandler; | |
260 | |
261 wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); | |
262 wsClearWindow( appMPlayer.subWindow ); | |
263 if ( appMPlayer.sub.Bitmap.Image ) wsConvert( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Image,appMPlayer.sub.Bitmap.ImageSize ); | |
264 | |
265 btnModify( evSetVolume,guiIntfStruct.Volume ); | |
266 btnModify( evSetBalance,guiIntfStruct.Balance ); | |
267 btnModify( evSetMoviePosition,guiIntfStruct.Position ); | |
268 | |
269 wsSetIcon( wsDisplay,appMPlayer.mainWindow.WindowID,guiIcon,guiIconMask ); | |
270 wsSetIcon( wsDisplay,appMPlayer.subWindow.WindowID,guiIcon,guiIconMask ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
271 |
23077 | 272 guiIntfStruct.Playing=0; |
273 | |
274 if ( !appMPlayer.mainDecoration ) wsWindowDecoration( &appMPlayer.mainWindow,0 ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
275 |
23077 | 276 wsVisibleWindow( &appMPlayer.mainWindow,wsShowWindow ); |
277 #if 0 | |
278 wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); | |
279 | |
280 { | |
281 XEvent xev; | |
282 do { XNextEvent( wsDisplay,&xev ); } while ( xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID ); | |
283 appMPlayer.subWindow.Mapped=wsMapped; | |
284 } | |
285 | |
286 if ( !fullscreen ) fullscreen=gtkLoadFullscreen; | |
287 if ( fullscreen ) | |
288 { | |
289 mplFullScreen(); | |
290 btnModify( evFullScreen,btnPressed ); | |
291 } | |
292 #else | |
293 if ( !fullscreen ) fullscreen=gtkLoadFullscreen; | |
294 if ( gtkShowVideoWindow ) | |
295 { | |
296 wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); | |
297 { | |
298 XEvent xev; | |
299 do { XNextEvent( wsDisplay,&xev ); } while ( xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID ); | |
300 appMPlayer.subWindow.Mapped=wsMapped; | |
301 } | |
302 | |
303 if ( fullscreen ) | |
304 { | |
305 mplFullScreen(); | |
306 btnModify( evFullScreen,btnPressed ); | |
307 } | |
308 } | |
309 else | |
310 { | |
311 if ( fullscreen ) | |
312 { | |
313 wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); | |
314 { | |
315 XEvent xev; | |
316 do { XNextEvent( wsDisplay,&xev ); } while ( xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID ); | |
317 appMPlayer.subWindow.Mapped=wsMapped; | |
318 } | |
319 wsVisibleWindow( &appMPlayer.subWindow, wsShowWindow ); | |
320 | |
321 mplFullScreen(); | |
322 btnModify( evFullScreen,btnPressed ); | |
323 } | |
324 } | |
325 #endif | |
326 mplSubRender=1; | |
327 // --- | |
328 | |
329 if ( filename ) mplSetFileName( NULL,filename,STREAMTYPE_FILE ); | |
330 if ( plCurrent && !filename ) mplSetFileName( plCurrent->path,plCurrent->name,STREAMTYPE_FILE ); | |
331 if ( subdata ) guiSetFilename( guiIntfStruct.Subtitlename, subdata->filename ); | |
332 guiLoadFont(); | |
333 } | |
334 | |
335 void guiDone( void ) | |
336 { | |
337 mplMainRender=0; | |
338 mp_msg( MSGT_GPLAYER,MSGL_V,"[GUI] done.\n" ); | |
339 | |
340 if ( gui_save_pos ) | |
341 { | |
342 gui_main_pos_x=appMPlayer.mainWindow.X; gui_main_pos_y=appMPlayer.mainWindow.Y; | |
343 gui_sub_pos_x=appMPlayer.subWindow.X; gui_sub_pos_y=appMPlayer.subWindow.Y; | |
344 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
345 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
346 #ifdef CONFIG_ASS |
23077 | 347 ass_enabled = gtkASS.enabled; |
348 ass_use_margins = gtkASS.use_margins; | |
349 ass_top_margin = gtkASS.top_margin; | |
350 ass_bottom_margin = gtkASS.bottom_margin; | |
351 #endif | |
352 | |
353 cfg_write(); | |
354 wsXDone(); | |
355 } | |
356 | |
357 void guiLoadFont( void ) | |
358 { | |
27393 | 359 #ifdef CONFIG_FREETYPE |
25851
9ebd00825df2
Allow independent scaling of vo_font and sub_font.
reimar
parents:
25765
diff
changeset
|
360 load_font_ft(vo_image_width, vo_image_height, &vo_font, font_name, osd_font_scale_factor); |
23077 | 361 #else |
362 if ( vo_font ) | |
363 { | |
364 int i; | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
365 free( vo_font->name ); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
366 free( vo_font->fpath ); |
23077 | 367 for ( i=0;i<16;i++ ) |
368 if ( vo_font->pic_a[i] ) | |
369 { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
370 free( vo_font->pic_a[i]->bmp ); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
371 free( vo_font->pic_a[i]->pal ); |
23077 | 372 } |
373 for ( i=0;i<16;i++ ) | |
374 if ( vo_font->pic_b[i] ) | |
375 { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
376 free( vo_font->pic_b[i]->bmp ); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
377 free( vo_font->pic_b[i]->pal ); |
23077 | 378 } |
379 free( vo_font ); vo_font=NULL; | |
380 } | |
381 if ( font_name ) | |
382 { | |
383 vo_font=read_font_desc( font_name,font_factor,0 ); | |
384 if ( !vo_font ) mp_msg( MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont,font_name ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
385 } |
23077 | 386 else |
387 { | |
388 font_name=gstrdup( get_path( "font/font.desc" ) ); | |
389 vo_font=read_font_desc( font_name,font_factor,0 ); | |
390 if ( !vo_font ) | |
391 { | |
392 gfree( (void **)&font_name ); font_name=gstrdup(MPLAYER_DATADIR "/font/font.desc" ); | |
393 vo_font=read_font_desc( font_name,font_factor,0 ); | |
394 } | |
395 } | |
396 #endif | |
397 } | |
398 | |
399 void guiLoadSubtitle( char * name ) | |
400 { | |
401 if ( guiIntfStruct.Playing == 0 ) | |
402 { | |
403 guiIntfStruct.SubtitleChanged=1; //what is this for? (mw) | |
404 return; | |
405 } | |
406 if ( subdata ) | |
407 { | |
408 mp_msg( MSGT_GPLAYER,MSGL_INFO,MSGTR_DeletingSubtitles ); | |
409 sub_free( subdata ); | |
410 subdata=NULL; | |
411 vo_sub=NULL; | |
412 if ( vo_osd_list ) | |
413 { | |
414 int len; | |
415 mp_osd_obj_t * osd = vo_osd_list; | |
416 while ( osd ) | |
417 { | |
418 if ( osd->type == OSDTYPE_SUBTITLE ) break; | |
419 osd=osd->next; | |
420 } | |
421 if ( osd && osd->flags&OSDFLAG_VISIBLE ) | |
422 { | |
423 len=osd->stride * ( osd->bbox.y2 - osd->bbox.y1 ); | |
424 memset( osd->bitmap_buffer,0,len ); | |
425 memset( osd->alpha_buffer,0,len ); | |
426 } | |
427 } | |
428 } | |
429 if ( name ) | |
430 { | |
431 mp_msg( MSGT_GPLAYER,MSGL_INFO,MSGTR_LoadingSubtitles,name ); | |
432 subdata=sub_read_file( name, guiIntfStruct.FPS ); | |
433 if ( !subdata ) mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_CantLoadSub,name ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
434 sub_name = (malloc(2 * sizeof(char*))); //when mplayer will be restarted |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
435 sub_name[0] = strdup(name); //sub_name[0] will be read |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
436 sub_name[1] = NULL; |
23077 | 437 } |
438 update_set_of_subtitles(); | |
439 | |
440 } | |
441 | |
442 static void add_vf( char * str ) | |
443 { | |
444 mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_AddingVideoFilter,str ); | |
445 if ( vf_settings ) | |
446 { | |
447 int i = 0; | |
448 while ( vf_settings[i].name ) if ( !gstrcmp( vf_settings[i++].name,str ) ) { i=-1; break; } | |
449 if ( i != -1 ) | |
450 { vf_settings=realloc( vf_settings,( i + 2 ) * sizeof( m_obj_settings_t ) ); vf_settings[i].name=strdup( str );vf_settings[i].attribs = NULL; vf_settings[i+1].name=NULL; } | |
451 } else { vf_settings=malloc( 2 * sizeof( m_obj_settings_t ) ); vf_settings[0].name=strdup( str );vf_settings[0].attribs = NULL; vf_settings[1].name=NULL; } | |
452 } | |
453 | |
454 static void remove_vf( char * str ) | |
455 { | |
456 int n = 0; | |
457 | |
458 if ( !vf_settings ) return; | |
459 | |
460 mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_RemovingVideoFilter,str ); | |
461 | |
462 while ( vf_settings[n++].name ); n--; | |
463 if ( n > -1 ) | |
464 { | |
465 int i = 0,m = -1; | |
466 while ( vf_settings[i].name ) if ( !gstrcmp( vf_settings[i++].name,str ) ) { m=i - 1; break; } | |
467 i--; | |
468 if ( m > -1 ) | |
469 { | |
470 if ( n == 1 ) { free( vf_settings[0].name );free( vf_settings[0].attribs ); free( vf_settings ); vf_settings=NULL; } | |
471 else { free( vf_settings[i].name );free( vf_settings[i].attribs ); memcpy( &vf_settings[i],&vf_settings[i + 1],( n - i ) * sizeof( m_obj_settings_t ) ); } | |
472 } | |
473 } | |
474 } | |
475 | |
30689
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
476 int guiGetEvent( int type,void * arg ) |
23077 | 477 { |
25765
304fc0bbefe1
audio_out / video_out structs should be treated as const
reimar
parents:
25219
diff
changeset
|
478 const ao_functions_t *audio_out = NULL; |
25219
e82ecde2cbd4
Mark several uses of vo_functions_t as const to stop some of the current
reimar
parents:
24242
diff
changeset
|
479 const vo_functions_t *video_out = NULL; |
23077 | 480 mixer_t *mixer = NULL; |
481 | |
30689
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
482 stream_t * stream = arg; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
483 #ifdef CONFIG_DVDREAD |
30689
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
484 dvd_priv_t * dvdp = arg; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
485 #endif |
23077 | 486 |
487 if (guiIntfStruct.mpcontext) { | |
488 audio_out = mpctx_get_audio_out(guiIntfStruct.mpcontext); | |
489 video_out = mpctx_get_video_out(guiIntfStruct.mpcontext); | |
490 mixer = mpctx_get_mixer(guiIntfStruct.mpcontext); | |
491 } | |
492 | |
493 switch ( type ) | |
494 { | |
495 case guiXEvent: | |
30689
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
496 guiIntfStruct.event_struct=arg; |
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
497 wsEvents( wsDisplay,arg,NULL ); |
23077 | 498 gtkEventHandling(); |
499 break; | |
500 case guiCEvent: | |
501 switch ( (int)arg ) | |
502 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
503 case guiSetPlay: |
23077 | 504 guiIntfStruct.Playing=1; |
505 // if ( !gtkShowVideoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
506 break; | |
507 case guiSetStop: | |
508 guiIntfStruct.Playing=0; | |
509 // if ( !gtkShowVideoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
510 break; | |
511 case guiSetPause: guiIntfStruct.Playing=2; break; | |
512 } | |
513 mplState(); | |
514 break; | |
515 case guiSetState: | |
516 mplState(); | |
517 break; | |
518 case guiSetFileName: | |
519 if ( arg ) guiSetFilename( guiIntfStruct.Filename,arg ); | |
520 break; | |
521 case guiSetAudioOnly: | |
522 guiIntfStruct.AudioOnly=(int)arg; | |
523 if ( (int)arg ) { guiIntfStruct.NoWindow=True; wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); } | |
524 else wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); | |
525 break; | |
526 case guiSetContext: | |
30689
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
527 guiIntfStruct.mpcontext=arg; |
23077 | 528 case guiSetDemuxer: |
30689
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
529 guiIntfStruct.demuxer=arg; |
23077 | 530 break; |
531 case guiSetAfilter: | |
30689
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
532 guiIntfStruct.afilter=arg; |
23077 | 533 break; |
534 case guiSetShVideo: | |
535 { | |
536 if ( !appMPlayer.subWindow.isFullScreen ) | |
537 { | |
538 wsResizeWindow( &appMPlayer.subWindow,vo_dwidth,vo_dheight ); | |
539 wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); | |
540 } | |
541 guiIntfStruct.MovieWidth=vo_dwidth; | |
542 guiIntfStruct.MovieHeight=vo_dheight; | |
543 if (guiWinID>=0) | |
544 wsMoveWindow( &appMPlayer.mainWindow,0,0, vo_dheight); | |
31315
ad274a5b093b
For vos that support the new libvo API (provide UPDATE_SCREENINFO),
reimar
parents:
31312
diff
changeset
|
545 WinID = appMPlayer.subWindow.WindowID; |
23077 | 546 } |
547 break; | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
548 #ifdef CONFIG_DVDREAD |
23077 | 549 case guiSetDVD: |
550 guiIntfStruct.DVD.titles=dvdp->vmg_file->tt_srpt->nr_of_srpts; | |
551 guiIntfStruct.DVD.chapters=dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts; | |
552 guiIntfStruct.DVD.angles=dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; | |
553 guiIntfStruct.DVD.nr_of_audio_channels=dvdp->nr_of_channels; | |
554 memcpy( guiIntfStruct.DVD.audio_streams,dvdp->audio_streams,sizeof( dvdp->audio_streams ) ); | |
555 guiIntfStruct.DVD.nr_of_subtitles=dvdp->nr_of_subtitles; | |
556 memcpy( guiIntfStruct.DVD.subtitles,dvdp->subtitles,sizeof( dvdp->subtitles ) ); | |
557 guiIntfStruct.DVD.current_title=dvd_title + 1; | |
558 guiIntfStruct.DVD.current_chapter=dvd_chapter + 1; | |
559 guiIntfStruct.DVD.current_angle=dvd_angle + 1; | |
560 guiIntfStruct.Track=dvd_title + 1; | |
561 break; | |
562 #endif | |
563 case guiSetStream: | |
564 guiIntfStruct.StreamType=stream->type; | |
565 switch( stream->type ) | |
566 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
567 #ifdef CONFIG_DVDREAD |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
568 case STREAMTYPE_DVD: |
23077 | 569 guiGetEvent( guiSetDVD,(char *)stream->priv ); |
570 break; | |
571 #endif | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
572 #ifdef CONFIG_VCD |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
573 case STREAMTYPE_VCD: |
23077 | 574 { |
575 int i; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
576 |
23077 | 577 if (!stream->priv) |
578 { | |
579 guiIntfStruct.VCDTracks=0; | |
580 break; | |
581 } | |
582 for ( i=1;i < 100;i++ ) | |
583 if ( vcd_seek_to_track( stream->priv,i ) < 0 ) break; | |
584 vcd_seek_to_track( stream->priv,vcd_track ); | |
585 guiIntfStruct.VCDTracks=--i; | |
586 break; | |
587 } | |
588 #endif | |
589 default: break; | |
590 } | |
591 break; | |
592 case guiIEvent: | |
593 mp_msg( MSGT_GPLAYER,MSGL_V,"cmd: %d\n",(int)arg ); | |
594 switch( (int)arg ) | |
595 { | |
596 case MP_CMD_QUIT: | |
597 mplEventHandling( evExit,0 ); | |
598 break; | |
599 case MP_CMD_VO_FULLSCREEN: | |
600 mplEventHandling( evFullScreen,0 ); | |
601 break; | |
602 } | |
603 break; | |
604 case guiReDraw: | |
605 mplEventHandling( evRedraw,0 ); | |
606 break; | |
607 case guiSetVolume: | |
608 if ( audio_out ) | |
609 { | |
610 float l,r; | |
611 mixer_getvolume( mixer,&l,&r ); | |
612 guiIntfStruct.Volume=(r>l?r:l); | |
613 if ( r != l ) guiIntfStruct.Balance=( ( r - l ) + 100 ) * 0.5f; | |
614 else guiIntfStruct.Balance=50.0f; | |
615 btnModify( evSetVolume,guiIntfStruct.Volume ); | |
616 btnModify( evSetBalance,guiIntfStruct.Balance ); | |
617 } | |
618 break; | |
619 case guiSetFileFormat: | |
620 guiIntfStruct.FileFormat=(int)arg; | |
621 break; | |
622 case guiSetValues: | |
623 // -- video | |
624 guiIntfStruct.sh_video=arg; | |
625 if ( arg ) | |
626 { | |
30689
ebe42a93c6c3
Fix silly type of guiGetEvent argument to use void * instead of char * and
reimar
parents:
30653
diff
changeset
|
627 sh_video_t * sh = arg; |
23077 | 628 guiIntfStruct.FPS=sh->fps; |
629 } | |
630 | |
631 if ( guiIntfStruct.NoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
632 |
23077 | 633 if ( guiIntfStruct.StreamType == STREAMTYPE_STREAM ) btnSet( evSetMoviePosition,btnDisabled ); |
634 else btnSet( evSetMoviePosition,btnReleased ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
635 |
23077 | 636 // -- audio |
637 if ( audio_out ) | |
638 { | |
639 float l,r; | |
640 mixer_getvolume( mixer,&l,&r ); | |
641 guiIntfStruct.Volume=(r>l?r:l); | |
642 if ( r != l ) guiIntfStruct.Balance=( ( r - l ) + 100 ) * 0.5f; | |
643 else guiIntfStruct.Balance=50.0f; | |
644 btnModify( evSetVolume,guiIntfStruct.Volume ); | |
645 btnModify( evSetBalance,guiIntfStruct.Balance ); | |
646 } | |
647 | |
648 if ( gtkEnableAudioEqualizer ) | |
649 { | |
650 equalizer_t eq; | |
651 int i,j; | |
652 for ( i=0;i<6;i++ ) | |
653 for ( j=0;j<10;j++ ) | |
654 { | |
655 eq.channel=i; eq.band=j; eq.gain=gtkEquChannels[i][j]; | |
656 gtkSet( gtkSetEqualizer,0,&eq ); | |
657 } | |
658 } | |
659 // -- subtitle | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
660 #ifdef CONFIG_DXR3 |
32117 | 661 if ( video_driver_list && !gstrcmp( video_driver_list[0],"dxr3" ) && guiIntfStruct.FileFormat != DEMUXER_TYPE_MPEG_PS && !gtkVfLAVC ) |
23077 | 662 { |
663 gtkMessageBox( GTK_MB_FATAL,MSGTR_NEEDLAVC ); | |
664 guiIntfStruct.Playing=0; | |
665 return True; | |
666 } | |
667 #endif | |
668 break; | |
669 case guiSetDefaults: | |
670 // if ( guiIntfStruct.Playing == 1 && guiIntfStruct.FilenameChanged ) | |
671 if ( guiIntfStruct.FilenameChanged ) | |
672 { | |
673 audio_id=-1; | |
674 video_id=-1; | |
675 dvdsub_id=-1; | |
676 vobsub_id=-1; | |
677 stream_cache_size=-1; | |
678 autosync=0; | |
679 vcd_track=0; | |
680 dvd_title=0; | |
681 force_fps=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
682 } |
23077 | 683 guiIntfStruct.demuxer=NULL; |
684 guiIntfStruct.sh_video=NULL; | |
685 wsPostRedisplay( &appMPlayer.subWindow ); | |
686 break; | |
687 case guiSetParameters: | |
688 guiGetEvent( guiSetDefaults,NULL ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
689 switch ( guiIntfStruct.StreamType ) |
23077 | 690 { |
691 case STREAMTYPE_PLAYLIST: | |
692 break; | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
693 #ifdef CONFIG_VCD |
23077 | 694 case STREAMTYPE_VCD: |
695 { | |
696 char tmp[512]; | |
697 sprintf( tmp,"vcd://%d",guiIntfStruct.Track + 1 ); | |
698 guiSetFilename( guiIntfStruct.Filename,tmp ); | |
699 } | |
700 break; | |
701 #endif | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
702 #ifdef CONFIG_DVDREAD |
23077 | 703 case STREAMTYPE_DVD: |
704 { | |
705 char tmp[512]; | |
706 sprintf( tmp,"dvd://%d",guiIntfStruct.Title ); | |
707 guiSetFilename( guiIntfStruct.Filename,tmp ); | |
708 } | |
709 dvd_chapter=guiIntfStruct.Chapter; | |
710 dvd_angle=guiIntfStruct.Angle; | |
711 break; | |
712 #endif | |
713 } | |
714 //if ( guiIntfStruct.StreamType != STREAMTYPE_PLAYLIST ) // Does not make problems anymore! | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
715 { |
23077 | 716 if ( guiIntfStruct.Filename ) filename=gstrdup( guiIntfStruct.Filename ); |
717 else if ( filename ) guiSetFilename( guiIntfStruct.Filename,filename ); | |
718 } | |
719 // --- video opts | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
720 |
23077 | 721 if ( !video_driver_list ) |
722 { | |
723 int i = 0; | |
724 while ( video_out_drivers[i++] ) | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
725 if ( video_out_drivers[i - 1]->control( VOCTRL_GUISUPPORT,NULL ) == VO_TRUE ) |
23077 | 726 { |
727 gaddlist( &video_driver_list,(char *)video_out_drivers[i - 1]->info->short_name ); | |
728 break; | |
729 } | |
730 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
731 |
30516 | 732 if ( !video_driver_list && !video_driver_list[0] ) { gtkMessageBox( GTK_MB_FATAL,MSGTR_IDFGCVD ); exit_player(EXIT_ERROR); } |
23077 | 733 |
734 { | |
735 int i = 0; | |
736 guiIntfStruct.NoWindow=False; | |
737 while ( video_out_drivers[i++] ) | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
738 if ( video_out_drivers[i - 1]->control( VOCTRL_GUISUPPORT,NULL ) == VO_TRUE ) |
23077 | 739 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
740 if ( ( video_driver_list && !gstrcmp( video_driver_list[0],(char *)video_out_drivers[i - 1]->info->short_name ) )&&( video_out_drivers[i - 1]->control( VOCTRL_GUI_NOWINDOW,NULL ) == VO_TRUE ) ) |
23077 | 741 { guiIntfStruct.NoWindow=True; break; } |
742 } | |
743 } | |
744 | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
745 #ifdef CONFIG_DXR3 |
23077 | 746 remove_vf( "lavc" ); |
747 if ( video_driver_list && !gstrcmp( video_driver_list[0],"dxr3" ) ) | |
748 { | |
749 if ( ( guiIntfStruct.StreamType != STREAMTYPE_DVD)&&( guiIntfStruct.StreamType != STREAMTYPE_VCD ) ) | |
750 { | |
751 if ( gtkVfLAVC ) add_vf( "lavc" ); | |
752 } | |
753 } | |
754 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
755 // --- |
23077 | 756 if ( gtkVfPP ) add_vf( "pp" ); |
757 else remove_vf( "pp" ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
758 |
23077 | 759 // --- audio opts |
760 // if ( ao_plugin_cfg.plugin_list ) { free( ao_plugin_cfg.plugin_list ); ao_plugin_cfg.plugin_list=NULL; } | |
761 if (gtkAONorm) | |
762 greplace(&af_cfg.list, "volnorm", "volnorm"); | |
763 if (gtkEnableAudioEqualizer) | |
764 greplace(&af_cfg.list, "equalizer", "equalizer"); | |
765 if ( gtkAOExtraStereo ) | |
766 { | |
767 char *name = malloc(12 + 20 + 1); | |
768 snprintf(name, 12 + 20, "extrastereo=%f", gtkAOExtraStereoMul); | |
769 name[12 + 20] = 0; | |
770 greplace(&af_cfg.list, "extrastereo", name); | |
771 free(name); | |
772 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
773 #ifdef CONFIG_OSS_AUDIO |
23077 | 774 if ( audio_driver_list && !gstrncmp( audio_driver_list[0],"oss",3 ) ) |
775 { | |
776 char *tmp; | |
777 mixer_device = gtkAOOSSMixer; | |
778 mixer_channel = gtkAOOSSMixerChannel; | |
779 if (gtkAOOSSDevice) { | |
780 tmp = calloc( 1,strlen( gtkAOOSSDevice ) + 7 ); | |
781 sprintf( tmp,"oss:%s",gtkAOOSSDevice ); | |
782 } else | |
783 tmp = strdup("oss"); | |
784 gaddlist( &audio_driver_list,tmp ); | |
785 free(tmp); | |
786 } | |
787 #endif | |
27390
9d95dc936e66
Introduce CONFIG_ALSA preprocessor directive for ALSA 0.9 and 1.x.
diego
parents:
27387
diff
changeset
|
788 #ifdef CONFIG_ALSA |
23077 | 789 if ( audio_driver_list && !gstrncmp( audio_driver_list[0],"alsa",4 ) ) |
790 { | |
791 char *tmp; | |
792 mixer_device = gtkAOALSAMixer; | |
793 mixer_channel = gtkAOALSAMixerChannel; | |
794 if (gtkAOALSADevice) { | |
795 tmp = calloc( 1,strlen( gtkAOALSADevice ) + 14 ); | |
796 sprintf( tmp,"alsa:device=%s",gtkAOALSADevice ); | |
797 } else | |
798 tmp = strdup("alsa"); | |
799 gaddlist( &audio_driver_list,tmp ); | |
800 free(tmp); | |
801 } | |
802 #endif | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
803 #ifdef CONFIG_SDL |
23077 | 804 if ( audio_driver_list && !gstrncmp( audio_driver_list[0],"sdl",3 ) ) |
805 { | |
806 char *tmp; | |
807 if (gtkAOSDLDriver) { | |
808 tmp = calloc( 1,strlen( gtkAOSDLDriver ) + 10 ); | |
809 sprintf( tmp,"sdl:%s",gtkAOSDLDriver ); | |
810 } else | |
811 tmp = strdup("sdl"); | |
812 gaddlist( &audio_driver_list,tmp ); | |
813 free(tmp); | |
814 } | |
815 #endif | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
816 #ifdef CONFIG_ESD |
23077 | 817 if ( audio_driver_list && !gstrncmp( audio_driver_list[0],"esd",3 ) ) |
818 { | |
819 char *tmp; | |
820 if (gtkAOESDDevice) { | |
821 tmp = calloc( 1,strlen( gtkAOESDDevice ) + 10 ); | |
822 sprintf( tmp,"esd:%s",gtkAOESDDevice ); | |
823 } else | |
824 tmp = strdup("esd"); | |
825 gaddlist( &audio_driver_list,tmp ); | |
826 free(tmp); | |
827 } | |
828 #endif | |
829 // -- subtitle | |
830 //subdata->filename=gstrdup( guiIntfStruct.Subtitlename ); | |
831 stream_dump_type=0; | |
832 if ( gtkSubDumpMPSub ) stream_dump_type=4; | |
833 if ( gtkSubDumpSrt ) stream_dump_type=6; | |
834 gtkSubDumpMPSub=gtkSubDumpSrt=0; | |
835 guiLoadFont(); | |
836 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
837 // --- misc |
23077 | 838 if ( gtkCacheOn ) stream_cache_size=gtkCacheSize; |
839 if ( gtkAutoSyncOn ) autosync=gtkAutoSync; | |
840 | |
841 if ( guiIntfStruct.AudioFile ) audio_stream=gstrdup( guiIntfStruct.AudioFile ); | |
842 else if ( guiIntfStruct.FilenameChanged ) gfree( (void**)&audio_stream ); | |
843 //audio_stream=NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
844 |
23077 | 845 guiIntfStruct.DiskChanged=0; |
846 guiIntfStruct.FilenameChanged=0; | |
847 guiIntfStruct.NewPlay=0; | |
848 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
849 #ifdef CONFIG_ASS |
23077 | 850 ass_enabled = gtkASS.enabled; |
851 ass_use_margins = gtkASS.use_margins; | |
852 ass_top_margin = gtkASS.top_margin; | |
853 ass_bottom_margin = gtkASS.bottom_margin; | |
854 #endif | |
855 | |
856 break; | |
857 } | |
858 return False; | |
859 } | |
860 | |
861 void guiEventHandling( void ) | |
862 { | |
863 if ( !guiIntfStruct.Playing || guiIntfStruct.NoWindow ) wsHandleEvents(); | |
864 gtkEventHandling(); | |
865 } | |
866 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
867 // --- |
23077 | 868 |
869 float gtkEquChannels[6][10]; | |
870 | |
871 plItem * plCurrent = NULL; | |
872 plItem * plList = NULL; | |
873 plItem * plLastPlayed = NULL; | |
874 | |
875 URLItem *URLList = NULL; | |
876 | |
877 char *fsHistory[fsPersistant_MaxPos] = { NULL,NULL,NULL,NULL,NULL }; | |
878 | |
879 #if defined( MP_DEBUG ) && 0 | |
880 void list( void ) | |
881 { | |
882 plItem * next = plList; | |
883 printf( "--- list ---\n" ); | |
884 while( next || next->next ) | |
885 { | |
886 printf( "item: %s/%s\n",next->path,next->name ); | |
887 if ( next->next ) next=next->next; else break; | |
888 } | |
889 printf( "--- end of list ---\n" ); | |
890 } | |
891 #else | |
892 #define list(); | |
893 #endif | |
894 | |
895 void * gtkSet( int cmd,float fparam, void * vparam ) | |
896 { | |
897 equalizer_t * eq = (equalizer_t *)vparam; | |
898 plItem * item = (plItem *)vparam; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
899 |
23077 | 900 URLItem * url_item = (URLItem *)vparam; |
901 int is_added = True; | |
902 | |
903 switch ( cmd ) | |
904 { | |
905 // --- handle playlist | |
906 case gtkAddPlItem: // add item to playlist | |
907 if ( plList ) | |
908 { | |
909 plItem * next = plList; | |
910 while ( next->next ) { /*printf( "%s\n",next->name );*/ next=next->next; } | |
911 next->next=item; item->prev=next; | |
912 } else { item->prev=item->next=NULL; plCurrent=plList=item; } | |
913 list(); | |
914 return NULL; | |
915 case gtkInsertPlItem: // add item into playlist after current | |
916 if ( plCurrent ) | |
917 { | |
918 plItem * curr = plCurrent; | |
919 item->next=curr->next; | |
920 if (item->next) | |
921 item->next->prev=item; | |
922 item->prev=curr; | |
923 curr->next=item; | |
924 plCurrent=plCurrent->next; | |
925 return plCurrent; | |
926 } | |
927 else | |
928 return gtkSet(gtkAddPlItem,0,(void*)item); | |
929 return NULL; | |
930 case gtkGetNextPlItem: // get current item from playlist | |
931 if ( plCurrent && plCurrent->next) | |
932 { | |
933 plCurrent=plCurrent->next; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
934 /*if ( !plCurrent && plList ) |
23077 | 935 { |
936 plItem * next = plList; | |
937 while ( next->next ) { if ( !next->next ) break; next=next->next; } | |
938 plCurrent=next; | |
939 }*/ | |
940 return plCurrent; | |
941 } | |
942 return NULL; | |
943 case gtkGetPrevPlItem: | |
944 if ( plCurrent && plCurrent->prev) | |
945 { | |
946 plCurrent=plCurrent->prev; | |
947 //if ( !plCurrent && plList ) plCurrent=plList; | |
948 return plCurrent; | |
949 } | |
950 return NULL; | |
951 case gtkSetCurrPlItem: // set current item | |
952 plCurrent=item; | |
953 return plCurrent; | |
954 case gtkGetCurrPlItem: // get current item | |
955 return plCurrent; | |
956 case gtkDelCurrPlItem: // delete current item | |
957 { | |
958 plItem * curr = plCurrent; | |
959 | |
960 if (!curr) | |
961 return NULL; | |
962 if (curr->prev) | |
963 curr->prev->next=curr->next; | |
964 if (curr->next) | |
965 curr->next->prev=curr->prev; | |
966 if (curr==plList) | |
967 plList=curr->next; | |
968 plCurrent=curr->next; | |
969 // Free it | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
970 free( curr->path ); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
971 free( curr->name ); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
972 free( curr ); |
23077 | 973 } |
974 mplCurr(); // Instead of using mplNext && mplPrev | |
975 | |
976 return plCurrent; | |
977 case gtkDelPl: // delete list | |
978 { | |
979 plItem * curr = plList; | |
980 plItem * next; | |
981 if ( !plList ) return NULL; | |
982 if ( !curr->next ) | |
983 { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
984 free( curr->path ); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
985 free( curr->name ); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
986 free( curr ); |
23077 | 987 } |
988 else | |
989 { | |
990 while ( curr->next ) | |
991 { | |
992 next=curr->next; | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
993 free( curr->path ); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32467
diff
changeset
|
994 free( curr->name ); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
995 free( curr ); |
23077 | 996 curr=next; |
997 } | |
998 } | |
999 plList=NULL; plCurrent=NULL; | |
1000 } | |
1001 return NULL; | |
1002 // ----- Handle url | |
1003 case gtkAddURLItem: | |
1004 if ( URLList ) | |
1005 { | |
1006 URLItem * next_url = URLList; | |
1007 is_added = False; | |
1008 while ( next_url->next ) | |
1009 { | |
1010 if ( !gstrcmp( next_url->url,url_item->url ) ) | |
1011 { | |
1012 is_added=True; | |
1013 break; | |
1014 } | |
1015 next_url=next_url->next; | |
1016 } | |
1017 if ( ( !is_added )&&( gstrcmp( next_url->url,url_item->url ) ) ) next_url->next=url_item; | |
1018 } else { url_item->next=NULL; URLList=url_item; } | |
1019 return NULL; | |
1020 // --- subtitle | |
27393 | 1021 #ifndef CONFIG_FREETYPE |
23077 | 1022 case gtkSetFontFactor: |
1023 font_factor=fparam; | |
1024 guiLoadFont(); | |
1025 return NULL; | |
1026 #else | |
1027 case gtkSetFontOutLine: | |
1028 subtitle_font_thickness=( 8.0f / 100.0f ) * fparam; | |
1029 guiLoadFont(); | |
1030 return NULL; | |
1031 case gtkSetFontBlur: | |
1032 subtitle_font_radius=( 8.0f / 100.0f ) * fparam; | |
1033 guiLoadFont(); | |
1034 return NULL; | |
1035 case gtkSetFontTextScale: | |
1036 text_font_scale_factor=fparam; | |
1037 guiLoadFont(); | |
1038 return NULL; | |
1039 case gtkSetFontOSDScale: | |
1040 osd_font_scale_factor=fparam; | |
1041 guiLoadFont(); | |
1042 return NULL; | |
1043 case gtkSetFontEncoding: | |
1044 gfree( (void **)&subtitle_font_encoding ); | |
1045 subtitle_font_encoding=gstrdup( (char *)vparam ); | |
1046 guiLoadFont(); | |
1047 return NULL; | |
1048 case gtkSetFontAutoScale: | |
1049 subtitle_autoscale=(int)fparam; | |
1050 guiLoadFont(); | |
1051 return NULL; | |
1052 #endif | |
27393 | 1053 #ifdef CONFIG_ICONV |
23077 | 1054 case gtkSetSubEncoding: |
1055 gfree( (void **)&sub_cp ); | |
1056 sub_cp=gstrdup( (char *)vparam ); | |
1057 break; | |
1058 #endif | |
1059 // --- misc | |
1060 case gtkClearStruct: | |
1061 if ( (unsigned int)vparam & guiFilenames ) | |
1062 { | |
1063 gfree( (void **)&guiIntfStruct.Filename ); | |
1064 gfree( (void **)&guiIntfStruct.Subtitlename ); | |
1065 gfree( (void **)&guiIntfStruct.AudioFile ); | |
1066 gtkSet( gtkDelPl,0,NULL ); | |
1067 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
1068 #ifdef CONFIG_DVDREAD |
23077 | 1069 if ( (unsigned int)vparam & guiDVD ) memset( &guiIntfStruct.DVD,0,sizeof( guiDVDStruct ) ); |
1070 #endif | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
1071 #ifdef CONFIG_VCD |
23077 | 1072 if ( (unsigned int)vparam & guiVCD ) guiIntfStruct.VCDTracks=0; |
1073 #endif | |
1074 return NULL; | |
1075 case gtkSetExtraStereo: | |
1076 gtkAOExtraStereoMul=fparam; | |
1077 if (guiIntfStruct.afilter) | |
1078 af_control_any_rev(guiIntfStruct.afilter, | |
1079 AF_CONTROL_ES_MUL | AF_CONTROL_SET, >kAOExtraStereoMul); | |
1080 return NULL; | |
1081 case gtkSetPanscan: | |
1082 { | |
1083 mp_cmd_t * mp_cmd; | |
1084 mp_cmd=calloc( 1,sizeof( *mp_cmd ) ); | |
1085 mp_cmd->id=MP_CMD_PANSCAN; mp_cmd->name=strdup( "panscan" ); | |
1086 mp_cmd->args[0].v.f=fparam; mp_cmd->args[1].v.i=1; | |
1087 mp_input_queue_cmd( mp_cmd ); | |
1088 } | |
1089 return NULL; | |
1090 case gtkSetAutoq: | |
1091 auto_quality=(int)fparam; | |
1092 return NULL; | |
1093 // --- set equalizers | |
1094 case gtkSetContrast: | |
1095 if ( guiIntfStruct.sh_video ) set_video_colors( guiIntfStruct.sh_video,"contrast",(int)fparam ); | |
1096 return NULL; | |
1097 case gtkSetBrightness: | |
1098 if ( guiIntfStruct.sh_video ) set_video_colors( guiIntfStruct.sh_video,"brightness",(int)fparam ); | |
1099 return NULL; | |
1100 case gtkSetHue: | |
1101 if ( guiIntfStruct.sh_video ) set_video_colors( guiIntfStruct.sh_video,"hue",(int)fparam ); | |
1102 return NULL; | |
1103 case gtkSetSaturation: | |
1104 if ( guiIntfStruct.sh_video ) set_video_colors( guiIntfStruct.sh_video,"saturation",(int)fparam ); | |
1105 return NULL; | |
1106 case gtkSetEqualizer: | |
1107 { | |
1108 af_control_ext_t tmp; | |
1109 if ( eq ) | |
1110 { | |
1111 gtkEquChannels[eq->channel][eq->band]=eq->gain; | |
1112 tmp.ch = eq->channel; | |
1113 tmp.arg = gtkEquChannels[eq->channel]; | |
1114 if (guiIntfStruct.afilter) | |
1115 af_control_any_rev(guiIntfStruct.afilter, | |
1116 AF_CONTROL_EQUALIZER_GAIN | AF_CONTROL_SET, &tmp); | |
1117 } | |
1118 else | |
1119 { | |
1120 int i; | |
1121 memset( gtkEquChannels,0,sizeof( gtkEquChannels ) ); | |
1122 if (guiIntfStruct.afilter) | |
1123 for ( i=0;i<6;i++ ) | |
1124 { | |
1125 tmp.ch = i; | |
1126 tmp.arg = gtkEquChannels[i]; | |
1127 af_control_any_rev(guiIntfStruct.afilter, | |
1128 AF_CONTROL_EQUALIZER_GAIN | AF_CONTROL_SET, &tmp); | |
1129 } | |
1130 } | |
1131 return NULL; | |
1132 } | |
1133 } | |
1134 return NULL; | |
1135 } | |
1136 | |
1137 #include "playtree.h" | |
1138 | |
1139 //This function adds/inserts one file into the gui playlist | |
1140 | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30516
diff
changeset
|
1141 static int import_file_into_gui(char* temp, int insert) |
23077 | 1142 { |
1143 char *filename, *pathname; | |
1144 plItem * item; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1145 |
23077 | 1146 filename = strdup(mp_basename(temp)); |
1147 pathname = strdup(temp); | |
1148 if (strlen(pathname)-strlen(filename)>0) | |
1149 pathname[strlen(pathname)-strlen(filename)-1]='\0'; // We have some path so remove / at end | |
1150 else | |
1151 pathname[strlen(pathname)-strlen(filename)]='\0'; | |
1152 mp_msg(MSGT_PLAYTREE,MSGL_V, "Adding filename %s && pathname %s\n",filename,pathname); //FIXME: Change to MSGL_DBG2 ? | |
1153 item=calloc( 1,sizeof( plItem ) ); | |
1154 if (!item) | |
1155 return 0; | |
1156 item->name=filename; | |
1157 item->path=pathname; | |
1158 if (insert) | |
1159 gtkSet( gtkInsertPlItem,0,(void*)item ); // Inserts the item after current, and makes current=item | |
1160 else | |
1161 gtkSet( gtkAddPlItem,0,(void*)item ); | |
1162 return 1; | |
1163 } | |
1164 | |
1165 | |
1166 // This function imports the initial playtree (based on cmd-line files) into the gui playlist | |
1167 // by either: | |
1168 // - overwriting gui pl (enqueue=0) | |
1169 // - appending it to gui pl (enqueue=1) | |
1170 | |
1171 int import_initial_playtree_into_gui(play_tree_t* my_playtree, m_config_t* config, int enqueue) | |
1172 { | |
1173 play_tree_iter_t* my_pt_iter=NULL; | |
1174 int result=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1175 |
23077 | 1176 if (!enqueue) // Delete playlist before "appending" |
1177 gtkSet(gtkDelPl,0,0); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1178 |
23077 | 1179 if((my_pt_iter=pt_iter_create(&my_playtree,config))) |
1180 { | |
1181 while ((filename=pt_iter_get_next_file(my_pt_iter))!=NULL) | |
1182 { | |
1183 if (import_file_into_gui(filename, 0)) // Add it to end of list | |
1184 result=1; | |
1185 } | |
1186 } | |
1187 | |
1188 mplCurr(); // Update filename | |
1189 mplGotoTheNext=1; | |
1190 | |
1191 if (!enqueue) | |
1192 filename=guiIntfStruct.Filename; // Backward compatibility; if file is specified on commandline, | |
1193 // gmplayer does directly start in Play-Mode. | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1194 else |
23077 | 1195 filename=NULL; |
1196 | |
1197 return result; | |
1198 } | |
1199 | |
1200 // This function imports and inserts an playtree, that is created "on the fly", for example by | |
1201 // parsing some MOV-Reference-File; or by loading an playlist with "File Open" | |
1202 // | |
1203 // The file which contained the playlist is thereby replaced with it's contents. | |
1204 | |
1205 int import_playtree_playlist_into_gui(play_tree_t* my_playtree, m_config_t* config) | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1206 { |
23077 | 1207 play_tree_iter_t* my_pt_iter=NULL; |
1208 int result=0; | |
1209 plItem * save=(plItem*)gtkSet( gtkGetCurrPlItem, 0, 0); // Save current item | |
1210 | |
1211 if((my_pt_iter=pt_iter_create(&my_playtree,config))) | |
1212 { | |
1213 while ((filename=pt_iter_get_next_file(my_pt_iter))!=NULL) | |
1214 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1215 if (import_file_into_gui(filename, 1)) // insert it into the list and set plCurrent=new item |
23077 | 1216 result=1; |
1217 } | |
1218 pt_iter_destroy(&my_pt_iter); | |
1219 } | |
1220 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1221 if (save) |
23077 | 1222 gtkSet(gtkSetCurrPlItem, 0, (void*)save); |
1223 else | |
1224 gtkSet(gtkSetCurrPlItem, 0, (void*)plList); // go to head, if plList was empty before | |
1225 | |
1226 if (save && result) | |
1227 gtkSet(gtkDelCurrPlItem, 0, 0); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1228 |
23077 | 1229 mplCurr(); // Update filename |
1230 filename=NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1231 |
23077 | 1232 return result; |
1233 } | |
1234 | |
1235 // wrapper function for mp_msg to display a message box for errors and warnings. | |
1236 | |
1237 void guiMessageBox(int level, char * str) { | |
1238 switch(level) { | |
1239 case MSGL_FATAL: | |
1240 gtkMessageBox(GTK_MB_FATAL|GTK_MB_SIMPLE, str); | |
1241 break; | |
1242 case MSGL_ERR: | |
1243 gtkMessageBox(GTK_MB_ERROR|GTK_MB_SIMPLE, str); | |
1244 break; | |
1245 #if 0 | |
1246 // WARNING! Do NOT enable this! There are too many non-critical messages with | |
1247 // MSGL_WARN, for example: broken SPU packets, codec's bit error messages, | |
1248 // etc etc, they should not raise up a new window every time. | |
1249 case MSGL_WARN: | |
1250 gtkMessageBox(GTK_MB_WARNING|GTK_MB_SIMPLE, str); | |
1251 break; | |
1252 #endif | |
1253 } | |
1254 } |