--- rxvt-unicode/src/scrollbar-rxvt.C 2004/02/01 01:34:41 1.6 +++ rxvt-unicode/src/scrollbar-rxvt.C 2006/01/16 17:11:12 1.22 @@ -1,9 +1,10 @@ /*--------------------------------*-C-*---------------------------------* - * File: scrollbar-rxvt.c + * File: scrollbar-rxvt.C *----------------------------------------------------------------------* * * Copyright (c) 1997,1998 mj olesen * Copyright (c) 1999-2001 Geoff Wing + * Copyright (c) 2004 Marc Lehmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,12 +23,30 @@ #include "../config.h" /* NECESSARY */ #include "rxvt.h" /* NECESSARY */ -#include "scrollbar-rxvt.intpro" /* PROTOS for internal routines */ /*----------------------------------------------------------------------*/ #if defined(RXVT_SCROLLBAR) -/* draw triangular button with a shadow of SHADOW (1 or 2) pixels */ +#define SHADOW_WIDTH 1 + +static void +rxvt_Draw_Shadow (Display *display, Window win, GC topShadow, GC botShadow, int x, int y, int w, int h) +{ + int shadow; + + shadow = (w == 0 || h == 0) ? 1 : SHADOW_WIDTH; + w += x - 1; + h += y - 1; + for (; shadow-- > 0; x++, y++, w--, h--) + { + XDrawLine (display, win, topShadow, x, y, w, y); + XDrawLine (display, win, topShadow, x, y, x, h); + XDrawLine (display, win, botShadow, w, h, w, y + 1); + XDrawLine (display, win, botShadow, w, h, x + 1, h); + } +} + +/* draw triangular button with a shadow of 2 pixels */ void rxvt_term::Draw_button (int x, int y, int state, int dirn) { @@ -66,22 +85,24 @@ pt[0].y = pt[1].y = y; pt[2].y = y + sz - 1; } - XFillPolygon(Xdisplay, scrollBar.win, scrollbarGC, - pt, 3, Convex, CoordModeOrigin); + + XFillPolygon (display->display, scrollBar.win, scrollbarGC, + pt, 3, Convex, CoordModeOrigin); /* draw base */ - XDrawLine(Xdisplay, scrollBar.win, (dirn == UP ? bot : top), - pt[0].x, pt[0].y, pt[1].x, pt[1].y); + XDrawLine (display->display, scrollBar.win, (dirn == UP ? bot : top), + pt[0].x, pt[0].y, pt[1].x, pt[1].y); /* draw shadow on left */ pt[1].x = x + sz2 - 1; pt[1].y = y + (dirn == UP ? 0 : sz - 1); - XDrawLine(Xdisplay, scrollBar.win, top, - pt[0].x, pt[0].y, pt[1].x, pt[1].y); + XDrawLine (display->display, scrollBar.win, top, + pt[0].x, pt[0].y, pt[1].x, pt[1].y); -#if (SHADOW > 1) +#if SHADOW_WIDTH > 1 /* doubled */ pt[0].x++; + if (dirn == UP) { pt[0].y--; @@ -92,17 +113,20 @@ pt[0].y++; pt[1].y--; } - XDrawLine(Xdisplay, scrollBar.win, top, - pt[0].x, pt[0].y, pt[1].x, pt[1].y); + + XDrawLine (display->display, scrollBar.win, top, + pt[0].x, pt[0].y, pt[1].x, pt[1].y); #endif + /* draw shadow on right */ pt[1].x = x + sz - 1; /* pt[2].x = x + sz2; */ pt[1].y = y + (dirn == UP ? sz - 1 : 0); pt[2].y = y + (dirn == UP ? 0 : sz - 1); - XDrawLine(Xdisplay, scrollBar.win, bot, - pt[2].x, pt[2].y, pt[1].x, pt[1].y); -#if (SHADOW > 1) + XDrawLine (display->display, scrollBar.win, bot, + pt[2].x, pt[2].y, pt[1].x, pt[1].y); + +#if SHADOW_WIDTH > 1 /* doubled */ pt[1].x--; if (dirn == UP) @@ -115,85 +139,87 @@ pt[2].y--; pt[1].y++; } - XDrawLine(Xdisplay, scrollBar.win, bot, - pt[2].x, pt[2].y, pt[1].x, pt[1].y); + + XDrawLine (display->display, scrollBar.win, bot, + pt[2].x, pt[2].y, pt[1].x, pt[1].y); #endif } int -rxvt_term::scrollbar_show_rxvt (int update __attribute__((unused)), int last_top, int last_bot, int scrollbar_len) +rxvt_term::scrollbar_show_rxvt (int update, int last_top, int last_bot, int scrollbar_len) { - int sbshadow = sb_shadow; - int sbwidth = (int)scrollBar.width; + int sbshadow = sb_shadow; + int sbwidth = (int)scrollBar.width; if ((scrollBar.init & R_SB_RXVT) == 0) { - XGCValues gcvalue; - scrollBar.init |= R_SB_RXVT; - gcvalue.foreground = PixColors[Color_trough]; + if (sbshadow) { - XSetWindowBackground(Xdisplay, scrollBar.win, - gcvalue.foreground); - XClearWindow(Xdisplay, scrollBar.win); + XSetWindowBackground (display->display, scrollBar.win, pix_colors_focused[Color_trough]); + XClearWindow (display->display, scrollBar.win); } } else { - /* instead of XClearWindow (Xdisplay, scrollBar.win); */ - if (last_top < scrollBar.top) - XClearArea(Xdisplay, scrollBar.win, - sbshadow, last_top, - sbwidth, (scrollBar.top - last_top), - False); - - if (scrollBar.bot < last_bot) - XClearArea(Xdisplay, scrollBar.win, - sbshadow, scrollBar.bot, - sbwidth, (last_bot - scrollBar.bot), - False); + if (update) + { + if (last_top < scrollBar.top) + XClearArea (display->display, scrollBar.win, + sbshadow, last_top, + sbwidth, (scrollBar.top - last_top), + False); + + if (scrollBar.bot < last_bot) + XClearArea (display->display, scrollBar.win, + sbshadow, scrollBar.bot, + sbwidth, (last_bot - scrollBar.bot), + False); + } + else + XClearWindow (display->display, scrollBar.win); } /* scrollbar slider */ #ifdef SB_BORDER { - int xofs; + int xofs; - if (Options & Opt_scrollBar_right) + if (OPTION (Opt_scrollBar_right)) xofs = 0; else xofs = sbshadow ? sbwidth : sbwidth - 1; - XDrawLine(Xdisplay, scrollBar.win, botShadowGC, - xofs, 0, xofs, scrollBar.end + sbwidth); + XDrawLine (display->display, scrollBar.win, botShadowGC, + xofs, 0, xofs, scrollBar.end + sbwidth); } #endif - XFillRectangle(Xdisplay, scrollBar.win, scrollbarGC, - sbshadow, scrollBar.top, sbwidth, - scrollbar_len); + + XFillRectangle (display->display, scrollBar.win, scrollbarGC, + sbshadow, scrollBar.top, sbwidth, + scrollbar_len); if (sbshadow) /* trough shadow */ - rxvt_Draw_Shadow(Xdisplay, scrollBar.win, + rxvt_Draw_Shadow (display->display, scrollBar.win, botShadowGC, topShadowGC, 0, 0, - sbwidth + 2 * sbshadow, /* scrollbar_TotalWidth() */ + sbwidth + 2 * sbshadow, /* scrollbar_TotalWidth () */ scrollBar.end + (sbwidth + 1) + sbshadow); + /* shadow for scrollbar slider */ - rxvt_Draw_Shadow(Xdisplay, scrollBar.win, + rxvt_Draw_Shadow (display->display, scrollBar.win, topShadowGC, botShadowGC, sbshadow, scrollBar.top, sbwidth, scrollbar_len); - /* - * Redraw scrollbar arrows - */ - Draw_button (sbshadow, sbshadow, - (scrollbar_isUp() ? -1 : +1), UP); - Draw_button (sbshadow, (scrollBar.end + 1), - (scrollbar_isDn() ? -1 : +1), DN); + /* Redraw scrollbar arrows */ + Draw_button (sbshadow, sbshadow, (scrollbar_isUp () ? -1 : +1), UP); + Draw_button (sbshadow, scrollBar.end + 1, (scrollbar_isDn () ? -1 : +1), DN); + return 1; } #endif /* RXVT_SCROLLBAR */ /*----------------------- end-of-file (C source) -----------------------*/ +