ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-next.C
Revision: 1.10
Committed: Thu Apr 8 20:31:45 2004 UTC (20 years, 1 month ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_8, rel-3_3, rel-3_2, rel-3_0
Changes since 1.9: +2 -1 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 #include "scrollbar-next.intpro" /* PROTOS for internal routines */
29
30 /*----------------------------------------------------------------------*/
31 #if defined(NEXT_SCROLLBAR)
32
33 #define n_stp_width 8
34 #define n_stp_height 2
35 const unsigned char n_stp_bits[] = { 0x55, 0xaa };
36
37 /*
38 * N*XTSTEP like scrollbar - written by Alfredo K. Kojima
39 */
40 #define SCROLLER_DIMPLE_WIDTH 6
41 #define SCROLLER_DIMPLE_HEIGHT 6
42 #define ARROW_WIDTH 13
43 #define ARROW_HEIGHT 13
44
45 const char *const SCROLLER_DIMPLE[] =
46 {
47 ".%###.",
48 "%#%%%%",
49 "#%%...",
50 "#%.. ",
51 "#%. ",
52 ".%. ."
53 };
54 const char *const SCROLLER_ARROW_UP[] =
55 {
56 ".............",
57 ".............",
58 "......%......",
59 "......#......",
60 ".....%#%.....",
61 ".....###.....",
62 "....%###%....",
63 "....#####....",
64 "...%#####%...",
65 "...#######...",
66 "..%#######%..",
67 ".............",
68 "............."
69 };
70 const char *const SCROLLER_ARROW_DOWN[] =
71 {
72 ".............",
73 ".............",
74 "..%#######%..",
75 "...#######...",
76 "...%#####%...",
77 "....#####....",
78 "....%###%....",
79 ".....###.....",
80 ".....%#%.....",
81 "......#......",
82 "......%......",
83 ".............",
84 "............."
85 };
86 const char *const HI_SCROLLER_ARROW_UP[] =
87 {
88 " ",
89 " ",
90 " % ",
91 " % ",
92 " %%% ",
93 " %%% ",
94 " %%%%% ",
95 " %%%%% ",
96 " %%%%%%% ",
97 " %%%%%%% ",
98 " %%%%%%%%% ",
99 " ",
100 " "
101 };
102 const char *const HI_SCROLLER_ARROW_DOWN[] =
103 {
104 " ",
105 " ",
106 " %%%%%%%%% ",
107 " %%%%%%% ",
108 " %%%%%%% ",
109 " %%%%% ",
110 " %%%%% ",
111 " %%% ",
112 " %%% ",
113 " % ",
114 " % ",
115 " ",
116 " "
117 };
118
119 Pixmap
120 rxvt_term::renderPixmap (const char *const *data, int width, int height)
121 {
122 char a;
123 int x, y;
124 Pixmap d;
125 GC pointcolour;
126
127 d = XCreatePixmap (display->display, scrollBar.win, width, height, XDEPTH);
128
129 for (y = 0; y < height; y++)
130 {
131 for (x = 0; x < width; x++)
132 {
133 if ((a = data[y][x]) == ' ' || a == 'w')
134 pointcolour = whiteGC;
135 else if (a == '.' || a == 'l')
136 pointcolour = grayGC;
137 else if (a == '%' || a == 'd')
138 pointcolour = darkGC;
139 else /* if (a == '#' || a == 'b' || a) */
140 pointcolour = blackGC;
141 XDrawPoint (display->display, d, pointcolour, x, y);
142 }
143 }
144 return d;
145 }
146
147 void
148 rxvt_term::init_scrollbar_stuff ()
149 {
150 XGCValues gcvalue;
151 XColor xcol;
152 Pixmap stipple;
153 unsigned long light, dark;
154
155 gcvalue.graphics_exposures = False;
156
157 gcvalue.foreground = PixColors[Color_Black];
158 blackGC = XCreateGC (display->display, scrollBar.win,
159 GCForeground | GCGraphicsExposures, &gcvalue);
160
161 gcvalue.foreground = PixColors[Color_White];
162 whiteGC = XCreateGC (display->display, scrollBar.win,
163 GCForeground | GCGraphicsExposures, &gcvalue);
164
165 xcol.red = 0xaeba;
166 xcol.green = 0xaaaa;
167 xcol.blue = 0xaeba;
168 //if (!rXAllocColor (&xcol, "light gray"))//TODO//D//
169 xcol.pixel = PixColors[Color_AntiqueWhite];
170 light = gcvalue.foreground = xcol.pixel;
171 grayGC = XCreateGC (display->display, scrollBar.win,
172 GCForeground | GCGraphicsExposures, &gcvalue);
173
174 xcol.red = 0x51aa;
175 xcol.green = 0x5555;
176 xcol.blue = 0x5144;
177 //if (!rXAllocColor (&xcol, "dark gray"))//TODO//D//
178 xcol.pixel = PixColors[Color_Grey25];
179 dark = gcvalue.foreground = xcol.pixel;
180 darkGC = XCreateGC (display->display, scrollBar.win,
181 GCForeground | GCGraphicsExposures, &gcvalue);
182
183 stipple = XCreateBitmapFromData (display->display, scrollBar.win,
184 (char *)n_stp_bits, n_stp_width,
185 n_stp_height);
186
187 gcvalue.foreground = dark;
188 gcvalue.background = light;
189 gcvalue.fill_style = FillOpaqueStippled;
190 gcvalue.stipple = stipple;
191
192 /* XSetWindowBackground (display->display, scrollBar.win, PixColors[Color_Red]); */
193
194 stippleGC = XCreateGC (display->display, scrollBar.win,
195 GCForeground | GCBackground | GCStipple
196 | GCFillStyle | GCGraphicsExposures, &gcvalue);
197
198 dimple = renderPixmap (SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
199 SCROLLER_DIMPLE_HEIGHT);
200
201 upArrow = renderPixmap (SCROLLER_ARROW_UP, ARROW_WIDTH,
202 ARROW_HEIGHT);
203 downArrow = renderPixmap (SCROLLER_ARROW_DOWN, ARROW_WIDTH,
204 ARROW_HEIGHT);
205 upArrowHi = renderPixmap (HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
206 ARROW_HEIGHT);
207 downArrowHi = renderPixmap (HI_SCROLLER_ARROW_DOWN,
208 ARROW_WIDTH, ARROW_HEIGHT);
209 }
210
211 /* Draw bevel & arrows */
212 void
213 rxvt_term::drawBevel (Drawable d, int x1, int y1, int w, int h)
214 {
215 int x2, y2;
216
217 x2 = x1 + w - 1; /* right point */
218 y2 = y1 + h - 1; /* bottom point */
219 /* white top and left */
220 XDrawLine (display->display, d, whiteGC, x1, y1, x2, y1);
221 XDrawLine (display->display, d, whiteGC, x1, y1, x1, y2);
222 /* black bottom and right */
223 XDrawLine (display->display, d, blackGC, x1, y2, x2, y2);
224 XDrawLine (display->display, d, blackGC, x2, y1, x2, y2);
225 /* dark inside bottom and right */
226 x1++, y1++, x2--, y2--; /* move in one point */
227 XDrawLine (display->display, d, darkGC, x1, y2, x2, y2);
228 XDrawLine (display->display, d, darkGC, x2, y1, x2, y2);
229 }
230
231 int
232 rxvt_term::scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len)
233 {
234 int height = scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
235 Drawable s;
236
237 if ((scrollBar.init & R_SB_NEXT) == 0)
238 {
239 scrollBar.init |= R_SB_NEXT;
240 init_scrollbar_stuff ();
241 }
242
243 if (TermWin.nscrolled == 0 || !update)
244 {
245 XFillRectangle (display->display, scrollBar.win, grayGC, 0, 0,
246 SB_WIDTH_NEXT + 1, height);
247 XDrawRectangle (display->display, scrollBar.win, blackGC, 0,
248 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
249 height + SB_BORDER_WIDTH);
250 XFillRectangle (display->display, scrollBar.win, stippleGC,
251 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height);
252 }
253 if (TermWin.nscrolled)
254 {
255 if (last_top < scrollBar.top || !update)
256 XFillRectangle (display->display, scrollBar.win, stippleGC,
257 SB_LEFT_PADDING, SB_PADDING + last_top,
258 SB_BUTTON_WIDTH, scrollBar.top - last_top);
259 if (scrollBar.bot < last_bot || !update)
260 XFillRectangle (display->display, scrollBar.win, stippleGC,
261 SB_LEFT_PADDING, scrollBar.bot + SB_PADDING,
262 SB_BUTTON_WIDTH, (last_bot - scrollBar.bot));
263 XFillRectangle (display->display, scrollBar.win, grayGC,
264 SB_LEFT_PADDING, scrollBar.top + SB_PADDING,
265 SB_BUTTON_WIDTH, scrollbar_len);
266 XCopyArea (display->display, dimple, scrollBar.win, whiteGC, 0, 0,
267 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT,
268 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2,
269 scrollBar.top + SB_BEVEL_WIDTH_UPPER_LEFT +
270 (scrollbar_len - SCROLLER_DIMPLE_HEIGHT) / 2);
271
272 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
273 scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH,
274 scrollbar_len);
275 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
276 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH,
277 SB_BUTTON_HEIGHT);
278 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
279 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH,
280 SB_BUTTON_HEIGHT);
281
282 s = (scrollbar_isUp ()) ? upArrowHi : upArrow;
283 XCopyArea (display->display, s, scrollBar.win, whiteGC, 0, 0,
284 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
285 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
286
287 s = (scrollbar_isDn ()) ? downArrowHi : downArrow;
288 XCopyArea (display->display, s, scrollBar.win, whiteGC, 0, 0,
289 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
290 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
291 }
292 return 1;
293 }
294 #endif /* NEXT_SCROLLBAR */
295 /*----------------------- end-of-file (C source) -----------------------*/