Mercurial > mplayer.hg
comparison Gui/mplayer/mw.c @ 8048:c3d790e4c600
rename
author | pontscho |
---|---|
date | Sat, 02 Nov 2002 17:25:06 +0000 |
parents | Gui/mplayer/mw.h@e5dda05f9aab |
children | 79ddb7291765 |
comparison
equal
deleted
inserted
replaced
8047:e7d1cde8ad0e | 8048:c3d790e4c600 |
---|---|
1 | |
2 // main window | |
3 | |
4 #include "../../libmpdemux/stream.h" | |
5 #include "../../mixer.h" | |
6 #include "../../libvo/sub.h" | |
7 #include "../../mplayer.h" | |
8 | |
9 extern unsigned int GetTimerMS( void ); | |
10 | |
11 unsigned char * mplDrawBuffer = NULL; | |
12 int mplMainRender = 1; | |
13 | |
14 int mplMainAutoPlay = 0; | |
15 int mplMiddleMenu = 0; | |
16 | |
17 int mainVisible = 1; | |
18 | |
19 int boxMoved = 0; | |
20 int sx = 0,sy = 0; | |
21 int i,pot = 0; | |
22 | |
23 inline void TranslateFilename( int c,char * tmp ) | |
24 { | |
25 int i; | |
26 switch ( guiIntfStruct.StreamType ) | |
27 { | |
28 case STREAMTYPE_STREAM: | |
29 strcpy( tmp,guiIntfStruct.Filename ); | |
30 break; | |
31 case STREAMTYPE_FILE: | |
32 if ( ( guiIntfStruct.Filename )&&( guiIntfStruct.Filename[0] ) ) | |
33 { | |
34 if ( strrchr( guiIntfStruct.Filename,'/' ) ) strcpy( tmp,strrchr( guiIntfStruct.Filename,'/' ) + 1 ); | |
35 else strcpy( tmp,guiIntfStruct.Filename ); | |
36 if ( tmp[strlen( tmp ) - 4] == '.' ) tmp[strlen( tmp ) - 4]=0; | |
37 if ( tmp[strlen( tmp ) - 5] == '.' ) tmp[strlen( tmp ) - 5]=0; | |
38 } else strcpy( tmp,MSGTR_NoFileLoaded ); | |
39 break; | |
40 #ifdef USE_DVDREAD | |
41 case STREAMTYPE_DVD: | |
42 if ( guiIntfStruct.DVD.current_chapter ) sprintf( tmp,MSGTR_Chapter,guiIntfStruct.DVD.current_chapter ); | |
43 else strcat( tmp,MSGTR_NoChapter ); | |
44 break; | |
45 #endif | |
46 #ifdef HAVE_VCD | |
47 case STREAMTYPE_VCD: | |
48 sprintf( tmp,MSGTR_VCDTrack,guiIntfStruct.Track ); | |
49 break; | |
50 #endif | |
51 default: strcpy( tmp,MSGTR_NoMediaOpened ); | |
52 } | |
53 if ( c ) | |
54 { | |
55 for ( i=0;i < (int)strlen( tmp );i++ ) | |
56 { | |
57 int t=0; | |
58 if ( c == 1 ) { if ( ( tmp[i] >= 'A' )&&( tmp[i] <= 'Z' ) ) t=32; } | |
59 if ( c == 2 ) { if ( ( tmp[i] >= 'a' )&&( tmp[i] <= 'z' ) ) t=-32; } | |
60 tmp[i]=(char)( tmp[i] + t ); | |
61 } | |
62 } | |
63 } | |
64 | |
65 char * Translate( char * str ) | |
66 { | |
67 static char trbuf[512]; | |
68 char tmp[512]; | |
69 int i,c; | |
70 int t; | |
71 memset( trbuf,0,512 ); | |
72 memset( tmp,0,128 ); | |
73 for ( c=0,i=0;i < (int)strlen( str );i++ ) | |
74 { | |
75 if ( str[i] != '$' ) { trbuf[c++]=str[i]; trbuf[c]=0; } | |
76 else | |
77 { | |
78 switch ( str[++i] ) | |
79 { | |
80 case 't': sprintf( tmp,"%02d",guiIntfStruct.Track ); strcat( trbuf,tmp ); break; | |
81 case 'o': TranslateFilename( 0,tmp ); strcat( trbuf,tmp ); break; | |
82 case 'f': TranslateFilename( 1,tmp ); strcat( trbuf,tmp ); break; | |
83 case 'F': TranslateFilename( 2,tmp ); strcat( trbuf,tmp ); break; | |
84 case '6': t=guiIntfStruct.LengthInSec; goto calclengthhhmmss; | |
85 case '1': t=guiIntfStruct.TimeSec; | |
86 calclengthhhmmss: | |
87 sprintf( tmp,"%02d:%02d:%02d",t/3600,t/60%60,t%60 ); strcat( trbuf,tmp ); | |
88 break; | |
89 case '7': t=guiIntfStruct.LengthInSec; goto calclengthmmmmss; | |
90 case '2': t=guiIntfStruct.TimeSec; | |
91 calclengthmmmmss: | |
92 sprintf( tmp,"%04d:%02d",t/60,t%60 ); strcat( trbuf,tmp ); | |
93 break; | |
94 case '3': sprintf( tmp,"%02d",guiIntfStruct.TimeSec / 3600 ); strcat( trbuf,tmp ); break; | |
95 case '4': sprintf( tmp,"%02d",( ( guiIntfStruct.TimeSec / 60 ) % 60 ) ); strcat( trbuf,tmp ); break; | |
96 case '5': sprintf( tmp,"%02d",guiIntfStruct.TimeSec % 60 ); strcat( trbuf,tmp ); break; | |
97 case '8': sprintf( tmp,"%01d:%02d:%02d",guiIntfStruct.TimeSec / 3600,( guiIntfStruct.TimeSec / 60 ) % 60,guiIntfStruct.TimeSec % 60 ); strcat( trbuf,tmp ); break; | |
98 case 'v': sprintf( tmp,"%3.2f%%",guiIntfStruct.Volume ); strcat( trbuf,tmp ); break; | |
99 case 'V': sprintf( tmp,"%3.1f",guiIntfStruct.Volume ); strcat( trbuf,tmp ); break; | |
100 case 'b': sprintf( tmp,"%3.2f%%",guiIntfStruct.Balance ); strcat( trbuf,tmp ); break; | |
101 case 'B': sprintf( tmp,"%3.1f",guiIntfStruct.Balance ); strcat( trbuf,tmp ); break; | |
102 case 'd': sprintf( tmp,"%d",guiIntfStruct.FrameDrop ); strcat( trbuf,tmp ); break; | |
103 case 's': if ( guiIntfStruct.Playing == 0 ) strcat( trbuf,"s" ); break; | |
104 case 'l': if ( guiIntfStruct.Playing == 1 ) strcat( trbuf,"p" ); break; | |
105 case 'e': if ( guiIntfStruct.Playing == 2 ) strcat( trbuf,"e" ); break; | |
106 case 'a': | |
107 if ( muted ) { strcat( trbuf,"n" ); break; } | |
108 switch ( guiIntfStruct.AudioType ) | |
109 { | |
110 case 0: strcat( trbuf,"n" ); break; | |
111 case 1: strcat( trbuf,"m" ); break; | |
112 case 2: strcat( trbuf,"t" ); break; | |
113 } | |
114 break; | |
115 case 'T': | |
116 switch ( guiIntfStruct.StreamType ) | |
117 { | |
118 case STREAMTYPE_FILE: strcat( trbuf,"f" ); break; | |
119 #ifdef HAVE_VCD | |
120 case STREAMTYPE_VCD: strcat( trbuf,"v" ); break; | |
121 #endif | |
122 case STREAMTYPE_STREAM: strcat( trbuf,"u" ); break; | |
123 #ifdef USE_DVDREAD | |
124 case STREAMTYPE_DVD: strcat( trbuf,"d" ); break; | |
125 #endif | |
126 default: strcat( trbuf," " ); break; | |
127 } | |
128 break; | |
129 case '$': strcat( trbuf,"$" ); break; | |
130 default: continue; | |
131 } | |
132 c=strlen( trbuf ); | |
133 } | |
134 } | |
135 return trbuf; | |
136 } | |
137 | |
138 inline void PutImage( txSample * bf,int x,int y,int max,int ofs ) | |
139 { | |
140 int i=0,ix,iy; | |
141 uint32_t * buf = NULL; | |
142 uint32_t * drw = NULL; | |
143 uint32_t tmp; | |
144 | |
145 if ( ( !bf )||( bf->Image == NULL ) ) return; | |
146 | |
147 i=( bf->Width * ( bf->Height / max ) ) * ofs; | |
148 buf=(uint32_t *)mplDrawBuffer; | |
149 drw=(uint32_t *)bf->Image; | |
150 | |
151 for ( iy=y;iy < (int)(y+bf->Height / max);iy++ ) | |
152 for ( ix=x;ix < (int)(x+bf->Width);ix++ ) | |
153 { | |
154 tmp=drw[i++]; | |
155 if ( tmp != 0x00ff00ff ) | |
156 buf[ iy*appMPlayer.main.Bitmap.Width+ix ]=tmp; | |
157 } | |
158 } | |
159 | |
160 void mplMainDraw( wsParamDisplay ) | |
161 { | |
162 wItem * item; | |
163 txSample * image = NULL; | |
164 int i; | |
165 | |
166 if ( appMPlayer.mainWindow.State == wsWindowClosed ) exit_player( MSGTR_Exit_quit ); | |
167 | |
168 if ( appMPlayer.mainWindow.Visible == wsWindowNotVisible || | |
169 !mainVisible ) return; | |
170 // !appMPlayer.mainWindow.Mapped ) return; | |
171 | |
172 btnModify( evSetMoviePosition,guiIntfStruct.Position ); | |
173 btnModify( evSetVolume,guiIntfStruct.Volume ); | |
174 | |
175 if ( mplMainRender && appMPlayer.mainWindow.State == wsWindowExpose ) | |
176 { | |
177 memcpy( mplDrawBuffer,appMPlayer.main.Bitmap.Image,appMPlayer.main.Bitmap.ImageSize ); | |
178 for( i=0;i < appMPlayer.NumberOfItems + 1;i++ ) | |
179 { | |
180 item=&appMPlayer.Items[i]; | |
181 switch( item->type ) | |
182 { | |
183 case itButton: | |
184 PutImage( &item->Bitmap,item->x,item->y,3,item->pressed ); | |
185 break; | |
186 case itPotmeter: | |
187 PutImage( &item->Bitmap,item->x,item->y,item->phases,( item->phases - 1 ) * ( item->value / 100.0f ) ); | |
188 break; | |
189 case itHPotmeter: | |
190 PutImage( &item->Bitmap,item->x,item->y,item->phases,item->phases * ( item->value / 100.0f ) ); | |
191 PutImage( &item->Mask,item->x + (int)( ( item->width - item->psx ) * item->value / 100.0f ),item->y,3,item->pressed ); | |
192 break; | |
193 case itSLabel: | |
194 image=fntRender( item->fontid,0,item->width,"%s",item->label ); | |
195 goto drawrenderedtext; | |
196 case itDLabel: | |
197 { | |
198 char * t = Translate( item->label ); | |
199 int l = fntTextWidth( item->fontid,t ); | |
200 image=fntRender( item->fontid,(GetTimerMS() / 20)%(l?l:item->width),item->width,"%s",t ); | |
201 } | |
202 drawrenderedtext: | |
203 if ( image ) | |
204 { | |
205 PutImage( image,item->x,item->y,1,0 ); | |
206 if ( image->Image ) free( image->Image ); | |
207 free( image ); | |
208 } | |
209 break; | |
210 } | |
211 } | |
212 wsConvert( &appMPlayer.mainWindow,mplDrawBuffer,appMPlayer.main.Bitmap.ImageSize ); | |
213 mplMainRender=0; | |
214 } | |
215 wsPutImage( &appMPlayer.mainWindow ); | |
216 // XFlush( wsDisplay ); | |
217 } | |
218 | |
219 extern void exit_player(char* how); | |
220 extern int audio_id; | |
221 extern int dvdsub_id; | |
222 extern char * dvd_device; | |
223 extern int vcd_track; | |
224 extern char * cdrom_device; | |
225 extern int osd_visible; | |
226 | |
227 void mplEventHandling( int msg,float param ) | |
228 { | |
229 int j; | |
230 | |
231 switch( msg ) | |
232 { | |
233 // --- user events | |
234 case evExit: | |
235 exit_player( "Exit" ); | |
236 break; | |
237 | |
238 case evPlayNetwork: | |
239 if ( guiIntfStruct.Subtitlename ) { free( guiIntfStruct.Subtitlename ); guiIntfStruct.Subtitlename=NULL; } | |
240 if ( guiIntfStruct.AudioFile ) { free( guiIntfStruct.AudioFile ); guiIntfStruct.AudioFile=NULL; } | |
241 guiIntfStruct.StreamType=STREAMTYPE_STREAM; | |
242 goto play; | |
243 case evSetURL: | |
244 gtkShow( evPlayNetwork,NULL ); | |
245 break; | |
246 | |
247 #ifdef HAVE_VCD | |
248 case evSetVCDTrack: | |
249 guiIntfStruct.Track=(int)param; | |
250 case evPlayVCD: | |
251 gtkSet( gtkClearStruct,0,(void *)guiALL ); | |
252 guiIntfStruct.StreamType=STREAMTYPE_VCD; | |
253 goto play; | |
254 #endif | |
255 #ifdef USE_DVDREAD | |
256 case evPlayDVD: | |
257 guiIntfStruct.DVD.current_title=1; | |
258 guiIntfStruct.DVD.current_chapter=1; | |
259 guiIntfStruct.DVD.current_angle=1; | |
260 play_dvd_2: | |
261 gtkSet( gtkClearStruct,0,(void *)(guiALL - guiDVD) ); | |
262 guiIntfStruct.StreamType=STREAMTYPE_DVD; | |
263 #endif | |
264 case evPlay: | |
265 case evPlaySwitchToPause: | |
266 play: | |
267 | |
268 if ( ( msg == evPlaySwitchToPause )&&( guiIntfStruct.Playing == 2 ) ) goto NoPause; | |
269 | |
270 vcd_track=0; | |
271 dvd_title=0; | |
272 | |
273 if ( gtkSet( gtkGetCurrPlItem,0,NULL ) &&( guiIntfStruct.StreamType == STREAMTYPE_FILE ) ) | |
274 { | |
275 plItem * next = gtkSet( gtkGetCurrPlItem,0,NULL ); | |
276 plLastPlayed=next; | |
277 guiSetDF( guiIntfStruct.Filename,next->path,next->name ); | |
278 guiIntfStruct.StreamType=STREAMTYPE_FILE; | |
279 guiIntfStruct.FilenameChanged=1; | |
280 gfree( (void **)&guiIntfStruct.AudioFile ); | |
281 gfree( (void **)&guiIntfStruct.Subtitlename ); | |
282 } | |
283 | |
284 switch ( guiIntfStruct.StreamType ) | |
285 { | |
286 case STREAMTYPE_STREAM: | |
287 case STREAMTYPE_FILE: | |
288 gtkSet( gtkClearStruct,0,(void *)(guiALL - guiFilenames) ); | |
289 break; | |
290 #ifdef HAVE_VCD | |
291 case STREAMTYPE_VCD: | |
292 gtkSet( gtkClearStruct,0,(void *)(guiALL - guiVCD - guiFilenames) ); | |
293 if ( !cdrom_device ) cdrom_device=DEFAULT_CDROM_DEVICE; | |
294 mplSetFileName( NULL,cdrom_device,STREAMTYPE_VCD ); | |
295 if ( guiIntfStruct.Playing != 2 ) | |
296 { | |
297 if ( !guiIntfStruct.Track ) | |
298 { | |
299 if ( guiIntfStruct.VCDTracks == 1 ) guiIntfStruct.Track=1; | |
300 else guiIntfStruct.Track=2; | |
301 } | |
302 vcd_track=guiIntfStruct.Track; | |
303 guiIntfStruct.DiskChanged=1; | |
304 } | |
305 break; | |
306 #endif | |
307 #ifdef USE_DVDREAD | |
308 case STREAMTYPE_DVD: | |
309 gtkSet( gtkClearStruct,0,(void *)(guiALL - guiDVD - guiFilenames) ); | |
310 if ( !dvd_device ) dvd_device=DEFAULT_DVD_DEVICE; | |
311 mplSetFileName( NULL,dvd_device,STREAMTYPE_DVD ); | |
312 if ( guiIntfStruct.Playing != 2 ) | |
313 { | |
314 dvd_title=guiIntfStruct.DVD.current_title; | |
315 dvd_angle=guiIntfStruct.DVD.current_angle; | |
316 dvd_chapter=guiIntfStruct.DVD.current_chapter; | |
317 guiIntfStruct.DiskChanged=1; | |
318 } | |
319 break; | |
320 #endif | |
321 } | |
322 mplPlay(); | |
323 break; | |
324 #ifdef USE_DVDREAD | |
325 case evSetDVDSubtitle: | |
326 dvdsub_id=(int)param; | |
327 goto play_dvd_2; | |
328 break; | |
329 case evSetDVDAudio: | |
330 audio_id=(int)param; | |
331 goto play_dvd_2; | |
332 break; | |
333 case evSetDVDChapter: | |
334 guiIntfStruct.DVD.current_chapter=(int)param; | |
335 goto play_dvd_2; | |
336 break; | |
337 case evSetDVDTitle: | |
338 guiIntfStruct.DVD.current_title=(int)param; | |
339 guiIntfStruct.DVD.current_chapter=1; | |
340 guiIntfStruct.DVD.current_angle=1; | |
341 goto play_dvd_2; | |
342 break; | |
343 #endif | |
344 | |
345 case evPause: | |
346 case evPauseSwitchToPlay: | |
347 NoPause: | |
348 mplPause(); | |
349 break; | |
350 | |
351 case evStop: guiIntfStruct.Playing=guiSetStop; break; | |
352 | |
353 case evLoadPlay: | |
354 mplMainAutoPlay=1; | |
355 // guiIntfStruct.StreamType=STREAMTYPE_FILE; | |
356 case evLoad: | |
357 gtkSet( gtkDelPl,0,NULL ); | |
358 gtkShow( evLoad,NULL ); | |
359 break; | |
360 case evLoadSubtitle: gtkShow( evLoadSubtitle,NULL ); break; | |
361 case evDropSubtitle: | |
362 gfree( (void **)&guiIntfStruct.Subtitlename ); | |
363 guiLoadSubtitle( NULL ); | |
364 break; | |
365 case evLoadAudioFile: gtkShow( evLoadAudioFile,NULL ); break; | |
366 case evPrev: mplPrev(); break; | |
367 case evNext: mplNext(); break; | |
368 | |
369 case evPlayList: gtkShow( evPlayList,NULL ); break; | |
370 case evSkinBrowser: gtkShow( evSkinBrowser,skinName ); break; | |
371 case evAbout: gtkShow( evAbout,NULL ); break; | |
372 case evPreferences: gtkShow( evPreferences,NULL ); break; | |
373 case evEqualizer: gtkShow( evEqualizer,NULL ); break; | |
374 | |
375 case evForward1min: mplRelSeek( 60 ); break; | |
376 case evBackward1min: mplRelSeek( -60 ); break; | |
377 case evForward10sec: mplRelSeek( 10 ); break; | |
378 case evBackward10sec: mplRelSeek( -10 ); break; | |
379 case evSetMoviePosition: mplAbsSeek( param ); break; | |
380 | |
381 case evIncVolume: vo_x11_putkey( wsGrayMul ); break; | |
382 case evDecVolume: vo_x11_putkey( wsGrayDiv ); break; | |
383 case evMute: mixer_mute(); break; | |
384 | |
385 case evSetVolume: | |
386 guiIntfStruct.Volume=param; | |
387 goto set_volume; | |
388 case evSetBalance: | |
389 guiIntfStruct.Balance=param; | |
390 set_volume: | |
391 { | |
392 float l = guiIntfStruct.Volume * ( ( 100.0 - guiIntfStruct.Balance ) / 50.0 ); | |
393 float r = guiIntfStruct.Volume * ( ( guiIntfStruct.Balance ) / 50.0 ); | |
394 if ( l > guiIntfStruct.Volume ) l=guiIntfStruct.Volume; | |
395 if ( r > guiIntfStruct.Volume ) r=guiIntfStruct.Volume; | |
396 // printf( "!!! v: %.2f b: %.2f -> %.2f x %.2f\n",guiIntfStruct.Volume,guiIntfStruct.Balance,l,r ); | |
397 mixer_setvolume( l,r ); | |
398 } | |
399 #ifdef USE_OSD | |
400 if ( osd_level ) | |
401 { | |
402 osd_visible=vo_mouse_timer_const; | |
403 vo_osd_progbar_type=OSD_VOLUME; | |
404 vo_osd_progbar_value=( ( guiIntfStruct.Volume ) * 256.0 ) / 100.0; | |
405 vo_osd_changed( OSDTYPE_PROGBAR ); | |
406 } | |
407 #endif | |
408 break; | |
409 | |
410 | |
411 case evIconify: | |
412 switch ( (int)param ) | |
413 { | |
414 case 0: wsIconify( appMPlayer.mainWindow ); break; | |
415 case 1: wsIconify( appMPlayer.subWindow ); break; | |
416 } | |
417 break; | |
418 case evDoubleSize: | |
419 if ( guiIntfStruct.Playing ) | |
420 { | |
421 appMPlayer.subWindow.isFullScreen=True; | |
422 appMPlayer.subWindow.OldX=( wsMaxX - guiIntfStruct.MovieWidth * 2 ) / 2; | |
423 appMPlayer.subWindow.OldY=( wsMaxY - guiIntfStruct.MovieHeight * 2 ) / 2; | |
424 appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth * 2; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight * 2; | |
425 wsFullScreen( &appMPlayer.subWindow ); | |
426 vo_fs=0; | |
427 } | |
428 break; | |
429 case evNormalSize: | |
430 if ( guiIntfStruct.Playing ) | |
431 { | |
432 appMPlayer.subWindow.isFullScreen=True; | |
433 appMPlayer.subWindow.OldX=( wsMaxX - guiIntfStruct.MovieWidth ) / 2; | |
434 appMPlayer.subWindow.OldY=( wsMaxY - guiIntfStruct.MovieHeight ) / 2; | |
435 appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight; | |
436 wsFullScreen( &appMPlayer.subWindow ); | |
437 vo_fs=0; | |
438 break; | |
439 } else if ( !appMPlayer.subWindow.isFullScreen ) break; | |
440 case evFullScreen: | |
441 for ( j=0;j<appMPlayer.NumberOfItems + 1;j++ ) | |
442 { | |
443 if ( appMPlayer.Items[j].msg == evFullScreen ) | |
444 { | |
445 appMPlayer.Items[j].tmp=!appMPlayer.Items[j].tmp; | |
446 appMPlayer.Items[j].pressed=appMPlayer.Items[j].tmp; | |
447 } | |
448 } | |
449 mplFullScreen(); | |
450 break; | |
451 | |
452 case evSetAspect: | |
453 switch ( (int)param ) | |
454 { | |
455 case 2: movie_aspect=16.0f / 9.0f; break; | |
456 case 3: movie_aspect=4.0f / 3.0f; break; | |
457 case 4: movie_aspect=2.35; break; | |
458 case 1: | |
459 default: movie_aspect=-1; | |
460 } | |
461 wsClearWindow( appMPlayer.subWindow ); | |
462 #ifdef USE_DVDREAD | |
463 if ( guiIntfStruct.StreamType == STREAMTYPE_DVD ) goto play_dvd_2; | |
464 else | |
465 #endif | |
466 guiIntfStruct.FilenameChanged=1; | |
467 break; | |
468 | |
469 // --- timer events | |
470 case evRedraw: | |
471 mplMainRender=1; | |
472 wsPostRedisplay( &appMPlayer.mainWindow ); | |
473 mplRedrawTimer=mplRedrawTimerConst; | |
474 break; | |
475 // --- system events | |
476 #ifdef MP_DEBUG | |
477 case evNone: | |
478 mp_msg( MSGT_GPLAYER,MSGL_STATUS,"[mw] event none received.\n" ); | |
479 break; | |
480 default: | |
481 mp_msg( MSGT_GPLAYER,MSGL_STATUS,"[mw] unknown event received ( %d,%.2f ).\n",msg,param ); | |
482 break; | |
483 #endif | |
484 } | |
485 } | |
486 | |
487 #define itPLMButton (itNULL - 1) | |
488 #define itPRMButton (itNULL - 2) | |
489 | |
490 void mplMainMouseHandle( int Button,int X,int Y,int RX,int RY ) | |
491 { | |
492 static int itemtype = 0; | |
493 int i; | |
494 wItem * item = NULL; | |
495 float value = 0.0f; | |
496 | |
497 static int SelectedItem = -1; | |
498 int currentselected = -1; | |
499 | |
500 for ( i=0;i < appMPlayer.NumberOfItems + 1;i++ ) | |
501 if ( ( appMPlayer.Items[i].pressed != btnDisabled )&& | |
502 ( wgIsRect( X,Y,appMPlayer.Items[i].x,appMPlayer.Items[i].y,appMPlayer.Items[i].x+appMPlayer.Items[i].width,appMPlayer.Items[i].y+appMPlayer.Items[i].height ) ) ) | |
503 { currentselected=i; break; } | |
504 | |
505 switch ( Button ) | |
506 { | |
507 case wsPMMouseButton: | |
508 gtkShow( evHidePopUpMenu,NULL ); | |
509 mplShowMenu( RX,RY ); | |
510 itemtype=itPRMButton; | |
511 break; | |
512 case wsRMMouseButton: | |
513 mplHideMenu( RX,RY,0 ); | |
514 break; | |
515 | |
516 case wsPLMouseButton: | |
517 gtkShow( evHidePopUpMenu,NULL ); | |
518 sx=X; sy=Y; boxMoved=1; itemtype=itPLMButton; // if move the main window | |
519 SelectedItem=currentselected; | |
520 if ( SelectedItem == -1 ) break; // yeees, i'm move the fucking window | |
521 boxMoved=0; //mplMainRender=1; // No, not move the window, i'm pressed one button | |
522 item=&appMPlayer.Items[SelectedItem]; | |
523 itemtype=item->type; | |
524 item->pressed=btnPressed; | |
525 switch( item->type ) | |
526 { | |
527 case itButton: | |
528 if ( ( SelectedItem > -1 ) && | |
529 ( ( ( appMPlayer.Items[SelectedItem].msg == evPlaySwitchToPause && item->msg == evPauseSwitchToPlay ) ) || | |
530 ( ( appMPlayer.Items[SelectedItem].msg == evPauseSwitchToPlay && item->msg == evPlaySwitchToPause ) ) ) ) | |
531 { appMPlayer.Items[SelectedItem].pressed=btnDisabled; } | |
532 break; | |
533 } | |
534 break; | |
535 case wsRLMouseButton: | |
536 boxMoved=0; | |
537 item=&appMPlayer.Items[SelectedItem]; | |
538 item->pressed=btnReleased; | |
539 SelectedItem=-1; | |
540 if ( currentselected == - 1 ) { itemtype=0; break; } | |
541 value=0; | |
542 switch( itemtype ) | |
543 { | |
544 case itPotmeter: | |
545 case itHPotmeter: | |
546 btnModify( item->msg,(float)( X - item->x ) / item->width * 100.0f ); | |
547 mplEventHandling( item->msg,item->value ); | |
548 value=item->value; | |
549 break; | |
550 } | |
551 mplEventHandling( item->msg,value ); | |
552 // mplMainRender=1; | |
553 itemtype=0; | |
554 break; | |
555 | |
556 case wsPRMouseButton: | |
557 gtkShow( evShowPopUpMenu,NULL ); | |
558 break; | |
559 | |
560 // --- rolled mouse ... de szar :))) | |
561 case wsP5MouseButton: value=-2.5f; goto rollerhandled; | |
562 case wsP4MouseButton: value= 2.5f; | |
563 rollerhandled: | |
564 item=&appMPlayer.Items[currentselected]; | |
565 if ( ( item->type == itHPotmeter )||( item->type == itVPotmeter )||( item->type == itPotmeter ) ) | |
566 { | |
567 item->value+=value; | |
568 btnModify( item->msg,item->value ); | |
569 mplEventHandling( item->msg,item->value ); | |
570 } | |
571 break; | |
572 | |
573 // --- moving | |
574 case wsMoveMouse: | |
575 item=&appMPlayer.Items[SelectedItem]; | |
576 switch ( itemtype ) | |
577 { | |
578 case itPLMButton: | |
579 wsMoveWindow( &appMPlayer.mainWindow,False,RX - abs( sx ),RY - abs( sy ) ); | |
580 mplMainRender=0; | |
581 break; | |
582 case itPRMButton: | |
583 mplMenuMouseHandle( X,Y,RX,RY ); | |
584 break; | |
585 case itPotmeter: | |
586 item->value=(float)( X - item->x ) / item->width * 100.0f; | |
587 goto potihandled; | |
588 case itHPotmeter: | |
589 item->value=(float)( X - item->x ) / item->width * 100.0f; | |
590 potihandled: | |
591 if ( item->value > 100.0f ) item->value=100.0f; | |
592 if ( item->value < 0.0f ) item->value=0.0f; | |
593 mplEventHandling( item->msg,item->value ); | |
594 break; | |
595 } | |
596 break; | |
597 } | |
598 // if ( Button != wsMoveMouse ) wsPostRedisplay( &appMPlayer.mainWindow ); | |
599 } | |
600 | |
601 int keyPressed = 0; | |
602 | |
603 void mplMainKeyHandle( int KeyCode,int Type,int Key ) | |
604 { | |
605 int msg = evNone; | |
606 | |
607 if ( Type != wsKeyPressed ) return; | |
608 | |
609 if ( !Key ) | |
610 { | |
611 switch ( KeyCode ) | |
612 { | |
613 case wsXFMMPrev: msg=evPrev; break; | |
614 case wsXFMMStop: msg=evStop; break; | |
615 case wsXFMMPlay: msg=evPlaySwitchToPause; break; | |
616 case wsXFMMNext: msg=evNext; break; | |
617 case wsXFMMVolUp: msg=evIncVolume; break; | |
618 case wsXFMMVolDown: msg=evDecVolume; break; | |
619 case wsXFMMMute: msg=evMute; break; | |
620 } | |
621 } | |
622 else | |
623 { | |
624 switch ( Key ) | |
625 { | |
626 case wsEnter: msg=evPlay; break; | |
627 case wsXF86LowerVolume: msg=evDecVolume; break; | |
628 case wsXF86RaiseVolume: msg=evIncVolume; break; | |
629 case wsXF86Mute: msg=evMute; break; | |
630 case wsXF86Play: msg=evPlaySwitchToPause; break; | |
631 case wsXF86Stop: msg=evStop; break; | |
632 case wsXF86Prev: msg=evPrev; break; | |
633 case wsXF86Next: msg=evNext; break; | |
634 case wsXF86Media: msg=evLoad; break; | |
635 | |
636 default: vo_x11_putkey( Key ); return; | |
637 } | |
638 } | |
639 if ( msg != evNone ) mplEventHandling( msg,0 ); | |
640 } | |
641 | |
642 /* this will be used to handle Drag&Drop files */ | |
643 void mplDandDHandler(int num,char** files) | |
644 { | |
645 struct stat buf; | |
646 int f = 0; | |
647 | |
648 if (num <= 0) | |
649 return; | |
650 | |
651 /* clear playlist */ | |
652 gtkSet(gtkDelPl,0,NULL); | |
653 | |
654 /* now fill it with new items */ | |
655 for(f=0; f < num; f++){ | |
656 char* str = strdup( files[f] ); | |
657 plItem* item; | |
658 | |
659 #ifdef USE_ICONV | |
660 if ( strchr( str,'%' ) ) | |
661 { | |
662 char * tmp=gconvert_uri_to_filename( str ); | |
663 free( str ); str=tmp; | |
664 } | |
665 #endif | |
666 | |
667 if(stat(str,&buf) == 0 && S_ISDIR(buf.st_mode) == 0) { | |
668 /* this is not a directory so try to play it */ | |
669 printf("Received D&D %s\n",str); | |
670 item = calloc(1,sizeof(plItem)); | |
671 | |
672 /* FIXME: decompose file name ? */ | |
673 /* yes -- Pontscho */ | |
674 if ( strrchr( str,'/' ) ) | |
675 { | |
676 char * s = strrchr( str,'/' ); *s=0; s++; | |
677 item->name = gstrdup( s ); | |
678 item->path = gstrdup( str ); | |
679 } else { item->name = strdup(str); item->path = strdup(""); } | |
680 gtkSet(gtkAddPlItem,0,(void*)item); | |
681 } else { | |
682 printf("Received not a file: %s !\n",str); | |
683 } | |
684 free( str ); | |
685 } | |
686 | |
687 mplSetFileName( NULL,files[0],STREAMTYPE_FILE ); | |
688 if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evStop,0 ); | |
689 mplEventHandling( evPlay,0 ); | |
690 | |
691 } |