struct beeptime {
struct beeptime *next;
- long ticks;
+ unsigned long ticks;
};
static struct beeptime *beephead, *beeptail;
int nbeeps;
static int save_cset, save_csattr; /* saved with cursor position */
static int save_utf; /* saved with cursor position */
static int rvideo; /* global reverse video flag */
-static int rvbell_timeout; /* for ESC[?5hESC[?5l vbell */
+static unsigned long rvbell_startpoint;/* for ESC[?5hESC[?5l vbell */
static int cursor_on; /* cursor enabled flag */
static int reset_132; /* Flag ESC c resets to 80 cols */
static int use_bce; /* Use Background coloured erase */
big_cursor = 0;
save_attr = curr_attr = ATTR_DEFAULT;
term_editing = term_echoing = FALSE;
- ldisc_send(NULL, 0); /* cause ldisc to notice changes */
+ ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */
app_cursor_keys = cfg.app_cursor;
app_keypad_keys = cfg.app_keypad;
use_bce = cfg.bce;
* selection), and also selanchor (for one being
* selected as we speak).
*/
- seltop = sb ? -savelines : 0;
+ seltop = sb ? -savelines : topline;
if (selstart.y >= seltop && selstart.y <= botline) {
selstart.y--;
*/
static void toggle_mode(int mode, int query, int state)
{
- long ticks;
+ unsigned long ticks;
if (query)
switch (mode) {
* always be an actually _visible_ visual bell.
*/
ticks = GetTickCount();
- if (rvideo && !state && /* we're turning it off */
- ticks < rvbell_timeout) { /* and it's not long since it was turned on */
+ /* turn off a previous vbell to avoid inconsistencies */
+ if (ticks - vbell_startpoint >= VBELL_TIMEOUT)
+ in_vbell = FALSE;
+ if (rvideo && !state && /* we're turning it off... */
+ (ticks - rvbell_startpoint) < VBELL_TIMEOUT) { /* ...soon */
+ /* If there's no vbell timeout already, or this one lasts
+ * longer, replace vbell_timeout with ours. */
+ if (!in_vbell ||
+ (rvbell_startpoint - vbell_startpoint < VBELL_TIMEOUT))
+ vbell_startpoint = rvbell_startpoint;
in_vbell = TRUE; /* we may clear rvideo but we set in_vbell */
- if (vbell_timeout < rvbell_timeout) /* don't move vbell end forward */
- vbell_timeout = rvbell_timeout; /* vbell end is at least then */
} else if (!rvideo && state) {
/* This is an ON, so we notice the time and save it. */
- rvbell_timeout = ticks + VBELL_TIMEOUT;
+ rvbell_startpoint = ticks;
}
rvideo = state;
seen_disp_event = TRUE;
break;
case 10: /* set local edit mode */
term_editing = state;
- ldisc_send(NULL, 0); /* cause ldisc to notice changes */
+ ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */
break;
case 25: /* enable/disable cursor */
compatibility2(OTHER, VT220);
break;
case 12: /* set echo mode */
term_echoing = !state;
- ldisc_send(NULL, 0); /* cause ldisc to notice changes */
+ ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */
break;
case 20: /* Return sends ... */
cr_lf_return = state;
* debugging and possibly also useful for actual logging.
*/
if (cfg.logtype == LGTYP_DEBUG)
- logtraffic((unsigned char) &c, LGTYP_DEBUG);
+ logtraffic((unsigned char) c, LGTYP_DEBUG);
} else {
c = unget;
unget = -1;
} else
*d++ = *s;
}
- lpage_send(CP_ACP, abuf, d - abuf);
+ lpage_send(CP_ACP, abuf, d - abuf, 0);
}
break;
case '\007':
{
struct beeptime *newbeep;
- long ticks;
+ unsigned long ticks;
ticks = GetTickCount();
}
if (cfg.bellovl && beep_overloaded &&
- ticks - lastbeep >= cfg.bellovl_s) {
+ ticks - lastbeep >= (unsigned)cfg.bellovl_s) {
/*
* If we're currently overloaded and the
* last beep was more than s seconds ago,
beep(cfg.beep);
if (cfg.beep == BELL_VISUAL) {
in_vbell = TRUE;
- vbell_timeout = ticks + VBELL_TIMEOUT;
+ vbell_startpoint = ticks;
term_update();
}
}
break;
case 'Z': /* terminal type query */
compatibility(VT100);
- ldisc_send(id_string, strlen(id_string));
+ ldisc_send(id_string, strlen(id_string), 0);
break;
case 'c': /* restore power-on settings */
compatibility(VT100);
compatibility(OTHER);
/* this reports xterm version 136 so that VIM can
use the drag messages from the mouse reporting */
- ldisc_send("\033[>0;136;0c", 11);
+ ldisc_send("\033[>0;136;0c", 11, 0);
break;
case 'a': /* move right N cols */
compatibility(ANSI);
case 'c': /* terminal type query */
compatibility(VT100);
/* This is the response for a VT102 */
- ldisc_send(id_string, strlen(id_string));
+ ldisc_send(id_string, strlen(id_string), 0);
break;
case 'n': /* cursor position query */
if (esc_args[0] == 6) {
char buf[32];
sprintf(buf, "\033[%d;%dR", curs.y + 1,
curs.x + 1);
- ldisc_send(buf, strlen(buf));
+ ldisc_send(buf, strlen(buf), 0);
} else if (esc_args[0] == 5) {
- ldisc_send("\033[0n", 4);
+ ldisc_send("\033[0n", 4, 0);
}
break;
case 'h': /* toggle modes to high */
if (i == 0 || i == 1) {
strcpy(buf, "\033[2;1;1;112;112;1;0x");
buf[2] += i;
- ldisc_send(buf, 20);
+ ldisc_send(buf, 20, 0);
}
}
break;
termstate = VT52_Y1;
break;
case 'Z':
- ldisc_send("\033/Z", 3);
+ ldisc_send("\033/Z", 3, 0);
break;
case '=':
app_keypad_keys = TRUE;
pos scrpos;
char ch[1024];
long cursor_background = ERASE_CHAR;
- long ticks;
+ unsigned long ticks;
/*
* Check the visual bell state.
*/
if (in_vbell) {
ticks = GetTickCount();
- if (ticks - vbell_timeout >= 0)
- in_vbell = FALSE;
- }
+ if (ticks - vbell_startpoint >= VBELL_TIMEOUT)
+ in_vbell = FALSE;
+ }
rv = (!rvideo ^ !in_vbell ? ATTR_REVERSE : 0);
{
unsigned long *ldata;
short wvalue;
+ int topy = -count234(scrollback);
ldata = lineptr(p.y);
*/
wvalue = wordtype(ldata[p.x]);
if (dir == +1) {
- while (p.x < cols && wordtype(ldata[p.x + 1]) == wvalue)
- p.x++;
+ while (1) {
+ if (p.x < cols-1) {
+ if (wordtype(ldata[p.x + 1]) == wvalue)
+ p.x++;
+ else
+ break;
+ } else {
+ if (ldata[cols] & LATTR_WRAPPED) {
+ unsigned long *ldata2;
+ ldata2 = lineptr(p.y+1);
+ if (wordtype(ldata2[0]) == wvalue) {
+ p.x = 0;
+ p.y++;
+ ldata = ldata2;
+ } else
+ break;
+ } else
+ break;
+ }
+ }
} else {
- while (p.x > 0 && wordtype(ldata[p.x - 1]) == wvalue)
- p.x--;
+ while (1) {
+ if (p.x > 0) {
+ if (wordtype(ldata[p.x - 1]) == wvalue)
+ p.x--;
+ else
+ break;
+ } else {
+ unsigned long *ldata2;
+ if (p.y <= topy)
+ break;
+ ldata2 = lineptr(p.y-1);
+ if ((ldata2[cols] & LATTR_WRAPPED) &&
+ wordtype(ldata2[cols-1]) == wvalue) {
+ p.x = cols-1;
+ p.y--;
+ ldata = ldata2;
+ } else
+ break;
+ }
+ }
}
break;
case SM_LINE:
/* Assume a small paste will be OK in one go. */
if (paste_len < 256) {
- luni_send(paste_buffer, paste_len);
+ luni_send(paste_buffer, paste_len, 0);
if (paste_buffer)
sfree(paste_buffer);
paste_buffer = 0;
c = x + 33;
sprintf(abuf, "\033[M%c%c%c", encstate, c, r);
- ldisc_send(abuf, 6);
+ ldisc_send(abuf, 6, 0);
return;
}
if (paste_buffer[paste_pos + n++] == '\r')
break;
}
- luni_send(paste_buffer + paste_pos, n);
+ luni_send(paste_buffer + paste_pos, n, 0);
paste_pos += n;
if (paste_pos < paste_len) {