If a new session was saved from Change Settings, a side-effect on Windows was
[u/mdw/putty] / windows / window.c
index 05f0c61..b5ac961 100644 (file)
@@ -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);
@@ -741,23 +743,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 +764,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 +893,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 +1228,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));
@@ -1296,24 +1319,11 @@ static void init_fonts(int pick_width, int pick_height)
 
     f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
 
-    lfont.lfHeight = font_height;
-    lfont.lfWidth = font_width;
-    lfont.lfEscapement = 0;
-    lfont.lfOrientation  = 0;
-    lfont.lfWeight  = fw_dontcare;
-    lfont.lfItalic = FALSE;
-    lfont.lfUnderline = FALSE;
-    lfont.lfStrikeOut = FALSE;
-    lfont.lfCharSet = cfg.font.charset;
-    lfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
-    lfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
-    lfont.lfQuality = DEFAULT_QUALITY;
-    lfont.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
-    strncpy(lfont.lfFaceName, cfg.font.name, LF_FACESIZE);
-
     SelectObject(hdc, fonts[FONT_NORMAL]);
     GetTextMetrics(hdc, &tm);
 
+    GetObject(fonts[FONT_NORMAL], sizeof(LOGFONT), &lfont);
+
     if (pick_width == 0 || pick_height == 0) {
        font_height = tm.tmHeight;
        font_width = tm.tmAveCharWidth;
@@ -1892,6 +1902,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 */
@@ -1981,16 +2001,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;
 
                {
@@ -2123,7 +2147,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:
@@ -2744,13 +2767,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)
@@ -2788,12 +2813,11 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
        set_input_locale((HKL)lParam);
        sys_cursor_update();
        break;
-      case WM_IME_NOTIFY:
-       if(wParam == IMN_SETOPENSTATUS) {
+      case WM_IME_STARTCOMPOSITION:
+       {
            HIMC hImc = ImmGetContext(hwnd);
            ImmSetCompositionFont(hImc, &lfont);
            ImmReleaseContext(hwnd, hImc);
-           return 0;
        }
        break;
       case WM_IME_COMPOSITION:
@@ -2934,6 +2958,10 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
        }
     }
 
+    /*
+     * Any messages we don't process completely above are passed through to
+     * DefWindowProc() for default processing.
+     */
     return DefWindowProc(hwnd, message, wParam, lParam);
 }