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.46 by root, Wed Feb 1 18:36:48 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{
369 395
370void 396void
371rxvt_display::ref_next () 397rxvt_display::ref_next ()
372{ 398{
373 // TODO: somehow check wether the database files/resources changed 399 // TODO: somehow check wether the database files/resources changed
374 // before re-loading/parsing 400 // before affording re-loading/parsing
375 XrmDestroyDatabase (XrmGetDatabase (display)); 401 XrmDestroyDatabase (XrmGetDatabase (display));
376 XrmSetDatabase (display, get_resources ()); 402 XrmSetDatabase (display, get_resources ());
403 printf ("next\n");//D
377} 404}
378 405
379rxvt_display::~rxvt_display () 406rxvt_display::~rxvt_display ()
380{ 407{
381 if (!display) 408 if (!display)
482 509
483 selection_owner = owner; 510 selection_owner = owner;
484} 511}
485 512
486#ifdef USE_XIM 513#ifdef USE_XIM
514
487void rxvt_display::reg (im_watcher *w) 515void rxvt_display::reg (im_watcher *w)
488{ 516{
489 imw.push_back (w); 517 imw.push_back (w);
490} 518}
491 519
515 return xim; 543 return xim;
516} 544}
517 545
518void rxvt_display::put_xim (rxvt_xim *xim) 546void rxvt_display::put_xim (rxvt_xim *xim)
519{ 547{
520#if XLIB_IS_RACEFREE 548# if XLIB_IS_RACEFREE
521 xims.put (xim); 549 xims.put (xim);
522#endif 550# endif
523} 551}
552
524#endif 553#endif
525 554
526Atom rxvt_display::atom (const char *name) 555Atom rxvt_display::atom (const char *name)
527{ 556{
528 return XInternAtom (display, name, False); 557 return XInternAtom (display, name, False);
532 561
533template class refcache<rxvt_display>; 562template class refcache<rxvt_display>;
534refcache<rxvt_display> displays; 563refcache<rxvt_display> displays;
535 564
536///////////////////////////////////////////////////////////////////////////// 565/////////////////////////////////////////////////////////////////////////////
537 566
567bool
568rxvt_color::alloc (rxvt_screen *screen, const rgba &color)
569{
570#if XFT
571 XRenderPictFormat *format;
572
573 // FUCKING Xft gets it wrong, of course, so work around it
574 // transparency users should eat shit and die, and then
575 // XRenderQueryPictIndexValues themselves plenty.
576 if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
577 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual)))
578 {
579 // the fun lies in doing everything manually...
580 c.color.red = color.r;
581 c.color.green = color.g;
582 c.color.blue = color.b;
583 c.color.alpha = color.a;
584
585 c.pixel = ((color.r * format->direct.redMask / rgba::MAX_CC) << format->direct.red )
586 | ((color.g * format->direct.greenMask / rgba::MAX_CC) << format->direct.green)
587 | ((color.b * format->direct.blueMask / rgba::MAX_CC) << format->direct.blue )
588 | ((color.a * format->direct.alphaMask / rgba::MAX_CC) << format->direct.alpha);
589
590 return true;
591 }
592 else
593 {
594 XRenderColor d;
595
596 d.red = color.r;
597 d.green = color.g;
598 d.blue = color.b;
599 d.alpha = color.a;
600
601 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
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
626
627 return false;
628}
629
538bool 630bool
539rxvt_color::set (rxvt_screen *screen, const char *name) 631rxvt_color::set (rxvt_screen *screen, const char *name)
540{ 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{
541#if XFT 722#if XFT
542 int l = strlen (name); 723 color.r = c.color.red;
543 rxvt_rgba r; 724 color.g = c.color.green;
544 char eos; 725 color.b = c.color.blue;
545 int mult; 726 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 727#else
559 XColor xc; 728 color.r = c.red;
560 729 color.g = c.green;
561 if (XParseColor (screen->xdisp, screen->cmap, name, &xc)) 730 color.b = c.blue;
562 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue)); 731 color.a = rgba::MAX_CC;
563
564 return false;
565#endif 732#endif
566} 733}
567 734
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 735void
599rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba) 736rxvt_color::get (XColor &color)
600{ 737{
601#if XFT 738 rgba c;
602 rgba.r = c.color.red; 739 get (c);
603 rgba.g = c.color.green;
604 rgba.b = c.color.blue;
605 rgba.a = c.color.alpha;
606#else
607 XColor c;
608 740
609 c.pixel = p; 741 color.red = c.r;
610 XQueryColor (screen->xdisp, screen->cmap, &c); 742 color.green = c.g;
611 743 color.blue = c.b;
612 rgba.r = c.red; 744 color.pixel = (Pixel)*this;
613 rgba.g = c.green;
614 rgba.b = c.blue;
615 rgba.a = rxvt_rgba::MAX_CC;
616#endif
617} 745}
618 746
619void 747void
620rxvt_color::free (rxvt_screen *screen) 748rxvt_color::free (rxvt_screen *screen)
621{ 749{
622#if XFT 750#if XFT
623 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 751 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
624#else 752#else
625 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes); 753 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes);
626#endif 754#endif
627} 755}
628 756
629rxvt_color 757void
630rxvt_color::fade (rxvt_screen *screen, int percent)
631{
632 rxvt_color faded;
633
634 rxvt_rgba c;
635 get (screen, c);
636
637 c.r = lerp (0, c.r, percent);
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) 758rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
648{ 759{
649 rxvt_rgba c, fc; 760 rgba c;
650 rxvt_color faded; 761 get (c);
651
652 get (screen, c);
653 fadeto.get (screen, fc);
654 762
655 faded.set ( 763 result.set (
656 screen, 764 screen,
657 rxvt_rgba ( 765 rgba (
658 lerp (fc.r, c.r, percent), 766 lerp (c.r, to.r, percent),
659 lerp (fc.g, c.g, percent), 767 lerp (c.g, to.g, percent),
660 lerp (fc.b, c.b, percent), 768 lerp (c.b, to.b, percent),
661 lerp (fc.a, c.a, percent) 769 lerp (c.a, to.a, percent)
662 ) 770 )
663 ); 771 );
664
665 return faded;
666} 772}
667 773

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines