#define FONT_OEMUND 0x22
#define FONT_OEMBOLDUND 0x23
-#define FONT_MAXNO 0x2F
+#define FONT_MAXNO 0x40
#define FONT_SHIFT 5
static HFONT fonts[FONT_MAXNO];
static LOGFONT lfont;
}
}
- /*
- * Trim off a colon suffix if it's there.
- */
- host[strcspn(host, ":")] = '\0';
+ /*
+ * Trim a colon suffix off the hostname if it's there. In
+ * order to protect IPv6 address literals against this
+ * treatment, we do not do this if there's _more_ than one
+ * colon.
+ */
+ {
+ char *c = strchr(host, ':');
+
+ if (c) {
+ char *d = strchr(c+1, ':');
+ if (!d)
+ *c = '\0';
+ }
+ }
/*
* Remove any remaining whitespace.
si.lpReserved2 = NULL;
CreateProcess(b, cl, NULL, NULL, inherit_handles,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
if (filemap)
CloseHandle(filemap);
reconfig_result =
do_reconfig(hwnd, back ? back->cfg_info(backhandle) : 0);
reconfiguring = FALSE;
- if (!reconfig_result)
+ if (!reconfig_result) {
+ conf_free(prev_conf);
break;
+ }
conf_cache_data();
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
- term_scroll(term, 1, HIWORD(wParam));
+ /*
+ * Use GetScrollInfo instead of HIWORD(wParam) to get
+ * 32-bit scroll position.
+ */
+ {
+ SCROLLINFO si;
+
+ si.cbSize = sizeof(si);
+ si.fMask = SIF_TRACKPOS;
+ if (GetScrollInfo(hwnd, SB_VERT, &si) == 0)
+ si.nTrackPos = HIWORD(wParam);
+ term_scroll(term, 1, si.nTrackPos);
+ }
break;
}
break;
} else
break;
- if (send_raw_mouse && shift_pressed &&
- !(conf_get_int(conf, CONF_mouse_override))) {
+ if (send_raw_mouse &&
+ !(conf_get_int(conf, CONF_mouse_override) &&
+ shift_pressed)) {
/* Mouse wheel position is in screen coordinates for
* some reason */
POINT p;
HKL kbd_layout = GetKeyboardLayout(0);
- /* keys is for ToAsciiEx. There's some ick here, see below. */
- static WORD keys[3];
+ static wchar_t keys_unicode[3];
static int compose_char = 0;
static WPARAM compose_keycode = 0;
else if (ch)
debug((", $%02x", ch));
- if (keys[0])
- debug((", KB0=%02x", keys[0]));
- if (keys[1])
- debug((", KB1=%02x", keys[1]));
- if (keys[2])
- debug((", KB2=%02x", keys[2]));
+ if (keys_unicode[0])
+ debug((", KB0=%04x", keys_unicode[0]));
+ if (keys_unicode[1])
+ debug((", KB1=%04x", keys_unicode[1]));
+ if (keys_unicode[2])
+ debug((", KB2=%04x", keys_unicode[2]));
if ((keystate[VK_SHIFT] & 0x80) != 0)
debug((", S"));
* be is? There's indication on MS' website of an Inquire/InquireEx
* functioning returning a KBINFO structure which tells us. */
if (osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) {
+ r = ToUnicodeEx(wParam, scan, keystate, keys_unicode,
+ lenof(keys_unicode), 0, kbd_layout);
+ } else {
/* XXX 'keys' parameter is declared in MSDN documentation as
* 'LPWORD lpChar'.
* The experience of a French user indicates that on
* Win9x/NT split, but I suspect it's worse than that.
* See wishlist item `win-dead-keys' for more horrible detail
* and speculations. */
- BYTE keybs[3];
int i;
- r = ToAsciiEx(wParam, scan, keystate, (LPWORD)keybs, 0, kbd_layout);
- for (i=0; i<3; i++) keys[i] = keybs[i];
- } else {
+ static WORD keys[3];
+ static BYTE keysb[3];
r = ToAsciiEx(wParam, scan, keystate, keys, 0, kbd_layout);
+ if (r > 0) {
+ for (i = 0; i < r; i++) {
+ keysb[i] = (BYTE)keys[i];
+ }
+ MultiByteToWideChar(CP_ACP, 0, (LPCSTR)keysb, r,
+ keys_unicode, lenof(keys_unicode));
+ }
}
#ifdef SHOW_TOASCII_RESULT
if (r == 1 && !key_down) {
else
debug((", LCH(%d)", alt_sum));
} else {
- debug((", ACH(%d)", keys[0]));
+ debug((", ACH(%d)", keys_unicode[0]));
}
} else if (r > 0) {
int r1;
debug((", ASC("));
for (r1 = 0; r1 < r; r1++) {
- debug(("%s%d", r1 ? "," : "", keys[r1]));
+ debug(("%s%d", r1 ? "," : "", keys_unicode[r1]));
}
debug((")"));
}
p = output;
for (i = 0; i < r; i++) {
- unsigned char ch = (unsigned char) keys[i];
+ wchar_t wch = keys_unicode[i];
- if (compose_state == 2 && (ch & 0x80) == 0 && ch > ' ') {
- compose_char = ch;
+ if (compose_state == 2 && wch >= ' ' && wch < 0x80) {
+ compose_char = wch;
compose_state++;
continue;
}
- if (compose_state == 3 && (ch & 0x80) == 0 && ch > ' ') {
+ if (compose_state == 3 && wch >= ' ' && wch < 0x80) {
int nc;
compose_state = 0;
- if ((nc = check_compose(compose_char, ch)) == -1) {
+ if ((nc = check_compose(compose_char, wch)) == -1) {
MessageBeep(MB_ICONHAND);
return 0;
}
if (ldisc)
luni_send(ldisc, &keybuf, 1, 1);
} else {
- ch = (char) alt_sum;
+ char ch = (char) alt_sum;
/*
* We need not bother about stdin
* backlogs here, because in GUI PuTTY
} else {
term_seen_key_event(term);
if (ldisc)
- lpage_send(ldisc, kbd_codepage, &ch, 1, 1);
+ luni_send(ldisc, &wch, 1, 1);
}
} else {
- if(capsOn && ch < 0x80) {
+ if(capsOn && wch < 0x80) {
WCHAR cbuf[2];
cbuf[0] = 27;
- cbuf[1] = xlat_uskbd2cyrllic(ch);
+ cbuf[1] = xlat_uskbd2cyrllic(wch);
term_seen_key_event(term);
if (ldisc)
luni_send(ldisc, cbuf+!left_alt, 1+!!left_alt, 1);
} else {
- char cbuf[2];
+ WCHAR cbuf[2];
cbuf[0] = '\033';
- cbuf[1] = ch;
+ cbuf[1] = wch;
term_seen_key_event(term);
if (ldisc)
- lpage_send(ldisc, kbd_codepage,
- cbuf+!left_alt, 1+!!left_alt, 1);
+ luni_send(ldisc, cbuf +!left_alt, 1+!!left_alt, 1);
}
}
show_mouseptr(0);
}
/* This is so the ALT-Numpad and dead keys work correctly. */
- keys[0] = 0;
+ keys_unicode[0] = 0;
return p - output;
}
/* If we're definitly not building up an ALT-54321 then clear it */
if (!left_alt)
- keys[0] = 0;
+ keys_unicode[0] = 0;
/* If we will be using alt_sum fix the 256s */
- else if (keys[0] && (in_utf(term) || ucsdata.dbcs_screenfont))
- keys[0] = 10;
+ else if (keys_unicode[0] && (in_utf(term) || ucsdata.dbcs_screenfont))
+ keys_unicode[0] = 10;
}
/*
{
if (n >= 16)
n += 256 - 16;
- if (n > NALLCOLOURS)
+ if (n >= NALLCOLOURS)
return;
real_palette_set(n, r, g, b);
if (pal) {
GlobalFree(clipdata2);
return;
}
- if (!(lock = GlobalLock(clipdata)))
+ if (!(lock = GlobalLock(clipdata))) {
+ GlobalFree(clipdata);
+ GlobalFree(clipdata2);
return;
- if (!(lock2 = GlobalLock(clipdata2)))
+ }
+ if (!(lock2 = GlobalLock(clipdata2))) {
+ GlobalUnlock(clipdata);
+ GlobalFree(clipdata);
+ GlobalFree(clipdata2);
return;
+ }
memcpy(lock, data, len * sizeof(wchar_t));
WideCharToMultiByte(CP_ACP, 0, data, len, lock2, len2, NULL, NULL);
cleanup_exit(1);
}
+/*
+ * Print a message box and don't close the connection.
+ */
+void nonfatal(char *fmt, ...)
+{
+ va_list ap;
+ char *stuff, morestuff[100];
+
+ va_start(ap, fmt);
+ stuff = dupvprintf(fmt, ap);
+ va_end(ap);
+ sprintf(morestuff, "%.70s Error", appname);
+ MessageBox(hwnd, stuff, morestuff, MB_ICONERROR | MB_OK);
+ sfree(stuff);
+}
+
DECL_WINDOWS_FUNCTION(static, BOOL, FlashWindowEx, (PFLASHWINFO));
static void init_flashwindow(void)