ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-rxvt.C
Revision: 1.36
Committed: Tue Feb 19 10:46:03 2008 UTC (16 years, 4 months ago) by ayin
Content type: text/plain
Branch: MAIN
Changes since 1.35: +12 -18 lines
Log Message:
Simplify draw_button.

File Contents

# User Rev Content
1 root 1.29 /*----------------------------------------------------------------------*
2 pcg 1.9 * File: scrollbar-rxvt.C
3 pcg 1.1 *----------------------------------------------------------------------*
4     *
5     * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA>
6     * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.com>
7 root 1.28 * Copyright (c) 2004-2006 Marc Lehmann <pcg@goof.com>
8 pcg 1.1 *
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    
27     /*----------------------------------------------------------------------*/
28     #if defined(RXVT_SCROLLBAR)
29    
30 root 1.24 static void
31 root 1.23 draw_shadow (rxvt_term *term, int x, int y, int w, int h)
32 root 1.24 {
33 root 1.23 int shadow;
34 root 1.24
35 root 1.22 shadow = (w == 0 || h == 0) ? 1 : SHADOW_WIDTH;
36     w += x - 1;
37     h += y - 1;
38 root 1.24
39 root 1.22 for (; shadow-- > 0; x++, y++, w--, h--)
40 root 1.24 {
41 root 1.27 XDrawLine (term->dpy, term->scrollBar.win, term->topShadowGC, x, y, w , y );
42     XDrawLine (term->dpy, term->scrollBar.win, term->topShadowGC, x, y, x , h );
43     XDrawLine (term->dpy, term->scrollBar.win, term->botShadowGC, w, h, w , y + 1);
44     XDrawLine (term->dpy, term->scrollBar.win, term->botShadowGC, w, h, x + 1, h );
45 root 1.24 }
46     }
47 root 1.21
48     /* draw triangular button with a shadow of 2 pixels */
49 root 1.23 static void
50 ayin 1.36 draw_button (rxvt_term *term, int x, int y, int dirn)
51 pcg 1.1 {
52 root 1.23 unsigned int sz, sz2;
53     XPoint pt[3];
54     GC top, bot;
55 pcg 1.6
56 root 1.23 sz = term->scrollBar.width;
57 pcg 1.6 sz2 = sz / 2;
58 root 1.26
59 ayin 1.36 if ((dirn == UP && term->scrollBar.state == STATE_UP)
60     || (dirn == DN && term->scrollBar.state == STATE_DOWN))
61 pcg 1.6 {
62 ayin 1.36 top = term->botShadowGC;
63     bot = term->topShadowGC;
64     }
65     else
66     {
67     top = term->topShadowGC;
68     bot = term->botShadowGC;
69 pcg 1.6 }
70    
71     /* fill triangle */
72     pt[0].x = x;
73     pt[1].x = x + sz - 1;
74     pt[2].x = x + sz2;
75 root 1.26
76 pcg 1.6 if (dirn == UP)
77     {
78     pt[0].y = pt[1].y = y + sz - 1;
79     pt[2].y = y;
80     }
81     else
82     {
83     pt[0].y = pt[1].y = y;
84     pt[2].y = y + sz - 1;
85     }
86 root 1.10
87 root 1.27 XFillPolygon (term->dpy, term->scrollBar.win, term->scrollbarGC,
88 root 1.10 pt, 3, Convex, CoordModeOrigin);
89 pcg 1.6
90     /* draw base */
91 root 1.27 XDrawLine (term->dpy, term->scrollBar.win, (dirn == UP ? bot : top),
92 root 1.10 pt[0].x, pt[0].y, pt[1].x, pt[1].y);
93 pcg 1.6
94     /* draw shadow on left */
95     pt[1].x = x + sz2 - 1;
96     pt[1].y = y + (dirn == UP ? 0 : sz - 1);
97 root 1.27 XDrawLine (term->dpy, term->scrollBar.win, top,
98 root 1.10 pt[0].x, pt[0].y, pt[1].x, pt[1].y);
99 pcg 1.1
100 root 1.22 #if SHADOW_WIDTH > 1
101 pcg 1.6 /* doubled */
102     pt[0].x++;
103 root 1.17
104 pcg 1.6 if (dirn == UP)
105     {
106     pt[0].y--;
107     pt[1].y++;
108 pcg 1.1 }
109 pcg 1.6 else
110     {
111     pt[0].y++;
112     pt[1].y--;
113     }
114 root 1.17
115 root 1.27 XDrawLine (term->dpy, term->scrollBar.win, top,
116 root 1.10 pt[0].x, pt[0].y, pt[1].x, pt[1].y);
117 pcg 1.1 #endif
118 root 1.21
119 pcg 1.6 /* draw shadow on right */
120     pt[1].x = x + sz - 1;
121     /* pt[2].x = x + sz2; */
122     pt[1].y = y + (dirn == UP ? sz - 1 : 0);
123     pt[2].y = y + (dirn == UP ? 0 : sz - 1);
124 root 1.27 XDrawLine (term->dpy, term->scrollBar.win, bot,
125 root 1.10 pt[2].x, pt[2].y, pt[1].x, pt[1].y);
126 root 1.17
127 root 1.22 #if SHADOW_WIDTH > 1
128 pcg 1.6 /* doubled */
129     pt[1].x--;
130     if (dirn == UP)
131     {
132     pt[2].y++;
133     pt[1].y--;
134 pcg 1.1 }
135 pcg 1.6 else
136     {
137     pt[2].y--;
138     pt[1].y++;
139     }
140 root 1.10
141 root 1.27 XDrawLine (term->dpy, term->scrollBar.win, bot,
142 root 1.10 pt[2].x, pt[2].y, pt[1].x, pt[1].y);
143 pcg 1.1 #endif
144     }
145    
146     int
147 root 1.16 rxvt_term::scrollbar_show_rxvt (int update, int last_top, int last_bot, int scrollbar_len)
148 pcg 1.1 {
149 ayin 1.33 int sbshadow = scrollBar.shadow;
150 root 1.16 int sbwidth = (int)scrollBar.width;
151 pcg 1.1
152 pcg 1.6 if ((scrollBar.init & R_SB_RXVT) == 0)
153     {
154 ayin 1.34 XGCValues gcvalue;
155    
156 pcg 1.6 scrollBar.init |= R_SB_RXVT;
157 root 1.18
158 ayin 1.34 gcvalue.foreground = pix_colors[Color_topShadow];
159     topShadowGC = XCreateGC (dpy, vt, GCForeground, &gcvalue);
160     gcvalue.foreground = pix_colors[Color_bottomShadow];
161     botShadowGC = XCreateGC (dpy, vt, GCForeground, &gcvalue);
162     gcvalue.foreground = pix_colors[ (depth <= 2 ? Color_fg : Color_scroll)];
163     scrollbarGC = XCreateGC (dpy, vt, GCForeground, &gcvalue);
164 pcg 1.6 if (sbshadow)
165     {
166 root 1.27 XSetWindowBackground (dpy, scrollBar.win, pix_colors_focused[Color_trough]);
167     XClearWindow (dpy, scrollBar.win);
168 pcg 1.6 }
169     }
170     else
171     {
172 root 1.16 if (update)
173     {
174     if (last_top < scrollBar.top)
175 root 1.27 XClearArea (dpy, scrollBar.win,
176 root 1.16 sbshadow, last_top,
177     sbwidth, (scrollBar.top - last_top),
178     False);
179    
180     if (scrollBar.bot < last_bot)
181 root 1.27 XClearArea (dpy, scrollBar.win,
182 root 1.16 sbshadow, scrollBar.bot,
183     sbwidth, (last_bot - scrollBar.bot),
184     False);
185     }
186     else
187 root 1.27 XClearWindow (dpy, scrollBar.win);
188 pcg 1.1 }
189    
190 pcg 1.6 /* scrollbar slider */
191 pcg 1.1 #ifdef SB_BORDER
192 pcg 1.6 {
193 root 1.10 int xofs;
194 pcg 1.1
195 root 1.30 if (option (Opt_scrollBar_right))
196 pcg 1.6 xofs = 0;
197     else
198     xofs = sbshadow ? sbwidth : sbwidth - 1;
199    
200 root 1.27 XDrawLine (dpy, scrollBar.win, botShadowGC,
201 root 1.10 xofs, 0, xofs, scrollBar.end + sbwidth);
202 pcg 1.6 }
203     #endif
204 root 1.10
205 root 1.27 XFillRectangle (dpy, scrollBar.win, scrollbarGC,
206 root 1.10 sbshadow, scrollBar.top, sbwidth,
207     scrollbar_len);
208 pcg 1.1
209 pcg 1.6 if (sbshadow)
210     /* trough shadow */
211 root 1.23 draw_shadow (this, 0, 0, sbwidth + 2 * sbshadow, scrollBar.end + (sbwidth + 1) + sbshadow);
212 root 1.10
213 pcg 1.6 /* shadow for scrollbar slider */
214 root 1.23 draw_shadow (this, sbshadow, scrollBar.top, sbwidth, scrollbar_len);
215 pcg 1.6
216 root 1.10 /* Redraw scrollbar arrows */
217 ayin 1.36 draw_button (this, sbshadow, sbshadow, UP);
218     draw_button (this, sbshadow, scrollBar.end + 1, DN);
219 root 1.10
220 pcg 1.6 return 1;
221 pcg 1.1 }
222 ayin 1.31 #endif /* RXVT_SCROLLBAR */
223 pcg 1.1 /*----------------------- end-of-file (C source) -----------------------*/
224 root 1.18