WinWorkstation.st
changeset 8553 dfa2f59fe1ed
parent 8552 720ee7137040
child 8554 89fa49dfd5e2
--- a/WinWorkstation.st	Thu Oct 25 12:09:24 2018 +0200
+++ b/WinWorkstation.st	Fri Oct 26 09:39:16 2018 +0200
@@ -956,6 +956,7 @@
     
     DWORD fileDialogThreadId;
     BOOL fileDialogDidReturn;
+    BOOL didPerformCroppedBaseNameHack; /* the open dialog cropps the default basename https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/644328 */
 } fileDialogData;
 
 DWORD WINAPI OpenFileDialog(void *arg) {
@@ -1020,6 +1021,35 @@
     return TRUE;
 };
 
+BOOL CALLBACK enumChildWindowsForCroppedBaseNameHackProc(HWND hwnd, LPARAM lparam) {
+    fileDialogData *pFdd = (fileDialogData*)lparam;
+    char className[5];
+	
+    GetClassName(hwnd, className, sizeof(className));
+    if (strcmp("Edit", className) == 0) {
+        if (IsWindowVisible(hwnd)) {
+            LONG lAlign = GetWindowLong(hwnd, GWL_EXSTYLE);
+            lAlign ^= WS_EX_RTLREADING;
+            SetWindowLong(hwnd, GWL_EXSTYLE, lAlign);
+            lAlign ^= WS_EX_RTLREADING;   
+            SetWindowLong(hwnd, GWL_EXSTYLE, lAlign);   
+		
+            pFdd->didPerformCroppedBaseNameHack = TRUE;
+        }
+    }
+
+    return TRUE;
+};
+
+BOOL CALLBACK enumWindowsToForCroppedBaseNameHackProc(HWND hwnd, LPARAM lparam) {
+    fileDialogData *pFdd = (fileDialogData*)lparam;
+    if (GetWindowThreadProcessId(hwnd, NULL) == (DWORD)pFdd->fileDialogThreadId) {
+        EnumChildWindows(hwnd, enumChildWindowsForCroppedBaseNameHackProc, lparam);
+    }
+
+    return TRUE;
+};
+
 %}
 ! !
 
@@ -16656,6 +16686,17 @@
 
         dataAddress := dataAddressAndThreadAddress first.
 
+        trueForSave ifFalse:[
+            "hack for display bug (cropped default basename)
+             https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/644328"
+            [
+                self primTryCroppedBaseNameHackByDataAddress:dataAddress
+            ] whileFalse:[
+                "/ loop until the dialog has opened    
+                Delay waitForMilliseconds:10.
+            ].
+        ].
+
         [
             windowGroup notNil ifTrue:[
                 windowGroup sensor eventSemaphore waitWithTimeout:100 milliseconds.
@@ -16696,7 +16737,7 @@
 
         Display
             nativeFileDialogWithTitle:'Hello World'
-            defaultFilename:'C:\users\sr\desktop'
+            defaultFilename:'C:\users\sr\desktop\dsfjbgfhkbsdhzbret.ets'
             owningTopView:nil
             filter:
                 'expecco Testsuite', null, '*.ets', null,
@@ -16783,6 +16824,7 @@
     "
 
     "Created: / 25-10-2018 / 10:54:52 / sr"
+    "Modified: / 26-10-2018 / 09:35:38 / sr"
 !
 
 primCloseNativeFileDialogByDataAddress:dataAddress
@@ -16941,6 +16983,28 @@
         with:fileDialogThreadHandle
 
     "Created: / 23-10-2018 / 10:59:50 / sr"
+!
+
+primTryCroppedBaseNameHackByDataAddress:dataAddress
+    "hack for display bug (cropped default basename)
+     https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/644328"
+
+%{  /* STACK: 100000 */
+    if (__isExternalAddress(dataAddress)) {
+        fileDialogData *pFdd = __externalAddressVal(dataAddress);
+        pFdd->didPerformCroppedBaseNameHack = FALSE;
+        EnumWindows(enumWindowsToForCroppedBaseNameHackProc, pFdd);
+
+        if (pFdd->didPerformCroppedBaseNameHack) {
+            RETURN (true);
+        } else {
+            RETURN (false);            
+        }
+    }
+%}.
+
+    "Created: / 25-10-2018 / 15:37:52 / sr"
+    "Modified: / 26-10-2018 / 09:09:16 / sr"
 ! !
 
 !WinWorkstation methodsFor:'native widget support'!