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.25 by root, Wed Jan 25 02:42:06 2006 UTC vs.
Revision 1.36 by root, Mon Jan 30 17:43:20 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",
70#endif 79#endif
71 }; 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#endif
87};
72 88
73///////////////////////////////////////////////////////////////////////////// 89/////////////////////////////////////////////////////////////////////////////
74 90
75refcounted::refcounted (const char *id) 91refcounted::refcounted (const char *id)
76{ 92{
177 193
178#endif 194#endif
179 195
180///////////////////////////////////////////////////////////////////////////// 196/////////////////////////////////////////////////////////////////////////////
181 197
198void
199rxvt_screen::set (rxvt_display *disp)
200{
201 display = disp;
202 xdisp = disp->display;
203
204 Screen *screen = ScreenOfDisplay (xdisp, disp->screen);
205
206 depth = DefaultDepthOfScreen (screen);
207 visual = DefaultVisualOfScreen (screen);
208 cmap = DefaultColormapOfScreen (screen);
209}
210
211void
212rxvt_screen::set (rxvt_display *disp, int bitdepth)
213{
214 set (disp);
215
216#if XFT
217 XVisualInfo vinfo;
218
219 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo))
220 {
221 depth = bitdepth;
222 visual = vinfo.visual;
223 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone);
224 }
225#endif
226}
227
228void
229rxvt_screen::clear ()
230{
231 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (xdisp, display->screen)))
232 XFreeColormap (xdisp, cmap);
233}
234
235/////////////////////////////////////////////////////////////////////////////
236
182rxvt_display::rxvt_display (const char *id) 237rxvt_display::rxvt_display (const char *id)
183: refcounted (id) 238: refcounted (id)
184, x_ev (this, &rxvt_display::x_cb) 239, x_ev (this, &rxvt_display::x_cb)
185, selection_owner (0) 240, selection_owner (0)
186{ 241{
287 if (!display) 342 if (!display)
288 return false; 343 return false;
289 344
290 screen = DefaultScreen (display); 345 screen = DefaultScreen (display);
291 root = DefaultRootWindow (display); 346 root = DefaultRootWindow (display);
292 visual = DefaultVisual (display, screen);
293 cmap = DefaultColormap (display, screen);
294 depth = DefaultDepth (display, screen);
295 347
296 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA); 348 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
297 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa); 349 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa);
298 350
299 XrmSetDatabase (display, get_resources ()); 351 XrmSetDatabase (display, get_resources ());
307 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 359 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ',
308 &blackcolour, &blackcolour); 360 &blackcolour, &blackcolour);
309 XUnloadFont (display, f); 361 XUnloadFont (display, f);
310#endif 362#endif
311 363
312#ifdef PREFER_24BIT
313 /*
314 * If depth is not 24, look for a 24bit visual.
315 */
316 if (depth != 24)
317 {
318 XVisualInfo vinfo;
319
320 if (XMatchVisualInfo (display, screen, 24, TrueColor, &vinfo))
321 {
322 depth = 24;
323 visual = vinfo.visual;
324 cmap = XCreateColormap (display,
325 RootWindow (display, screen),
326 visual, AllocNone);
327 }
328 }
329#endif
330
331 int fd = XConnectionNumber (display); 364 int fd = XConnectionNumber (display);
332 365
333#ifndef NO_SLOW_LINK_SUPPORT 366#ifndef NO_SLOW_LINK_SUPPORT
334 // try to detect wether we have a local connection. 367 // try to detect wether we have a local connection.
335 // assume unix domains socket == local, everything else not 368 // assume unix domains socket == local, everything else not
519refcache<rxvt_display> displays; 552refcache<rxvt_display> displays;
520 553
521///////////////////////////////////////////////////////////////////////////// 554/////////////////////////////////////////////////////////////////////////////
522 555
523bool 556bool
524rxvt_color::set (rxvt_display *display, Pixel p) 557rxvt_color::set (rxvt_screen *screen, const char *name)
525{ 558{
526#if XFT 559#if XFT
527 XColor xc; 560 int l = strlen (name);
561 rxvt_rgba r;
562 char eos;
563 int mult;
528 564
529 xc.pixel = p; 565 // shortcutting this saves countless server RTTs for the built-in colours
530 if (!XQueryColor (display->display, display->cmap, &xc)) 566 if (l == 3+3*3 && 3 == sscanf (name, "rgb:%hx/%hx/%hx/%hx%c", &r.r, &r.g, &r.b, &r.a, &eos))
531 return false; 567 {
568 r.a = rxvt_rgba::MAX_CC;
569 mult = rxvt_rgba::MAX_CC / 0x00ff;
570 }
532 571
533 XRenderColor d; 572 // parse a number of non-standard ARGB colour specifications
573 else if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
574 mult = rxvt_rgba::MAX_CC / 0x000f;
575 else if (l == 1+4*2 && 4 == sscanf (name, "#%2hx%2hx%2hx%2hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
576 mult = rxvt_rgba::MAX_CC / 0x00ff;
577 else if (l == 1+4*4 && 4 == sscanf (name, "#%4hx%4hx%4hx%4hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
578 mult = rxvt_rgba::MAX_CC / 0xffff;
579 else if (l == 4+5*4 && 4 == sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &r.r, &r.g, &r.b, &r.a, &eos))
580 mult = rxvt_rgba::MAX_CC / 0xffff;
534 581
535 d.red = xc.red; 582 // slow case: server round trip
536 d.green = xc.green; 583 else
537 d.blue = xc.blue; 584 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
538 d.alpha = 0xffff;
539 585
540 return 586 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
541 XftColorAllocValue (display->display,
542 display->visual,
543 display->cmap,
544 &d, &c);
545#else
546 this->p = p;
547#endif
548 587
549 return true; 588 return set (screen, r);
550}
551
552bool
553rxvt_color::set (rxvt_display *display, const char *name)
554{
555#if XFT
556 return XftColorAllocName (display->display, display->visual, display->cmap,
557 name, &c);
558#else 589#else
559 XColor xc; 590 XColor xc;
560 591
561 if (XParseColor (display->display, display->cmap, name, &xc)) 592 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
562 return set (display, xc.red, xc.green, xc.blue); 593 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
563 594
564 return false; 595 return false;
565#endif 596#endif
566} 597}
567 598
568bool 599bool
569rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 600rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
570{ 601{
571 XColor xc; 602#if XFT
603 XRenderPictFormat *format;
572 604
573 xc.red = cr; 605 // FUCKING Xft gets it wrong, of course, so work around it
574 xc.green = cg; 606 // transparency users should eat shit and die, and then
575 xc.blue = cb; 607 // XRenderQueryPictIndexValues themselves plenty.
576 xc.flags = DoRed | DoGreen | DoBlue; 608 if (screen->visual->c_class == TrueColor
609 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual)))
610 {
611 // the fun lies in doing everything manually...
612 c.color.red = rgba.r;
613 c.color.green = rgba.g;
614 c.color.blue = rgba.b;
615 c.color.alpha = rgba.a;
577 616
578 if (XAllocColor (display->display, display->cmap, &xc)) 617 c.pixel = ((rgba.r * format->direct.redMask / rxvt_rgba::MAX_CC) << format->direct.red )
579 return set (display, xc.pixel); 618 | ((rgba.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green)
619 | ((rgba.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue )
620 | ((rgba.a * format->direct.alphaMask / rxvt_rgba::MAX_CC) << format->direct.alpha);
621
622 return true;
623 }
624 else
625 {
626 XRenderColor d;
627
628 d.red = rgba.r;
629 d.green = rgba.g;
630 d.blue = rgba.b;
631 d.alpha = rgba.a;
632
633 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
634 }
580 635
581 return false; 636 return false;
637#else
638 if (screen->visual->c_class == TrueColor)
639 {
640 p = ((rgba.r * ((1 << screen->visual->bits_per_rgb) - 1)
641 / rxvt_rgba::MAX_CC) << ctz (screen->visual->red_mask ))
642 | ((rgba.g * ((1 << screen->visual->bits_per_rgb) - 1)
643 / rxvt_rgba::MAX_CC) << ctz (screen->visual->green_mask))
644 | ((rgba.b * ((1 << screen->visual->bits_per_rgb) - 1)
645 / rxvt_rgba::MAX_CC) << ctz (screen->visual->blue_mask ));
646
647 return true;
648 }
649 else
650 {
651 XColor xc;
652
653 xc.red = rgba.r;
654 xc.green = rgba.g;
655 xc.blue = rgba.b;
656 xc.flags = DoRed | DoGreen | DoBlue;
657
658 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
659 {
660 p = xc.pixel;
661 return true;
662 }
663 }
664
665 return false;
666#endif
582} 667}
583 668
584void 669void
585rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 670rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
586{ 671{
587#if XFT 672#if XFT
588 cr = c.color.red; 673 rgba.r = c.color.red;
589 cg = c.color.green; 674 rgba.g = c.color.green;
590 cb = c.color.blue; 675 rgba.b = c.color.blue;
676 rgba.a = c.color.alpha;
591#else 677#else
592 XColor c; 678 XColor c;
593 679
594 c.pixel = p; 680 c.pixel = p;
595 XQueryColor (display->display, display->cmap, &c); 681 XQueryColor (screen->xdisp, screen->cmap, &c);
596 682
597 cr = c.red; 683 rgba.r = c.red;
598 cg = c.green; 684 rgba.g = c.green;
599 cb = c.blue; 685 rgba.b = c.blue;
686 rgba.a = rxvt_rgba::MAX_CC;
600#endif 687#endif
601} 688}
602 689
603void 690void
604rxvt_color::free (rxvt_display *display) 691rxvt_color::free (rxvt_screen *screen)
605{ 692{
606#if XFT 693#if XFT
607 XftColorFree (display->display, display->visual, display->cmap, &c); 694 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
608#else 695#else
609 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 696 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
610#endif 697#endif
611} 698}
612 699
613rxvt_color 700rxvt_color
614rxvt_color::fade (rxvt_display *display, int percent) 701rxvt_color::fade (rxvt_screen *screen, int percent)
615{ 702{
616 percent = 100 - percent;
617
618 unsigned short cr, cg, cb;
619 rxvt_color faded; 703 rxvt_color faded;
620 704
621 get (display, cr, cg, cb); 705 rxvt_rgba c;
706 get (screen, c);
622 707
623 faded.set ( 708 c.r = lerp (0, c.r, percent);
624 display, 709 c.g = lerp (0, c.g, percent);
625 cr * percent / 100, 710 c.b = lerp (0, c.b, percent);
626 cg * percent / 100, 711
627 cb * percent / 100 712 faded.set (screen, c);
628 );
629 713
630 return faded; 714 return faded;
631} 715}
632 716
633#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
634
635rxvt_color 717rxvt_color
636rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 718rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
637{ 719{
638 percent = 100 - percent; 720 rxvt_rgba c, fc;
639
640 unsigned short cr, cg, cb;
641 unsigned short fcr, fcg, fcb;
642 rxvt_color faded; 721 rxvt_color faded;
643 722
644 get (display, cr, cg, cb); 723 get (screen, c);
645 fadeto.get(display, fcr, fcg, fcb); 724 fadeto.get (screen, fc);
646 725
647 faded.set ( 726 faded.set (
648 display, 727 screen,
728 rxvt_rgba (
649 LERP (cr, fcr, percent), 729 lerp (fc.r, c.r, percent),
650 LERP (cg, fcg, percent), 730 lerp (fc.g, c.g, percent),
651 LERP (cb, fcb, percent) 731 lerp (fc.b, c.b, percent),
732 lerp (fc.a, c.a, percent)
733 )
652 ); 734 );
653 735
654 return faded; 736 return faded;
655} 737}
656 738

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines