ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/scrollbar-next.C
(Generate patch)

Comparing rxvt-unicode/src/scrollbar-next.C (file contents):
Revision 1.3 by pcg, Tue Nov 25 11:52:42 2003 UTC vs.
Revision 1.34 by sf-exg, Fri May 30 19:40:23 2014 UTC

1/*--------------------------------*-C-*---------------------------------* 1/*----------------------------------------------------------------------*
2 * File: scrollbar-next.c 2 * File: scrollbar-next.C
3 *----------------------------------------------------------------------* 3 *----------------------------------------------------------------------*
4 * $Id: scrollbar-next.C,v 1.3 2003/11/25 11:52:42 pcg Exp $
5 * 4 *
6 * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA> 5 * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA>
7 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org> 6 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org>
8 * - N*XTstep like scrollbars 7 * - N*XTstep like scrollbars
9 * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.com> 8 * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.com>
9 * Copyright (c) 2004-2006 Marc Lehmann <schmorp@schmorp.de>
10 * 10 *
11 * This program is free software; you can redistribute it and/or modify 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 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 13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version. 14 * (at your option) any later version.
15 * 15 *
16 * This program is distributed in the hope that it will be useful, 16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *----------------------------------------------------------------------*/ 24 *----------------------------------------------------------------------*/
25 25
26#include "../config.h" /* NECESSARY */ 26#include "../config.h" /* NECESSARY */
27#include "rxvt.h" /* NECESSARY */ 27#include "rxvt.h" /* NECESSARY */
28#include "scrollbar-next.intpro" /* PROTOS for internal routines */
29 28
30/*----------------------------------------------------------------------*/ 29/*----------------------------------------------------------------------*/
31#if defined(NEXT_SCROLLBAR) 30#if defined(NEXT_SCROLLBAR)
32 31
33#define n_stp_width 8 32#define n_stp_width 8
40#define SCROLLER_DIMPLE_WIDTH 6 39#define SCROLLER_DIMPLE_WIDTH 6
41#define SCROLLER_DIMPLE_HEIGHT 6 40#define SCROLLER_DIMPLE_HEIGHT 6
42#define ARROW_WIDTH 13 41#define ARROW_WIDTH 13
43#define ARROW_HEIGHT 13 42#define ARROW_HEIGHT 13
44 43
45const char *const SCROLLER_DIMPLE[] = { 44const char *const SCROLLER_DIMPLE[] =
45 {
46 ".%###.", 46 ".%###.",
47 "%#%%%%", 47 "%#%%%%",
48 "#%%...", 48 "#%%...",
49 "#%.. ", 49 "#%.. ",
50 "#%. ", 50 "#%. ",
51 ".%. ." 51 ".%. ."
52}; 52 };
53const char *const SCROLLER_ARROW_UP[] = { 53const char *const SCROLLER_ARROW_UP[] =
54 {
54 ".............", 55 ".............",
55 ".............", 56 ".............",
56 "......%......", 57 "......%......",
57 "......#......", 58 "......#......",
58 ".....%#%.....", 59 ".....%#%.....",
62 "...%#####%...", 63 "...%#####%...",
63 "...#######...", 64 "...#######...",
64 "..%#######%..", 65 "..%#######%..",
65 ".............", 66 ".............",
66 "............." 67 "............."
67}; 68 };
68const char *const SCROLLER_ARROW_DOWN[] = { 69const char *const SCROLLER_ARROW_DOWN[] =
70 {
69 ".............", 71 ".............",
70 ".............", 72 ".............",
71 "..%#######%..", 73 "..%#######%..",
72 "...#######...", 74 "...#######...",
73 "...%#####%...", 75 "...%#####%...",
77 ".....%#%.....", 79 ".....%#%.....",
78 "......#......", 80 "......#......",
79 "......%......", 81 "......%......",
80 ".............", 82 ".............",
81 "............." 83 "............."
82}; 84 };
83const char *const HI_SCROLLER_ARROW_UP[] = { 85const char *const HI_SCROLLER_ARROW_UP[] =
86 {
84 " ", 87 " ",
85 " ", 88 " ",
86 " % ", 89 " % ",
87 " % ", 90 " % ",
88 " %%% ", 91 " %%% ",
92 " %%%%%%% ", 95 " %%%%%%% ",
93 " %%%%%%% ", 96 " %%%%%%% ",
94 " %%%%%%%%% ", 97 " %%%%%%%%% ",
95 " ", 98 " ",
96 " " 99 " "
97}; 100 };
98const char *const HI_SCROLLER_ARROW_DOWN[] = { 101const char *const HI_SCROLLER_ARROW_DOWN[] =
102 {
99 " ", 103 " ",
100 " ", 104 " ",
101 " %%%%%%%%% ", 105 " %%%%%%%%% ",
102 " %%%%%%% ", 106 " %%%%%%% ",
103 " %%%%%%% ", 107 " %%%%%%% ",
107 " %%% ", 111 " %%% ",
108 " % ", 112 " % ",
109 " % ", 113 " % ",
110 " ", 114 " ",
111 " " 115 " "
112}; 116 };
113 117
114/* INTPROTO */ 118static Pixmap
115Pixmap
116rxvt_renderPixmap(pR_ const char *const *data, int width, int height) 119renderPixmap (scrollBar_t *sb, const char *const *data, int width, int height)
117{ 120{
118 char a; 121 char a;
119 int x, y; 122 int x, y;
120 Pixmap d; 123 Pixmap d;
121 GC pointcolour; 124 GC pointcolour;
122 125
123 d = XCreatePixmap(R->Xdisplay, R->scrollBar.win, width, height, XDEPTH); 126 d = XCreatePixmap (sb->term->dpy, sb->win, width, height, sb->term->depth);
124 127
125 for (y = 0; y < height; y++) { 128 for (y = 0; y < height; y++)
129 {
126 for (x = 0; x < width; x++) { 130 for (x = 0; x < width; x++)
131 {
127 if ((a = data[y][x]) == ' ' || a == 'w') 132 if ((a = data[y][x]) == ' ' || a == 'w')
128 pointcolour = R->whiteGC; 133 pointcolour = sb->whiteGC;
129 else if (a == '.' || a == 'l') 134 else if (a == '.' || a == 'l')
130 pointcolour = R->grayGC; 135 pointcolour = sb->grayGC;
131 else if (a == '%' || a == 'd') 136 else if (a == '%' || a == 'd')
132 pointcolour = R->darkGC; 137 pointcolour = sb->darkGC;
133 else /* if (a == '#' || a == 'b' || a) */ 138 else /* if (a == '#' || a == 'b' || a) */
134 pointcolour = R->blackGC; 139 pointcolour = sb->blackGC;
140
135 XDrawPoint(R->Xdisplay, d, pointcolour, x, y); 141 XDrawPoint (sb->term->dpy, d, pointcolour, x, y);
136 } 142 }
137 } 143 }
138 return d; 144 return d;
139} 145}
140 146
141/* INTPROTO */
142void 147void
143rxvt_init_scrollbar_stuff(pR) 148scrollBar_t::init_next ()
144{ 149{
145 XGCValues gcvalue; 150 XGCValues gcvalue;
146 XColor xcol; 151 rxvt_color color;
147 Pixmap stipple; 152 Pixmap stipple;
148 unsigned long light, dark; 153 unsigned long light, dark;
149 154
150 gcvalue.graphics_exposures = False; 155 gcvalue.graphics_exposures = False;
151 156
152 gcvalue.foreground = R->PixColors[Color_Black]; 157 gcvalue.foreground = term->pix_colors_focused[Color_Black];
153 R->blackGC = XCreateGC(R->Xdisplay, R->scrollBar.win, 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,
154 GCForeground | GCGraphicsExposures, &gcvalue); 173 GCForeground | GCGraphicsExposures, &gcvalue);
155 174
156 gcvalue.foreground = R->PixColors[Color_White]; 175 dark = term->pix_colors_focused[Color_Grey25];
157 R->whiteGC = XCreateGC(R->Xdisplay, R->scrollBar.win, 176#if 0
158 GCForeground | GCGraphicsExposures, &gcvalue); 177 //color used by rxvt
159 178 if (color.set (term, rgba (0x51aa, 0x5555, 0x5144)))
160 xcol.red = 0xaeba; 179 dark = color;
161 xcol.green = 0xaaaa; 180#endif
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 R->grayGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
167 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 R->darkGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
176 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; 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;
183 gcvalue.background = light; 190 gcvalue.background = light;
184 gcvalue.fill_style = FillOpaqueStippled; 191 gcvalue.fill_style = FillOpaqueStippled;
185 gcvalue.stipple = stipple; 192 gcvalue.stipple = stipple;
186 193
187/* XSetWindowBackground(R->Xdisplay, R->scrollBar.win, R->PixColors[Color_Red]); */ 194 stippleGC = XCreateGC (term->dpy, win,
188 195 GCForeground | GCBackground | GCStipple
189 R->stippleGC = XCreateGC(R->Xdisplay, R->scrollBar.win,
190 GCForeground | GCBackground | GCStipple
191 | GCFillStyle | GCGraphicsExposures, &gcvalue); 196 | GCFillStyle | GCGraphicsExposures, &gcvalue);
192 197
193 R->dimple = rxvt_renderPixmap(aR_ SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH, 198 dimple = renderPixmap (this, SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
194 SCROLLER_DIMPLE_HEIGHT); 199 SCROLLER_DIMPLE_HEIGHT);
195 200
196 R->upArrow = rxvt_renderPixmap(aR_ SCROLLER_ARROW_UP, ARROW_WIDTH, 201 upArrow = renderPixmap (this, SCROLLER_ARROW_UP, ARROW_WIDTH,
197 ARROW_HEIGHT); 202 ARROW_HEIGHT);
198 R->downArrow = rxvt_renderPixmap(aR_ SCROLLER_ARROW_DOWN, ARROW_WIDTH, 203 downArrow = renderPixmap (this, SCROLLER_ARROW_DOWN, ARROW_WIDTH,
199 ARROW_HEIGHT); 204 ARROW_HEIGHT);
200 R->upArrowHi = rxvt_renderPixmap(aR_ HI_SCROLLER_ARROW_UP, ARROW_WIDTH, 205 upArrowHi = renderPixmap (this, HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
201 ARROW_HEIGHT); 206 ARROW_HEIGHT);
202 R->downArrowHi = rxvt_renderPixmap(aR_ HI_SCROLLER_ARROW_DOWN, 207 downArrowHi = renderPixmap (this, HI_SCROLLER_ARROW_DOWN,
203 ARROW_WIDTH, ARROW_HEIGHT); 208 ARROW_WIDTH, ARROW_HEIGHT);
204} 209}
205 210
206/* Draw bevel & arrows */ 211/* Draw bevel & arrows */
207/* INTPROTO */ 212static void
208void 213drawBevel (scrollBar_t *sb, int x1, int y1, int w, int h)
209rxvt_drawBevel(pR_ Drawable d, int x1, int y1, int w, int h)
210{ 214{
211 int x2, y2; 215 int x2, y2;
216 Drawable d = sb->win;
217 Display *dpy = sb->term->dpy;
212 218
213 x2 = x1 + w - 1; /* right point */ 219 x2 = x1 + w - 1; /* right point */
214 y2 = y1 + h - 1; /* bottom point */ 220 y2 = y1 + h - 1; /* bottom point */
215/* white top and left */ 221 /* white top and left */
216 XDrawLine(R->Xdisplay, d, R->whiteGC, x1, y1, x2, y1); 222 XDrawLine (dpy, d, sb->whiteGC, x1, y1, x2, y1);
217 XDrawLine(R->Xdisplay, d, R->whiteGC, x1, y1, x1, y2); 223 XDrawLine (dpy, d, sb->whiteGC, x1, y1, x1, y2);
218/* black bottom and right */ 224 /* black bottom and right */
219 XDrawLine(R->Xdisplay, d, R->blackGC, x1, y2, x2, y2); 225 XDrawLine (dpy, d, sb->blackGC, x1, y2, x2, y2);
220 XDrawLine(R->Xdisplay, d, R->blackGC, x2, y1, x2, y2); 226 XDrawLine (dpy, d, sb->blackGC, x2, y1, x2, y2);
221/* dark inside bottom and right */ 227 /* dark inside bottom and right */
222 x1++, y1++, x2--, y2--; /* move in one point */ 228 x1++, y1++, x2--, y2--; /* move in one point */
223 XDrawLine(R->Xdisplay, d, R->darkGC, x1, y2, x2, y2); 229 XDrawLine (dpy, d, sb->darkGC, x1, y2, x2, y2);
224 XDrawLine(R->Xdisplay, d, R->darkGC, x2, y1, x2, y2); 230 XDrawLine (dpy, d, sb->darkGC, x2, y1, x2, y2);
225} 231}
226 232
227/* EXTPROTO */
228int 233int
229rxvt_scrollbar_show_next(pR_ int update, int last_top, int last_bot, int scrollbar_len) 234scrollBar_t::show_next (int update)
230{ 235{
231 int height = R->scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING; 236 int height = end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
232 Drawable s; 237 Drawable src;
233 238
234 if ((R->scrollBar.init & R_SB_NEXT) == 0) { 239 if ((init & SB_STYLE_NEXT) == 0)
235 R->scrollBar.init |= R_SB_NEXT; 240 {
236 rxvt_init_scrollbar_stuff(aR); 241 init |= SB_STYLE_NEXT;
242 init_next ();
237 } 243 }
238 244
239 if (R->TermWin.nscrolled == 0 || !update) { 245 if (term->top_row == 0 || !update)
240 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->grayGC, 0, 0, 246 {
247 XFillRectangle (term->dpy, win, grayGC, 0, 0,
241 SB_WIDTH_NEXT + 1, height); 248 SB_WIDTH_NEXT + 1, height);
242 XDrawRectangle(R->Xdisplay, R->scrollBar.win, R->blackGC, 0, 249 XDrawRectangle (term->dpy, win, blackGC, 0,
243 -SB_BORDER_WIDTH, SB_WIDTH_NEXT, 250 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
244 height + SB_BORDER_WIDTH); 251 height + SB_BORDER_WIDTH);
245 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC, 252 XFillRectangle (term->dpy, win, stippleGC,
246 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height); 253 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height);
247 } 254 }
248 if (R->TermWin.nscrolled) { 255
256 if (term->top_row)
257 {
249 if (last_top < R->scrollBar.top || !update) 258 if (last_top < top || !update)
250 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC, 259 XFillRectangle (term->dpy, win, stippleGC,
251 SB_LEFT_PADDING, SB_PADDING + last_top, 260 SB_LEFT_PADDING, SB_PADDING + last_top,
252 SB_BUTTON_WIDTH, R->scrollBar.top - last_top); 261 SB_BUTTON_WIDTH, top - last_top);
262
253 if (R->scrollBar.bot < last_bot || !update) 263 if (bot < last_bot || !update)
254 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->stippleGC, 264 XFillRectangle (term->dpy, win, stippleGC,
255 SB_LEFT_PADDING, R->scrollBar.bot + SB_PADDING, 265 SB_LEFT_PADDING, bot + SB_PADDING,
256 SB_BUTTON_WIDTH, (last_bot - R->scrollBar.bot)); 266 SB_BUTTON_WIDTH, (last_bot - bot));
257 XFillRectangle(R->Xdisplay, R->scrollBar.win, R->grayGC, 267
258 SB_LEFT_PADDING, R->scrollBar.top + SB_PADDING, 268 XFillRectangle (term->dpy, win, grayGC,
259 SB_BUTTON_WIDTH, scrollbar_len); 269 SB_LEFT_PADDING, top + SB_PADDING,
260 XCopyArea(R->Xdisplay, R->dimple, R->scrollBar.win, R->whiteGC, 0, 0, 270 SB_BUTTON_WIDTH, bot - top);
271
272 XCopyArea (term->dpy, dimple, win, whiteGC, 0, 0,
261 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT, 273 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT,
262 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2, 274 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2,
263 R->scrollBar.top + SB_BEVEL_WIDTH_UPPER_LEFT + 275 top + SB_BEVEL_WIDTH_UPPER_LEFT +
264 (scrollbar_len - SCROLLER_DIMPLE_HEIGHT) / 2); 276 (bot - top - SCROLLER_DIMPLE_HEIGHT) / 2);
265 277
266 rxvt_drawBevel(aR_ R->scrollBar.win, SB_BUTTON_BEVEL_X, 278 drawBevel (this, SB_BUTTON_BEVEL_X,
267 R->scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH, 279 top + SB_PADDING, SB_BUTTON_WIDTH,
268 scrollbar_len); 280 bot - top);
269 rxvt_drawBevel(aR_ R->scrollBar.win, SB_BUTTON_BEVEL_X, 281 drawBevel (this, SB_BUTTON_BEVEL_X,
270 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH, 282 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH,
271 SB_BUTTON_HEIGHT); 283 SB_BUTTON_HEIGHT);
272 rxvt_drawBevel(aR_ R->scrollBar.win, SB_BUTTON_BEVEL_X, 284 drawBevel (this, SB_BUTTON_BEVEL_X,
273 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH, 285 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH,
274 SB_BUTTON_HEIGHT); 286 SB_BUTTON_HEIGHT);
275 287
276 s = (scrollbar_isUp()) ? R->upArrowHi : R->upArrow; 288 src = state == SB_STATE_UP ? upArrowHi : upArrow;
277 XCopyArea(R->Xdisplay, s, R->scrollBar.win, R->whiteGC, 0, 0, 289 XCopyArea (term->dpy, src, win, whiteGC, 0, 0,
278 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X, 290 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
279 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT); 291 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
280 292
281 s = (scrollbar_isDn()) ? R->downArrowHi : R->downArrow; 293 src = state == SB_STATE_DOWN ? downArrowHi : downArrow;
282 XCopyArea(R->Xdisplay, s, R->scrollBar.win, R->whiteGC, 0, 0, 294 XCopyArea (term->dpy, src, win, whiteGC, 0, 0,
283 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X, 295 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
284 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT); 296 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
285 } 297 }
298
286 return 1; 299 return 1;
287} 300}
288#endif /* NEXT_SCROLLBAR */ 301#endif /* NEXT_SCROLLBAR */
289/*----------------------- end-of-file (C source) -----------------------*/ 302/*----------------------- end-of-file (C source) -----------------------*/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines