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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines