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.39 by root, Tue Jan 31 00:25:16 2006 UTC vs.
Revision 1.48 by root, Thu Feb 2 12:51:22 2006 UTC

395 395
396void 396void
397rxvt_display::ref_next () 397rxvt_display::ref_next ()
398{ 398{
399 // TODO: somehow check wether the database files/resources changed 399 // TODO: somehow check wether the database files/resources changed
400 // before re-loading/parsing 400 // before affording re-loading/parsing
401 XrmDestroyDatabase (XrmGetDatabase (display)); 401 XrmDestroyDatabase (XrmGetDatabase (display));
402 XrmSetDatabase (display, get_resources ()); 402 XrmSetDatabase (display, get_resources ());
403} 403}
404 404
405rxvt_display::~rxvt_display () 405rxvt_display::~rxvt_display ()
508 508
509 selection_owner = owner; 509 selection_owner = owner;
510} 510}
511 511
512#ifdef USE_XIM 512#ifdef USE_XIM
513
513void rxvt_display::reg (im_watcher *w) 514void rxvt_display::reg (im_watcher *w)
514{ 515{
515 imw.push_back (w); 516 imw.push_back (w);
516} 517}
517 518
541 return xim; 542 return xim;
542} 543}
543 544
544void rxvt_display::put_xim (rxvt_xim *xim) 545void rxvt_display::put_xim (rxvt_xim *xim)
545{ 546{
546#if XLIB_IS_RACEFREE 547# if XLIB_IS_RACEFREE
547 xims.put (xim); 548 xims.put (xim);
548#endif 549# endif
549} 550}
551
550#endif 552#endif
551 553
552Atom rxvt_display::atom (const char *name) 554Atom rxvt_display::atom (const char *name)
553{ 555{
554 return XInternAtom (display, name, False); 556 return XInternAtom (display, name, False);
560refcache<rxvt_display> displays; 562refcache<rxvt_display> displays;
561 563
562///////////////////////////////////////////////////////////////////////////// 564/////////////////////////////////////////////////////////////////////////////
563 565
564bool 566bool
565rxvt_color::alloc (rxvt_screen *screen, rxvt_rgba rgba) 567rxvt_color::alloc (rxvt_screen *screen, const rgba &color)
566{ 568{
567#if XFT 569#if XFT
568 XRenderPictFormat *format; 570 XRenderPictFormat *format;
569 571
570 // FUCKING Xft gets it wrong, of course, so work around it 572 // FUCKING Xft gets it wrong, of course, so work around it.
571 // transparency users should eat shit and die, and then 573 // Transparency users should eat shit and die, and then
572 // XRenderQueryPictIndexValues themselves plenty. 574 // XRenderQueryPictIndexValues themselves plenty.
573 if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor) 575 if ((screen->visual->c_class == TrueColor)
574 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) 576 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual)))
575 { 577 {
576 // the fun lies in doing everything manually... 578 // the fun lies in doing everything manually...
577 c.color.red = rgba.r; 579 c.color.red = color.r;
578 c.color.green = rgba.g; 580 c.color.green = color.g;
579 c.color.blue = rgba.b; 581 c.color.blue = color.b;
580 c.color.alpha = rgba.a; 582 c.color.alpha = color.a;
581 583
582 c.pixel = ((rgba.r * format->direct.redMask / rxvt_rgba::MAX_CC) << format->direct.red ) 584 c.pixel = ((color.r * format->direct.redMask / rgba::MAX_CC) << format->direct.red )
583 | ((rgba.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green) 585 | ((color.g * format->direct.greenMask / rgba::MAX_CC) << format->direct.green)
584 | ((rgba.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue ) 586 | ((color.b * format->direct.blueMask / rgba::MAX_CC) << format->direct.blue )
585 | ((rgba.a * format->direct.alphaMask / rxvt_rgba::MAX_CC) << format->direct.alpha); 587 | ((color.a * format->direct.alphaMask / rgba::MAX_CC) << format->direct.alpha);
586 588
587 return true; 589 return true;
588 } 590 }
589 else 591 else
590 { 592 {
591 XRenderColor d; 593 XRenderColor d;
592 594
593 d.red = rgba.r; 595 d.red = color.r;
594 d.green = rgba.g; 596 d.green = color.g;
595 d.blue = rgba.b; 597 d.blue = color.b;
596 d.alpha = rgba.a; 598 d.alpha = color.a;
597 599
598 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); 600 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
599 } 601 }
600#else 602#else
601 if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor) 603 c.red = color.r;
604 c.green = color.g;
605 c.blue = color.b;
606
607 if (screen->visual->c_class == TrueColor)
602 { 608 {
603 p = (rgba.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask )) 609 c.pixel = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask ))
604 / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask ) 610 / rgba::MAX_CC) << ctz (screen->visual->red_mask )
605 | (rgba.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask)) 611 | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask))
606 / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask) 612 / rgba::MAX_CC) << ctz (screen->visual->green_mask)
607 | (rgba.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) 613 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
608 / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask ); 614 / rgba::MAX_CC) << ctz (screen->visual->blue_mask );
609 615
610 return true; 616 return true;
611 } 617 }
618 else if (XAllocColor (screen->xdisp, screen->cmap, &c))
619 return true;
612 else 620 else
613 { 621 c.pixel = (color.r + color.g + color.b) > 128*3
614 XColor xc;
615
616 xc.red = rgba.r;
617 xc.green = rgba.g;
618 xc.blue = rgba.b;
619
620 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
621 {
622 p = xc.pixel;
623 return true;
624 }
625 else
626 p = (rgba.r + rgba.g + rgba.b) > 128*3
627 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)) 622 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp))
628 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)); 623 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp));
629 }
630#endif 624#endif
631 625
632 return false; 626 return false;
633} 627}
634 628
635bool 629bool
636rxvt_color::set (rxvt_screen *screen, const char *name) 630rxvt_color::set (rxvt_screen *screen, const char *name)
637{ 631{
638 rxvt_rgba c; 632 rgba c;
639 char eos; 633 char eos;
640 int skip; 634 int skip;
641 635
636 // parse the nonstandard "[alphapercent]" prefix
642 if (1 <= sscanf (name, "[%hx]%n", &c.a, &skip)) 637 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
643 { 638 {
644 switch (skip) 639 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a);
645 {
646 case 2 + 1: c.a *= rxvt_rgba::MAX_CC / 0x000f; break;
647 case 2 + 2: c.a *= rxvt_rgba::MAX_CC / 0x00ff; break;
648 case 2 + 3: c.a *= rxvt_rgba::MAX_CC / 0x0fff; break;
649 case 2 + 4: c.a *= rxvt_rgba::MAX_CC / 0xffff; break;
650 }
651
652 name += skip; 640 name += skip;
653 } 641 }
654 else 642 else
655 c.a = rxvt_rgba::MAX_CC; 643 c.a = rgba::MAX_CC;
656 644
657 // parse the non-standard rgba format 645 // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format
658 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &c.r, &c.g, &c.b, &c.a, &eos)) 646 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%4hx/%4hx/%4hx/%4hx%c", &c.r, &c.g, &c.b, &c.a, &eos))
659 { 647 {
660 XColor xc, xc_exact; 648 XColor xc, xc_exact;
661 649
662 if (XParseColor (screen->xdisp, screen->cmap, name, &xc)) 650 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
663 { 651 {
677 665
678 return set (screen, c); 666 return set (screen, c);
679} 667}
680 668
681bool 669bool
682rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba) 670rxvt_color::set (rxvt_screen *screen, const rgba &color)
683{ 671{
684 bool got = alloc (screen, rgba); 672 bool got = alloc (screen, color);
685 673
686#if !ENABLE_MINIMAL 674#if !ENABLE_MINIMAL
687 int cmap_size = screen->visual->map_entries; 675 int cmap_size = screen->visual->map_entries;
688 676
689 if (!got 677 if (!got
693 XColor *colors = new XColor [screen->visual->map_entries]; 681 XColor *colors = new XColor [screen->visual->map_entries];
694 682
695 for (int i = 0; i < cmap_size; i++) 683 for (int i = 0; i < cmap_size; i++)
696 colors [i].pixel = i; 684 colors [i].pixel = i;
697 685
686 // many kilobytes transfer per colour, but pseudocolor isn't worth
687 // many extra optimisations.
698 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size); 688 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size);
699 689
700 int diff = 0x7fffffffUL; 690 int diff = 0x7fffffffUL;
701 XColor *best = colors; 691 XColor *best = colors;
702 692
703 for (int i = 0; i < cmap_size; i++) 693 for (int i = 0; i < cmap_size; i++)
704 { 694 {
705 int d = (squared_diff<int> (rgba.r >> 2, colors [i].red >> 2)) 695 int d = (squared_diff<int> (color.r >> 2, colors [i].red >> 2))
706 + (squared_diff<int> (rgba.g >> 2, colors [i].green >> 2)) 696 + (squared_diff<int> (color.g >> 2, colors [i].green >> 2))
707 + (squared_diff<int> (rgba.b >> 2, colors [i].blue >> 2)); 697 + (squared_diff<int> (color.b >> 2, colors [i].blue >> 2));
708 698
709 if (d < diff) 699 if (d < diff)
710 { 700 {
711 diff = d; 701 diff = d;
712 best = colors + i; 702 best = colors + i;
713 } 703 }
714 } 704 }
715 705
716 //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n", 706 //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n",
717 // rgba.r, rgba.g, rgba.b, best->red, best->green, best->blue, diff); 707 // color.r, color.g, color.b, best->red, best->green, best->blue, diff);
718 708
719 got = alloc (screen, rxvt_rgba (best->red, best->green, best->blue)); 709 got = alloc (screen, rgba (best->red, best->green, best->blue));
720 710
721 delete colors; 711 delete colors;
722 } 712 }
723#endif 713#endif
724 714
725 return got; 715 return got;
726} 716}
727 717
728void 718void
729rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba) 719rxvt_color::get (rgba &color)
730{ 720{
731#if XFT 721#if XFT
732 rgba.r = c.color.red; 722 color.r = c.color.red;
733 rgba.g = c.color.green; 723 color.g = c.color.green;
734 rgba.b = c.color.blue; 724 color.b = c.color.blue;
735 rgba.a = c.color.alpha; 725 color.a = c.color.alpha;
736#else 726#else
737 XColor c;
738
739 c.pixel = p;
740 XQueryColor (screen->xdisp, screen->cmap, &c);
741
742 rgba.r = c.red; 727 color.r = c.red;
743 rgba.g = c.green; 728 color.g = c.green;
744 rgba.b = c.blue; 729 color.b = c.blue;
745 rgba.a = rxvt_rgba::MAX_CC; 730 color.a = rgba::MAX_CC;
746#endif 731#endif
732}
733
734void
735rxvt_color::get (XColor &color)
736{
737 rgba c;
738 get (c);
739
740 color.red = c.r;
741 color.green = c.g;
742 color.blue = c.b;
743 color.pixel = (Pixel)*this;
747} 744}
748 745
749void 746void
750rxvt_color::free (rxvt_screen *screen) 747rxvt_color::free (rxvt_screen *screen)
751{ 748{
752#if XFT 749#if XFT
753 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 750 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
754#else 751#else
755 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 752 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes);
756#endif 753#endif
757} 754}
758 755
759rxvt_color 756void
760rxvt_color::fade (rxvt_screen *screen, int percent)
761{
762 rxvt_color faded;
763
764 rxvt_rgba c;
765 get (screen, c);
766
767 c.r = lerp (0, c.r, percent);
768 c.g = lerp (0, c.g, percent);
769 c.b = lerp (0, c.b, percent);
770
771 faded.set (screen, c);
772
773 return faded;
774}
775
776rxvt_color
777rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto) 757rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
778{ 758{
779 rxvt_rgba c, fc; 759 rgba c;
780 rxvt_color faded; 760 get (c);
781
782 get (screen, c);
783 fadeto.get (screen, fc);
784 761
785 faded.set ( 762 result.set (
786 screen, 763 screen,
787 rxvt_rgba ( 764 rgba (
788 lerp (fc.r, c.r, percent), 765 lerp (c.r, to.r, percent),
789 lerp (fc.g, c.g, percent), 766 lerp (c.g, to.g, percent),
790 lerp (fc.b, c.b, percent), 767 lerp (c.b, to.b, percent),
791 lerp (fc.a, c.a, percent) 768 lerp (c.a, to.a, percent)
792 ) 769 )
793 ); 770 );
794
795 return faded;
796} 771}
797 772

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines