static WPARAM pend_netevent_wParam = 0;
static LPARAM pend_netevent_lParam = 0;
static void enact_pending_netevent(void);
+static void flash_window(int mode);
static time_t last_movement = 0;
static int compose_state = 0;
+static OSVERSIONINFO osVersion;
+
/* Dummy routine, only required in plink. */
void ldisc_update(int echo, int edit)
{
* config box. */
defuse_showwindow();
+ {
+ ZeroMemory(&osVersion, sizeof(osVersion));
+ osVersion.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
+ if (!GetVersionEx ( (OSVERSIONINFO *) &osVersion)) {
+ MessageBox(NULL, "Windows refuses to report a version",
+ "PuTTY Fatal Error", MB_OK | MB_ICONEXCLAMATION);
+ return 1;
+ }
+ }
+
/*
* Process the command line.
*/
* Finally show the window!
*/
ShowWindow(hwnd, show);
+ SetForegroundWindow(hwnd);
/*
* Open the initial log file if there is one.
term_out();
term_update();
ShowCaret(hwnd);
+
+ flash_window(1); /* maintain */
+
if (in_vbell)
/* Hmm, term_update didn't want to do an update too soon ... */
timer_id = SetTimer(hwnd, 1, 50, NULL);
else if (!has_focus)
- timer_id = SetTimer(hwnd, 1, 2000, NULL);
+ timer_id = SetTimer(hwnd, 1, 500, NULL);
else
timer_id = SetTimer(hwnd, 1, 100, NULL);
long_timer = 1;
int msg, events;
if (startup) {
msg = WM_NETEVENT;
- events = FD_READ | FD_WRITE | FD_OOB | FD_CLOSE;
+ events = FD_READ | FD_WRITE | FD_OOB | FD_CLOSE | FD_ACCEPT;
} else {
msg = events = 0;
}
if (wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) {
Mouse_Button b;
if (wParam & MK_LBUTTON)
- b = MBT_SELECT;
+ b = MBT_LEFT;
else if (wParam & MK_MBUTTON)
- b = cfg.mouse_is_xterm ? MBT_PASTE : MBT_EXTEND;
+ b = MBT_MIDDLE;
else
- b = cfg.mouse_is_xterm ? MBT_EXTEND : MBT_PASTE;
+ b = MBT_RIGHT;
term_mouse(b, MA_DRAG, TO_CHR_X(X_POS(lParam)),
TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT,
wParam & MK_CONTROL);
has_focus = TRUE;
CreateCaret(hwnd, caretbm, font_width, font_height);
ShowCaret(hwnd);
+ flash_window(0); /* stop */
compose_state = 0;
term_out();
term_update();
len = TranslateKey(message, wParam, lParam, buf);
if (len == -1)
return DefWindowProc(hwnd, message, wParam, lParam);
+
+ /*
+ * We need not bother about stdin backlogs here,
+ * because in GUI PuTTY we can't do anything about
+ * it anyway; there's no means of asking Windows to
+ * hold off on KEYDOWN messages. We _have_ to
+ * buffer everything we're sent.
+ */
ldisc_send(buf, len);
if (len > 0)
kbd_codepage = atoi(lbuf);
}
break;
+ case WM_IME_COMPOSITION:
+ {
+ HIMC hIMC;
+ int n;
+ char *buff;
+
+ if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ||
+ osVersion.dwPlatformId == VER_PLATFORM_WIN32s) break; /* no Unicode */
+
+ if ((lParam & GCS_RESULTSTR) == 0) /* Composition unfinished. */
+ break; /* fall back to DefWindowProc */
+
+ hIMC = ImmGetContext(hwnd);
+ n = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0);
+
+ if (n > 0) {
+ buff = (char*) smalloc(n);
+ ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, buff, n);
+ luni_send((unsigned short *)buff, n / 2);
+ free(buff);
+ }
+ ImmReleaseContext(hwnd, hIMC);
+ return 1;
+ }
+
case WM_IME_CHAR:
if (wParam & 0xFF00) {
unsigned char buf[2];
*/
void sys_cursor(int x, int y)
{
- if (has_focus)
- SetCaretPos(x * font_width, y * font_height);
+ COMPOSITIONFORM cf;
+ HIMC hIMC;
+
+ if (!has_focus) return;
+
+ SetCaretPos(x * font_width, y * font_height);
+
+ /* IMM calls on Win98 and beyond only */
+ if(osVersion.dwPlatformId == VER_PLATFORM_WIN32s) return; /* 3.11 */
+
+ if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
+ osVersion.dwMinorVersion == 0) return; /* 95 */
+
+ /* we should have the IMM functions */
+ hIMC = ImmGetContext(hwnd);
+ cf.dwStyle = CFS_POINT;
+ cf.ptCurrentPos.x = x * font_width;
+ cf.ptCurrentPos.y = y * font_height;
+ ImmSetCompositionWindow(hIMC, &cf);
+
+ ImmReleaseContext(hwnd, hIMC);
}
/*
return 0;
}
if (wParam == VK_INSERT && shift_state == 1) {
- term_mouse(MBT_PASTE, MA_CLICK, 0, 0, 0, 0);
- term_mouse(MBT_PASTE, MA_RELEASE, 0, 0, 0, 0);
+ term_do_paste();
return 0;
}
if (left_alt && wParam == VK_F4 && cfg.alt_f4) {
return p - output;
}
- if (cfg.funky_type == 5 && code >= 11 && code <= 34) {
+ if (cfg.funky_type == 5 && /* SCO function keys */
+ code >= 11 && code <= 34) {
char codes[] = "MNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@[\\]^_`{";
int index = 0;
switch (wParam) {
p += sprintf((char *) p, "\x1B[%c", codes[index]);
return p - output;
}
+ if (cfg.funky_type == 5 && /* SCO small keypad */
+ code >= 1 && code <= 6) {
+ char codes[] = "HL.FIG";
+ if (code == 3) {
+ *p++ = '\x7F';
+ } else {
+ p += sprintf((char *) p, "\x1B[%c", codes[code-1]);
+ }
+ return p - output;
+ }
if ((vt52_mode || cfg.funky_type == 4) && code >= 11 && code <= 24) {
int offt = 0;
if (code > 15)
#ifdef SHOW_TOASCII_RESULT
if (r == 1 && !key_down) {
if (alt_sum) {
- if (utf || dbcs_screenfont)
+ if (in_utf || dbcs_screenfont)
debug((", (U+%04x)", alt_sum));
else
debug((", LCH(%d)", alt_sum));
if (!key_down) {
if (alt_sum) {
- if (utf || dbcs_screenfont) {
+ if (in_utf || dbcs_screenfont) {
keybuf = alt_sum;
luni_send(&keybuf, 1);
} else {
ch = (char) alt_sum;
+ /*
+ * We need not bother about stdin
+ * backlogs here, because in GUI PuTTY
+ * we can't do anything about it
+ * anyway; there's no means of asking
+ * Windows to hold off on KEYDOWN
+ * messages. We _have_ to buffer
+ * everything we're sent.
+ */
ldisc_send(&ch, 1);
}
alt_sum = 0;
if (!left_alt)
keys[0] = 0;
/* If we will be using alt_sum fix the 256s */
- else if (keys[0] && (utf || dbcs_screenfont))
+ else if (keys[0] && (in_utf || dbcs_screenfont))
keys[0] = 10;
}
exit(1);
}
+/*
+ * Manage window caption / taskbar flashing, if enabled.
+ * 0 = stop, 1 = maintain, 2 = start
+ */
+static void flash_window(int mode)
+{
+ static long last_flash = 0;
+ static int flashing = 0;
+ if ((mode == 0) || (cfg.beep_ind == B_IND_DISABLED)) {
+ /* stop */
+ if (flashing) {
+ FlashWindow(hwnd, FALSE);
+ flashing = 0;
+ }
+
+ } else if (mode == 2) {
+ /* start */
+ if (!flashing) {
+ last_flash = GetTickCount();
+ flashing = 1;
+ FlashWindow(hwnd, TRUE);
+ }
+
+ } else if ((mode == 1) && (cfg.beep_ind == B_IND_FLASH)) {
+ /* maintain */
+ if (flashing) {
+ long now = GetTickCount();
+ long fdiff = now - last_flash;
+ if (fdiff < 0 || fdiff > 450) {
+ last_flash = now;
+ FlashWindow(hwnd, TRUE); /* toggle */
+ }
+ }
+ }
+}
+
/*
* Beep.
*/
cfg.beep = BELL_DEFAULT;
}
}
+ /* Otherwise, either visual bell or disabled; do nothing here */
+ if (!has_focus) {
+ flash_window(2); /* start */
+ }
}