Ensure our network layer is properly cleaned up before PuTTY exits.
[u/mdw/putty] / window.c
index 5ea24dc..a779dbc 100644 (file)
--- a/window.c
+++ b/window.c
 #endif
 #endif
 
+#ifndef NO_MULTIMON
 #if WINVER < 0x0500
 #define COMPILE_MULTIMON_STUBS
 #include <multimon.h>
 #endif
+#endif
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -157,6 +159,8 @@ static char *window_name, *icon_name;
 
 static int compose_state = 0;
 
+static int wsa_started = 0;
+
 static OSVERSIONINFO osVersion;
 
 static UINT wm_mousewheel = WM_MOUSEWHEEL;
@@ -190,6 +194,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
        WSACleanup();
        return 1;
     }
+    wsa_started = 1;
     /* WISHLIST: maybe allow config tweaking even if winsock not present? */
     sk_init();
 
@@ -723,7 +728,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
                timer_id = 0;
            }
            HideCaret(hwnd);
-           term_out();
+           if (GetCapture() != hwnd)
+               term_out();
            term_update();
            ShowCaret(hwnd);
 
@@ -750,6 +756,14 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
        }
     }
 
+    cleanup_exit(msg.wParam);
+}
+
+/*
+ * Clean up and exit.
+ */
+void cleanup_exit(int code)
+{
     /*
      * Clean up.
      */
@@ -757,7 +771,9 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
     sfree(logpal);
     if (pal)
        DeleteObject(pal);
-    WSACleanup();
+    sk_cleanup();
+    if (wsa_started)
+       WSACleanup();
 
     if (cfg.protocol == PROT_SSH) {
        random_save_seed();
@@ -766,7 +782,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
 #endif
     }
 
-    return msg.wParam;
+    exit(code);
 }
 
 /*
@@ -1517,7 +1533,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
       case WM_TIMER:
        if (pending_netevent)
            enact_pending_netevent();
-       term_out();
+       if (GetCapture() != hwnd)
+           term_out();
        noise_regular();
        HideCaret(hwnd);
        term_update();
@@ -1937,7 +1954,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
         */
        noise_ultralight(lParam);
 
-       if (wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) {
+       if (wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON) &&
+           GetCapture() == hwnd) {
            Mouse_Button b;
            if (wParam & MK_LBUTTON)
                b = MBT_LEFT;
@@ -2429,7 +2447,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
            return TRUE;
        }
       default:
-       if (message == wm_mousewheel) {
+       if (message == wm_mousewheel || message == WM_MOUSEWHEEL) {
            int shift_pressed=0, control_pressed=0, alt_pressed=0;
 
            if (message == WM_MOUSEWHEEL) {
@@ -4118,7 +4136,7 @@ void fatalbox(char *fmt, ...)
     vsprintf(stuff, fmt, ap);
     va_end(ap);
     MessageBox(hwnd, stuff, "PuTTY Fatal Error", MB_ICONERROR | MB_OK);
-    exit(1);
+    cleanup_exit(1);
 }
 
 /*
@@ -4217,6 +4235,11 @@ void set_iconic(int iconic)
  */
 void move_window(int x, int y)
 {
+    if (cfg.resize_action == RESIZE_DISABLED || 
+        cfg.resize_action == RESIZE_FONT ||
+       IsZoomed(hwnd))
+       return;
+
     SetWindowPos(hwnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
 }