ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-next.C
Revision: 1.13
Committed: Sun Aug 15 21:55:45 2004 UTC (19 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-3_7
Changes since 1.11: +5 -6 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 /*--------------------------------*-C-*---------------------------------*
2 * File: scrollbar-next.C
3 *----------------------------------------------------------------------*
4 *
5 * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA>
6 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org>
7 * - N*XTstep like scrollbars
8 * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.com>
9 * Copyright (c) 2004 Marc Lehmann <pcg@goof.com>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *----------------------------------------------------------------------*/
25
26 #include "../config.h" /* NECESSARY */
27 #include "rxvt.h" /* NECESSARY */
28
29 /*----------------------------------------------------------------------*/
30 #if defined(NEXT_SCROLLBAR)
31
32 #define n_stp_width 8
33 #define n_stp_height 2
34 const unsigned char n_stp_bits[] = { 0x55, 0xaa };
35
36 /*
37 * N*XTSTEP like scrollbar - written by Alfredo K. Kojima
38 */
39 #define SCROLLER_DIMPLE_WIDTH 6
40 #define SCROLLER_DIMPLE_HEIGHT 6
41 #define ARROW_WIDTH 13
42 #define ARROW_HEIGHT 13
43
44 const char *const SCROLLER_DIMPLE[] =
45 {
46 ".%###.",
47 "%#%%%%",
48 "#%%...",
49 "#%.. ",
50 "#%. ",
51 ".%. ."
52 };
53 const char *const SCROLLER_ARROW_UP[] =
54 {
55 ".............",
56 ".............",
57 "......%......",
58 "......#......",
59 ".....%#%.....",
60 ".....###.....",
61 "....%###%....",
62 "....#####....",
63 "...%#####%...",
64 "...#######...",
65 "..%#######%..",
66 ".............",
67 "............."
68 };
69 const char *const SCROLLER_ARROW_DOWN[] =
70 {
71 ".............",
72 ".............",
73 "..%#######%..",
74 "...#######...",
75 "...%#####%...",
76 "....#####....",
77 "....%###%....",
78 ".....###.....",
79 ".....%#%.....",
80 "......#......",
81 "......%......",
82 ".............",
83 "............."
84 };
85 const char *const HI_SCROLLER_ARROW_UP[] =
86 {
87 " ",
88 " ",
89 " % ",
90 " % ",
91 " %%% ",
92 " %%% ",
93 " %%%%% ",
94 " %%%%% ",
95 " %%%%%%% ",
96 " %%%%%%% ",
97 " %%%%%%%%% ",
98 " ",
99 " "
100 };
101 const char *const HI_SCROLLER_ARROW_DOWN[] =
102 {
103 " ",
104 " ",
105 " %%%%%%%%% ",
106 " %%%%%%% ",
107 " %%%%%%% ",
108 " %%%%% ",
109 " %%%%% ",
110 " %%% ",
111 " %%% ",
112 " % ",
113 " % ",
114 " ",
115 " "
116 };
117
118 Pixmap
119 rxvt_term::renderPixmap (const char *const *data, int width, int height)
120 {
121 char a;
122 int x, y;
123 Pixmap d;
124 GC pointcolour;
125
126 d = XCreatePixmap (display->display, scrollBar.win, width, height, display->depth);
127
128 for (y = 0; y < height; y++)
129 {
130 for (x = 0; x < width; x++)
131 {
132 if ((a = data[y][x]) == ' ' || a == 'w')
133 pointcolour = whiteGC;
134 else if (a == '.' || a == 'l')
135 pointcolour = grayGC;
136 else if (a == '%' || a == 'd')
137 pointcolour = darkGC;
138 else /* if (a == '#' || a == 'b' || a) */
139 pointcolour = blackGC;
140 XDrawPoint (display->display, d, pointcolour, x, y);
141 }
142 }
143 return d;
144 }
145
146 void
147 rxvt_term::init_scrollbar_stuff ()
148 {
149 XGCValues gcvalue;
150 XColor xcol;
151 Pixmap stipple;
152 unsigned long light, dark;
153
154 gcvalue.graphics_exposures = False;
155
156 gcvalue.foreground = pix_colors[Color_Black];
157 blackGC = XCreateGC (display->display, scrollBar.win,
158 GCForeground | GCGraphicsExposures, &gcvalue);
159
160 gcvalue.foreground = pix_colors[Color_White];
161 whiteGC = XCreateGC (display->display, scrollBar.win,
162 GCForeground | GCGraphicsExposures, &gcvalue);
163
164 xcol.red = 0xaeba;
165 xcol.green = 0xaaaa;
166 xcol.blue = 0xaeba;
167 //if (!rXAllocColor (&xcol, "light gray"))//TODO//D//
168 xcol.pixel = pix_colors[Color_AntiqueWhite];
169 light = gcvalue.foreground = xcol.pixel;
170 grayGC = XCreateGC (display->display, scrollBar.win,
171 GCForeground | GCGraphicsExposures, &gcvalue);
172
173 xcol.red = 0x51aa;
174 xcol.green = 0x5555;
175 xcol.blue = 0x5144;
176 //if (!rXAllocColor (&xcol, "dark gray"))//TODO//D//
177 xcol.pixel = pix_colors[Color_Grey25];
178 dark = gcvalue.foreground = xcol.pixel;
179 darkGC = XCreateGC (display->display, scrollBar.win,
180 GCForeground | GCGraphicsExposures, &gcvalue);
181
182 stipple = XCreateBitmapFromData (display->display, scrollBar.win,
183 (char *)n_stp_bits, n_stp_width,
184 n_stp_height);
185
186 gcvalue.foreground = dark;
187 gcvalue.background = light;
188 gcvalue.fill_style = FillOpaqueStippled;
189 gcvalue.stipple = stipple;
190
191 /* XSetWindowBackground (display->display, scrollBar.win, pix_colors[Color_Red]); */
192
193 stippleGC = XCreateGC (display->display, scrollBar.win,
194 GCForeground | GCBackground | GCStipple
195 | GCFillStyle | GCGraphicsExposures, &gcvalue);
196
197 dimple = renderPixmap (SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
198 SCROLLER_DIMPLE_HEIGHT);
199
200 upArrow = renderPixmap (SCROLLER_ARROW_UP, ARROW_WIDTH,
201 ARROW_HEIGHT);
202 downArrow = renderPixmap (SCROLLER_ARROW_DOWN, ARROW_WIDTH,
203 ARROW_HEIGHT);
204 upArrowHi = renderPixmap (HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
205 ARROW_HEIGHT);
206 downArrowHi = renderPixmap (HI_SCROLLER_ARROW_DOWN,
207 ARROW_WIDTH, ARROW_HEIGHT);
208 }
209
210 /* Draw bevel & arrows */
211 void
212 rxvt_term::drawBevel (Drawable d, int x1, int y1, int w, int h)
213 {
214 int x2, y2;
215
216 x2 = x1 + w - 1; /* right point */
217 y2 = y1 + h - 1; /* bottom point */
218 /* white top and left */
219 XDrawLine (display->display, d, whiteGC, x1, y1, x2, y1);
220 XDrawLine (display->display, d, whiteGC, x1, y1, x1, y2);
221 /* black bottom and right */
222 XDrawLine (display->display, d, blackGC, x1, y2, x2, y2);
223 XDrawLine (display->display, d, blackGC, x2, y1, x2, y2);
224 /* dark inside bottom and right */
225 x1++, y1++, x2--, y2--; /* move in one point */
226 XDrawLine (display->display, d, darkGC, x1, y2, x2, y2);
227 XDrawLine (display->display, d, darkGC, x2, y1, x2, y2);
228 }
229
230 int
231 rxvt_term::scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len)
232 {
233 int height = scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
234 Drawable s;
235
236 if ((scrollBar.init & R_SB_NEXT) == 0)
237 {
238 scrollBar.init |= R_SB_NEXT;
239 init_scrollbar_stuff ();
240 }
241
242 if (TermWin.nscrolled == 0 || !update)
243 {
244 XFillRectangle (display->display, scrollBar.win, grayGC, 0, 0,
245 SB_WIDTH_NEXT + 1, height);
246 XDrawRectangle (display->display, scrollBar.win, blackGC, 0,
247 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
248 height + SB_BORDER_WIDTH);
249 XFillRectangle (display->display, scrollBar.win, stippleGC,
250 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height);
251 }
252 if (TermWin.nscrolled)
253 {
254 if (last_top < scrollBar.top || !update)
255 XFillRectangle (display->display, scrollBar.win, stippleGC,
256 SB_LEFT_PADDING, SB_PADDING + last_top,
257 SB_BUTTON_WIDTH, scrollBar.top - last_top);
258 if (scrollBar.bot < last_bot || !update)
259 XFillRectangle (display->display, scrollBar.win, stippleGC,
260 SB_LEFT_PADDING, scrollBar.bot + SB_PADDING,
261 SB_BUTTON_WIDTH, (last_bot - scrollBar.bot));
262 XFillRectangle (display->display, scrollBar.win, grayGC,
263 SB_LEFT_PADDING, scrollBar.top + SB_PADDING,
264 SB_BUTTON_WIDTH, scrollbar_len);
265 XCopyArea (display->display, dimple, scrollBar.win, whiteGC, 0, 0,
266 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT,
267 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2,
268 scrollBar.top + SB_BEVEL_WIDTH_UPPER_LEFT +
269 (scrollbar_len - SCROLLER_DIMPLE_HEIGHT) / 2);
270
271 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
272 scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH,
273 scrollbar_len);
274 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
275 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH,
276 SB_BUTTON_HEIGHT);
277 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
278 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH,
279 SB_BUTTON_HEIGHT);
280
281 s = (scrollbar_isUp ()) ? upArrowHi : upArrow;
282 XCopyArea (display->display, s, scrollBar.win, whiteGC, 0, 0,
283 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
284 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
285
286 s = (scrollbar_isDn ()) ? downArrowHi : downArrow;
287 XCopyArea (display->display, s, scrollBar.win, whiteGC, 0, 0,
288 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
289 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
290 }
291 return 1;
292 }
293 #endif /* NEXT_SCROLLBAR */
294 /*----------------------- end-of-file (C source) -----------------------*/