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

# 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     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 pcg 1.5 rxvt_term::renderPixmap (const char *const *data, int width, int height)
115 pcg 1.1 {
116     char a;
117     int x, y;
118     Pixmap d;
119     GC pointcolour;
120    
121 pcg 1.5 d = XCreatePixmap(Xdisplay, scrollBar.win, width, height, XDEPTH);
122 pcg 1.1
123     for (y = 0; y < height; y++) {
124     for (x = 0; x < width; x++) {
125     if ((a = data[y][x]) == ' ' || a == 'w')
126 pcg 1.5 pointcolour = whiteGC;
127 pcg 1.1 else if (a == '.' || a == 'l')
128 pcg 1.5 pointcolour = grayGC;
129 pcg 1.1 else if (a == '%' || a == 'd')
130 pcg 1.5 pointcolour = darkGC;
131 pcg 1.1 else /* if (a == '#' || a == 'b' || a) */
132 pcg 1.5 pointcolour = blackGC;
133     XDrawPoint(Xdisplay, d, pointcolour, x, y);
134 pcg 1.1 }
135     }
136     return d;
137     }
138    
139     void
140 pcg 1.5 rxvt_term::init_scrollbar_stuff ()
141 pcg 1.1 {
142     XGCValues gcvalue;
143     XColor xcol;
144     Pixmap stipple;
145     unsigned long light, dark;
146    
147     gcvalue.graphics_exposures = False;
148    
149 pcg 1.5 gcvalue.foreground = PixColors[Color_Black];
150     blackGC = XCreateGC(Xdisplay, scrollBar.win,
151 pcg 1.1 GCForeground | GCGraphicsExposures, &gcvalue);
152    
153 pcg 1.5 gcvalue.foreground = PixColors[Color_White];
154     whiteGC = XCreateGC(Xdisplay, scrollBar.win,
155 pcg 1.1 GCForeground | GCGraphicsExposures, &gcvalue);
156    
157     xcol.red = 0xaeba;
158     xcol.green = 0xaaaa;
159     xcol.blue = 0xaeba;
160 pcg 1.5 //if (!rXAllocColor (&xcol, "light gray"))//TODO//D//
161     xcol.pixel = PixColors[Color_AntiqueWhite];
162 pcg 1.1 light = gcvalue.foreground = xcol.pixel;
163 pcg 1.5 grayGC = XCreateGC(Xdisplay, scrollBar.win,
164 pcg 1.1 GCForeground | GCGraphicsExposures, &gcvalue);
165    
166     xcol.red = 0x51aa;
167     xcol.green = 0x5555;
168     xcol.blue = 0x5144;
169 pcg 1.5 //if (!rXAllocColor (&xcol, "dark gray"))//TODO//D//
170     xcol.pixel = PixColors[Color_Grey25];
171 pcg 1.1 dark = gcvalue.foreground = xcol.pixel;
172 pcg 1.5 darkGC = XCreateGC(Xdisplay, scrollBar.win,
173 pcg 1.1 GCForeground | GCGraphicsExposures, &gcvalue);
174    
175 pcg 1.5 stipple = XCreateBitmapFromData(Xdisplay, scrollBar.win,
176 pcg 1.1 (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 pcg 1.5 /* XSetWindowBackground(Xdisplay, scrollBar.win, PixColors[Color_Red]); */
185 pcg 1.1
186 pcg 1.5 stippleGC = XCreateGC(Xdisplay, scrollBar.win,
187 pcg 1.1 GCForeground | GCBackground | GCStipple
188     | GCFillStyle | GCGraphicsExposures, &gcvalue);
189    
190 pcg 1.5 dimple = renderPixmap (SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
191 pcg 1.1 SCROLLER_DIMPLE_HEIGHT);
192    
193 pcg 1.5 upArrow = renderPixmap (SCROLLER_ARROW_UP, ARROW_WIDTH,
194 pcg 1.1 ARROW_HEIGHT);
195 pcg 1.5 downArrow = renderPixmap (SCROLLER_ARROW_DOWN, ARROW_WIDTH,
196 pcg 1.1 ARROW_HEIGHT);
197 pcg 1.5 upArrowHi = renderPixmap (HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
198 pcg 1.1 ARROW_HEIGHT);
199 pcg 1.5 downArrowHi = renderPixmap (HI_SCROLLER_ARROW_DOWN,
200 pcg 1.1 ARROW_WIDTH, ARROW_HEIGHT);
201     }
202    
203     /* Draw bevel & arrows */
204     void
205 pcg 1.5 rxvt_term::drawBevel (Drawable d, int x1, int y1, int w, int h)
206 pcg 1.1 {
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 pcg 1.5 XDrawLine(Xdisplay, d, whiteGC, x1, y1, x2, y1);
213     XDrawLine(Xdisplay, d, whiteGC, x1, y1, x1, y2);
214 pcg 1.1 /* black bottom and right */
215 pcg 1.5 XDrawLine(Xdisplay, d, blackGC, x1, y2, x2, y2);
216     XDrawLine(Xdisplay, d, blackGC, x2, y1, x2, y2);
217 pcg 1.1 /* dark inside bottom and right */
218     x1++, y1++, x2--, y2--; /* move in one point */
219 pcg 1.5 XDrawLine(Xdisplay, d, darkGC, x1, y2, x2, y2);
220     XDrawLine(Xdisplay, d, darkGC, x2, y1, x2, y2);
221 pcg 1.1 }
222    
223     int
224 pcg 1.5 rxvt_term::scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len)
225 pcg 1.1 {
226 pcg 1.5 int height = scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
227 pcg 1.1 Drawable s;
228    
229 pcg 1.5 if ((scrollBar.init & R_SB_NEXT) == 0) {
230     scrollBar.init |= R_SB_NEXT;
231     init_scrollbar_stuff ();
232 pcg 1.1 }
233    
234 pcg 1.5 if (TermWin.nscrolled == 0 || !update) {
235     XFillRectangle(Xdisplay, scrollBar.win, grayGC, 0, 0,
236 pcg 1.1 SB_WIDTH_NEXT + 1, height);
237 pcg 1.5 XDrawRectangle(Xdisplay, scrollBar.win, blackGC, 0,
238 pcg 1.1 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
239     height + SB_BORDER_WIDTH);
240 pcg 1.5 XFillRectangle(Xdisplay, scrollBar.win, stippleGC,
241 pcg 1.1 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height);
242     }
243 pcg 1.5 if (TermWin.nscrolled) {
244     if (last_top < scrollBar.top || !update)
245     XFillRectangle(Xdisplay, scrollBar.win, stippleGC,
246 pcg 1.1 SB_LEFT_PADDING, SB_PADDING + last_top,
247 pcg 1.5 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 pcg 1.1 SB_BUTTON_WIDTH, scrollbar_len);
255 pcg 1.5 XCopyArea(Xdisplay, dimple, scrollBar.win, whiteGC, 0, 0,
256 pcg 1.1 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT,
257     (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2,
258 pcg 1.5 scrollBar.top + SB_BEVEL_WIDTH_UPPER_LEFT +
259 pcg 1.1 (scrollbar_len - SCROLLER_DIMPLE_HEIGHT) / 2);
260    
261 pcg 1.5 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
262     scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH,
263 pcg 1.1 scrollbar_len);
264 pcg 1.5 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
265 pcg 1.1 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH,
266     SB_BUTTON_HEIGHT);
267 pcg 1.5 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
268 pcg 1.1 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH,
269     SB_BUTTON_HEIGHT);
270    
271 pcg 1.5 s = (scrollbar_isUp()) ? upArrowHi : upArrow;
272     XCopyArea(Xdisplay, s, scrollBar.win, whiteGC, 0, 0,
273 pcg 1.1 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
274     height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
275    
276 pcg 1.5 s = (scrollbar_isDn()) ? downArrowHi : downArrow;
277     XCopyArea(Xdisplay, s, scrollBar.win, whiteGC, 0, 0,
278 pcg 1.1 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) -----------------------*/