diff --git a/fluid/fluid.cxx b/fluid/fluid.cxx
index 9f20843f780581724e1fb24f3236372e97b9da25..75bddd39e5c43162d7d73a43889a51c9f8d96947 100644
--- a/fluid/fluid.cxx
+++ b/fluid/fluid.cxx
@@ -1981,6 +1981,14 @@ void update_history(const char *flname) {
   if (max_files > 10) max_files = 10;
 
   fl_filename_absolute(absolute, sizeof(absolute), flname);
+#ifdef _WIN32
+  // Make path canonical.
+  for (char *s = absolute; *s; s++) {
+    if (*s == '\\')
+      *s = '/';
+  }
+#endif
+
 
   for (i = 0; i < max_files; i ++)
 #if defined(_WIN32) || defined(__APPLE__)
diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
index 1985d23e02e5529113ea35ccfbfa8fd438a5c109..2e3a35cb07430b8e6150afdd90497d5bdb7abf49 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
+++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx
@@ -568,7 +568,7 @@ int Fl_WinAPI_System_Driver::filename_expand(char *to, int tolen, const char *fr
     switch (*a) {
       case '~': // a home directory name
         if (e <= a+1) { // current user's directory
-          value = getenv("HOME");
+          value = home_directory_name();
         }
         break;
       case '$':         /* an environment variable */
@@ -987,9 +987,39 @@ int Fl_WinAPI_System_Driver::file_type(const char *filename)
 
 const char *Fl_WinAPI_System_Driver::home_directory_name()
 {
-  const char *h = getenv("HOME");
-  if (!h) h = getenv("UserProfile");
-  return h;
+  static char *home = NULL;
+  if (home)
+    return home;
+  // Various ways to retrieve the HOME path.
+  if (!home) {
+    const char *home_drive = getenv("HOMEDRIVE");
+    const char *home_path = getenv("HOMEPATH");
+    if (home_path && home_drive) {
+      int n = strlen(home_drive) + strlen(home_path) + 2;
+      home = (char *)::malloc(n);
+      ::strncpy(home, home_drive, n);
+      ::strncat(home, home_path, n);
+    }
+  }
+  if (!home) {
+    const char *h = getenv("UserProfile");
+    if (h) 
+      home = ::strdup(h);
+  }
+  if (!home) {
+    const char *h = getenv("HOME");
+    if (h)
+      home = ::strdup(h);
+  }
+  if (!home) {
+    home = ::strdup("~/"); // last resort
+  }
+  // Make path canonical.
+  for (char *s = home; *s; s++) {
+    if (*s == '\\')
+      *s = '/';
+  }
+  return home;
 }
 
 void Fl_WinAPI_System_Driver::gettime(time_t *sec, int *usec) {