1693
|
1
|
|
2 #include <stdlib.h>
|
|
3 #include <stdio.h>
|
|
4 #include <string.h>
|
|
5 #include <signal.h>
|
|
6 #include <unistd.h>
|
|
7
|
|
8 #include "widgets.h"
|
|
9 #include "play.h"
|
|
10
|
|
11 #include "../app.h"
|
|
12
|
|
13 #include "../skin/skin.h"
|
|
14 #include "../wm/ws.h"
|
|
15 #include "../config.h"
|
|
16 #include "../error.h"
|
|
17 #include "../language.h"
|
|
18
|
|
19 #include "../../config.h"
|
|
20
|
|
21 #include "./mplayer.h"
|
|
22
|
|
23 #define gtkShow( w ) gtkShMem->vs.window=w; gtkSendMessage( evShowWindow );
|
|
24
|
|
25 pid_t mplMPlayerPID = 0;
|
|
26 pid_t mplParentPID = 0;
|
|
27
|
|
28 pid_t gtkChildPID = 0;
|
|
29 pid_t gtkParentPID = 0;
|
|
30
|
|
31 int mplCriticalError = 0;
|
|
32 int gtkIsOk = 0;
|
|
33
|
|
34 void mplErrorHandler( int critical,const char * format, ... )
|
|
35 {
|
|
36 char * p;
|
|
37 va_list ap;
|
|
38 int n;
|
|
39
|
|
40 if ( (p=(char *)malloc( 512 ) ) == NULL ) return;
|
|
41 va_start( ap,format );
|
|
42 n=vsnprintf( p,512,format,ap );
|
|
43 va_end( ap );
|
|
44 mplCriticalError=critical;
|
|
45 gtkMessageBox( p );
|
|
46 // message( False,p );
|
|
47 }
|
|
48
|
|
49 void mplPlayerSigHandler( int s )
|
|
50 {
|
|
51 #ifdef DEBUG
|
|
52 dbprintf( 5,"[psignal] mpl sig handler msg: %d\n",mplShMem->message );
|
|
53 #endif
|
|
54 if ( s != SIGTYPE ) return;
|
|
55 switch ( mplShMem->message )
|
|
56 {
|
|
57 case mplQuit:
|
|
58 // exit_player( "Quit" );
|
|
59 break;
|
|
60 case mplPauseEvent:
|
|
61 // if ( osd_function != OSD_PAUSE ) osd_function=OSD_PAUSE;
|
|
62 // else osd_function=OSD_PLAY;
|
|
63 break;
|
|
64 case mplResizeEvent:
|
|
65 // vo_resize=1;
|
|
66 // vo_expose=1;
|
|
67 // dbprintf( 2,"[psignal] resize.\n" );
|
|
68 // if (video_out != NULL ) video_out->check_events();
|
|
69 break;
|
|
70 case mplExposeEvent:
|
|
71 // vo_expose=1;
|
|
72 // if (video_out != NULL ) video_out->check_events();
|
|
73 break;
|
|
74 case mplSeekEvent:
|
|
75 // rel_seek_secs+=mplShMem->videodata.seek;
|
|
76 // if ( rel_seek_secs > 0 ) osd_function=OSD_FFW;
|
|
77 // else osd_function=OSD_REW;
|
|
78 break;
|
|
79 case mplIncAudioBufferDelay:
|
|
80 // audio_delay+=0.1; // increase audio buffer delay
|
|
81 // a_frame-=0.1;
|
|
82 break;
|
|
83 case mplDecAudioBufferDelay:
|
|
84 // audio_delay-=0.1; // increase audio buffer delay
|
|
85 // a_frame+=0.1;
|
|
86 break;
|
|
87 }
|
|
88 mplShMem->message=0;
|
|
89 }
|
|
90
|
|
91 void gtkSigHandler( int s )
|
|
92 {
|
|
93 if ( s != SIGTYPE ) return;
|
|
94 #ifdef DEBUG
|
|
95 dbprintf( 5,"[psignal] gtk sig handler msg: %d\n",gtkShMem->message );
|
|
96 #endif
|
|
97 switch ( gtkShMem->message )
|
|
98 {
|
|
99 case evHideWindow:
|
|
100 switch ( gtkShMem->vs.window )
|
|
101 {
|
|
102 case evPlayList: gtk_widget_hide( PlayList ); gtkVisiblePlayList=0; break;
|
|
103 case evSkinBrowser: gtk_widget_hide( SkinBrowser ); gtkVisibleSkinBrowser=0; break;
|
|
104 case evLoad: gtk_widget_hide( FileSelect ); gtkVisibleFileSelect=0; break;
|
|
105 }
|
|
106 break;
|
|
107 case evSkinBrowser:
|
|
108 if ( gtkVisibleSkinBrowser ) gtk_widget_hide( SkinBrowser );
|
|
109 gtkClearList( SkinList );
|
|
110 if ( !gtkFillSkinList( sbMPlayerPrefixDir ) ) break;
|
|
111 if ( gtkFillSkinList( sbMPlayerDirInHome ) )
|
|
112 {
|
|
113 gtkSetDefaultToCList( SkinList,cfgSkin );
|
|
114 gtk_widget_show( SkinBrowser );
|
|
115 gtkVisibleSkinBrowser=1;
|
|
116 gtkShow( evSkinBrowser );
|
|
117 }
|
|
118 break;
|
|
119 case evPreferences:
|
|
120 if ( gtkVisibleOptions ) gtk_widget_hide( Options );
|
|
121 gtk_widget_show( Options );
|
|
122 gtkVisibleOptions=1;
|
|
123 break;
|
|
124 case evPlayList:
|
|
125 if ( gtkVisiblePlayList ) gtk_widget_hide( PlayList );
|
|
126 gtk_widget_show( PlayList );
|
|
127 gtkVisiblePlayList=1;
|
|
128 gtkShow( evPlayList );
|
|
129 break;
|
|
130 case evLoad:
|
|
131 if ( gtkVisibleFileSelect ) gtk_widget_hide( FileSelect );
|
|
132 gtk_widget_show( FileSelect );
|
|
133 gtkVisibleFileSelect=1;
|
|
134 gtkShow( evPlay );
|
|
135 break;
|
|
136 case evMessageBox:
|
|
137 gtk_label_set_text( gtkMessageBoxText,(char *)gtkShMem->mb.str );
|
|
138 gtk_widget_set_usize( MessageBox,gtkShMem->mb.sx,gtkShMem->mb.sy );
|
|
139 gtk_widget_set_usize( gtkMessageBoxText,gtkShMem->mb.tsx,gtkShMem->mb.tsy );
|
|
140 if ( gtkVisibleMessageBox ) gtk_widget_hide( MessageBox );
|
|
141 gtk_widget_show( MessageBox );
|
|
142 gtkVisibleMessageBox=1;
|
|
143 break;
|
|
144 case evAbout:
|
|
145 if ( gtkVisibleAboutBox ) gtk_widget_hide( AboutBox );
|
|
146 gtk_widget_show( AboutBox );
|
|
147 gtkVisibleAboutBox=1;
|
|
148 break;
|
|
149 case evExit:
|
1700
|
150 gtk_main_quit();
|
1693
|
151 break;
|
|
152 }
|
|
153 gtkShMem->message=0;
|
|
154 }
|
|
155
|
|
156 listItems tmpList;
|
|
157
|
|
158 void mplMainSigHandler( int s )
|
|
159 {
|
|
160 #ifdef DEBUG
|
|
161 if ( gtkShMem->message ) dbprintf( 5,"[psignal] main sig handler gtk msg: %d\n",gtkShMem->message );
|
|
162 if ( mplShMem->message ) dbprintf( 5,"[psignal] main sig handler mpl msg: %d\n",mplShMem->message );
|
|
163 #endif
|
|
164
|
|
165 if ( s != SIGTYPE ) return;
|
|
166
|
|
167 switch ( gtkShMem->message )
|
|
168 {
|
|
169 case evGtkIsOk:
|
|
170 #ifdef DEBUG
|
|
171 dbprintf( 1,"[psignal] gtk is ok.\n" );
|
|
172 #endif
|
|
173 gtkIsOk=True;
|
|
174 break;
|
|
175 case evShowWindow:
|
|
176 switch ( gtkShMem->vs.window )
|
|
177 {
|
|
178 case evPlayList: gtkVisiblePlayList=1; break;
|
|
179 case evLoad: gtkVisibleFileSelect=1; break;
|
|
180 case evSkinBrowser: gtkVisibleSkinBrowser=1; break;
|
|
181 }
|
|
182 break;
|
|
183 case evHideWindow:
|
|
184 switch ( gtkShMem->vs.window )
|
|
185 {
|
|
186 case evPlayList:
|
|
187 btnModify( evPlayList,btnReleased ); gtkVisiblePlayList=0;
|
|
188 mplMainRender=1; wsPostRedisplay( &appMPlayer.mainWindow );
|
|
189 break;
|
|
190 case evSkinBrowser: gtkVisibleSkinBrowser=0; break;
|
|
191 case evLoad: gtkVisibleFileSelect=0; break;
|
|
192 }
|
|
193 break;
|
|
194 case evSkinBrowser:
|
|
195 if ( strcmp( cfgSkin,gtkShMem->sb.name ) )
|
|
196 {
|
|
197 int ret;
|
|
198 #ifdef DEBUG
|
|
199 dbprintf( 1,"[psignal] skin: %s\n",gtkShMem->sb.name );
|
|
200 #endif
|
|
201
|
|
202 mainVisible=0;
|
|
203
|
|
204 appInitStruct( &tmpList );
|
|
205 skinAppMPlayer=&tmpList;
|
|
206 ret=skinRead( gtkShMem->sb.name );
|
|
207
|
|
208 appInitStruct( &tmpList );
|
|
209 skinAppMPlayer=&appMPlayer;
|
|
210 appInitStruct( &appMPlayer );
|
|
211 if ( !ret ) strcpy( cfgSkin,gtkShMem->sb.name );
|
|
212 skinRead( cfgSkin );
|
|
213
|
|
214 if ( ret )
|
|
215 {
|
|
216 mainVisible=1;
|
|
217 break;
|
|
218 }
|
|
219
|
|
220 // appCopy( &appMPlayer,&tmpList );
|
|
221 // appInitStruct( &tmpList );
|
|
222 // skinAppMPlayer=&appMPlayer;
|
|
223 // strcpy( cfgSkin,gtkShMem->sb.name );
|
|
224
|
|
225 if ( mplDrawBuffer ) free( mplDrawBuffer );
|
|
226 if ( ( mplDrawBuffer = (unsigned char *)calloc( 1,appMPlayer.main.Bitmap.ImageSize ) ) == NULL )
|
|
227 { message( False,langNEMDB ); break; }
|
|
228 wsResizeWindow( &appMPlayer.mainWindow,appMPlayer.main.width,appMPlayer.main.height );
|
|
229 wsMoveWindow( &appMPlayer.mainWindow,appMPlayer.main.x,appMPlayer.main.y );
|
|
230 wsResizeImage( &appMPlayer.mainWindow );
|
|
231 wsSetShape( &appMPlayer.mainWindow,appMPlayer.main.Mask.Image );
|
|
232 mainVisible=1; mplMainRender=1; wsPostRedisplay( &appMPlayer.mainWindow );
|
|
233 btnModify( evSetVolume,mplShMem->Volume );
|
|
234 btnModify( evSetBalance,mplShMem->Balance );
|
|
235 btnModify( evSetMoviePosition,mplShMem->Position );
|
|
236
|
|
237 if ( appMPlayer.menuBase.Bitmap.Image )
|
|
238 {
|
|
239 if ( mplMenuDrawBuffer ) free( mplMenuDrawBuffer );
|
|
240 if ( ( mplMenuDrawBuffer = (unsigned char *)calloc( 1,appMPlayer.menuBase.Bitmap.ImageSize ) ) == NULL )
|
|
241 { message( False,langNEMDB ); break; }
|
|
242 wsResizeWindow( &appMPlayer.menuWindow,appMPlayer.menuBase.width,appMPlayer.menuBase.height );
|
|
243 wsResizeImage( &appMPlayer.menuWindow );
|
|
244 }
|
|
245
|
|
246 mplSkinChanged=1;
|
|
247 if ( !mplShMem->Playing )
|
|
248 {
|
|
249 mplSkinChanged=0;
|
|
250 if ( appMPlayer.subWindow.isFullScreen ) wsFullScreen( &appMPlayer.subWindow );
|
|
251 wsResizeWindow( &appMPlayer.subWindow,appMPlayer.sub.width,appMPlayer.sub.height );
|
|
252 wsMoveWindow( &appMPlayer.subWindow,appMPlayer.sub.x,appMPlayer.sub.y );
|
|
253 if ( appMPlayer.sub.Bitmap.Image ) wsResizeImage( &appMPlayer.subWindow );
|
|
254 mplSubRender=1; wsPostRedisplay( &appMPlayer.subWindow );
|
|
255 }
|
|
256 }
|
|
257 break;
|
|
258 case evFileLoaded:
|
|
259 if ( Filename ) free( Filename );
|
|
260 Filename=(char *)malloc( strlen( gtkShMem->fs.dir ) + strlen( gtkShMem->fs.filename ) + 2 );
|
|
261 strcpy( Filename,gtkShMem->fs.dir ); strcat( Filename,"/" ); strcat( Filename,gtkShMem->fs.filename );
|
|
262 if ( mplMainAutoPlay ) mplGeneralTimer=1;
|
|
263 break;
|
|
264 case evMessageBox:
|
|
265 if ( mplCriticalError )
|
|
266 { gtkSendMessage( evExit ); exit( 1 ); }
|
|
267 mplCriticalError=0;
|
|
268 break;
|
|
269 }
|
|
270
|
|
271 // switch( mplShMem->message )
|
|
272 // {
|
|
273 // }
|
|
274 gtkShMem->message=0;
|
|
275 mplShMem->message=0;
|
|
276 }
|
|
277
|
|
278 void mplSendMessage( int msg )
|
|
279 {
|
|
280 if ( !mplShMem->Playing ) return;
|
|
281 mplShMem->message=msg;
|
|
282 kill( mplMPlayerPID,SIGTYPE ); usleep( 10 );
|
|
283 kill( mplMPlayerPID,SIGTYPE ); usleep( 10 );
|
|
284 kill( mplMPlayerPID,SIGTYPE );
|
|
285 }
|
|
286
|
|
287 void gtkSendMessage( int msg )
|
|
288 {
|
|
289 if ( !gtkIsOk ) return;
|
|
290 gtkShMem->message=msg;
|
|
291 kill( gtkChildPID,SIGTYPE );
|
|
292 }
|