Fixes (mostly from Colin Watson, a couple redone by me) to make Unix
[u/mdw/putty] / terminal.c
index aaf8705..73ab393 100644 (file)
@@ -1889,13 +1889,18 @@ static void check_selection(Terminal *term, pos from, pos to)
 static void scroll(Terminal *term, int topline, int botline, int lines, int sb)
 {
     termline *line;
-    int i, seltop, olddisptop, shift;
+    int i, seltop;
+#ifdef OPTIMISE_SCROLL
+    int olddisptop, shift;
+#endif /* OPTIMISE_SCROLL */
 
     if (topline != 0 || term->alt_which != 0)
        sb = FALSE;
 
+#ifdef OPTIMISE_SCROLL
     olddisptop = term->disptop;
     shift = lines;
+#endif /* OPTIMISE_SCROLL */
     if (lines < 0) {
        while (lines < 0) {
            line = delpos234(term->screen, botline);
@@ -3290,8 +3295,8 @@ static void term_out(Terminal *term)
                    }
                    term->termstate = SEEN_CSI;
                } else if (c == ';') {
-                   if (++term->esc_nargs <= ARGS_MAX)
-                       term->esc_args[term->esc_nargs - 1] = ARG_DEFAULT;
+                   if (term->esc_nargs < ARGS_MAX)
+                       term->esc_args[term->esc_nargs++] = ARG_DEFAULT;
                    term->termstate = SEEN_CSI;
                } else if (c < '@') {
                    if (term->esc_query)
@@ -4770,7 +4775,6 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
        termchar *lchars;
        int dirty_line, dirty_run, selected;
        unsigned long attr = 0, cset = 0;
-       int updated_line = 0;
        int start = 0;
        int ccount = 0;
        int last_run_dirty = 0;
@@ -4968,8 +4972,6 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
                    if (attr & (TATTR_ACTCURS | TATTR_PASCURS))
                        do_cursor(ctx, start, i, ch, ccount, attr,
                                  ldata->lattr);
-
-                   updated_line = 1;
                }
                start = j;
                ccount = 0;
@@ -5054,8 +5056,6 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
            if (attr & (TATTR_ACTCURS | TATTR_PASCURS))
                do_cursor(ctx, start, i, ch, ccount, attr,
                          ldata->lattr);
-
-           updated_line = 1;
        }
 
        unlineptr(ldata);
@@ -5137,6 +5137,31 @@ void term_scroll(Terminal *term, int rel, int where)
 }
 
 /*
+ * Scroll the scrollback to centre it on the beginning or end of the
+ * current selection, if any.
+ */
+void term_scroll_to_selection(Terminal *term, int which_end)
+{
+    pos target;
+    int y;
+    int sbtop = -sblines(term);
+
+    if (term->selstate != SELECTED)
+       return;
+    if (which_end)
+       target = term->selend;
+    else
+       target = term->selstart;
+
+    y = target.y - term->rows/2;
+    if (y < sbtop)
+       y = sbtop;
+    else if (y > 0)
+       y = 0;
+    term_scroll(term, -1, y);
+}
+
+/*
  * Helper routine for clipme(): growing buffer.
  */
 typedef struct {
@@ -5226,7 +5251,7 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel)
            sprintf(cbuf, "<U+%04x>", (ldata[top.x] & 0xFFFF));
 #else
            wchar_t cbuf[16], *p;
-           int set, c;
+           int c;
            int x = top.x;
 
            if (ldata->chars[x].chr == UCSWIDE) {
@@ -5260,7 +5285,6 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect, int desel)
                    break;
                }
 
-               set = (uc & CSET_MASK);
                c = (uc & ~CSET_MASK);
 #ifdef PLATFORM_IS_UTF16
                if (uc > 0x10000 && uc < 0x110000) {