Oleg Panashchenko's Cyrillic support patch
[u/mdw/putty] / window.c
index 4adb682..e2301d6 100644 (file)
--- a/window.c
+++ b/window.c
@@ -7,31 +7,32 @@
 #define PUTTY_DO_GLOBALS                      /* actually _define_ globals */
 #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_SAVEDSESS 521
-
-#define IDM_SAVED_MIN 4096
-#define IDM_SAVED_MAX 8192
+#include "sizetip.h"
+
+#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)
@@ -82,6 +83,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
     MSG msg;
     int guess_width, guess_height;
 
+    putty_inst = inst;
+
     winsock_ver = MAKEWORD(1, 1);
     if (WSAStartup(winsock_ver, &wsadata)) {
        MessageBox(NULL, "Unable to initialise WinSock", "WinSock Error",
@@ -178,7 +181,8 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
        }
     }
 
-    back = (cfg.protocol == PROT_SSH ? &ssh_backend : &telnet_backend);
+    back = (cfg.protocol == PROT_SSH ? &ssh_backend : 
+                       cfg.protocol == PROT_TELNET ? &telnet_backend : &raw_backend );
 
     if (!prev) {
        wndclass.style         = 0;
@@ -503,8 +507,8 @@ static void init_fonts(void) {
                           CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, \
                           FIXED_PITCH | FF_DONTCARE, cfg.font)
     if (cfg.vtmode != VT_OEMONLY) {
-       f(FONT_NORMAL, ANSI_CHARSET, fw_dontcare, FALSE);
-       f(FONT_UNDERLINE, ANSI_CHARSET, fw_dontcare, TRUE);
+       f(FONT_NORMAL, cfg.fontcharset, fw_dontcare, FALSE);
+       f(FONT_UNDERLINE, cfg.fontcharset, fw_dontcare, TRUE);
     }
     if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_OEMONLY) {
        f(FONT_OEM, OEM_CHARSET, fw_dontcare, FALSE);
@@ -512,8 +516,8 @@ static void init_fonts(void) {
     }
     if (bold_mode == BOLD_FONT) {
        if (cfg.vtmode != VT_OEMONLY) {
-           f(FONT_BOLD, ANSI_CHARSET, fw_bold, FALSE);
-           f(FONT_BOLDUND, ANSI_CHARSET, fw_bold, TRUE);
+           f(FONT_BOLD, cfg.fontcharset, fw_bold, FALSE);
+           f(FONT_BOLDUND, cfg.fontcharset, fw_bold, TRUE);
        }
        if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_OEMONLY) {
            f(FONT_OEMBOLD, OEM_CHARSET, fw_bold, FALSE);
@@ -612,20 +616,28 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
     switch (message) {
       case WM_CREATE:
        break;
+      case WM_CLOSE:
+       if (!cfg.warn_on_close ||
+           MessageBox(hwnd, "Are you sure you want to close this session?",
+                      "PuTTY Exit Confirmation",
+                      MB_ICONWARNING | MB_OKCANCEL) == IDOK)
+           DestroyWindow(hwnd);
+       return 0;
       case WM_DESTROY:
        PostQuitMessage (0);
        return 0;
-    case WM_SYSCOMMAND:
-       switch (wParam) {
+      case WM_SYSCOMMAND:
+       switch (wParam & ~0xF) {       /* low 4 bits reserved to Windows */
          case IDM_SHOWLOG:
            shownegot(hwnd);
            break;
          case IDM_NEWSESS:
          case IDM_DUPSESS:
-       case IDM_SAVEDSESS:
+         case IDM_SAVEDSESS:
            {
                char b[2048];
                char c[30], *cl;
+               int freecl = FALSE;
                STARTUPINFO si;
                PROCESS_INFORMATION pi;
                HANDLE filemap = NULL;
@@ -659,10 +671,14 @@ 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;
+                   char *session = sessions[(lParam - IDM_SAVED_MIN) / 16];
+                   cl = malloc(16 + strlen(session)); /* 8, but play safe */
+                   if (!cl)
+                       cl = NULL;     /* not a very important failure mode */
+                   sprintf(cl, "putty @%s", session);
+                   freecl = TRUE;
                } else
-                 cl = NULL;
+                   cl = NULL;
 
                GetModuleFileName (NULL, b, sizeof(b)-1);
                si.cb = sizeof(si);
@@ -677,6 +693,8 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
 
                if (filemap)
                    CloseHandle(filemap);
+               if (freecl)
+                   free(cl);
            }
            break;
          case IDM_RECONF:
@@ -863,6 +881,12 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
       case WM_IGNORE_SIZE:
        ignore_size = TRUE;            /* don't panic on next WM_SIZE msg */
        break;
+      case WM_ENTERSIZEMOVE:
+          EnableSizeTip(1);
+          break;
+      case WM_EXITSIZEMOVE:
+          EnableSizeTip(0);
+          break;
       case WM_SIZING:
        {
            int width, height, w, h, ew, eh;
@@ -872,6 +896,7 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
            height = r->bottom - r->top - extra_height;
            w = (width + font_width/2) / font_width; if (w < 1) w = 1;
            h = (height + font_height/2) / font_height; if (h < 1) h = 1;
+        UpdateSizeTip(hwnd, w, h);
            ew = width - w * font_width;
            eh = height - h * font_height;
            if (ew != 0) {
@@ -1028,7 +1053,7 @@ static int WINAPI WndProc (HWND hwnd, UINT message,
         * we're ready to cope.
         */
        {
-           char c = wParam;
+           char c = xlat_kbd2tty((unsigned char)wParam);
            back->send (&c, 1);
        }
        return 0;
@@ -1230,7 +1255,7 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) {
        return 0;
     }
     if ((lParam & 0x20000000) && wParam == VK_F4) {
-       SendMessage (hwnd, WM_DESTROY, 0, 0);
+       SendMessage (hwnd, WM_CLOSE, 0, 0);
        return 0;
     }
 
@@ -1316,10 +1341,20 @@ static int TranslateKey(WPARAM wParam, LPARAM lParam, unsigned char *output) {
      */
     if (ret) {
        WORD chr;
-       int r = ToAscii (wParam, (lParam >> 16) & 0xFF,
-                        keystate, &chr, 0);
+       int r;
+       BOOL capsOn=keystate[VK_CAPITAL] !=0;
+
+       /* helg: clear CAPS LOCK state if caps lock switches to cyrillic */
+       if(cfg.xlat_capslockcyr)
+           keystate[VK_CAPITAL] = 0;
+
+       r = ToAscii (wParam, (lParam >> 16) & 0xFF,
+                    keystate, &chr, 0);
+
+       if(capsOn)
+           chr = xlat_latkbd2win((unsigned char)(chr & 0xFF));
        if (r == 1) {
-           *p++ = chr & 0xFF;
+           *p++ = xlat_kbd2tty((unsigned char)(chr & 0xFF));
            return p - output;
        }
     }