--- 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);
}
%}.