X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/a0b1cefc0a03cda2c7d4c39a209a8bd21114efe0..676c055670214ebd4ef78460f1f9d9f63e1e8ce8:/window.c diff --git a/window.c b/window.c index 3eaa0336..8c82af9a 100644 --- a/window.c +++ b/window.c @@ -7,27 +7,32 @@ #define PUTTY_DO_GLOBALS /* actually _define_ globals */ #include "putty.h" #include "win_res.h" - -#define IDM_SHOWLOG 501 -#define IDM_NEWSESS 502 -#define IDM_DUPSESS 503 -#define IDM_RECONF 504 -#define IDM_CLRSB 505 -#define IDM_RESET 506 -#define IDM_TEL_AYT 507 -#define IDM_TEL_BRK 508 -#define IDM_TEL_SYNCH 509 -#define IDM_TEL_EC 510 -#define IDM_TEL_EL 511 -#define IDM_TEL_GA 512 -#define IDM_TEL_NOP 513 -#define IDM_TEL_ABORT 514 -#define IDM_TEL_AO 515 -#define IDM_TEL_IP 516 -#define IDM_TEL_SUSP 517 -#define IDM_TEL_EOR 518 -#define IDM_TEL_EOF 519 -#define IDM_ABOUT 520 +#include "sizetip.h" + +#define IDM_SHOWLOG 0x0010 +#define IDM_NEWSESS 0x0020 +#define IDM_DUPSESS 0x0030 +#define IDM_RECONF 0x0040 +#define IDM_CLRSB 0x0050 +#define IDM_RESET 0x0060 +#define IDM_TEL_AYT 0x0070 +#define IDM_TEL_BRK 0x0080 +#define IDM_TEL_SYNCH 0x0090 +#define IDM_TEL_EC 0x00a0 +#define IDM_TEL_EL 0x00b0 +#define IDM_TEL_GA 0x00c0 +#define IDM_TEL_NOP 0x00d0 +#define IDM_TEL_ABORT 0x00e0 +#define IDM_TEL_AO 0x00f0 +#define IDM_TEL_IP 0x0100 +#define IDM_TEL_SUSP 0x0110 +#define IDM_TEL_EOR 0x0120 +#define IDM_TEL_EOF 0x0130 +#define IDM_ABOUT 0x0140 +#define IDM_SAVEDSESS 0x0150 + +#define IDM_SAVED_MIN 0x1000 +#define IDM_SAVED_MAX 0x2000 #define WM_IGNORE_SIZE (WM_USER + 2) #define WM_IGNORE_CLIP (WM_USER + 3) @@ -78,6 +83,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { MSG msg; int guess_width, guess_height; + putty_inst = inst; + winsock_ver = MAKEWORD(1, 1); if (WSAStartup(winsock_ver, &wsadata)) { MessageBox(NULL, "Unable to initialise WinSock", "WinSock Error", @@ -100,12 +107,33 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { { char *p; + default_protocol = DEFAULT_PROTOCOL; + default_port = DEFAULT_PORT; + do_defaults(NULL); p = cmdline; while (*p && isspace(*p)) p++; /* + * Process command line options first. Yes, this can be + * done better, and it will be as soon as I have the + * energy... + */ + while (*p == '-') { + char *q = p + strcspn(p, " \t"); + p++; + if (q == p + 3 && + tolower(p[0]) == 's' && + tolower(p[1]) == 's' && + tolower(p[2]) == 'h') { + default_protocol = cfg.protocol = PROT_SSH; + default_port = cfg.port = 22; + } + p = q + strspn(q, " \t"); + } + + /* * An initial @ means to activate a saved session. */ if (*p == '@') { @@ -153,7 +181,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { } } - back = (cfg.protocol == PROT_SSH ? &ssh_backend : &telnet_backend); + back = (cfg.protocol == PROT_SSH ? &ssh_backend : + cfg.protocol == PROT_TELNET ? &telnet_backend : &raw_backend ); if (!prev) { wndclass.style = 0; @@ -267,7 +296,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { return 0; } window_name = icon_name = NULL; - sprintf(msg, "PuTTY: %s", realhost); + sprintf(msg, "%s - PuTTY", realhost); set_title (msg); set_icon (msg); } @@ -290,7 +319,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { */ { HMENU m = GetSystemMenu (hwnd, FALSE); - HMENU p; + HMENU p,s; + int i; AppendMenu (m, MF_SEPARATOR, 0, 0); if (cfg.protocol == PROT_TELNET) { @@ -317,6 +347,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { } AppendMenu (m, MF_ENABLED, IDM_NEWSESS, "New Session"); AppendMenu (m, MF_ENABLED, IDM_DUPSESS, "Duplicate Session"); + s = CreateMenu(); + get_sesslist(TRUE); + for (i = 1 ; i < ((nsessions < 256) ? nsessions : 256) ; i++) + AppendMenu (s, MF_ENABLED, IDM_SAVED_MIN + (16 * i) , sessions[i]); + AppendMenu (m, MF_POPUP | MF_ENABLED, (UINT) s, "Saved Sessions"); AppendMenu (m, MF_ENABLED, IDM_RECONF, "Change Settings"); AppendMenu (m, MF_SEPARATOR, 0, 0); AppendMenu (m, MF_ENABLED, IDM_CLRSB, "Clear Scrollback"); @@ -585,15 +620,17 @@ static int WINAPI WndProc (HWND hwnd, UINT message, PostQuitMessage (0); return 0; case WM_SYSCOMMAND: - switch (wParam) { + switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */ case IDM_SHOWLOG: shownegot(hwnd); break; case IDM_NEWSESS: case IDM_DUPSESS: + case IDM_SAVEDSESS: { char b[2048]; char c[30], *cl; + int freecl = FALSE; STARTUPINFO si; PROCESS_INFORMATION pi; HANDLE filemap = NULL; @@ -626,6 +663,13 @@ static int WINAPI WndProc (HWND hwnd, UINT message, } sprintf(c, "putty &%08x", filemap); cl = c; + } else if (wParam == IDM_SAVEDSESS) { + char *session = sessions[(lParam - IDM_SAVED_MIN) / 16]; + cl = malloc(16 + strlen(session)); /* 8, but play safe */ + if (!cl) + cl = NULL; /* not a very important failure mode */ + sprintf(cl, "putty @%s", session); + freecl = TRUE; } else cl = NULL; @@ -642,6 +686,8 @@ static int WINAPI WndProc (HWND hwnd, UINT message, if (filemap) CloseHandle(filemap); + if (freecl) + free(cl); } break; case IDM_RECONF: @@ -698,6 +744,10 @@ static int WINAPI WndProc (HWND hwnd, UINT message, case IDM_ABOUT: showabout (hwnd); break; + default: + if (wParam >= IDM_SAVED_MIN && wParam <= IDM_SAVED_MAX) { + SendMessage(hwnd, WM_SYSCOMMAND, IDM_SAVEDSESS, wParam); + } } break; @@ -824,6 +874,12 @@ static int WINAPI WndProc (HWND hwnd, UINT message, case WM_IGNORE_SIZE: ignore_size = TRUE; /* don't panic on next WM_SIZE msg */ break; + case WM_ENTERSIZEMOVE: + EnableSizeTip(1); + break; + case WM_EXITSIZEMOVE: + EnableSizeTip(0); + break; case WM_SIZING: { int width, height, w, h, ew, eh; @@ -833,6 +889,7 @@ static int WINAPI WndProc (HWND hwnd, UINT message, height = r->bottom - r->top - extra_height; w = (width + font_width/2) / font_width; if (w < 1) w = 1; h = (height + font_height/2) / font_height; if (h < 1) h = 1; + UpdateSizeTip(hwnd, w, h); ew = width - w * font_width; eh = height - h * font_height; if (ew != 0) { @@ -1412,7 +1469,7 @@ void set_sbar (int total, int start, int page) { SetScrollInfo (hwnd, SB_VERT, &si, TRUE); } -Context get_ctx() { +Context get_ctx(void) { HDC hdc; if (hwnd) { hdc = GetDC (hwnd); @@ -1540,11 +1597,10 @@ void get_clip (void **p, int *len) { */ void optimised_move (int to, int from, int lines) { RECT r; - int min, max, d; + int min, max; min = (to < from ? to : from); max = to + from - min; - d = max - min; r.left = 0; r.right = cols * font_width; r.top = min * font_height; r.bottom = (max+lines) * font_height;