The special treatment of Alt-resize (to cause resizing to affect the
[u/mdw/putty] / windows / window.c
index 8068bc3..12b6fe7 100644 (file)
@@ -1331,7 +1331,7 @@ debug(("general_textout: done, xn=%d\n", xn));
 
 /*
  * Initialise all the fonts we will need initially. There may be as many as
- * three or as few as one.  The other (poentially) twentyone fonts are done
+ * three or as few as one.  The other (potentially) twenty-one fonts are done
  * if/when they are needed.
  *
  * We also:
@@ -2627,7 +2627,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
         * 1) Keep the sizetip uptodate
         * 2) Make sure the window size is _stepped_ in units of the font size.
         */
-       if (cfg.resize_action != RESIZE_FONT && !is_alt_pressed()) {
+        if (cfg.resize_action == RESIZE_TERM ||
+            (cfg.resize_action == RESIZE_EITHER && !is_alt_pressed())) {
            int width, height, w, h, ew, eh;
            LPRECT r = (LPRECT) lParam;
 
@@ -2750,55 +2751,57 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
            width = LOWORD(lParam);
            height = HIWORD(lParam);
 
-           if (!resizing) {
-               if (wParam == SIZE_MAXIMIZED && !was_zoomed) {
-                   was_zoomed = 1;
-                   prev_rows = term->rows;
-                   prev_cols = term->cols;
-                   if (cfg.resize_action == RESIZE_TERM) {
-                       w = width / font_width;
-                       if (w < 1) w = 1;
-                       h = height / font_height;
-                       if (h < 1) h = 1;
-
-                       term_size(term, h, w, cfg.savelines);
-                   }
-                   reset_window(0);
-               } else if (wParam == SIZE_RESTORED && was_zoomed) {
-                   was_zoomed = 0;
-                   if (cfg.resize_action == RESIZE_TERM)
-                       term_size(term, prev_rows, prev_cols, cfg.savelines);
-                   if (cfg.resize_action != RESIZE_FONT)
-                       reset_window(2);
-                   else
-                       reset_window(0);
-               }
-               /* This is an unexpected resize, these will normally happen
-                * if the window is too large. Probably either the user
-                * selected a huge font or the screen size has changed.
-                *
-                * This is also called with minimize.
-                */
-               else reset_window(-1);
-           }
-
-           /*
-            * Don't call back->size in mid-resize. (To prevent
-            * massive numbers of resize events getting sent
-            * down the connection during an NT opaque drag.)
-            */
-           if (resizing) {
-               if (cfg.resize_action != RESIZE_FONT && !is_alt_pressed()) {
+            if (wParam == SIZE_MAXIMIZED && !was_zoomed) {
+                was_zoomed = 1;
+                prev_rows = term->rows;
+                prev_cols = term->cols;
+                if (cfg.resize_action == RESIZE_TERM) {
+                    w = width / font_width;
+                    if (w < 1) w = 1;
+                    h = height / font_height;
+                    if (h < 1) h = 1;
+
+                    term_size(term, h, w, cfg.savelines);
+                }
+                reset_window(0);
+            } else if (wParam == SIZE_RESTORED && was_zoomed) {
+                was_zoomed = 0;
+                if (cfg.resize_action == RESIZE_TERM) {
+                    w = (width-cfg.window_border*2) / font_width;
+                    if (w < 1) w = 1;
+                    h = (height-cfg.window_border*2) / font_height;
+                    if (h < 1) h = 1;
+                    term_size(term, h, w, cfg.savelines);
+                    reset_window(2);
+                } else if (cfg.resize_action != RESIZE_FONT)
+                    reset_window(2);
+                else
+                    reset_window(0);
+            } else if (wParam == SIZE_MINIMIZED) {
+                /* do nothing */
+           } else if (cfg.resize_action == RESIZE_TERM ||
+                       (cfg.resize_action == RESIZE_EITHER &&
+                        !is_alt_pressed())) {
+                w = (width-cfg.window_border*2) / font_width;
+                if (w < 1) w = 1;
+                h = (height-cfg.window_border*2) / font_height;
+                if (h < 1) h = 1;
+
+                if (resizing) {
+                    /*
+                     * Don't call back->size in mid-resize. (To
+                     * prevent massive numbers of resize events
+                     * getting sent down the connection during an NT
+                     * opaque drag.)
+                     */
                    need_backend_resize = TRUE;
-                   w = (width-cfg.window_border*2) / font_width;
-                   if (w < 1) w = 1;
-                   h = (height-cfg.window_border*2) / font_height;
-                   if (h < 1) h = 1;
-
                    cfg.height = h;
                    cfg.width = w;
-               } else 
-                   reset_window(0);
+                } else {
+                    term_size(term, h, w, cfg.savelines);
+                }
+            } else {
+                reset_window(0);
            }
        }
        sys_cursor_update();
@@ -3811,6 +3814,10 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
            SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);
            return 0;
        }
+       if ((wParam == VK_PRIOR || wParam == VK_NEXT) && shift_state == 3) {
+           term_scroll_to_selection(term, (wParam == VK_PRIOR ? 0 : 1));
+           return 0;
+       }
        if (wParam == VK_INSERT && shift_state == 1) {
            request_paste(NULL);
            return 0;
@@ -4214,37 +4221,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
                break;
            }
            if (xkey) {
-               if (term->vt52_mode)
-                   p += sprintf((char *) p, "\x1B%c", xkey);
-               else {
-                   int app_flg = (term->app_cursor_keys && !cfg.no_applic_c);
-#if 0
-                   /*
-                    * RDB: VT100 & VT102 manuals both state the
-                    * app cursor keys only work if the app keypad
-                    * is on.
-                    * 
-                    * SGT: That may well be true, but xterm
-                    * disagrees and so does at least one
-                    * application, so I've #if'ed this out and the
-                    * behaviour is back to PuTTY's original: app
-                    * cursor and app keypad are independently
-                    * switchable modes. If anyone complains about
-                    * _this_ I'll have to put in a configurable
-                    * option.
-                    */
-                   if (!term->app_keypad_keys)
-                       app_flg = 0;
-#endif
-                   /* Useful mapping of Ctrl-arrows */
-                   if (shift_state == 2)
-                       app_flg = !app_flg;
-
-                   if (app_flg)
-                       p += sprintf((char *) p, "\x1BO%c", xkey);
-                   else
-                       p += sprintf((char *) p, "\x1B[%c", xkey);
-               }
+               p += format_arrow_key(p, term, xkey, shift_state);
                return p - output;
            }
        }
@@ -5041,16 +5018,12 @@ void modalfatalbox(char *fmt, ...)
     cleanup_exit(1);
 }
 
-typedef BOOL (WINAPI *p_FlashWindowEx_t)(PFLASHWINFO);
-static p_FlashWindowEx_t p_FlashWindowEx = NULL;
+DECL_WINDOWS_FUNCTION(static, BOOL, FlashWindowEx, (PFLASHWINFO));
 
 static void init_flashwindow(void)
 {
-    HMODULE user32_module = LoadLibrary("USER32.DLL");
-    if (user32_module) {
-       p_FlashWindowEx = (p_FlashWindowEx_t)
-           GetProcAddress(user32_module, "FlashWindowEx");
-    }
+    HMODULE user32_module = load_system32_dll("user32.dll");
+    GET_WINDOWS_FUNCTION(user32_module, FlashWindowEx);
 }
 
 static BOOL flash_window_ex(DWORD dwFlags, UINT uCount, DWORD dwTimeout)