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.13 by root, Sun Aug 15 21:55:45 2004 UTC vs.
Revision 1.35 by sf-exg, Fri May 30 19:44:11 2014 UTC

1/*--------------------------------*-C-*---------------------------------* 1/*----------------------------------------------------------------------*
2 * File: scrollbar-next.C 2 * File: scrollbar-next.C
3 *----------------------------------------------------------------------* 3 *----------------------------------------------------------------------*
4 * 4 *
5 * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA> 5 * Copyright (c) 1997,1998 mj olesen <olesen@me.QueensU.CA>
6 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org> 6 * Copyright (c) 1998 Alfredo K. Kojima <kojima@windowmaker.org>
7 * - N*XTstep like scrollbars 7 * - N*XTstep like scrollbars
8 * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.com> 8 * Copyright (c) 1999-2001 Geoff Wing <gcw@pobox.com>
9 * Copyright (c) 2004 Marc Lehmann <pcg@goof.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
113 " % ", 113 " % ",
114 " ", 114 " ",
115 " " 115 " "
116 }; 116 };
117 117
118Pixmap 118static Pixmap
119rxvt_term::renderPixmap (const char *const *data, int width, int height) 119renderPixmap (scrollBar_t *sb, const char *const *data, int width, int height)
120{ 120{
121 char a; 121 char a;
122 int x, y; 122 int x, y;
123 Pixmap d; 123 Pixmap d;
124 GC pointcolour; 124 GC pointcolour;
125 125
126 d = XCreatePixmap (display->display, scrollBar.win, width, height, display->depth); 126 d = XCreatePixmap (sb->term->dpy, sb->win, width, height, sb->term->depth);
127 127
128 for (y = 0; y < height; y++) 128 for (y = 0; y < height; y++)
129 { 129 {
130 for (x = 0; x < width; x++) 130 for (x = 0; x < width; x++)
131 { 131 {
132 if ((a = data[y][x]) == ' ' || a == 'w') 132 if ((a = data[y][x]) == ' ' || a == 'w')
133 pointcolour = whiteGC; 133 pointcolour = sb->whiteGC;
134 else if (a == '.' || a == 'l') 134 else if (a == '.' || a == 'l')
135 pointcolour = grayGC; 135 pointcolour = sb->grayGC;
136 else if (a == '%' || a == 'd') 136 else if (a == '%' || a == 'd')
137 pointcolour = darkGC; 137 pointcolour = sb->darkGC;
138 else /* if (a == '#' || a == 'b' || a) */ 138 else /* if (a == '#' || a == 'b' || a) */
139 pointcolour = blackGC; 139 pointcolour = sb->blackGC;
140
140 XDrawPoint (display->display, d, pointcolour, x, y); 141 XDrawPoint (sb->term->dpy, d, pointcolour, x, y);
141 } 142 }
142 } 143 }
143 return d; 144 return d;
144} 145}
145 146
146void 147void
147rxvt_term::init_scrollbar_stuff () 148scrollBar_t::init_next ()
148{ 149{
149 XGCValues gcvalue; 150 XGCValues gcvalue;
150 XColor xcol; 151 rxvt_color color;
151 Pixmap stipple; 152 Pixmap stipple;
152 unsigned long light, dark; 153 unsigned long light, dark;
153 154
154 gcvalue.graphics_exposures = False; 155 gcvalue.graphics_exposures = False;
155 156
156 gcvalue.foreground = pix_colors[Color_Black]; 157 gcvalue.foreground = term->pix_colors_focused[Color_Black];
157 blackGC = XCreateGC (display->display, 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,
158 GCForeground | GCGraphicsExposures, &gcvalue); 173 GCForeground | GCGraphicsExposures, &gcvalue);
159 174
160 gcvalue.foreground = pix_colors[Color_White]; 175 dark = term->pix_colors_focused[Color_Grey25];
161 whiteGC = XCreateGC (display->display, scrollBar.win, 176#if 0
162 GCForeground | GCGraphicsExposures, &gcvalue); 177 //color used by rxvt
163 178 if (color.set (term, rgba (0x51aa, 0x5555, 0x5144)))
164 xcol.red = 0xaeba; 179 dark = color;
165 xcol.green = 0xaaaa; 180#endif
166 xcol.blue = 0xaeba; 181 gcvalue.foreground = dark;
167 //if (!rXAllocColor (&xcol, "light gray"))//TODO//D// 182 darkGC = XCreateGC (term->dpy, win,
168 xcol.pixel = pix_colors[Color_AntiqueWhite];
169 light = gcvalue.foreground = xcol.pixel;
170 grayGC = XCreateGC (display->display, scrollBar.win,
171 GCForeground | GCGraphicsExposures, &gcvalue); 183 GCForeground | GCGraphicsExposures, &gcvalue);
172 184
173 xcol.red = 0x51aa;
174 xcol.green = 0x5555;
175 xcol.blue = 0x5144;
176 //if (!rXAllocColor (&xcol, "dark gray"))//TODO//D//
177 xcol.pixel = pix_colors[Color_Grey25];
178 dark = gcvalue.foreground = xcol.pixel;
179 darkGC = XCreateGC (display->display, scrollBar.win,
180 GCForeground | GCGraphicsExposures, &gcvalue);
181
182 stipple = XCreateBitmapFromData (display->display, scrollBar.win, 185 stipple = XCreateBitmapFromData (term->dpy, win,
183 (char *)n_stp_bits, n_stp_width, 186 (char *)n_stp_bits, n_stp_width,
184 n_stp_height); 187 n_stp_height);
185 188
186 gcvalue.foreground = dark; 189 gcvalue.foreground = dark;
187 gcvalue.background = light; 190 gcvalue.background = light;
188 gcvalue.fill_style = FillOpaqueStippled; 191 gcvalue.fill_style = FillOpaqueStippled;
189 gcvalue.stipple = stipple; 192 gcvalue.stipple = stipple;
190 193
191 /* XSetWindowBackground (display->display, scrollBar.win, pix_colors[Color_Red]); */ 194 stippleGC = XCreateGC (term->dpy, win,
192
193 stippleGC = XCreateGC (display->display, scrollBar.win,
194 GCForeground | GCBackground | GCStipple 195 GCForeground | GCBackground | GCStipple
195 | GCFillStyle | GCGraphicsExposures, &gcvalue); 196 | GCFillStyle | GCGraphicsExposures, &gcvalue);
196 197
197 dimple = renderPixmap (SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH, 198 dimple = renderPixmap (this, SCROLLER_DIMPLE, SCROLLER_DIMPLE_WIDTH,
198 SCROLLER_DIMPLE_HEIGHT); 199 SCROLLER_DIMPLE_HEIGHT);
199 200
200 upArrow = renderPixmap (SCROLLER_ARROW_UP, ARROW_WIDTH, 201 upArrow = renderPixmap (this, SCROLLER_ARROW_UP, ARROW_WIDTH,
201 ARROW_HEIGHT); 202 ARROW_HEIGHT);
202 downArrow = renderPixmap (SCROLLER_ARROW_DOWN, ARROW_WIDTH, 203 downArrow = renderPixmap (this, SCROLLER_ARROW_DOWN, ARROW_WIDTH,
203 ARROW_HEIGHT); 204 ARROW_HEIGHT);
204 upArrowHi = renderPixmap (HI_SCROLLER_ARROW_UP, ARROW_WIDTH, 205 upArrowHi = renderPixmap (this, HI_SCROLLER_ARROW_UP, ARROW_WIDTH,
205 ARROW_HEIGHT); 206 ARROW_HEIGHT);
206 downArrowHi = renderPixmap (HI_SCROLLER_ARROW_DOWN, 207 downArrowHi = renderPixmap (this, HI_SCROLLER_ARROW_DOWN,
207 ARROW_WIDTH, ARROW_HEIGHT); 208 ARROW_WIDTH, ARROW_HEIGHT);
208} 209}
209 210
210/* Draw bevel & arrows */ 211/* Draw bevel & arrows */
211void 212static void
212rxvt_term::drawBevel (Drawable d, int x1, int y1, int w, int h) 213drawBevel (scrollBar_t *sb, int x1, int y1, int w, int h)
213{ 214{
214 int x2, y2; 215 int x2, y2;
216 Drawable d = sb->win;
217 Display *dpy = sb->term->dpy;
215 218
216 x2 = x1 + w - 1; /* right point */ 219 x2 = x1 + w - 1; /* right point */
217 y2 = y1 + h - 1; /* bottom point */ 220 y2 = y1 + h - 1; /* bottom point */
218 /* white top and left */ 221 /* white top and left */
219 XDrawLine (display->display, d, whiteGC, x1, y1, x2, y1); 222 XDrawLine (dpy, d, sb->whiteGC, x1, y1, x2, y1);
220 XDrawLine (display->display, d, whiteGC, x1, y1, x1, y2); 223 XDrawLine (dpy, d, sb->whiteGC, x1, y1, x1, y2);
221 /* black bottom and right */ 224 /* black bottom and right */
222 XDrawLine (display->display, d, blackGC, x1, y2, x2, y2); 225 XDrawLine (dpy, d, sb->blackGC, x1, y2, x2, y2);
223 XDrawLine (display->display, d, blackGC, x2, y1, x2, y2); 226 XDrawLine (dpy, d, sb->blackGC, x2, y1, x2, y2);
224 /* dark inside bottom and right */ 227 /* dark inside bottom and right */
225 x1++, y1++, x2--, y2--; /* move in one point */ 228 x1++, y1++, x2--, y2--; /* move in one point */
226 XDrawLine (display->display, d, darkGC, x1, y2, x2, y2); 229 XDrawLine (dpy, d, sb->darkGC, x1, y2, x2, y2);
227 XDrawLine (display->display, d, darkGC, x2, y1, x2, y2); 230 XDrawLine (dpy, d, sb->darkGC, x2, y1, x2, y2);
228} 231}
229 232
230int 233int
231rxvt_term::scrollbar_show_next (int update, int last_top, int last_bot, int scrollbar_len) 234scrollBar_t::show_next (int update)
232{ 235{
233 int height = scrollBar.end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING; 236 int height = end + SB_BUTTON_TOTAL_HEIGHT + SB_PADDING;
234 Drawable s; 237 Drawable src;
235 238
236 if ((scrollBar.init & R_SB_NEXT) == 0) 239 if ((init & SB_STYLE_NEXT) == 0)
237 { 240 {
238 scrollBar.init |= R_SB_NEXT; 241 init |= SB_STYLE_NEXT;
239 init_scrollbar_stuff (); 242 init_next ();
243 last_has_sb = false;
240 } 244 }
241 245
242 if (TermWin.nscrolled == 0 || !update) 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)
243 { 255 {
256 last_has_sb = has_sb;
244 XFillRectangle (display->display, scrollBar.win, grayGC, 0, 0, 257 XFillRectangle (term->dpy, win, grayGC, 0, 0,
245 SB_WIDTH_NEXT + 1, height); 258 SB_WIDTH_NEXT + 1, height);
246 XDrawRectangle (display->display, scrollBar.win, blackGC, 0, 259 XDrawRectangle (term->dpy, win, blackGC, 0,
247 -SB_BORDER_WIDTH, SB_WIDTH_NEXT, 260 -SB_BORDER_WIDTH, SB_WIDTH_NEXT,
248 height + SB_BORDER_WIDTH); 261 height + SB_BORDER_WIDTH);
249 XFillRectangle (display->display, scrollBar.win, stippleGC, 262 XFillRectangle (term->dpy, win, stippleGC,
263 SB_LEFT_PADDING, SB_PADDING,
250 SB_LEFT_PADDING, 0, SB_BUTTON_WIDTH, height); 264 SB_BUTTON_WIDTH, stipple_height);
251 } 265 }
252 if (TermWin.nscrolled) 266
267 if (term->top_row)
253 { 268 {
254 if (last_top < scrollBar.top || !update) 269 if (last_top < top || !update)
255 XFillRectangle (display->display, scrollBar.win, stippleGC, 270 XFillRectangle (term->dpy, win, stippleGC,
256 SB_LEFT_PADDING, SB_PADDING + last_top, 271 SB_LEFT_PADDING, SB_PADDING + last_top,
257 SB_BUTTON_WIDTH, scrollBar.top - last_top); 272 SB_BUTTON_WIDTH, top - last_top);
273
258 if (scrollBar.bot < last_bot || !update) 274 if (bot < last_bot || !update)
259 XFillRectangle (display->display, scrollBar.win, stippleGC, 275 XFillRectangle (term->dpy, win, stippleGC,
260 SB_LEFT_PADDING, scrollBar.bot + SB_PADDING, 276 SB_LEFT_PADDING, bot + SB_PADDING,
261 SB_BUTTON_WIDTH, (last_bot - scrollBar.bot)); 277 SB_BUTTON_WIDTH, (last_bot - bot));
278
262 XFillRectangle (display->display, scrollBar.win, grayGC, 279 XFillRectangle (term->dpy, win, grayGC,
263 SB_LEFT_PADDING, scrollBar.top + SB_PADDING, 280 SB_LEFT_PADDING, top + SB_PADDING,
264 SB_BUTTON_WIDTH, scrollbar_len); 281 SB_BUTTON_WIDTH, bot - top);
282
265 XCopyArea (display->display, dimple, scrollBar.win, whiteGC, 0, 0, 283 XCopyArea (term->dpy, dimple, win, whiteGC, 0, 0,
266 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT, 284 SCROLLER_DIMPLE_WIDTH, SCROLLER_DIMPLE_HEIGHT,
267 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2, 285 (SB_WIDTH_NEXT - SCROLLER_DIMPLE_WIDTH) / 2,
268 scrollBar.top + SB_BEVEL_WIDTH_UPPER_LEFT + 286 top + SB_BEVEL_WIDTH_UPPER_LEFT +
269 (scrollbar_len - SCROLLER_DIMPLE_HEIGHT) / 2); 287 (bot - top - SCROLLER_DIMPLE_HEIGHT) / 2);
270 288
271 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X, 289 drawBevel (this, SB_BUTTON_BEVEL_X,
272 scrollBar.top + SB_PADDING, SB_BUTTON_WIDTH, 290 top + SB_PADDING, SB_BUTTON_WIDTH,
273 scrollbar_len); 291 bot - top);
274 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X, 292 drawBevel (this, SB_BUTTON_BEVEL_X,
275 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH, 293 height - SB_BUTTON_BOTH_HEIGHT, SB_BUTTON_WIDTH,
276 SB_BUTTON_HEIGHT); 294 SB_BUTTON_HEIGHT);
277 drawBevel (scrollBar.win, SB_BUTTON_BEVEL_X, 295 drawBevel (this, SB_BUTTON_BEVEL_X,
278 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH, 296 height - SB_BUTTON_SINGLE_HEIGHT, SB_BUTTON_WIDTH,
279 SB_BUTTON_HEIGHT); 297 SB_BUTTON_HEIGHT);
280 298
281 s = (scrollbar_isUp ()) ? upArrowHi : upArrow; 299 src = state == SB_STATE_UP ? upArrowHi : upArrow;
282 XCopyArea (display->display, s, scrollBar.win, whiteGC, 0, 0, 300 XCopyArea (term->dpy, src, win, whiteGC, 0, 0,
283 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X, 301 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
284 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT); 302 height - SB_BUTTON_BOTH_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
285 303
286 s = (scrollbar_isDn ()) ? downArrowHi : downArrow; 304 src = state == SB_STATE_DOWN ? downArrowHi : downArrow;
287 XCopyArea (display->display, s, scrollBar.win, whiteGC, 0, 0, 305 XCopyArea (term->dpy, src, win, whiteGC, 0, 0,
288 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X, 306 ARROW_WIDTH, ARROW_HEIGHT, SB_BUTTON_FACE_X,
289 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT); 307 height - SB_BUTTON_SINGLE_HEIGHT + SB_BEVEL_WIDTH_UPPER_LEFT);
290 } 308 }
309
291 return 1; 310 return 1;
292} 311}
293#endif /* NEXT_SCROLLBAR */ 312#endif /* NEXT_SCROLLBAR */
294/*----------------------- end-of-file (C source) -----------------------*/ 313/*----------------------- end-of-file (C source) -----------------------*/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines