Mercurial > mplayer.hg
view gui/dialog/fileselect.c @ 36542:1163104c8adb
Improve the dialog for subtitle encodings selection.
Prettify the dialog by moving the option for unicode subtitles up,
and place it below the subtitle encodings combo box.
In this way, everything related to subtitle encodings is grouped
together.
As a result, we'll need the label unconditionally.
author | ib |
---|---|
date | Sun, 19 Jan 2014 14:46:33 +0000 |
parents | 236d31040749 |
children | e5ce1d3bd82c |
line wrap: on
line source
/* * This file is part of MPlayer. * * MPlayer is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MPlayer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with MPlayer; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include <glob.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <unistd.h> #include <sys/stat.h> #include "fileselect.h" #include "dialog.h" #include "preferences.h" #include "tools.h" #include "pixmaps/dir.xpm" #include "pixmaps/file.xpm" #include "pixmaps/up.xpm" #include "gui/interface.h" #include "gui/app/app.h" #include "gui/app/cfg.h" #include "gui/app/gui.h" #include "gui/ui/actions.h" #include "gui/util/list.h" #include "gui/util/mem.h" #include "gui/util/string.h" #define CFG_OLD_FILESELECT #include "gui/app/cfg-old.c" #include "config.h" #include "help_mp.h" #include "mpcommon.h" #include "libavutil/common.h" #include "stream/stream.h" #ifdef __linux__ char *get_current_dir_name(void); #else #include <limits.h> #define get_current_dir_name() getcwd(NULL, PATH_MAX) #endif const char *fsSelectedFile; const char *fsThisDir = "."; const gchar *fsFilter = "*"; int fsType; static gint fsCurrFNameListSelected, fsLastFNameListSelected; char *fsVideoAudioFilterNames[][2] = { { MSGTR_Filter_AVIFiles, "*.avi" }, { MSGTR_Filter_DivXFiles, "*.divx" }, { MSGTR_Filter_FlashVideo, "*.flv" }, { MSGTR_Filter_MP3Files, "*.mp3" }, { MSGTR_Filter_MP4Files, "*.aac,*.f4a,*.f4b,*.f4v,*.m4a,*.m4b,*.m4v,*.mp4" }, { MSGTR_Filter_MPEGFiles, "*.m1v,*.m2v,*.mp2,*.mpe,*.mpeg,*.mpg,*.mpga,*.vdr,*.vob" }, { MSGTR_Filter_MP2TS, "*.bdm,*.bdmv,*.clpi,*.cpi,*.m2t,*.m2ts,*.mpl,*.mpls,*.mts,*.rec,*.trp,*.ts,*.ty" }, { MSGTR_Filter_MatroskaMedia, "*.mka,*.mkv" }, { MSGTR_Filter_OGGMedia, "*.oga,*.ogg,*.ogm,*.ogv,*.ogx,*.spx" }, { MSGTR_Filter_QTMedia, "*.moov,*.mov,*.qt,*.qtvr" }, { MSGTR_Filter_RNMedia, "*.ra,*.rm,*.rmvb,*.rv" }, { MSGTR_Filter_VideoCDImages, "*.bin" }, { MSGTR_Filter_WAVFiles, "*.wav" }, { MSGTR_Filter_WindowsMedia, "*.asf,*.wma,*.wmv" }, { MSGTR_Filter_Playlists, "*.asx,*.m3u,*.m3u8,*.nsc,*.pls,*.ram,*.smi,*.smil,*.sml,*.vlc,*.wax,*.wmx,*.wvx" }, { MSGTR_Filter_AllAudioFiles, "*.aac,*.ac3,*.aif,*.aifc,*.aiff,*.amr,*.ape,*.au,*.awb,*.cdg,*.f4a,*.f4b,*.flac,*.m4a,*.m4b,*.mka,*.mp+,*.mp2,*.mp3,*.mpc,*.mpga,*.mpp,*.nsa,*.oga,*.ogg,*.pcm,*.qcp,*.ra,*.snd,*.spx,*.tak,*.voc,*.vqf,*.w64,*.wav,*.wma,*.wv,*.wvp" }, { MSGTR_Filter_AllVideoFiles, "*.264,*.3g2,*.3ga,*.3gp,*.3gp2,*.3gpp,*.3gpp2,*.asf,*.avi,*.bdm,*.bdmv,*.bin,*.clpi,*.cpi,*.cpk,*.divx,*.dv,*.f4v,*.flc,*.fli,*.flv,*.m1v,*.m2t,*.m2ts,*.m2v,*.m4v,*.mjpg,*.mkv,*.moov,*.mov,*.mp2,*.mp4,*.mpe,*.mpeg,*.mpg,*.mpl,*.mpls,*.mts,*.mxf,*.nsv,*.nuv,*.ogg,*.ogm,*.ogv,*.ogx,*.pva,*.qt,*.qtvr,*.rec,*.rm,*.rmvb,*.roq,*.rv,*.spl,*.str,*.swf,*.trp,*.ts,*.ty,*.vdr,*.viv,*.vivo,*.vob,*.webm,*.wmv,*.y4m" }, { MSGTR_Filter_AllFiles, "*" }, { NULL, NULL } }; int fsLastVideoAudioFilterSelected = -1; char *fsSubtitleFilterNames[][2] = { { "AQTitle (*.aqt)", "*.aqt" }, { "Advanced SubStation Alpha (*.ass)", "*.ass" }, { "JACOSub (*.jss) ", "*.jss" }, { "RealText (*.rt) ", "*.rt" }, { "SAMI (*.smi)", "*.smi" }, { "SubRip (*.srt)", "*.srt" }, { "SubStation Alpha (*.ssa)", "*.ssa" }, { "MicroDVD (*.sub)", "*.sub" }, { "Text (*.txt)", "*.txt" }, { MSGTR_Filter_UTF8Subtitles, "*.utf,*.utf-8,*.utf8" }, { MSGTR_Filter_AllSubtitles, "*.aqt,*.ass,*.jss,*.rt,*.smi,*.srt,*.ssa,*.sub,*.txt,*.utf" }, { MSGTR_Filter_AllFiles, "*" }, { NULL, NULL } }; int fsLastSubtitleFilterSelected = -1; char *fsOtherFilterNames[][2] = { { MSGTR_Filter_AllFiles, "*" }, { NULL, NULL } }; char *fsAudioFileNames[][2] = { { MSGTR_Filter_DDRawAudio, "*.ac3,*.pcm" }, { MSGTR_Filter_MPEGAudio, "*.aac,*.f4a,*.m4a,*.mp2,*.mp3,*.mpga" }, { MSGTR_Filter_MatroskaAudio, "*.mka" }, { MSGTR_Filter_OGGAudio, "*.oga,*.ogg,*.spx" }, { MSGTR_Filter_WAVAudio, "*.wav" }, { MSGTR_Filter_WMAAudio, "*.wma" }, { MSGTR_Filter_AllAudioFiles, "*.aac,*.ac3,*.f4a,*.m4a,*.mka,*.mp2,*.mp3,*.mpga,*.oga,*.ogg,*.pcm,*.spx,*.wav,*.wma" }, { MSGTR_Filter_AllFiles, "*" }, { NULL, NULL } }; int fsLastAudioFilterSelected = -1; char *fsFontFileNames[][2] = { #ifdef CONFIG_FREETYPE { MSGTR_Filter_TTF, "*.ttf" }, { MSGTR_Filter_Type1, "*.pfb" }, { MSGTR_Filter_AllFonts, "*.pfb,*.ttf" }, #else { MSGTR_Filter_FontFiles, "*.desc" }, #endif { MSGTR_Filter_AllFiles, "*" }, { NULL, NULL } }; int fsLastFontFilterSelected = -1; GtkWidget *fsFileNamesList; GtkWidget *fsFNameList; GtkWidget *FileSelector; GdkColormap *fsColorMap; GtkWidget *fsOk; GtkWidget *fsUp; GtkWidget *fsCancel; GtkWidget *fsCombo4; GtkWidget *fsPathCombo; GList *fsList_items; GList *fsTopList_items; GHashTable *fsPathTable; GtkWidget *List; GtkWidget *fsFilterCombo; GtkStyle *style; GdkPixmap *dpixmap; GdkPixmap *fpixmap; GdkBitmap *dmask; GdkBitmap *fmask; static void fs_PersistantHistory(char *subject) { unsigned int i; char *entry; if (!subject) return; for (i = 0; i < FF_ARRAY_ELEMS(fsHistory); i++) if (gstrcmp(fsHistory[i], subject) == 0) { entry = fsHistory[i]; break; } if (i == FF_ARRAY_ELEMS(fsHistory)) { entry = strdup(subject); free(fsHistory[--i]); } for (; i; i--) fsHistory[i] = fsHistory[i - 1]; fsHistory[0] = entry; } static gchar *get_current_dir_name_utf8(void) { char *dir; gchar *utf8dir; dir = get_current_dir_name(); utf8dir = g_filename_display_name(dir); free(dir); return utf8dir; } static GList *fs_AddPath(GList *list, gpointer data, GtkPositionType pos) { if (!g_list_find_custom(list, data, (GCompareFunc)strcmp)) { if (pos == GTK_POS_TOP) list = g_list_prepend(list, data); else list = g_list_append(list, data); } return list; } static void fs_AddPathUtf8(const char *name, GtkPositionType pos) { gchar *utf8name; utf8name = g_filename_display_name(name); fsTopList_items = fs_AddPath(fsTopList_items, utf8name, pos); g_hash_table_insert(fsPathTable, strdup(utf8name), strdup(name)); } static void clist_append_fname(GtkWidget *list, char *fname, GdkPixmap *pixmap, GdkPixmap *mask) { gint pos; gchar *str[2]; str[0] = NULL; str[1] = g_filename_display_name(fname); pos = gtk_clist_append(GTK_CLIST(list), str); gtk_clist_set_row_data_full(GTK_CLIST(list), pos, strdup(fname), free); gtk_clist_set_pixmap(GTK_CLIST(list), pos, 0, pixmap, mask); g_free(str[1]); } static void CheckDir(GtkWidget *list) { struct stat fs; unsigned int i, j, fn; glob_t gg; gchar *filter, **fext; if (!fsFilter[0]) return; gtk_widget_hide(list); gtk_clist_clear(GTK_CLIST(list)); clist_append_fname(list, ".", dpixmap, dmask); clist_append_fname(list, "..", dpixmap, dmask); glob("*", 0, NULL, &gg); for (i = 0; i < gg.gl_pathc; i++) { if ((stat(gg.gl_pathv[i], &fs) != 0) || !S_ISDIR(fs.st_mode)) continue; clist_append_fname(list, gg.gl_pathv[i], dpixmap, dmask); } for (fn = 1, i = 0; fsFilter[i]; i++) if (fsFilter[i] == ',') fn++; filter = g_strdup(fsFilter); fext = calloc(fn, sizeof(gchar *)); if (filter && fext) { for (j = 0, i = 0; filter[i]; i++) { if (filter[i] == '.') fext[j] = filter + i; if (filter[i] == ',') { filter[i] = 0; j++; } } for (i = 0; i < gg.gl_pathc; i++) { char *ext; if ((stat(gg.gl_pathv[i], &fs) != 0) || S_ISDIR(fs.st_mode)) continue; ext = strrchr(gg.gl_pathv[i], '.'); if (ext || !fext[0]) { for (j = 0; j < fn; j++) { if (fext[j] == NULL || strcasecmp(fext[j], ext) == 0) { clist_append_fname(list, gg.gl_pathv[i], fpixmap, fmask); break; } } } } } free(fext); g_free(filter); globfree(&gg); gtk_clist_set_column_width(GTK_CLIST(list), 0, 17); gtk_widget_show(list); } /* ----------------------------------------------- */ static void fs_fsFilterCombo_changed(GtkEditable *editable, gpointer user_data) { const char *str; int i; (void)editable; str = gtk_entry_get_text(GTK_ENTRY(user_data)); switch (fsType) { case FILESELECT_VIDEO_AUDIO: for (i = 0; fsVideoAudioFilterNames[i][0]; i++) if (!strcmp(str, fsVideoAudioFilterNames[i][0])) { fsFilter = fsVideoAudioFilterNames[i][1]; fsLastVideoAudioFilterSelected = i; break; } break; case FILESELECT_SUBTITLE: for (i = 0; fsSubtitleFilterNames[i][0]; i++) if (!strcmp(str, fsSubtitleFilterNames[i][0])) { fsFilter = fsSubtitleFilterNames[i][1]; fsLastSubtitleFilterSelected = i; break; } break; /* case fsOtherSelector: * for( i=0;fsOtherFilterNames[i][0];i++ ) * if( !strcmp( str,fsOtherFilterNames[i][0] ) ) * { fsFilter=fsOtherFilterNames[i][1]; break; } * break;*/ case FILESELECT_AUDIO: for (i = 0; fsAudioFileNames[i][0]; i++) if (!strcmp(str, fsAudioFileNames[i][0])) { fsFilter = fsAudioFileNames[i][1]; fsLastAudioFilterSelected = i; break; } break; case FILESELECT_FONT: for (i = 0; fsFontFileNames[i][0]; i++) if (!strcmp(str, fsFontFileNames[i][0])) { fsFilter = fsFontFileNames[i][1]; fsLastFontFilterSelected = i; break; } break; default: return; } CheckDir(fsFNameList); } static void fs_fsPathCombo_changed(GtkEditable *editable, gpointer user_data) { const unsigned char *str; gchar *dirname; (void)editable; str = gtk_entry_get_text(GTK_ENTRY(user_data)); dirname = g_hash_table_lookup(fsPathTable, str); if (chdir(dirname ? (const unsigned char *)dirname : str) != -1) CheckDir(fsFNameList); } static gboolean fs_fsFNameList_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { GdkEventButton *bevent; gint row, col; (void)user_data; bevent = (GdkEventButton *)event; if (event->type == GDK_BUTTON_RELEASE && bevent->button == 2) { if (gtk_clist_get_selection_info(GTK_CLIST(widget), bevent->x, bevent->y, &row, &col)) { fsSelectedFile = gtk_clist_get_row_data(GTK_CLIST(widget), row); gtk_button_released(GTK_BUTTON(fsOk)); return TRUE; } } return FALSE; } static void fs_fsFNameList_select_row(GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data) { (void)column; (void)user_data; fsCurrFNameListSelected = row; fsSelectedFile = gtk_clist_get_row_data(clist, row); if (event && event->type == GDK_BUTTON_PRESS) gtk_button_released(GTK_BUTTON(fsOk)); } static void fs_Up_released(GtkButton *button, gpointer user_data) { gchar *utf8dir; (void)button; (void)user_data; chdir(".."); CheckDir(fsFNameList); utf8dir = get_current_dir_name_utf8(); gtk_entry_set_text(GTK_ENTRY(fsPathCombo), utf8dir); g_free(utf8dir); fsSelectedFile = fsThisDir; return; } static void fs_Cancel_released(GtkButton *button, gpointer user_data) { (void)button; (void)user_data; gtk_widget_destroy(FileSelector); fsLastFNameListSelected = fsCurrFNameListSelected; } static void fs_Ok_released(GtkButton *button, gpointer user_data) { char *fsSelectedDirectory; int l; struct stat fs; gchar *selected; (void)button; (void)user_data; if ((stat(fsSelectedFile, &fs) == 0) && S_ISDIR(fs.st_mode)) { gchar *utf8dir; if (chdir(fsSelectedFile) != 0) return; CheckDir(fsFNameList); utf8dir = get_current_dir_name_utf8(); gtk_entry_set_text(GTK_ENTRY(fsPathCombo), utf8dir); g_free(utf8dir); gtk_widget_grab_focus(fsFNameList); fsSelectedFile = fsThisDir; return; } fsSelectedDirectory = get_current_dir_name(); switch (fsType) { case FILESELECT_VIDEO_AUDIO: for (l = 0; fsVideoAudioFilterNames[l][0]; l++) if (strcmp(fsVideoAudioFilterNames[l][0], MSGTR_Filter_Playlists) == 0) break; uiSetFile(fsSelectedDirectory, fsSelectedFile, fsLastVideoAudioFilterSelected == 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(fsSelectedDirectory); break; case FILESELECT_SUBTITLE: setddup(&guiInfo.SubtitleFilename, fsSelectedDirectory, fsSelectedFile); mplayerLoadSubtitle(guiInfo.SubtitleFilename); break; /* case fsOtherSelector: * setddup( &guiInfo.Othername,fsSelectedDirectory,fsSelectedFile ); * break;*/ case FILESELECT_AUDIO: setddup(&guiInfo.AudioFilename, fsSelectedDirectory, fsSelectedFile); break; case FILESELECT_FONT: setddup(&font_name, fsSelectedDirectory, fsSelectedFile); mplayerLoadFont(); if (Preferences) gtk_entry_set_text(GTK_ENTRY(prEFontName), font_name); break; } free(fsSelectedDirectory); fs_Cancel_released(NULL, NULL); if (uiLoadPlay) { uiLoadPlay = False; uiEvent(evPlay, 0); } else gui(GUI_SET_STATE, (void *)GUI_STOP); } /** * @brief Handle the escape, return and backspace key depending on the * @a widget it has been pressed on. * * @param widget object which received the signal * @param event GdkEventKey which triggered the signal * @param user_data user data set when the signal handler was connected * * @return TRUE to stop other handlers from being invoked for the event or * FALSE to propagate the event further */ static gboolean fs_key_release_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { (void)user_data; switch (event->key.keyval) { case GDK_Escape: if (GTK_IS_SCROLLED_WINDOW(widget)) gtk_button_released(GTK_BUTTON(fsCancel)); break; case GDK_Return: if (GTK_IS_SCROLLED_WINDOW(widget)) gtk_button_released(GTK_BUTTON(fsOk)); else if (GTK_IS_BUTTON(widget)) gtk_button_released(GTK_BUTTON(widget)); else if (GTK_IS_ENTRY(widget)) gtk_widget_grab_focus(fsFNameList); break; case GDK_BackSpace: if (GTK_IS_SCROLLED_WINDOW(widget)) { gtk_button_released(GTK_BUTTON(fsUp)); gtk_widget_grab_focus(fsFNameList); } break; } return FALSE; } static void fs_Destroy(void) { gtk_widget_destroyed(FileSelector, &FileSelector); g_hash_table_destroy(fsPathTable); g_list_foreach(fsTopList_items, (GFunc)g_free, NULL); g_list_free(fsTopList_items); fsTopList_items = NULL; } static GtkWidget *CreateFileSelect(void) { GtkWidget *vbox4; GtkWidget *hbox4; GtkWidget *vseparator1; GtkWidget *hbox6; GtkWidget *fsFNameListWindow; GtkWidget *hbuttonbox3; GtkWidget *uppixmapwid; GdkPixmap *uppixmap; GdkBitmap *upmask; GtkStyle *upstyle; FileSelector = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize(FileSelector, 512, 300); gtk_widget_set_events(FileSelector, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK); gtk_window_set_title(GTK_WINDOW(FileSelector), MSGTR_FileSelect); gtk_window_set_position(GTK_WINDOW(FileSelector), GTK_WIN_POS_CENTER); gtk_window_set_wmclass(GTK_WINDOW(FileSelector), "FileSelector", MPlayer); fsColorMap = gdk_colormap_get_system(); gtk_widget_realize(FileSelector); gtkAddIcon(FileSelector); style = gtk_widget_get_style(FileSelector); dpixmap = gdk_pixmap_colormap_create_from_xpm_d(FileSelector->window, fsColorMap, &dmask, &style->bg[GTK_STATE_NORMAL], (gchar **)dir_xpm); fpixmap = gdk_pixmap_colormap_create_from_xpm_d(FileSelector->window, fsColorMap, &fmask, &style->bg[GTK_STATE_NORMAL], (gchar **)file_xpm); vbox4 = gtkAddVBox(gtkAddDialogFrame(FileSelector), 0); hbox4 = gtkAddHBox(vbox4, 1); fsCombo4 = gtk_combo_new(); gtk_widget_show(fsCombo4); gtk_box_pack_start(GTK_BOX(hbox4), fsCombo4, TRUE, TRUE, 0); gtk_widget_set_usize(fsCombo4, -2, 20); fsPathCombo = GTK_COMBO(fsCombo4)->entry; gtk_widget_show(fsPathCombo); gtk_widget_set_usize(fsPathCombo, -2, 20); vseparator1 = gtk_vseparator_new(); gtk_widget_show(vseparator1); gtk_box_pack_start(GTK_BOX(hbox4), vseparator1, FALSE, TRUE, 0); gtk_widget_set_usize(vseparator1, 7, 20); upstyle = gtk_widget_get_style(FileSelector); uppixmap = gdk_pixmap_colormap_create_from_xpm_d(FileSelector->window, fsColorMap, &upmask, &upstyle->bg[GTK_STATE_NORMAL], (gchar **)up_xpm); uppixmapwid = gtk_pixmap_new(uppixmap, upmask); gtk_widget_show(uppixmapwid); fsUp = gtk_button_new(); gtk_container_add(GTK_CONTAINER(fsUp), uppixmapwid); gtk_widget_show(fsUp); gtk_box_pack_start(GTK_BOX(hbox4), fsUp, FALSE, FALSE, 0); gtk_widget_set_usize(fsUp, 65, 15); gtkAddHSeparator(vbox4); hbox6 = gtkAddHBox(NULL, 0); gtk_box_pack_start(GTK_BOX(vbox4), hbox6, TRUE, TRUE, 0); fsFNameListWindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(fsFNameListWindow); gtk_box_pack_start(GTK_BOX(hbox6), fsFNameListWindow, TRUE, TRUE, 0); gtk_widget_set_usize(fsFNameListWindow, -2, 145); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(fsFNameListWindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); fsFNameList = gtk_clist_new(2); gtk_container_add(GTK_CONTAINER(fsFNameListWindow), fsFNameList); gtk_clist_set_column_width(GTK_CLIST(fsFNameList), 0, 80); gtk_clist_set_selection_mode(GTK_CLIST(fsFNameList), GTK_SELECTION_BROWSE); gtk_clist_column_titles_hide(GTK_CLIST(fsFNameList)); gtk_clist_set_shadow_type(GTK_CLIST(fsFNameList), GTK_SHADOW_ETCHED_OUT); gtkAddHSeparator(vbox4); List = gtk_combo_new(); gtk_widget_ref(List); gtk_object_set_data_full(GTK_OBJECT(FileSelector), "List", List, (GtkDestroyNotify)gtk_widget_unref); gtk_widget_show(List); gtk_box_pack_start(GTK_BOX(vbox4), List, FALSE, FALSE, 0); gtk_widget_set_usize(List, -2, 20); fsFilterCombo = GTK_COMBO(List)->entry; gtk_widget_show(fsFilterCombo); gtk_entry_set_editable(GTK_ENTRY(fsFilterCombo), FALSE); gtk_widget_set_usize(fsFilterCombo, -2, 20); gtkAddHSeparator(vbox4); hbuttonbox3 = gtkAddHButtonBox(vbox4); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox3), GTK_BUTTONBOX_END); gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbuttonbox3), 10); fsOk = gtkAddButton(MSGTR_Ok, hbuttonbox3); fsCancel = gtkAddButton(MSGTR_Cancel, hbuttonbox3); gtk_signal_connect(GTK_OBJECT(FileSelector), "destroy", GTK_SIGNAL_FUNC(fs_Destroy), NULL); gtk_signal_connect(GTK_OBJECT(fsFNameListWindow), "key-release-event", GTK_SIGNAL_FUNC(fs_key_release_event), NULL); gtk_signal_connect(GTK_OBJECT(fsFilterCombo), "changed", GTK_SIGNAL_FUNC(fs_fsFilterCombo_changed), fsFilterCombo); gtk_signal_connect(GTK_OBJECT(fsFilterCombo), "key-release-event", GTK_SIGNAL_FUNC(fs_key_release_event), NULL); gtk_signal_connect(GTK_OBJECT(fsPathCombo), "changed", GTK_SIGNAL_FUNC(fs_fsPathCombo_changed), fsPathCombo); gtk_signal_connect(GTK_OBJECT(fsPathCombo), "key-release-event", GTK_SIGNAL_FUNC(fs_key_release_event), NULL); gtk_signal_connect(GTK_OBJECT(fsUp), "released", GTK_SIGNAL_FUNC(fs_Up_released), fsFNameList); gtk_signal_connect(GTK_OBJECT(fsUp), "key-release-event", GTK_SIGNAL_FUNC(fs_key_release_event), NULL); gtk_signal_connect(GTK_OBJECT(fsOk), "released", GTK_SIGNAL_FUNC(fs_Ok_released), fsCombo4); gtk_signal_connect(GTK_OBJECT(fsOk), "key-release-event", GTK_SIGNAL_FUNC(fs_key_release_event), NULL); gtk_signal_connect(GTK_OBJECT(fsCancel), "released", GTK_SIGNAL_FUNC(fs_Cancel_released), NULL); gtk_signal_connect(GTK_OBJECT(fsCancel), "key-release-event", GTK_SIGNAL_FUNC(fs_key_release_event), NULL); gtk_signal_connect(GTK_OBJECT(fsFNameList), "select-row", (GtkSignalFunc)fs_fsFNameList_select_row, NULL); gtk_signal_connect(GTK_OBJECT(fsFNameList), "event", (GtkSignalFunc)fs_fsFNameList_event, NULL); return FileSelector; } void ShowFileSelector(int type) { int i, k, fsMedium; char *tmp = NULL, *dir = NULL; const gchar *fname; struct stat f; if (FileSelector) gtkRaise(FileSelector); else FileSelector = CreateFileSelect(); fsType = type; switch (type) { case FILESELECT_VIDEO_AUDIO: gtk_window_set_title(GTK_WINDOW(FileSelector), MSGTR_FileSelect); fsList_items = NULL; for (i = 0; fsVideoAudioFilterNames[i][0]; i++) fsList_items = g_list_append(fsList_items, fsVideoAudioFilterNames[i][0]); k = fsLastVideoAudioFilterSelected; gtk_combo_set_popdown_strings(GTK_COMBO(List), fsList_items); g_list_free(fsList_items); gtk_entry_set_text(GTK_ENTRY(fsFilterCombo), fsVideoAudioFilterNames[k >= 0 ? k : i - 2][0]); //tmp=guiInfo.Filename; break; case FILESELECT_SUBTITLE: gtk_window_set_title(GTK_WINDOW(FileSelector), 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 = guiInfo.SubtitleFilename; break; /* case fsOtherSelector: * gtk_window_set_title( GTK_WINDOW( FileSelector ),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=guiInfo.Othername; * break;*/ case FILESELECT_AUDIO: gtk_window_set_title(GTK_WINDOW(FileSelector), 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 = guiInfo.AudioFilename; break; case FILESELECT_FONT: gtk_window_set_title(GTK_WINDOW(FileSelector), 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; } fsMedium = (fsType == FILESELECT_VIDEO_AUDIO || fsType == FILESELECT_SUBTITLE || fsType == FILESELECT_AUDIO); if (tmp && tmp[0] && !strstr(tmp, "://")) { dir = strdup(tmp); do { char *c = strrchr(dir, '/'); if ((stat(dir, &f) == 0) && S_ISDIR(f.st_mode)) break; if (c) *c = 0; } while (strrchr(dir, '/')); if (!dir[0]) nfree(dir); } fsPathTable = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); { unsigned int i, c = 1; if (fsMedium) { for (i = 0; i < FF_ARRAY_ELEMS(fsHistory); i++) if (fsHistory[i]) { fname = cfg_old_filename_from_utf8(fsHistory[i]); fs_AddPathUtf8(fname, GTK_POS_BOTTOM); if (c) c = gstrcmp(dir, fname); } } if (c && dir) fs_AddPathUtf8(dir, GTK_POS_TOP); } free(dir); fname = getenv("HOME"); if (fname) fs_AddPathUtf8(fname, GTK_POS_BOTTOM); else fsTopList_items = fs_AddPath(fsTopList_items, g_strdup("/home"), GTK_POS_BOTTOM); if (stat("/media", &f) == 0) fsTopList_items = fs_AddPath(fsTopList_items, g_strdup("/media"), GTK_POS_BOTTOM); if (stat("/mnt", &f) == 0) fsTopList_items = fs_AddPath(fsTopList_items, g_strdup("/mnt"), GTK_POS_BOTTOM); fsTopList_items = fs_AddPath(fsTopList_items, g_strdup("/"), GTK_POS_BOTTOM); gtk_combo_set_popdown_strings(GTK_COMBO(fsCombo4), fsTopList_items); gtk_widget_grab_focus(fsFNameList); if (fsLastFNameListSelected + 1 > ((GtkCList *)fsFNameList)->rows) fsLastFNameListSelected = 0; ((GtkCList *)fsFNameList)->focus_row = fsLastFNameListSelected; gtk_clist_select_row(GTK_CLIST(fsFNameList), fsLastFNameListSelected, 1); fsLastFNameListSelected = 0; gtk_widget_show(FileSelector); }