From 890582d297047a9c02056a3ecd5704ad34373d6b Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Wed, 19 Nov 2003 20:48:30 +0000 Subject: [PATCH] Introduce a context menu which appears on Ctrl+rightclick. This menu contains all the stuff in the System menu except for the standard System menu bits (move, resize, close etc), and also contains `Paste'. [originally from svn r3555] --- window.c | 101 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 68 insertions(+), 33 deletions(-) diff --git a/window.c b/window.c index 35df36ac..db645137 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"); + } } } @@ -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,16 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: + if (message == WM_RBUTTONDOWN && (wParam & MK_CONTROL)) { + POINT cursorpos; + + GetCursorPos(&cursorpos); + TrackPopupMenu(popup_menus[CTXMENU].menu, + TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON, + cursorpos.x, cursorpos.y, + 0, hwnd, NULL); + break; + } { int button, press;