WinWorkstation.st
changeset 8526 9dd89edb266a
parent 8525 b7dcc1de2b59
child 8527 9ac7c1dcce68
--- a/WinWorkstation.st	Mon Oct 22 14:05:45 2018 +0200
+++ b/WinWorkstation.st	Mon Oct 22 15:03:13 2018 +0200
@@ -954,12 +954,16 @@
     BOOL trueForSave;
     wchar_t targetFilename[MAX_PATH];
 
+	DWORD fileDialogThreadId;
     BOOL fileDialogDidReturn;
 } fileDialogData;
 
-DWORD WINAPI OpenFileDialog(fileDialogData *pFdd) {
+DWORD WINAPI OpenFileDialog(void *arg) {
     BOOL hasResult;
     OPENFILENAMEW ofn;
+	fileDialogData *pFdd = (fileDialogData*)arg;
+	
+	pFdd->fileDialogThreadId = GetCurrentThreadId();
     ZeroMemory(&ofn, sizeof(ofn));
 
     ofn.lStructSize = sizeof(OPENFILENAMEW);
@@ -971,15 +975,15 @@
     ofn.hwndOwner = pFdd->owningWindow;
 
     if (pFdd->trueForSave) {
-	ofn.Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST;
-	hasResult = GetSaveFileNameW(&ofn);
-    } else {
-	ofn.Flags = OFN_FILEMUSTEXIST;
-	hasResult = GetOpenFileNameW(&ofn);
+	    ofn.Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST;
+	    hasResult = GetSaveFileNameW(&ofn);
+    } else {
+	    ofn.Flags = OFN_FILEMUSTEXIST;
+	    hasResult = GetOpenFileNameW(&ofn);
     }
 
     if (!hasResult) {
-	ZeroMemory(&pFdd->filename, sizeof(pFdd->filename));
+	    ZeroMemory(&pFdd->filename, sizeof(pFdd->filename));
     }
 
     pFdd->fileDialogDidReturn = TRUE;
@@ -990,12 +994,21 @@
 HANDLE openFileDialogInNewThread(fileDialogData *pFdd) {
     HANDLE fileDialogThread = CreateThread(NULL, 0, OpenFileDialog, pFdd, 0, NULL);
     if (fileDialogThread == INVALID_HANDLE_VALUE) {
-	printf("error: could not create thread for native file dialog: %d\n", GetLastError());
+	    printf("error: could not create thread for native file dialog: %d\n", GetLastError());
     }
 
     return fileDialogThread;
 }
 
+BOOL CALLBACK enumWindowsToFindAndDestroyFileDialogProc(HWND hwnd, LPARAM fileDialogThreadId) {
+    if (GetWindowThreadProcessId(hwnd, NULL) == (DWORD)fileDialogThreadId) {
+        EndDialog(hwnd, 0);
+        DestroyWindow(hwnd);
+    }
+
+    return TRUE;
+};  
+
 %}
 ! !
 
@@ -16666,26 +16679,17 @@
      this is required because windows does not cleanup the dialog by itself when its thread gets terminated"
 
 %{  /* STACK: 100000 */ 
-    if (__isExternalAddress(threadHandleAddress)) {
-        HANDLE fileDialogThread = _HWNDVal(threadHandleAddress);
-        DWORD fileDialogThreadId = GetThreadId(fileDialogThread);
-
-        BOOL CALLBACK enumWindowsToFindAndDestroyFileDialogProc(HWND hwnd, LPARAM lParam) {
-            if (GetWindowThreadProcessId(hwnd, NULL) == fileDialogThreadId) {
-                EndDialog(hwnd, 0);
-                DestroyWindow(hwnd);
-            }
-
-            return TRUE;
-        };   
-
-        EnumWindows(enumWindowsToFindAndDestroyFileDialogProc, NULL);
-        TerminateThread(fileDialogThread, 0); 
-        CloseHandle(fileDialogThread);
-    };  
-
     if (__isExternalAddress(dataAddress)) {
-        free(__externalAddressVal(dataAddress));
+	    fileDialogData *pFdd = __externalAddressVal(dataAddress);
+        EnumWindows(enumWindowsToFindAndDestroyFileDialogProc, pFdd->fileDialogThreadId);
+		
+        if (__isExternalAddress(threadHandleAddress)) {
+            HANDLE fileDialogThread = _HWNDVal(threadHandleAddress);
+            TerminateThread(fileDialogThread, 0); 
+            CloseHandle(fileDialogThread);
+        };  
+
+        free(pFdd);
     }
 %}.