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