Stop putting meaning in bottom four bits of WM_SYSCOMMAND wParam
[sgt/putty] / window.c
index 6b0f1db..b28ab06 100644 (file)
--- a/window.c
+++ b/window.c
@@ -8,26 +8,30 @@
 #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
+#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)
@@ -311,7 +315,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) {
@@ -338,6 +343,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");
@@ -606,12 +616,13 @@ 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;
@@ -647,6 +658,10 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
                    }
                    sprintf(c, "putty &%08x", filemap);
                    cl = c;
+               } else if (wParam == IDM_SAVEDSESS) {
+                   sprintf(c, "putty @%s",
+                           sessions[(lParam - IDM_SAVED_MIN) / 16]);
+                   cl = c;
                } else
                    cl = NULL;
 
@@ -719,6 +734,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;