comparison src/mplayer/xmmsmplayer.c @ 135:33d24bd94ccc trunk

[svn] Adds mplayer controls the plugin pack. I don't know crap about configure.ac, so it's totally busted. Also, I used the string "what" in common.c and interface.c. I'm not going to pretend I actually know what I was doing there, but it seems to work despite that.
author asheldon
date Sat, 28 Oct 2006 18:08:06 -0700
parents
children 81592119ee73
comparison
equal deleted inserted replaced
134:8b343e9684b5 135:33d24bd94ccc
1 #include <gtk/gtk.h>
2 #include <gdk/gdk.h>
3 #include <gdk/gdkx.h>
4 #include <glib.h>
5
6 #include <stdlib.h>
7 #include <string.h>
8 #include <ctype.h>
9 #include <pthread.h>
10 #include <audacious/plugin.h>
11 #include <audacious/beepctrl.h>
12 #include <audacious/rcfile.h>
13 #include <audacious/util.h>
14 #include <unistd.h>
15
16 #include <fcntl.h>
17 #include <sys/stat.h>
18 #include <sys/time.h>
19 #include <sys/types.h>
20
21 #include <stdio.h>
22 #include <sys/wait.h>
23 #include <X11/Xlib.h>
24 #include <X11/Xutil.h>
25 #include <X11/Xos.h>
26 #include <X11/Xatom.h>
27 #include <X11/keysym.h>
28 #include <assert.h>
29
30 #include <X11/Xmd.h>
31
32
33 #include "xmmsmplayer.h"
34 static Atom XA_WIN_LAYER;
35 static Atom XA_NET_WM_STATE;
36 static Atom XA_NET_WM_STATE_FULLSCREEN;
37 static Atom XA_NET_WM_STATE_ABOVE;
38 static Atom XA_NET_WM_STATE_STAYS_ON_TOP;
39 static Atom XA_NET_WM_STATE_BELOW;
40
41 static Window mplayer_video = 0;
42 static gchar mplayer_wid[16];
43
44 static int mplayer_pipe[2]; /* Control mplayer thru this pipe */
45 static pthread_t mplayer_tid; /* Thread id */
46 static gchar *mplayer_file=NULL; /* filename */
47 static struct mplayer_info *mplayer_current_info=NULL;
48 static gint mplayer_current_time=0; /* to be returned to xmms */
49
50 static char *mplayer_fifoname=NULL;
51 static InputPlugin *mplayer_ip=NULL; /* Information to be returned to xmms */
52 static gint mplayer_playing=0;
53 static struct mplayer_cfg *mplayer_current_cfg=NULL;
54 static Display *dis = NULL;
55
56 InputPlugin *get_iplugin_info(void){
57 if(!mplayer_ip){
58 mplayer_ip=(InputPlugin *) malloc(sizeof (InputPlugin));
59 memset(mplayer_ip,0,sizeof (InputPlugin));
60 mplayer_ip->description = strdup("MPlayer Plugin for Xmms");
61 mplayer_ip->init = mplayer_init;
62 mplayer_ip->is_our_file = mplayer_is_our_file;
63 mplayer_ip->play_file = mplayer_play_file;
64 mplayer_ip->stop = mplayer_stop;
65 mplayer_ip->pause = mplayer_pause;
66 mplayer_ip->seek = mplayer_seek;
67 mplayer_ip->get_time = mplayer_get_time;
68 mplayer_ip->get_song_info = mplayer_get_song_info;
69 mplayer_ip->set_info = NULL;
70 mplayer_ip->cleanup = mplayer_cleanup;
71 mplayer_ip->about = mplayer_about;
72 mplayer_ip->configure = mplayer_configure;
73
74 }
75 return mplayer_ip;
76 }
77
78 void mplayer_init(){
79 /*Add read configure!! */
80
81 /*mplayer_playing=0;*/
82 }
83 int mplayer_is_our_file(char *filename){
84 gchar *ext;
85 ext = strrchr(filename, '.');
86 if (ext){
87 if((!strcasecmp(ext, ".mpg")) ||
88 (!strcasecmp(ext, ".mpeg")) ||
89 (!strcasecmp(ext, ".divx")) ||
90 (!strcasecmp(ext, ".qt")) ||
91 (!strcasecmp(ext, ".mov")) ||
92 (!strcasecmp(ext, ".mp2")) ||
93 (!strcasecmp(ext, ".mpa")) ||
94 (!strcasecmp(ext, ".dat")) ||
95 (!strcasecmp(ext, ".rm")) ||
96 (!strcasecmp(ext, ".swf")) ||
97 (!strcasecmp(ext, ".wma")) ||
98 (!strcasecmp(ext, ".wmv")) ||
99 (!strcasecmp(ext, ".wmp")) ||
100 (!strcasecmp(ext, ".asf")) ||
101 (!strcasecmp(ext, ".avi"))
102 ) return TRUE;
103 }
104 return FALSE;
105 }
106 void mplayer_play_file(char *filename){
107 pthread_attr_t tattr;
108 void *arg;
109 int ret,pipe_ret;
110 gchar temp[10];
111 gchar *username;
112
113 mplayer_debugf("debug-play-in\n");
114 mplayer_file=filename;
115 pipe_ret=pipe(mplayer_pipe);
116
117 if(mplayer_current_info)g_free(mplayer_current_info);
118 mplayer_current_info = mplayer_read_file_info(filename);
119 mplayer_debugf("Setting info:\n%sTerm\n%i\n%i\n%i\n%i\n\n",
120 mplayer_current_info->caption,
121 mplayer_current_info->length * 1000,
122 mplayer_current_info->abr,
123 mplayer_current_info->rate,
124 mplayer_current_info->nch);
125 mplayer_debugf("debug-play-fileinfo-done\n");
126 /* usleep(100000);*/
127 mplayer_ip->set_info(mplayer_current_info->caption,
128 mplayer_current_info->length * 1000,
129 mplayer_current_info->abr,
130 mplayer_current_info->rate,
131 mplayer_current_info->nch);
132 mplayer_debugf("debug-play-sent-info\n");
133 mplayer_debugf("debug- reading configfile\n");
134 if (mplayer_current_cfg){
135 g_free(mplayer_current_cfg->extra);
136 g_free(mplayer_current_cfg);
137 }
138 mplayer_current_cfg=mplayer_read_cfg();
139 if(mplayer_current_cfg->onewin &&(!mplayer_video)){
140 /* mplayer_video=gtk_window_new(GTK_WINDOW_DIALOG);
141 gtk_widget_set_usize(GTK_WIDGET(mplayer_video), 320, 240);
142 gtk_window_set_title(GTK_WINDOW(mplayer_video), "XMMS - MPlayer");
143 gtk_signal_connect(GTK_OBJECT(mplayer_video),
144 "destroy",
145 GTK_SIGNAL_FUNC(mplayer_quitting_video),
146 NULL);
147 gtk_widget_show(mplayer_video);
148 sprintf(mplayer_wid,"%i",GDK_WINDOW_XWINDOW(mplayer_video->window));
149 */
150 if(!dis) dis = XOpenDisplay(NULL);
151 assert(dis);
152 XEvent report;
153 int blackColor = BlackPixel(dis, DefaultScreen(dis));
154 int whiteColor = WhitePixel(dis, DefaultScreen(dis));
155 mplayer_video = XCreateSimpleWindow(dis, DefaultRootWindow(dis), 0, 0,
156 320, 240, 0, blackColor, blackColor);
157 XMapWindow(dis,mplayer_video);
158 XFlush(dis);
159 XSelectInput (dis, mplayer_video, KeyPressMask);
160 sprintf(mplayer_wid,"%i",mplayer_video);
161 }
162 if((!mplayer_current_cfg->onewin) &&(mplayer_video)){
163 XDestroyWindow(dis,mplayer_video);
164 mplayer_video=0;
165 mplayer_wid[0]='\0';
166 }
167 if(mplayer_current_cfg->xmmsaudio){
168 if(!mplayer_fifoname){
169 username = getenv("LOGNAME");
170 if(!username)username = getenv("USERNAME");
171 if(!username)username = getenv("USER");
172 sprintf(temp,"%i",getpid());
173 if (!username)mplayer_fifoname=g_strconcat("/tmp/xmmsmplayer-",temp,(char*)0);
174 else mplayer_fifoname=g_strconcat("/tmp/xmmsmplayer-",username,"-",temp,(char*)0);
175 mkfifo(mplayer_fifoname,0600);
176 }
177 mplayer_ip->output->open_audio(FMT_S16_LE,
178 mplayer_current_info->rate,
179 mplayer_current_info->nch);
180 }
181 mplayer_debugf("debug- read configfile\n");
182 if (mplayer_playing==1) mplayer_debugf("Duplicate call!! -- Panic \n");
183 else mplayer_playing=1;
184 mplayer_debugf("debug-play-creating-thread\n");
185 ret = pthread_create(&mplayer_tid, NULL, mplayer_play_loop, arg);
186 mplayer_debugf("debug-play-out\n\n");
187 }
188
189 void mplayer_stop(){
190 int ret;
191 if (mplayer_playing==0) mplayer_debugf("Confusion: Restopped!\n");
192 else {
193 mplayer_playing=0;
194 if(mplayer_current_cfg->xmmsaudio)mplayer_ip->output->close_audio();
195 if (write(mplayer_pipe[1],"quit\n",5)==5){
196 mplayer_debugf("debug-stop-if\n");
197 };
198 mplayer_debugf("debug-stop\n");
199 ret = pthread_join(mplayer_tid, NULL);
200 mplayer_debugf("debug-stop\n\n");
201 }
202 }
203
204 void mplayer_cleanup(){
205 if (mplayer_playing) mplayer_stop();
206 if (mplayer_fifoname){
207 remove(mplayer_fifoname);
208 g_free(mplayer_fifoname);
209 mplayer_fifoname=NULL;
210 }
211
212 }
213
214 void mplayer_pause(short p){
215 write(mplayer_pipe[1],"pause\n",6);
216 }
217
218 void mplayer_seek(int t){
219 char buff[16];
220 if(mplayer_playing){
221 sprintf(buff,"seek %i\n",(t - mplayer_current_time));
222 write(mplayer_pipe[1],buff,strlen(buff));
223 }
224 }
225
226 gint mplayer_get_time(){
227 return (mplayer_current_time*1000) ;
228 }
229 void mplayer_get_song_info(char * filename, char ** title, int * length){
230 struct mplayer_info *info;
231 char *temp,*name;
232 info = mplayer_read_file_info(filename);
233 *title = g_strdup(info->caption);
234 *length = (info->length * 1000);
235 g_free(info);
236 }
237
238 void *mplayer_play_loop(void *arg){
239 char buff[35];
240 int mplayer_slave_pid;
241 int i,read_length,playtime,one_read;
242 int mplayer_status_pipe[2];
243 int mplayer_error_stream;
244 int mplayer_fifo_fd;
245 int pipe_ret;
246 char **params;
247 char audio_buff[MPLAYER_AUDIO_SIZE];
248 int audio_buff_read;
249 gboolean audio_flag, status_flag;
250 struct timespec nanotime;
251 nanotime.tv_sec=0;
252 nanotime.tv_nsec=1;
253
254
255 pipe_ret=pipe(mplayer_status_pipe);
256
257 if ((mplayer_slave_pid=vfork())==0){
258 //close(mplayer_pipe[1]);
259 mplayer_debugf("debug Pre-exec!\n");
260 mplayer_error_stream=open("/dev/null",0);
261 mplayer_debugf("debug Making vector\n");
262 params=mplayer_make_vector();
263 mplayer_debugf("debug Made vector\n");
264 close(0);
265 close(1);
266 close(2);
267 if(dup2(mplayer_pipe[0],0)!=0) mplayer_debugf("duplication error\n");
268 if(dup2(mplayer_status_pipe[1],1)!=0) mplayer_debugf("duplication error\n");
269 if(dup2(mplayer_error_stream,2)!=0) mplayer_debugf("duplication error\n");
270 /*i=execlp("mplayer","mplayer","-vo","x11","-zoom","-sws","2","-framedrop","-slave","-wid",mplayer_wid,mplayer_file,(char *)0);*/
271 i=execvp("mplayer",params);
272 mplayer_debugf("Fatal Error: Couldnt start MPlayer! exec returned %i\n",i);
273 _exit(-1);
274 }
275 else{
276 close(mplayer_status_pipe[1]); /* EXTREMELY IMPORTANT, a little tricky! */
277 close(mplayer_pipe[0]);
278 if(mplayer_current_cfg->xmmsaudio){
279 mplayer_debugf("debug - Opening fifo...\n");
280 mplayer_fifo_fd=open(mplayer_fifoname,O_RDONLY);
281 mplayer_debugf("debug - Opened fifo\n");
282 fcntl(mplayer_status_pipe[0],F_SETFL,O_NDELAY);
283 }
284 audio_buff_read=-1;
285 read_length=-1;
286 one_read=-1;
287 while((wait3((union wait *)0,WNOHANG,(struct rusage *)0)!=mplayer_slave_pid)&&(mplayer_playing==1)){
288 audio_flag=FALSE;
289 status_flag=FALSE;
290 /* Window event code here */
291 if(mplayer_current_cfg->xmmsaudio){
292 // do{
293
294 /* mplayer_debugf("debug - reading fifo...\n");*/
295 audio_buff_read=read(mplayer_fifo_fd,audio_buff,MPLAYER_AUDIO_SIZE);
296 if (audio_buff_read==0) break;
297 if (audio_buff_read>0){
298 mplayer_ip->output->write_audio(audio_buff,audio_buff_read);
299 /*mplayer_ip->add_vis_pcm();*/
300 audio_flag=TRUE;
301 mplayer_debugf(" %i ",audio_buff_read);
302 }
303 //}
304 //while(audio_buff_read>0);
305 }
306 do{
307 if(mplayer_current_cfg->onewin ){
308 XEvent report;
309 if(XCheckWindowEvent(dis,mplayer_video,KeyPressMask, &report)){
310 if (XLookupKeysym(&report.xkey, 0) == XK_f){
311 fprintf (stdout, "The f was pressed.\n");
312 XMoveResizeWindow(dis,mplayer_video,0,0,1280,1024);
313 XMapRaised(dis,mplayer_video);
314 XRaiseWindow(dis,mplayer_video);
315 XSetTransientForHint(dis,mplayer_video, RootWindow(dis,0));
316
317 XClientMessageEvent xev;
318 char *state;
319
320 memset( &xev,0,sizeof( xev ) );
321 xev.type=ClientMessage;
322 xev.message_type=XA_WIN_LAYER;
323 xev.display=dis;
324 xev.window=mplayer_video;
325 xev.format=32;
326 xev.data.l[0]=10;
327 xev.data.l[1]=CurrentTime;
328 XSendEvent( dis,RootWindow( dis,0),False,SubstructureRedirectMask,(XEvent*)&xev );
329
330
331 fprintf(stdout,"Cleared 1\n");
332 XSetWindowAttributes attr;
333 attr.override_redirect = True;
334 XChangeWindowAttributes(dis,mplayer_video, CWOverrideRedirect, &attr);
335
336 XFlush(dis);
337
338 }
339 }
340 }
341 one_read= read(mplayer_status_pipe[0],buff+read_length,1);
342 if (one_read==0) break;
343 if (one_read > 0) {
344 status_flag=TRUE;
345 if ((buff[read_length]==(char)13)||(buff[read_length]==(char)10)) read_length=0;
346 if (read_length < 32 ) read_length++;
347 if (read_length >= 16){
348 sscanf(buff+3,"%i",&playtime);
349 mplayer_current_time=playtime;
350 }
351 }
352 }
353 while (one_read>0);
354
355 /*
356 audio_buff_read=0;
357 if(mplayer_current_cfg->xmmsaudio){
358 mplayer_debugf("debug - reading fifo...\n");
359
360 audio_buff_read=read(mplayer_fifo_fd,audio_buff,MPLAYER_AUDIO_SIZE);
361 if (audio_buff_read>0)mplayer_ip->output->write_audio(audio_buff,audio_buff_read);
362 }
363 read_length=read(mplayer_status_pipe[0],buff,1);
364 if(read_length>0){
365 if ((buff[0]==(char)13)||(buff[0]==(char)10) ) {
366 one_read=1;
367 read_length=0;
368 while((read_length<16)&&(one_read>0)) {
369 audio_buff_read=0;
370 if(mplayer_current_cfg->xmmsaudio){
371 mplayer_debugf("debug - readin fifo...\n");
372 audio_buff_read=read(mplayer_fifo_fd,audio_buff,MPLAYER_AUDIO_SIZE);
373 mplayer_debugf("debug - read fifo...%i\n", audio_buff_read);
374 if (audio_buff_read>0)mplayer_ip->output->write_audio(audio_buff,audio_buff_read);
375 }
376 mplayer_debugf("debug - readin status...\n");
377 one_read= read(mplayer_status_pipe[0],buff+read_length,16-read_length);
378 read_length += one_read;
379 if ((audio_buff_read <= 0)&&(one_read <= 0)) usleep(5);
380 }
381 sscanf(buff+3,"%i",&playtime);
382 mplayer_current_time=playtime;}
383
384 }
385 else if ((audio_buff_read <= 0)&&(read_length <= 0)) usleep(5);
386 */
387
388 //else if (read_length == -1) break;
389 }
390 if (mplayer_playing==1){
391 if(mplayer_current_cfg->xmmsaudio)mplayer_ip->output->close_audio();
392 mplayer_playing=0;
393 xmms_remote_playlist_next(ctrlsocket_get_session_id());
394 }
395 // if (mplayer_dont_spawn) mplayer_dont_spawn=0;
396 // else xmms_remote_playlist_next(ctrlsocket_get_session_id());
397 pthread_exit(NULL);
398 }
399 }
400
401
402 struct mplayer_info *mplayer_read_file_info(char *filename){
403 struct mplayer_info *info;
404 int datalength,done=0;
405 FILE *inquiry, *size_query;
406 char mplayer_command[256];
407 char buff[4096];
408 char *temp;
409 info=(struct mplayer_info *)malloc(sizeof(struct mplayer_info));
410 memset((char *)info,0,sizeof(struct mplayer_info));
411 sprintf(mplayer_command,"mplayer -slave -identify -vo null -ao null -frames 0 \"%s\" 2> /dev/null",filename);
412 inquiry=popen(mplayer_command,"r");
413 done=0;
414 while((!feof(inquiry)) && (done <4000) ){
415 fscanf(inquiry,"%c",(buff+done));
416 done++;
417 }
418 buff[done]=(char)0;
419 pclose(inquiry);
420 mplayer_debugf("debug-id\n");
421 temp=strstr(buff,"Name:");
422 if (temp) mplayer_read_to_eol(info->title,temp+5);
423 mplayer_debugf("debug-id\n");
424 temp=strstr(buff,"Artist:");
425 if (temp) mplayer_read_to_eol(info->artist,temp+7);
426 mplayer_debugf("debug-id\n");
427 temp=strstr(buff,"ID_VIDEO_BITRATE=");
428 if (temp) sscanf(temp+strlen("ID_VIDEO_BITRATE=") ,"%i",&(info->vbr));
429 temp=strstr(buff,"ID_VIDEO_WIDTH=");
430 if (temp) sscanf(temp+strlen("ID_VIDEO_WIDTH=") ,"%i",&(info->x));
431 temp=strstr(buff,"ID_VIDEO_HEIGHT=");
432 if (temp) sscanf(temp+strlen("ID_VIDEO_HEIGHT=") ,"%i",&(info->y));
433 temp=strstr(buff,"ID_AUDIO_BITRATE=");
434 if (temp) sscanf(temp+strlen("ID_AUDIO_BITRATE="),"%i",&(info->abr));
435 info->br = info->abr + info->vbr;
436 temp=strstr(buff,"ID_AUDIO_RATE=");
437 if (temp) sscanf(temp+strlen("ID_AUDIO_RATE="),"%i",&(info->rate));
438 temp=strstr(buff,"ID_AUDIO_NCH=");
439 if (temp) sscanf(temp+strlen("ID_AUDIO_NCH="),"%i",&(info->nch));
440 temp=strstr(buff,"ID_LENGTH=");
441 if (temp) sscanf(temp+strlen("ID_LENGTH="),"%i",&(info->length));
442 else{
443 sprintf(mplayer_command,"du -b \"%s\" ",filename);
444 size_query=popen(mplayer_command,"r");
445 fscanf(size_query,"%i",&(info->filesize));
446 pclose(size_query);
447 if (info->br > 0) info->length=((info->filesize * 8)/(info->br));}
448 mplayer_debugf("debug-id\n");
449 info->filename=filename;
450 if((strlen(info->artist)+strlen(info->title)>0)){
451 sprintf(info->caption,"%s - %s",info->artist,info->title);}
452 else{
453 temp = g_strdup(g_basename(filename));
454 strcpy(info->caption,temp);
455 free(temp);
456 if ((temp = strrchr(info->caption, '.')) != NULL)
457 *temp = '\0';
458 }
459 mplayer_debugf("debug-id\n\n");
460 return info;
461 }
462
463 char **mplayer_make_vector(){ /*To be passed to exec*/
464 char** vector;
465 char** temp;
466 int i=0;
467 vector =(char **)malloc(sizeof(char*)*MPLAYER_MAX_VECTOR);
468 memset(vector,0,sizeof(char*)*MPLAYER_MAX_VECTOR);
469 mplayer_vector_append(vector,"mplayer");
470 mplayer_vector_append(vector,"-slave");
471 if(mplayer_current_cfg->vo){
472 mplayer_vector_append(vector,"-vo");
473 switch(mplayer_current_cfg->vo){
474 case MPLAYER_VO_XV:
475 mplayer_vector_append(vector,"xv");
476 break;
477 case MPLAYER_VO_X11:
478 mplayer_vector_append(vector,"x11");
479 break;
480 case MPLAYER_VO_GL:
481 mplayer_vector_append(vector,"gl");
482 break;
483 case MPLAYER_VO_SDL:
484 mplayer_vector_append(vector,"sdl");
485 break;
486 }
487 }
488 if(mplayer_current_cfg->ao){
489 mplayer_vector_append(vector,"-ao");
490 switch( mplayer_current_cfg->ao){
491 case MPLAYER_AO_OSS:
492 mplayer_vector_append(vector,"oss");
493 break;
494 case MPLAYER_AO_ARTS:
495 mplayer_vector_append(vector,"arts");
496 break;
497 case MPLAYER_AO_ESD:
498 mplayer_vector_append(vector,"esd");
499 break;
500 case MPLAYER_AO_ALSA:
501 mplayer_vector_append(vector,"alsa");
502 break;
503 case MPLAYER_AO_SDL:
504 mplayer_vector_append(vector,"sdl");
505 break;
506 }
507 }
508 if(mplayer_current_cfg->zoom) mplayer_vector_append(vector,"-zoom");
509 if(mplayer_current_cfg->framedrop)mplayer_vector_append(vector,"-framedrop");
510 if(mplayer_current_cfg->idx) mplayer_vector_append(vector,"-idx");
511 if(mplayer_current_cfg->onewin){
512 mplayer_vector_append(vector,"-wid");
513 mplayer_vector_append(vector,mplayer_wid);}
514 if(mplayer_current_cfg->xmmsaudio){
515 mplayer_vector_append(vector,"-ao");
516 mplayer_vector_append(vector,"pcm");
517 mplayer_vector_append(vector,"-aofile");
518 mplayer_vector_append(vector,mplayer_fifoname);
519 mplayer_vector_append(vector,"-autosync");
520 mplayer_vector_append(vector,"10000");
521 mplayer_vector_append(vector,"-nowaveheader");
522 mplayer_vector_append(vector,"-format");
523 mplayer_vector_append(vector,"128");
524 }
525 if(mplayer_current_cfg->extra){
526 mplayer_debugf("debug - adding extra options\n");
527 temp= g_strsplit(mplayer_current_cfg->extra," ",0);
528 while(temp[i]){
529 mplayer_vector_append(vector,temp[i]);
530 i++;
531 }
532 g_strfreev(temp);
533 }
534
535 mplayer_vector_append(vector,mplayer_file);
536 return vector;
537 }
538 void mplayer_vector_append(char**vector,char*param){
539 int i=0;
540 while(vector[i])i++;
541 if(i >= (MPLAYER_MAX_VECTOR -1)) {
542 mplayer_debugf("Too many arguments to mplayer!!\n");
543 mplayer_debugf("Ignoring parameter: %s\n",param);
544 return;
545 }
546 mplayer_debugf("Adding parameter: %s\n",param);
547 vector[i]=strdup(param);
548 }
549
550 void mplayer_read_to_eol(char *str1,char *str2){
551 /* copy str2 to str1 till \n is reached in str2 */
552 int i=0,j=0;
553 while(!((str2[j]=='\n')||(str2[j]==(char)0)||(str2[j]==(char)10)||(j>32) ))
554 str1[i++]=str2[j++];
555 str1[i]=(char)0;
556 }
557
558
559 static void mplayer_about(void)
560 {
561 static GtkWidget *window = NULL;
562 if (window)
563 return;
564
565 window = xmms_show_message(
566 "About " PACKAGE,
567 PACKAGE " " VERSION "\n"
568 "Author: " " Nandan Dixit " " <nandan@cse.iitb.ac.in>" "\n"
569 "http://xmmsmplayer.sourceforge.net/" "\n"
570 "Ported to Audacious: " " Aaron Sheldon " "\n"
571 "http://audacious-media-player.org/" "\n"
572 "This library is free software; you can redistribute it and/or\n"
573 "modify it under the terms of the GNU Library General Public\n",
574 "Ok", FALSE, NULL, NULL);
575
576 gtk_signal_connect(GTK_OBJECT(window), "destroy",
577 GTK_SIGNAL_FUNC(gtk_widget_destroyed), &window);
578
579 gtk_widget_show(window);
580
581 }
582 /*
583 void mplayer_quitting_video(GtkWidget *widget, gpointer data) {
584 mplayer_debugf("debug - entered quitting_video\n");
585 if(widget==mplayer_video){
586 mplayer_debugf("debug - correct widget\n");
587 mplayer_video=NULL;
588 mplayer_wid[0]='\0';
589 }
590 }
591 */