Squelch some spurious resize events.
[u/mdw/putty] / window.c
index 2797c53..f810eba 100644 (file)
--- a/window.c
+++ b/window.c
@@ -314,6 +314,14 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
         }
     }
 
+    /* Check for invalid Port number (i.e. zero) */
+    if (cfg.port == 0) {
+        MessageBox(NULL, "Invalid Port Number",
+                  "PuTTY Internal Error", MB_OK |MB_ICONEXCLAMATION);
+        WSACleanup();
+        return 1;
+    }
+
     real_ldisc = (cfg.ldisc_term ? &ldisc_term : &ldisc_simple);
     /* To start with, we use the simple line discipline, so we can
      * type passwords etc without fear of them being echoed... */
@@ -418,6 +426,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
         caretbm = CreateBitmap(font_width, font_height, 1, 1, bits);
         sfree(bits);
     }
+    CreateCaret(hwnd, caretbm, font_width, font_height);
 
     /*
      * Initialise the scroll bar.
@@ -1051,6 +1060,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
     static int ignore_clip = FALSE;
     static int just_reconfigged = FALSE;
     static int resizing = FALSE;
+    static int need_backend_resize = FALSE;
 
     switch (message) {
       case WM_TIMER:
@@ -1161,6 +1171,12 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
           case IDM_RECONF:
             {
                 int prev_alwaysontop = cfg.alwaysontop;
+               int need_setwpos = FALSE;
+               int old_fwidth, old_fheight;
+               cfg.width = cols;
+               cfg.height = rows;
+               old_fwidth = font_width;
+               old_fheight = font_height;
                 if (!do_reconfig(hwnd))
                     break;
                 just_reconfigged = TRUE;
@@ -1223,6 +1239,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
                             SetWindowLong(hwnd, GWL_EXSTYLE, nexflag);
 
                         SendMessage (hwnd, WM_IGNORE_SIZE, 0, 0);
+
                         SetWindowPos(hwnd, NULL, 0,0,0,0,
                                      SWP_NOACTIVATE|SWP_NOCOPYBITS|
                                      SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|
@@ -1235,13 +1252,22 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
                     }
                 }
 
+               if (cfg.height != rows ||
+                   cfg.width != cols ||
+                   old_fwidth != font_width ||
+                   old_fheight != font_height ||
+                   cfg.savelines != savelines)
+                   need_setwpos = TRUE;
                 term_size(cfg.height, cfg.width, cfg.savelines);
                 InvalidateRect(hwnd, NULL, TRUE);
-                SetWindowPos (hwnd, NULL, 0, 0,
-                              extra_width + font_width * cfg.width,
-                              extra_height + font_height * cfg.height,
-                              SWP_NOACTIVATE | SWP_NOCOPYBITS |
-                              SWP_NOMOVE | SWP_NOZORDER);
+                if (need_setwpos) {
+                   force_normal(hwnd);
+                   SetWindowPos (hwnd, NULL, 0, 0,
+                                 extra_width + font_width * cfg.width,
+                                 extra_height + font_height * cfg.height,
+                                 SWP_NOACTIVATE | SWP_NOCOPYBITS |
+                                 SWP_NOMOVE | SWP_NOZORDER);
+               }
                 if (IsIconic(hwnd)) {
                     SetWindowText (hwnd,
                                    cfg.win_name_always ? window_name : icon_name);
@@ -1379,7 +1405,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
        return 0;
       case WM_SETFOCUS:
        has_focus = TRUE;
-        CreateCaret(hwnd, caretbm, 0, 0);
+        CreateCaret(hwnd, caretbm, font_width, font_height);
         ShowCaret(hwnd);
         compose_state = 0;
        term_out();
@@ -1397,11 +1423,13 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
       case WM_ENTERSIZEMOVE:
         EnableSizeTip(1);
         resizing = TRUE;
+       need_backend_resize = FALSE;
         break;
       case WM_EXITSIZEMOVE:
         EnableSizeTip(0);
         resizing = FALSE;
-        back->size();
+       if (need_backend_resize)
+           back->size();
         break;
       case WM_SIZING:
        {
@@ -1477,6 +1505,8 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
                  */
                 if (!resizing)
                     back->size();
+               else
+                   need_backend_resize = TRUE;
                just_reconfigged = FALSE;
            }
        }