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);
}
Beispiel #2
0
/*
 * 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;
}
Beispiel #3
0
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);
}