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.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, const rxvt_rgba &color) 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
577 c.color.red = color.r; 580 c.color.red = color.r;
578 c.color.green = color.g; 581 c.color.green = color.g;
579 c.color.blue = color.b; 582 c.color.blue = color.b;
580 c.color.alpha = color.a; 583 c.color.alpha = color.a;
581 584
582 c.pixel = ((color.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 | ((color.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green) 586 | ((color.g * format->direct.greenMask / rgba::MAX_CC) << format->direct.green)
584 | ((color.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue ) 587 | ((color.b * format->direct.blueMask / rgba::MAX_CC) << format->direct.blue )
585 | ((color.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 {
596 d.alpha = color.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 = (color.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 | (color.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 | (color.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 {
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 622 c.pixel = (color.r + color.g + color.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 rxvt_rgba c; 633 rgba c;
639 char eos; 634 char eos;
640 int skip; 635 int skip;
641 636
637 // parse the nonstandard "[alphapercent]" prefix
642 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip)) 638 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
643 { 639 {
644 c.a = lerp<int, int, int> (0, rxvt_rgba::MAX_CC, c.a); 640 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a);
645 name += skip; 641 name += skip;
646 } 642 }
647 else 643 else
648 c.a = rxvt_rgba::MAX_CC; 644 c.a = rgba::MAX_CC;
649 645
650 // parse the non-standard rgba format 646 // 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)) 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))
652 { 648 {
653 XColor xc, xc_exact; 649 XColor xc, xc_exact;
654 650
655 if (XParseColor (screen->xdisp, screen->cmap, name, &xc)) 651 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
656 { 652 {
670 666
671 return set (screen, c); 667 return set (screen, c);
672} 668}
673 669
674bool 670bool
675rxvt_color::set (rxvt_screen *screen, const rxvt_rgba &color) 671rxvt_color::set (rxvt_screen *screen, const rgba &color)
676{ 672{
677 bool got = alloc (screen, color); 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;
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
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 // color.r, color.g, color.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 &color) 720rxvt_color::get (rgba &color)
723{ 721{
724#if XFT 722#if XFT
725 color.r = c.color.red; 723 color.r = c.color.red;
726 color.g = c.color.green; 724 color.g = c.color.green;
727 color.b = c.color.blue; 725 color.b = c.color.blue;
728 color.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 color.r = c.red; 728 color.r = c.red;
736 color.g = c.green; 729 color.g = c.green;
737 color.b = c.blue; 730 color.b = c.blue;
738 color.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, const rxvt_rgba &to) 758rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
754{ 759{
755 rxvt_rgba c; 760 rgba c;
756 get (screen, c); 761 get (c);
757 762
758 rxvt_color faded; 763 result.set (
759 faded.set (
760 screen, 764 screen,
761 rxvt_rgba ( 765 rgba (
762 lerp (to.r, c.r, percent), 766 lerp (c.r, to.r, percent),
763 lerp (to.g, c.g, percent), 767 lerp (c.g, to.g, percent),
764 lerp (to.b, c.b, percent), 768 lerp (c.b, to.b, percent),
765 lerp (to.a, c.a, percent) 769 lerp (c.a, to.a, percent)
766 ) 770 )
767 ); 771 );
768
769 return faded;
770} 772}
771 773

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines