diff options
author | root <root> | 2014-05-22 18:54:32 +0000 |
---|---|---|
committer | root <root> | 2014-05-22 18:54:32 +0000 |
commit | 8c0b328bbc429059a2b9462c9b5dcbbeb0d173e7 (patch) | |
tree | 62bb6b5e2df951b7ca51628c2caa6e5c698e00b5 /src/scrollbar-rxvt.C | |
parent | fe72076284de7d79d15549fb36499bd5ee0f4ee8 (diff) |
GPLv3
Diffstat (limited to 'src/scrollbar-rxvt.C')
-rw-r--r-- | src/scrollbar-rxvt.C | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/src/scrollbar-rxvt.C b/src/scrollbar-rxvt.C new file mode 100644 index 0000000..6359081 --- /dev/null +++ b/src/scrollbar-rxvt.C @@ -0,0 +1,222 @@ +/*----------------------------------------------------------------------* + * File: scrollbar-rxvt.C + *----------------------------------------------------------------------* + * + * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA> + * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.com> + * Copyright (c) 2004-2006 Marc Lehmann <schmorp@schmorp.de> + * + * 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 + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + *----------------------------------------------------------------------*/ + +#include "../config.h" /* NECESSARY */ +#include "rxvt.h" /* NECESSARY */ + +/*----------------------------------------------------------------------*/ +#if defined(RXVT_SCROLLBAR) + +static void +draw_shadow (scrollBar_t *sb, int x, int y, int w, int h) +{ + int shadow; + Drawable d = sb->win; + Display *dpy = sb->term->dpy; + + shadow = (w == 0 || h == 0) ? 1 : SHADOW_WIDTH; + w += x - 1; + h += y - 1; + + for (; shadow-- > 0; x++, y++, w--, h--) + { + XDrawLine (dpy, d, sb->topShadowGC, x, y, w , y ); + XDrawLine (dpy, d, sb->topShadowGC, x, y, x , h ); + XDrawLine (dpy, d, sb->botShadowGC, w, h, w , y + 1); + XDrawLine (dpy, d, sb->botShadowGC, w, h, x + 1, h ); + } +} + +/* draw triangular button with a shadow of 2 pixels */ +static void +draw_button (scrollBar_t *sb, int x, int y, int dirn) +{ + unsigned int sz, sz2; + XPoint pt[3]; + GC top, bot; + Drawable d = sb->win; + Display *dpy = sb->term->dpy; + + sz = sb->width; + sz2 = sz / 2; + + if ((dirn == UP && sb->state == SB_STATE_UP) + || (dirn == DN && sb->state == SB_STATE_DOWN)) + { + top = sb->botShadowGC; + bot = sb->topShadowGC; + } + else + { + top = sb->topShadowGC; + bot = sb->botShadowGC; + } + + /* fill triangle */ + pt[0].x = x; + pt[1].x = x + sz - 1; + pt[2].x = x + sz2; + + if (dirn == UP) + { + pt[0].y = pt[1].y = y + sz - 1; + pt[2].y = y; + } + else + { + pt[0].y = pt[1].y = y; + pt[2].y = y + sz - 1; + } + + XFillPolygon (dpy, d, sb->scrollbarGC, + pt, 3, Convex, CoordModeOrigin); + + /* draw base */ + XDrawLine (dpy, d, (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 (dpy, d, top, + pt[0].x, pt[0].y, pt[1].x, pt[1].y); + +#if SHADOW_WIDTH > 1 + /* doubled */ + pt[0].x++; + + if (dirn == UP) + { + pt[0].y--; + pt[1].y++; + } + else + { + pt[0].y++; + pt[1].y--; + } + + XDrawLine (dpy, d, 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 (dpy, d, bot, + pt[2].x, pt[2].y, pt[1].x, pt[1].y); + +#if SHADOW_WIDTH > 1 + /* doubled */ + pt[1].x--; + if (dirn == UP) + { + pt[2].y++; + pt[1].y--; + } + else + { + pt[2].y--; + pt[1].y++; + } + + XDrawLine (dpy, d, bot, + pt[2].x, pt[2].y, pt[1].x, pt[1].y); +#endif +} + +int +scrollBar_t::show_rxvt (int update) +{ + int sbwidth = (int)width; + + if ((init & SB_STYLE_RXVT) == 0) + { + XGCValues gcvalue; + + init |= SB_STYLE_RXVT; + + gcvalue.foreground = term->pix_colors[Color_topShadow]; + topShadowGC = XCreateGC (term->dpy, term->vt, GCForeground, &gcvalue); + gcvalue.foreground = term->pix_colors[Color_bottomShadow]; + botShadowGC = XCreateGC (term->dpy, term->vt, GCForeground, &gcvalue); + gcvalue.foreground = term->pix_colors[ (term->depth <= 2 ? Color_fg : Color_scroll)]; + scrollbarGC = XCreateGC (term->dpy, term->vt, GCForeground, &gcvalue); + } + else + { + if (update) + { + if (last_top < top) + XClearArea (term->dpy, win, + shadow, last_top, + sbwidth, (top - last_top), + False); + + if (bot < last_bot) + XClearArea (term->dpy, win, + shadow, bot, + sbwidth, (last_bot - bot), + False); + } + else + XClearWindow (term->dpy, win); + } + + /* scrollbar slider */ +#ifdef SB_BORDER + { + int xofs; + + if (term->option (Opt_scrollBar_right)) + xofs = 0; + else + xofs = shadow ? sbwidth : sbwidth - 1; + + XDrawLine (term->dpy, win, botShadowGC, + xofs, 0, xofs, end + sbwidth); + } +#endif + + XFillRectangle (term->dpy, win, scrollbarGC, + shadow, top, sbwidth, + bot - top); + + if (shadow) + /* trough shadow */ + draw_shadow (this, 0, 0, sbwidth + 2 * shadow, end + (sbwidth + 1) + shadow); + + /* shadow for scrollbar slider */ + draw_shadow (this, shadow, top, sbwidth, bot - top); + + /* Redraw scrollbar arrows */ + draw_button (this, shadow, shadow, UP); + draw_button (this, shadow, end + 1, DN); + + return 1; +} +#endif /* RXVT_SCROLLBAR */ +/*----------------------- end-of-file (C source) -----------------------*/ + |