Fix up svn:eol-style and svn:keywords on new files.
[u/mdw/putty] / windows / window.c
index 2b80430..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);
 }
 
@@ -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();