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.28 by root, Sun Jan 29 20:51:28 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 = 0x1111;
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 = 0x0101;
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 = 0x0001;
553 else
554 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
555
556 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
557 return set (screen, r);
558#else 731#else
559 XColor xc;
560
561 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
562 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
563
564 return false;
565#endif
566}
567
568bool
569rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
570{
571#if XFT
572 XRenderColor d;
573
574 d.red = rgba.r;
575 d.green = rgba.g;
576 d.blue = rgba.b;
577 d.alpha = rgba.a;
578
579 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
580#else
581 XColor xc;
582
583 xc.red = rgba.r;
584 xc.green = rgba.g;
585 xc.blue = rgba.b;
586 xc.flags = DoRed | DoGreen | DoBlue;
587
588 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
589 {
590 p = xc.pixel;
591 return true;
592 }
593
594 return false;
595#endif
596}
597
598void
599rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
600{
601#if XFT
602 rgba.r = c.color.red;
603 rgba.g = c.color.green;
604 rgba.b = c.color.blue;
605 rgba.a = c.color.alpha;
606#else
607 XColor c;
608
609 c.pixel = p;
610 XQueryColor (screen->xdisp, screen->cmap, &c);
611
612 rgba.r = c.red; 732 color.r = c.red;
613 rgba.g = c.green; 733 color.g = c.green;
614 rgba.b = c.blue; 734 color.b = c.blue;
615 rgba.a = rxvt_rgba::MAX_CC; 735 color.a = rgba::MAX_CC;
616#endif 736#endif
617} 737}
618 738
619void 739void
620rxvt_color::free (rxvt_screen *screen) 740rxvt_color::free (rxvt_screen *screen)
621{ 741{
622#if XFT 742#if XFT
623 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 743 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
624#else 744#else
625 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 745 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes);
626#endif 746#endif
627} 747}
628 748
629rxvt_color 749void
630rxvt_color::fade (rxvt_screen *screen, int percent) 750rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
631{ 751{
632 rxvt_color faded;
633
634 rxvt_rgba c; 752 rgba c;
635 get (screen, c); 753 get (screen, c);
636 754
637 c.r = lerp (0, c.r, percent); 755 result.set (
638 c.g = lerp (0, c.g, percent);
639 c.b = lerp (0, c.b, percent);
640
641 faded.set (screen, c);
642
643 return faded;
644}
645
646rxvt_color
647rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
648{
649 rxvt_rgba c, fc;
650 rxvt_color faded;
651
652 get (screen, c);
653 fadeto.get (screen, fc);
654
655 faded.set (
656 screen, 756 screen,
657 rxvt_rgba ( 757 rgba (
658 lerp (fc.r, c.r, percent), 758 lerp (c.r, to.r, percent),
659 lerp (fc.g, c.g, percent), 759 lerp (c.g, to.g, percent),
660 lerp (fc.b, c.b, percent), 760 lerp (c.b, to.b, percent),
661 lerp (fc.a, c.a, percent) 761 lerp (c.a, to.a, percent)
662 ) 762 )
663 ); 763 );
664
665 return faded;
666} 764}
667 765

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines