Fix up svn:eol-style and svn:keywords on new files.
[u/mdw/putty] / windows / window.c
index 05d5ccc..7cd306d 100644 (file)
@@ -317,6 +317,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
 {
     WNDCLASS wndclass;
     MSG msg;
+    HRESULT hr;
     int guess_width, guess_height;
 
     hinst = inst;
@@ -355,6 +356,18 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
     init_flashwindow();
 
     /*
+     * Initialize COM.
+     */
+    hr = CoInitialize(NULL);
+    if (hr != S_OK && hr != S_FALSE) {
+        char *str = dupprintf("%s Fatal Error", appname);
+       MessageBox(NULL, "Failed to initialize COM subsystem",
+                  str, MB_OK | MB_ICONEXCLAMATION);
+       sfree(str);
+       return 1;
+    }
+
+    /*
      * Process the command line.
      */
     {
@@ -381,14 +394,21 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
 
        /*
         * Process a couple of command-line options which are more
-        * easily dealt with before the line is broken up into
-        * words. These are the soon-to-be-defunct @sessionname and
-        * the internal-use-only &sharedmemoryhandle, neither of
-        * which are combined with anything else.
+        * easily dealt with before the line is broken up into words.
+        * These are the old-fashioned but convenient @sessionname and
+        * the internal-use-only &sharedmemoryhandle, neither of which
+        * are combined with anything else.
         */
        while (*p && isspace(*p))
            p++;
        if (*p == '@') {
+            /*
+             * An initial @ means that the whole of the rest of the
+             * command line should be treated as the name of a saved
+             * session, with _no quoting or escaping_. This makes it a
+             * very convenient means of automated saved-session
+             * launching, via IDM_SAVEDSESS or Windows 7 jump lists.
+             */
            int i = strlen(p);
            while (i > 1 && isspace(p[i - 1]))
                i--;
@@ -867,6 +887,9 @@ void cleanup_exit(int code)
     }
     shutdown_help();
 
+    /* Clean up COM. */
+    CoUninitialize();
+
     exit(code);
 }
 
@@ -1331,7 +1354,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:
@@ -2044,7 +2067,6 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                                           / MENU_SAVED_STEP) + 1;
                    if (sessno < (unsigned)sesslist.nsessions) {
                        char *session = sesslist.sessions[sessno];
-                       /* XXX spaces? quotes? "-load"? */
                        cl = dupprintf("putty @%s", session);
                        inherit_handles = FALSE;
                        freecl = TRUE;
@@ -2627,7 +2649,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 +2773,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 +3836,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 +4243,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;
            }
        }
@@ -5045,7 +5044,7 @@ DECL_WINDOWS_FUNCTION(static, BOOL, FlashWindowEx, (PFLASHWINFO));
 
 static void init_flashwindow(void)
 {
-    HMODULE user32_module = LoadLibrary("USER32.DLL");
+    HMODULE user32_module = load_system32_dll("user32.dll");
     GET_WINDOWS_FUNCTION(user32_module, FlashWindowEx);
 }