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.30 by root, Sun Jan 29 21:54:33 2006 UTC vs.
Revision 1.43 by root, Tue Jan 31 18:36:35 2006 UTC

32#ifndef NO_SLOW_LINK_SUPPORT 32#ifndef NO_SLOW_LINK_SUPPORT
33# include <sys/socket.h> 33# include <sys/socket.h>
34# include <sys/un.h> 34# include <sys/un.h>
35#endif 35#endif
36 36
37#if XFT
38# include <X11/extensions/Xrender.h>
39#endif
40
37const char *const xa_names[] = 41const char *const xa_names[] =
38 { 42{
39 "TEXT", 43 "TEXT",
40 "COMPOUND_TEXT", 44 "COMPOUND_TEXT",
41 "UTF8_STRING", 45 "UTF8_STRING",
42 "MULTIPLE", 46 "MULTIPLE",
43 "TARGETS", 47 "TARGETS",
44 "TIMESTAMP", 48 "TIMESTAMP",
45 "VT_SELECTION", 49 "VT_SELECTION",
46 "INCR", 50 "INCR",
47 "WM_PROTOCOLS", 51 "WM_PROTOCOLS",
48 "WM_DELETE_WINDOW", 52 "WM_DELETE_WINDOW",
49 "CLIPBOARD", 53 "CLIPBOARD",
54 "AVERAGE_WIDTH",
55 "WEIGHT_NAME",
56 "SLANT",
57 "CHARSET_REGISTRY",
58 "CHARSET_ENCODING",
50#if ENABLE_FRILLS 59#if ENABLE_FRILLS
51 "_MOTIF_WM_HINTS", 60 "_MOTIF_WM_HINTS",
52#endif 61#endif
53#if ENABLE_EWMH 62#if ENABLE_EWMH
54 "_NET_WM_PID", 63 "_NET_WM_PID",
55 "_NET_WM_NAME", 64 "_NET_WM_NAME",
56 "_NET_WM_ICON_NAME", 65 "_NET_WM_ICON_NAME",
57 "_NET_WM_PING", 66 "_NET_WM_PING",
58#endif 67#endif
59#if USE_XIM 68#if USE_XIM
60 "WM_LOCALE_NAME", 69 "WM_LOCALE_NAME",
61 "XIM_SERVERS", 70 "XIM_SERVERS",
62#endif 71#endif
63#ifdef TRANSPARENT 72#ifdef TRANSPARENT
64 "_XROOTPMAP_ID", 73 "_XROOTPMAP_ID",
65 "ESETROOT_PMAP_ID", 74 "ESETROOT_PMAP_ID",
66#endif 75#endif
67#if ENABLE_XEMBED 76#if ENABLE_XEMBED
68 "_XEMBED", 77 "_XEMBED",
69 "_XEMBED_INFO", 78 "_XEMBED_INFO",
79#endif
80#if !ENABLE_MINIMAL
81 "SCREEN_RESOURCES",
82 "XDCCC_LINEAR_RGB_CORRECTION",
83 "XDCCC_LINEAR_RGB_MATRICES",
84 "WM_COLORMAP_WINDOWS",
85 "WM_STATE",
86 "cursor",
87# if USE_XIM
88 "TRANSPORT",
89 "LOCALES",
90 "_XIM_PROTOCOL",
91 "_XIM_XCONNECT",
92 "_XIM_MOREDATA",
70#endif 93# endif
71 }; 94#endif
95};
72 96
73///////////////////////////////////////////////////////////////////////////// 97/////////////////////////////////////////////////////////////////////////////
74 98
75refcounted::refcounted (const char *id) 99refcounted::refcounted (const char *id)
76{ 100{
195void 219void
196rxvt_screen::set (rxvt_display *disp, int bitdepth) 220rxvt_screen::set (rxvt_display *disp, int bitdepth)
197{ 221{
198 set (disp); 222 set (disp);
199 223
224#if XFT
200 XVisualInfo vinfo; 225 XVisualInfo vinfo;
201 226
202 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo)) 227 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo))
203 { 228 {
204 depth = bitdepth; 229 depth = bitdepth;
205 visual = vinfo.visual; 230 visual = vinfo.visual;
206 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone); 231 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone);
207 } 232 }
233#endif
208} 234}
209 235
210void 236void
211rxvt_screen::clear () 237rxvt_screen::clear ()
212{ 238{
532 558
533template class refcache<rxvt_display>; 559template class refcache<rxvt_display>;
534refcache<rxvt_display> displays; 560refcache<rxvt_display> displays;
535 561
536///////////////////////////////////////////////////////////////////////////// 562/////////////////////////////////////////////////////////////////////////////
537 563
564bool
565rxvt_color::alloc (rxvt_screen *screen, const rgba &color)
566{
567#if XFT
568 XRenderPictFormat *format;
569
570 // FUCKING Xft gets it wrong, of course, so work around it
571 // transparency users should eat shit and die, and then
572 // XRenderQueryPictIndexValues themselves plenty.
573 if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
574 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual)))
575 {
576 // the fun lies in doing everything manually...
577 c.color.red = color.r;
578 c.color.green = color.g;
579 c.color.blue = color.b;
580 c.color.alpha = color.a;
581
582 c.pixel = ((color.r * format->direct.redMask / rgba::MAX_CC) << format->direct.red )
583 | ((color.g * format->direct.greenMask / rgba::MAX_CC) << format->direct.green)
584 | ((color.b * format->direct.blueMask / rgba::MAX_CC) << format->direct.blue )
585 | ((color.a * format->direct.alphaMask / rgba::MAX_CC) << format->direct.alpha);
586
587 return true;
588 }
589 else
590 {
591 XRenderColor d;
592
593 d.red = color.r;
594 d.green = color.g;
595 d.blue = color.b;
596 d.alpha = color.a;
597
598 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
599 }
600#else
601 if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
602 {
603 c.red = color.g;
604 c.green = color.g;
605 c.blue = color.g;
606 c.pixel = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask ))
607 / rgba::MAX_CC) << ctz (screen->visual->red_mask )
608 | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask))
609 / rgba::MAX_CC) << ctz (screen->visual->green_mask)
610 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
611 / rgba::MAX_CC) << ctz (screen->visual->blue_mask );
612
613 return true;
614 }
615 else
616 {
617 c.red = color.r;
618 c.green = color.g;
619 c.blue = color.b;
620
621 if (XAllocColor (screen->xdisp, screen->cmap, &c))
622 return true;
623 else
624 c.pixel = (color.r + color.g + color.b) > 128*3
625 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp))
626 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp));
627 }
628#endif
629
630 return false;
631}
632
538bool 633bool
539rxvt_color::set (rxvt_screen *screen, const char *name) 634rxvt_color::set (rxvt_screen *screen, const char *name)
540{ 635{
636 rgba c;
637 char eos;
638 int skip;
639
640 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
641 {
642 printf ("X %d\n", c.a);
643 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a);
644 name += skip;
645 printf ("y %04x\n", c.a);
646 }
647 else
648 c.a = rgba::MAX_CC;
649
650 // parse the non-standard rgba 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))
652 {
653 XColor xc, xc_exact;
654
655 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
656 {
657 c.r = xc.red;
658 c.g = xc.green;
659 c.b = xc.blue;
660 }
661 else
662 {
663 c.r = 0xffff;
664 c.g = 0x6969;
665 c.b = 0xb4b4;
666
667 rxvt_warn ("unable to parse color '%s', using pink instead.\n", name);
668 }
669 }
670
671 return set (screen, c);
672}
673
674bool
675rxvt_color::set (rxvt_screen *screen, const rgba &color)
676{
677 bool got = alloc (screen, color);
678
679#if !ENABLE_MINIMAL
680 int cmap_size = screen->visual->map_entries;
681
682 if (!got
683 && screen->visual->c_class == PseudoColor
684 && cmap_size < 4096)
685 {
686 XColor *colors = new XColor [screen->visual->map_entries];
687
688 for (int i = 0; i < cmap_size; i++)
689 colors [i].pixel = i;
690
691 // many kilobytes transfer per colour, but pseudocolor isn't worth
692 // many extra optimisations.
693 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size);
694
695 int diff = 0x7fffffffUL;
696 XColor *best = colors;
697
698 for (int i = 0; i < cmap_size; i++)
699 {
700 int d = (squared_diff<int> (color.r >> 2, colors [i].red >> 2))
701 + (squared_diff<int> (color.g >> 2, colors [i].green >> 2))
702 + (squared_diff<int> (color.b >> 2, colors [i].blue >> 2));
703
704 if (d < diff)
705 {
706 diff = d;
707 best = colors + i;
708 }
709 }
710
711 //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);
713
714 got = alloc (screen, rgba (best->red, best->green, best->blue));
715
716 delete colors;
717 }
718#endif
719
720 return got;
721}
722
723void
724rxvt_color::get (rxvt_screen *screen, rgba &color)
725{
541#if XFT 726#if XFT
542 int l = strlen (name); 727 color.r = c.color.red;
543 rxvt_rgba r; 728 color.g = c.color.green;
544 char eos; 729 color.b = c.color.blue;
545 int mult; 730 color.a = c.color.alpha;
546
547 if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
548 mult = rxvt_rgba::MAX_CC / 0x000f;
549 else if (l == 1+4*2 && 4 == sscanf (name, "#%2hx%2hx%2hx%2hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
550 mult = rxvt_rgba::MAX_CC / 0x00ff;
551 else if (l == 1+4*4 && 4 == sscanf (name, "#%4hx%4hx%4hx%4hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
552 mult = rxvt_rgba::MAX_CC / 0xffff;
553 else if (l == 4+5*4 && 4 == sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &r.r, &r.g, &r.b, &r.a, &eos))
554 mult = rxvt_rgba::MAX_CC / 0xffff;
555 else
556 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
557
558 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
559 return set (screen, r);
560#else 731#else
561 XColor xc;
562
563 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
564 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
565
566 return false;
567#endif
568}
569
570bool
571rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
572{
573#if XFT
574 XRenderColor d;
575
576 d.red = rgba.r;
577 d.green = rgba.g;
578 d.blue = rgba.b;
579 d.alpha = rgba.a;
580
581 if (XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c))
582 {
583 // FUCKING Xft gets it wrong, of course, fix it for the common case
584 // transparency users should eat shit and die, and then
585 // XRenderQueryPictIndexValues themselves plenty.
586 if (screen->depth == 32 && screen->visual->c_class == TrueColor)
587 if ((screen->visual->red_mask | screen->visual->green_mask | screen->visual->blue_mask) == 0x00ffffffUL)
588 c.pixel = c.pixel & 0x00ffffffUL | ((rgba.a >> 8) << 24);
589 else if ((screen->visual->red_mask | screen->visual->green_mask | screen->visual->blue_mask) == 0xffffff00UL)
590 c.pixel = c.pixel & 0xffffff00UL | (rgba.a >> 8);
591
592 return true;
593 }
594
595 return false;
596#else
597 XColor xc;
598
599 xc.red = rgba.r;
600 xc.green = rgba.g;
601 xc.blue = rgba.b;
602 xc.flags = DoRed | DoGreen | DoBlue;
603
604 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
605 {
606 p = xc.pixel;
607 return true;
608 }
609
610 return false;
611#endif
612}
613
614void
615rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
616{
617#if XFT
618 rgba.r = c.color.red;
619 rgba.g = c.color.green;
620 rgba.b = c.color.blue;
621 rgba.a = c.color.alpha;
622#else
623 XColor c;
624
625 c.pixel = p;
626 XQueryColor (screen->xdisp, screen->cmap, &c);
627
628 rgba.r = c.red; 732 color.r = c.red;
629 rgba.g = c.green; 733 color.g = c.green;
630 rgba.b = c.blue; 734 color.b = c.blue;
631 rgba.a = rxvt_rgba::MAX_CC; 735 color.a = rgba::MAX_CC;
632#endif 736#endif
633} 737}
634 738
635void 739void
636rxvt_color::free (rxvt_screen *screen) 740rxvt_color::free (rxvt_screen *screen)
637{ 741{
638#if XFT 742#if XFT
639 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 743 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
640#else 744#else
641 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 745 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes);
642#endif 746#endif
643} 747}
644 748
645rxvt_color 749void
646rxvt_color::fade (rxvt_screen *screen, int percent) 750rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
647{ 751{
648 rxvt_color faded;
649
650 rxvt_rgba c; 752 rgba c;
651 get (screen, c); 753 get (screen, c);
652 754
653 c.r = lerp (0, c.r, percent); 755 result.set (
654 c.g = lerp (0, c.g, percent);
655 c.b = lerp (0, c.b, percent);
656
657 faded.set (screen, c);
658
659 return faded;
660}
661
662rxvt_color
663rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
664{
665 rxvt_rgba c, fc;
666 rxvt_color faded;
667
668 get (screen, c);
669 fadeto.get (screen, fc);
670
671 faded.set (
672 screen, 756 screen,
673 rxvt_rgba ( 757 rgba (
674 lerp (fc.r, c.r, percent), 758 lerp (c.r, to.r, percent),
675 lerp (fc.g, c.g, percent), 759 lerp (c.g, to.g, percent),
676 lerp (fc.b, c.b, percent), 760 lerp (c.b, to.b, percent),
677 lerp (fc.a, c.a, percent) 761 lerp (c.a, to.a, percent)
678 ) 762 )
679 ); 763 );
680
681 return faded;
682} 764}
683 765

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines