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

Comparing rxvt-unicode/src/rxvttoolkit.C (file contents):
Revision 1.25 by root, Wed Jan 25 02:42:06 2006 UTC vs.
Revision 1.28 by root, Sun Jan 29 20:51:28 2006 UTC

177 177
178#endif 178#endif
179 179
180///////////////////////////////////////////////////////////////////////////// 180/////////////////////////////////////////////////////////////////////////////
181 181
182void
183rxvt_screen::set (rxvt_display *disp)
184{
185 display = disp;
186 xdisp = disp->display;
187
188 Screen *screen = ScreenOfDisplay (xdisp, disp->screen);
189
190 depth = DefaultDepthOfScreen (screen);
191 visual = DefaultVisualOfScreen (screen);
192 cmap = DefaultColormapOfScreen (screen);
193}
194
195void
196rxvt_screen::set (rxvt_display *disp, int bitdepth)
197{
198 set (disp);
199
200 XVisualInfo vinfo;
201
202 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo))
203 {
204 depth = bitdepth;
205 visual = vinfo.visual;
206 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone);
207 }
208}
209
210void
211rxvt_screen::clear ()
212{
213 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (xdisp, display->screen)))
214 XFreeColormap (xdisp, cmap);
215}
216
217/////////////////////////////////////////////////////////////////////////////
218
182rxvt_display::rxvt_display (const char *id) 219rxvt_display::rxvt_display (const char *id)
183: refcounted (id) 220: refcounted (id)
184, x_ev (this, &rxvt_display::x_cb) 221, x_ev (this, &rxvt_display::x_cb)
185, selection_owner (0) 222, selection_owner (0)
186{ 223{
287 if (!display) 324 if (!display)
288 return false; 325 return false;
289 326
290 screen = DefaultScreen (display); 327 screen = DefaultScreen (display);
291 root = DefaultRootWindow (display); 328 root = DefaultRootWindow (display);
292 visual = DefaultVisual (display, screen);
293 cmap = DefaultColormap (display, screen);
294 depth = DefaultDepth (display, screen);
295 329
296 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA); 330 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
297 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa); 331 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa);
298 332
299 XrmSetDatabase (display, get_resources ()); 333 XrmSetDatabase (display, get_resources ());
307 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 341 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ',
308 &blackcolour, &blackcolour); 342 &blackcolour, &blackcolour);
309 XUnloadFont (display, f); 343 XUnloadFont (display, f);
310#endif 344#endif
311 345
312#ifdef PREFER_24BIT
313 /*
314 * If depth is not 24, look for a 24bit visual.
315 */
316 if (depth != 24)
317 {
318 XVisualInfo vinfo;
319
320 if (XMatchVisualInfo (display, screen, 24, TrueColor, &vinfo))
321 {
322 depth = 24;
323 visual = vinfo.visual;
324 cmap = XCreateColormap (display,
325 RootWindow (display, screen),
326 visual, AllocNone);
327 }
328 }
329#endif
330
331 int fd = XConnectionNumber (display); 346 int fd = XConnectionNumber (display);
332 347
333#ifndef NO_SLOW_LINK_SUPPORT 348#ifndef NO_SLOW_LINK_SUPPORT
334 // try to detect wether we have a local connection. 349 // try to detect wether we have a local connection.
335 // assume unix domains socket == local, everything else not 350 // assume unix domains socket == local, everything else not
519refcache<rxvt_display> displays; 534refcache<rxvt_display> displays;
520 535
521///////////////////////////////////////////////////////////////////////////// 536/////////////////////////////////////////////////////////////////////////////
522 537
523bool 538bool
524rxvt_color::set (rxvt_display *display, Pixel p) 539rxvt_color::set (rxvt_screen *screen, const char *name)
525{ 540{
526#if XFT 541#if XFT
527 XColor xc; 542 int l = strlen (name);
543 rxvt_rgba r;
544 char eos;
545 int mult;
528 546
529 xc.pixel = p; 547 if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
530 if (!XQueryColor (display->display, display->cmap, &xc)) 548 mult = 0x1111;
531 return false; 549 else if (l == 1+4*2 && 4 == sscanf (name, "#%2hx%2hx%2hx%2hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
550 mult = 0x0101;
551 else if (l == 1+4*4 && 4 == sscanf (name, "#%4hx%4hx%4hx%4hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
552 mult = 0x0001;
553 else
554 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
532 555
533 XRenderColor d; 556 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
534 557 return set (screen, r);
535 d.red = xc.red;
536 d.green = xc.green;
537 d.blue = xc.blue;
538 d.alpha = 0xffff;
539
540 return
541 XftColorAllocValue (display->display,
542 display->visual,
543 display->cmap,
544 &d, &c);
545#else
546 this->p = p;
547#endif
548
549 return true;
550}
551
552bool
553rxvt_color::set (rxvt_display *display, const char *name)
554{
555#if XFT
556 return XftColorAllocName (display->display, display->visual, display->cmap,
557 name, &c);
558#else 558#else
559 XColor xc; 559 XColor xc;
560 560
561 if (XParseColor (display->display, display->cmap, name, &xc)) 561 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
562 return set (display, xc.red, xc.green, xc.blue); 562 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
563 563
564 return false; 564 return false;
565#endif 565#endif
566} 566}
567 567
568bool 568bool
569rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 569rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
570{ 570{
571#if XFT
572 XRenderColor d;
573
574 d.red = rgba.r;
575 d.green = rgba.g;
576 d.blue = rgba.b;
577 d.alpha = rgba.a;
578
579 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
580#else
571 XColor xc; 581 XColor xc;
572 582
573 xc.red = cr; 583 xc.red = rgba.r;
574 xc.green = cg; 584 xc.green = rgba.g;
575 xc.blue = cb; 585 xc.blue = rgba.b;
576 xc.flags = DoRed | DoGreen | DoBlue; 586 xc.flags = DoRed | DoGreen | DoBlue;
577 587
578 if (XAllocColor (display->display, display->cmap, &xc)) 588 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
579 return set (display, xc.pixel); 589 {
590 p = xc.pixel;
591 return true;
592 }
580 593
581 return false; 594 return false;
595#endif
582} 596}
583 597
584void 598void
585rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 599rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
586{ 600{
587#if XFT 601#if XFT
588 cr = c.color.red; 602 rgba.r = c.color.red;
589 cg = c.color.green; 603 rgba.g = c.color.green;
590 cb = c.color.blue; 604 rgba.b = c.color.blue;
605 rgba.a = c.color.alpha;
591#else 606#else
592 XColor c; 607 XColor c;
593 608
594 c.pixel = p; 609 c.pixel = p;
595 XQueryColor (display->display, display->cmap, &c); 610 XQueryColor (screen->xdisp, screen->cmap, &c);
596 611
597 cr = c.red; 612 rgba.r = c.red;
598 cg = c.green; 613 rgba.g = c.green;
599 cb = c.blue; 614 rgba.b = c.blue;
615 rgba.a = rxvt_rgba::MAX_CC;
600#endif 616#endif
601} 617}
602 618
603void 619void
604rxvt_color::free (rxvt_display *display) 620rxvt_color::free (rxvt_screen *screen)
605{ 621{
606#if XFT 622#if XFT
607 XftColorFree (display->display, display->visual, display->cmap, &c); 623 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
608#else 624#else
609 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 625 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
610#endif 626#endif
611} 627}
612 628
613rxvt_color 629rxvt_color
614rxvt_color::fade (rxvt_display *display, int percent) 630rxvt_color::fade (rxvt_screen *screen, int percent)
615{ 631{
616 percent = 100 - percent;
617
618 unsigned short cr, cg, cb;
619 rxvt_color faded; 632 rxvt_color faded;
620 633
621 get (display, cr, cg, cb); 634 rxvt_rgba c;
635 get (screen, c);
622 636
623 faded.set ( 637 c.r = lerp (0, c.r, percent);
624 display, 638 c.g = lerp (0, c.g, percent);
625 cr * percent / 100, 639 c.b = lerp (0, c.b, percent);
626 cg * percent / 100, 640
627 cb * percent / 100 641 faded.set (screen, c);
628 );
629 642
630 return faded; 643 return faded;
631} 644}
632 645
633#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
634
635rxvt_color 646rxvt_color
636rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 647rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
637{ 648{
638 percent = 100 - percent; 649 rxvt_rgba c, fc;
639
640 unsigned short cr, cg, cb;
641 unsigned short fcr, fcg, fcb;
642 rxvt_color faded; 650 rxvt_color faded;
643 651
644 get (display, cr, cg, cb); 652 get (screen, c);
645 fadeto.get(display, fcr, fcg, fcb); 653 fadeto.get (screen, fc);
646 654
647 faded.set ( 655 faded.set (
648 display, 656 screen,
657 rxvt_rgba (
649 LERP (cr, fcr, percent), 658 lerp (fc.r, c.r, percent),
650 LERP (cg, fcg, percent), 659 lerp (fc.g, c.g, percent),
651 LERP (cb, fcb, percent) 660 lerp (fc.b, c.b, percent),
661 lerp (fc.a, c.a, percent)
662 )
652 ); 663 );
653 664
654 return faded; 665 return faded;
655} 666}
656 667

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines