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.31 by root, Sun Jan 29 22:27:04 2006 UTC vs.
Revision 1.46 by root, Wed Feb 1 18:36:48 2006 UTC

37#if XFT 37#if XFT
38# include <X11/extensions/Xrender.h> 38# include <X11/extensions/Xrender.h>
39#endif 39#endif
40 40
41const char *const xa_names[] = 41const char *const xa_names[] =
42 { 42{
43 "TEXT", 43 "TEXT",
44 "COMPOUND_TEXT", 44 "COMPOUND_TEXT",
45 "UTF8_STRING", 45 "UTF8_STRING",
46 "MULTIPLE", 46 "MULTIPLE",
47 "TARGETS", 47 "TARGETS",
48 "TIMESTAMP", 48 "TIMESTAMP",
49 "VT_SELECTION", 49 "VT_SELECTION",
50 "INCR", 50 "INCR",
51 "WM_PROTOCOLS", 51 "WM_PROTOCOLS",
52 "WM_DELETE_WINDOW", 52 "WM_DELETE_WINDOW",
53 "CLIPBOARD", 53 "CLIPBOARD",
54 "AVERAGE_WIDTH",
55 "WEIGHT_NAME",
56 "SLANT",
57 "CHARSET_REGISTRY",
58 "CHARSET_ENCODING",
54#if ENABLE_FRILLS 59#if ENABLE_FRILLS
55 "_MOTIF_WM_HINTS", 60 "_MOTIF_WM_HINTS",
56#endif 61#endif
57#if ENABLE_EWMH 62#if ENABLE_EWMH
58 "_NET_WM_PID", 63 "_NET_WM_PID",
59 "_NET_WM_NAME", 64 "_NET_WM_NAME",
60 "_NET_WM_ICON_NAME", 65 "_NET_WM_ICON_NAME",
61 "_NET_WM_PING", 66 "_NET_WM_PING",
62#endif 67#endif
63#if USE_XIM 68#if USE_XIM
64 "WM_LOCALE_NAME", 69 "WM_LOCALE_NAME",
65 "XIM_SERVERS", 70 "XIM_SERVERS",
66#endif 71#endif
67#ifdef TRANSPARENT 72#ifdef TRANSPARENT
68 "_XROOTPMAP_ID", 73 "_XROOTPMAP_ID",
69 "ESETROOT_PMAP_ID", 74 "ESETROOT_PMAP_ID",
70#endif 75#endif
71#if ENABLE_XEMBED 76#if ENABLE_XEMBED
72 "_XEMBED", 77 "_XEMBED",
73 "_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",
74#endif 93# endif
75 }; 94#endif
95};
76 96
77///////////////////////////////////////////////////////////////////////////// 97/////////////////////////////////////////////////////////////////////////////
78 98
79refcounted::refcounted (const char *id) 99refcounted::refcounted (const char *id)
80{ 100{
375 395
376void 396void
377rxvt_display::ref_next () 397rxvt_display::ref_next ()
378{ 398{
379 // TODO: somehow check wether the database files/resources changed 399 // TODO: somehow check wether the database files/resources changed
380 // before re-loading/parsing 400 // before affording re-loading/parsing
381 XrmDestroyDatabase (XrmGetDatabase (display)); 401 XrmDestroyDatabase (XrmGetDatabase (display));
382 XrmSetDatabase (display, get_resources ()); 402 XrmSetDatabase (display, get_resources ());
403 printf ("next\n");//D
383} 404}
384 405
385rxvt_display::~rxvt_display () 406rxvt_display::~rxvt_display ()
386{ 407{
387 if (!display) 408 if (!display)
488 509
489 selection_owner = owner; 510 selection_owner = owner;
490} 511}
491 512
492#ifdef USE_XIM 513#ifdef USE_XIM
514
493void rxvt_display::reg (im_watcher *w) 515void rxvt_display::reg (im_watcher *w)
494{ 516{
495 imw.push_back (w); 517 imw.push_back (w);
496} 518}
497 519
521 return xim; 543 return xim;
522} 544}
523 545
524void rxvt_display::put_xim (rxvt_xim *xim) 546void rxvt_display::put_xim (rxvt_xim *xim)
525{ 547{
526#if XLIB_IS_RACEFREE 548# if XLIB_IS_RACEFREE
527 xims.put (xim); 549 xims.put (xim);
528#endif 550# endif
529} 551}
552
530#endif 553#endif
531 554
532Atom rxvt_display::atom (const char *name) 555Atom rxvt_display::atom (const char *name)
533{ 556{
534 return XInternAtom (display, name, False); 557 return XInternAtom (display, name, False);
538 561
539template class refcache<rxvt_display>; 562template class refcache<rxvt_display>;
540refcache<rxvt_display> displays; 563refcache<rxvt_display> displays;
541 564
542///////////////////////////////////////////////////////////////////////////// 565/////////////////////////////////////////////////////////////////////////////
543 566
544bool 567bool
545rxvt_color::set (rxvt_screen *screen, const char *name) 568rxvt_color::alloc (rxvt_screen *screen, const rgba &color)
546{
547#if XFT
548 int l = strlen (name);
549 rxvt_rgba r;
550 char eos;
551 int mult;
552
553 if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
554 mult = rxvt_rgba::MAX_CC / 0x000f;
555 else if (l == 1+4*2 && 4 == sscanf (name, "#%2hx%2hx%2hx%2hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
556 mult = rxvt_rgba::MAX_CC / 0x00ff;
557 else if (l == 1+4*4 && 4 == sscanf (name, "#%4hx%4hx%4hx%4hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
558 mult = rxvt_rgba::MAX_CC / 0xffff;
559 else if (l == 4+5*4 && 4 == sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &r.r, &r.g, &r.b, &r.a, &eos))
560 mult = rxvt_rgba::MAX_CC / 0xffff;
561 else
562 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
563
564 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
565 return set (screen, r);
566#else
567 XColor xc;
568
569 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
570 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
571
572 return false;
573#endif
574}
575
576bool
577rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
578{ 569{
579#if XFT 570#if XFT
580 XRenderPictFormat *format; 571 XRenderPictFormat *format;
581 572
582 // FUCKING Xft gets it wrong, of course, so work around it 573 // FUCKING Xft gets it wrong, of course, so work around it
583 // transparency users should eat shit and die, and then 574 // transparency users should eat shit and die, and then
584 // XRenderQueryPictIndexValues themselves plenty. 575 // XRenderQueryPictIndexValues themselves plenty.
585 if (screen->visual->c_class == TrueColor 576 if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
586 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) 577 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual)))
587 { 578 {
588 // the fun lies in doing everything manually... 579 // the fun lies in doing everything manually...
589 c.color.red = rgba.r; 580 c.color.red = color.r;
590 c.color.green = rgba.g; 581 c.color.green = color.g;
591 c.color.blue = rgba.b; 582 c.color.blue = color.b;
592 c.color.alpha = rgba.a; 583 c.color.alpha = color.a;
593 584
594 c.pixel = (rgba.r >> (16 - popcount (format->direct.redMask )) << format->direct.red) 585 c.pixel = ((color.r * format->direct.redMask / rgba::MAX_CC) << format->direct.red )
595 | (rgba.g >> (16 - popcount (format->direct.greenMask)) << format->direct.green) 586 | ((color.g * format->direct.greenMask / rgba::MAX_CC) << format->direct.green)
596 | (rgba.b >> (16 - popcount (format->direct.blueMask )) << format->direct.blue) 587 | ((color.b * format->direct.blueMask / rgba::MAX_CC) << format->direct.blue )
597 | (rgba.a >> (16 - popcount (format->direct.alphaMask)) << format->direct.alpha); 588 | ((color.a * format->direct.alphaMask / rgba::MAX_CC) << format->direct.alpha);
598 589
599 return true; 590 return true;
600 } 591 }
601 else 592 else
602 { 593 {
603 XRenderColor d; 594 XRenderColor d;
604 595
605 d.red = rgba.r; 596 d.red = color.r;
606 d.green = rgba.g; 597 d.green = color.g;
607 d.blue = rgba.b; 598 d.blue = color.b;
608 d.alpha = rgba.a; 599 d.alpha = color.a;
609 600
610 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); 601 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
611 } 602 }
603#else
604 c.red = color.r;
605 c.green = color.g;
606 c.blue = color.b;
607
608 if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
609 {
610 c.pixel = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask ))
611 / rgba::MAX_CC) << ctz (screen->visual->red_mask )
612 | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask))
613 / rgba::MAX_CC) << ctz (screen->visual->green_mask)
614 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
615 / rgba::MAX_CC) << ctz (screen->visual->blue_mask );
616
617 return true;
618 }
619 else if (XAllocColor (screen->xdisp, screen->cmap, &c))
620 return true;
621 else
622 c.pixel = (color.r + color.g + color.b) > 128*3
623 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp))
624 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp));
625#endif
612 626
613 return false; 627 return false;
628}
629
630bool
631rxvt_color::set (rxvt_screen *screen, const char *name)
632{
633 rgba c;
634 char eos;
635 int skip;
636
637 // parse the nonstandard "[alphapercent]" prefix
638 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
639 {
640 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a);
641 name += skip;
642 }
643 else
644 c.a = rgba::MAX_CC;
645
646 // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format
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))
648 {
649 XColor xc, xc_exact;
650
651 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
652 {
653 c.r = xc.red;
654 c.g = xc.green;
655 c.b = xc.blue;
656 }
657 else
658 {
659 c.r = 0xffff;
660 c.g = 0x6969;
661 c.b = 0xb4b4;
662
663 rxvt_warn ("unable to parse color '%s', using pink instead.\n", name);
664 }
665 }
666
667 return set (screen, c);
668}
669
670bool
671rxvt_color::set (rxvt_screen *screen, const rgba &color)
672{
673 bool got = alloc (screen, color);
674
675#if !ENABLE_MINIMAL
676 int cmap_size = screen->visual->map_entries;
677
678 if (!got
679 && screen->visual->c_class == PseudoColor
680 && cmap_size < 4096)
681 {
682 XColor *colors = new XColor [screen->visual->map_entries];
683
684 for (int i = 0; i < cmap_size; i++)
685 colors [i].pixel = i;
686
687 // many kilobytes transfer per colour, but pseudocolor isn't worth
688 // many extra optimisations.
689 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size);
690
691 int diff = 0x7fffffffUL;
692 XColor *best = colors;
693
694 for (int i = 0; i < cmap_size; i++)
695 {
696 int d = (squared_diff<int> (color.r >> 2, colors [i].red >> 2))
697 + (squared_diff<int> (color.g >> 2, colors [i].green >> 2))
698 + (squared_diff<int> (color.b >> 2, colors [i].blue >> 2));
699
700 if (d < diff)
701 {
702 diff = d;
703 best = colors + i;
704 }
705 }
706
707 //rxvt_warn ("could not allocate %04x %04x %04x, getting %04x %04x %04x instead (%d)\n",
708 // color.r, color.g, color.b, best->red, best->green, best->blue, diff);
709
710 got = alloc (screen, rgba (best->red, best->green, best->blue));
711
712 delete colors;
713 }
714#endif
715
716 return got;
717}
718
719void
720rxvt_color::get (rgba &color)
721{
722#if XFT
723 color.r = c.color.red;
724 color.g = c.color.green;
725 color.b = c.color.blue;
726 color.a = c.color.alpha;
614#else 727#else
615 XColor xc; 728 color.r = c.red;
616 729 color.g = c.green;
617 xc.red = rgba.r; 730 color.b = c.blue;
618 xc.green = rgba.g; 731 color.a = rgba::MAX_CC;
619 xc.blue = rgba.b;
620 xc.flags = DoRed | DoGreen | DoBlue;
621
622 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
623 {
624 p = xc.pixel;
625 return true;
626 }
627
628 return false;
629#endif 732#endif
630} 733}
631 734
632void 735void
633rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba) 736rxvt_color::get (XColor &color)
634{ 737{
635#if XFT 738 rgba c;
636 rgba.r = c.color.red; 739 get (c);
637 rgba.g = c.color.green;
638 rgba.b = c.color.blue;
639 rgba.a = c.color.alpha;
640#else
641 XColor c;
642 740
643 c.pixel = p; 741 color.red = c.r;
644 XQueryColor (screen->xdisp, screen->cmap, &c); 742 color.green = c.g;
645 743 color.blue = c.b;
646 rgba.r = c.red; 744 color.pixel = (Pixel)*this;
647 rgba.g = c.green;
648 rgba.b = c.blue;
649 rgba.a = rxvt_rgba::MAX_CC;
650#endif
651} 745}
652 746
653void 747void
654rxvt_color::free (rxvt_screen *screen) 748rxvt_color::free (rxvt_screen *screen)
655{ 749{
656#if XFT 750#if XFT
657 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 751 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
658#else 752#else
659 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 753 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes);
660#endif 754#endif
661} 755}
662 756
663rxvt_color 757void
664rxvt_color::fade (rxvt_screen *screen, int percent)
665{
666 rxvt_color faded;
667
668 rxvt_rgba c;
669 get (screen, c);
670
671 c.r = lerp (0, c.r, percent);
672 c.g = lerp (0, c.g, percent);
673 c.b = lerp (0, c.b, percent);
674
675 faded.set (screen, c);
676
677 return faded;
678}
679
680rxvt_color
681rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto) 758rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
682{ 759{
683 rxvt_rgba c, fc; 760 rgba c;
684 rxvt_color faded; 761 get (c);
685
686 get (screen, c);
687 fadeto.get (screen, fc);
688 762
689 faded.set ( 763 result.set (
690 screen, 764 screen,
691 rxvt_rgba ( 765 rgba (
692 lerp (fc.r, c.r, percent), 766 lerp (c.r, to.r, percent),
693 lerp (fc.g, c.g, percent), 767 lerp (c.g, to.g, percent),
694 lerp (fc.b, c.b, percent), 768 lerp (c.b, to.b, percent),
695 lerp (fc.a, c.a, percent) 769 lerp (c.a, to.a, percent)
696 ) 770 )
697 ); 771 );
698
699 return faded;
700} 772}
701 773

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines