Mercurial > mplayer.hg
annotate Gui/interface.c @ 10633:e322ed02fa07
This should be up to date.
author | diego |
---|---|
date | Sat, 16 Aug 2003 20:54:41 +0000 |
parents | a17ebe817e33 |
children | 73702d2f93ab |
rev | line source |
---|---|
8058 | 1 |
4845 | 2 #include <inttypes.h> |
3 #include <stdlib.h> | |
4 #include <stdio.h> | |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
5 #include <string.h> |
8058 | 6 #include <sys/types.h> |
4798 | 7 |
8058 | 8 #include "wm/ws.h" |
9 #include "wm/wsxdnd.h" | |
4798 | 10 #include "interface.h" |
6619
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
11 #include "skin/skin.h" |
8058 | 12 |
6627 | 13 #include "mplayer/gtk/eq.h" |
8058 | 14 #include "mplayer/widgets.h" |
15 #include "mplayer/mplayer.h" | |
8423 | 16 #include "mplayer/play.h" |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
17 |
4798 | 18 #include "../mplayer.h" |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
19 #include "app.h" |
6794 | 20 #include "cfg.h" |
21 #include "../help_mp.h" | |
22 #include "../subreader.h" | |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
23 #include "../libvo/x11_common.h" |
5789 | 24 #include "../libvo/video_out.h" |
6794 | 25 #include "../libvo/font_load.h" |
7169 | 26 #include "../libvo/sub.h" |
4858 | 27 #include "../input/input.h" |
6619
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
28 #include "../libao2/audio_out.h" |
6627 | 29 #include "../mixer.h" |
30 #include "../libao2/audio_plugin.h" | |
31 #include "../libao2/eq.h" | |
5789 | 32 |
6996 | 33 #ifdef USE_ICONV |
7128 | 34 #include <iconv.h> |
6996 | 35 #endif |
36 | |
5665 | 37 #include "../libmpdemux/stream.h" |
5789 | 38 #include "../libmpdemux/demuxer.h" |
7217 | 39 #include "../libmpdemux/stheader.h" |
40 #include "../libmpcodecs/dec_video.h" | |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
41 |
10594
57bdcdb061d7
Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents:
10272
diff
changeset
|
42 #include "../m_config.h" |
57bdcdb061d7
Removed the historic cfgparser and switched full to the new config parser (altought some macros still remain for compatibility). As a side effect 90% of the warning messages are gone from the core. Things should be cleaner now and less confusing for newbies.
alex
parents:
10272
diff
changeset
|
43 #include "../m_option.h" |
9623
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
44 |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
45 guiInterface_t guiIntfStruct; |
9314
f38fe55d0e05
this patch adds the option -guiwid to gmplayer. I think its a more clean
arpi
parents:
9306
diff
changeset
|
46 int guiWinID=-1; |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
47 |
6627 | 48 char * gstrcat( char ** dest,char * src ) |
49 { | |
50 char * tmp = NULL; | |
51 | |
52 if ( !src ) return NULL; | |
53 | |
54 if ( *dest ) | |
55 { | |
56 tmp=malloc( strlen( *dest ) + strlen( src ) + 1 ); | |
57 strcpy( tmp,*dest ); strcat( tmp,src ); free( *dest ); | |
58 } | |
59 else | |
60 { tmp=malloc( strlen( src ) + 1 ); strcpy( tmp,src ); } | |
61 *dest=tmp; | |
62 return tmp; | |
63 } | |
64 | |
6794 | 65 int gstrcmp( char * a,char * b ) |
66 { | |
67 if ( !a && !b ) return 0; | |
68 if ( !a || !b ) return -1; | |
69 return strcmp( a,b ); | |
70 } | |
71 | |
7019 | 72 int gstrncmp( char * a,char * b,int size ) |
73 { | |
74 if ( !a && !b ) return 0; | |
75 if ( !a || !b ) return -1; | |
76 return strncmp( a,b,size ); | |
77 } | |
78 | |
6794 | 79 char * gstrdup( char * str ) |
80 { | |
81 if ( !str ) return NULL; | |
82 return strdup( str ); | |
83 } | |
84 | |
8284 | 85 char * gstrchr( char * str,int c ) |
86 { | |
87 if ( !str ) return NULL; | |
88 return strchr( str,c ); | |
89 } | |
90 | |
6794 | 91 void gfree( void ** p ) |
92 { | |
93 if ( *p == NULL ) return; | |
94 free( *p ); *p=NULL; | |
95 } | |
96 | |
97 void gset( char ** str,char * what ) | |
98 { | |
7887
0e5544951425
A small patch to Gui/interface.c; the first fix is a plain bug, the second is
arpi
parents:
7707
diff
changeset
|
99 if ( *str ) { if ( !strstr( *str,what ) ) { gstrcat( str,"," ); gstrcat( str,what ); }} |
6794 | 100 else gstrcat( str,what ); |
101 } | |
102 | |
7582 | 103 void gaddlist( char *** list,char * entry ) |
104 { | |
105 int i; | |
106 | |
107 if ( (*list) ) | |
108 { | |
109 for ( i=0;(*list)[i];i++ ) free( (*list)[i] ); | |
110 free( (*list) ); | |
111 } | |
112 | |
113 (*list)=malloc( 8 ); | |
114 (*list)[0]=gstrdup( entry ); | |
115 (*list)[1]=NULL; | |
116 } | |
117 | |
6996 | 118 #ifdef USE_ICONV |
119 char * gconvert_uri_to_filename( char * str ) | |
120 { | |
121 iconv_t d; | |
122 char * out = strdup( str ); | |
123 char * tmp = NULL; | |
124 char * ize; | |
125 size_t inb,outb; | |
126 char * charset = "ISO8859-1"; | |
127 char * cs; | |
128 | |
129 if ( !strchr( str,'%' ) ) return str; | |
130 | |
131 { | |
132 char * t = calloc( 1,strlen( out ) ); | |
133 int i,c = 0; | |
134 for ( i=0;i < (int)strlen( out );i++ ) | |
135 if ( out[i] != '%' ) t[c++]=out[i]; | |
136 else | |
137 { | |
138 char tmp[4] = "0xXX"; | |
139 // if ( out[++i] == '%' ) { t[c++]='%'; continue; }; | |
140 tmp[2]=out[++i]; tmp[3]=out[++i]; | |
141 t[c++]=(char)strtol( tmp,(char **)NULL,0 ); | |
142 } | |
143 free( out ); | |
144 out=t; | |
145 } | |
146 | |
147 if ( (cs=getenv( "CHARSET" )) && *cs ) charset=cs; | |
148 | |
149 inb=outb=strlen( out ); | |
150 tmp=calloc( 1,outb + 1 ); | |
151 ize=tmp; | |
152 d=iconv_open( charset,"UTF-8" ); | |
153 if ( (iconv_t)(-1) == d ) return str; | |
154 iconv( d,&out,&inb,&tmp,&outb ); | |
155 iconv_close( d ); | |
156 free( out ); | |
157 return ize; | |
158 } | |
159 #endif | |
160 | |
6218 | 161 void guiInit( void ) |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
162 { |
8058 | 163 int i; |
164 | |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
165 memset( &guiIntfStruct,0,sizeof( guiIntfStruct ) ); |
6898 | 166 guiIntfStruct.Balance=50.0f; |
167 guiIntfStruct.StreamType=-1; | |
168 | |
6627 | 169 memset( >kEquChannels,0,sizeof( gtkEquChannels ) ); |
8600
54eac4cf587c
Lots of functions and variables specific to OSS audio are used without
arpi
parents:
8484
diff
changeset
|
170 #ifdef USE_OSS_AUDIO |
7706 | 171 if ( !gtkAOOSSMixer ) gtkAOOSSMixer=strdup( PATH_DEV_MIXER ); |
172 if ( !gtkAOOSSDevice ) gtkAOOSSDevice=strdup( PATH_DEV_DSP ); | |
8600
54eac4cf587c
Lots of functions and variables specific to OSS audio are used without
arpi
parents:
8484
diff
changeset
|
173 #endif |
7707 | 174 #ifdef HAVE_DXR3 |
7706 | 175 if ( !gtkDXR3Device ) gtkDXR3Device=strdup( "/dev/em8300-0" ); |
7707 | 176 #endif |
8311 | 177 if ( stream_cache_size != -1 ) { gtkCacheOn=1; gtkCacheSize=stream_cache_size; } |
178 if ( autosync && autosync != gtkAutoSync ) { gtkAutoSyncOn=1; gtkAutoSync=autosync; } | |
6898 | 179 |
180 gtkInit(); | |
8043 | 181 // --- initialize X |
6912 | 182 wsXInit( (void *)mDisplay ); |
8058 | 183 // --- load skin |
8043 | 184 skinDirInHome=get_path("Skin"); |
10272
7b0bc557987b
renames: DATADIR->MPLAYER_DATADIR, CONFDIR->MPLAYER_CONFDIR, LIBDIR->MPLAYER_LIBDIR
arpi
parents:
10193
diff
changeset
|
185 skinMPlayerDir=MPLAYER_DATADIR "/Skin"; |
8043 | 186 printf("SKIN dir 1: '%s'\n",skinDirInHome); |
187 printf("SKIN dir 2: '%s'\n",skinMPlayerDir); | |
188 if ( !skinName ) skinName=strdup( "default" ); | |
10607
a17ebe817e33
Fixed a long standing issue: if configured a not available (not existing, permission denied, ...) skin, the gui never ever started again. Now it reverts to 'default' if it can't open the selected skin, if 'default' fails too, the gui exits with error.
alex
parents:
10594
diff
changeset
|
189 i = skinRead( skinName ); |
a17ebe817e33
Fixed a long standing issue: if configured a not available (not existing, permission denied, ...) skin, the gui never ever started again. Now it reverts to 'default' if it can't open the selected skin, if 'default' fails too, the gui exits with error.
alex
parents:
10594
diff
changeset
|
190 if ((i == -1) && strcmp(skinName,"default")) |
a17ebe817e33
Fixed a long standing issue: if configured a not available (not existing, permission denied, ...) skin, the gui never ever started again. Now it reverts to 'default' if it can't open the selected skin, if 'default' fails too, the gui exits with error.
alex
parents:
10594
diff
changeset
|
191 { |
a17ebe817e33
Fixed a long standing issue: if configured a not available (not existing, permission denied, ...) skin, the gui never ever started again. Now it reverts to 'default' if it can't open the selected skin, if 'default' fails too, the gui exits with error.
alex
parents:
10594
diff
changeset
|
192 mp_msg( MSGT_GPLAYER,MSGL_INFO,"Selected skin ( %s ) not found, trying 'default'...\n", skinName); |
a17ebe817e33
Fixed a long standing issue: if configured a not available (not existing, permission denied, ...) skin, the gui never ever started again. Now it reverts to 'default' if it can't open the selected skin, if 'default' fails too, the gui exits with error.
alex
parents:
10594
diff
changeset
|
193 skinName=strdup( "default" ); |
a17ebe817e33
Fixed a long standing issue: if configured a not available (not existing, permission denied, ...) skin, the gui never ever started again. Now it reverts to 'default' if it can't open the selected skin, if 'default' fails too, the gui exits with error.
alex
parents:
10594
diff
changeset
|
194 i = skinRead( skinName ); |
a17ebe817e33
Fixed a long standing issue: if configured a not available (not existing, permission denied, ...) skin, the gui never ever started again. Now it reverts to 'default' if it can't open the selected skin, if 'default' fails too, the gui exits with error.
alex
parents:
10594
diff
changeset
|
195 } |
a17ebe817e33
Fixed a long standing issue: if configured a not available (not existing, permission denied, ...) skin, the gui never ever started again. Now it reverts to 'default' if it can't open the selected skin, if 'default' fails too, the gui exits with error.
alex
parents:
10594
diff
changeset
|
196 switch (i) { |
8043 | 197 case -1: mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_SKIN_SKINCFG_SkinNotFound,skinName ); exit( 0 ); |
198 case -2: mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_SKIN_SKINCFG_SkinCfgReadError,skinName ); exit( 0 ); | |
199 } | |
8058 | 200 // --- initialize windows |
9088 | 201 if ( ( mplDrawBuffer = (unsigned char *)malloc( appMPlayer.main.Bitmap.ImageSize ) ) == NULL ) |
8058 | 202 { |
203 fprintf( stderr,MSGTR_NEMDB ); | |
204 exit( 0 ); | |
205 } | |
9306 | 206 |
9625 | 207 if ( gui_save_pos ) |
208 { | |
209 appMPlayer.main.x = gui_main_pos_x; | |
210 appMPlayer.main.y = gui_main_pos_y; | |
211 appMPlayer.sub.x = gui_sub_pos_x; | |
212 appMPlayer.sub.y = gui_sub_pos_y; | |
213 } | |
214 | |
9306 | 215 if (WinID>0) |
9625 | 216 { |
9306 | 217 appMPlayer.subWindow.Parent=WinID; |
218 appMPlayer.sub.x=0; | |
219 appMPlayer.sub.y=0; | |
9625 | 220 } |
221 if (guiWinID>=0) appMPlayer.mainWindow.Parent=guiWinID; | |
9202 | 222 |
8058 | 223 wsCreateWindow( &appMPlayer.subWindow, |
224 appMPlayer.sub.x,appMPlayer.sub.y,appMPlayer.sub.width,appMPlayer.sub.height, | |
9202 | 225 wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsShowFrame|wsHideWindow,"MPlayer - Video" ); |
8058 | 226 |
227 wsDestroyImage( &appMPlayer.subWindow ); | |
228 wsCreateImage( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Width,appMPlayer.sub.Bitmap.Height ); | |
229 wsXDNDMakeAwareness(&appMPlayer.subWindow); | |
230 | |
8973 | 231 mplMenuInit(); |
232 mplPBInit(); | |
233 | |
8058 | 234 vo_setwindow( appMPlayer.subWindow.WindowID, appMPlayer.subWindow.wGC ); |
235 | |
236 // i=wsHideFrame|wsMaxSize|wsHideWindow; | |
237 // if ( appMPlayer.mainDecoration ) i=wsShowFrame|wsMaxSize|wsHideWindow; | |
238 i=wsShowFrame|wsMaxSize|wsHideWindow; | |
239 wsCreateWindow( &appMPlayer.mainWindow, | |
240 appMPlayer.main.x,appMPlayer.main.y,appMPlayer.main.width,appMPlayer.main.height, | |
8949 | 241 wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,i,"MPlayer" ); |
8058 | 242 |
243 wsSetShape( &appMPlayer.mainWindow,appMPlayer.main.Mask.Image ); | |
244 wsXDNDMakeAwareness(&appMPlayer.mainWindow); | |
245 | |
246 #ifdef DEBUG | |
247 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] Depth on screen: %d\n",wsDepthOnScreen ); | |
248 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] parent: 0x%x\n",(int)appMPlayer.mainWindow.WindowID ); | |
249 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] sub: 0x%x\n",(int)appMPlayer.subWindow.WindowID ); | |
250 #endif | |
251 | |
252 appMPlayer.mainWindow.ReDraw=(void *)mplMainDraw; | |
253 appMPlayer.mainWindow.MouseHandler=mplMainMouseHandle; | |
254 appMPlayer.mainWindow.KeyHandler=mplMainKeyHandle; | |
255 appMPlayer.mainWindow.DandDHandler=mplDandDHandler; | |
256 | |
257 appMPlayer.subWindow.ReDraw=(void *)mplSubDraw; | |
258 appMPlayer.subWindow.MouseHandler=mplSubMouseHandle; | |
259 appMPlayer.subWindow.KeyHandler=mplMainKeyHandle; | |
260 appMPlayer.subWindow.DandDHandler=mplDandDHandler; | |
261 | |
8973 | 262 wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); |
8058 | 263 wsClearWindow( appMPlayer.subWindow ); |
264 if ( appMPlayer.sub.Bitmap.Image ) wsConvert( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Image,appMPlayer.sub.Bitmap.ImageSize ); | |
265 | |
266 btnModify( evSetVolume,guiIntfStruct.Volume ); | |
267 btnModify( evSetBalance,guiIntfStruct.Balance ); | |
268 btnModify( evSetMoviePosition,guiIntfStruct.Position ); | |
269 | |
270 wsSetIcon( wsDisplay,appMPlayer.mainWindow.WindowID,guiIcon,guiIconMask ); | |
271 wsSetIcon( wsDisplay,appMPlayer.subWindow.WindowID,guiIcon,guiIconMask ); | |
272 | |
273 guiIntfStruct.Playing=0; | |
274 | |
275 if ( !appMPlayer.mainDecoration ) wsWindowDecoration( &appMPlayer.mainWindow,0 ); | |
276 | |
277 wsVisibleWindow( &appMPlayer.mainWindow,wsShowWindow ); | |
9202 | 278 #if 0 |
8058 | 279 wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); |
280 | |
281 { | |
282 XEvent xev; | |
283 do { XNextEvent( wsDisplay,&xev ); } while ( xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID ); | |
284 appMPlayer.subWindow.Mapped=wsMapped; | |
285 } | |
286 | |
9088 | 287 if ( !fullscreen ) fullscreen=gtkLoadFullscreen; |
8058 | 288 if ( fullscreen ) |
289 { | |
290 mplFullScreen(); | |
291 btnModify( evFullScreen,btnPressed ); | |
292 } | |
9202 | 293 #else |
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 } | |
8058 | 325 #endif |
326 mplSubRender=1; | |
8043 | 327 // --- |
7538 | 328 |
8423 | 329 if ( filename ) mplSetFileName( NULL,filename,STREAMTYPE_FILE ); |
7009 | 330 if ( plCurrent && !filename ) mplSetFileName( plCurrent->path,plCurrent->name,STREAMTYPE_FILE ); |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
331 if ( subdata ) guiSetFilename( guiIntfStruct.Subtitlename, subdata->filename ); |
6797
06d29dbdf20d
upsz, sorry, i forgott this :) (skin name saving:)
pontscho
parents:
6794
diff
changeset
|
332 #if defined( USE_OSD ) || defined( USE_SUB ) |
06d29dbdf20d
upsz, sorry, i forgott this :) (skin name saving:)
pontscho
parents:
6794
diff
changeset
|
333 guiLoadFont(); |
06d29dbdf20d
upsz, sorry, i forgott this :) (skin name saving:)
pontscho
parents:
6794
diff
changeset
|
334 #endif |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
335 } |
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
336 |
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
337 void guiDone( void ) |
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
338 { |
8883 | 339 mplMainRender=0; |
8043 | 340 mp_msg( MSGT_GPLAYER,MSGL_V,"[gui] done.\n" ); |
9625 | 341 |
342 if ( gui_save_pos ) | |
343 { | |
344 gui_main_pos_x=appMPlayer.mainWindow.X; gui_main_pos_y=appMPlayer.mainWindow.Y; | |
345 gui_sub_pos_x=appMPlayer.subWindow.X; gui_sub_pos_y=appMPlayer.subWindow.Y; | |
346 } | |
347 | |
6794 | 348 cfg_write(); |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
349 wsXDone(); |
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
350 } |
4798 | 351 |
4858 | 352 int guiCMDArray[] = |
353 { | |
8883 | 354 evLoadPlay, |
4858 | 355 evLoadSubtitle, |
356 evAbout, | |
357 evPlay, | |
358 evStop, | |
359 evPlayList, | |
360 evPreferences, | |
361 evFullScreen, | |
362 evSkinBrowser | |
363 }; | |
364 | |
6619
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
365 extern ao_functions_t * audio_out; |
6755 | 366 extern vo_functions_t * video_out; |
6794 | 367 extern int frame_dropping; |
368 extern int stream_dump_type; | |
9812
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
369 extern int vcd_track; |
9623
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
370 extern m_obj_settings_t*vo_plugin_args; |
6794 | 371 |
372 #if defined( USE_OSD ) || defined( USE_SUB ) | |
373 void guiLoadFont( void ) | |
374 { | |
7122
0dc9cb756b68
freetype 2.0/2.1+ support - disabled by default until bugs fixed
arpi
parents:
7111
diff
changeset
|
375 #ifdef HAVE_FREETYPE |
8635
81dbd28ef7c0
these patches let ,,oldstyle'' and freetype subtitle renderers live
arpi
parents:
8615
diff
changeset
|
376 load_font_ft(vo_image_width, vo_image_height); |
7122
0dc9cb756b68
freetype 2.0/2.1+ support - disabled by default until bugs fixed
arpi
parents:
7111
diff
changeset
|
377 #else |
6794 | 378 if ( vo_font ) |
379 { | |
380 int i; | |
381 if ( vo_font->name ) free( vo_font->name ); | |
382 if ( vo_font->fpath ) free( vo_font->fpath ); | |
383 for ( i=0;i<16;i++ ) | |
384 if ( vo_font->pic_a[i] ) | |
385 { | |
386 if ( vo_font->pic_a[i]->bmp ) free( vo_font->pic_a[i]->bmp ); | |
387 if ( vo_font->pic_a[i]->pal ) free( vo_font->pic_a[i]->pal ); | |
388 } | |
389 for ( i=0;i<16;i++ ) | |
390 if ( vo_font->pic_b[i] ) | |
391 { | |
392 if ( vo_font->pic_b[i]->bmp ) free( vo_font->pic_b[i]->bmp ); | |
393 if ( vo_font->pic_b[i]->pal ) free( vo_font->pic_b[i]->pal ); | |
394 } | |
395 free( vo_font ); vo_font=NULL; | |
396 } | |
7019 | 397 if ( font_name ) |
6794 | 398 { |
7019 | 399 vo_font=read_font_desc( font_name,font_factor,0 ); |
6794 | 400 if ( !vo_font ) mp_msg( MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont,font_name ); |
401 } | |
402 else | |
403 { | |
7019 | 404 font_name=gstrdup( get_path( "font/font.desc" ) ); |
405 vo_font=read_font_desc( font_name,font_factor,0 ); | |
6794 | 406 if ( !vo_font ) |
407 { | |
10272
7b0bc557987b
renames: DATADIR->MPLAYER_DATADIR, CONFDIR->MPLAYER_CONFDIR, LIBDIR->MPLAYER_LIBDIR
arpi
parents:
10193
diff
changeset
|
408 gfree( (void **)&font_name ); font_name=gstrdup(MPLAYER_DATADIR "/font/font.desc" ); |
7019 | 409 vo_font=read_font_desc( font_name,font_factor,0 ); |
6794 | 410 } |
411 } | |
7122
0dc9cb756b68
freetype 2.0/2.1+ support - disabled by default until bugs fixed
arpi
parents:
7111
diff
changeset
|
412 #endif |
6794 | 413 } |
414 #endif | |
6619
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
415 |
7150 | 416 #ifdef USE_SUB |
7169 | 417 extern mp_osd_obj_t* vo_osd_list; |
418 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
419 extern char **sub_name; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
420 |
7150 | 421 void guiLoadSubtitle( char * name ) |
422 { | |
423 if ( guiIntfStruct.Playing == 0 ) | |
424 { | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
425 guiIntfStruct.SubtitleChanged=1; //what is this for? (mw) |
7150 | 426 return; |
427 } | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
428 if ( subdata ) |
7150 | 429 { |
7169 | 430 mp_msg( MSGT_GPLAYER,MSGL_INFO,"[gui] Delete subtitles.\n" ); |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
431 sub_free( subdata ); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
432 subdata=NULL; |
7150 | 433 vo_sub=NULL; |
7169 | 434 if ( vo_osd_list ) |
435 { | |
436 int len; | |
437 mp_osd_obj_t * osd = vo_osd_list; | |
438 while ( osd ) | |
439 { | |
440 if ( osd->type == OSDTYPE_SUBTITLE ) break; | |
441 osd=osd->next; | |
442 } | |
443 if ( osd && osd->flags&OSDFLAG_VISIBLE ) | |
444 { | |
445 len=osd->stride * ( osd->bbox.y2 - osd->bbox.y1 ); | |
446 memset( osd->bitmap_buffer,0,len ); | |
447 memset( osd->alpha_buffer,0,len ); | |
448 } | |
449 } | |
7150 | 450 } |
7169 | 451 if ( name ) |
452 { | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
453 mp_msg( MSGT_GPLAYER,MSGL_INFO,"[gui] Load subtitle: %s\n",name ); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
454 subdata=sub_read_file( gstrdup( name ), guiIntfStruct.FPS ); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
455 if ( !subdata ) mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_CantLoadSub,name ); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
456 sub_name = (malloc(2 * sizeof(char*))); //when mplayer will be restarted |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
457 sub_name[0] = strdup(name); //sub_name[0] will be read |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
458 sub_name[1] = NULL; |
7169 | 459 } |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
460 update_set_of_subtitles(); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
461 |
7150 | 462 } |
463 #endif | |
464 | |
7009 | 465 static void add_vop( char * str ) |
466 { | |
467 mp_msg( MSGT_GPLAYER,MSGL_STATUS,"[gui] add video filter: %s\n",str ); | |
468 if ( vo_plugin_args ) | |
469 { | |
470 int i = 0; | |
9623
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
471 while ( vo_plugin_args[i].name ) if ( !gstrcmp( vo_plugin_args[i++].name,str ) ) { i=-1; break; } |
7009 | 472 if ( i != -1 ) |
9623
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
473 { vo_plugin_args=realloc( vo_plugin_args,( i + 2 ) * sizeof( m_obj_settings_t ) ); vo_plugin_args[i].name=strdup( str );vo_plugin_args[i].attribs = NULL; vo_plugin_args[i+1].name=NULL; } |
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
474 } else { vo_plugin_args=malloc( 2 * sizeof( m_obj_settings_t ) ); vo_plugin_args[0].name=strdup( str );vo_plugin_args[0].attribs = NULL; vo_plugin_args[1].name=NULL; } |
7009 | 475 } |
476 | |
477 static void remove_vop( char * str ) | |
478 { | |
479 int n = 0; | |
480 | |
481 if ( !vo_plugin_args ) return; | |
482 | |
483 mp_msg( MSGT_GPLAYER,MSGL_STATUS,"[gui] remove video filter: %s\n",str ); | |
484 | |
9623
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
485 while ( vo_plugin_args[n++].name ); n--; |
7009 | 486 if ( n > -1 ) |
487 { | |
488 int i = 0,m = -1; | |
9623
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
489 while ( vo_plugin_args[i].name ) if ( !gstrcmp( vo_plugin_args[i++].name,str ) ) { m=i - 1; break; } |
7009 | 490 i--; |
491 if ( m > -1 ) | |
492 { | |
9623
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
493 if ( n == 1 ) { free( vo_plugin_args[0].name );free( vo_plugin_args[0].attribs ); free( vo_plugin_args ); vo_plugin_args=NULL; } |
20f0a254142d
bugfix from Raindel Shachar <raindel@techunix.technion.ac.il>
pontscho
parents:
9314
diff
changeset
|
494 else { free( vo_plugin_args[i].name );free( vo_plugin_args[i].attribs ); memcpy( &vo_plugin_args[i],&vo_plugin_args[i + 1],( n - i ) * sizeof( m_obj_settings_t ) ); } |
7009 | 495 } |
496 } | |
497 } | |
498 | |
499 int guiGetEvent( int type,char * arg ) | |
4798 | 500 { |
6280 | 501 stream_t * stream = (stream_t *) arg; |
5672
1f8b34f1e7c0
ifdef reading dvd args, without it non-dvd compilation fails.
eyck
parents:
5665
diff
changeset
|
502 #ifdef USE_DVDREAD |
5665 | 503 dvd_priv_t * dvdp = (dvd_priv_t *) arg; |
5672
1f8b34f1e7c0
ifdef reading dvd args, without it non-dvd compilation fails.
eyck
parents:
5665
diff
changeset
|
504 #endif |
6619
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
505 |
4798 | 506 switch ( type ) |
507 { | |
508 case guiXEvent: | |
8973 | 509 guiIntfStruct.event_struct=(void *)arg; |
4798 | 510 wsEvents( wsDisplay,(XEvent *)arg,NULL ); |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
511 gtkEventHandling(); |
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
512 break; |
4798 | 513 case guiCEvent: |
4963 | 514 switch ( (int)arg ) |
515 { | |
9202 | 516 case guiSetPlay: |
517 guiIntfStruct.Playing=1; | |
518 if ( !gtkShowVideoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
519 break; | |
520 case guiSetStop: | |
521 guiIntfStruct.Playing=0; | |
522 if ( !gtkShowVideoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
523 break; | |
8423 | 524 case guiSetPause: guiIntfStruct.Playing=2; break; |
4963 | 525 } |
8423 | 526 mplState(); |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
527 break; |
5665 | 528 case guiSetState: |
529 mplState(); | |
530 break; | |
531 case guiSetFileName: | |
532 if ( arg ) guiSetFilename( guiIntfStruct.Filename,arg ); | |
533 break; | |
5789 | 534 case guiSetAudioOnly: |
535 guiIntfStruct.AudioOnly=(int)arg; | |
7009 | 536 if ( (int)arg ) { guiIntfStruct.NoWindow=True; wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); } |
5789 | 537 else wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); |
538 break; | |
8312
ef8c992672f4
- audio track handling in menu (idea from R«ädiger Kuhlmann)
pontscho
parents:
8311
diff
changeset
|
539 case guiSetDemuxer: |
ef8c992672f4
- audio track handling in menu (idea from R«ädiger Kuhlmann)
pontscho
parents:
8311
diff
changeset
|
540 guiIntfStruct.demuxer=(void *)arg; |
ef8c992672f4
- audio track handling in menu (idea from R«ädiger Kuhlmann)
pontscho
parents:
8311
diff
changeset
|
541 break; |
5789 | 542 case guiSetShVideo: |
543 { | |
5986 | 544 if ( !appMPlayer.subWindow.isFullScreen ) |
545 { | |
546 wsResizeWindow( &appMPlayer.subWindow,vo_dwidth,vo_dheight ); | |
547 wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); | |
548 } | |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
549 guiIntfStruct.MovieWidth=vo_dwidth; |
5997
b5fb9a927bf3
add WM detection, and wm specific fullscreen code. (???)
pontscho
parents:
5986
diff
changeset
|
550 guiIntfStruct.MovieHeight=vo_dheight; |
9314
f38fe55d0e05
this patch adds the option -guiwid to gmplayer. I think its a more clean
arpi
parents:
9306
diff
changeset
|
551 if (guiWinID>=0) |
9306 | 552 wsMoveWindow( &appMPlayer.mainWindow,0,0, vo_dheight); |
5789 | 553 } |
554 break; | |
5665 | 555 #ifdef USE_DVDREAD |
556 case guiSetDVD: | |
557 guiIntfStruct.DVD.titles=dvdp->vmg_file->tt_srpt->nr_of_srpts; | |
558 guiIntfStruct.DVD.chapters=dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts; | |
559 guiIntfStruct.DVD.angles=dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; | |
560 guiIntfStruct.DVD.nr_of_audio_channels=dvdp->nr_of_channels; | |
561 memcpy( guiIntfStruct.DVD.audio_streams,dvdp->audio_streams,sizeof( dvdp->audio_streams ) ); | |
562 guiIntfStruct.DVD.nr_of_subtitles=dvdp->nr_of_subtitles; | |
563 memcpy( guiIntfStruct.DVD.subtitles,dvdp->subtitles,sizeof( dvdp->subtitles ) ); | |
564 guiIntfStruct.DVD.current_title=dvd_title + 1; | |
565 guiIntfStruct.DVD.current_chapter=dvd_chapter + 1; | |
566 guiIntfStruct.DVD.current_angle=dvd_angle + 1; | |
567 guiIntfStruct.Track=dvd_title + 1; | |
568 break; | |
569 #endif | |
6280 | 570 case guiSetStream: |
571 guiIntfStruct.StreamType=stream->type; | |
572 switch( stream->type ) | |
573 { | |
7150 | 574 #ifdef USE_DVDREAD |
6280 | 575 case STREAMTYPE_DVD: |
576 guiGetEvent( guiSetDVD,(char *)stream->priv ); | |
577 break; | |
7150 | 578 #endif |
6280 | 579 #ifdef HAVE_VCD |
580 case STREAMTYPE_VCD: | |
581 { | |
582 int i; | |
583 for ( i=1;i < 100;i++ ) | |
584 if ( vcd_seek_to_track( stream->fd,i ) < 0 ) break; | |
585 vcd_seek_to_track( stream->fd,vcd_track ); | |
586 guiIntfStruct.VCDTracks=--i; | |
587 break; | |
588 } | |
589 #endif | |
7150 | 590 default: break; |
6280 | 591 } |
592 break; | |
4858 | 593 case guiIEvent: |
594 printf( "cmd: %d\n",(int)arg ); | |
595 switch( (int)arg ) | |
596 { | |
597 case MP_CMD_QUIT: | |
598 mplEventHandling( evExit,0 ); | |
599 break; | |
600 case MP_CMD_VO_FULLSCREEN: | |
601 mplEventHandling( evFullScreen,0 ); | |
602 break; | |
603 default: | |
604 mplEventHandling( guiCMDArray[ (int)arg - MP_CMD_GUI_EVENTS - 1 ],0 ); | |
605 } | |
606 break; | |
6619
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
607 case guiReDraw: |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
608 mplEventHandling( evRedraw,0 ); |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
609 break; |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
610 case guiSetVolume: |
6903 | 611 if ( audio_out ) |
612 { | |
613 float l,r; | |
614 mixer_getvolume( &l,&r ); | |
615 guiIntfStruct.Volume=(r>l?r:l); | |
616 if ( r != l ) guiIntfStruct.Balance=( ( r - l ) + 100 ) * 0.5f; | |
617 else guiIntfStruct.Balance=50.0f; | |
618 btnModify( evSetVolume,guiIntfStruct.Volume ); | |
619 btnModify( evSetBalance,guiIntfStruct.Balance ); | |
620 } | |
621 break; | |
7009 | 622 case guiSetFileFormat: |
623 guiIntfStruct.FileFormat=(int)arg; | |
624 break; | |
6903 | 625 case guiSetValues: |
6912 | 626 // -- video |
7217 | 627 guiIntfStruct.sh_video=arg; |
6912 | 628 if ( arg ) |
629 { | |
7217 | 630 sh_video_t * sh = (sh_video_t *)arg; |
7150 | 631 guiIntfStruct.FPS=sh->fps; |
6912 | 632 } |
7009 | 633 |
634 if ( guiIntfStruct.NoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
8280
72700fefd3dc
no seeking if stream is STREAMTYPE_STREAM (net/stdin)
pontscho
parents:
8150
diff
changeset
|
635 |
8300 | 636 if ( guiIntfStruct.StreamType == STREAMTYPE_STREAM ) btnSet( evSetMoviePosition,btnDisabled ); |
637 else btnSet( evSetMoviePosition,btnReleased ); | |
8284 | 638 |
6794 | 639 // -- audio |
6619
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
640 if ( audio_out ) |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
641 { |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
642 float l,r; |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
643 mixer_getvolume( &l,&r ); |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
644 guiIntfStruct.Volume=(r>l?r:l); |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
645 if ( r != l ) guiIntfStruct.Balance=( ( r - l ) + 100 ) * 0.5f; |
6627 | 646 else guiIntfStruct.Balance=50.0f; |
6619
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
647 btnModify( evSetVolume,guiIntfStruct.Volume ); |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
648 btnModify( evSetBalance,guiIntfStruct.Balance ); |
f554e7271587
fix volume handling ( step 2 ) -- add balance support and some code cleanup and fix
pontscho
parents:
6280
diff
changeset
|
649 } |
6627 | 650 |
651 if ( gtkEnableAudioEqualizer ) | |
652 { | |
653 equalizer_t eq; | |
654 int i,j; | |
655 for ( i=0;i<6;i++ ) | |
656 for ( j=0;j<10;j++ ) | |
657 { | |
658 eq.channel=i; eq.band=j; eq.gain=gtkEquChannels[i][j]; | |
659 gtkSet( gtkSetEqualizer,0,&eq ); | |
660 } | |
661 } | |
6794 | 662 // -- subtitle |
7009 | 663 #ifdef HAVE_DXR3 |
8043 | 664 if ( video_driver_list && !gstrcmp( video_driver_list[0],"dxr3" ) && guiIntfStruct.FileFormat != DEMUXER_TYPE_MPEG_PS |
665 #ifdef USE_LIBAVCODEC | |
666 && !gtkVopLAVC | |
667 #endif | |
668 #ifdef USE_LIBFAME | |
669 && !gtkVopFAME | |
670 #endif | |
671 ) | |
7009 | 672 { |
673 gtkMessageBox( GTK_MB_FATAL,MSGTR_NEEDLAVCFAME ); | |
674 guiIntfStruct.Playing=0; | |
675 return True; | |
676 } | |
677 #endif | |
6627 | 678 break; |
679 case guiSetDefaults: | |
9055 | 680 // if ( guiIntfStruct.Playing == 1 && guiIntfStruct.FilenameChanged ) |
681 if ( guiIntfStruct.FilenameChanged ) | |
8423 | 682 { |
683 audio_id=-1; | |
684 video_id=-1; | |
685 dvdsub_id=-1; | |
686 vobsub_id=-1; | |
687 stream_cache_size=-1; | |
688 autosync=0; | |
689 vcd_track=0; | |
690 dvd_title=0; | |
9055 | 691 force_fps=0; |
8423 | 692 } |
693 wsPostRedisplay( &appMPlayer.subWindow ); | |
694 break; | |
695 case guiSetParameters: | |
9055 | 696 guiGetEvent( guiSetDefaults,NULL ); |
8423 | 697 switch ( guiIntfStruct.StreamType ) |
698 { | |
699 case STREAMTYPE_PLAYLIST: | |
700 break; | |
701 #ifdef HAVE_VCD | |
702 case STREAMTYPE_VCD: | |
9812
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
703 { |
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
704 char tmp[512]; |
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
705 sprintf( tmp,"vcd://%d",guiIntfStruct.Track + 1 ); |
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
706 guiSetFilename( guiIntfStruct.Filename,tmp ); |
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
707 } |
8423 | 708 break; |
709 #endif | |
710 #ifdef USE_DVDREAD | |
711 case STREAMTYPE_DVD: | |
9812
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
712 { |
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
713 char tmp[512]; |
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
714 sprintf( tmp,"dvd://%d",guiIntfStruct.Title ); |
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
715 guiSetFilename( guiIntfStruct.Filename,tmp ); |
22092ed814ad
fix dvd, vcd playing, compiling, and add one small playlist patch
pontscho
parents:
9625
diff
changeset
|
716 } |
8423 | 717 dvd_chapter=guiIntfStruct.Chapter; |
718 dvd_angle=guiIntfStruct.Angle; | |
719 break; | |
720 #endif | |
6794 | 721 } |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
722 //if ( guiIntfStruct.StreamType != STREAMTYPE_PLAYLIST ) // Does not make problems anymore! |
8423 | 723 { |
724 if ( guiIntfStruct.Filename ) filename=gstrdup( guiIntfStruct.Filename ); | |
725 else if ( filename ) guiSetFilename( guiIntfStruct.Filename,filename ); | |
726 } | |
7009 | 727 // --- video opts |
7019 | 728 |
7582 | 729 if ( !video_driver_list ) |
6794 | 730 { |
6797
06d29dbdf20d
upsz, sorry, i forgott this :) (skin name saving:)
pontscho
parents:
6794
diff
changeset
|
731 int i = 0; |
6903 | 732 while ( video_out_drivers[i++] ) |
733 if ( video_out_drivers[i - 1]->control( VOCTRL_GUISUPPORT,NULL ) == VO_TRUE ) | |
734 { | |
8150 | 735 gaddlist( &video_driver_list,(char *)video_out_drivers[i - 1]->info->short_name ); |
6903 | 736 break; |
737 } | |
6794 | 738 } |
739 | |
7582 | 740 if ( !video_driver_list && !video_driver_list[0] ) { gtkMessageBox( GTK_MB_FATAL,MSGTR_IDFGCVD ); exit_player( "gui init" ); } |
7009 | 741 |
742 { | |
743 int i = 0; | |
744 guiIntfStruct.NoWindow=False; | |
745 while ( video_out_drivers[i++] ) | |
746 if ( video_out_drivers[i - 1]->control( VOCTRL_GUISUPPORT,NULL ) == VO_TRUE ) | |
6794 | 747 { |
8150 | 748 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 ) ) |
7009 | 749 { guiIntfStruct.NoWindow=True; break; } |
6794 | 750 } |
7009 | 751 } |
752 | |
753 #ifdef HAVE_DXR3 | |
8043 | 754 #ifdef USE_LIBAVCODEC |
7009 | 755 remove_vop( "lavc" ); |
8043 | 756 #endif |
757 #ifdef USE_LIBFAME | |
7009 | 758 remove_vop( "fame" ); |
8043 | 759 #endif |
7582 | 760 if ( video_driver_list && !gstrcmp( video_driver_list[0],"dxr3" ) ) |
7009 | 761 { |
762 if ( ( guiIntfStruct.StreamType != STREAMTYPE_DVD)&&( guiIntfStruct.StreamType != STREAMTYPE_VCD ) ) | |
763 { | |
8043 | 764 #ifdef USE_LIBAVCODEC |
7009 | 765 if ( gtkVopLAVC ) add_vop( "lavc" ); |
8043 | 766 #endif |
767 #ifdef USE_LIBFAME | |
7009 | 768 if ( gtkVopFAME ) add_vop( "fame" ); |
8043 | 769 #endif |
7009 | 770 } |
771 } | |
772 #endif | |
773 // --- | |
7019 | 774 if ( gtkVopPP ) add_vop( "pp" ); |
775 else remove_vop( "pp" ); | |
6794 | 776 |
777 // --- audio opts | |
7887
0e5544951425
A small patch to Gui/interface.c; the first fix is a plain bug, the second is
arpi
parents:
7707
diff
changeset
|
778 // if ( ao_plugin_cfg.plugin_list ) { free( ao_plugin_cfg.plugin_list ); ao_plugin_cfg.plugin_list=NULL; } |
6840 | 779 if ( gtkAONorm ) gset( &ao_plugin_cfg.plugin_list,"volnorm" ); |
6794 | 780 if ( gtkEnableAudioEqualizer ) gset( &ao_plugin_cfg.plugin_list,"eq" ); |
781 if ( gtkAOExtraStereo ) | |
782 { | |
783 gset( &ao_plugin_cfg.plugin_list,"extrastereo" ); | |
784 ao_plugin_cfg.pl_extrastereo_mul=gtkAOExtraStereoMul; | |
785 } | |
8600
54eac4cf587c
Lots of functions and variables specific to OSS audio are used without
arpi
parents:
8484
diff
changeset
|
786 #ifdef USE_OSS_AUDIO |
8484 | 787 mixer_device=gstrdup( gtkAOOSSMixer ); |
7582 | 788 if ( audio_driver_list && !gstrncmp( audio_driver_list[0],"oss",3 ) && gtkAOOSSDevice ) |
6794 | 789 { |
8423 | 790 char * tmp = calloc( 1,strlen( gtkAOOSSDevice ) + 7 ); |
7019 | 791 sprintf( tmp,"oss:%s",gtkAOOSSDevice ); |
7582 | 792 gaddlist( &audio_driver_list,tmp ); |
7019 | 793 } |
8615 | 794 #endif |
8714
a88f827ec563
SDL Audio configure window from Filip Kalinski <filon@pld.org.pl>
pontscho
parents:
8635
diff
changeset
|
795 #ifdef HAVE_SDL |
a88f827ec563
SDL Audio configure window from Filip Kalinski <filon@pld.org.pl>
pontscho
parents:
8635
diff
changeset
|
796 if ( audio_driver_list && !gstrncmp( audio_driver_list[0],"sdl",3 ) && gtkAOSDLDriver ) |
a88f827ec563
SDL Audio configure window from Filip Kalinski <filon@pld.org.pl>
pontscho
parents:
8635
diff
changeset
|
797 { |
a88f827ec563
SDL Audio configure window from Filip Kalinski <filon@pld.org.pl>
pontscho
parents:
8635
diff
changeset
|
798 char * tmp = calloc( 1,strlen( gtkAOSDLDriver ) + 10 ); |
a88f827ec563
SDL Audio configure window from Filip Kalinski <filon@pld.org.pl>
pontscho
parents:
8635
diff
changeset
|
799 sprintf( tmp,"sdl:%s",gtkAOSDLDriver ); |
a88f827ec563
SDL Audio configure window from Filip Kalinski <filon@pld.org.pl>
pontscho
parents:
8635
diff
changeset
|
800 gaddlist( &audio_driver_list,tmp ); |
a88f827ec563
SDL Audio configure window from Filip Kalinski <filon@pld.org.pl>
pontscho
parents:
8635
diff
changeset
|
801 } |
a88f827ec563
SDL Audio configure window from Filip Kalinski <filon@pld.org.pl>
pontscho
parents:
8635
diff
changeset
|
802 #endif |
6794 | 803 // -- subtitle |
804 #ifdef USE_SUB | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9812
diff
changeset
|
805 //subdata->filename=gstrdup( guiIntfStruct.Subtitlename ); |
6794 | 806 stream_dump_type=0; |
807 if ( gtkSubDumpMPSub ) stream_dump_type=4; | |
808 if ( gtkSubDumpSrt ) stream_dump_type=6; | |
809 gtkSubDumpMPSub=gtkSubDumpSrt=0; | |
6627 | 810 #endif |
6794 | 811 #if defined( USE_OSD ) || defined( USE_SUB ) |
812 guiLoadFont(); | |
6627 | 813 #endif |
814 | |
6794 | 815 // --- misc |
8423 | 816 if ( gtkCacheOn ) stream_cache_size=gtkCacheSize; |
8484 | 817 if ( gtkAutoSyncOn ) autosync=gtkAutoSync; |
8423 | 818 |
8484 | 819 if ( guiIntfStruct.AudioFile ) audio_stream=gstrdup( guiIntfStruct.AudioFile ); |
820 else if ( guiIntfStruct.FilenameChanged ) gfree( (void**)&audio_stream ); | |
821 //audio_stream=NULL; | |
6627 | 822 |
8423 | 823 guiIntfStruct.DiskChanged=0; |
824 guiIntfStruct.FilenameChanged=0; | |
825 guiIntfStruct.NewPlay=0; | |
826 | |
6627 | 827 break; |
4798 | 828 } |
7009 | 829 return False; |
4798 | 830 } |
831 | |
832 void guiEventHandling( void ) | |
833 { | |
7009 | 834 if ( !guiIntfStruct.Playing || guiIntfStruct.NoWindow ) wsHandleEvents(); |
4818
3473ca9ef158
new gui interface, and gtk moved into mplayer process. fork ... bleh :)
pontscho
parents:
4798
diff
changeset
|
835 gtkEventHandling(); |
4798 | 836 } |
6627 | 837 |
838 // --- | |
839 | |
840 float gtkEquChannels[6][10]; | |
841 | |
6713 | 842 plItem * plCurrent = NULL; |
843 plItem * plList = NULL; | |
844 plItem * plLastPlayed = NULL; | |
845 | |
7092
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
846 URLItem *URLList = NULL; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
847 |
9055 | 848 char *fsHistory[fsPersistant_MaxPos] = { NULL,NULL,NULL,NULL,NULL }; |
849 | |
6713 | 850 #if defined( MP_DEBUG ) && 0 |
851 void list( void ) | |
6627 | 852 { |
6713 | 853 plItem * next = plList; |
854 printf( "--- list ---\n" ); | |
855 while( next || next->next ) | |
856 { | |
857 printf( "item: %s/%s\n",next->path,next->name ); | |
858 if ( next->next ) next=next->next; else break; | |
859 } | |
860 printf( "--- end of list ---\n" ); | |
861 } | |
862 #else | |
863 #define list(); | |
864 #endif | |
865 | |
866 void * gtkSet( int cmd,float fparam, void * vparam ) | |
867 { | |
6627 | 868 equalizer_t * eq = (equalizer_t *)vparam; |
6713 | 869 plItem * item = (plItem *)vparam; |
6627 | 870 |
7092
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
871 URLItem * url_item = (URLItem *)vparam; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
872 int is_added = True; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
873 |
6627 | 874 switch ( cmd ) |
875 { | |
6713 | 876 // --- handle playlist |
6755 | 877 case gtkAddPlItem: // add item to playlist |
6713 | 878 if ( plList ) |
879 { | |
880 plItem * next = plList; | |
881 while ( next->next ) { /*printf( "%s\n",next->name );*/ next=next->next; } | |
882 next->next=item; item->prev=next; | |
7092
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
883 } else { item->prev=item->next=NULL; plCurrent=plList=item; } |
6713 | 884 list(); |
885 return NULL; | |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
886 case gtkInsertPlItem: // add item into playlist after current |
6713 | 887 if ( plCurrent ) |
888 { | |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
889 plItem * curr = plCurrent; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
890 item->next=curr->next; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
891 if (item->next) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
892 item->next->prev=item; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
893 item->prev=curr; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
894 curr->next=item; |
6713 | 895 plCurrent=plCurrent->next; |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
896 return plCurrent; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
897 } |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
898 else |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
899 return gtkSet(gtkAddPlItem,0,(void*)item); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
900 return NULL; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
901 case gtkGetNextPlItem: // get current item from playlist |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
902 if ( plCurrent && plCurrent->next) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
903 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
904 plCurrent=plCurrent->next; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
905 /*if ( !plCurrent && plList ) |
6713 | 906 { |
907 plItem * next = plList; | |
908 while ( next->next ) { if ( !next->next ) break; next=next->next; } | |
909 plCurrent=next; | |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
910 }*/ |
6713 | 911 return plCurrent; |
912 } | |
913 return NULL; | |
914 case gtkGetPrevPlItem: | |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
915 if ( plCurrent && plCurrent->prev) |
6713 | 916 { |
917 plCurrent=plCurrent->prev; | |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
918 //if ( !plCurrent && plList ) plCurrent=plList; |
6713 | 919 return plCurrent; |
920 } | |
6794 | 921 return NULL; |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
922 case gtkSetCurrPlItem: // set current item |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
923 plCurrent=item; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
924 return plCurrent; |
6713 | 925 case gtkGetCurrPlItem: // get current item |
926 return plCurrent; | |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
927 case gtkDelCurrPlItem: // delete current item |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
928 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
929 plItem * curr = plCurrent; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
930 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
931 if (!curr) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
932 return NULL; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
933 if (curr->prev) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
934 curr->prev->next=curr->next; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
935 if (curr->next) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
936 curr->next->prev=curr->prev; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
937 if (curr==plList) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
938 plList=curr->next; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
939 plCurrent=curr->next; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
940 // Free it |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
941 if ( curr->path ) free( curr->path ); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
942 if ( curr->name ) free( curr->name ); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
943 free( curr ); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
944 } |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
945 mplCurr(); // Instead of using mplNext && mplPrev |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
946 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
947 return plCurrent; |
6713 | 948 case gtkDelPl: // delete list |
949 { | |
950 plItem * curr = plList; | |
951 plItem * next; | |
952 if ( !plList ) return NULL; | |
953 if ( !curr->next ) | |
954 { | |
955 if ( curr->path ) free( curr->path ); | |
956 if ( curr->name ) free( curr->name ); | |
957 free( curr ); | |
958 } | |
959 else | |
960 { | |
961 while ( curr->next ) | |
962 { | |
963 next=curr->next; | |
964 if ( curr->path ) free( curr->path ); | |
965 if ( curr->name ) free( curr->name ); | |
966 free( curr ); | |
967 curr=next; | |
968 } | |
969 } | |
970 plList=NULL; plCurrent=NULL; | |
971 } | |
972 return NULL; | |
7092
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
973 // ----- Handle url |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
974 case gtkAddURLItem: |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
975 if ( URLList ) |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
976 { |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
977 URLItem * next_url = URLList; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
978 is_added = False; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
979 while ( next_url->next ) |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
980 { |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
981 if ( !gstrcmp( next_url->url,url_item->url ) ) |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
982 { |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
983 is_added=True; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
984 break; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
985 } |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
986 next_url=next_url->next; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
987 } |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
988 if ( ( !is_added )&&( gstrcmp( next_url->url,url_item->url ) ) ) next_url->next=url_item; |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
989 } else { url_item->next=NULL; URLList=url_item; } |
8e9607c5897e
- warning fixes from Dominik Mierzejewski <dominik@rangers.eu.org>
pontscho
parents:
7019
diff
changeset
|
990 return NULL; |
6794 | 991 // --- subtitle |
7139 | 992 #ifndef HAVE_FREETYPE |
6794 | 993 case gtkSetFontFactor: |
7019 | 994 font_factor=fparam; |
6794 | 995 guiLoadFont(); |
996 return NULL; | |
7139 | 997 #else |
998 case gtkSetFontOutLine: | |
999 subtitle_font_thickness=( 8.0f / 100.0f ) * fparam; | |
1000 guiLoadFont(); | |
1001 return NULL; | |
1002 case gtkSetFontBlur: | |
1003 subtitle_font_radius=( 8.0f / 100.0f ) * fparam; | |
1004 guiLoadFont(); | |
1005 return NULL; | |
1006 case gtkSetFontTextScale: | |
1007 text_font_scale_factor=fparam; | |
1008 guiLoadFont(); | |
1009 return NULL; | |
1010 case gtkSetFontOSDScale: | |
1011 osd_font_scale_factor=fparam; | |
1012 guiLoadFont(); | |
1013 return NULL; | |
1014 case gtkSetFontEncoding: | |
9056 | 1015 gfree( (void **)&subtitle_font_encoding ); |
7139 | 1016 subtitle_font_encoding=gstrdup( (char *)vparam ); |
1017 guiLoadFont(); | |
1018 return NULL; | |
1019 case gtkSetFontAutoScale: | |
1020 subtitle_autoscale=(int)fparam; | |
1021 guiLoadFont(); | |
1022 return NULL; | |
1023 #endif | |
9056 | 1024 #ifdef USE_ICONV |
1025 case gtkSetSubEncoding: | |
1026 gfree( (void **)&sub_cp ); | |
1027 sub_cp=gstrdup( (char *)vparam ); | |
1028 break; | |
6794 | 1029 #endif |
1030 // --- misc | |
1031 case gtkClearStruct: | |
7009 | 1032 if ( (unsigned int)vparam & guiFilenames ) |
6794 | 1033 { |
1034 gfree( (void **)&guiIntfStruct.Filename ); | |
1035 gfree( (void **)&guiIntfStruct.Subtitlename ); | |
1036 gfree( (void **)&guiIntfStruct.AudioFile ); | |
7009 | 1037 gtkSet( gtkDelPl,0,NULL ); |
6794 | 1038 } |
1039 #ifdef USE_DVDREAD | |
7009 | 1040 if ( (unsigned int)vparam & guiDVD ) memset( &guiIntfStruct.DVD,0,sizeof( guiDVDStruct ) ); |
6794 | 1041 #endif |
1042 #ifdef HAVE_VCD | |
7009 | 1043 if ( (unsigned int)vparam & guiVCD ) guiIntfStruct.VCDTracks=0; |
6794 | 1044 #endif |
1045 return NULL; | |
1046 case gtkSetExtraStereo: | |
1047 gtkAOExtraStereoMul=fparam; | |
1048 audio_plugin_extrastereo.control( AOCONTROL_PLUGIN_ES_SET,(int)>kAOExtraStereoMul ); | |
1049 return NULL; | |
1050 case gtkSetPanscan: | |
7217 | 1051 { |
1052 mp_cmd_t * mp_cmd; | |
1053 mp_cmd=(mp_cmd_t *)calloc( 1,sizeof( *mp_cmd ) ); | |
1054 mp_cmd->id=MP_CMD_PANSCAN; mp_cmd->name=strdup( "panscan" ); | |
1055 mp_cmd->args[0].v.f=fparam; mp_cmd->args[1].v.i=1; | |
1056 mp_input_queue_cmd( mp_cmd ); | |
1057 } | |
6794 | 1058 return NULL; |
1059 case gtkSetAutoq: | |
7019 | 1060 auto_quality=(int)fparam; |
6794 | 1061 return NULL; |
6713 | 1062 // --- set equalizers |
6627 | 1063 case gtkSetContrast: |
7217 | 1064 if ( guiIntfStruct.sh_video ) set_video_colors( guiIntfStruct.sh_video,"contrast",(int)fparam ); |
1065 return NULL; | |
6627 | 1066 case gtkSetBrightness: |
7217 | 1067 if ( guiIntfStruct.sh_video ) set_video_colors( guiIntfStruct.sh_video,"brightness",(int)fparam ); |
1068 return NULL; | |
6627 | 1069 case gtkSetHue: |
7217 | 1070 if ( guiIntfStruct.sh_video ) set_video_colors( guiIntfStruct.sh_video,"hue",(int)fparam ); |
1071 return NULL; | |
6627 | 1072 case gtkSetSaturation: |
7217 | 1073 if ( guiIntfStruct.sh_video ) set_video_colors( guiIntfStruct.sh_video,"saturation",(int)fparam ); |
1074 return NULL; | |
6627 | 1075 case gtkSetEqualizer: |
1076 if ( eq ) | |
1077 { | |
1078 gtkEquChannels[eq->channel][eq->band]=eq->gain; | |
1079 audio_plugin_eq.control( AOCONTROL_PLUGIN_EQ_SET_GAIN,(int)eq ); | |
1080 } | |
1081 else | |
1082 { | |
1083 int i,j; equalizer_t tmp; tmp.gain=0.0f; | |
1084 memset( gtkEquChannels,0,sizeof( gtkEquChannels ) ); | |
1085 for ( i=0;i<6;i++ ) | |
1086 for ( j=0;j<10;j++ ) | |
1087 { tmp.channel=i; tmp.band=j; audio_plugin_eq.control( AOCONTROL_PLUGIN_EQ_SET_GAIN,(int)&tmp ); } | |
1088 } | |
6713 | 1089 return NULL; |
6627 | 1090 } |
6713 | 1091 return NULL; |
6627 | 1092 } |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1093 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1094 #define mp_basename(s) (strrchr(s,'/')==NULL?(char*)s:(strrchr(s,'/')+1)) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1095 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1096 #include "../playtree.h" |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1097 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1098 //This function adds/inserts one file into the gui playlist |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1099 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1100 int import_file_into_gui(char* temp, int insert) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1101 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1102 char *filename, *pathname; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1103 plItem * item; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1104 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1105 filename = strdup(mp_basename(temp)); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1106 pathname = strdup(temp); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1107 if (strlen(pathname)-strlen(filename)>0) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1108 pathname[strlen(pathname)-strlen(filename)-1]='\0'; // We have some path so remove / at end |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1109 else |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1110 pathname[strlen(pathname)-strlen(filename)]='\0'; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1111 mp_msg(MSGT_PLAYTREE,MSGL_V, "Adding filename %s && pathname %s\n",filename,pathname); //FIXME: Change to MSGL_DBG2 ? |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1112 item=calloc( 1,sizeof( plItem ) ); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1113 if (!item) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1114 return 0; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1115 item->name=filename; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1116 item->path=pathname; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1117 if (insert) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1118 gtkSet( gtkInsertPlItem,0,(void*)item ); // Inserts the item after current, and makes current=item |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1119 else |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1120 gtkSet( gtkAddPlItem,0,(void*)item ); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1121 return 1; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1122 } |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1123 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1124 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1125 // This function imports the initial playtree (based on cmd-line files) into the gui playlist |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1126 // by either: |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1127 // - overwriting gui pl (enqueue=0) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1128 // - appending it to gui pl (enqueue=1) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1129 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1130 int import_initial_playtree_into_gui(play_tree_t* my_playtree, m_config_t* config, int enqueue) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1131 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1132 play_tree_iter_t* my_pt_iter=NULL; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1133 int result=0; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1134 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1135 if (!enqueue) // Delete playlist before "appending" |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1136 gtkSet(gtkDelPl,0,0); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1137 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1138 if((my_pt_iter=pt_iter_create(&my_playtree,config))) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1139 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1140 while ((filename=pt_iter_get_next_file(my_pt_iter))!=NULL) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1141 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1142 if (import_file_into_gui(filename, 0)) // Add it to end of list |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1143 result=1; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1144 } |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1145 } |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1146 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1147 mplCurr(); // Update filename |
10193 | 1148 mplGotoTheNext=1; |
9291
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1149 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1150 if (!enqueue) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1151 filename=guiIntfStruct.Filename; // Backward compatibility; if file is specified on commandline, |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1152 // gmplayer does directly start in Play-Mode. |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1153 else |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1154 filename=NULL; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1155 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1156 return result; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1157 } |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1158 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1159 // This function imports and inserts an playtree, that is created "on the fly", for example by |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1160 // parsing some MOV-Reference-File; or by loading an playlist with "File Open" |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1161 // |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1162 // The file which contained the playlist is thereby replaced with it's contents. |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1163 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1164 int import_playtree_playlist_into_gui(play_tree_t* my_playtree, m_config_t* config) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1165 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1166 play_tree_iter_t* my_pt_iter=NULL; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1167 int result=0; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1168 plItem * save=(plItem*)gtkSet( gtkGetCurrPlItem, 0, 0); // Save current item |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1169 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1170 if((my_pt_iter=pt_iter_create(&my_playtree,config))) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1171 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1172 while ((filename=pt_iter_get_next_file(my_pt_iter))!=NULL) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1173 { |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1174 if (import_file_into_gui(filename, 1)) // insert it into the list and set plCurrent=new item |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1175 result=1; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1176 } |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1177 pt_iter_destroy(&my_pt_iter); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1178 } |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1179 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1180 if (save) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1181 gtkSet(gtkSetCurrPlItem, 0, (void*)save); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1182 else |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1183 gtkSet(gtkSetCurrPlItem, 0, (void*)plList); // go to head, if plList was empty before |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1184 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1185 if (save && result) |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1186 gtkSet(gtkDelCurrPlItem, 0, 0); |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1187 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1188 mplCurr(); // Update filename |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1189 filename=NULL; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1190 |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1191 return result; |
64b8c5a07c2c
- It adds an option enqueue/noenqueue, so users can choose if they want to
arpi
parents:
9202
diff
changeset
|
1192 } |