OSDN Git Service

Use IFileDialog
authorStarg <starg@users.osdn.me>
Sat, 29 Aug 2020 12:26:18 +0000 (21:26 +0900)
committerStarg <starg@users.osdn.me>
Sat, 29 Aug 2020 12:26:18 +0000 (21:26 +0900)
interface/w32g_i.c
interface/w32g_int_synth_editor.c
interface/w32g_pref.c
interface/w32g_utl.c
interface/w32g_utl.h

index 2dbc9a4..62de7da 100644 (file)
@@ -5183,65 +5183,31 @@ void WINAPI MainThread(void *arglist)
 
 // **************************************************************************
 // 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;
@@ -5251,72 +5217,33 @@ static void DlgMidiFileOpen(HWND hwnd)
     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
@@ -5447,16 +5374,16 @@ UrlOpenWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam)
 
 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;
@@ -5466,12 +5393,7 @@ static void DlgPlaylistOpen(HWND hwnd)
        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;
@@ -5510,17 +5432,16 @@ static int CheckOverWrite(HWND hwnd, char *filename)
 
 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;
@@ -5530,42 +5451,16 @@ static void DlgPlaylistSave(HWND hwnd)
     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
 }
 
index 170b5c2..2bd8c33 100644 (file)
@@ -1603,20 +1603,19 @@ static void ISEditorWndCreatePage(HWND hwnd, UINT page)
 
 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;
@@ -1628,41 +1627,13 @@ static int DlgOpenISIniFile(char *Filename, HWND hwnd)
         }
         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;
index 446466d..67d9fd0 100644 (file)
@@ -5929,24 +5929,22 @@ BOOL IsVisiblePrefWnd ( void )
 
 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;
@@ -5957,48 +5955,8 @@ static int DlgOpenConfigFile(char *Filename, HWND hwnd)
                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;
@@ -6007,22 +5965,20 @@ static int DlgOpenConfigFile(char *Filename, HWND hwnd)
 
 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;
@@ -6033,45 +5989,13 @@ static int DlgOpenOutputFile(char *Filename, HWND hwnd)
                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;
@@ -6081,64 +6005,22 @@ static int DlgOpenOutputFile(char *Filename, HWND hwnd)
        }
 }
 
-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;
 }
 
index d99adc1..6145ffc 100644 (file)
@@ -79,6 +79,9 @@
 #include "miditrace.h"
 #include "rtsyn.h"
 
+#include <wchar.h>
+#include <shobjidl.h>
+
 ///r
 extern int opt_default_mid;
 extern int effect_lr_mode;
@@ -1546,44 +1549,168 @@ void BitBltRect(HDC dst, HDC src, const RECT *rc)
           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
index 21c6e27..4d79795 100644 (file)
@@ -30,6 +30,7 @@
 ///r
 #include "timidity.h"
 #include "w32g.h"
+#include <shtypes.h>
 
 // ini & config
 #define IniVersion "2.2"
@@ -336,8 +337,26 @@ extern void SaveSettingTiMidity(SETTING_TIMIDITY *st);
 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)