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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines