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.41 by root, Tue Jan 31 16:43:55 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, const rxvt_rgba &color) 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 = color.r; 579 c.color.red = color.r;
578 c.color.green = color.g; 580 c.color.green = color.g;
579 c.color.blue = color.b; 581 c.color.blue = color.b;
580 c.color.alpha = color.a; 582 c.color.alpha = color.a;
581 583
582 c.pixel = ((color.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 | ((color.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green) 585 | ((color.g * format->direct.greenMask / rgba::MAX_CC) << format->direct.green)
584 | ((color.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue ) 586 | ((color.b * format->direct.blueMask / rgba::MAX_CC) << format->direct.blue )
585 | ((color.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 {
596 d.alpha = color.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 = (color.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 | (color.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 | (color.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 {
614 XColor xc;
615
616 xc.red = color.r;
617 xc.green = color.g;
618 xc.blue = color.b;
619
620 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
621 {
622 p = xc.pixel;
623 return true;
624 }
625 else
626 p = (color.r + color.g + color.b) > 128*3 621 c.pixel = (color.r + color.g + color.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, "[%hd]%n", &c.a, &skip)) 637 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
643 { 638 {
644 c.a = lerp<int, int, int> (0, rxvt_rgba::MAX_CC, c.a); 639 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a);
645 name += skip; 640 name += skip;
646 } 641 }
647 else 642 else
648 c.a = rxvt_rgba::MAX_CC; 643 c.a = rgba::MAX_CC;
649 644
650 // parse the non-standard rgba format 645 // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format
651 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))
652 { 647 {
653 XColor xc, xc_exact; 648 XColor xc, xc_exact;
654 649
655 if (XParseColor (screen->xdisp, screen->cmap, name, &xc)) 650 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
656 { 651 {
670 665
671 return set (screen, c); 666 return set (screen, c);
672} 667}
673 668
674bool 669bool
675rxvt_color::set (rxvt_screen *screen, const rxvt_rgba &color) 670rxvt_color::set (rxvt_screen *screen, const rgba &color)
676{ 671{
677 bool got = alloc (screen, color); 672 bool got = alloc (screen, color);
678 673
679#if !ENABLE_MINIMAL 674#if !ENABLE_MINIMAL
680 int cmap_size = screen->visual->map_entries; 675 int cmap_size = screen->visual->map_entries;
686 XColor *colors = new XColor [screen->visual->map_entries]; 681 XColor *colors = new XColor [screen->visual->map_entries];
687 682
688 for (int i = 0; i < cmap_size; i++) 683 for (int i = 0; i < cmap_size; i++)
689 colors [i].pixel = i; 684 colors [i].pixel = i;
690 685
686 // many kilobytes transfer per colour, but pseudocolor isn't worth
687 // many extra optimisations.
691 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size); 688 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size);
692 689
693 int diff = 0x7fffffffUL; 690 int diff = 0x7fffffffUL;
694 XColor *best = colors; 691 XColor *best = colors;
695 692
707 } 704 }
708 705
709 //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",
710 // color.r, color.g, color.b, best->red, best->green, best->blue, diff); 707 // color.r, color.g, color.b, best->red, best->green, best->blue, diff);
711 708
712 got = alloc (screen, rxvt_rgba (best->red, best->green, best->blue)); 709 got = alloc (screen, rgba (best->red, best->green, best->blue));
713 710
714 delete colors; 711 delete colors;
715 } 712 }
716#endif 713#endif
717 714
718 return got; 715 return got;
719} 716}
720 717
721void 718void
722rxvt_color::get (rxvt_screen *screen, rxvt_rgba &color) 719rxvt_color::get (rgba &color)
723{ 720{
724#if XFT 721#if XFT
725 color.r = c.color.red; 722 color.r = c.color.red;
726 color.g = c.color.green; 723 color.g = c.color.green;
727 color.b = c.color.blue; 724 color.b = c.color.blue;
728 color.a = c.color.alpha; 725 color.a = c.color.alpha;
729#else 726#else
730 XColor c;
731
732 c.pixel = p;
733 XQueryColor (screen->xdisp, screen->cmap, &c);
734
735 color.r = c.red; 727 color.r = c.red;
736 color.g = c.green; 728 color.g = c.green;
737 color.b = c.blue; 729 color.b = c.blue;
738 color.a = rxvt_rgba::MAX_CC; 730 color.a = rgba::MAX_CC;
739#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;
740} 744}
741 745
742void 746void
743rxvt_color::free (rxvt_screen *screen) 747rxvt_color::free (rxvt_screen *screen)
744{ 748{
745#if XFT 749#if XFT
746 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 750 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
747#else 751#else
748 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 752 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes);
749#endif 753#endif
750} 754}
751 755
752rxvt_color 756void
753rxvt_color::fade (rxvt_screen *screen, int percent, const rxvt_rgba &to) 757rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
754{ 758{
755 rxvt_rgba c; 759 rgba c;
756 get (screen, c); 760 get (c);
757 761
758 rxvt_color faded; 762 result.set (
759 faded.set (
760 screen, 763 screen,
761 rxvt_rgba ( 764 rgba (
762 lerp (to.r, c.r, percent), 765 lerp (c.r, to.r, percent),
763 lerp (to.g, c.g, percent), 766 lerp (c.g, to.g, percent),
764 lerp (to.b, c.b, percent), 767 lerp (c.b, to.b, percent),
765 lerp (to.a, c.a, percent) 768 lerp (c.a, to.a, percent)
766 ) 769 )
767 ); 770 );
768
769 return faded;
770} 771}
771 772

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines