X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/fd64bb2775d7bf733130dd70cb41c0bc9a7645ec..6bbce591e72352b2ce5e4915e7ab05f316083ab7:/windows/window.c diff --git a/windows/window.c b/windows/window.c index fedcc359..68920d38 100644 --- a/windows/window.c +++ b/windows/window.c @@ -78,6 +78,7 @@ static void init_fonts(int, int); static void another_font(int); static void deinit_fonts(void); static void set_input_locale(HKL); +static void update_savedsess_menu(void); static int is_full_screen(void); static void make_full_screen(void); @@ -108,7 +109,7 @@ static void *backhandle; static struct unicode_data ucsdata; static int session_closed; -static int reconfiguring; +static int reconfiguring = FALSE; static const struct telnet_special *specials; static int n_specials; @@ -121,10 +122,11 @@ static struct { int specials_submenu_pos; } popup_menus[2]; enum { SYSMENU, CTXMENU }; +static HMENU savedsess_menu; Config cfg; /* exported to windlg.c */ -extern struct sesslist sesslist; /* imported from windlg.c */ +static struct sesslist sesslist; /* for saved-session menu */ struct agent_callback { void (*callback)(void *, void *, int); @@ -189,6 +191,11 @@ void ldisc_update(void *frontend, int echo, int edit) { } +char *get_ttymode(void *frontend, const char *mode) +{ + return term_get_ttymode(term, mode); +} + static void start_backend(void) { const char *error; @@ -741,23 +748,17 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) * Set up the session-control options on the system menu. */ { - HMENU s, m; - int i, j; + HMENU m; + int j; char *str; popup_menus[SYSMENU].menu = GetSystemMenu(hwnd, FALSE); popup_menus[CTXMENU].menu = CreatePopupMenu(); AppendMenu(popup_menus[CTXMENU].menu, MF_ENABLED, IDM_PASTE, "&Paste"); - s = CreateMenu(); + savedsess_menu = CreateMenu(); get_sesslist(&sesslist, TRUE); - /* skip sesslist.sessions[0] == Default Settings */ - for (i = 1; - i < ((sesslist.nsessions <= MENU_SAVED_MAX+1) ? sesslist.nsessions - : MENU_SAVED_MAX+1); - i++) - AppendMenu(s, MF_ENABLED, IDM_SAVED_MIN + (i-1)*MENU_SAVED_STEP, - sesslist.sessions[i]); + update_savedsess_menu(); for (j = 0; j < lenof(popup_menus); j++) { m = popup_menus[j].menu; @@ -768,7 +769,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) 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_POPUP | MF_ENABLED, (UINT) savedsess_menu, + "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"); @@ -896,6 +898,23 @@ char *do_select(SOCKET skt, int startup) } /* + * Refresh the saved-session submenu from `sesslist'. + */ +static void update_savedsess_menu(void) +{ + int i; + while (DeleteMenu(savedsess_menu, 0, MF_BYPOSITION)) ; + /* skip sesslist.sessions[0] == Default Settings */ + for (i = 1; + i < ((sesslist.nsessions <= MENU_SAVED_MAX+1) ? sesslist.nsessions + : MENU_SAVED_MAX+1); + i++) + AppendMenu(savedsess_menu, MF_ENABLED, + IDM_SAVED_MIN + (i-1)*MENU_SAVED_STEP, + sesslist.sessions[i]); +} + +/* * Update the Special Commands submenu. */ void update_specials_menu(void *frontend) @@ -1214,8 +1233,17 @@ static void exact_textout(HDC hdc, int x, int y, CONST RECT *lprc, unsigned short *lpString, UINT cbCount, CONST INT *lpDx, int opaque) { - +#ifdef __LCC__ + /* + * The LCC include files apparently don't supply the + * GCP_RESULTSW type, but we can make do with GCP_RESULTS + * proper: the differences aren't important to us (the only + * variable-width string parameter is one we don't use anyway). + */ + GCP_RESULTS gcpr; +#else GCP_RESULTSW gcpr; +#endif char *buffer = snewn(cbCount*2+2, char); char *classbuffer = snewn(cbCount, char); memset(&gcpr, 0, sizeof(gcpr)); @@ -1879,6 +1907,16 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, show_mouseptr(1); PostQuitMessage(0); return 0; + case WM_INITMENUPOPUP: + if ((HMENU)wParam == savedsess_menu) { + /* About to pop up Saved Sessions sub-menu. + * Refresh the session list. */ + get_sesslist(&sesslist, FALSE); /* free */ + get_sesslist(&sesslist, TRUE); + update_savedsess_menu(); + return 0; + } + break; case WM_COMMAND: case WM_SYSCOMMAND: switch (wParam & ~0xF) { /* low 4 bits reserved to Windows */ @@ -1968,16 +2006,20 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, { Config prev_cfg; int init_lvl = 1; + int reconfig_result; if (reconfiguring) - break; + break; else - reconfiguring = TRUE; + reconfiguring = TRUE; GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle)); prev_cfg = cfg; - if (!do_reconfig(hwnd, back ? back->cfg_info(backhandle) : 0)) + reconfig_result = + do_reconfig(hwnd, back ? back->cfg_info(backhandle) : 0); + reconfiguring = FALSE; + if (!reconfig_result) break; { @@ -2110,7 +2152,6 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, InvalidateRect(hwnd, NULL, TRUE); reset_window(init_lvl); net_pending_errors(); - reconfiguring = FALSE; } break; case IDM_COPYALL: @@ -2731,13 +2772,15 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, unsigned char buf[20]; int len; - if (wParam == VK_PROCESSKEY) { - MSG m; - m.hwnd = hwnd; - m.message = WM_KEYDOWN; - m.wParam = wParam; - m.lParam = lParam & 0xdfff; - TranslateMessage(&m); + if (wParam == VK_PROCESSKEY) { /* IME PROCESS key */ + if (message == WM_KEYDOWN) { + MSG m; + m.hwnd = hwnd; + m.message = WM_KEYDOWN; + m.wParam = wParam; + m.lParam = lParam & 0xdfff; + TranslateMessage(&m); + } else break; /* pass to Windows for default processing */ } else { len = TranslateKey(message, wParam, lParam, buf); if (len == -1)