ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-next.C
Revision: 1.11
Committed: Sat Jul 31 15:32:50 2004 UTC (19 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-3_6, rel-3_5, rel-3_4
Changes since 1.10: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*--------------------------------*-C-*---------------------------------*
2 pcg 1.10 * File: scrollbar-next.C
3 pcg 1.1 *----------------------------------------------------------------------*
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 pcg 1.10 * Copyright (c) 2004 Marc Lehmann <pcg@goof.com>
10 pcg 1.1 *
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 pcg 1.7 const char *const SCROLLER_DIMPLE[] =
46     {
47 pcg 1.1 ".%###.",
48     "%#%%%%",
49     "#%%...",
50     "#%.. ",
51     "#%. ",
52     ".%. ."
53 pcg 1.7 };
54     const char *const SCROLLER_ARROW_UP[] =
55     {
56 pcg 1.1 ".............",
57     ".............",
58     "......%......",
59     "......#......",
60     ".....%#%.....",
61     ".....###.....",
62     "....%###%....",
63     "....#####....",
64     "...%#####%...",
65     "...#######...",
66     "..%#######%..",
67     ".............",
68     "............."
69 pcg 1.7 };
70     const char *const SCROLLER_ARROW_DOWN[] =
71     {
72 pcg 1.1 ".............",
73     ".............",
74     "..%#######%..",
75     "...#######...",
76     "...%#####%...",
77     "....#####....",
78     "....%###%....",
79     ".....###.....",
80     ".....%#%.....",
81     "......#......",
82     "......%......",
83     ".............",
84     "............."
85 pcg 1.7 };
86     const char *const HI_SCROLLER_ARROW_UP[] =
87     {
88 pcg 1.1 " ",
89     " ",
90     " % ",
91     " % ",
92     " %%% ",
93     " %%% ",
94     " %%%%% ",
95     " %%%%% ",
96     " %%%%%%% ",
97     " %%%%%%% ",
98     " %%%%%%%%% ",
99     " ",
100     " "
101 pcg 1.7 };
102     const char *const HI_SCROLLER_ARROW_DOWN[] =
103     {
104 pcg 1.1 " ",
105     " ",
106     " %%%%%%%%% ",
107     " %%%%%%% ",
108     " %%%%%%% ",
109     " %%%%% ",
110     " %%%%% ",
111     " %%% ",
112     " %%% ",
113     " % ",
114     " % ",
115     " ",
116     " "
117 pcg 1.7 };
118 pcg 1.1
119     Pixmap
120 pcg 1.5 rxvt_term::renderPixmap (const char *const *data, int width, int height)
121 pcg 1.1 {
122 pcg 1.7 char a;
123     int x, y;
124     Pixmap d;
125     GC pointcolour;
126    
127 root 1.11 d = XCreatePixmap (display->display, scrollBar.win, width, height, display->depth);
128 pcg 1.7
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 pcg 1.9 XDrawPoint (display->display, d, pointcolour, x, y);
142 pcg 1.7 }
143 pcg 1.1 }
144 pcg 1.7 return d;
145 pcg 1.1 }
146    
147     void
148 pcg 1.5 rxvt_term::init_scrollbar_stuff ()
149 pcg 1.1 {
150 pcg 1.7 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 pcg 1.9 blackGC = XCreateGC (display->display, scrollBar.win,
159 pcg 1.7 GCForeground | GCGraphicsExposures, &gcvalue);
160    
161     gcvalue.foreground = PixColors[Color_White];
162 pcg 1.9 whiteGC = XCreateGC (display->display, scrollBar.win,
163 pcg 1.7 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 pcg 1.9 grayGC = XCreateGC (display->display, scrollBar.win,
172 pcg 1.7 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 pcg 1.9 darkGC = XCreateGC (display->display, scrollBar.win,
181 pcg 1.7 GCForeground | GCGraphicsExposures, &gcvalue);
182    
183 pcg 1.9 stipple = XCreateBitmapFromData (display->display, scrollBar.win,
184 pcg 1.7 (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 pcg 1.9 /* XSetWindowBackground (display->display, scrollBar.win, PixColors[Color_Red]); */
193 pcg 1.7
194 pcg 1.9 stippleGC = XCreateGC (display->display, scrollBar.win,
195 pcg 1.7 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 pcg 1.1 }
210    
211     /* Draw bevel & arrows */
212     void
213 pcg 1.5 rxvt_term::drawBevel (Drawable d, int x1, int y1, int w, int h)
214 pcg 1.1 {
215 pcg 1.7 int x2, y2;
216 pcg 1.1
217 pcg 1.7 x2 = x1 + w - 1; /* right point */
218     y2 = y1 + h - 1; /* bottom point */
219     /* white top and left */
220 pcg 1.9 XDrawLine (display->display, d, whiteGC, x1, y1, x2, y1);
221     XDrawLine (display->display, d, whiteGC, x1, y1, x1, y2);
222 pcg 1.7 /* black bottom and right */
223 pcg 1.9 XDrawLine (display->display, d, blackGC, x1, y2, x2, y2);
224     XDrawLine (display->display, d, blackGC, x2, y1, x2, y2);
225 pcg 1.7 /* dark inside bottom and right */
226     x1++, y1++, x2--, y2--; /* move in one point */
227 pcg 1.9 XDrawLine (display->display, d, darkGC, x1, y2, x2, y2);
228     XDrawLine (display->display, d, darkGC, x2, y1, x2, y2);
229 pcg 1.1 }
230    
231     int
232 pcg 1.5 rxvt_term::scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len)
233 pcg 1.1 {
234 pcg 1.7 int height = scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
235     Drawable s;
236 pcg 1.1
237 pcg 1.7 if ((scrollBar.init & R_SB_NEXT) == 0)
238     {
239     scrollBar.init |= R_SB_NEXT;
240     init_scrollbar_stuff ();
241 pcg 1.1 }
242    
243 pcg 1.7 if (TermWin.nscrolled == 0 || !update)
244     {
245 pcg 1.9 XFillRectangle (display->display, scrollBar.win, grayGC, 0, 0,
246 pcg 1.7 SB_WIDTH_NEXT + 1, height);
247 pcg 1.9 XDrawRectangle (display->display, scrollBar.win, blackGC, 0,
248 pcg 1.7 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
249     height + SB_BORDER_WIDTH);
250 pcg 1.9 XFillRectangle (display->display, scrollBar.win, stippleGC,
251 pcg 1.7 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height);
252 pcg 1.1 }
253 pcg 1.7 if (TermWin.nscrolled)
254     {
255     if (last_top < scrollBar.top || !update)
256 pcg 1.9 XFillRectangle (display->display, scrollBar.win, stippleGC,
257 pcg 1.7 SB_LEFT_PADDING, SB_PADDING + last_top,
258     SB_BUTTON_WIDTH, scrollBar.top - last_top);
259     if (scrollBar.bot < last_bot || !update)
260 pcg 1.9 XFillRectangle (display->display, scrollBar.win, stippleGC,
261 pcg 1.7 SB_LEFT_PADDING, scrollBar.bot + SB_PADDING,
262     SB_BUTTON_WIDTH, (last_bot - scrollBar.bot));
263 pcg 1.9 XFillRectangle (display->display, scrollBar.win, grayGC,
264 pcg 1.7 SB_LEFT_PADDING, scrollBar.top + SB_PADDING,
265     SB_BUTTON_WIDTH, scrollbar_len);
266 pcg 1.9 XCopyArea (display->display, dimple, scrollBar.win, whiteGC, 0, 0,
267 pcg 1.7 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 pcg 1.9 s = (scrollbar_isUp ()) ? upArrowHi : upArrow;
283     XCopyArea (display->display, s, scrollBar.win, whiteGC, 0, 0,
284 pcg 1.7 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
285     height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
286    
287 pcg 1.9 s = (scrollbar_isDn ()) ? downArrowHi : downArrow;
288     XCopyArea (display->display, s, scrollBar.win, whiteGC, 0, 0,
289 pcg 1.7 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
290     height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
291 pcg 1.1 }
292 pcg 1.7 return 1;
293 pcg 1.1 }
294     #endif /* NEXT_SCROLLBAR */
295     /*----------------------- end-of-file (C source) -----------------------*/