/* translations */
VT_Mode vtmode;
char line_codepage[32];
+ int xlat_capslockcyr;
/* X11 forwarding */
int x11_forward;
char x11_display[128];
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);
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);
*/
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);
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)
{
IDC_TITLE_TRANSLATION,
IDC_BOX_TRANSLATION1,
IDC_BOX_TRANSLATION2,
+ IDC_BOX_TRANSLATION3,
IDC_CODEPAGESTATIC,
IDC_CODEPAGE,
+ IDC_CAPSLOCKCYR,
IDC_VTSTATIC,
IDC_VTXWINDOWS,
IDC_VTOEMANSI,
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);
}
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,
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:
/* 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) {
} 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);
}