📄 interface.c
字号:
#include <inttypes.h>#include <mplaylib.h>#include <mplaylib.h>#include <mplaylib.h>#include <sys/types.h>#include "wm/ws.h"#include "wm/wsxdnd.h"#include "interface.h"#include "skin/skin.h"#include "mplayer/gtk/eq.h"#include "mplayer/widgets.h"#include "mplayer/gmplayer.h"#include "mplayer/play.h"#include "access_mpcontext.h"#include "app.h"#include "cfg.h"#include "help_mp.h"#include "get_path.h"#include "libvo/x11_common.h"#include "libvo/video_out.h"#include "libvo/font_load.h"#include "libvo/sub.h"#include "input/input.h"#include "libao2/audio_out.h"#include "mixer.h"#include "libaf/af.h"#include "libaf/equalizer.h"#include "libass/ass.h"#include "libass/ass_mp.h"extern af_cfg_t af_cfg;#ifdef USE_ICONV#include <iconv.h>#endif#include "stream/stream.h"#include "libmpdemux/demuxer.h"#include "libmpdemux/stheader.h"#include "libmpcodecs/dec_video.h"#ifdef USE_DVDREAD#include "stream/stream_dvd.h"#endifint vcd_seek_to_track(void *vcd, int track);#include "m_config.h"#include "m_option.h"guiInterface_t guiIntfStruct;int guiWinID=-1;char * gstrcat( char ** dest,const char * src ){ char * tmp = NULL; if ( !src ) return NULL; if ( *dest ) { tmp=malloc( strlen( *dest ) + strlen( src ) + 1 ); if ( tmp ) /* TODO: advanced error handling */ { strcpy( tmp,*dest ); strcat( tmp,src ); free( *dest ); } } else { tmp=malloc( strlen( src ) + 1 ); strcpy( tmp,src ); } *dest=tmp; return tmp;}int gstrcmp( const char * a,const char * b ){ if ( !a && !b ) return 0; if ( !a || !b ) return -1; return strcmp( a,b );}int gstrncmp( const char * a,const char * b,int size ){ if ( !a && !b ) return 0; if ( !a || !b ) return -1; return strncmp( a,b,size );}char * gstrdup( const char * str ){ if ( !str ) return NULL; return strdup( str );}char * gstrchr( char * str,int c ){ if ( !str ) return NULL; return strchr( str,c );}void gfree( void ** p ){ if ( *p == NULL ) return; free( *p ); *p=NULL;}void gset( char ** str, const char * what ){ if ( *str ) { if ( !strstr( *str,what ) ) { gstrcat( str,"," ); gstrcat( str,what ); }} else gstrcat( str,what );}/** * \brief this actually creates a new list containing only one element... */void gaddlist( char *** list,const char * entry ){ int i; if ( (*list) ) { for ( i=0;(*list)[i];i++ ) free( (*list)[i] ); free( (*list) ); } (*list)=malloc( 2 * sizeof(char **) ); (*list)[0]=gstrdup( entry ); (*list)[1]=NULL;}/** * \brief this replaces a string starting with search by replace. * If not found, replace is appended. */void greplace(char ***list, const char *search, const char *replace){ int i = 0; int len = (search) ? strlen(search) : 0; if (*list) { for (i = 0; (*list)[i]; i++) { if (search && (strncmp((*list)[i], search, len) == 0)) { free((*list)[i]); (*list)[i] = gstrdup(replace); return; } } *list = realloc(*list, (i + 2) * sizeof(char *)); } else *list = malloc(2 * sizeof(char *)); (*list)[i] = gstrdup(replace); (*list)[i + 1] = NULL;} void guiInit( void ){ int i; memset( &guiIntfStruct,0,sizeof( guiIntfStruct ) ); guiIntfStruct.Balance=50.0f; guiIntfStruct.StreamType=-1; memset( >kEquChannels,0,sizeof( gtkEquChannels ) );#ifdef HAVE_DXR3 if ( !gtkDXR3Device ) gtkDXR3Device=strdup( "/dev/em8300-0" );#endif if ( stream_cache_size > 0 ) { gtkCacheOn=1; gtkCacheSize=stream_cache_size; } else if ( stream_cache_size == 0 ) gtkCacheOn = 0; if ( autosync && autosync != gtkAutoSync ) { gtkAutoSyncOn=1; gtkAutoSync=autosync; } #ifdef USE_ASS gtkASS.enabled = ass_enabled; gtkASS.use_margins = ass_use_margins; gtkASS.top_margin = ass_top_margin; gtkASS.bottom_margin = ass_bottom_margin;#endif gtkInit();// --- initialize X wsXInit( (void *)mDisplay );// --- load skin skinDirInHome=get_path("skins"); skinDirInHome_obsolete=get_path("Skin"); skinMPlayerDir=MPLAYER_DATADIR "/skins"; skinMPlayerDir_obsolete=MPLAYER_DATADIR "/Skin"; mp_msg( MSGT_GPLAYER,MSGL_V,"SKIN dir 1: '%s'\n",skinDirInHome); mp_msg( MSGT_GPLAYER,MSGL_V,"SKIN dir 1 (obsolete): '%s'\n",skinDirInHome_obsolete); mp_msg( MSGT_GPLAYER,MSGL_V,"SKIN dir 2: '%s'\n",skinMPlayerDir); mp_msg( MSGT_GPLAYER,MSGL_V,"SKIN dir 2 (obsolete): '%s'\n",skinMPlayerDir_obsolete); if ( !skinName ) skinName=strdup( "default" ); i = skinRead( skinName ); if ((i == -1) && strcmp(skinName,"default")) { mp_msg( MSGT_GPLAYER,MSGL_WARN,MSGTR_SKIN_SKINCFG_SelectedSkinNotFound, skinName); skinName=strdup( "default" ); i = skinRead( skinName ); } switch (i) { case -1: mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_SKIN_SKINCFG_SkinNotFound,skinName ); exit( 0 ); case -2: mp_msg( MSGT_GPLAYER,MSGL_ERR,MSGTR_SKIN_SKINCFG_SkinCfgReadError,skinName ); exit( 0 ); }// --- initialize windows if ( ( mplDrawBuffer = malloc( appMPlayer.main.Bitmap.ImageSize ) ) == NULL ) { fprintf( stderr,MSGTR_NEMDB ); exit( 0 ); } if ( gui_save_pos ) { appMPlayer.main.x = gui_main_pos_x; appMPlayer.main.y = gui_main_pos_y; appMPlayer.sub.x = gui_sub_pos_x; appMPlayer.sub.y = gui_sub_pos_y; } if (WinID>0) { appMPlayer.subWindow.Parent=WinID; appMPlayer.sub.x=0; appMPlayer.sub.y=0; } if (guiWinID>=0) appMPlayer.mainWindow.Parent=guiWinID; wsCreateWindow( &appMPlayer.subWindow, appMPlayer.sub.x,appMPlayer.sub.y,appMPlayer.sub.width,appMPlayer.sub.height, wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsShowFrame|wsHideWindow,"MPlayer - Video" ); wsDestroyImage( &appMPlayer.subWindow ); wsCreateImage( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Width,appMPlayer.sub.Bitmap.Height ); wsXDNDMakeAwareness(&appMPlayer.subWindow); mplMenuInit(); mplPBInit(); vo_setwindow( appMPlayer.subWindow.WindowID, appMPlayer.subWindow.wGC );// i=wsHideFrame|wsMaxSize|wsHideWindow;// if ( appMPlayer.mainDecoration ) i=wsShowFrame|wsMaxSize|wsHideWindow; i=wsShowFrame|wsMaxSize|wsHideWindow; wsCreateWindow( &appMPlayer.mainWindow, appMPlayer.main.x,appMPlayer.main.y,appMPlayer.main.width,appMPlayer.main.height, wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,i,"MPlayer" ); wsSetShape( &appMPlayer.mainWindow,appMPlayer.main.Mask.Image ); wsXDNDMakeAwareness(&appMPlayer.mainWindow);#ifdef DEBUG mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] depth on screen: %d\n",wsDepthOnScreen ); mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] parent: 0x%x\n",(int)appMPlayer.mainWindow.WindowID ); mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] sub: 0x%x\n",(int)appMPlayer.subWindow.WindowID );#endif appMPlayer.mainWindow.ReDraw=(void *)mplMainDraw; appMPlayer.mainWindow.MouseHandler=mplMainMouseHandle; appMPlayer.mainWindow.KeyHandler=mplMainKeyHandle; appMPlayer.mainWindow.DandDHandler=mplDandDHandler; appMPlayer.subWindow.ReDraw=(void *)mplSubDraw; appMPlayer.subWindow.MouseHandler=mplSubMouseHandle; appMPlayer.subWindow.KeyHandler=mplMainKeyHandle; appMPlayer.subWindow.DandDHandler=mplDandDHandler; wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); wsClearWindow( appMPlayer.subWindow ); if ( appMPlayer.sub.Bitmap.Image ) wsConvert( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Image,appMPlayer.sub.Bitmap.ImageSize ); btnModify( evSetVolume,guiIntfStruct.Volume ); btnModify( evSetBalance,guiIntfStruct.Balance ); btnModify( evSetMoviePosition,guiIntfStruct.Position ); wsSetIcon( wsDisplay,appMPlayer.mainWindow.WindowID,guiIcon,guiIconMask ); wsSetIcon( wsDisplay,appMPlayer.subWindow.WindowID,guiIcon,guiIconMask ); guiIntfStruct.Playing=0; if ( !appMPlayer.mainDecoration ) wsWindowDecoration( &appMPlayer.mainWindow,0 ); wsVisibleWindow( &appMPlayer.mainWindow,wsShowWindow );#if 0 wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); { XEvent xev; do { XNextEvent( wsDisplay,&xev ); } while ( xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID ); appMPlayer.subWindow.Mapped=wsMapped; } if ( !fullscreen ) fullscreen=gtkLoadFullscreen; if ( fullscreen ) { mplFullScreen(); btnModify( evFullScreen,btnPressed ); }#else if ( !fullscreen ) fullscreen=gtkLoadFullscreen; if ( gtkShowVideoWindow ) { wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); { XEvent xev; do { XNextEvent( wsDisplay,&xev ); } while ( xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID ); appMPlayer.subWindow.Mapped=wsMapped; } if ( fullscreen ) { mplFullScreen(); btnModify( evFullScreen,btnPressed ); } } else { if ( fullscreen ) { wsVisibleWindow( &appMPlayer.subWindow,wsShowWindow ); { XEvent xev; do { XNextEvent( wsDisplay,&xev ); } while ( xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID ); appMPlayer.subWindow.Mapped=wsMapped; } wsVisibleWindow( &appMPlayer.subWindow, wsShowWindow ); mplFullScreen(); btnModify( evFullScreen,btnPressed ); } }#endif mplSubRender=1;// --- if ( filename ) mplSetFileName( NULL,filename,STREAMTYPE_FILE ); if ( plCurrent && !filename ) mplSetFileName( plCurrent->path,plCurrent->name,STREAMTYPE_FILE ); if ( subdata ) guiSetFilename( guiIntfStruct.Subtitlename, subdata->filename ); guiLoadFont();}void guiDone( void ){ mplMainRender=0; mp_msg( MSGT_GPLAYER,MSGL_V,"[GUI] done.\n" ); if ( gui_save_pos ) { gui_main_pos_x=appMPlayer.mainWindow.X; gui_main_pos_y=appMPlayer.mainWindow.Y; gui_sub_pos_x=appMPlayer.subWindow.X; gui_sub_pos_y=appMPlayer.subWindow.Y; } #ifdef USE_ASS ass_enabled = gtkASS.enabled; ass_use_margins = gtkASS.use_margins; ass_top_margin = gtkASS.top_margin; ass_bottom_margin = gtkASS.bottom_margin;#endif cfg_write(); wsXDone();}int guiCMDArray[] = { evLoadPlay, evLoadSubtitle, evAbout, evPlay, evStop, evPlayList, evPreferences, evFullScreen, evSkinBrowser };extern int stream_dump_type;extern int vcd_track;extern m_obj_settings_t * vf_settings;void guiLoadFont( void ){#ifdef HAVE_FREETYPE load_font_ft(vo_image_width, vo_image_height, &vo_font, font_name);#else if ( vo_font ) { int i; if ( vo_font->name ) free( vo_font->name ); if ( vo_font->fpath ) free( vo_font->fpath ); for ( i=0;i<16;i++ ) if ( vo_font->pic_a[i] ) { if ( vo_font->pic_a[i]->bmp ) free( vo_font->pic_a[i]->bmp ); if ( vo_font->pic_a[i]->pal ) free( vo_font->pic_a[i]->pal ); } for ( i=0;i<16;i++ ) if ( vo_font->pic_b[i] ) { if ( vo_font->pic_b[i]->bmp ) free( vo_font->pic_b[i]->bmp ); if ( vo_font->pic_b[i]->pal ) free( vo_font->pic_b[i]->pal ); } free( vo_font ); vo_font=NULL; } if ( font_name ) { vo_font=read_font_desc( font_name,font_factor,0 ); if ( !vo_font ) mp_msg( MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont,font_name ); } else { font_name=gstrdup( get_path( "font/font.desc" ) ); vo_font=read_font_desc( font_name,font_factor,0 ); if ( !vo_font ) { gfree( (void **)&font_name ); font_name=gstrdup(MPLAYER_DATADIR "/font/font.desc" ); vo_font=read_font_desc( font_name,font_factor,0 ); } }#endif}extern mp_osd_obj_t* vo_osd_list;extern char **sub_name;void guiLoadSubtitle( char * name ){ if ( guiIntfStruct.Playing == 0 ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -