ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-next.C
Revision: 1.35
Committed: Fri May 30 19:44:11 2014 UTC (9 years, 11 months ago) by sf-exg
Content type: text/plain
Branch: MAIN
CVS Tags: rxvt-unicode-rel-9_29, rxvt-unicode-rel-9_26, rxvt-unicode-rel-9_25, rxvt-unicode-rel-9_22, rxvt-unicode-rel-9_21, rxvt-unicode-rel-9_30, HEAD
Changes since 1.34: +13 -2 lines
Log Message:
Fix height and position of the stippled area in next scrollbar, patch by totto.

File Contents

# Content
1 /*----------------------------------------------------------------------*
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 * Copyright (c) 2004-2006 Marc Lehmann <schmorp@schmorp.de>
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 3 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
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 };
53 const char *const SCROLLER_ARROW_UP[] =
54 {
55 ".............",
56 ".............",
57 "......%......",
58 "......#......",
59 ".....%#%.....",
60 ".....###.....",
61 "....%###%....",
62 "....#####....",
63 "...%#####%...",
64 "...#######...",
65 "..%#######%..",
66 ".............",
67 "............."
68 };
69 const char *const SCROLLER_ARROW_DOWN[] =
70 {
71 ".............",
72 ".............",
73 "..%#######%..",
74 "...#######...",
75 "...%#####%...",
76 "....#####....",
77 "....%###%....",
78 ".....###.....",
79 ".....%#%.....",
80 "......#......",
81 "......%......",
82 ".............",
83 "............."
84 };
85 const char *const HI_SCROLLER_ARROW_UP[] =
86 {
87 " ",
88 " ",
89 " % ",
90 " % ",
91 " %%% ",
92 " %%% ",
93 " %%%%% ",
94 " %%%%% ",
95 " %%%%%%% ",
96 " %%%%%%% ",
97 " %%%%%%%%% ",
98 " ",
99 " "
100 };
101 const char *const HI_SCROLLER_ARROW_DOWN[] =
102 {
103 " ",
104 " ",
105 " %%%%%%%%% ",
106 " %%%%%%% ",
107 " %%%%%%% ",
108 " %%%%% ",
109 " %%%%% ",
110 " %%% ",
111 " %%% ",
112 " % ",
113 " % ",
114 " ",
115 " "
116 };
117
118 static Pixmap
119 renderPixmap (scrollBar_t *sb, const char *const *data, int width, int height)
120 {
121 char a;
122 int x, y;
123 Pixmap d;
124 GC pointcolour;
125
126 d = XCreatePixmap (sb->term->dpy, sb->win, width, height, sb->term->depth);
127
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 = sb->whiteGC;
134 else if (a == '.' || a == 'l')
135 pointcolour = sb->grayGC;
136 else if (a == '%' || a == 'd')
137 pointcolour = sb->darkGC;
138 else /* if (a == '#' || a == 'b' || a) */
139 pointcolour = sb->blackGC;
140
141 XDrawPoint (sb->term->dpy, d, pointcolour, x, y);
142 }
143 }
144 return d;
145 }
146
147 void
148 scrollBar_t::init_next ()
149 {
150 XGCValues gcvalue;
151 rxvt_color color;
152 Pixmap stipple;
153 unsigned long light, dark;
154
155 gcvalue.graphics_exposures = False;
156
157 gcvalue.foreground = term->pix_colors_focused[Color_Black];
158 blackGC = XCreateGC (term->dpy, win,
159 GCForeground | GCGraphicsExposures, &gcvalue);
160
161 gcvalue.foreground = term->pix_colors_focused[Color_White];
162 whiteGC = XCreateGC (term->dpy, win,
163 GCForeground | GCGraphicsExposures, &gcvalue);
164
165 light = term->pix_colors_focused[Color_scroll];
166 #if 0
167 //color used by rxvt
168 if (color.set (term, rgba (0xaeba, 0xaaaa, 0xaeba)))
169 light = color;
170 #endif
171 gcvalue.foreground = light;
172 grayGC = XCreateGC (term->dpy, win,
173 GCForeground | GCGraphicsExposures, &gcvalue);
174
175 dark = term->pix_colors_focused[Color_Grey25];
176 #if 0
177 //color used by rxvt
178 if (color.set (term, rgba (0x51aa, 0x5555, 0x5144)))
179 dark = color;
180 #endif
181 gcvalue.foreground = dark;
182 darkGC = XCreateGC (term->dpy, win,
183 GCForeground | GCGraphicsExposures, &gcvalue);
184
185 stipple = XCreateBitmapFromData (term->dpy, win,
186 (char *)n_stp_bits, n_stp_width,
187 n_stp_height);
188
189 gcvalue.foreground = dark;
190 gcvalue.background = light;
191 gcvalue.fill_style = FillOpaqueStippled;
192 gcvalue.stipple = stipple;
193
194 stippleGC = XCreateGC (term->dpy, win,
195 GCForeground | GCBackground | GCStipple
196 | GCFillStyle | GCGraphicsExposures, &gcvalue);
197
198 dimple = renderPixmap (this, SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
199 SCROLLER_DIMPLE_HEIGHT);
200
201 upArrow = renderPixmap (this, SCROLLER_ARROW_UP, ARROW_WIDTH,
202 ARROW_HEIGHT);
203 downArrow = renderPixmap (this, SCROLLER_ARROW_DOWN, ARROW_WIDTH,
204 ARROW_HEIGHT);
205 upArrowHi = renderPixmap (this, HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
206 ARROW_HEIGHT);
207 downArrowHi = renderPixmap (this, HI_SCROLLER_ARROW_DOWN,
208 ARROW_WIDTH, ARROW_HEIGHT);
209 }
210
211 /* Draw bevel & arrows */
212 static void
213 drawBevel (scrollBar_t *sb, int x1, int y1, int w, int h)
214 {
215 int x2, y2;
216 Drawable d = sb->win;
217 Display *dpy = sb->term->dpy;
218
219 x2 = x1 + w - 1; /* right point */
220 y2 = y1 + h - 1; /* bottom point */
221 /* white top and left */
222 XDrawLine (dpy, d, sb->whiteGC, x1, y1, x2, y1);
223 XDrawLine (dpy, d, sb->whiteGC, x1, y1, x1, y2);
224 /* black bottom and right */
225 XDrawLine (dpy, d, sb->blackGC, x1, y2, x2, y2);
226 XDrawLine (dpy, d, sb->blackGC, x2, y1, x2, y2);
227 /* dark inside bottom and right */
228 x1++, y1++, x2--, y2--; /* move in one point */
229 XDrawLine (dpy, d, sb->darkGC, x1, y2, x2, y2);
230 XDrawLine (dpy, d, sb->darkGC, x2, y1, x2, y2);
231 }
232
233 int
234 scrollBar_t::show_next (int update)
235 {
236 int height = end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
237 Drawable src;
238
239 if ((init & SB_STYLE_NEXT) == 0)
240 {
241 init |= SB_STYLE_NEXT;
242 init_next ();
243 last_has_sb = false;
244 }
245
246 bool has_sb = term->top_row;
247 int stipple_height = height - SB_PADDING;
248
249 if (has_sb)
250 stipple_height -= SB_BUTTON_TOTAL_HEIGHT;
251 else
252 stipple_height -= SB_PADDING;
253
254 if (has_sb != last_has_sb || !update)
255 {
256 last_has_sb = has_sb;
257 XFillRectangle (term->dpy, win, grayGC, 0, 0,
258 SB_WIDTH_NEXT + 1, height);
259 XDrawRectangle (term->dpy, win, blackGC, 0,
260 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
261 height + SB_BORDER_WIDTH);
262 XFillRectangle (term->dpy, win, stippleGC,
263 SB_LEFT_PADDING, SB_PADDING,
264 SB_BUTTON_WIDTH, stipple_height);
265 }
266
267 if (term->top_row)
268 {
269 if (last_top < top || !update)
270 XFillRectangle (term->dpy, win, stippleGC,
271 SB_LEFT_PADDING, SB_PADDING + last_top,
272 SB_BUTTON_WIDTH, top - last_top);
273
274 if (bot < last_bot || !update)
275 XFillRectangle (term->dpy, win, stippleGC,
276 SB_LEFT_PADDING, bot + SB_PADDING,
277 SB_BUTTON_WIDTH, (last_bot - bot));
278
279 XFillRectangle (term->dpy, win, grayGC,
280 SB_LEFT_PADDING, top + SB_PADDING,
281 SB_BUTTON_WIDTH, bot - top);
282
283 XCopyArea (term->dpy, dimple, win, whiteGC, 0, 0,
284 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT,
285 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2,
286 top + SB_BEVEL_WIDTH_UPPER_LEFT +
287 (bot - top - SCROLLER_DIMPLE_HEIGHT) / 2);
288
289 drawBevel (this, SB_BUTTON_BEVEL_X,
290 top + SB_PADDING, SB_BUTTON_WIDTH,
291 bot - top);
292 drawBevel (this, SB_BUTTON_BEVEL_X,
293 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH,
294 SB_BUTTON_HEIGHT);
295 drawBevel (this, SB_BUTTON_BEVEL_X,
296 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH,
297 SB_BUTTON_HEIGHT);
298
299 src = state == SB_STATE_UP ? upArrowHi : upArrow;
300 XCopyArea (term->dpy, src, win, whiteGC, 0, 0,
301 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
302 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
303
304 src = state == SB_STATE_DOWN ? downArrowHi : downArrow;
305 XCopyArea (term->dpy, src, win, whiteGC, 0, 0,
306 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
307 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
308 }
309
310 return 1;
311 }
312 #endif /* NEXT_SCROLLBAR */
313 /*----------------------- end-of-file (C source) -----------------------*/