ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-next.C
Revision: 1.9
Committed: Fri Feb 13 12:16:21 2004 UTC (20 years, 3 months ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_1_0, rel-2_7, rel-2_4, rel-2_5, rel-2_2, rel-2_3, rel-2_0, rel-1_9
Changes since 1.8: +26 -26 lines
Log Message:
*** empty log message ***

File Contents

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