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.23 by root, Wed Jan 11 00:59:58 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
41const char *const xa_names[] =
42{
43 "TEXT",
44 "COMPOUND_TEXT",
45 "UTF8_STRING",
46 "MULTIPLE",
47 "TARGETS",
48 "TIMESTAMP",
49 "VT_SELECTION",
50 "INCR",
51 "WM_PROTOCOLS",
52 "WM_DELETE_WINDOW",
53 "CLIPBOARD",
54 "AVERAGE_WIDTH",
55 "WEIGHT_NAME",
56 "SLANT",
57 "CHARSET_REGISTRY",
58 "CHARSET_ENCODING",
59#if ENABLE_FRILLS
60 "_MOTIF_WM_HINTS",
61#endif
62#if ENABLE_EWMH
63 "_NET_WM_PID",
64 "_NET_WM_NAME",
65 "_NET_WM_ICON_NAME",
66 "_NET_WM_PING",
67#endif
68#if USE_XIM
69 "WM_LOCALE_NAME",
70 "XIM_SERVERS",
71#endif
72#ifdef TRANSPARENT
73 "_XROOTPMAP_ID",
74 "ESETROOT_PMAP_ID",
75#endif
76#if ENABLE_XEMBED
77 "_XEMBED",
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#endif
87};
88
89/////////////////////////////////////////////////////////////////////////////
90
37refcounted::refcounted (const char *id) 91refcounted::refcounted (const char *id)
38{ 92{
39 this->id = strdup (id); 93 this->id = strdup (id);
40} 94}
41 95
93} 147}
94 148
95///////////////////////////////////////////////////////////////////////////// 149/////////////////////////////////////////////////////////////////////////////
96 150
97#ifdef USE_XIM 151#ifdef USE_XIM
152
98static void 153static void
99#if XIMCB_PROTO_BROKEN 154#if XIMCB_PROTO_BROKEN
100im_destroy_cb (XIC unused1, XPointer client_data, XPointer unused3) 155im_destroy_cb (XIC unused1, XPointer client_data, XPointer unused3)
101#else 156#else
102im_destroy_cb (XIM unused1, XPointer client_data, XPointer unused3) 157im_destroy_cb (XIM unused1, XPointer client_data, XPointer unused3)
133rxvt_xim::~rxvt_xim () 188rxvt_xim::~rxvt_xim ()
134{ 189{
135 if (xim) 190 if (xim)
136 XCloseIM (xim); 191 XCloseIM (xim);
137} 192}
193
138#endif 194#endif
195
196/////////////////////////////////////////////////////////////////////////////
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}
139 234
140///////////////////////////////////////////////////////////////////////////// 235/////////////////////////////////////////////////////////////////////////////
141 236
142rxvt_display::rxvt_display (const char *id) 237rxvt_display::rxvt_display (const char *id)
143: refcounted (id) 238: refcounted (id)
247 if (!display) 342 if (!display)
248 return false; 343 return false;
249 344
250 screen = DefaultScreen (display); 345 screen = DefaultScreen (display);
251 root = DefaultRootWindow (display); 346 root = DefaultRootWindow (display);
252 visual = DefaultVisual (display, screen); 347
253 cmap = DefaultColormap (display, screen); 348 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
254 depth = DefaultDepth (display, screen); 349 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa);
255 350
256 XrmSetDatabase (display, get_resources ()); 351 XrmSetDatabase (display, get_resources ());
257 352
258#ifdef POINTER_BLANK 353#ifdef POINTER_BLANK
259 XColor blackcolour; 354 XColor blackcolour;
264 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 359 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ',
265 &blackcolour, &blackcolour); 360 &blackcolour, &blackcolour);
266 XUnloadFont (display, f); 361 XUnloadFont (display, f);
267#endif 362#endif
268 363
269#ifdef PREFER_24BIT
270 /*
271 * If depth is not 24, look for a 24bit visual.
272 */
273 if (depth != 24)
274 {
275 XVisualInfo vinfo;
276
277 if (XMatchVisualInfo (display, screen, 24, TrueColor, &vinfo))
278 {
279 depth = 24;
280 visual = vinfo.visual;
281 cmap = XCreateColormap (display,
282 RootWindow (display, screen),
283 visual, AllocNone);
284 }
285 }
286#endif
287
288 int fd = XConnectionNumber (display); 364 int fd = XConnectionNumber (display);
289 365
290#ifndef NO_SLOW_LINK_SUPPORT 366#ifndef NO_SLOW_LINK_SUPPORT
291 // try to detect wether we have a local connection. 367 // try to detect wether we have a local connection.
292 // assume unix domains socket == local, everything else not 368 // assume unix domains socket == local, everything else not
301 377
302 x_ev.start (fd, EVENT_READ); 378 x_ev.start (fd, EVENT_READ);
303 fcntl (fd, F_SETFD, FD_CLOEXEC); 379 fcntl (fd, F_SETFD, FD_CLOEXEC);
304 380
305 XSelectInput (display, root, PropertyChangeMask); 381 XSelectInput (display, root, PropertyChangeMask);
306#ifdef USE_XIM
307 xa_xim_servers = XInternAtom (display, "XIM_SERVERS", 0);
308#endif
309 382
310 flush (); 383 flush ();
311 384
312 return true; 385 return true;
313} 386}
349 // registers, as xlib crashes due to a race otherwise. 422 // registers, as xlib crashes due to a race otherwise.
350 Atom actual_type, *atoms; 423 Atom actual_type, *atoms;
351 int actual_format; 424 int actual_format;
352 unsigned long nitems, bytes_after; 425 unsigned long nitems, bytes_after;
353 426
354 if (XGetWindowProperty (display, root, xa_xim_servers, 0L, 1000000L, 427 if (XGetWindowProperty (display, root, xa[XA_XIM_SERVERS], 0L, 1000000L,
355 False, XA_ATOM, &actual_type, &actual_format, 428 False, XA_ATOM, &actual_type, &actual_format,
356 &nitems, &bytes_after, (unsigned char **)&atoms) 429 &nitems, &bytes_after, (unsigned char **)&atoms)
357 != Success ) 430 != Success )
358 return; 431 return;
359 432
379#ifdef USE_XIM 452#ifdef USE_XIM
380 if (!XFilterEvent (&xev, None)) 453 if (!XFilterEvent (&xev, None))
381 { 454 {
382 if (xev.type == PropertyNotify 455 if (xev.type == PropertyNotify
383 && xev.xany.window == root 456 && xev.xany.window == root
384 && xev.xproperty.atom == xa_xim_servers) 457 && xev.xproperty.atom == xa[XA_XIM_SERVERS])
385 im_change_check (); 458 im_change_check ();
386#endif 459#endif
387 for (int i = xw.size (); i--; ) 460 for (int i = xw.size (); i--; )
388 { 461 {
389 if (!xw[i]) 462 if (!xw[i])
479refcache<rxvt_display> displays; 552refcache<rxvt_display> displays;
480 553
481///////////////////////////////////////////////////////////////////////////// 554/////////////////////////////////////////////////////////////////////////////
482 555
483bool 556bool
484rxvt_color::set (rxvt_display *display, Pixel p) 557rxvt_color::set (rxvt_screen *screen, const char *name)
485{ 558{
486#if XFT 559#if XFT
487 XColor xc; 560 int l = strlen (name);
561 rxvt_rgba r;
562 char eos;
563 int mult;
488 564
489 xc.pixel = p; 565 // shortcutting this saves countless server RTTs for the built-in colours
490 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))
491 return false; 567 {
568 r.a = rxvt_rgba::MAX_CC;
569 mult = rxvt_rgba::MAX_CC / 0x00ff;
570 }
492 571
493 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;
494 581
495 d.red = xc.red; 582 // slow case: server round trip
496 d.green = xc.green; 583 else
497 d.blue = xc.blue; 584 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
498 d.alpha = 0xffff;
499 585
500 return 586 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
501 XftColorAllocValue (display->display,
502 display->visual,
503 display->cmap,
504 &d, &c);
505#else
506 this->p = p;
507#endif
508 587
509 return true; 588 return set (screen, r);
510}
511
512bool
513rxvt_color::set (rxvt_display *display, const char *name)
514{
515#if XFT
516 return XftColorAllocName (display->display, display->visual, display->cmap,
517 name, &c);
518#else 589#else
519 XColor xc; 590 XColor xc;
520 591
521 if (XParseColor (display->display, display->cmap, name, &xc)) 592 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
522 return set (display, xc.red, xc.green, xc.blue); 593 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
523 594
524 return false; 595 return false;
525#endif 596#endif
526} 597}
527 598
528bool 599bool
529rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 600rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
530{ 601{
531 XColor xc; 602#if XFT
603 XRenderPictFormat *format;
532 604
533 xc.red = cr; 605 // FUCKING Xft gets it wrong, of course, so work around it
534 xc.green = cg; 606 // transparency users should eat shit and die, and then
535 xc.blue = cb; 607 // XRenderQueryPictIndexValues themselves plenty.
536 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;
537 616
538 if (XAllocColor (display->display, display->cmap, &xc)) 617 c.pixel = ((rgba.r * format->direct.redMask / rxvt_rgba::MAX_CC) << format->direct.red )
539 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 }
540 635
541 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
542} 667}
543 668
544void 669void
545rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 670rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
546{ 671{
547#if XFT 672#if XFT
548 cr = c.color.red; 673 rgba.r = c.color.red;
549 cg = c.color.green; 674 rgba.g = c.color.green;
550 cb = c.color.blue; 675 rgba.b = c.color.blue;
676 rgba.a = c.color.alpha;
551#else 677#else
552 XColor c; 678 XColor c;
553 679
554 c.pixel = p; 680 c.pixel = p;
555 XQueryColor (display->display, display->cmap, &c); 681 XQueryColor (screen->xdisp, screen->cmap, &c);
556 682
557 cr = c.red; 683 rgba.r = c.red;
558 cg = c.green; 684 rgba.g = c.green;
559 cb = c.blue; 685 rgba.b = c.blue;
686 rgba.a = rxvt_rgba::MAX_CC;
560#endif 687#endif
561} 688}
562 689
563void 690void
564rxvt_color::free (rxvt_display *display) 691rxvt_color::free (rxvt_screen *screen)
565{ 692{
566#if XFT 693#if XFT
567 XftColorFree (display->display, display->visual, display->cmap, &c); 694 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
568#else 695#else
569 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 696 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
570#endif 697#endif
571} 698}
572 699
573rxvt_color 700rxvt_color
574rxvt_color::fade (rxvt_display *display, int percent) 701rxvt_color::fade (rxvt_screen *screen, int percent)
575{ 702{
576 percent = 100 - percent;
577
578 unsigned short cr, cg, cb;
579 rxvt_color faded; 703 rxvt_color faded;
580 704
581 get (display, cr, cg, cb); 705 rxvt_rgba c;
706 get (screen, c);
582 707
583 faded.set ( 708 c.r = lerp (0, c.r, percent);
584 display, 709 c.g = lerp (0, c.g, percent);
585 cr * percent / 100, 710 c.b = lerp (0, c.b, percent);
586 cg * percent / 100, 711
587 cb * percent / 100 712 faded.set (screen, c);
588 );
589 713
590 return faded; 714 return faded;
591} 715}
592 716
593#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
594
595rxvt_color 717rxvt_color
596rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 718rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
597{ 719{
598 percent = 100 - percent; 720 rxvt_rgba c, fc;
599
600 unsigned short cr, cg, cb;
601 unsigned short fcr, fcg, fcb;
602 rxvt_color faded; 721 rxvt_color faded;
603 722
604 get (display, cr, cg, cb); 723 get (screen, c);
605 fadeto.get(display, fcr, fcg, fcb); 724 fadeto.get (screen, fc);
606 725
607 faded.set ( 726 faded.set (
608 display, 727 screen,
728 rxvt_rgba (
609 LERP (cr, fcr, percent), 729 lerp (fc.r, c.r, percent),
610 LERP (cg, fcg, percent), 730 lerp (fc.g, c.g, percent),
611 LERP (cb, fcb, percent) 731 lerp (fc.b, c.b, percent),
732 lerp (fc.a, c.a, percent)
733 )
612 ); 734 );
613 735
614 return faded; 736 return faded;
615} 737}
616 738

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines