void WindowScroll(TScreen *screen,int top) { register int i, lines; register int scrolltop, scrollheight, refreshtop; register int x = 0; if (top < -screen->savedlines) top = -screen->savedlines; else if (top > 0) top = 0; if((i = screen->topline - top) == 0) { ScrollBarDrawThumb(screen->scrollWidget); return; } /*ScrollSelection(screen, i);*/ if(screen->cursor_state) HideCursor(); lines = i > 0 ? i : -i; if(lines > screen->max_row + 1) lines = screen->max_row + 1; scrollheight = screen->max_row - lines + 1; if(i > 0) refreshtop = scrolltop = 0; else { scrolltop = lines; refreshtop = scrollheight; } /*x = screen->scrollbar + screen->border;*/ x=OriginX(screen); scrolling_copy_area(screen, scrolltop, scrollheight, -i); screen->topline = top; ScrollSelection(screen, i); XClearArea( screen->display, /*TextWindow(screen),*/ VWindow(screen), (int) x, (int) refreshtop * FontHeight(screen) + screen->border, (unsigned) Width(screen), (unsigned) lines * FontHeight(screen), FALSE); ScrnRefresh(screen, refreshtop, 0, lines, screen->max_col + 1, False); ScrollBarDrawThumb(screen->scrollWidget); }
/* * Lookup/cache a GC for the double-size character display. We save up to * NUM_CHRSET values. */ GC xterm_DoubleGC(unsigned chrset, unsigned flags, GC old_gc) { XGCValues gcv; register TScreen *screen = &term->screen; unsigned long mask = (GCForeground | GCBackground | GCFont); int n; char *name; XTermFonts *data; if ((name = xtermSpecialFont(flags, chrset)) == 0) return 0; n = xterm_Double_index(chrset, flags); data = &(screen->double_fonts[n]); if (data->fn != 0) { if (!strcmp(data->fn, name)) { if (data->fs != 0) { XCopyGC(screen->display, old_gc, ~GCFont, data->gc); return data->gc; } } discard_font(screen, data); data->chrset = chrset; data->flags = flags & BOLD; } data->fn = name; TRACE(("xterm_DoubleGC %s %d: %s\n", flags & BOLD ? "BOLD" : "NORM", n, name)); if ((data->fs = XLoadQueryFont(screen->display, name)) == 0) return 0; TRACE(("-> OK\n")); gcv.graphics_exposures = TRUE; /* default */ gcv.font = data->fs->fid; gcv.foreground = screen->foreground; gcv.background = term->core.background_pixel; data->gc = XCreateGC(screen->display, VWindow(screen), mask, &gcv); XCopyGC(screen->display, old_gc, ~GCFont, data->gc); return data->gc; }
void WindowScroll(XtermWidget xw, int top, Bool always GCC_UNUSED) { TScreen *screen = TScreenOf(xw); #if OPT_SCROLL_LOCK if (screen->allowScrollLock && (screen->scroll_lock && !always)) { if (screen->scroll_dirty) { screen->scroll_dirty = False; ScrnRefresh(xw, 0, 0, MaxRows(screen), MaxCols(screen), False); } } else #endif { int i; if (top < -screen->savedlines) { top = -screen->savedlines; } else if (top > 0) { top = 0; } if ((i = screen->topline - top) != 0) { int lines; int scrolltop, scrollheight, refreshtop; if (screen->cursor_state) HideCursor(); lines = i > 0 ? i : -i; if (lines > MaxRows(screen)) lines = MaxRows(screen); scrollheight = screen->max_row - lines + 1; if (i > 0) refreshtop = scrolltop = 0; else { scrolltop = lines; refreshtop = scrollheight; } scrolling_copy_area(xw, scrolltop, scrollheight, -i); screen->topline = top; ScrollSelection(screen, i, True); #if OPT_DOUBLE_BUFFER XFillRectangle(screen->display, VDrawable(screen), ReverseGC(xw, screen), OriginX(screen), OriginY(screen) + refreshtop * FontHeight(screen), (unsigned) Width(screen), (unsigned) (lines * FontHeight(screen))); #else XClearArea(screen->display, VWindow(screen), OriginX(screen), OriginY(screen) + refreshtop * FontHeight(screen), (unsigned) Width(screen), (unsigned) (lines * FontHeight(screen)), False); #endif ScrnRefresh(xw, refreshtop, 0, lines, MaxCols(screen), False); #if OPT_BLINK_CURS || OPT_BLINK_TEXT RestartBlinking(screen); #endif } } ScrollBarDrawThumb(screen->scrollWidget); }