/** * @brief Set file to be played to current playlist entry. */ void uiCurr(void) { plItem *curr; if (guiInfo.Playing == GUI_PAUSE) return; switch (guiInfo.StreamType) { case STREAMTYPE_CDDA: case STREAMTYPE_VCD: case STREAMTYPE_DVD: case STREAMTYPE_TV: case STREAMTYPE_DVB: break; default: curr = listMgr(PLAYLIST_ITEM_GET_CURR, 0); if (curr) { uiSetFile(curr->path, curr->name, STREAMTYPE_FILE); guiInfo.PlaylistNext = False; guiInfo.Track = (uintptr_t)listMgr(PLAYLIST_ITEM_GET_POS, curr); break; } return; } if (guiInfo.Playing == GUI_PLAY) uiEvent(evPlay, 0); }
static void button_clicked(GtkButton *button, gpointer user_data) { urlItem *item; (void)button; if (user_data) { gchar *str = strdup(gtk_entry_get_text(GTK_ENTRY(urlEntry))); if (str) { if (!strstr(str, "://")) { gchar *tmp; tmp = malloc(strlen(str) + 8); sprintf(tmp, "http://%s", str); free(str); str = tmp; } urlEntries = g_list_prepend(urlEntries, (gchar *)str); item = calloc(1, sizeof(urlItem)); item->url = gstrdup(str); listMgr(URLLIST_ITEM_ADD, item); uiSetFile(NULL, str, STREAMTYPE_STREAM); guiInfo.NewPlay = GUI_FILE_NEW; listMgr(PLAYLIST_DELETE, 0); add_to_gui_playlist(str, PLAYLIST_ITEM_APPEND); uiEvent(evPlay, 0); } } gtk_widget_destroy(URLDialog); }
void ShowURLDialog(void) { urlItem *item; if (URLDialog) gtkRaise(URLDialog); else URLDialog = CreateURLDialog(); item = listMgr(URLLIST_GET, 0); if (item) { g_list_free(urlEntries); urlEntries = NULL; while (item) { urlEntries = g_list_append(urlEntries, (gchar *)item->url); item = item->next; } } if (urlEntries) { gtk_entry_set_text(GTK_ENTRY(urlEntry), urlEntries->data); gtk_combo_set_popdown_strings(GTK_COMBO(urlCombo), urlEntries); } gtk_widget_show(URLDialog); }
/** * @brief Set file to be played to current playlist entry. */ void uiCurr(void) { plItem *curr; if (guiInfo.Playing == GUI_PAUSE) return; switch (guiInfo.StreamType) { case STREAMTYPE_CDDA: case STREAMTYPE_VCD: case STREAMTYPE_DVD: case STREAMTYPE_TV: case STREAMTYPE_DVB: break; default: curr = listMgr(PLAYLIST_ITEM_GET_CURR, 0); if (curr) { uiSetFileFromPlaylist(curr); guiInfo.PlaylistNext = False; break; } return; } if (guiInfo.Playing == GUI_PLAY) uiEvent(evPlay, 0); }
/** * @brief Set the file to be played from a playlist item. * * @note This allows a file to be played partially (seeking before playback * and stopping before its end). * * @param item pointer to the playlist item * * @note All #guiInfo members associated with the file will be cleared. */ void uiSetFileFromPlaylist(plItem *item) { uiSetFile(item->path, item->name, STREAMTYPE_FILE); guiInfo.Start = item->start; guiInfo.Stop = item->stop; guiInfo.Title = gstrdup(item->title); guiInfo.Track = (uintptr_t)listMgr(PLAYLIST_ITEM_GET_POS, item); }
/** * @brief Stop and finalize the GUI. */ void guiDone(void) { if (guiInitialized) { if (gui_save_pos) { gui_main_pos_x = guiApp.mainWindow.X; gui_main_pos_y = guiApp.mainWindow.Y; gui_video_pos_x = guiApp.videoWindow.X; gui_video_pos_y = guiApp.videoWindow.Y; } ass_enabled = gtkASS.enabled; ass_use_margins = gtkASS.use_margins; ass_top_margin = gtkASS.top_margin; ass_bottom_margin = gtkASS.bottom_margin; cfg_write(); if (guiApp.menuIsPresent) uiMenuDone(); if (guiApp.playbarIsPresent) uiPlaybarDone(); uiVideoDone(); uiMainDone(); wsDone(); } uiUnsetFile(); listMgr(PLAYLIST_DELETE, 0); listMgr(URLLIST_DELETE, 0); appFreeStruct(); free(guiIcon.collection); if (gui_conf) { m_config_free(gui_conf); gui_conf = NULL; } mp_msg(MSGT_GPLAYER, MSGL_V, "GUI done.\n"); }
/** * @brief Clear information not used for this @a type of stream. * * @param type stream type */ static void MediumPrepare(int type) { switch (type) { case STREAMTYPE_DVD: listMgr(PLAYLIST_DELETE, 0); break; case STREAMTYPE_CDDA: case STREAMTYPE_VCD: case STREAMTYPE_TV: case STREAMTYPE_DVB: listMgr(PLAYLIST_DELETE, 0); case STREAMTYPE_FILE: case STREAMTYPE_STREAM: case STREAMTYPE_PLAYLIST: guiInfo.AudioStreams = 0; guiInfo.Subtitles = 0; guiInfo.Chapters = 0; guiInfo.Angles = 0; break; } }
/** * @brief Initialize the GUI playlist (i.e. import files that had been given * on the command line) or add files "on the fly" (i.e. replace the * current one (a playlist file) by other ones (its content)). * * @param what command (#GUI_PLAYLIST_INIT or #GUI_PLAYLIST_ADD) to be performed * @param playtree MPlayer playtree to read from * @param config MPlayer config context * @param enqueue whether to overwrite GUI playlist (#False) or to append to it (#True) * * @return #True (ok) or #False (error) */ int guiPlaylist(int what, play_tree_t *playtree, m_config_t *config, int enqueue) { play_tree_iter_t *pt_iter; const char *file; int added = False; plItem *curr; pt_iter = pt_iter_create(&playtree, config); if (!pt_iter) return False; switch (what) { case GUI_PLAYLIST_INIT: if (!enqueue) listMgr(PLAYLIST_DELETE, 0); while ((file = pt_iter_get_next_file(pt_iter))) if (add_to_gui_playlist(file, PLAYLIST_ITEM_APPEND)) added = True; uiCurr(); // update filename guiInfo.PlaylistNext = True; if (added) guiInfo.Track = 1; if (enqueue) filename = NULL; // don't start playing break; case GUI_PLAYLIST_ADD: curr = listMgr(PLAYLIST_ITEM_GET_CURR, 0); while ((file = pt_iter_get_next_file(pt_iter))) if (add_to_gui_playlist(file, PLAYLIST_ITEM_INSERT)) added = True; if (curr) listMgr(PLAYLIST_ITEM_SET_CURR, curr); else listMgr(PLAYLIST_ITEM_SET_CURR, listMgr(PLAYLIST_GET, 0)); if (curr && added) listMgr(PLAYLIST_ITEM_DEL_CURR, 0); uiCurr(); // update filename break; } pt_iter_destroy(&pt_iter); return added; }
static void guiInfoMediumClear (int what) { if (what & CLEAR_FILE) { nfree(guiInfo.Filename); nfree(guiInfo.SubtitleFilename); nfree(guiInfo.AudioFilename); listMgr(PLAYLIST_DELETE, 0); } if (what & CLEAR_VCD) guiInfo.Tracks = 0; if (what & CLEAR_DVD) { guiInfo.AudioStreams = 0; guiInfo.Subtitles = 0; guiInfo.Tracks = 0; guiInfo.Chapters = 0; guiInfo.Angles = 0; } }
/** * @brief Append or insert a file to the playlist. * * @param what file to be added * @param how command (#PLAYLIST_ITEM_APPEND or #PLAYLIST_ITEM_INSERT) to be performed * * @return #True (ok) or #False (error) */ int add_to_gui_playlist(const char *what, int how) { const char *file; char *path; plItem *item; if (!what || !*what || (how != PLAYLIST_ITEM_APPEND && how != PLAYLIST_ITEM_INSERT)) return False; file = mp_basename(what); path = strdup(what); if (!path) return False; if (file > what) path[file - what - 1] = 0; else strcpy(path, "."); item = calloc(1, sizeof(*item)); if (!item) { free(path); return False; } mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[list] adding %s/%s\n", path, file); item->name = strdup(file); item->path = path; listMgr(how, item); return True; }
void ShowPlayList( void ) { plItem * next; if ( PlayList ) gtkActive( PlayList ); else PlayList=create_PlayList(); if ( old_path && *old_path ) { char * currentdir = strdup( old_path ); char * tpath,* pos; GtkCTreeNode * node,* nextnode; gboolean leaf; tpath=strdup( "/" ); pos=strtok( currentdir,"/" ); node=gtk_ctree_find_by_row_data_custom( GTK_CTREE( CTDirTree ),NULL,"/",compare_func ); do { char * tpathnew = g_strconcat( tpath,pos,"/",NULL ); free( tpath ); tpath=tpathnew; nextnode=gtk_ctree_find_by_row_data_custom( GTK_CTREE( CTDirTree ),node,tpath,compare_func ); if ( !nextnode ) break; node=nextnode; pos=strtok( NULL,"/" ); gtk_ctree_get_node_info( GTK_CTREE( CTDirTree ),node,NULL,NULL,NULL,NULL,NULL,NULL,&leaf,NULL ); if ( !leaf && pos ) gtk_ctree_expand( GTK_CTREE( CTDirTree ),node ); else { DirNodeType * DirNode; gtk_ctree_select( GTK_CTREE( CTDirTree ),node ); DirNode=gtk_ctree_node_get_row_data( GTK_CTREE( CTDirTree ),node ); current_path=DirNode->path; scan_dir( DirNode->path ); free( CLFileSelected ); CLFileSelected=calloc( 1,NrOfEntrys * sizeof( int ) ); break; } } while( pos ); free( tpath ); free( currentdir ); } else gtk_ctree_select( GTK_CTREE( CTDirTree ),parent ); gtk_clist_freeze( GTK_CLIST( CLSelected ) ); gtk_clist_clear( GTK_CLIST( CLSelected ) ); next = listMgr( PLAYLIST_GET,0 ); if ( next ) { gchar * name, * path; while ( next || next->next ) { char * text[1][3]; text[0][2]=""; name = g_filename_to_utf8( next->name, -1, NULL, NULL, NULL ); path = g_filename_to_utf8( next->path, -1, NULL, NULL, NULL ); text[0][0]=name ? name : next->name; text[0][1]=path ? path : next->path; gtk_clist_append( GTK_CLIST( CLSelected ),text[0] ); g_free( path ); g_free( name ); NrOfSelected++; if ( next->next ) next=next->next; else break; } CLListSelected=calloc( 1,NrOfSelected * sizeof( int ) ); } gtk_clist_thaw( GTK_CLIST( CLSelected ) ); gtk_widget_show( PlayList ); }
/** * @brief Switch to previous playback track. */ void uiPrev(void) { int stop = False, unset = True; plItem *prev = NULL; if (guiInfo.Playing == GUI_PAUSE) return; switch (guiInfo.StreamType) { case STREAMTYPE_CDDA: if (--guiInfo.Track == 0) { guiInfo.Track = 1; stop = True; } break; case STREAMTYPE_VCD: if (--guiInfo.Track == 1) { guiInfo.Track = 2; stop = True; } break; case STREAMTYPE_DVD: if (--guiInfo.Chapter == 0) { guiInfo.Chapter = 1; if (--guiInfo.Track == 0) { guiInfo.Track = 1; stop = True; } } else unset = False; break; case STREAMTYPE_TV: case STREAMTYPE_DVB: if (guiInfo.Playing == GUI_PLAY) mp_input_queue_cmd(mp_input_parse_cmd("tv_step_channel -1")); return; case STREAMTYPE_BINCUE: if (--guiInfo.Track == 0) { guiInfo.Track = 1 + guiInfo.Angles; stop = True; } break; default: prev = listMgr(PLAYLIST_ITEM_GET_PREV, 0); if (prev) { uiSetFileFromPlaylist(prev); guiInfo.PlaylistNext = !guiInfo.Playing; break; } return; } if (stop) uiEvent(evStop, 0); if (guiInfo.Playing == GUI_PLAY) uiEvent(evPlay, 0); else if (!stop && !prev && unset) uiUnsetMedia(True); }
static void plButtonReleased( GtkButton * button,gpointer user_data ) { switch ( (int) user_data ) { case 1: // ok { int i; plItem * item; listMgr( PLAYLIST_DELETE,0 ); for ( i=0;i<NrOfSelected;i++ ) { char * text[3]; item=calloc( 1,sizeof( plItem ) ); gtk_clist_get_text( GTK_CLIST( CLSelected ),i,0,&text[0] ); gtk_clist_get_text( GTK_CLIST( CLSelected ),i,1,&text[1] ); item->name=g_filename_from_utf8( text[0], -1, NULL, NULL, NULL ); if ( !item->name ) item->name = strdup( text[0] ); item->path=g_filename_from_utf8( text[1], -1, NULL, NULL, NULL ); if ( !item->path ) item->path = strdup( text[1] ); listMgr( PLAYLIST_ITEM_APPEND,item ); } item = listMgr( PLAYLIST_ITEM_GET_CURR,0 ); if ( item ) { uiSetFileName( item->path,item->name,STREAMTYPE_FILE ); // setddup( &guiInfo.Filename,item->path,item->name ); // guiInfo.NewPlay=GUI_FILE_NEW; // guiInfo.StreamType=STREAMTYPE_FILE; } } case 0: // cancel HidePlayList(); break; case 2: // remove { int i; int j; int c=0; gtk_signal_handler_block( GTK_OBJECT( CLSelected ),sigSel ); gtk_signal_handler_block( GTK_OBJECT( CLSelected ),sigUnsel ); gtk_signal_handler_block( GTK_OBJECT( CLSelected ),sigEvent ); gtk_clist_freeze( GTK_CLIST( CLSelected ) ); for ( i=0;i<NrOfSelected-c;i++ ) if ( CLListSelected[i] ) { gtk_clist_remove( GTK_CLIST( CLSelected ),i - c ); c++; for ( j=i;j<NrOfSelected-c;j++ ) CLListSelected[i] = CLListSelected[i+1]; } NrOfSelected-=c; gtk_clist_thaw( GTK_CLIST( CLSelected ) ); gtk_signal_handler_unblock( GTK_OBJECT( CLSelected ),sigSel ); gtk_signal_handler_unblock( GTK_OBJECT( CLSelected ),sigUnsel ); gtk_signal_handler_unblock( GTK_OBJECT( CLSelected ),sigEvent ); } break; case 3: // add { int i; void *p; char * itext[1][2]; gchar * cpath; char * text[1][3]; text[0][2]=""; gtk_clist_freeze( GTK_CLIST( CLSelected ) ); for ( i=0;i<NrOfEntrys;i++ ) { if ( CLFileSelected[i] ) { NrOfSelected++; p=realloc( CLListSelected,NrOfSelected * sizeof( int ) ); if ( !p ) NrOfSelected--; else { CLListSelected=p; CLListSelected[NrOfSelected - 1]=0; gtk_clist_get_text( GTK_CLIST( CLFiles ),i,0,(char **)&itext ); cpath=g_filename_to_utf8( current_path, -1, NULL, NULL, NULL ); text[0][0]=itext[0][0]; text[0][1]=cpath ? cpath : current_path; gtk_clist_append( GTK_CLIST( CLSelected ),text[0] ); g_free( cpath ); } } } gtk_clist_thaw( GTK_CLIST( CLSelected ) ); } break; } }
/** * @brief Switch to next playback track. */ void uiNext(void) { int stop = False, unset = True; plItem *next = NULL; if (guiInfo.Playing == GUI_PAUSE) return; switch (guiInfo.StreamType) { case STREAMTYPE_CDDA: case STREAMTYPE_VCD: case STREAMTYPE_BINCUE: if (++guiInfo.Track > guiInfo.Tracks) { guiInfo.Track = guiInfo.Tracks; stop = True; } break; case STREAMTYPE_DVD: if (guiInfo.Chapter++ >= guiInfo.Chapters) { guiInfo.Chapter = 1; if (++guiInfo.Track > guiInfo.Tracks) { guiInfo.Track = guiInfo.Tracks; guiInfo.Chapter = guiInfo.Chapters; stop = True; } } else unset = False; break; case STREAMTYPE_TV: case STREAMTYPE_DVB: if (guiInfo.Playing == GUI_PLAY) mp_input_queue_cmd(mp_input_parse_cmd("tv_step_channel 1")); return; default: next = listMgr(PLAYLIST_ITEM_GET_NEXT, 0); if (next) { uiSetFileFromPlaylist(next); guiInfo.PlaylistNext = !guiInfo.Playing; break; } return; } if (stop) uiEvent(evStop, 0); if (guiInfo.Playing == GUI_PLAY) uiEvent(evPlay, 0); else if (!stop && !next && unset) uiUnsetMedia(True); }
/** * @brief Issue a command to the GUI. * * @note The GUI is controlled by giving it commands. * * @param what command to be performed * @param data pointer to data needed for the command * * @return #True (ok) or #False (error) */ int gui(int what, void *data) { static float last_balance = -1.0f; #ifdef CONFIG_DVDREAD dvd_priv_t *dvd; #endif int idata = (intptr_t)data, msg, state; stream_t *stream = NULL; sh_audio_t *sh_audio; mixer_t *mixer; float l, r, b; plItem *next = NULL; switch (what) { case GUI_SET_CONTEXT: guiInfo.mpcontext = data; break; case GUI_SET_STATE: switch (idata) { case GUI_STOP: case GUI_PLAY: // if ( !gtkShowVideoWindow ) wsWindowVisibility( &guiApp.videoWindow,wsHideWindow ); case GUI_PAUSE: guiInfo.Playing = idata; break; } uiState(); break; case GUI_REDRAW: uiEvent(ivRedraw, 0); if (!guiInfo.Playing || !guiInfo.VideoWindow) wsEvents(); /* else it's handled by the vo driver calling GUI_HANDLE_X_EVENT */ wsMouseAutohide(); gtkEvents(); break; case GUI_RUN_COMMAND: mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[interface] GUI_RUN_COMMAND: %d\n", idata); switch (idata) { case MP_CMD_VO_FULLSCREEN: uiEvent(evFullScreen, True); break; case MP_CMD_PLAY_TREE_STEP: uiEvent(evNext, 0); break; case -MP_CMD_PLAY_TREE_STEP: uiEvent(evPrev, 0); break; case MP_CMD_STOP: uiEvent(evStop, 0); break; case MP_CMD_QUIT: uiEvent(evExit, 0); break; } break; case GUI_RUN_MESSAGE: mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[interface] GUI_RUN_MESSAGE: %s\n", (const char *)data); msg = appFindMessage((const char *)data); if ((msg == evMenu) || appFindItem(msg)) uiEvent(msg, 0); break; case GUI_PREPARE: uiEvent(ivRedraw, True); wsMouseVisibility(&guiApp.videoWindow, wsHideMouseCursor); usec_sleep(20000); wsEvents(); if (guiInfo.MediumChanged == GUI_MEDIUM_NEW) { audio_id = -1; video_id = -1; dvdsub_id = -1; vobsub_id = -1; stream_cache_size = -1; autosync = 0; force_fps = 0; } switch (guiInfo.StreamType) { case STREAMTYPE_FILE: case STREAMTYPE_STREAM: filename = guiInfo.Filename; break; case STREAMTYPE_CDDA: { char tmp[512]; sprintf(tmp, "cdda://%d", guiInfo.Track); uiSetFile(NULL, tmp, SAME_STREAMTYPE); } break; case STREAMTYPE_VCD: { char tmp[512]; sprintf(tmp, "vcd://%d", guiInfo.Track); uiSetFile(NULL, tmp, SAME_STREAMTYPE); } break; case STREAMTYPE_DVD: { char tmp[512]; sprintf(tmp, "dvd://%d", guiInfo.Track); uiSetFile(NULL, tmp, SAME_STREAMTYPE); } #ifdef CONFIG_DVDREAD dvd_chapter = guiInfo.Chapter; dvd_angle = guiInfo.Angle; #endif break; case STREAMTYPE_TV: case STREAMTYPE_DVB: { char tmp[512]; sprintf(tmp, "%s://", guiTV[gui_tv_digital].SchemeName); uiSetFile(NULL, tmp, SAME_STREAMTYPE); } } /* video opts */ if (!video_driver_list) { int i = 0; while (video_out_drivers[i++]) { if (video_out_drivers[i - 1]->control(VOCTRL_GUISUPPORT, NULL) == VO_TRUE) { listSet(&video_driver_list, video_out_drivers[i - 1]->info->short_name); break; } } } if (!video_driver_list && !video_driver_list[0]) { gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_GUI_MSG_VideoOutError); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } { int i = 0; guiInfo.VideoWindow = False; while (video_out_drivers[i++]) { if ((video_driver_list && !gstrcmp(video_driver_list[0], video_out_drivers[i - 1]->info->short_name)) && (video_out_drivers[i - 1]->control(VOCTRL_GUISUPPORT, NULL) == VO_TRUE)) { guiInfo.VideoWindow = True; break; } } } if (video_driver_list && !gstrcmp(video_driver_list[0], "dxr3")) if (guiInfo.StreamType != STREAMTYPE_DVD && guiInfo.StreamType != STREAMTYPE_VCD) if (gtkVfLAVC) add_vf("lavc", NULL); if (gtkVfPP) add_vf("pp", NULL); switch (guiInfo.Rotation) { static const char *argvf[] = { "_oldargs_", NULL, NULL }; case -1: remove_vf("rotate"); remove_vf("flip"); remove_vf("mirror"); break; case 1: argvf[1] = "1"; add_vf("rotate", argvf); remove_vf("flip"); remove_vf("mirror"); break; case 2: argvf[1] = "2"; add_vf("rotate", argvf); remove_vf("flip"); remove_vf("mirror"); break; case 8: remove_vf("rotate"); add_vf("flip", NULL); add_vf("mirror", NULL); break; } /* audio opts */ // if ( ao_plugin_cfg.plugin_list ) { free( ao_plugin_cfg.plugin_list ); ao_plugin_cfg.plugin_list=NULL; } if (gtkAONorm) listRepl(&af_cfg.list, "volnorm", "volnorm"); if (gtkEnableAudioEqualizer) listRepl(&af_cfg.list, "equalizer", "equalizer"); if (gtkAOExtraStereo) { char *name; name = malloc(12 + 20 + 1); snprintf(name, 12 + 20, "extrastereo=%f", gtkAOExtraStereoMul); name[12 + 20] = 0; listRepl(&af_cfg.list, "extrastereo", name); free(name); } if (audio_driver_list && !gstrncmp(audio_driver_list[0], "oss", 3)) { mixer_device = gtkAOOSSMixer; mixer_channel = gtkAOOSSMixerChannel; if (gtkAOOSSDevice) { char *tmp; tmp = calloc(1, strlen(gtkAOOSSDevice) + 7); sprintf(tmp, "oss:%s", gtkAOOSSDevice); listSet(&audio_driver_list, tmp); free(tmp); } } if (audio_driver_list && !gstrncmp(audio_driver_list[0], "alsa", 4)) { mixer_device = gtkAOALSAMixer; mixer_channel = gtkAOALSAMixerChannel; if (gtkAOALSADevice) { char *tmp; tmp = calloc(1, strlen(gtkAOALSADevice) + 14); sprintf(tmp, "alsa:device=%s", gtkAOALSADevice); listSet(&audio_driver_list, tmp); free(tmp); } } if (audio_driver_list && !gstrncmp(audio_driver_list[0], "sdl", 3)) { if (gtkAOSDLDriver) { char *tmp; tmp = calloc(1, strlen(gtkAOSDLDriver) + 10); sprintf(tmp, "sdl:%s", gtkAOSDLDriver); listSet(&audio_driver_list, tmp); free(tmp); } } if (audio_driver_list && !gstrncmp(audio_driver_list[0], "esd", 3)) { if (gtkAOESDDevice) { char *tmp; tmp = calloc(1, strlen(gtkAOESDDevice) + 10); sprintf(tmp, "esd:%s", gtkAOESDDevice); listSet(&audio_driver_list, tmp); free(tmp); } } /* subtitle */ // subdata->filename=gstrdup( guiInfo.SubtitleFilename ); stream_dump_type = 0; if (gtkSubDumpMPSub) stream_dump_type = 4; if (gtkSubDumpSrt) stream_dump_type = 6; gtkSubDumpMPSub = gtkSubDumpSrt = False; /* misc */ if (gtkCacheOn) stream_cache_size = gtkCacheSize; if (gtkAutoSyncOn) autosync = gtkAutoSync; if (guiInfo.AudioFilename) audio_stream = gstrdup(guiInfo.AudioFilename); else if (guiInfo.MediumChanged == GUI_MEDIUM_NEW) nfree(audio_stream); // audio_stream = NULL; guiInfo.MediumChanged = False; ass_enabled = gtkASS.enabled; ass_use_margins = gtkASS.use_margins; ass_top_margin = gtkASS.top_margin; ass_bottom_margin = gtkASS.bottom_margin; break; case GUI_SET_STREAM: if (guiInfo.StreamType == STREAMTYPE_PLAYLIST) guiInfo.mpcontext->file_format = DEMUXER_TYPE_PLAYLIST; else { stream = data; guiInfo.StreamType = stream->type; } switch (guiInfo.StreamType) { case STREAMTYPE_FILE: case STREAMTYPE_STREAM: guiInfo.Tracks = (uintptr_t)listMgr(PLAYLIST_ITEM_GET_POS, 0); break; case STREAMTYPE_CDDA: guiInfo.Tracks = 0; stream_control(stream, STREAM_CTRL_GET_NUM_TITLES, &guiInfo.Tracks); if (stream_control(stream, STREAM_CTRL_GET_CURRENT_TITLE, &guiInfo.Track) == STREAM_OK) guiInfo.Track++; break; case STREAMTYPE_VCD: guiInfo.Tracks = 0; stream_control(stream, STREAM_CTRL_GET_NUM_TITLES, &guiInfo.Tracks); if (stream_control(stream, STREAM_CTRL_GET_CURRENT_TITLE, &guiInfo.Track) == STREAM_OK) guiInfo.Track++; break; case STREAMTYPE_DVD: guiInfo.Tracks = 0; stream_control(stream, STREAM_CTRL_GET_NUM_TITLES, &guiInfo.Tracks); guiInfo.Chapters = 0; stream_control(stream, STREAM_CTRL_GET_NUM_CHAPTERS, &guiInfo.Chapters); guiInfo.Angles = 0; stream_control(stream, STREAM_CTRL_GET_NUM_ANGLES, &guiInfo.Angles); if (stream_control(stream, STREAM_CTRL_GET_CURRENT_TITLE, &guiInfo.Track) == STREAM_OK) guiInfo.Track++; // guiInfo.Chapter will be set by mplayer guiInfo.Angle = 1; stream_control(stream, STREAM_CTRL_GET_ANGLE, &guiInfo.Angle); #ifdef CONFIG_DVDREAD dvd = stream->priv; guiInfo.AudioStreams = dvd->nr_of_channels; memcpy(guiInfo.AudioStream, dvd->audio_streams, sizeof(dvd->audio_streams)); guiInfo.Subtitles = dvd->nr_of_subtitles; memcpy(guiInfo.Subtitle, dvd->subtitles, sizeof(dvd->subtitles)); #endif break; case STREAMTYPE_TV: case STREAMTYPE_DVB: guiInfo.Tracks = guiInfo.Track = 1; break; } break; case GUI_SET_VIDEO: /* video */ guiInfo.sh_video = data; nfree(guiInfo.CodecName); if (guiInfo.sh_video) guiInfo.CodecName = strdup(guiInfo.sh_video->codec->name); state = (isSeekableStreamtype ? btnReleased : btnDisabled); btnSet(evForward10sec, state); btnSet(evBackward10sec, state); btnSet(evForward1min, state); btnSet(evBackward1min, state); btnSet(evForward10min, state); btnSet(evBackward10min, state); btnSet(evSetMoviePosition, state); if (video_driver_list && !gstrcmp(video_driver_list[0], "dxr3") && (((demuxer_t *)mpctx_get_demuxer(guiInfo.mpcontext))->file_format != DEMUXER_TYPE_MPEG_PS) && !gtkVfLAVC) { gtkMessageBox(MSGBOX_FATAL, MSGTR_GUI_MSG_DXR3NeedsLavc); return False; } break; case GUI_SET_AUDIO: sh_audio = data; if (sh_audio) { guiInfo.AudioChannels = sh_audio->channels; guiInfo.AudioPassthrough = (gstrcmp(sh_audio->ad_driver->info->short_name, "hwac3") == 0); if (!guiInfo.sh_video) { guiInfo.VideoWindow = False; guiInfo.VideoWidth = 0; guiInfo.VideoHeight = 0; } } else { guiInfo.AudioChannels = 0; guiInfo.AudioPassthrough = False; } if (guiInfo.AudioPassthrough) btnSet(evSetVolume, btnDisabled); if (guiInfo.AudioChannels < 2 || guiInfo.AudioPassthrough) btnSet(evSetBalance, btnDisabled); if (last_balance < 0.0f) { uiEvent(ivSetVolume, guiInfo.Volume); if (guiInfo.AudioChannels == 2 && !guiInfo.AudioPassthrough) uiEvent(ivSetBalance, guiInfo.Balance); last_balance = guiInfo.Balance; } if (gtkEnableAudioEqualizer) { equalizer_t eq; unsigned int i, j; for (i = 0; i < FF_ARRAY_ELEMS(gtkEquChannels); i++) { for (j = 0; j < FF_ARRAY_ELEMS(*gtkEquChannels); j++) { eq.channel = i; eq.band = j; eq.gain = gtkEquChannels[i][j]; mplayer(MPLAYER_SET_EQUALIZER, 0, &eq); } } } // These must be done here (in the last call from MPlayer before // playback starts) and not in GUI_SETUP_VIDEO_WINDOW, because... // ...without video there will be no call to GUI_SETUP_VIDEO_WINDOW if (!guiInfo.VideoWindow) { wsWindowVisibility(&guiApp.videoWindow, wsHideWindow); btnSet(evFullScreen, gtkLoadFullscreen ? btnPressed : btnReleased); } // ...option variable fullscreen determines whether MPlayer will handle // the window given by WinID as fullscreen window (and will do aspect // scaling then) or not - quite rubbish fullscreen = gtkLoadFullscreen; break; case GUI_SET_VOLUME_BALANCE: mixer = data; mixer_getvolume(mixer, &l, &r); guiInfo.Volume = FFMAX(l, r); mixer_getbalance(mixer, &b); guiInfo.Balance = (b + 1.0) * 50.0; // transform -1..1 to 0..100 if (guiInfo.Balance != last_balance) { uiEvent(ivSetVolume, guiInfo.Volume); last_balance = guiInfo.Balance; } break; case GUI_SETUP_VIDEO_WINDOW: guiInfo.VideoWidth = vo_dwidth; guiInfo.VideoHeight = vo_dheight; if (!guiApp.videoWindow.isFullScreen || !guiApp.videoWindow.Mapped) { if (!guiApp.videoWindow.isFullScreen) wsWindowResize(&guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight); if (!guiApp.videoWindow.Mapped) wsWindowVisibility(&guiApp.videoWindow, wsShowWindow); } if (gtkLoadFullscreen ^ guiApp.videoWindow.isFullScreen) uiEvent(evFullScreen, True); if (guiWinID >= 0) wsWindowMove(&guiApp.mainWindow, True, 0, guiInfo.VideoHeight); wsWindowBackground(&guiApp.videoWindow, -1, -1, -1); break; case GUI_HANDLE_X_EVENT: wsEvent(data); break; case GUI_END_PLAY: guiInfo.sh_video = NULL; btnSet(evSetVolume, btnReleased); btnSet(evSetBalance, btnReleased); uiEvent(ivRedraw, True); if (guiInfo.Playing) { if (!guiInfo.PlaylistNext) { guiInfo.PlaylistNext = True; break; } if (guiInfo.StreamType == STREAMTYPE_CDDA && guiInfo.Track < guiInfo.Tracks) { uiNext(); break; } next = listMgr(PLAYLIST_ITEM_GET_NEXT, 0); } if (next) { uiSetFile(next->path, next->name, STREAMTYPE_FILE); guiInfo.MediumChanged = GUI_MEDIUM_NEW; guiInfo.Track = (uintptr_t)listMgr(PLAYLIST_ITEM_GET_POS, next); } else { if (guiInfo.MediumChanged == GUI_MEDIUM_NEW) break; filename = NULL; if (isPlaylistStreamtype) { plItem *curr = listMgr(PLAYLIST_ITEM_GET_CURR, 0); if (!curr) uiUnsetFile(); else if ((curr != listMgr(PLAYLIST_GET, 0)) && guiInfo.Playing) { curr = listMgr(PLAYLIST_ITEM_SET_CURR, listMgr(PLAYLIST_GET, 0)); uiSetFile(curr->path, curr->name, STREAMTYPE_FILE); guiInfo.Track = 1; } } else if (guiInfo.Playing) { int first = (guiInfo.StreamType == STREAMTYPE_VCD ? 2 : 1); if (guiInfo.Track != first) { uiUnsetMedia(True); guiInfo.Track = first; } if (guiInfo.StreamType == STREAMTYPE_DVD) { guiInfo.Chapter = 1; guiInfo.Angle = 1; } } guiInfo.ElapsedTime = 0; guiInfo.Position = 0.0f; if (gtkShowVideoWindow) { guiInfo.VideoWindow = True; if (!guiApp.videoWindow.isFullScreen) wsWindowResize(&guiApp.videoWindow, guiApp.video.width, guiApp.video.height); if (!guiApp.videoWindow.Mapped) wsWindowVisibility(&guiApp.videoWindow, wsShowWindow); if (gtkLoadFullscreen ^ guiApp.videoWindow.isFullScreen) uiEvent(evFullScreen, False); } else { wsWindowVisibility(&guiApp.videoWindow, wsHideWindow); guiInfo.VideoWindow = False; btnSet(evFullScreen, gtkLoadFullscreen ? btnPressed : btnReleased); } gui(GUI_SET_STATE, (void *)GUI_STOP); wsWindowRedraw(&guiApp.videoWindow); wsMouseVisibility(&guiApp.videoWindow, wsShowMouseCursor); wsEvents(); } break; } return True; }
static void fs_Ok_released( GtkButton * button, gpointer user_data ) { GList * item; int i = 1, l; struct stat fs; gchar * selected; if( ( stat( fsSelectedFile,&fs ) == 0 ) && S_ISDIR( fs.st_mode ) ) { if ( chdir( fsSelectedFile ) != 0 ) return; fsSelectedFile=fsThatDir; CheckDir( fsFNameList ); gtk_entry_set_text( GTK_ENTRY( fsPathCombo ),(unsigned char *)get_current_dir_name_utf8() ); gtk_widget_grab_focus( fsFNameList ); return; } fsSelectedDirectory=(unsigned char *)get_current_dir_name(); switch ( fsType ) { case fsVideoSelector: for (l = 0; fsVideoFilterNames[l][0]; l++) if (strcmp(fsVideoFilterNames[l][0], MSGTR_Filter_Playlists) == 0) break; uiSetFile( fsSelectedDirectory,fsSelectedFile, fsLastVideoFilterSelected == l ? STREAMTYPE_PLAYLIST : STREAMTYPE_FILE ); selected = g_strconcat(fsSelectedDirectory, "/", fsSelectedFile, NULL); if (selected) { listMgr(PLAYLIST_DELETE, 0); add_to_gui_playlist(selected, PLAYLIST_ITEM_APPEND); g_free(selected); } guiInfo.NewPlay=GUI_FILE_NEW; sub_fps=0; fs_PersistantHistory( get_current_dir_name_utf8() ); //totem, write into history break; case fsSubtitleSelector: setddup( &guiInfo.SubtitleFilename,fsSelectedDirectory,fsSelectedFile ); mplayerLoadSubtitle( guiInfo.SubtitleFilename ); break; /* case fsOtherSelector: setddup( &guiInfo.Othername,fsSelectedDirectory,fsSelectedFile ); break;*/ case fsAudioSelector: setddup( &guiInfo.AudioFilename,fsSelectedDirectory,fsSelectedFile ); break; case fsFontSelector: setddup( &font_name,fsSelectedDirectory,fsSelectedFile ); mplayerLoadFont(); if ( Preferences ) gtk_entry_set_text( GTK_ENTRY( prEFontName ),font_name ); break; } HideFileSelect(); item=fsTopList_items; while( item ) { if ( !strcmp( item->data,fsSelectedDirectory ) ) i=0; item=item->next; } if ( i ) fsTopList_items=g_list_prepend( fsTopList_items,(gchar *)get_current_dir_name_utf8() ); if ( uiLoadPlay ) { uiLoadPlay=False; uiEvent( evPlay,0 ); } else gui( GUI_SET_STATE,(void *) GUI_STOP ); }
/** * @brief Manage playlists and URL lists. * * @param cmd task to be performed * @param data list item for the task * * @return pointer to top of list (GET command), * pointer to current list item (ITEM command) or * NULL (DELETE or unknown command) * * @note PLAYLIST_ITEM_GET_POS returns the position number as pointer value * (if @a data is NULL the last position number, i.e. number of items), * and position 0 means "not found" */ void *listMgr(int cmd, void *data) { uintptr_t pos; plItem *pdat = (plItem *)data; urlItem *udat = (urlItem *)data; switch (cmd) { /* playlist */ case PLAYLIST_GET: return plList; case PLAYLIST_ITEM_APPEND: if (plList) { plItem *item = plList; while (item->next) item = item->next; item->next = pdat; pdat->prev = item; pdat->next = NULL; } else { pdat->next = pdat->prev = NULL; plCurrent = plList = pdat; } return plCurrent; case PLAYLIST_ITEM_INSERT: if (plCurrent) { pdat->next = plCurrent->next; if (pdat->next) pdat->next->prev = pdat; pdat->prev = plCurrent; plCurrent->next = pdat; plCurrent = pdat; return plCurrent; } else return listMgr(PLAYLIST_ITEM_APPEND, pdat); case PLAYLIST_ITEM_FIND: if (plList) { plItem *item = plList; do { if (gstrcmp(item->path, pdat->path) == 0 && gstrcmp(item->name, pdat->name) == 0) return item; item = item->next; } while (item); } return NULL; case PLAYLIST_ITEM_SET_CURR: plCurrent = pdat; return plCurrent; case PLAYLIST_ITEM_GET_CURR: return plCurrent; case PLAYLIST_ITEM_GET_POS: pos = 0; if (plList) { uintptr_t i = 0; plItem *item = plList; do { i++; if (item == pdat) { pos = i; break; } item = item->next; } while (item); if (!pdat) pos = i; } return (void *)pos; case PLAYLIST_ITEM_GET_PREV: if (plCurrent && plCurrent->prev) { plCurrent = plCurrent->prev; return plCurrent; } return NULL; case PLAYLIST_ITEM_GET_NEXT: if (plCurrent && plCurrent->next) { plCurrent = plCurrent->next; return plCurrent; } return NULL; case PLAYLIST_ITEM_GET_LAST: if (plList) { plItem *item = plList; while (item->next) item = item->next; return item; } return NULL; case PLAYLIST_ITEM_DEL_CURR: if (plCurrent) { plItem *curr = plCurrent; if (curr->prev) curr->prev->next = curr->next; if (curr->next) curr->next->prev = curr->prev; plCurrent = curr->next; if (curr == plList) plList = plCurrent; free(curr->path); free(curr->name); free(curr->title); free(curr); } return plCurrent; case PLAYLIST_DELETE: while (plList) { plItem *item = plList->next; free(plList->path); free(plList->name); free(plList->title); free(plList); plList = item; } plCurrent = NULL; return NULL; /* URL list */ case URLLIST_GET: return urlList; case URLLIST_ITEM_ADD: if (urlList) { urlItem *item = urlList; while (item) { if (strcmp(udat->url, item->url) == 0) { free(udat->url); free(udat); return NULL; } if (item->next) item = item->next; else { item->next = udat; udat->next = NULL; break; } } } else { udat->next = NULL; urlList = udat; } return udat; case URLLIST_DELETE: while (urlList) { urlItem *item = urlList->next; free(urlList->url); free(urlList); urlList = item; } return NULL; default: return NULL; } }
void uiEventHandling( int msg,float param ) { int iparam = (int)param; mixer_t *mixer = mpctx_get_mixer(guiInfo.mpcontext); switch( msg ) { /* user events */ case evExit: mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); break; case evLoadURL: gtkShow( evLoadURL,NULL ); break; case ivSetAudio: if ( !mpctx_get_demuxer(guiInfo.mpcontext) || audio_id == iparam ) break; mp_property_do("switch_audio",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); break; case ivSetVideo: if ( !mpctx_get_demuxer(guiInfo.mpcontext) || video_id == iparam ) break; mp_property_do("switch_video",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); break; case ivSetSubtitle: mp_property_do("sub",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); break; #ifdef CONFIG_CDDA case ivSetCDTrack: guiInfo.Track=iparam; case evPlayCD: guiInfoMediumClear ( CLEAR_ALL ); guiInfo.StreamType=STREAMTYPE_CDDA; goto play; #endif #ifdef CONFIG_VCD case ivSetVCDTrack: guiInfo.Track=iparam; case evPlayVCD: guiInfoMediumClear ( CLEAR_ALL ); guiInfo.StreamType=STREAMTYPE_VCD; goto play; #endif #ifdef CONFIG_DVDREAD case ivSetDVDSubtitle: dvdsub_id=iparam; uiEventHandling( ivPlayDVD, 0 ); break; case ivSetDVDAudio: audio_id=iparam; uiEventHandling( ivPlayDVD, 0 ); break; case ivSetDVDChapter: guiInfo.Chapter=iparam; uiEventHandling( ivPlayDVD, 0 ); break; case ivSetDVDTitle: guiInfo.Track=iparam; guiInfo.Chapter=1; guiInfo.Angle=1; uiEventHandling( ivPlayDVD, 0 ); break; case evPlayDVD: guiInfo.Track=1; guiInfo.Chapter=1; guiInfo.Angle=1; case ivPlayDVD: guiInfoMediumClear( CLEAR_ALL - CLEAR_DVD ); guiInfo.StreamType=STREAMTYPE_DVD; goto play; #endif case evPlay: case evPlaySwitchToPause: play: if ( ( msg == evPlaySwitchToPause )&&( guiInfo.Playing == GUI_PAUSE ) ) goto NoPause; if ( listMgr( PLAYLIST_ITEM_GET_CURR,0 ) &&( guiInfo.StreamType == STREAMTYPE_FILE ) ) { plItem * next = listMgr( PLAYLIST_ITEM_GET_CURR,0 ); uiSetFileName( next->path,next->name,SAME_STREAMTYPE ); } switch ( guiInfo.StreamType ) { case STREAMTYPE_FILE: case STREAMTYPE_STREAM: case STREAMTYPE_PLAYLIST: guiInfoMediumClear( CLEAR_ALL - CLEAR_FILE ); if ( !guiInfo.Track ) guiInfo.Track=1; guiInfo.NewPlay=GUI_FILE_NEW; break; case STREAMTYPE_CDDA: guiInfoMediumClear( CLEAR_ALL - CLEAR_VCD - CLEAR_FILE ); if ( guiInfo.Playing != GUI_PAUSE ) { if ( !guiInfo.Track ) guiInfo.Track=1; guiInfo.NewPlay=GUI_FILE_SAME; } break; case STREAMTYPE_VCD: guiInfoMediumClear( CLEAR_ALL - CLEAR_VCD - CLEAR_FILE ); if ( guiInfo.Playing != GUI_PAUSE ) { if ( !guiInfo.Track ) guiInfo.Track=2; guiInfo.NewPlay=GUI_FILE_SAME; } break; case STREAMTYPE_DVD: guiInfoMediumClear( CLEAR_ALL - CLEAR_DVD - CLEAR_FILE ); if ( guiInfo.Playing != GUI_PAUSE ) { guiInfo.NewPlay=GUI_FILE_SAME; } break; } uiPlay(); break; case evPause: case evPauseSwitchToPlay: NoPause: uiPause(); break; case evStop: guiInfo.Playing=GUI_STOP; uiState(); break; case evLoadPlay: uiMainAutoPlay=1; // guiInfo.StreamType=STREAMTYPE_FILE; case evLoad: listMgr( PLAYLIST_DELETE,0 ); gtkShow( evLoad,NULL ); break; case evLoadSubtitle: gtkShow( evLoadSubtitle,NULL ); break; case evDropSubtitle: nfree( guiInfo.SubtitleFilename ); mplayerLoadSubtitle( NULL ); break; case evLoadAudioFile: gtkShow( evLoadAudioFile,NULL ); break; case evPrev: uiPrev(); break; case evNext: uiNext(); break; case evPlaylist: gtkShow( evPlaylist,NULL ); break; case evSkinBrowser: gtkShow( evSkinBrowser,skinName ); break; case evAbout: gtkShow( evAbout,NULL ); break; case evPreferences: gtkShow( evPreferences,NULL ); break; case evEqualizer: gtkShow( evEqualizer,NULL ); break; case evForward10min: uiRelSeek( 600 ); break; case evBackward10min: uiRelSeek( -600 );break; case evForward1min: uiRelSeek( 60 ); break; case evBackward1min: uiRelSeek( -60 ); break; case evForward10sec: uiRelSeek( 10 ); break; case evBackward10sec: uiRelSeek( -10 ); break; case evSetMoviePosition: uiAbsSeek( param ); break; case evIncVolume: vo_x11_putkey( wsGrayMul ); break; case evDecVolume: vo_x11_putkey( wsGrayDiv ); break; case evMute: mixer_mute( mixer ); break; case evSetVolume: guiInfo.Volume=param; goto set_volume; case evSetBalance: guiInfo.Balance=param; set_volume: { float l = guiInfo.Volume * ( ( 100.0 - guiInfo.Balance ) / 50.0 ); float r = guiInfo.Volume * ( ( guiInfo.Balance ) / 50.0 ); if ( l > guiInfo.Volume ) l=guiInfo.Volume; if ( r > guiInfo.Volume ) r=guiInfo.Volume; // printf( "!!! v: %.2f b: %.2f -> %.2f x %.2f\n",guiInfo.Volume,guiInfo.Balance,l,r ); mixer_setvolume( mixer,l,r ); } if ( osd_level ) { osd_visible=(GetTimerMS() + 1000) | 1; vo_osd_progbar_type=OSD_VOLUME; vo_osd_progbar_value=( ( guiInfo.Volume ) * 256.0 ) / 100.0; vo_osd_changed( OSDTYPE_PROGBAR ); } break; case evMenu: /*if (guiApp.menuIsPresent) NOTE TO MYSELF: Uncomment only after mouse { pointer and cursor keys work gtkShow( ivHidePopUpMenu,NULL ); with this menu from skin as uiShowMenu( 0,0 ); they do with normal menus. } else*/ gtkShow( ivShowPopUpMenu,NULL ); break; case evIconify: switch ( iparam ) { case 0: wsIconify( guiApp.mainWindow ); break; case 1: wsIconify( guiApp.videoWindow ); break; } break; case evHalfSize: if ( guiInfo.VideoWindow && guiInfo.Playing ) { if ( guiApp.videoWindow.isFullScreen ) { uiFullScreen(); } wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth / 2, guiInfo.VideoHeight / 2 ); wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); btnSet( evFullScreen,btnReleased ); } break; case evDoubleSize: if ( guiInfo.VideoWindow && guiInfo.Playing ) { if ( guiApp.videoWindow.isFullScreen ) { uiFullScreen(); } wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth * 2, guiInfo.VideoHeight * 2 ); wsMoveWindowWithin( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); btnSet( evFullScreen,btnReleased ); } break; case evNormalSize: if ( guiInfo.VideoWindow && guiInfo.Playing ) { if ( guiApp.videoWindow.isFullScreen ) { uiFullScreen(); } wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight ); wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); btnSet( evFullScreen,btnReleased ); break; } else if ( !guiApp.videoWindow.isFullScreen ) break; case evFullScreen: if ( guiInfo.VideoWindow && guiInfo.Playing ) { uiFullScreen(); if ( !guiApp.videoWindow.isFullScreen ) { wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight ); wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); } } if ( guiApp.videoWindow.isFullScreen ) btnSet( evFullScreen,btnPressed ); else btnSet( evFullScreen,btnReleased ); break; case evSetAspect: switch ( iparam ) { case 2: movie_aspect=16.0f / 9.0f; break; case 3: movie_aspect=4.0f / 3.0f; break; case 4: movie_aspect=2.35; break; case 1: default: movie_aspect=-1; } wsClearWindow( guiApp.videoWindow ); if ( guiInfo.StreamType == STREAMTYPE_VCD ) uiEventHandling( evPlayVCD, 0 ); else if ( guiInfo.StreamType == STREAMTYPE_DVD ) uiEventHandling( ivPlayDVD, 0 ); else guiInfo.NewPlay=GUI_FILE_NEW; break; /* timer events */ case ivRedraw: { unsigned now = GetTimerMS(); if ((now > last_redraw_time) && (now < last_redraw_time + GUI_REDRAW_WAIT) && !uiPlaybarFade && (iparam == 0)) break; last_redraw_time = now; } uiMainRender=1; wsPostRedisplay( &guiApp.mainWindow ); wsPostRedisplay( &guiApp.playbarWindow ); break; /* system events */ case evNone: mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] uiEventHandling: evNone\n" ); break; default: mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] uiEventHandling: unknown event %d, param %.2f\n", msg, param ); break; } }
/* this will be used to handle Drag&Drop files */ void uiDandDHandler(int num,char** files) { struct stat buf; int f = 0; char* subtitles = NULL; char* filename = NULL; if (num <= 0) return; /* now fill it with new items */ for(f=0; f < num; f++){ char* str = strdup( files[f] ); plItem* item; url_unescape_string(str, files[f]); if(stat(str,&buf) == 0 && S_ISDIR(buf.st_mode) == 0) { /* this is not a directory so try to play it */ mp_msg( MSGT_GPLAYER,MSGL_V,"Received D&D %s\n",str ); /* check if it is a subtitle file */ { char* ext = strrchr(str,'.'); if (ext) { static char supported[] = "utf/sub/srt/smi/rt//txt/ssa/aqt/"; char* type; int len; if((len=strlen(++ext)) && (type=strstr(supported,ext)) &&\ (type-supported)%4 == 0 && *(type+len) == '/'){ /* handle subtitle file */ nfree(subtitles); subtitles = str; continue; } } } /* clear playlist */ if (filename == NULL) { filename = files[f]; listMgr(PLAYLIST_DELETE,0); } item = calloc(1,sizeof(plItem)); /* FIXME: decompose file name ? */ /* yes -- Pontscho */ if ( strrchr( str,'/' ) ) { char * s = strrchr( str,'/' ); *s=0; s++; item->name = gstrdup( s ); item->path = gstrdup( str ); } else { item->name = strdup(str); item->path = strdup(""); } listMgr(PLAYLIST_ITEM_APPEND,item); } else { mp_msg( MSGT_GPLAYER,MSGL_WARN,MSGTR_NotAFile,str ); } free( str ); } if (filename) { uiSetFileName( NULL,filename,STREAMTYPE_FILE ); if ( guiInfo.Playing == GUI_PLAY ) uiEventHandling( evStop,0 ); uiEventHandling( evPlay,0 ); } if (subtitles) { nfree(guiInfo.SubtitleFilename); guiInfo.SubtitleFilename = subtitles; mplayerLoadSubtitle(guiInfo.SubtitleFilename); } }
/** * @brief Initialize and start the GUI. */ void guiInit(void) { char **argvf; int ret; plItem *playlist; mp_msg(MSGT_GPLAYER, MSGL_V, "GUI init.\n"); /* check options */ if (!cdrom_device) cdrom_device = strdup(DEFAULT_CDROM_DEVICE); if (!dvd_device) dvd_device = strdup(DEFAULT_DVD_DEVICE); #ifdef CONFIG_DXR3 if (!gtkDXR3Device) gtkDXR3Device = strdup("/dev/em8300-0"); #endif if (stream_cache_size > 0) { gtkCacheOn = True; gtkCacheSize = stream_cache_size; } else if (stream_cache_size == 0) gtkCacheOn = False; if (autosync && (autosync != gtkAutoSync)) { gtkAutoSyncOn = True; gtkAutoSync = autosync; } gtkASS.enabled = ass_enabled; gtkASS.use_margins = ass_use_margins; gtkASS.top_margin = ass_top_margin; gtkASS.bottom_margin = ass_bottom_margin; argvf = get_vf("rotate"); guiInfo.Rotation = (argvf && argvf[1] ? atoi(argvf[1]) : -1); /* initialize graphical user interfaces */ wsInit(mDisplay); gtkInit(mDisplayName); /* load skin */ skinDirInHome = get_path("skins"); skinDirInData = MPLAYER_DATADIR "/skins"; mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[interface] skin directory #1: %s\n", skinDirInHome); mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[interface] skin directory #2: %s\n", skinDirInData); if (!skinName) skinName = strdup("default"); ret = skinRead(skinName); if (ret == -1 && strcmp(skinName, "default") != 0) { mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_GUI_MSG_SkinCfgSelectedNotFound, skinName); skinName = strdup("default"); ret = skinRead(skinName); } switch (ret) { case -1: gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_GUI_MSG_SkinCfgNotFound, skinName); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); case -2: gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_GUI_MSG_SkinCfgError, skinName); mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); } /* initialize windows */ if (gui_save_pos) { if (gui_main_pos_x != -3) guiApp.main.x = gui_main_pos_x; if (gui_main_pos_y != -3) guiApp.main.y = gui_main_pos_y; if (gui_video_pos_x != -3) guiApp.video.x = gui_video_pos_x; if (gui_video_pos_y != -3) guiApp.video.y = gui_video_pos_y; } if (WinID > 0) { guiApp.videoWindow.Parent = WinID; guiApp.video.x = 0; guiApp.video.y = 0; } if (guiWinID >= 0) guiApp.mainWindow.Parent = guiWinID; uiMainInit(); // main window must be first! uiVideoInit(); // video window must be second! uiPlaybarInit(); uiMenuInit(); WinID = (Window)guiApp.videoWindow.WindowID; btnValue(evSetVolume, &guiInfo.Volume); btnValue(evSetBalance, &guiInfo.Balance); btnValue(evSetMoviePosition, &guiInfo.Position); if (guiInfo.Position) uiEvent(evSetMoviePosition, guiInfo.Position); wsWindowVisibility(&guiApp.mainWindow, wsShowWindow); if (gtkShowVideoWindow) { wsWindowVisibility(&guiApp.videoWindow, wsShowWindow); guiInfo.VideoWindow = True; if (gtkLoadFullscreen) uiFullScreen(); } else wsWindowBackground(&guiApp.videoWindow, 0, 0, 0); if (gtkLoadFullscreen) btnSet(evFullScreen, btnPressed); guiInfo.Playing = GUI_STOP; playlist = listMgr(PLAYLIST_ITEM_GET_CURR, 0); if (playlist && !filename) { uiSetFile(playlist->path, playlist->name, STREAMTYPE_FILE); guiInfo.Tracks = (uintptr_t)listMgr(PLAYLIST_ITEM_GET_POS, 0); guiInfo.Track = 1; filename = NULL; // don't start playing } if (subdata) setdup(&guiInfo.SubtitleFilename, subdata->filename); orig_fontconfig = font_fontconfig; set_fontconfig(); guiInitialized = True; }