Pārlūkot izejas kodu

Fix OpenFolder dialog behavior on Windows

Mykola Rubets 1 gadu atpakaļ
vecāks
revīzija
fc053fb499
1 mainītis faili ar 32 papildinājumiem un 3 dzēšanām
  1. 32 3
      src/dialog/windows/SDL_windowsdialog.c

+ 32 - 3
src/dialog/windows/SDL_windowsdialog.c

@@ -44,6 +44,7 @@ typedef struct
 {
     SDL_Window* parent;
     SDL_DialogFileCallback callback;
+    const char* default_folder;
     void* userdata;
 } winFArgs;
 
@@ -327,6 +328,31 @@ int windows_file_dialog_thread(void* ptr)
     return 0;
 }
 
+int CALLBACK browse_callback_proc(
+				HWND hwnd, 
+				UINT uMsg, 
+				LPARAM lParam, 
+				LPARAM lpData)
+{
+  
+	switch (uMsg)
+	{
+	case BFFM_INITIALIZED :
+		if(lpData)
+        {
+		  SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
+        }
+		break;
+	case BFFM_SELCHANGED :
+		break;
+	case BFFM_VALIDATEFAILED :
+		break;
+	default:
+		break;
+	}
+	return 0; 
+}
+
 void windows_ShowFolderDialog(void* ptr)
 {
     winFArgs *args = (winFArgs *) ptr;
@@ -349,11 +375,13 @@ void windows_ShowFolderDialog(void* ptr)
     dialog.pszDisplayName = buffer;
     dialog.lpszTitle = NULL;
     dialog.ulFlags = BIF_USENEWUI;
-    dialog.lpfn = NULL;
-    dialog.lParam = 0;
+    dialog.lpfn = browse_callback_proc;
+    dialog.lParam = (LPARAM)args->default_folder;
     dialog.iImage = 0;
 
-    if (SHBrowseForFolderW(&dialog)) {
+    LPITEMIDLIST lpItem = SHBrowseForFolderW(&dialog);
+    if (lpItem != NULL) {
+        SHGetPathFromIDListW(lpItem, buffer);
         char *chosen_file = WIN_StringToUTF8W(buffer);
         const char *files[2] = { chosen_file, NULL };
         callback(userdata, (const char * const*) files, -1);
@@ -447,6 +475,7 @@ void SDL_ShowOpenFolderDialog(SDL_DialogFileCallback callback, void* userdata, S
 
     args->parent = window;
     args->callback = callback;
+    args->default_folder = default_location;
     args->userdata = userdata;
 
     thread = SDL_CreateThreadInternal(windows_folder_dialog_thread, "SDL_ShowOpenFolderDialog", 0, (void *) args);