Prevent file browser WinBoard changing current directory
authorH.G.Muller <hgm@hgm-xboard.(none)>
Mon, 8 Aug 2022 09:48:51 +0000 (11:48 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Mon, 8 Aug 2022 09:48:51 +0000 (11:48 +0200)
Much of WinBoard relies on the current directory being the folder
that contains the winboard.exe executable. Using the Windows file-
browse dialog appeared to change that, however. Now the directory
before the browsing started is remembered, and restored afterwards.

winboard/winboard.c
winboard/wsettings.c

index 07e47e9..5235ca0 100644 (file)
@@ -381,9 +381,6 @@ LoadLanguageFile(char *name)
               case 't': k = '\t'; break;\r
             }\r
             languageBuf[--i] = k;\r
-\r
-\r
-\r
         }\r
         i++;\r
     }\r
@@ -4743,11 +4740,13 @@ LoadGameDialog(HWND hwnd, char* title)
 {\r
   UINT number = 0;\r
   FILE *f;\r
-  char fileTitle[MSG_SIZ];\r
+  char fileTitle[MSG_SIZ], dir[MSG_SIZ];\r
+  GetCurrentDirectory(MSG_SIZ, dir);\r
   f = OpenFileDialog(hwnd, "rb", "",\r
                     appData.oldSaveStyle ? "gam" : "pgn",\r
                     GAME_FILT,\r
                     title, &number, fileTitle, NULL);\r
+  SetCurrentDirectory(MSG_SIZ, dir);\r
   if (f != NULL) {\r
     cmailMsgLoaded = FALSE;\r
     if (number == 0) {\r
@@ -4875,7 +4874,7 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
   char *defName;\r
   FILE *f;\r
   UINT number;\r
-  char fileTitle[MSG_SIZ];\r
+  char fileTitle[MSG_SIZ], dir[MSG_SIZ];\r
   static SnapData sd;\r
   static int peek=0;\r
 \r
@@ -5012,10 +5011,12 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
         Reset(FALSE, TRUE);\r
       }\r
       number = 1;\r
+      GetCurrentDirectory(MSG_SIZ, dir);\r
       f = OpenFileDialog(hwnd, "rb", "",\r
                         appData.oldSaveStyle ? "pos" : "fen",\r
                         POSITION_FILT,\r
                         _("Load Position from File"), &number, fileTitle, NULL);\r
+      SetCurrentDirectory(MSG_SIZ, dir);\r
       if (f != NULL) {\r
        LoadPosition(f, number, fileTitle);\r
       }\r
@@ -5035,10 +5036,12 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 \r
     case IDM_SaveGame:\r
       defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn");\r
+      GetCurrentDirectory(MSG_SIZ, dir);\r
       f = OpenFileDialog(hwnd, "a", defName,\r
                         appData.oldSaveStyle ? "gam" : "pgn",\r
                         GAME_FILT,\r
                         _("Save Game to File"), NULL, fileTitle, NULL);\r
+      SetCurrentDirectory(MSG_SIZ, dir);\r
       if (f != NULL) {\r
        SaveGame(f, 0, "");\r
       }\r
@@ -5046,10 +5049,12 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 \r
     case IDM_SavePosition:\r
       defName = DefaultFileName(appData.oldSaveStyle ? "pos" : "fen");\r
+      GetCurrentDirectory(MSG_SIZ, dir);\r
       f = OpenFileDialog(hwnd, "a", defName,\r
                         appData.oldSaveStyle ? "pos" : "fen",\r
                         POSITION_FILT,\r
                         _("Save Position to File"), NULL, fileTitle, NULL);\r
+      SetCurrentDirectory(MSG_SIZ, dir);\r
       if (f != NULL) {\r
        SavePosition(f, 0, "");\r
       }\r
@@ -5057,20 +5062,24 @@ WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 \r
     case IDM_SaveDiagram:\r
       defName = "diagram";\r
+      GetCurrentDirectory(MSG_SIZ, dir);\r
       f = OpenFileDialog(hwnd, "wb", defName,\r
                         "bmp",\r
                         DIAGRAM_FILT,\r
                         _("Save Diagram to File"), NULL, fileTitle, NULL);\r
+      SetCurrentDirectory(MSG_SIZ, dir);\r
       if (f != NULL) {\r
        SaveDiagram(f);\r
       }\r
       break;\r
 \r
     case IDM_SaveSelected:\r
+      GetCurrentDirectory(MSG_SIZ, dir);\r
       f = OpenFileDialog(hwnd, "a", "",\r
                         "pgn",\r
                         GAME_FILT,\r
                         _("Save Game to File"), NULL, fileTitle, NULL);\r
+      SetCurrentDirectory(MSG_SIZ, dir);\r
       if (f != NULL) {\r
        SaveSelected(f, 0, "");\r
       }\r
@@ -9176,13 +9185,15 @@ AutoSaveGame()
 {\r
   char *defName;\r
   FILE *f;\r
-  char fileTitle[MSG_SIZ];\r
+  char fileTitle[MSG_SIZ], dir[MSG_SIZ];\r
 \r
   defName = DefaultFileName(appData.oldSaveStyle ? "gam" : "pgn");\r
+  GetCurrentDirectory(MSG_SIZ, dir);\r
   f = OpenFileDialog(hwndMain, "a", defName,\r
                     appData.oldSaveStyle ? "gam" : "pgn",\r
                     GAME_FILT, \r
                     _("Save Game to File"), NULL, fileTitle, NULL);\r
+  GetCurrentDirectory(MSG_SIZ, dir);\r
   if (f != NULL) {\r
     SaveGame(f, 0, "");\r
     fclose(f);\r
@@ -10301,6 +10312,7 @@ int flock(int fid, int code)
       case 1: res = LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break;   // LOCK_SH\r
       case 2: res = LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, 1024, 0, &ov); break;   // LOCK_EX\r
       case 3: res = UnlockFileEx(hFile, 0, 1024, 0, &ov); break; // LOCK_UN\r
+\r
       default: return -1;\r
     }\r
     return -!res;\r
index dd9cabb..e5fdbfc 100644 (file)
@@ -464,7 +464,7 @@ HWND settingsDlg;
 \r
 LRESULT CALLBACK SettingsProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
-    char buf[MSG_SIZ];\r
+    char buf[MSG_SIZ], dir[MSG_SIZ];\r
     int i, j, ext;\r
 \r
     switch( message )\r
@@ -522,11 +522,13 @@ LRESULT CALLBACK SettingsProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lPa
                          ofn.lpstrTitle = _("Choose File");\r
                          ofn.Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY;\r
 \r
+                         GetCurrentDirectory(MSG_SIZ, dir);\r
                          if( activeList[layoutList[(i-2000)/2+1]].max & 32 ?\r
                                                       GetOpenFileName( &ofn ) :\r
                                                       GetSaveFileName( &ofn ) ) {\r
                              SetDlgItemText( hDlg, i+3, buf );\r
                          }\r
+                         SetCurrentDirectory(MSG_SIZ, dir);\r
                } else\r
                if(j == -3) {\r
                    GetDlgItemText( hDlg, i+3, buf, MSG_SIZ );\r