WM_SIZE/SIZE_MAXIMIZED can show up even during an interactive resize,
[u/mdw/putty] / windows / window.c
index 908c1f6..a1d99ba 100644 (file)
@@ -445,7 +445,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
            HANDLE filemap;
            void *cp;
            unsigned cpsize;
-           if (sscanf(p + 1, "%p:%u", &filemap, &cpsize) == 1 &&
+           if (sscanf(p + 1, "%p:%u", &filemap, &cpsize) == 2 &&
                (cp = MapViewOfFile(filemap, FILE_MAP_READ,
                                    0, 0, cpsize)) != NULL) {
                conf_deserialise(conf, cp, cpsize);
@@ -1433,7 +1433,7 @@ static void init_fonts(int pick_width, int pick_height)
 #define f(i,c,w,u) \
     fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
                           c, OUT_DEFAULT_PRECIS, \
-                          CLIP_DEFAULT_PRECIS, quality, \
+                          CLIP_DEFAULT_PRECIS, FONT_QUALITY(quality), \
                           FIXED_PITCH | FF_DONTCARE, font->name)
 
     f(FONT_NORMAL, font->charset, fw_dontcare, FALSE);
@@ -2315,7 +2315,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                {
                    FontSpec *font = conf_get_fontspec(conf, CONF_font);
                    FontSpec *prev_font = conf_get_fontspec(prev_conf,
-                                                           CONF_font);
+                                                             CONF_font);
 
                    if (!strcmp(font->name, prev_font->name) ||
                        !strcmp(conf_get_str(conf, CONF_line_codepage),
@@ -2899,7 +2899,21 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                     h = height / font_height;
                     if (h < 1) h = 1;
 
-                    term_size(term, h, w, conf_get_int(conf, CONF_savelines));
+                    if (resizing) {
+                        /*
+                         * As below, if we're in the middle of an
+                         * interactive resize we don't call
+                         * back->size. In Windows 7, this case can
+                         * arise in maximisation as well via the Aero
+                         * snap UI.
+                         */
+                        need_backend_resize = TRUE;
+                        conf_set_int(conf, CONF_height, h);
+                        conf_set_int(conf, CONF_width, w);
+                    } else {
+                        term_size(term, h, w,
+                                  conf_get_int(conf, CONF_savelines));
+                    }
                 }
                 reset_window(0);
             } else if (wParam == SIZE_RESTORED && was_zoomed) {
@@ -2934,7 +2948,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                      */
                    need_backend_resize = TRUE;
                    conf_set_int(conf, CONF_height, h);
-                   conf_set_int(conf, CONF_height, w);
+                   conf_set_int(conf, CONF_width, w);
                 } else {
                     term_size(term, h, w, conf_get_int(conf, CONF_savelines));
                 }
@@ -3594,8 +3608,8 @@ void do_text_internal(Context ctx, int x, int y, wchar_t *text, int len,
            dec = dec * 2 - font_height;
 
        oldpen = SelectObject(hdc, CreatePen(PS_SOLID, 0, fg));
-       MoveToEx(hdc, x, y + dec, NULL);
-       LineTo(hdc, x + len * char_width, y + dec);
+       MoveToEx(hdc, line_box.left, line_box.top + dec, NULL);
+       LineTo(hdc, line_box.right, line_box.top + dec);
        oldpen = SelectObject(hdc, oldpen);
        DeleteObject(oldpen);
     }
@@ -5612,6 +5626,11 @@ int from_backend_untrusted(void *frontend, const char *data, int len)
     return term_data_untrusted(term, data, len);
 }
 
+int from_backend_eof(void *frontend)
+{
+    return TRUE;   /* do respond to incoming EOF with outgoing */
+}
+
 int get_userpass_input(prompts_t *p, unsigned char *in, int inlen)
 {
     int ret;