Implement "putty -cleanup"
[u/mdw/putty] / window.c
index 6dba5b1..5b05a0b 100644 (file)
--- a/window.c
+++ b/window.c
@@ -42,7 +42,6 @@
 
 #define WM_IGNORE_SIZE (WM_XUSER + 1)
 #define WM_IGNORE_CLIP (WM_XUSER + 2)
-#define WM_IGNORE_KEYMENU (WM_XUSER + 3)
 
 static LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam, unsigned char *output);
@@ -154,6 +153,33 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
                tolower(p[1]) == 'o' &&
                tolower(p[2]) == 'g') {
                 logfile = "putty.log";
+           } else if (q == p + 7 &&
+               tolower(p[0]) == 'c' &&
+               tolower(p[1]) == 'l' &&
+               tolower(p[2]) == 'e' &&
+               tolower(p[3]) == 'a' &&
+               tolower(p[4]) == 'n' &&
+               tolower(p[5]) == 'u' &&
+               tolower(p[6]) == 'p') {
+                /*
+                 * `putty -cleanup'. Remove all registry entries
+                 * associated with PuTTY, and also find and delete
+                 * the random seed file.
+                 */
+                if (MessageBox(NULL,
+                               "This procedure will remove ALL Registry\n"
+                               "entries associated with PuTTY, and will\n"
+                               "also remove the PuTTY random seed file.\n"
+                               "\n"
+                               "THIS PROCESS WILL DESTROY YOUR SAVED\n"
+                               "SESSIONS. Are you really sure you want\n"
+                               "to continue?",
+                               "PuTTY Warning",
+                               MB_YESNO | MB_ICONWARNING) == IDYES) {
+                    random_destroy_seed();
+                    registry_cleanup();
+                }
+                exit(0);
            }
            p = q + strspn(q, " \t");
        }
@@ -229,6 +255,19 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
                return 0;
            }
        }
+
+       /* See if host is of the form user@host */
+       if (cfg.host[0] != '\0') {
+           char *atsign = strchr(cfg.host, '@');
+           /* Make sure we're not overflowing the user field */
+           if (atsign) {
+               if (atsign-cfg.host < sizeof cfg.username) {
+                   strncpy (cfg.username, cfg.host, atsign-cfg.host);
+                   cfg.username[atsign-cfg.host] = '\0';
+               }
+               memmove(cfg.host, atsign+1, 1+strlen(atsign+1));
+           }
+       }
     }
 
     /*
@@ -942,7 +981,6 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
     HDC hdc;
     static int ignore_size = FALSE;
     static int ignore_clip = FALSE;
-    static int ignore_keymenu = TRUE;
     static int just_reconfigged = FALSE;
     static int resizing = FALSE;
 
@@ -968,10 +1006,6 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
        return 0;
       case WM_SYSCOMMAND:
        switch (wParam & ~0xF) {       /* low 4 bits reserved to Windows */
-          case SC_KEYMENU:
-            if (ignore_keymenu)
-                return 0;              /* don't put up system menu on Alt */
-            break;
          case IDM_SHOWLOG:
            showeventlog(hwnd);
            break;
@@ -1201,9 +1235,6 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
       case WM_IGNORE_CLIP:
        ignore_clip = wParam;          /* don't panic on DESTROYCLIPBOARD */
        break;
-      case WM_IGNORE_KEYMENU:
-       ignore_keymenu = wParam;       /* do or don't ignore SC_KEYMENU */
-       break;
       case WM_DESTROYCLIPBOARD:
        if (!ignore_clip)
            term_deselect();
@@ -1819,9 +1850,7 @@ static WPARAM compose_key = 0;
        }
        if (left_alt && wParam == VK_SPACE && cfg.alt_space) {
             
-            SendMessage (hwnd, WM_IGNORE_KEYMENU, FALSE, 0);
             SendMessage (hwnd, WM_SYSCOMMAND, SC_KEYMENU, 0);
-            SendMessage (hwnd, WM_IGNORE_KEYMENU, TRUE, 0);
             return -1;
        }
 
@@ -2064,13 +2093,11 @@ static WPARAM compose_key = 0;
     }
 
     /* This stops ALT press-release doing a 'COMMAND MENU' function */
-#if 0
     if (message == WM_SYSKEYUP && wParam == VK_MENU) 
     {
        keystate[VK_MENU] = 0;
        return 0;
     }
-#endif
 
     return -1;
 }