X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/232c6eacfb0a777d55172e80c494d2623bdea47f..681beafc906c71e3d8fa523fc9e6b0fd9be3ed7a:/windows/window.c diff --git a/windows/window.c b/windows/window.c index b00865ad..7cd306da 100644 --- a/windows/window.c +++ b/windows/window.c @@ -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; @@ -2765,15 +2788,22 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, 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) + 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_FONT && !is_alt_pressed()) { + } 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;