// **************************************************************************
// Misc Dialog
-#if FILEPATH_MAX < 16536
-#define DialogMaxFileName 16536
-#else
-#define DialogMaxFileName FILEPATH_MAX
-#endif
-static char DialogFileNameBuff[DialogMaxFileName];
-static char *DlgFileOpen(HWND hwnd, const char *title, const char *filter, const char *dir)
-{
- OPENFILENAME ofn;
- memset(DialogFileNameBuff, 0, sizeof(DialogFileNameBuff));
- memset(&ofn, 0, sizeof(OPENFILENAME));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = hwnd;
- ofn.hInstance = hInst ;
- ofn.lpstrFilter = filter;
- ofn.lpstrCustomFilter = NULL;
- ofn.nMaxCustFilter = 0;
- ofn.nFilterIndex = 1 ;
- ofn.lpstrFile = DialogFileNameBuff;
- ofn.nMaxFile = sizeof(DialogFileNameBuff) / sizeof(DialogFileNameBuff[0]);
- ofn.lpstrFileTitle = 0;
- ofn.nMaxFileTitle = 0;
- ofn.lpstrInitialDir = dir;
- ofn.lpstrTitle = title;
- ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST
- | OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_READONLY;
- ofn.lpstrDefExt = 0;
- ofn.lCustData = 0;
- ofn.lpfnHook = 0;
- ofn.lpTemplateName= 0;
-
- if(GetOpenFileName(&ofn)==TRUE)
- return DialogFileNameBuff;
- else
- return NULL;
-}
static void DlgMidiFileOpen(HWND hwnd)
{
- char *dir, *file;
- const char *filter,
- filter_en[] = "timidity file\0*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36;*.rmi;*.mld;*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni;*.lzh;*.zip;*.gz;*.pls;*.m3u;*.asx\0"
- "midi file\0*.mid;*.midi;*.smf;*.rmi\0"
- "rcp file\0*.rcp;*.r36;*.g18;*.g36\0"
- "mfi file\0*.mld\0"
- "mod file\0*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni\0"
- "archive file\0*.lzh;*.zip;*.gz\0"
- "playlist file\0*.pls;*.m3u;*.asx\0"
- "all files\0*.*\0"
- "\0\0",
- filter_jp[] = "Timidity \83T\83|\81[\83g\8dÏ\82Ý\83t\83@\83C\83\8b\0*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36;*.rmi;*.mld;*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni;*.lzh;*.zip;*.gz;*.pls;*.m3u;*.asx\0"
- "SMF/RMID (*.mid;*.midi;*.smf;*.rmi)\0*.mid;*.midi;*.smf;*.rmi\0"
- "RCP (*.rcp;*.r36;*.g18;*.g36)\0*.rcp;*.r36;*.g18;*.g36\0"
- "MFi (*.mld)\0*.mld\0"
- "MOD (*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni)\0*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni\0"
- "\88³\8fk\8dÏ\82Ý\83A\81[\83J\83C\83u (*.lzh;*.zip;*.gz)\0*.lzh;*.zip;*.gz\0"
- "\83v\83\8c\83C\83\8a\83X\83g\83t\83@\83C\83\8b (*.pls;*.m3u;*.asx)\0*.pls;*.m3u;*.asx\0"
- "\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)\0*.*\0"
- "\0\0";
+ static char files[FILEPATH_MAX];
+ const COMDLG_FILTERSPEC *filter,
+ filter_en[] = {
+ {L"Timidity Files (*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36;*.rmi;*.mld;*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni;*.lzh;*.zip;*.gz;*.pls;*.m3u;*.asx)", L"*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36;*.rmi;*.mld;*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni;*.lzh;*.zip;*.gz;*.pls;*.m3u;*.asx"},
+ {L"SMF/RMID (*.mid;*.midi;*.smf;*.rmi)", L"*.mid;*.midi;*.smf;*.rmi"},
+ {L"RCP (*.rcp;*.r36;*.g18;*.g36)", L"*.rcp;*.r36;*.g18;*.g36"},
+ {L"MFi (*.mld)", L"*.mld"},
+ {L"MOD (*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni)", L"*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni"},
+ {L"Archive Files (*.lzh;*.zip;*.gz)", L"*.lzh;*.zip;*.gz"},
+ {L"Playlist Files (*.pls;*.m3u;*.asx)", L"*.pls;*.m3u;*.asx"},
+ {L"All Files (*.*)", L"*.*"}
+ },
+ filter_jp[] = {
+ {L"Timidity \83T\83|\81[\83g\8dÏ\82Ý\83t\83@\83C\83\8b (*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36;*.rmi;*.mld;*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni;*.lzh;*.zip;*.gz;*.pls;*.m3u;*.asx)", L"*.mid;*.smf;*.rcp;*.r36;*.g18;*.g36;*.rmi;*.mld;*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni;*.lzh;*.zip;*.gz;*.pls;*.m3u;*.asx"},
+ {L"SMF/RMID (*.mid;*.midi;*.smf;*.rmi)", L"*.mid;*.midi;*.smf;*.rmi"},
+ {L"RCP (*.rcp;*.r36;*.g18;*.g36)", L"*.rcp;*.r36;*.g18;*.g36"},
+ {L"MFi (*.mld)", L"*.mld"},
+ {L"MOD (*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni)", L"*.mod;*.xm;*.s3m;*.it;*.669;*.amf;*.dsm;*.far;*.gdm;*.imf;*.med;*.mtm;*.stm;*.stx;*.ult;*.uni"},
+ {L"\88³\8fk\8dÏ\82Ý\83A\81[\83J\83C\83u (*.lzh;*.zip;*.gz)", L"*.lzh;*.zip;*.gz"},
+ {L"\83v\83\8c\83C\83\8a\83X\83g\83t\83@\83C\83\8b (*.pls;*.m3u;*.asx)", L"*.pls;*.m3u;*.asx"},
+ {L"\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)", L"*.*"}
+ };
if ( PlayerLanguage == LANGUAGE_JAPANESE )
filter = filter_jp;
if(w32g_lock_open_file)
return;
- if(MidiFileOpenDir[0])
- dir = MidiFileOpenDir;
- else
- dir = NULL;
-
- if((file = DlgFileOpen(hwnd, NULL, filter, dir)) == NULL)
+ if(!ShowFileDialog(FILEDIALOG_OPEN_MULTIPLE_FILES, hwnd, NULL, MidiFileOpenDir, files, sizeof(filter_en) / sizeof(filter_en[0]), filter))
return;
w32g_lock_open_file = 1;
#ifdef EXT_CONTROL_MAIN_THREAD
- w32g_ext_control_main_thread(RC_EXT_LOAD_FILE, (ptr_size_t)file);
+ w32g_ext_control_main_thread(RC_EXT_LOAD_FILE, (ptr_size_t)files);
#else
- w32g_send_rc(RC_EXT_LOAD_FILE, (ptr_size_t)file);
+ w32g_send_rc(RC_EXT_LOAD_FILE, (ptr_size_t)files);
#endif
}
-static volatile LPITEMIDLIST itemidlist_pre = NULL;
-int CALLBACK DlgDirOpenBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
-{
- switch(uMsg){
- case BFFM_INITIALIZED:
- if(itemidlist_pre)
- SendMessage(hwnd,BFFM_SETSELECTION,(WPARAM)0,(LPARAM)itemidlist_pre);
- break;
- default:
- break;
- }
- return 0;
-}
-
static void DlgDirOpen(HWND hwnd)
{
- static int initflag = 1;
- static char biBuffer[FILEPATH_MAX];
static char Buffer[FILEPATH_MAX];
- BROWSEINFO bi;
- LPITEMIDLIST itemidlist;
+ LPCWSTR pTitle;
if(w32g_lock_open_file)
return;
- if(initflag==1){
- biBuffer[0] = '\0';
- initflag = 0;
- }
- memset(&bi, 0, sizeof(bi));
- bi.hwndOwner = hwnd;
- bi.pidlRoot = NULL;
- bi.pszDisplayName = biBuffer;
if ( PlayerLanguage == LANGUAGE_JAPANESE )
- bi.lpszTitle = "MIDI \83t\83@\83C\83\8b\82Ì\82 \82é\83f\83B\83\8c\83N\83g\83\8a\82ð\8cä\91I\91ð\82È\82³\82ê\82Ü\82·\82æ\82¤\81B";
+ pTitle = L"MIDI \83t\83@\83C\83\8b\82Ì\82 \82é\83f\83B\83\8c\83N\83g\83\8a\82ð\8cä\91I\91ð\82È\82³\82ê\82Ü\82·\82æ\82¤\81B";
else
- bi.lpszTitle = "Select a directory with MIDI files.";
- bi.ulFlags = 0;
- bi.lpfn = DlgDirOpenBrowseCallbackProc;
- bi.lParam = 0;
- bi.iImage = 0;
- itemidlist = SHBrowseForFolder(&bi);
- if(!itemidlist)
- return; /* Cancel */
- memset(Buffer, 0, sizeof(Buffer));
- SHGetPathFromIDList(itemidlist, Buffer);
- strncpy(biBuffer, Buffer, sizeof(Buffer) - 1);
- if(itemidlist_pre)
- CoTaskMemFree(itemidlist_pre);
- itemidlist_pre = itemidlist;
+ pTitle = L"Select a directory with MIDI files.";
+
+ if (!ShowFileDialog(FILEDIALOG_OPEN_FOLDER, hwnd, pTitle, MidiFileOpenDir, Buffer, 0, NULL))
+ return;
+
w32g_lock_open_file = 1;
directory_form(Buffer);
#ifdef EXT_CONTROL_MAIN_THREAD
static void DlgPlaylistOpen(HWND hwnd)
{
- char *dir, *file;
- const char* filter,
- filter_en[] =
- "playlist file\0*.pls;*.m3u;*.asx\0"
- "all files\0*.*\0"
- "\0\0",
- filter_jp[] =
- "\83v\83\8c\83C\83\8a\83X\83g\83t\83@\83C\83\8b (*.pls;*.m3u;*.asx)\0*.pls;*.m3u;*.asx\0"
- "\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)\0*.*\0"
- "\0\0";
+ static char file[FILEPATH_MAX];
+ const COMDLG_FILTERSPEC *filter,
+ filter_en[] = {
+ {L"Playlist Files (*.pls;*.m3u;*.asx)", L"*.pls;*.m3u;*.asx"},
+ {L"All Files (*.*)", L"*.*"}
+ },
+ filter_jp[] = {
+ {L"\83v\83\8c\83C\83\8a\83X\83g\83t\83@\83C\83\8b (*.pls;*.m3u;*.asx)", L"*.pls;*.m3u;*.asx"},
+ {L"\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)", L"*.*"}
+ };
if (PlayerLanguage == LANGUAGE_JAPANESE)
filter = filter_jp;
if(w32g_lock_open_file)
return;
- if(MidiFileOpenDir[0])
- dir = MidiFileOpenDir;
- else
- dir = NULL;
-
- if((file = DlgFileOpen(hwnd, NULL, filter, dir)) == NULL)
+ if(!ShowFileDialog(FILEDIALOG_OPEN_MULTIPLE_FILES, hwnd, NULL, PlaylistFileOpenDir, file, sizeof(filter_en) / sizeof(filter_en[0]), filter))
return;
w32g_lock_open_file = 1;
static void DlgPlaylistSave(HWND hwnd)
{
- OPENFILENAME ofn;
- static char *dir;
- const char* filter,
- filter_en[] =
- "playlist file\0*.pls;*.m3u;*.asx\0"
- "all files\0*.*\0"
- "\0\0",
- filter_jp[] =
- "\83v\83\8c\83C\83\8a\83X\83g\83t\83@\83C\83\8b (*.pls;*.m3u;*.asx)\0*.pls;*.m3u;*.asx\0"
- "\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)\0*.*\0"
- "\0\0";
+ static char file[FILEPATH_MAX];
+ const COMDLG_FILTERSPEC *filter,
+ filter_en[] = {
+ {L"Playlist Files (*.pls;*.m3u;*.asx)", L"*.pls;*.m3u;*.asx"},
+ {L"All Files (*.*)", L"*.*"}
+ },
+ filter_jp[] = {
+ {L"\83v\83\8c\83C\83\8a\83X\83g\83t\83@\83C\83\8b (*.pls;*.m3u;*.asx)", L"*.pls;*.m3u;*.asx"},
+ {L"\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)", L"*.*"}
+ };
if (PlayerLanguage == LANGUAGE_JAPANESE)
filter = filter_jp;
if(w32g_lock_open_file)
return;
- if(MidiFileOpenDir[0])
- dir = MidiFileOpenDir;
- else
- dir = NULL;
-
- memset(DialogFileNameBuff, 0, sizeof(DialogFileNameBuff));
- memset(&ofn, 0, sizeof(OPENFILENAME));
- ofn.lStructSize = sizeof(OPENFILENAME);
- ofn.hwndOwner = hwnd;
- ofn.hInstance = hInst;
- ofn.lpstrFilter = filter;
- ofn.lpstrCustomFilter = NULL;
- ofn.nMaxCustFilter = 0;
- ofn.nFilterIndex = 1 ;
- ofn.lpstrFile = DialogFileNameBuff;
- ofn.nMaxFile = sizeof(DialogFileNameBuff);
- ofn.lpstrFileTitle = NULL;
- ofn.nMaxFileTitle = 0;
- ofn.lpstrInitialDir = dir;
- ofn.lpstrTitle = "Save Playlist File";
- ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_HIDEREADONLY;
-// ofn.lpstrDefExt = 0;
- ofn.lpstrDefExt = "pls";
- ofn.lCustData = 0;
- ofn.lpfnHook = 0;
- ofn.lpTemplateName= 0;
-
- if(GetSaveFileName(&ofn) != TRUE)
- return;
- if(!CheckOverWrite(hwnd, DialogFileNameBuff))
+ if (!ShowFileDialog(FILEDIALOG_SAVE_FILE, hwnd, NULL, PlaylistFileOpenDir, file, sizeof(filter_en) / sizeof(filter_en[0]), filter))
return;
+
+ //if(!CheckOverWrite(hwnd, file))
+ // return;
w32g_lock_open_file = 1;
#ifdef EXT_CONTROL_MAIN_THREAD
- w32g_ext_control_main_thread(RC_EXT_SAVE_PLAYLIST, (ptr_size_t)DialogFileNameBuff);
+ w32g_ext_control_main_thread(RC_EXT_SAVE_PLAYLIST, (ptr_size_t)file);
#else
- w32g_send_rc(RC_EXT_SAVE_PLAYLIST, (ptr_size_t)DialogFileNameBuff);
+ w32g_send_rc(RC_EXT_SAVE_PLAYLIST, (ptr_size_t)file);
#endif
}
static int DlgOpenISIniFile(char *Filename, HWND hwnd)
{
- OPENFILENAMEA ofn;
- char filename[FILEPATH_MAX];
- static char dir[FILEPATH_MAX];
- int res;
- const char *filter,
- *filter_en = "Ini file (*.ini)\0*.ini\0"
- "All files (*.*)\0*.*\0"
- "\0\0",
- *filter_jp = "Ini \83t\83@\83C\83\8b (*.ini)\0*.ini\0"
- "\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)\0*.*\0"
- "\0\0";
- const char *title,
- *title_en = "Open Ini File",
- *title_jp = "Ini\83t\83@\83C\83\8b\82ð\8aJ\82";
+ char filename[FILEPATH_MAX];
+ const COMDLG_FILTERSPEC *filter,
+ filter_en[] = {
+ {L"Ini file (*.ini)", L"*.ini"},
+ {L"All files (*.*)", L"*.*"}
+ },
+ filter_jp[] = {
+ {L"Ini \83t\83@\83C\83\8b (*.ini)", L"*.ini"},
+ {L"\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)", L"*.*"}
+ };
+ LPCWSTR title,
+ title_en = L"Open Ini File",
+ title_jp = L"Ini\83t\83@\83C\83\8b\82ð\8aJ\82";
if (PlayerLanguage == LANGUAGE_JAPANESE) {
filter = filter_jp;
}
if (ISIniFileOpenDir[0] == '\0')
strncpy(ISIniFileOpenDir, ConfigFileOpenDir, FILEPATH_MAX);
- strncpy(dir, ISIniFileOpenDir, FILEPATH_MAX);
- dir[FILEPATH_MAX - 1] = '\0';
strncpy(filename, Filename, FILEPATH_MAX);
filename[FILEPATH_MAX - 1] = '\0';
if (strlen(filename) > 0 && IS_PATH_SEP(filename[strlen(filename) - 1])) {
strlcat(filename, "int_synth.ini", FILEPATH_MAX);
}
- ZeroMemory(&ofn, sizeof(OPENFILENAMEA));
- ofn.lStructSize = sizeof(OPENFILENAMEA);
- ofn.hwndOwner = hwnd;
- ofn.hInstance = hInst;
- ofn.lpstrFilter = filter;
- ofn.lpstrCustomFilter = NULL;
- ofn.nMaxCustFilter = 0;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = filename;
- ofn.nMaxFile = FILEPATH_MAX;
- ofn.lpstrFileTitle = NULL;
- ofn.nMaxFileTitle = 0;
- if (dir[0] != '\0')
- ofn.lpstrInitialDir = dir;
- else
- ofn.lpstrInitialDir = 0;
- ofn.lpstrTitle = title;
- ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER
- | OFN_READONLY | OFN_HIDEREADONLY;
- ofn.lpstrDefExt = 0;
- ofn.lCustData = 0;
- ofn.lpfnHook = 0;
- ofn.lpTemplateName = 0;
- res = SafeGetOpenFileName(&ofn);
- strncpy(ISIniFileOpenDir, dir, FILEPATH_MAX);
- ISIniFileOpenDir[FILEPATH_MAX - 1] = '\0';
- if (res != FALSE) {
+ if (ShowFileDialog(FILEDIALOG_OPEN_FILE, hwnd, title, ISIniFileOpenDir, filename, sizeof(filter_en) / sizeof(filter_en[0]), filter)) {
strncpy(Filename, filename, FILEPATH_MAX);
Filename[FILEPATH_MAX - 1] = '\0';
return 0;
static int DlgOpenConfigFile(char *Filename, HWND hwnd)
{
- OPENFILENAMEA ofn;
- char filename[FILEPATH_MAX],
- dir[FILEPATH_MAX];
- int i, res;
- const char *filter,
- filter_en[] = "All Supported files (*.cfg;*.config;*.sf2;*.sf3)\0*.cfg;*.config;*.sf2;*.sf3\0"
- "SoundFont file (*.sf2)\0*.sf2;*.sf3\0"
- "Config file (*.cfg;*.config)\0*.cfg;*.config\0"
- "All files (*.*)\0*.*\0"
- "\0\0",
- filter_jp[] = "\82·\82×\82Ä\82Ì\91Î\89\9e\83t\83@\83C\83\8b (*.cfg;*.config;*.sf2;*.sf3)\0*.cfg;*.config;*.sf2;*.sf3\0"
- "SoundFont \83t\83@\83C\83\8b (*.sf2)\0*.sf2;*.sf3\0"
- "Config \83t\83@\83C\83\8b (*.cfg;*.config)\0*.cfg;*.config\0"
- "\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)\0*.*\0"
- "\0\0";
- const char *title,
- title_en[] = "Open Config File",
- title_jp[] = "Config \83t\83@\83C\83\8b\82ð\8aJ\82";
+ const COMDLG_FILTERSPEC *filter,
+ filter_en[] = {
+ {L"All Supported files (*.cfg;*.config;*.sf2;*.sf3)", L"*.cfg;*.config;*.sf2;*.sf3"},
+ {L"SoundFont file (*.sf2;*.sf3)", L"*.sf2;*.sf3"},
+ {L"Config file (*.cfg;*.config)", L"*.cfg;*.config"},
+ {L"All files (*.*)", L"*.*"}
+ },
+ filter_jp[] = {
+ {L"\82·\82×\82Ä\82Ì\91Î\89\9e\83t\83@\83C\83\8b (*.cfg;*.config;*.sf2;*.sf3)", L"*.cfg;*.config;*.sf2;*.sf3"},
+ {L"SoundFont \83t\83@\83C\83\8b (*.sf2;*.sf3)", L"*.sf2;*.sf3"},
+ {L"Config \83t\83@\83C\83\8b (*.cfg;*.config)", L"*.cfg;*.config"},
+ {L"\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)", L"*.*"}
+ };
+ LPCWSTR title,
+ title_en = L"Open Config File",
+ title_jp = L"Config \83t\83@\83C\83\8b\82ð\8aJ\82";
if (CurrentPlayerLanguage == LANGUAGE_JAPANESE) {
filter = filter_jp;
title = title_en;
}
- strncpy(dir, ConfigFileOpenDir, FILEPATH_MAX);
- dir[FILEPATH_MAX - 1] = '\0';
- strncpy(filename, Filename, FILEPATH_MAX);
- filename[FILEPATH_MAX - 1] = '\0';
- i = (int) strlen(filename);
- if (i > 0 && IS_PATH_SEP(filename[i - 1]))
- strlcat(filename, CONFIG_FILE_NAME, FILEPATH_MAX);
- if (i > 0 && strchr(filename, '\"') != 0)
- filename[0] = '\0';
-
- ZeroMemory(&ofn, sizeof(OPENFILENAMEA));
- ofn.lStructSize = sizeof(OPENFILENAMEA);
- ofn.hwndOwner = hwnd;
- ofn.hInstance = hInst;
- ofn.lpstrFilter = filter;
- ofn.lpstrCustomFilter = NULL;
- ofn.nMaxCustFilter = 0;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = filename;
- ofn.nMaxFile = FILEPATH_MAX;
- ofn.lpstrFileTitle = NULL;
- ofn.nMaxFileTitle = 0;
- if (dir[0] != '\0')
- ofn.lpstrInitialDir = dir;
- else
- ofn.lpstrInitialDir = 0;
- ofn.lpstrTitle = title;
- ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER
- | OFN_READONLY | OFN_HIDEREADONLY;
- ofn.lpstrDefExt = 0;
- ofn.lCustData = 0;
- ofn.lpfnHook = 0;
- ofn.lpTemplateName = 0;
-
- res = SafeGetOpenFileName(&ofn);
- strncpy(ConfigFileOpenDir, dir, FILEPATH_MAX);
- ConfigFileOpenDir[FILEPATH_MAX - 1] = '\0';
- if (res != FALSE) {
- strncpy(Filename, filename, FILEPATH_MAX);
- Filename[FILEPATH_MAX - 1] = '\0';
+ if (ShowFileDialog(FILEDIALOG_OPEN_FILE, hwnd, title, ConfigFileOpenDir, Filename, sizeof(filter_en) / sizeof(filter_en[0]), filter))
return 0;
- }
else {
Filename[0] = '\0';
return -1;
static int DlgOpenOutputFile(char *Filename, HWND hwnd)
{
- OPENFILENAMEA ofn;
- char filename[FILEPATH_MAX],
- dir[FILEPATH_MAX];
- int res;
+ char filename[FILEPATH_MAX];
static char OutputFileOpenDir[FILEPATH_MAX];
- static int initflag = 1;
- const char *filter,
- *filter_en = "wave file\0*.wav;*.wave;*.aif;*.aiff;*.aifc;*.au;*.snd;*.audio\0"
- "all files\0*.*\0"
- "\0\0",
- *filter_jp = "\94g\8c`\83t\83@\83C\83\8b (*.wav;*.aif)\0*.wav;*.wave;*.aif;*.aiff;*.aifc;*.au;*.snd;*.audio\0"
- "\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)\0*.*\0"
- "\0\0";
- const char *title,
- *title_en = "Output File",
- *title_jp = "\8fo\97Í\83t\83@\83C\83\8b\82ð\91I\82Ô";
+ const COMDLG_FILTERSPEC *filter,
+ filter_en[] = {
+ {L"Wave Files (*.wav;*.wave;*.aif;*.aiff;*.aifc;*.au;*.snd;*.audio)", L"*.wav;*.wave;*.aif;*.aiff;*.aifc;*.au;*.snd;*.audio"},
+ {L"All Files (*.*)", L"*.*"}
+ },
+ filter_jp[] = {
+ {L"\94g\8c`\83t\83@\83C\83\8b (*.wav;*.wave;*.aif;*.aiff;*.aifc;*.au;*.snd;*.audio)", L"*.wav;*.wave;*.aif;*.aiff;*.aifc;*.au;*.snd;*.audio"},
+ {L"\82·\82×\82Ä\82Ì\83t\83@\83C\83\8b (*.*)", L"*.*"}
+ };
+ LPCWSTR title,
+ title_en = L"Output File",
+ title_jp = L"\8fo\97Í\83t\83@\83C\83\8b\82ð\91I\82Ô";
if (CurrentPlayerLanguage == LANGUAGE_JAPANESE) {
filter = filter_jp;
title = title_en;
}
- if (initflag) {
- OutputFileOpenDir[0] = '\0';
- initflag = 0;
- }
- strncpy(dir, OutputFileOpenDir, FILEPATH_MAX);
- dir[FILEPATH_MAX - 1] = '\0';
strncpy(filename, Filename, FILEPATH_MAX);
filename[FILEPATH_MAX - 1] = '\0';
if (strlen(filename) > 0 && IS_PATH_SEP(filename[strlen(filename) - 1])) {
strlcat(filename, "output.wav", FILEPATH_MAX);
}
- ZeroMemory(&ofn, sizeof(OPENFILENAMEA));
- ofn.lStructSize = sizeof(OPENFILENAMEA);
- ofn.hwndOwner = hwnd;
- ofn.hInstance = hInst;
- ofn.lpstrFilter = filter;
- ofn.lpstrCustomFilter = NULL;
- ofn.nMaxCustFilter = 0;
- ofn.nFilterIndex = 1;
- ofn.lpstrFile = filename;
- ofn.nMaxFile = FILEPATH_MAX;
- ofn.lpstrFileTitle = NULL;
- ofn.nMaxFileTitle = 0;
- if (dir[0] != '\0')
- ofn.lpstrInitialDir = dir;
- else
- ofn.lpstrInitialDir = 0;
- ofn.lpstrTitle = title;
- ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY;
- ofn.lpstrDefExt = 0;
- ofn.lCustData = 0;
- ofn.lpfnHook = 0;
- ofn.lpTemplateName = 0;
-
- res = SafeGetSaveFileName(&ofn);
- strncpy(OutputFileOpenDir, dir, FILEPATH_MAX);
- OutputFileOpenDir[FILEPATH_MAX - 1] = '\0';
- if (res != FALSE) {
+ if (ShowFileDialog(FILEDIALOG_SAVE_FILE, hwnd, title, OutputFileOpenDir, filename, sizeof(filter_en) / sizeof(filter_en[0]), filter)) {
strncpy(Filename, filename, FILEPATH_MAX);
Filename[FILEPATH_MAX - 1] = '\0';
return 0;
}
}
-static volatile LPITEMIDLIST itemidlist_pre;
-int CALLBACK
-DlgOpenOutputDirBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
-{
- switch (uMsg) {
- case BFFM_INITIALIZED:
- if (itemidlist_pre)
- SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM)0, (LPARAM)itemidlist_pre);
- break;
- default:
- break;
- }
- return 0;
-}
-
static int DlgOpenOutputDir(char *Dirname, HWND hwnd)
{
- static int initflag = 1;
- static char biBuffer[FILEPATH_MAX];
- char Buffer[FILEPATH_MAX];
- BROWSEINFOA bi;
- LPITEMIDLIST itemidlist;
- const char *title,
- *title_en = "Select output directory.",
- *title_jp = "\8fo\97Í\90æ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ð\91I\91ð\82µ\82Ä\82\82¾\82³\82¢\81B";
+ static char OutputFileOpenDir[FILEPATH_MAX];
+ LPCWSTR title,
+ title_en = L"Select output directory.",
+ title_jp = L"\8fo\97Í\90æ\82Ì\83f\83B\83\8c\83N\83g\83\8a\82ð\91I\91ð\82µ\82Ä\82\82¾\82³\82¢\81B";
if (CurrentPlayerLanguage == LANGUAGE_JAPANESE)
title = title_jp;
else
title = title_en;
- if (initflag == 1) {
- biBuffer[0] = '\0';
- initflag = 0;
- }
- ZeroMemory(&bi, sizeof(bi));
- bi.hwndOwner = hwnd;
- bi.pidlRoot = NULL;
- bi.pszDisplayName = biBuffer;
- bi.lpszTitle = title;
- bi.ulFlags = 0;
- bi.lpfn = DlgOpenOutputDirBrowseCallbackProc;
- bi.lParam = 0;
- bi.iImage = 0;
- itemidlist = SHBrowseForFolderA(&bi);
-
- if (!itemidlist)
- return -1; /* Cancel */
-
- SHGetPathFromIDList(itemidlist, Buffer);
- strncpy(biBuffer, Buffer, sizeof(Buffer) - 1);
-
- if (itemidlist_pre)
- CoTaskMemFree(itemidlist_pre);
- itemidlist_pre = itemidlist;
-
- directory_form(Buffer);
- strcpy(Dirname, Buffer);
+ if (!ShowFileDialog(FILEDIALOG_OPEN_FOLDER, hwnd, title, OutputFileOpenDir, Dirname, 0, NULL))
+ return -1;
+
+ directory_form(Dirname);
return 0;
}
#include "miditrace.h"
#include "rtsyn.h"
+#include <wchar.h>
+#include <shobjidl.h>
+
///r
extern int opt_default_mid;
extern int effect_lr_mode;
src, rc->left, rc->top, SRCCOPY);
}
-static void SafeGetFileName_DeleteSep(char *str)
+BOOL ShowFileDialog(
+ int mode,
+ HWND hParentWindow,
+ LPCWSTR pTitle,
+ char *pDirectory,
+ char *pResult,
+ UINT filterCount,
+ const COMDLG_FILTERSPEC *pFilters
+)
{
- if (str && is_last_path_sep(str)) {
- char *p = pathsep_strrchr(str);
- *p = '\0';
- }
-}
+ IFileDialog *pFileDialog = NULL;
+ HRESULT hr = CoCreateInstance(
+ mode == FILEDIALOG_SAVE_FILE ? &CLSID_FileSaveDialog : &CLSID_FileOpenDialog,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ &IID_IFileDialog,
+ (void **)&pFileDialog
+ );
+
+ if (FAILED(hr))
+ return FALSE;
+
+ if (pTitle)
+ pFileDialog->lpVtbl->SetTitle(pFileDialog, pTitle);
+
+ if (pDirectory && pDirectory[0]) {
+ wchar_t wbuffer[FILEPATH_MAX];
+ IShellItem *pShellItem;
+
+ MultiByteToWideChar(
+ CP_ACP,
+ 0,
+ pDirectory,
+ -1,
+ wbuffer,
+ FILEPATH_MAX
+ );
+
+ if (SUCCEEDED(SHCreateItemFromParsingName(wbuffer, NULL, &IID_IShellItem, (void**)&pShellItem))) {
+ pFileDialog->lpVtbl->SetFolder(pFileDialog, pShellItem);
+ pShellItem->lpVtbl->Release(pShellItem);
+ }
+ }
-BOOL SafeGetOpenFileName(LPOPENFILENAMEA lpofn)
-{
- BOOL result;
- char currentdir[FILEPATH_MAX];
+ if (filterCount > 0 && pFilters)
+ pFileDialog->lpVtbl->SetFileTypes(pFileDialog, filterCount, pFilters);
- if (lpofn->lpstrFile) {
- SafeGetFileName_DeleteSep(lpofn->lpstrFile);
- }
+ FILEOPENDIALOGOPTIONS options;
+ pFileDialog->lpVtbl->GetOptions(pFileDialog, &options);
+ options |= FOS_NOCHANGEDIR | FOS_FORCEFILESYSTEM;
- GetCurrentDirectoryA(FILEPATH_MAX, currentdir);
- result = GetOpenFileNameA(lpofn);
- SetCurrentDirectoryA(currentdir);
+ switch (mode) {
+ case FILEDIALOG_OPEN_MULTIPLE_FILES:
+ options |= FOS_ALLOWMULTISELECT;
+ break;
- return result;
-}
+ case FILEDIALOG_OPEN_FOLDER:
+ options |= FOS_PICKFOLDERS;
+ break;
-BOOL SafeGetSaveFileName(LPOPENFILENAMEA lpofn)
-{
- BOOL result;
- char currentdir[FILEPATH_MAX];
+ default:
+ break;
+ }
- if (lpofn->lpstrFile) {
- SafeGetFileName_DeleteSep(lpofn->lpstrFile);
- }
+ pFileDialog->lpVtbl->SetOptions(pFileDialog, options);
+
+ hr = pFileDialog->lpVtbl->Show(pFileDialog, hParentWindow);
+
+ if (hr == S_OK) {
+ if (mode == FILEDIALOG_OPEN_MULTIPLE_FILES) {
+ IFileOpenDialog *pFileOpenDialog;
+
+ if (SUCCEEDED(pFileDialog->lpVtbl->QueryInterface(pFileDialog, &IID_IFileOpenDialog, (void**)&pFileOpenDialog))) {
+ IShellItemArray *pShellItemArray;
+
+ if (SUCCEEDED(pFileOpenDialog->lpVtbl->GetResults(pFileOpenDialog, &pShellItemArray))) {
+ size_t pos = 0;
+ DWORD count = 0;
+ pShellItemArray->lpVtbl->GetCount(pShellItemArray, &count);
+
+ for (DWORD i = 0; i < count; i++) {
+ IShellItem *pShellItem;
+
+ if (SUCCEEDED(pShellItemArray->lpVtbl->GetItemAt(pShellItemArray, i, &pShellItem))) {
+ wchar_t *pBuffer;
- GetCurrentDirectoryA(FILEPATH_MAX, currentdir);
- result = GetSaveFileNameA(lpofn);
- SetCurrentDirectoryA(currentdir);
+ if (SUCCEEDED(pShellItem->lpVtbl->GetDisplayName(pShellItem, i == 0 ? SIGDN_FILESYSPATH : SIGDN_PARENTRELATIVEPARSING, &pBuffer))) {
+ int len = wcslen(pBuffer);
+
+ if (i == 0) {
+ wchar_t *p = wcsrchr(pBuffer, L'\\');
+
+ if (p)
+ *p = L'\0';
+ }
+
+ int c = WideCharToMultiByte(
+ CP_ACP,
+ 0,
+ pBuffer,
+ len + 1, // including terminating null character
+ pResult + pos,
+ FILEPATH_MAX - 2 - pos,
+ NULL,
+ NULL
+ );
+
+ pos += c;
+ CoTaskMemFree(pBuffer);
+ }
+
+ pShellItem->lpVtbl->Release(pShellItem);
+ }
+ }
+
+ pResult[pos] = L'\0';
+ pResult[pos + 1] = L'\0';
+ pShellItemArray->lpVtbl->Release(pShellItemArray);
+ }
+
+ pFileOpenDialog->lpVtbl->Release(pFileOpenDialog);
+ }
+ } else {
+ IShellItem* pShellItem;
+
+ if (SUCCEEDED(pFileDialog->lpVtbl->GetResult(pFileDialog, &pShellItem))) {
+ wchar_t* pBuffer;
+
+ if (SUCCEEDED(pShellItem->lpVtbl->GetDisplayName(pShellItem, SIGDN_FILESYSPATH, &pBuffer))) {
+ int c = WideCharToMultiByte(
+ CP_ACP,
+ 0,
+ pBuffer,
+ -1,
+ pResult,
+ FILEPATH_MAX - 1,
+ NULL,
+ NULL
+ );
+
+ pResult[c] = '\0';
+ CoTaskMemFree(pBuffer);
+ }
+
+ pShellItem->lpVtbl->Release(pShellItem);
+ }
+ }
+
+ if (pDirectory) {
+ strcpy(pDirectory, pResult);
+
+ if (mode == FILEDIALOG_OPEN_FILE || mode == FILEDIALOG_SAVE_FILE) {
+ char *p = pathsep_strrchr(pDirectory);
+
+ if (p)
+ *p = '\0';
+ }
+ }
+ }
- return result;
+ pFileDialog->lpVtbl->Release(pFileDialog);
+ return hr == S_OK;
}
#if 0
///r
#include "timidity.h"
#include "w32g.h"
+#include <shtypes.h>
// ini & config
#define IniVersion "2.2"
extern void SettingCtlFlag(SETTING_TIMIDITY *st, int opt_id, int onoff);
extern int IniVersionCheck(void);
extern void BitBltRect(HDC dst, HDC src, const RECT *rc);
-extern BOOL SafeGetOpenFileName(LPOPENFILENAMEA lpofn);
-extern BOOL SafeGetSaveFileName(LPOPENFILENAMEA lpofn);
+
+// mode option for ShowFileDialog()
+enum {
+ FILEDIALOG_OPEN_FILE,
+ FILEDIALOG_OPEN_MULTIPLE_FILES,
+ FILEDIALOG_OPEN_FOLDER,
+ FILEDIALOG_SAVE_FILE
+};
+
+// pDirectory and pResult must point to an array of at least FILEPATH_MAX length!
+extern BOOL ShowFileDialog(
+ int mode,
+ HWND hParentWindow,
+ LPCWSTR pTitle,
+ char *pDirectory,
+ char *pResult,
+ UINT filterCount,
+ const COMDLG_FILTERSPEC *pFilters
+);
+
#if 0
extern TmColors tm_colors[ /* TMCC_SIZE */ ];
#define TmCc(c) (tm_colors[c].color)