ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-next.C
Revision: 1.4
Committed: Thu Dec 18 02:07:12 2003 UTC (20 years, 5 months ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-1-3, rel-1-2
Changes since 1.3: +3 -3 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 /*--------------------------------*-C-*---------------------------------*
2 * File: scrollbar-next.c
3 *----------------------------------------------------------------------*
4 * $Id: scrollbar-next.C,v 1.3 2003/11/25 11:52:42 pcg Exp $
5 *
6 * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA>
7 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org>
8 * - N*XTstep like scrollbars
9 * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.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 const char *const SCROLLER_ARROW_UP[] = {
54 ".............",
55 ".............",
56 "......%......",
57 "......#......",
58 ".....%#%.....",
59 ".....###.....",
60 "....%###%....",
61 "....#####....",
62 "...%#####%...",
63 "...#######...",
64 "..%#######%..",
65 ".............",
66 "............."
67 };
68 const char *const SCROLLER_ARROW_DOWN[] = {
69 ".............",
70 ".............",
71 "..%#######%..",
72 "...#######...",
73 "...%#####%...",
74 "....#####....",
75 "....%###%....",
76 ".....###.....",
77 ".....%#%.....",
78 "......#......",
79 "......%......",
80 ".............",
81 "............."
82 };
83 const char *const HI_SCROLLER_ARROW_UP[] = {
84 " ",
85 " ",
86 " % ",
87 " % ",
88 " %%% ",
89 " %%% ",
90 " %%%%% ",
91 " %%%%% ",
92 " %%%%%%% ",
93 " %%%%%%% ",
94 " %%%%%%%%% ",
95 " ",
96 " "
97 };
98 const char *const HI_SCROLLER_ARROW_DOWN[] = {
99 " ",
100 " ",
101 " %%%%%%%%% ",
102 " %%%%%%% ",
103 " %%%%%%% ",
104 " %%%%% ",
105 " %%%%% ",
106 " %%% ",
107 " %%% ",
108 " % ",
109 " % ",
110 " ",
111 " "
112 };
113
114 /* INTPROTO */
115 Pixmap
116 rxvt_renderPixmap(pR_ const char *const *data, int width, int height)
117 {
118 char a;
119 int x, y;
120 Pixmap d;
121 GC pointcolour;
122
123 d = XCreatePixmap(R->Xdisplay, R->scrollBar.win, width, height, XDEPTH);
124
125 for (y = 0; y < height; y++) {
126 for (x = 0; x < width; x++) {
127 if ((a = data[y][x]) == ' ' || a == 'w')
128 pointcolour = R->whiteGC;
129 else if (a == '.' || a == 'l')
130 pointcolour = R->grayGC;
131 else if (a == '%' || a == 'd')
132 pointcolour = R->darkGC;
133 else /* if (a == '#' || a == 'b' || a) */
134 pointcolour = R->blackGC;
135 XDrawPoint(R->Xdisplay, d, pointcolour, x, y);
136 }
137 }
138 return d;
139 }
140
141 /* INTPROTO */
142 void
143 rxvt_init_scrollbar_stuff(pR)
144 {
145 XGCValues gcvalue;
146 XColor xcol;
147 Pixmap stipple;
148 unsigned long light, dark;
149
150 gcvalue.graphics_exposures = False;
151
152 gcvalue.foreground = R->PixColors[Color_Black];
153 R->blackGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
154 GCForeground | GCGraphicsExposures, &gcvalue);
155
156 gcvalue.foreground = R->PixColors[Color_White];
157 R->whiteGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
158 GCForeground | GCGraphicsExposures, &gcvalue);
159
160 xcol.red = 0xaeba;
161 xcol.green = 0xaaaa;
162 xcol.blue = 0xaeba;
163 //if (!rxvt_rXAllocColor(aR_ &xcol, "light gray"))//TODO//D//
164 xcol.pixel = R->PixColors[Color_AntiqueWhite];
165 light = gcvalue.foreground = xcol.pixel;
166 R->grayGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
167 GCForeground | GCGraphicsExposures, &gcvalue);
168
169 xcol.red = 0x51aa;
170 xcol.green = 0x5555;
171 xcol.blue = 0x5144;
172 //if (!rxvt_rXAllocColor(aR_ &xcol, "dark gray"))//TODO//D//
173 xcol.pixel = R->PixColors[Color_Grey25];
174 dark = gcvalue.foreground = xcol.pixel;
175 R->darkGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
176 GCForeground | GCGraphicsExposures, &gcvalue);
177
178 stipple = XCreateBitmapFromData(R->Xdisplay, R->scrollBar.win,
179 (char *)n_stp_bits, n_stp_width,
180 n_stp_height);
181
182 gcvalue.foreground = dark;
183 gcvalue.background = light;
184 gcvalue.fill_style = FillOpaqueStippled;
185 gcvalue.stipple = stipple;
186
187 /* XSetWindowBackground(R->Xdisplay, R->scrollBar.win, R->PixColors[Color_Red]); */
188
189 R->stippleGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
190 GCForeground | GCBackground | GCStipple
191 | GCFillStyle | GCGraphicsExposures, &gcvalue);
192
193 R->dimple = rxvt_renderPixmap(aR_ SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
194 SCROLLER_DIMPLE_HEIGHT);
195
196 R->upArrow = rxvt_renderPixmap(aR_ SCROLLER_ARROW_UP, ARROW_WIDTH,
197 ARROW_HEIGHT);
198 R->downArrow = rxvt_renderPixmap(aR_ SCROLLER_ARROW_DOWN, ARROW_WIDTH,
199 ARROW_HEIGHT);
200 R->upArrowHi = rxvt_renderPixmap(aR_ HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
201 ARROW_HEIGHT);
202 R->downArrowHi = rxvt_renderPixmap(aR_ HI_SCROLLER_ARROW_DOWN,
203 ARROW_WIDTH, ARROW_HEIGHT);
204 }
205
206 /* Draw bevel & arrows */
207 /* INTPROTO */
208 void
209 rxvt_drawBevel(pR_ Drawable d, int x1, int y1, int w, int h)
210 {
211 int x2, y2;
212
213 x2 = x1 + w - 1; /* right point */
214 y2 = y1 + h - 1; /* bottom point */
215 /* white top and left */
216 XDrawLine(R->Xdisplay, d, R->whiteGC, x1, y1, x2, y1);
217 XDrawLine(R->Xdisplay, d, R->whiteGC, x1, y1, x1, y2);
218 /* black bottom and right */
219 XDrawLine(R->Xdisplay, d, R->blackGC, x1, y2, x2, y2);
220 XDrawLine(R->Xdisplay, d, R->blackGC, x2, y1, x2, y2);
221 /* dark inside bottom and right */
222 x1++, y1++, x2--, y2--; /* move in one point */
223 XDrawLine(R->Xdisplay, d, R->darkGC, x1, y2, x2, y2);
224 XDrawLine(R->Xdisplay, d, R->darkGC, x2, y1, x2, y2);
225 }
226
227 /* EXTPROTO */
228 int
229 rxvt_scrollbar_show_next(pR_ int update, int last_top, int last_bot, int scrollbar_len)
230 {
231 int height = R->scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
232 Drawable s;
233
234 if ((R->scrollBar.init & R_SB_NEXT) == 0) {
235 R->scrollBar.init |= R_SB_NEXT;
236 rxvt_init_scrollbar_stuff(aR);
237 }
238
239 if (R->TermWin.nscrolled == 0 || !update) {
240 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->grayGC, 0, 0,
241 SB_WIDTH_NEXT + 1, height);
242 XDrawRectangle(R->Xdisplay, R->scrollBar.win, R->blackGC, 0,
243 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
244 height + SB_BORDER_WIDTH);
245 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC,
246 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height);
247 }
248 if (R->TermWin.nscrolled) {
249 if (last_top < R->scrollBar.top || !update)
250 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC,
251 SB_LEFT_PADDING, SB_PADDING + last_top,
252 SB_BUTTON_WIDTH, R->scrollBar.top - last_top);
253 if (R->scrollBar.bot < last_bot || !update)
254 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC,
255 SB_LEFT_PADDING, R->scrollBar.bot + SB_PADDING,
256 SB_BUTTON_WIDTH, (last_bot - R->scrollBar.bot));
257 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->grayGC,
258 SB_LEFT_PADDING, R->scrollBar.top + SB_PADDING,
259 SB_BUTTON_WIDTH, scrollbar_len);
260 XCopyArea(R->Xdisplay, R->dimple, R->scrollBar.win, R->whiteGC, 0, 0,
261 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT,
262 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2,
263 R->scrollBar.top + SB_BEVEL_WIDTH_UPPER_LEFT +
264 (scrollbar_len - SCROLLER_DIMPLE_HEIGHT) / 2);
265
266 rxvt_drawBevel(aR_ R->scrollBar.win, SB_BUTTON_BEVEL_X,
267 R->scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH,
268 scrollbar_len);
269 rxvt_drawBevel(aR_ R->scrollBar.win, SB_BUTTON_BEVEL_X,
270 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH,
271 SB_BUTTON_HEIGHT);
272 rxvt_drawBevel(aR_ R->scrollBar.win, SB_BUTTON_BEVEL_X,
273 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH,
274 SB_BUTTON_HEIGHT);
275
276 s = (scrollbar_isUp()) ? R->upArrowHi : R->upArrow;
277 XCopyArea(R->Xdisplay, s, R->scrollBar.win, R->whiteGC, 0, 0,
278 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
279 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
280
281 s = (scrollbar_isDn()) ? R->downArrowHi : R->downArrow;
282 XCopyArea(R->Xdisplay, s, R->scrollBar.win, R->whiteGC, 0, 0,
283 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
284 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
285 }
286 return 1;
287 }
288 #endif /* NEXT_SCROLLBAR */
289 /*----------------------- end-of-file (C source) -----------------------*/