📄 fs.c
字号:
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <glob.h>#include <unistd.h>#include "../mplayer.h"#include "mplayer/pixmaps/up.xpm"#include "mplayer/pixmaps/dir.xpm"#include "mplayer/pixmaps/file.xpm"#include "../app.h"#include "../interface.h"#include "../../config.h"#include "../../help_mp.h"#include "../../stream/stream.h"#include "../widgets.h"#include "fs.h"#include "opts.h"#include "common.h"#ifndef __linux__#define get_current_dir_name() getcwd(NULL, PATH_MAX)#endif#ifndef get_current_dir_name extern char * get_current_dir_name( void );#endifgchar * fsSelectedFile = NULL;gchar * fsSelectedDirectory = NULL;unsigned char * fsThatDir = ".";gchar * fsFilter = "*";int fsPressed = 0;int fsType = 0;char * fsVideoFilterNames[][2] = { { "MPEG files (*.mpg,*.mpeg,*.m1v)", "*.mpg,*.mpeg,*.m1v" }, { "VCD/SVCD Images (*.bin)", "*.bin" }, { "VOB files (*.vob)", "*.vob" }, { "AVI files (*.avi)", "*.avi" }, { "DiVX files (*.divx)", "*.divx" }, { "QuickTime files (*.mov,*.qt)", "*.mov,*.qt" }, { "ASF files (*.asf)", "*.asf" }, { "VIVO files (*.viv)", "*.viv" }, { "RealVideo files (*.rm)", "*.rm" }, { "Windows Media Video (*.wmv)", "*.wmv" }, { "OGG Media files (*.ogm)", "*.ogm" }, { "Matroska Media files (*.mkv)", "*.mkv" }, { "Autodesk animations (*.fli,*.flc)", "*.fli,*.flc" }, { "NuppelVideo files (*.nuv)", "*.nuv" }, { "MP3 files (*.mp3,*.mp2)", "*.mp3,*.mp2" }, { "Wave files (*.wav)", "*.wav" }, { "WMA files (*.wma)", "*.wma" }, { "Matroska Audio files (*.mka)", "*.mka" }, { "Audio files", "*.wav,*.ogg,*.mp2,*.mp3,*.wma,*.mka" }, { "Video files", "*.asf,*.avi,*.divx,*.fli,*.flc,*.ogm,*.mpg,*.mpeg,*.m1v,*.mov,*.nuv,*.qt,*.rm,*.vob,*.viv,*.wmv,*.mkv,*.bin" }, { "All files", "*" }, { NULL,NULL } };int fsLastVideoFilterSelected = -1;char * fsSubtitleFilterNames[][2] = { { "UTF (*.utf)", "*.utf" }, { "SUB (*.sub)", "*.sub" }, { "SRT (*.srt)", "*.str" }, { "SMI (*.smi)", "*.smi" }, { "RT (*.rt) ", "*.rt" }, { "TXT (*.txt)", "*.txt" }, { "ASS (*.ass)", "*.ass" }, { "SSA (*.ssa)", "*.ssa" }, { "AQT (*.aqt)", "*.aqt" }, { "Subtitles", "*.utf,*.sub,*.srt,*.smi,*.rt,*.txt,*.ass,*.ssa,*.aqt" }, { "All files", "*" }, { NULL,NULL } };int fsLastSubtitleFilterSelected = -1;char * fsOtherFilterNames[][2] = { { "All files", "*" }, { NULL,NULL } }; char * fsAudioFileNames[][2] = { { "WAV files (*.wav)", "*.wav" }, { "MP3 files (*.mp2, *.mp3)", "*.mp2,*.mp3" }, { "OGG Vorbis files (*.ogg)", "*.ogg" }, { "WMA files (*.wma)", "*.wma" }, { "Matroska Audio files (*.mka)", "*.mka" }, { "Audio files", "*.ogg,*.mp2,*.mp3,*.wav,*.wma,*.mka" }, { "All files", "*" }, { NULL, NULL } };int fsLastAudioFilterSelected = -1;char * fsFontFileNames[][2] = {#ifdef HAVE_FREETYPE { "True Type fonts (*.ttf)", "*.ttf" }, { "Type1 fonts (*.pfb)", "*.pfb" }, { "All fonts", "*.ttf,*.pfb" },#else { "font files (*.desc)", "*.desc" },#endif { "All files", "*" }, { NULL,NULL } };int fsLastFontFilterSelected = -1;GtkWidget * fsFileNamesList;GtkWidget * fsFNameList;GtkWidget * fsFileSelect = NULL;GdkColormap * fsColorMap;GtkWidget * fsOk;GtkWidget * fsUp;GtkWidget * fsCancel;GtkWidget * fsCombo4;GtkWidget * fsPathCombo;GList * fsList_items = NULL;GList * fsTopList_items = NULL;GtkWidget * List;GtkWidget * fsFilterCombo;GtkStyle * style;GdkPixmap * dpixmap;GdkPixmap * fpixmap;GdkBitmap * dmask;GdkBitmap * fmask;static char * Filter( char * name ){ static char tmp[32]; int i,c; for ( i=0,c=0;i < strlen( name );i++ ) { if ( ( name[i] >='a' )&&( name[i] <= 'z' ) ) { tmp[c++]='['; tmp[c++]=name[i]; tmp[c++]=name[i] - 32; tmp[c++]=']'; } else tmp[c++]=name[i]; } tmp[c]=0; return tmp;}void CheckDir( GtkWidget * list,char * directory ){ struct stat fs; int i,c=2; gchar * str[1][2]; GdkPixmap * pixmap; GdkBitmap * mask; glob_t gg; if ( !fsFilter[0] ) return; gtk_widget_hide( list ); gtk_clist_clear( GTK_CLIST( list ) ); str[0][0]=NULL; pixmap=dpixmap; mask=dmask; str[0][0]=NULL; str[0][1]="."; gtk_clist_append( GTK_CLIST( list ),str[0] ); gtk_clist_set_pixmap( GTK_CLIST( list ),0,0,pixmap,mask ); str[0][1]=".."; gtk_clist_append( GTK_CLIST( list ),str[0] ); gtk_clist_set_pixmap( GTK_CLIST( list ),1,0,pixmap,mask ); glob( "*",0,NULL,&gg );// glob( ".*",GLOB_NOSORT | GLOB_APPEND,NULL,&gg ); for( i=0;(unsigned)i<gg.gl_pathc;i++ ) { stat( gg.gl_pathv[i],&fs ); if( !S_ISDIR( fs.st_mode ) ) continue; str[0][1]=gg.gl_pathv[i]; pixmap=dpixmap; mask=dmask; gtk_clist_append( GTK_CLIST( list ),str[0] ); gtk_clist_set_pixmap( GTK_CLIST( list ),c++,0,pixmap,mask ); } globfree( &gg ); if ( strchr( fsFilter,',' ) ) { char tmp[8]; int i,c,glob_param = 0;//printf( "sub item detected.\n" ); for ( i=0,c=0;i<(int)strlen( fsFilter ) + 1;i++,c++ ) { tmp[c]=fsFilter[i]; if ( ( tmp[c] == ',' )||( tmp[c] == '\0' ) ) { tmp[c]=0; c=-1;// printf( "substr: %s\n",tmp ); glob( Filter( tmp ),glob_param,NULL,&gg ); glob_param=GLOB_APPEND; } } } else glob( Filter( fsFilter ),0,NULL,&gg );#if 0 if ( !strcmp( fsFilter,"*" ) ) { char * f = strdup( fsFilter ); int i; for( i=0;i<strlen( f );i++ ) if ( ( f[i] >= 'A' )&&( f[i] <= 'Z' ) ) f[i]+=32; glob( f,GLOB_APPEND,NULL,&gg ); for( i=0;i<strlen( f );i++ ) if ( ( f[i] >= 'a' )&&( f[i] <= 'z' ) ) f[i]-=32; glob( f,GLOB_APPEND,NULL,&gg ); free( f ); }#endif// glob( ".*",GLOB_NOSORT | GLOB_APPEND,NULL,&gg ); pixmap=fpixmap; mask=fmask; for( i=0;(unsigned)i<gg.gl_pathc;i++ ) { stat( gg.gl_pathv[i],&fs ); if( S_ISDIR( fs.st_mode ) ) continue; str[0][1]=gg.gl_pathv[i]; gtk_clist_append( GTK_CLIST( list ),str[0] ); gtk_clist_set_pixmap( GTK_CLIST( list ),c++,0,pixmap,mask ); } globfree( &gg ); gtk_clist_set_column_width( GTK_CLIST( list ),0,17 ); gtk_clist_select_row( GTK_CLIST( list ),0,1 ); gtk_widget_show( list );}void fs_PersistantHistory( char *subject ); /* forward declaration */void ShowFileSelect( int type,int modal ){ int i, k; char * tmp = NULL; if ( fsFileSelect ) gtkActive( fsFileSelect ); else fsFileSelect=create_FileSelect(); fsType=type; switch ( type ) { case fsVideoSelector: gtk_window_set_title( GTK_WINDOW( fsFileSelect ),MSGTR_FileSelect ); fsList_items=NULL; for( i=0;fsVideoFilterNames[i][0];i++ ) fsList_items=g_list_append( fsList_items,fsVideoFilterNames[i][0] ); k = fsLastVideoFilterSelected; gtk_combo_set_popdown_strings( GTK_COMBO( List ),fsList_items ); g_list_free( fsList_items ); gtk_entry_set_text( GTK_ENTRY( fsFilterCombo ),fsVideoFilterNames[k >= 0 ? k : i-2][0] ); tmp=guiIntfStruct.Filename; break; case fsSubtitleSelector: gtk_window_set_title( GTK_WINDOW( fsFileSelect ),MSGTR_SubtitleSelect ); fsList_items=NULL; for( i=0;fsSubtitleFilterNames[i][0];i++ ) fsList_items=g_list_append( fsList_items,fsSubtitleFilterNames[i][0] ); k = fsLastSubtitleFilterSelected; gtk_combo_set_popdown_strings( GTK_COMBO( List ),fsList_items ); g_list_free( fsList_items ); gtk_entry_set_text( GTK_ENTRY( fsFilterCombo ),fsSubtitleFilterNames[k >= 0 ? k : i-2][0] ); tmp=guiIntfStruct.Subtitlename; break; case fsOtherSelector: gtk_window_set_title( GTK_WINDOW( fsFileSelect ),MSGTR_OtherSelect ); fsList_items=NULL; for( i=0;fsOtherFilterNames[i][0];i++ ) fsList_items=g_list_append( fsList_items,fsOtherFilterNames[i][0] ); gtk_combo_set_popdown_strings( GTK_COMBO( List ),fsList_items ); g_list_free( fsList_items ); gtk_entry_set_text( GTK_ENTRY( fsFilterCombo ),fsOtherFilterNames[0][0] ); tmp=guiIntfStruct.Othername; break; case fsAudioSelector: gtk_window_set_title( GTK_WINDOW( fsFileSelect ),MSGTR_AudioFileSelect ); fsList_items=NULL; for( i=0;fsAudioFileNames[i][0];i++ ) fsList_items=g_list_append( fsList_items,fsAudioFileNames[i][0] ); k = fsLastAudioFilterSelected; gtk_combo_set_popdown_strings( GTK_COMBO( List ),fsList_items ); g_list_free( fsList_items ); gtk_entry_set_text( GTK_ENTRY( fsFilterCombo ),fsAudioFileNames[k >= 0 ? k : i-2][0] ); tmp=guiIntfStruct.AudioFile; break; case fsFontSelector: gtk_window_set_title( GTK_WINDOW( fsFileSelect ),MSGTR_FontSelect ); fsList_items=NULL; for( i=0;fsFontFileNames[i][0];i++ ) fsList_items=g_list_append( fsList_items,fsFontFileNames[i][0] ); k = fsLastFontFilterSelected; gtk_combo_set_popdown_strings( GTK_COMBO( List ),fsList_items ); g_list_free( fsList_items ); gtk_entry_set_text( GTK_ENTRY( fsFilterCombo ),fsFontFileNames[k >= 0 ? k : i-2][0] ); tmp=font_name; break; } if ( tmp && tmp[0] ) { struct stat f; char * dir = strdup( tmp ); do { char * c = strrchr( dir,'/' ); stat( dir,&f ); if ( S_ISDIR( f.st_mode ) ) break; if ( c ) *c=0; } while ( strrchr( dir,'/' ) ); if ( dir[0] ) chdir( dir ); free( dir ); } if ( fsTopList_items ) g_list_free( fsTopList_items ); fsTopList_items=NULL; { int i, c = 1; if ( fsType == fsVideoSelector ) { for ( i=0;i < fsPersistant_MaxPos;i++ ) if ( fsHistory[i] ) { fsTopList_items=g_list_append( fsTopList_items,fsHistory[i] ); c=0; } } if ( c ) fsTopList_items=g_list_append( fsTopList_items,(gchar *)get_current_dir_name() ); } if ( getenv( "HOME" ) ) fsTopList_items=g_list_append( fsTopList_items,getenv( "HOME" ) ); fsTopList_items=g_list_append( fsTopList_items,"/home" ); fsTopList_items=g_list_append( fsTopList_items,"/mnt" ); fsTopList_items=g_list_append( fsTopList_items,"/" ); gtk_combo_set_popdown_strings( GTK_COMBO( fsCombo4 ),fsTopList_items ); gtk_window_set_modal( GTK_WINDOW( fsFileSelect ),modal ); gtk_widget_show( fsFileSelect );}void HideFileSelect( void )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -