Reintroduce Cyrillic Caps Lock mode, which was in 0.51 but got
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 18 Sep 2001 18:51:10 +0000 (18:51 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 18 Sep 2001 18:51:10 +0000 (18:51 +0000)
kicked out by the Unicode patch. It's not very good - only works
sanely on US keyboards - but it's no worse than it was in 0.51.
After 0.52 maybe I should fix it properly.

git-svn-id: svn://svn.tartarus.org/sgt/putty@1273 cda61777-01e9-0310-a592-d414129be87e

putty.h
settings.c
unicode.c
windlg.c
window.c

diff --git a/putty.h b/putty.h
index b6b1334..90e10ff 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -341,6 +341,7 @@ typedef struct {
     /* translations */
     VT_Mode vtmode;
     char line_codepage[32];
+    int xlat_capslockcyr;
     /* X11 forwarding */
     int x11_forward;
     char x11_display[128];
@@ -541,6 +542,7 @@ void EnableSizeTip(int bEnable);
 void init_ucs_tables(void);
 void lpage_send(int codepage, char *buf, int len);
 void luni_send(wchar_t * widebuf, int len);
+wchar_t xlat_uskbd2cyrllic(int ch);
 int check_compose(int first, int second);
 int decode_codepage(char *cp_name);
 char *cp_enumerate (int index);
index 31faf3a..b81b7c9 100644 (file)
@@ -248,6 +248,7 @@ void save_settings(char *section, int do_host, Config * cfg)
        write_setting_s(sesskey, buf, buf2);
     }
     write_setting_s(sesskey, "LineCodePage", cfg->line_codepage);
+    write_setting_i(sesskey, "CapsLockCyr", cfg->xlat_capslockcyr);
     write_setting_i(sesskey, "ScrollBar", cfg->scrollbar);
     write_setting_i(sesskey, "ScrollOnKey", cfg->scroll_on_key);
     write_setting_i(sesskey, "ScrollOnDisp", cfg->scroll_on_disp);
@@ -471,6 +472,7 @@ void load_settings(char *section, int do_host, Config * cfg)
      */
     gpps(sesskey, "LineCodePage", "", cfg->line_codepage,
         sizeof(cfg->line_codepage));
+    gppi (sesskey, "CapsLockCyr", 0, &cfg->xlat_capslockcyr);
     gppi(sesskey, "ScrollBar", 1, &cfg->scrollbar);
     gppi(sesskey, "ScrollOnKey", 0, &cfg->scroll_on_key);
     gppi(sesskey, "ScrollOnDisp", 1, &cfg->scroll_on_disp);
index 877aff6..60dc065 100644 (file)
--- a/unicode.c
+++ b/unicode.c
@@ -524,6 +524,29 @@ void luni_send(wchar_t * widebuf, int len)
        ldisc_send(linebuffer, p - linebuffer);
 }
 
+wchar_t xlat_uskbd2cyrllic(int ch)
+{
+    static wchar_t cyrtab[] = {
+            0,      1,       2,      3,      4,      5,      6,      7,
+            8,      9,      10,     11,     12,     13,     14,     15,
+            16,     17,     18,     19,     20,     21,     22,     23,
+            24,     25,     26,     27,     28,     29,     30,     31,
+            32,     33, 0x042d,     35,     36,     37,     38, 0x044d,
+            40,     41,     42, 0x0406, 0x0431, 0x0454, 0x044e, 0x002e,
+            48,     49,     50,     51,     52,     53,     54,     55,
+            56,     57, 0x0416, 0x0436, 0x0411, 0x0456, 0x042e, 0x002c,
+            64, 0x0424, 0x0418, 0x0421, 0x0412, 0x0423, 0x0410, 0x041f,
+        0x0420, 0x0428, 0x041e, 0x041b, 0x0414, 0x042c, 0x0422, 0x0429,
+        0x0417, 0x0419, 0x041a, 0x042b, 0x0415, 0x0413, 0x041c, 0x0426,
+        0x0427, 0x041d, 0x042f, 0x0445, 0x0457, 0x044a,     94, 0x0404,
+            96, 0x0444, 0x0438, 0x0441, 0x0432, 0x0443, 0x0430, 0x043f,
+        0x0440, 0x0448, 0x043e, 0x043b, 0x0434, 0x044c, 0x0442, 0x0449,
+        0x0437, 0x0439, 0x043a, 0x044b, 0x0435, 0x0433, 0x043c, 0x0446,
+        0x0447, 0x043d, 0x044f, 0x0425, 0x0407, 0x042a,    126,    127
+       };
+    return cyrtab[ch&0x7F];
+}
+
 int check_compose(int first, int second)
 {
 
index 33301a5..d8f1e03 100644 (file)
--- a/windlg.c
+++ b/windlg.c
@@ -505,8 +505,10 @@ enum { IDCX_ABOUT =
     IDC_TITLE_TRANSLATION,
     IDC_BOX_TRANSLATION1,
     IDC_BOX_TRANSLATION2,
+    IDC_BOX_TRANSLATION3,
     IDC_CODEPAGESTATIC,
     IDC_CODEPAGE,
+    IDC_CAPSLOCKCYR,
     IDC_VTSTATIC,
     IDC_VTXWINDOWS,
     IDC_VTOEMANSI,
@@ -796,6 +798,7 @@ static void init_dlg_ctrls(HWND hwnd, int keepsess)
        char *cp;
        strcpy(cfg.line_codepage, cp_name(decode_codepage(cfg.line_codepage)));
        SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_RESETCONTENT, 0, 0);
+       CheckDlgButton (hwnd, IDC_CAPSLOCKCYR, cfg.xlat_capslockcyr);
        for (i = 0; (cp = cp_enumerate(i)) != NULL; i++) {
            SendDlgItemMessage(hwnd, IDC_CODEPAGE, CB_ADDSTRING,
                               0, (LPARAM) cp);
@@ -1101,18 +1104,23 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
     }
 
     if (panel == translationpanelstart) {
-       /* The Translation panel. Accelerators used: [acgo] rxbepu */
+       /* The Translation panel. Accelerators used: [acgo] rxbepus */
        struct ctlpos cp;
        ctlposinit(&cp, hwnd, 80, 3, 13);
        bartitle(&cp, "Options controlling character set translation",
                 IDC_TITLE_TRANSLATION);
        beginbox(&cp, "Character set translation on received data",
-                IDC_BOX_TRANSLATION2);
+                IDC_BOX_TRANSLATION1);
        combobox(&cp, "&Received data assumed to be in which character set:",
                 IDC_CODEPAGESTATIC, IDC_CODEPAGE);
        endbox(&cp);
+        beginbox(&cp, "Enable character set translation on input data",
+                 IDC_BOX_TRANSLATION2);
+        checkbox(&cp, "CAP&S LOCK acts as cyrillic switch",
+                 IDC_CAPSLOCKCYR);
+        endbox(&cp);
        beginbox(&cp, "Adjust how PuTTY displays line drawing characters",
-                IDC_BOX_TRANSLATION1);
+                IDC_BOX_TRANSLATION3);
        radiobig(&cp,
                 "Handling of line drawing characters:", IDC_VTSTATIC,
                 "Font has &XWindows encoding", IDC_VTXWINDOWS,
@@ -2512,6 +2520,13 @@ static int GenericMainDlgProc(HWND hwnd, UINT msg,
                    SetDlgItemText(hwnd, IDC_CODEPAGE, cfg.line_codepage);
                }
                break;
+             case IDC_CAPSLOCKCYR:
+               if (HIWORD(wParam) == BN_CLICKED ||
+                   HIWORD(wParam) == BN_DOUBLECLICKED) {
+                   cfg.xlat_capslockcyr =
+                       IsDlgButtonChecked (hwnd, IDC_CAPSLOCKCYR);
+               }
+               break;
              case IDC_VTXWINDOWS:
              case IDC_VTOEMANSI:
              case IDC_VTOEMONLY:
index 3eb9567..cd5f703 100644 (file)
--- a/window.c
+++ b/window.c
@@ -3334,6 +3334,14 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
     /* Okay we've done everything interesting; let windows deal with 
      * the boring stuff */
     {
+       BOOL capsOn=0;
+
+       /* helg: clear CAPS LOCK state if caps lock switches to cyrillic */
+       if(cfg.xlat_capslockcyr && keystate[VK_CAPITAL] != 0) {
+           capsOn= !left_alt;
+           keystate[VK_CAPITAL] = 0;
+       }
+
        r = ToAsciiEx(wParam, scan, keystate, keys, 0, kbd_layout);
 #ifdef SHOW_TOASCII_RESULT
        if (r == 1 && !key_down) {
@@ -3402,10 +3410,17 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
                    } else
                        lpage_send(kbd_codepage, &ch, 1);
                } else {
-                   static char cbuf[] = "\033 ";
-                   cbuf[1] = ch;
-                   lpage_send(kbd_codepage, cbuf + !left_alt,
-                              1 + !!left_alt);
+                   if(capsOn && ch < 0x80) {
+                       WCHAR cbuf[2];
+                       cbuf[0] = 27;
+                       cbuf[1] = xlat_uskbd2cyrllic(ch);
+                       luni_send(cbuf+!left_alt, 1+!!left_alt);
+                   } else {
+                       char cbuf[2];
+                       cbuf[0] = '\033';
+                       cbuf[1] = ch;
+                       lpage_send(kbd_codepage, cbuf+!left_alt, 1+!!left_alt);
+                   }
                }
                show_mouseptr(0);
            }