ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-next.C
Revision: 1.3
Committed: Tue Nov 25 11:52:42 2003 UTC (20 years, 6 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +32 -32 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*--------------------------------*-C-*---------------------------------*
2     * File: scrollbar-next.c
3     *----------------------------------------------------------------------*
4 pcg 1.3 * $Id: scrollbar-next.C,v 1.2 2003/11/24 17:31:28 pcg Exp $
5 pcg 1.1 *
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 pcg 1.3 pointcolour = R->whiteGC;
129 pcg 1.1 else if (a == '.' || a == 'l')
130 pcg 1.3 pointcolour = R->grayGC;
131 pcg 1.1 else if (a == '%' || a == 'd')
132 pcg 1.3 pointcolour = R->darkGC;
133 pcg 1.1 else /* if (a == '#' || a == 'b' || a) */
134 pcg 1.3 pointcolour = R->blackGC;
135 pcg 1.1 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 pcg 1.3 R->blackGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
154 pcg 1.1 GCForeground | GCGraphicsExposures, &gcvalue);
155    
156     gcvalue.foreground = R->PixColors[Color_White];
157 pcg 1.3 R->whiteGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
158 pcg 1.1 GCForeground | GCGraphicsExposures, &gcvalue);
159    
160     xcol.red = 0xaeba;
161     xcol.green = 0xaaaa;
162     xcol.blue = 0xaeba;
163     if (!rxvt_rXAllocColor(aR_ &xcol, "light gray"))
164     xcol.pixel = R->PixColors[Color_AntiqueWhite];
165     light = gcvalue.foreground = xcol.pixel;
166 pcg 1.3 R->grayGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
167 pcg 1.1 GCForeground | GCGraphicsExposures, &gcvalue);
168    
169     xcol.red = 0x51aa;
170     xcol.green = 0x5555;
171     xcol.blue = 0x5144;
172     if (!rxvt_rXAllocColor(aR_ &xcol, "dark gray"))
173     xcol.pixel = R->PixColors[Color_Grey25];
174     dark = gcvalue.foreground = xcol.pixel;
175 pcg 1.3 R->darkGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
176 pcg 1.1 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 pcg 1.3 R->stippleGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
190 pcg 1.1 GCForeground | GCBackground | GCStipple
191     | GCFillStyle | GCGraphicsExposures, &gcvalue);
192    
193 pcg 1.3 R->dimple = rxvt_renderPixmap(aR_ SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
194 pcg 1.1 SCROLLER_DIMPLE_HEIGHT);
195    
196 pcg 1.3 R->upArrow = rxvt_renderPixmap(aR_ SCROLLER_ARROW_UP, ARROW_WIDTH,
197 pcg 1.1 ARROW_HEIGHT);
198 pcg 1.3 R->downArrow = rxvt_renderPixmap(aR_ SCROLLER_ARROW_DOWN, ARROW_WIDTH,
199 pcg 1.1 ARROW_HEIGHT);
200 pcg 1.3 R->upArrowHi = rxvt_renderPixmap(aR_ HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
201 pcg 1.1 ARROW_HEIGHT);
202 pcg 1.3 R->downArrowHi = rxvt_renderPixmap(aR_ HI_SCROLLER_ARROW_DOWN,
203 pcg 1.1 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 pcg 1.3 XDrawLine(R->Xdisplay, d, R->whiteGC, x1, y1, x2, y1);
217     XDrawLine(R->Xdisplay, d, R->whiteGC, x1, y1, x1, y2);
218 pcg 1.1 /* black bottom and right */
219 pcg 1.3 XDrawLine(R->Xdisplay, d, R->blackGC, x1, y2, x2, y2);
220     XDrawLine(R->Xdisplay, d, R->blackGC, x2, y1, x2, y2);
221 pcg 1.1 /* dark inside bottom and right */
222     x1++, y1++, x2--, y2--; /* move in one point */
223 pcg 1.3 XDrawLine(R->Xdisplay, d, R->darkGC, x1, y2, x2, y2);
224     XDrawLine(R->Xdisplay, d, R->darkGC, x2, y1, x2, y2);
225 pcg 1.1 }
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 pcg 1.3 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->grayGC, 0, 0,
241 pcg 1.1 SB_WIDTH_NEXT + 1, height);
242 pcg 1.3 XDrawRectangle(R->Xdisplay, R->scrollBar.win, R->blackGC, 0,
243 pcg 1.1 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
244     height + SB_BORDER_WIDTH);
245 pcg 1.3 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC,
246 pcg 1.1 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height);
247     }
248     if (R->TermWin.nscrolled) {
249     if (last_top < R->scrollBar.top || !update)
250 pcg 1.3 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC,
251 pcg 1.1 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 pcg 1.3 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC,
255 pcg 1.1 SB_LEFT_PADDING, R->scrollBar.bot + SB_PADDING,
256     SB_BUTTON_WIDTH, (last_bot - R->scrollBar.bot));
257 pcg 1.3 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->grayGC,
258 pcg 1.1 SB_LEFT_PADDING, R->scrollBar.top + SB_PADDING,
259     SB_BUTTON_WIDTH, scrollbar_len);
260 pcg 1.3 XCopyArea(R->Xdisplay, R->dimple, R->scrollBar.win, R->whiteGC, 0, 0,
261 pcg 1.1 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 pcg 1.3 s = (scrollbar_isUp()) ? R->upArrowHi : R->upArrow;
277     XCopyArea(R->Xdisplay, s, R->scrollBar.win, R->whiteGC, 0, 0,
278 pcg 1.1 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
279     height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
280    
281 pcg 1.3 s = (scrollbar_isDn()) ? R->downArrowHi : R->downArrow;
282     XCopyArea(R->Xdisplay, s, R->scrollBar.win, R->whiteGC, 0, 0,
283 pcg 1.1 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) -----------------------*/