X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/7440fd4419acfc9c784f142fb9dee3e64c9a18c2..2b5567cf51478b76b3048939b4803f686c5d41cb:/window.c diff --git a/window.c b/window.c index 5174b46f..c76b083d 100644 --- a/window.c +++ b/window.c @@ -33,6 +33,7 @@ #define IDM_SAVEDSESS 0x0160 #define IDM_COPYALL 0x0170 #define IDM_FULLSCREEN 0x0180 +#define IDM_PASTE 0x0190 #define IDM_SESSLGP 0x0250 /* log type printable */ #define IDM_SESSLGA 0x0260 /* log type all chars */ @@ -111,6 +112,12 @@ static int session_closed; static const struct telnet_special *specials; static int specials_menu_position; +static struct { + HMENU menu; + int specials_submenu_pos; +} popup_menus[2]; +enum { SYSMENU, CTXMENU }; + Config cfg; /* exported to windlg.c */ extern struct sesslist sesslist; /* imported from windlg.c */ @@ -650,17 +657,14 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) * Set up the session-control options on the system menu. */ { - HMENU m = GetSystemMenu(hwnd, FALSE); - HMENU s; - int i; + HMENU s, m; + int i, j; char *str; - AppendMenu(m, MF_SEPARATOR, 0, 0); - specials_menu_position = GetMenuItemCount(m); - AppendMenu(m, MF_ENABLED, IDM_SHOWLOG, "&Event Log"); - AppendMenu(m, MF_SEPARATOR, 0, 0); - AppendMenu(m, MF_ENABLED, IDM_NEWSESS, "Ne&w Session..."); - AppendMenu(m, MF_ENABLED, IDM_DUPSESS, "&Duplicate Session"); + popup_menus[SYSMENU].menu = GetSystemMenu(hwnd, FALSE); + popup_menus[CTXMENU].menu = CreatePopupMenu(); + AppendMenu(popup_menus[CTXMENU].menu, MF_ENABLED, IDM_PASTE, "&Paste"); + s = CreateMenu(); get_sesslist(&sesslist, TRUE); for (i = 1; @@ -668,21 +672,32 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) i++) AppendMenu(s, MF_ENABLED, IDM_SAVED_MIN + (16 * i), sesslist.sessions[i]); - AppendMenu(m, MF_POPUP | MF_ENABLED, (UINT) s, "Sa&ved Sessions"); - AppendMenu(m, MF_ENABLED, IDM_RECONF, "Chan&ge Settings..."); - AppendMenu(m, MF_SEPARATOR, 0, 0); - AppendMenu(m, MF_ENABLED, IDM_COPYALL, "C&opy All to Clipboard"); - AppendMenu(m, MF_ENABLED, IDM_CLRSB, "C&lear Scrollback"); - AppendMenu(m, MF_ENABLED, IDM_RESET, "Rese&t Terminal"); - AppendMenu(m, MF_SEPARATOR, 0, 0); - AppendMenu(m, (cfg.resize_action == RESIZE_DISABLED) ? - MF_GRAYED : MF_ENABLED, IDM_FULLSCREEN, "&Full Screen"); - AppendMenu(m, MF_SEPARATOR, 0, 0); - if (help_path) - AppendMenu(m, MF_ENABLED, IDM_HELP, "&Help"); - str = dupprintf("&About %s", appname); - AppendMenu(m, MF_ENABLED, IDM_ABOUT, str); - sfree(str); + + for (j = 0; j < lenof(popup_menus); j++) { + m = popup_menus[j].menu; + + AppendMenu(m, MF_SEPARATOR, 0, 0); + popup_menus[j].specials_submenu_pos = GetMenuItemCount(m); + AppendMenu(m, MF_ENABLED, IDM_SHOWLOG, "&Event Log"); + AppendMenu(m, MF_SEPARATOR, 0, 0); + AppendMenu(m, MF_ENABLED, IDM_NEWSESS, "Ne&w Session..."); + AppendMenu(m, MF_ENABLED, IDM_DUPSESS, "&Duplicate Session"); + AppendMenu(m, MF_POPUP | MF_ENABLED, (UINT) s, "Sa&ved Sessions"); + AppendMenu(m, MF_ENABLED, IDM_RECONF, "Chan&ge Settings..."); + AppendMenu(m, MF_SEPARATOR, 0, 0); + AppendMenu(m, MF_ENABLED, IDM_COPYALL, "C&opy All to Clipboard"); + AppendMenu(m, MF_ENABLED, IDM_CLRSB, "C&lear Scrollback"); + AppendMenu(m, MF_ENABLED, IDM_RESET, "Rese&t Terminal"); + AppendMenu(m, MF_SEPARATOR, 0, 0); + AppendMenu(m, (cfg.resize_action == RESIZE_DISABLED) ? + MF_GRAYED : MF_ENABLED, IDM_FULLSCREEN, "&Full Screen"); + AppendMenu(m, MF_SEPARATOR, 0, 0); + if (help_path) + AppendMenu(m, MF_ENABLED, IDM_HELP, "&Help"); + str = dupprintf("&About %s", appname); + AppendMenu(m, MF_ENABLED, IDM_ABOUT, str); + sfree(str); + } } update_specials_menu(NULL); @@ -852,7 +867,7 @@ void update_specials_menu(void *frontend) { HMENU m = GetSystemMenu(hwnd, FALSE); int menu_already_exists = (specials != NULL); - int i; + int i, j; specials = back->get_specials(backhandle); if (specials) { @@ -865,14 +880,20 @@ void update_specials_menu(void *frontend) else AppendMenu(p, MF_SEPARATOR, 0, 0); } - if (menu_already_exists) - DeleteMenu(m, specials_menu_position, MF_BYPOSITION); - else - InsertMenu(m, specials_menu_position, - MF_BYPOSITION | MF_SEPARATOR, 0, 0); - InsertMenu(m, specials_menu_position, - MF_BYPOSITION | MF_POPUP | MF_ENABLED, - (UINT) p, "Special Command"); + for (j = 0; j < lenof(popup_menus); j++) { + if (menu_already_exists) + DeleteMenu(popup_menus[j].menu, + popup_menus[j].specials_submenu_pos, + MF_BYPOSITION); + else + InsertMenu(popup_menus[j].menu, + popup_menus[j].specials_submenu_pos, + MF_BYPOSITION | MF_SEPARATOR, 0, 0); + InsertMenu(popup_menus[j].menu, + popup_menus[j].specials_submenu_pos, + MF_BYPOSITION | MF_POPUP | MF_ENABLED, + (UINT) p, "Special Command"); + } } } @@ -1619,9 +1640,9 @@ static Mouse_Button translate_button(Mouse_Button button) if (button == MBT_LEFT) return MBT_SELECT; if (button == MBT_MIDDLE) - return cfg.mouse_is_xterm ? MBT_PASTE : MBT_EXTEND; + return cfg.mouse_is_xterm == 1 ? MBT_PASTE : MBT_EXTEND; if (button == MBT_RIGHT) - return cfg.mouse_is_xterm ? MBT_EXTEND : MBT_PASTE; + return cfg.mouse_is_xterm == 1 ? MBT_EXTEND : MBT_PASTE; return 0; /* shouldn't happen */ } @@ -1711,6 +1732,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, show_mouseptr(1); PostQuitMessage(0); return 0; + case WM_COMMAND: case WM_SYSCOMMAND: switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */ case IDM_SHOWLOG: @@ -1932,6 +1954,9 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, case IDM_COPYALL: term_copyall(term); break; + case IDM_PASTE: + term_do_paste(term); + break; case IDM_CLRSB: term_clrsb(term); break; @@ -2003,6 +2028,18 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: + if (message == WM_RBUTTONDOWN && + ((wParam & MK_CONTROL) || (cfg.mouse_is_xterm == 2))) { + POINT cursorpos; + + show_mouseptr(1); /* make sure pointer is visible */ + GetCursorPos(&cursorpos); + TrackPopupMenu(popup_menus[CTXMENU].menu, + TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, + cursorpos.x, cursorpos.y, + 0, hwnd, NULL); + break; + } { int button, press; @@ -2087,7 +2124,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, case WM_NCMOUSEMOVE: show_mouseptr(1); noise_ultralight(lParam); - return 0; + break; case WM_IGNORE_CLIP: ignore_clip = wParam; /* don't panic on DESTROYCLIPBOARD */ break; @@ -4396,10 +4433,10 @@ void beep(void *frontend, int mode) } else if (mode == BELL_WAVEFILE) { if (!PlaySound(cfg.bell_wavefile.path, NULL, SND_ASYNC | SND_FILENAME)) { - char buf[sizeof(cfg.bell_wavefile) + 80]; + char buf[sizeof(cfg.bell_wavefile.path) + 80]; char otherbuf[100]; sprintf(buf, "Unable to play sound file\n%s\n" - "Using default sound instead", cfg.bell_wavefile); + "Using default sound instead", cfg.bell_wavefile.path); sprintf(otherbuf, "%.70s Sound Error", appname); MessageBox(hwnd, buf, otherbuf, MB_OK | MB_ICONEXCLAMATION); @@ -4547,7 +4584,7 @@ int is_full_screen() * one monitor is present. */ static int get_fullscreen_rect(RECT * ss) { -#ifdef MONITOR_DEFAULTTONEAREST +#if defined(MONITOR_DEFAULTTONEAREST) && !defined(NO_MULTIMON) HMONITOR mon; MONITORINFO mi; mon = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);