ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-rxvt.C
Revision: 1.3
Committed: Tue Nov 25 11:52:42 2003 UTC (20 years, 6 months ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-1-3, rel-1-2
Changes since 1.2: +11 -11 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*--------------------------------*-C-*---------------------------------*
2     * File: scrollbar-rxvt.c
3     *----------------------------------------------------------------------*
4 pcg 1.3 * $Id: scrollbar-rxvt.C,v 1.2 2003/11/24 17:31:28 pcg Exp $
5 pcg 1.1 *
6     * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA>
7     * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.com>
8     *
9     * This program is free software; you can redistribute it and/or modify
10     * it under the terms of the GNU General Public License as published by
11     * the Free Software Foundation; either version 2 of the License, or
12     * (at your option) any later version.
13     *
14     * This program is distributed in the hope that it will be useful,
15     * but WITHOUT ANY WARRANTY; without even the implied warranty of
16     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17     * GNU General Public License for more details.
18     *
19     * You should have received a copy of the GNU General Public License
20     * along with this program; if not, write to the Free Software
21     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22     *----------------------------------------------------------------------*/
23    
24     #include "../config.h" /* NECESSARY */
25     #include "rxvt.h" /* NECESSARY */
26     #include "scrollbar-rxvt.intpro" /* PROTOS for internal routines */
27    
28     /*----------------------------------------------------------------------*/
29     #if defined(RXVT_SCROLLBAR)
30    
31     /* draw triangular button with a shadow of SHADOW (1 or 2) pixels */
32     /* INTPROTO */
33     void
34     rxvt_Draw_button(pR_ int x, int y, int state, int dirn)
35     {
36     unsigned int sz, sz2;
37     XPoint pt[3];
38     GC top, bot;
39    
40     sz = R->scrollBar.width;
41     sz2 = sz / 2;
42     switch (state) {
43     case +1:
44 pcg 1.3 top = R->topShadowGC;
45     bot = R->botShadowGC;
46 pcg 1.1 break;
47     case -1:
48 pcg 1.3 top = R->botShadowGC;
49     bot = R->topShadowGC;
50 pcg 1.1 break;
51     default:
52 pcg 1.3 top = bot = R->scrollbarGC;
53 pcg 1.1 break;
54     }
55    
56     /* fill triangle */
57     pt[0].x = x;
58     pt[1].x = x + sz - 1;
59     pt[2].x = x + sz2;
60     if (dirn == UP) {
61     pt[0].y = pt[1].y = y + sz - 1;
62     pt[2].y = y;
63     } else {
64     pt[0].y = pt[1].y = y;
65     pt[2].y = y + sz - 1;
66     }
67 pcg 1.3 XFillPolygon(R->Xdisplay, R->scrollBar.win, R->scrollbarGC,
68 pcg 1.1 pt, 3, Convex, CoordModeOrigin);
69    
70     /* draw base */
71     XDrawLine(R->Xdisplay, R->scrollBar.win, (dirn == UP ? bot : top),
72     pt[0].x, pt[0].y, pt[1].x, pt[1].y);
73    
74     /* draw shadow on left */
75     pt[1].x = x + sz2 - 1;
76     pt[1].y = y + (dirn == UP ? 0 : sz - 1);
77     XDrawLine(R->Xdisplay, R->scrollBar.win, top,
78     pt[0].x, pt[0].y, pt[1].x, pt[1].y);
79    
80     #if (SHADOW > 1)
81     /* doubled */
82     pt[0].x++;
83     if (dirn == UP) {
84     pt[0].y--;
85     pt[1].y++;
86     } else {
87     pt[0].y++;
88     pt[1].y--;
89     }
90     XDrawLine(R->Xdisplay, R->scrollBar.win, top,
91     pt[0].x, pt[0].y, pt[1].x, pt[1].y);
92     #endif
93     /* draw shadow on right */
94     pt[1].x = x + sz - 1;
95     /* pt[2].x = x + sz2; */
96     pt[1].y = y + (dirn == UP ? sz - 1 : 0);
97     pt[2].y = y + (dirn == UP ? 0 : sz - 1);
98     XDrawLine(R->Xdisplay, R->scrollBar.win, bot,
99     pt[2].x, pt[2].y, pt[1].x, pt[1].y);
100     #if (SHADOW > 1)
101     /* doubled */
102     pt[1].x--;
103     if (dirn == UP) {
104     pt[2].y++;
105     pt[1].y--;
106     } else {
107     pt[2].y--;
108     pt[1].y++;
109     }
110     XDrawLine(R->Xdisplay, R->scrollBar.win, bot,
111     pt[2].x, pt[2].y, pt[1].x, pt[1].y);
112     #endif
113     }
114    
115     /* EXTPROTO */
116     int
117     rxvt_scrollbar_show_rxvt(pR_ int update __attribute__((unused)), int last_top, int last_bot, int scrollbar_len)
118     {
119     int sbshadow = R->sb_shadow;
120     int sbwidth = (int)R->scrollBar.width;
121    
122     if ((R->scrollBar.init & R_SB_RXVT) == 0) {
123     XGCValues gcvalue;
124    
125     R->scrollBar.init |= R_SB_RXVT;
126     gcvalue.foreground = R->PixColors[Color_trough];
127     if (sbshadow) {
128     XSetWindowBackground(R->Xdisplay, R->scrollBar.win,
129     gcvalue.foreground);
130     XClearWindow(R->Xdisplay, R->scrollBar.win);
131     }
132     } else {
133     /* instead of XClearWindow (R->Xdisplay, R->scrollBar.win); */
134     if (last_top < R->scrollBar.top)
135     XClearArea(R->Xdisplay, R->scrollBar.win,
136     sbshadow, last_top,
137     sbwidth, (R->scrollBar.top - last_top),
138     False);
139    
140     if (R->scrollBar.bot < last_bot)
141     XClearArea(R->Xdisplay, R->scrollBar.win,
142     sbshadow, R->scrollBar.bot,
143     sbwidth, (last_bot - R->scrollBar.bot),
144     False);
145     }
146    
147     /* scrollbar slider */
148     #ifdef SB_BORDER
149     {
150     int xofs;
151    
152     if (R->Options & Opt_scrollBar_right)
153     xofs = 0;
154     else
155     xofs = sbshadow ? sbwidth : sbwidth - 1;
156    
157 pcg 1.3 XDrawLine(R->Xdisplay, R->scrollBar.win, R->botShadowGC,
158 pcg 1.1 xofs, 0, xofs, R->scrollBar.end + sbwidth);
159     }
160     #endif
161 pcg 1.3 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->scrollbarGC,
162 pcg 1.1 sbshadow, R->scrollBar.top, sbwidth,
163     scrollbar_len);
164    
165     if (sbshadow)
166     /* trough shadow */
167     rxvt_Draw_Shadow(R->Xdisplay, R->scrollBar.win,
168 pcg 1.3 R->botShadowGC, R->topShadowGC,
169 pcg 1.1 0, 0,
170     sbwidth + 2 * sbshadow, /* scrollbar_TotalWidth() */
171     R->scrollBar.end + (sbwidth + 1) + sbshadow);
172     /* shadow for scrollbar slider */
173     rxvt_Draw_Shadow(R->Xdisplay, R->scrollBar.win,
174 pcg 1.3 R->topShadowGC, R->botShadowGC,
175 pcg 1.1 sbshadow, R->scrollBar.top, sbwidth,
176     scrollbar_len);
177    
178     /*
179     * Redraw scrollbar arrows
180     */
181     rxvt_Draw_button(aR_ sbshadow, sbshadow,
182     (scrollbar_isUp() ? -1 : +1), UP);
183     rxvt_Draw_button(aR_ sbshadow, (R->scrollBar.end + 1),
184     (scrollbar_isDn() ? -1 : +1), DN);
185     return 1;
186     }
187     #endif /* RXVT_SCROLLBAR */
188     /*----------------------- end-of-file (C source) -----------------------*/