X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/b44b307ac0fc00f2a61ef64d4681fe201ecb927c..0ac15bdc20b75615898a22c61a6aacbdf929ce56:/terminal.c diff --git a/terminal.c b/terminal.c index a224afdd..b0ad3565 100644 --- a/terminal.c +++ b/terminal.c @@ -1,5 +1,3 @@ -#include - #include #include #include @@ -59,7 +57,7 @@ static unsigned long *disptext; /* buffer of text on real screen */ static unsigned long *dispcurs; /* location of cursor on real screen */ static unsigned long curstype; /* type of cursor on real screen */ -#define VBELL_TIMEOUT 100 /* millisecond len of visual bell */ +#define VBELL_TIMEOUT (TICKSPERSEC/10) /* visual bell lasts 1/10 sec */ struct beeptime { struct beeptime *next; @@ -918,7 +916,7 @@ static void toggle_mode(int mode, int query, int state) * effective visual bell, so that ESC[?5hESC[?5l will * always be an actually _visible_ visual bell. */ - ticks = GetTickCount(); + ticks = GETTICKCOUNT(); /* turn off a previous vbell to avoid inconsistencies */ if (ticks - vbell_startpoint >= VBELL_TIMEOUT) in_vbell = FALSE; @@ -1044,6 +1042,9 @@ static void term_print_finish(void) int len, size; char c; + if (!printing && !only_printing) + return; /* we need do nothing */ + term_print_flush(); while ((size = bufchain_size(&printer_buf)) > 0) { bufchain_prefix(&printer_buf, &data, &len); @@ -1074,6 +1075,7 @@ void term_out(void) unget = -1; + chars = NULL; /* placate compiler warnings */ while (nchars > 0 || bufchain_size(&inbuf) > 0) { if (unget == -1) { if (nchars == 0) { @@ -1110,7 +1112,6 @@ void term_out(void) * buffer. */ if (printing) { - char cc = c; bufchain_add(&printer_buf, &c, 1); /* @@ -1132,7 +1133,6 @@ void term_out(void) else print_state = 0; if (print_state == 4) { - printing = only_printing = FALSE; term_print_finish(); } continue; @@ -1317,7 +1317,7 @@ void term_out(void) } else *d++ = *s; } - lpage_send(CP_ACP, abuf, d - abuf, 0); + lpage_send(DEFAULT_CODEPAGE, abuf, d - abuf, 0); } break; case '\007': @@ -1325,7 +1325,7 @@ void term_out(void) struct beeptime *newbeep; unsigned long ticks; - ticks = GetTickCount(); + ticks = GETTICKCOUNT(); if (!beep_overloaded) { newbeep = smalloc(sizeof(struct beeptime)); @@ -1376,12 +1376,12 @@ void term_out(void) * Perform an actual beep if we're not overloaded. */ if (!cfg.bellovl || !beep_overloaded) { - beep(cfg.beep); if (cfg.beep == BELL_VISUAL) { in_vbell = TRUE; vbell_startpoint = ticks; term_update(); - } + } else + beep(cfg.beep); } disptop = 0; } @@ -1907,7 +1907,6 @@ void term_out(void) case ANSI_QUE('i'): compatibility(VT100); { - int i; if (esc_nargs != 1) break; if (esc_args[0] == 5 && *cfg.printer) { printing = TRUE; @@ -1915,8 +1914,6 @@ void term_out(void) print_state = 0; term_print_setup(); } else if (esc_args[0] == 4 && printing) { - printing = FALSE; - only_printing = FALSE; term_print_finish(); } } @@ -2800,7 +2797,7 @@ static void do_paint(Context ctx, int may_optimise) * Check the visual bell state. */ if (in_vbell) { - ticks = GetTickCount(); + ticks = GETTICKCOUNT(); if (ticks - vbell_startpoint >= VBELL_TIMEOUT) in_vbell = FALSE; } @@ -2995,11 +2992,11 @@ void term_blink(int flg) static long last_tblink = 0; long now, blink_diff; - now = GetTickCount(); + now = GETTICKCOUNT(); blink_diff = now - last_tblink; - /* Make sure the text blinks no more than 2Hz */ - if (blink_diff < 0 || blink_diff > 450) { + /* Make sure the text blinks no more than 2Hz; we'll use 0.45 s period. */ + if (blink_diff < 0 || blink_diff > (TICKSPERSEC * 9 / 20)) { last_tblink = now; tblinker = !tblinker; } @@ -3012,8 +3009,8 @@ void term_blink(int flg) blink_diff = now - last_blink; - /* Make sure the cursor blinks no faster than GetCaretBlinkTime() */ - if (blink_diff >= 0 && blink_diff < (long) GetCaretBlinkTime()) + /* Make sure the cursor blinks no faster than system blink rate */ + if (blink_diff >= 0 && blink_diff < (long) CURSORBLINK) return; last_blink = now; @@ -3180,16 +3177,14 @@ static void clipme(pos top, pos bottom, int rect) unsigned char buf[4]; WCHAR wbuf[4]; int rv; - if (IsDBCSLeadByteEx(font_codepage, (BYTE) c)) { + if (is_dbcs_leadbyte(font_codepage, (BYTE) c)) { buf[0] = c; buf[1] = (unsigned char) ldata[top.x + 1]; - rv = MultiByteToWideChar(font_codepage, - 0, buf, 2, wbuf, 4); + rv = mb_to_wc(font_codepage, 0, buf, 2, wbuf, 4); top.x++; } else { buf[0] = c; - rv = MultiByteToWideChar(font_codepage, - 0, buf, 1, wbuf, 4); + rv = mb_to_wc(font_codepage, 0, buf, 1, wbuf, 4); } if (rv > 0) { @@ -3223,8 +3218,10 @@ static void clipme(pos top, pos bottom, int rect) top.y++; top.x = rect ? old_top_x : 0; } +#if SELECTION_NUL_TERMINATED wblen++; *wbptr++ = 0; +#endif write_clip(workbuf, wblen, FALSE); /* transfer to clipboard */ if (buflen > 0) /* indicates we allocated this buffer */ sfree(workbuf); @@ -3688,8 +3685,12 @@ void term_mouse(Mouse_Button b, Mouse_Action a, int x, int y, } else selstate = NO_SELECTION; } else if (b == MBT_PASTE - && (a == MA_CLICK || a == MA_2CLK || a == MA_3CLK)) { - term_do_paste(); + && (a == MA_CLICK +#if MULTICLICK_ONLY_EVENT + || a == MA_2CLK || a == MA_3CLK +#endif + )) { + request_paste(); } term_update(); @@ -3704,6 +3705,11 @@ void term_nopaste() paste_len = 0; } +int term_paste_pending(void) +{ + return paste_len != 0; +} + void term_paste() { static long last_paste = 0; @@ -3714,7 +3720,7 @@ void term_paste() /* Don't wait forever to paste */ if (paste_hold) { - now = GetTickCount(); + now = GETTICKCOUNT(); paste_diff = now - last_paste; if (paste_diff >= 0 && paste_diff < 450) return;