1 /*--------------------------------*-C-*---------------------------------*
2 * File: scrollbar-next.C
3 *----------------------------------------------------------------------*
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 Marc Lehmann <pcg@goof.com>
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.
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.
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 *----------------------------------------------------------------------*/
26 #include "../config.h" /* NECESSARY */
27 #include "rxvt.h" /* NECESSARY */
29 /*----------------------------------------------------------------------*/
30 #if defined(NEXT_SCROLLBAR)
33 #define n_stp_height 2
34 const unsigned char n_stp_bits[] = { 0x55, 0xaa };
37 * N*XTSTEP like scrollbar - written by Alfredo K. Kojima
39 #define SCROLLER_DIMPLE_WIDTH 6
40 #define SCROLLER_DIMPLE_HEIGHT 6
41 #define ARROW_WIDTH 13
42 #define ARROW_HEIGHT 13
44 const char *const SCROLLER_DIMPLE[] =
53 const char *const SCROLLER_ARROW_UP[] =
69 const char *const SCROLLER_ARROW_DOWN[] =
85 const char *const HI_SCROLLER_ARROW_UP[] =
101 const char *const HI_SCROLLER_ARROW_DOWN[] =
119 rxvt_term::renderPixmap (const char *const *data, int width, int height)
126 d = XCreatePixmap (display->display, scrollBar.win, width, height, display->depth);
128 for (y = 0; y < height; y++)
130 for (x = 0; x < width; x++)
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;
141 XDrawPoint (display->display, d, pointcolour, x, y);
148 rxvt_term::init_scrollbar_stuff ()
153 unsigned long light, dark;
156 gcvalue.graphics_exposures = False;
158 gcvalue.foreground = pix_colors_focused[Color_Black];
159 blackGC = XCreateGC (disp, scrollBar.win,
160 GCForeground | GCGraphicsExposures, &gcvalue);
162 gcvalue.foreground = pix_colors_focused[Color_White];
163 whiteGC = XCreateGC (disp, scrollBar.win,
164 GCForeground | GCGraphicsExposures, &gcvalue);
169 xcol.pixel = pix_colors_focused[Color_scroll];
170 light = gcvalue.foreground = xcol.pixel;
171 grayGC = XCreateGC (disp, scrollBar.win,
172 GCForeground | GCGraphicsExposures, &gcvalue);
177 //if (!rXAllocColor (&xcol, "dark gray"))//TODO//D//
178 xcol.pixel = pix_colors_focused[Color_Grey25];
179 dark = gcvalue.foreground = xcol.pixel;
180 darkGC = XCreateGC (disp, scrollBar.win,
181 GCForeground | GCGraphicsExposures, &gcvalue);
183 stipple = XCreateBitmapFromData (disp, scrollBar.win,
184 (char *)n_stp_bits, n_stp_width,
187 gcvalue.foreground = dark;
188 gcvalue.background = light;
189 gcvalue.fill_style = FillOpaqueStippled;
190 gcvalue.stipple = stipple;
192 /* XSetWindowBackground (disp, scrollBar.win, pix_colors_focused[Color_Red]); */
194 stippleGC = XCreateGC (disp, scrollBar.win,
195 GCForeground | GCBackground | GCStipple
196 | GCFillStyle | GCGraphicsExposures, &gcvalue);
198 dimple = renderPixmap (SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
199 SCROLLER_DIMPLE_HEIGHT);
201 upArrow = renderPixmap (SCROLLER_ARROW_UP, ARROW_WIDTH,
203 downArrow = renderPixmap (SCROLLER_ARROW_DOWN, ARROW_WIDTH,
205 upArrowHi = renderPixmap (HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
207 downArrowHi = renderPixmap (HI_SCROLLER_ARROW_DOWN,
208 ARROW_WIDTH, ARROW_HEIGHT);
211 /* Draw bevel & arrows */
213 rxvt_term::drawBevel (Drawable d, int x1, int y1, int w, int h)
218 x2 = x1 + w - 1; /* right point */
219 y2 = y1 + h - 1; /* bottom point */
220 /* white top and left */
221 XDrawLine (disp, d, whiteGC, x1, y1, x2, y1);
222 XDrawLine (disp, d, whiteGC, x1, y1, x1, y2);
223 /* black bottom and right */
224 XDrawLine (disp, d, blackGC, x1, y2, x2, y2);
225 XDrawLine (disp, d, blackGC, x2, y1, x2, y2);
226 /* dark inside bottom and right */
227 x1++, y1++, x2--, y2--; /* move in one point */
228 XDrawLine (disp, d, darkGC, x1, y2, x2, y2);
229 XDrawLine (disp, d, darkGC, x2, y1, x2, y2);
233 rxvt_term::scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len)
235 int height = scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
239 if ((scrollBar.init & R_SB_NEXT) == 0)
241 scrollBar.init |= R_SB_NEXT;
242 init_scrollbar_stuff ();
245 if (TermWin.nscrolled == 0 || !update)
247 XFillRectangle (disp, scrollBar.win, grayGC, 0, 0,
248 SB_WIDTH_NEXT + 1, height);
249 XDrawRectangle (disp, scrollBar.win, blackGC, 0,
250 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
251 height + SB_BORDER_WIDTH);
252 XFillRectangle (disp, scrollBar.win, stippleGC,
253 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height);
256 if (TermWin.nscrolled)
258 if (last_top < scrollBar.top || !update)
259 XFillRectangle (disp, scrollBar.win, stippleGC,
260 SB_LEFT_PADDING, SB_PADDING + last_top,
261 SB_BUTTON_WIDTH, scrollBar.top - last_top);
263 if (scrollBar.bot < last_bot || !update)
264 XFillRectangle (disp, scrollBar.win, stippleGC,
265 SB_LEFT_PADDING, scrollBar.bot + SB_PADDING,
266 SB_BUTTON_WIDTH, (last_bot - scrollBar.bot));
268 XFillRectangle (disp, scrollBar.win, grayGC,
269 SB_LEFT_PADDING, scrollBar.top + SB_PADDING,
270 SB_BUTTON_WIDTH, scrollbar_len);
272 XCopyArea (disp, dimple, scrollBar.win, whiteGC, 0, 0,
273 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT,
274 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2,
275 scrollBar.top + SB_BEVEL_WIDTH_UPPER_LEFT +
276 (scrollbar_len - SCROLLER_DIMPLE_HEIGHT) / 2);
278 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
279 scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH,
281 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
282 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH,
284 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X,
285 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH,
288 s = (scrollbar_isUp ()) ? upArrowHi : upArrow;
289 XCopyArea (disp, s, scrollBar.win, whiteGC, 0, 0,
290 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
291 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
293 s = (scrollbar_isDn ()) ? downArrowHi : downArrow;
294 XCopyArea (disp, s, scrollBar.win, whiteGC, 0, 0,
295 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
296 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
301 #endif /* NEXT_SCROLLBAR */
302 /*----------------------- end-of-file (C source) -----------------------*/