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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines