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.36 by root, Mon Jan 30 17:43:20 2006 UTC vs.
Revision 1.46 by root, Wed Feb 1 18:36:48 2006 UTC

81 "SCREEN_RESOURCES", 81 "SCREEN_RESOURCES",
82 "XDCCC_LINEAR_RGB_CORRECTION", 82 "XDCCC_LINEAR_RGB_CORRECTION",
83 "XDCCC_LINEAR_RGB_MATRICES", 83 "XDCCC_LINEAR_RGB_MATRICES",
84 "WM_COLORMAP_WINDOWS", 84 "WM_COLORMAP_WINDOWS",
85 "WM_STATE", 85 "WM_STATE",
86 "cursor",
87# if USE_XIM
88 "TRANSPORT",
89 "LOCALES",
90 "_XIM_PROTOCOL",
91 "_XIM_XCONNECT",
92 "_XIM_MOREDATA",
93# endif
86#endif 94#endif
87}; 95};
88 96
89///////////////////////////////////////////////////////////////////////////// 97/////////////////////////////////////////////////////////////////////////////
90 98
387 395
388void 396void
389rxvt_display::ref_next () 397rxvt_display::ref_next ()
390{ 398{
391 // TODO: somehow check wether the database files/resources changed 399 // TODO: somehow check wether the database files/resources changed
392 // before re-loading/parsing 400 // before affording re-loading/parsing
393 XrmDestroyDatabase (XrmGetDatabase (display)); 401 XrmDestroyDatabase (XrmGetDatabase (display));
394 XrmSetDatabase (display, get_resources ()); 402 XrmSetDatabase (display, get_resources ());
403 printf ("next\n");//D
395} 404}
396 405
397rxvt_display::~rxvt_display () 406rxvt_display::~rxvt_display ()
398{ 407{
399 if (!display) 408 if (!display)
500 509
501 selection_owner = owner; 510 selection_owner = owner;
502} 511}
503 512
504#ifdef USE_XIM 513#ifdef USE_XIM
514
505void rxvt_display::reg (im_watcher *w) 515void rxvt_display::reg (im_watcher *w)
506{ 516{
507 imw.push_back (w); 517 imw.push_back (w);
508} 518}
509 519
533 return xim; 543 return xim;
534} 544}
535 545
536void rxvt_display::put_xim (rxvt_xim *xim) 546void rxvt_display::put_xim (rxvt_xim *xim)
537{ 547{
538#if XLIB_IS_RACEFREE 548# if XLIB_IS_RACEFREE
539 xims.put (xim); 549 xims.put (xim);
540#endif 550# endif
541} 551}
552
542#endif 553#endif
543 554
544Atom rxvt_display::atom (const char *name) 555Atom rxvt_display::atom (const char *name)
545{ 556{
546 return XInternAtom (display, name, False); 557 return XInternAtom (display, name, False);
550 561
551template class refcache<rxvt_display>; 562template class refcache<rxvt_display>;
552refcache<rxvt_display> displays; 563refcache<rxvt_display> displays;
553 564
554///////////////////////////////////////////////////////////////////////////// 565/////////////////////////////////////////////////////////////////////////////
555 566
556bool 567bool
557rxvt_color::set (rxvt_screen *screen, const char *name) 568rxvt_color::alloc (rxvt_screen *screen, const rgba &color)
558{
559#if XFT
560 int l = strlen (name);
561 rxvt_rgba r;
562 char eos;
563 int mult;
564
565 // shortcutting this saves countless server RTTs for the built-in colours
566 if (l == 3+3*3 && 3 == sscanf (name, "rgb:%hx/%hx/%hx/%hx%c", &r.r, &r.g, &r.b, &r.a, &eos))
567 {
568 r.a = rxvt_rgba::MAX_CC;
569 mult = rxvt_rgba::MAX_CC / 0x00ff;
570 }
571
572 // parse a number of non-standard ARGB colour specifications
573 else if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
574 mult = rxvt_rgba::MAX_CC / 0x000f;
575 else if (l == 1+4*2 && 4 == sscanf (name, "#%2hx%2hx%2hx%2hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
576 mult = rxvt_rgba::MAX_CC / 0x00ff;
577 else if (l == 1+4*4 && 4 == sscanf (name, "#%4hx%4hx%4hx%4hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
578 mult = rxvt_rgba::MAX_CC / 0xffff;
579 else if (l == 4+5*4 && 4 == sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &r.r, &r.g, &r.b, &r.a, &eos))
580 mult = rxvt_rgba::MAX_CC / 0xffff;
581
582 // slow case: server round trip
583 else
584 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
585
586 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
587
588 return set (screen, r);
589#else
590 XColor xc;
591
592 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
593 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
594
595 return false;
596#endif
597}
598
599bool
600rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
601{ 569{
602#if XFT 570#if XFT
603 XRenderPictFormat *format; 571 XRenderPictFormat *format;
604 572
605 // FUCKING Xft gets it wrong, of course, so work around it 573 // FUCKING Xft gets it wrong, of course, so work around it
606 // transparency users should eat shit and die, and then 574 // transparency users should eat shit and die, and then
607 // XRenderQueryPictIndexValues themselves plenty. 575 // XRenderQueryPictIndexValues themselves plenty.
608 if (screen->visual->c_class == TrueColor 576 if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
609 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) 577 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual)))
610 { 578 {
611 // the fun lies in doing everything manually... 579 // the fun lies in doing everything manually...
612 c.color.red = rgba.r; 580 c.color.red = color.r;
613 c.color.green = rgba.g; 581 c.color.green = color.g;
614 c.color.blue = rgba.b; 582 c.color.blue = color.b;
615 c.color.alpha = rgba.a; 583 c.color.alpha = color.a;
616 584
617 c.pixel = ((rgba.r * format->direct.redMask / rxvt_rgba::MAX_CC) << format->direct.red ) 585 c.pixel = ((color.r * format->direct.redMask / rgba::MAX_CC) << format->direct.red )
618 | ((rgba.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green) 586 | ((color.g * format->direct.greenMask / rgba::MAX_CC) << format->direct.green)
619 | ((rgba.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue ) 587 | ((color.b * format->direct.blueMask / rgba::MAX_CC) << format->direct.blue )
620 | ((rgba.a * format->direct.alphaMask / rxvt_rgba::MAX_CC) << format->direct.alpha); 588 | ((color.a * format->direct.alphaMask / rgba::MAX_CC) << format->direct.alpha);
621 589
622 return true; 590 return true;
623 } 591 }
624 else 592 else
625 { 593 {
626 XRenderColor d; 594 XRenderColor d;
627 595
628 d.red = rgba.r; 596 d.red = color.r;
629 d.green = rgba.g; 597 d.green = color.g;
630 d.blue = rgba.b; 598 d.blue = color.b;
631 d.alpha = rgba.a; 599 d.alpha = color.a;
632 600
633 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); 601 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
634 } 602 }
603#else
604 c.red = color.r;
605 c.green = color.g;
606 c.blue = color.b;
607
608 if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
609 {
610 c.pixel = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask ))
611 / rgba::MAX_CC) << ctz (screen->visual->red_mask )
612 | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask))
613 / rgba::MAX_CC) << ctz (screen->visual->green_mask)
614 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
615 / rgba::MAX_CC) << ctz (screen->visual->blue_mask );
616
617 return true;
618 }
619 else if (XAllocColor (screen->xdisp, screen->cmap, &c))
620 return true;
621 else
622 c.pixel = (color.r + color.g + color.b) > 128*3
623 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp))
624 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp));
625#endif
635 626
636 return false; 627 return false;
628}
629
630bool
631rxvt_color::set (rxvt_screen *screen, const char *name)
632{
633 rgba c;
634 char eos;
635 int skip;
636
637 // parse the nonstandard "[alphapercent]" prefix
638 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
639 {
640 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a);
641 name += skip;
642 }
643 else
644 c.a = rgba::MAX_CC;
645
646 // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format
647 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%4hx/%4hx/%4hx/%4hx%c", &c.r, &c.g, &c.b, &c.a, &eos))
648 {
649 XColor xc, xc_exact;
650
651 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
652 {
653 c.r = xc.red;
654 c.g = xc.green;
655 c.b = xc.blue;
656 }
657 else
658 {
659 c.r = 0xffff;
660 c.g = 0x6969;
661 c.b = 0xb4b4;
662
663 rxvt_warn ("unable to parse color '%s', using pink instead.\n", name);
664 }
665 }
666
667 return set (screen, c);
668}
669
670bool
671rxvt_color::set (rxvt_screen *screen, const rgba &color)
672{
673 bool got = alloc (screen, color);
674
675#if !ENABLE_MINIMAL
676 int cmap_size = screen->visual->map_entries;
677
678 if (!got
679 && screen->visual->c_class == PseudoColor
680 && cmap_size < 4096)
681 {
682 XColor *colors = new XColor [screen->visual->map_entries];
683
684 for (int i = 0; i < cmap_size; i++)
685 colors [i].pixel = i;
686
687 // many kilobytes transfer per colour, but pseudocolor isn't worth
688 // many extra optimisations.
689 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size);
690
691 int diff = 0x7fffffffUL;
692 XColor *best = colors;
693
694 for (int i = 0; i < cmap_size; i++)
695 {
696 int d = (squared_diff<int> (color.r >> 2, colors [i].red >> 2))
697 + (squared_diff<int> (color.g >> 2, colors [i].green >> 2))
698 + (squared_diff<int> (color.b >> 2, colors [i].blue >> 2));
699
700 if (d < diff)
701 {
702 diff = d;
703 best = colors + i;
704 }
705 }
706
707 //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n",
708 // color.r, color.g, color.b, best->red, best->green, best->blue, diff);
709
710 got = alloc (screen, rgba (best->red, best->green, best->blue));
711
712 delete colors;
713 }
714#endif
715
716 return got;
717}
718
719void
720rxvt_color::get (rgba &color)
721{
722#if XFT
723 color.r = c.color.red;
724 color.g = c.color.green;
725 color.b = c.color.blue;
726 color.a = c.color.alpha;
637#else 727#else
638 if (screen->visual->c_class == TrueColor) 728 color.r = c.red;
639 { 729 color.g = c.green;
640 p = ((rgba.r * ((1 << screen->visual->bits_per_rgb) - 1) 730 color.b = c.blue;
641 / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask )) 731 color.a = rgba::MAX_CC;
642 | ((rgba.g * ((1 << screen->visual->bits_per_rgb) - 1)
643 / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask))
644 | ((rgba.b * ((1 << screen->visual->bits_per_rgb) - 1)
645 / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask ));
646
647 return true;
648 }
649 else
650 {
651 XColor xc;
652
653 xc.red = rgba.r;
654 xc.green = rgba.g;
655 xc.blue = rgba.b;
656 xc.flags = DoRed | DoGreen | DoBlue;
657
658 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
659 {
660 p = xc.pixel;
661 return true;
662 }
663 }
664
665 return false;
666#endif 732#endif
667} 733}
668 734
669void 735void
670rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba) 736rxvt_color::get (XColor &color)
671{ 737{
672#if XFT 738 rgba c;
673 rgba.r = c.color.red; 739 get (c);
674 rgba.g = c.color.green;
675 rgba.b = c.color.blue;
676 rgba.a = c.color.alpha;
677#else
678 XColor c;
679 740
680 c.pixel = p; 741 color.red = c.r;
681 XQueryColor (screen->xdisp, screen->cmap, &c); 742 color.green = c.g;
682 743 color.blue = c.b;
683 rgba.r = c.red; 744 color.pixel = (Pixel)*this;
684 rgba.g = c.green;
685 rgba.b = c.blue;
686 rgba.a = rxvt_rgba::MAX_CC;
687#endif
688} 745}
689 746
690void 747void
691rxvt_color::free (rxvt_screen *screen) 748rxvt_color::free (rxvt_screen *screen)
692{ 749{
693#if XFT 750#if XFT
694 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 751 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
695#else 752#else
696 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 753 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes);
697#endif 754#endif
698} 755}
699 756
700rxvt_color 757void
701rxvt_color::fade (rxvt_screen *screen, int percent)
702{
703 rxvt_color faded;
704
705 rxvt_rgba c;
706 get (screen, c);
707
708 c.r = lerp (0, c.r, percent);
709 c.g = lerp (0, c.g, percent);
710 c.b = lerp (0, c.b, percent);
711
712 faded.set (screen, c);
713
714 return faded;
715}
716
717rxvt_color
718rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto) 758rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
719{ 759{
720 rxvt_rgba c, fc; 760 rgba c;
721 rxvt_color faded; 761 get (c);
722
723 get (screen, c);
724 fadeto.get (screen, fc);
725 762
726 faded.set ( 763 result.set (
727 screen, 764 screen,
728 rxvt_rgba ( 765 rgba (
729 lerp (fc.r, c.r, percent), 766 lerp (c.r, to.r, percent),
730 lerp (fc.g, c.g, percent), 767 lerp (c.g, to.g, percent),
731 lerp (fc.b, c.b, percent), 768 lerp (c.b, to.b, percent),
732 lerp (fc.a, c.a, percent) 769 lerp (c.a, to.a, percent)
733 ) 770 )
734 ); 771 );
735
736 return faded;
737} 772}
738 773

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines