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.33 by root, Sun Jan 29 22:39:26 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#if ENABLE_FRILLS
55 "_MOTIF_WM_HINTS",
56#endif
57#if ENABLE_EWMH
58 "_NET_WM_PID",
59 "_NET_WM_NAME",
60 "_NET_WM_ICON_NAME",
61 "_NET_WM_PING",
62#endif
63#if USE_XIM
64 "WM_LOCALE_NAME",
65 "XIM_SERVERS",
66#endif
67#ifdef TRANSPARENT
68 "_XROOTPMAP_ID",
69 "ESETROOT_PMAP_ID",
70#endif
71#if ENABLE_XEMBED
72 "_XEMBED",
73 "_XEMBED_INFO",
74#endif
75 };
76
77/////////////////////////////////////////////////////////////////////////////
78
37refcounted::refcounted (const char *id) 79refcounted::refcounted (const char *id)
38{ 80{
39 this->id = strdup (id); 81 this->id = strdup (id);
40} 82}
41 83
93} 135}
94 136
95///////////////////////////////////////////////////////////////////////////// 137/////////////////////////////////////////////////////////////////////////////
96 138
97#ifdef USE_XIM 139#ifdef USE_XIM
140
98static void 141static void
99#if XIMCB_PROTO_BROKEN 142#if XIMCB_PROTO_BROKEN
100im_destroy_cb (XIC unused1, XPointer client_data, XPointer unused3) 143im_destroy_cb (XIC unused1, XPointer client_data, XPointer unused3)
101#else 144#else
102im_destroy_cb (XIM unused1, XPointer client_data, XPointer unused3) 145im_destroy_cb (XIM unused1, XPointer client_data, XPointer unused3)
133rxvt_xim::~rxvt_xim () 176rxvt_xim::~rxvt_xim ()
134{ 177{
135 if (xim) 178 if (xim)
136 XCloseIM (xim); 179 XCloseIM (xim);
137} 180}
181
138#endif 182#endif
183
184/////////////////////////////////////////////////////////////////////////////
185
186void
187rxvt_screen::set (rxvt_display *disp)
188{
189 display = disp;
190 xdisp = disp->display;
191
192 Screen *screen = ScreenOfDisplay (xdisp, disp->screen);
193
194 depth = DefaultDepthOfScreen (screen);
195 visual = DefaultVisualOfScreen (screen);
196 cmap = DefaultColormapOfScreen (screen);
197}
198
199void
200rxvt_screen::set (rxvt_display *disp, int bitdepth)
201{
202 set (disp);
203
204#if XFT
205 XVisualInfo vinfo;
206
207 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo))
208 {
209 depth = bitdepth;
210 visual = vinfo.visual;
211 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone);
212 }
213#endif
214}
215
216void
217rxvt_screen::clear ()
218{
219 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (xdisp, display->screen)))
220 XFreeColormap (xdisp, cmap);
221}
139 222
140///////////////////////////////////////////////////////////////////////////// 223/////////////////////////////////////////////////////////////////////////////
141 224
142rxvt_display::rxvt_display (const char *id) 225rxvt_display::rxvt_display (const char *id)
143: refcounted (id) 226: refcounted (id)
247 if (!display) 330 if (!display)
248 return false; 331 return false;
249 332
250 screen = DefaultScreen (display); 333 screen = DefaultScreen (display);
251 root = DefaultRootWindow (display); 334 root = DefaultRootWindow (display);
252 visual = DefaultVisual (display, screen); 335
253 cmap = DefaultColormap (display, screen); 336 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
254 depth = DefaultDepth (display, screen); 337 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa);
255 338
256 XrmSetDatabase (display, get_resources ()); 339 XrmSetDatabase (display, get_resources ());
257 340
258#ifdef POINTER_BLANK 341#ifdef POINTER_BLANK
259 XColor blackcolour; 342 XColor blackcolour;
264 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 347 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ',
265 &blackcolour, &blackcolour); 348 &blackcolour, &blackcolour);
266 XUnloadFont (display, f); 349 XUnloadFont (display, f);
267#endif 350#endif
268 351
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); 352 int fd = XConnectionNumber (display);
289 353
290#ifndef NO_SLOW_LINK_SUPPORT 354#ifndef NO_SLOW_LINK_SUPPORT
291 // try to detect wether we have a local connection. 355 // try to detect wether we have a local connection.
292 // assume unix domains socket == local, everything else not 356 // assume unix domains socket == local, everything else not
301 365
302 x_ev.start (fd, EVENT_READ); 366 x_ev.start (fd, EVENT_READ);
303 fcntl (fd, F_SETFD, FD_CLOEXEC); 367 fcntl (fd, F_SETFD, FD_CLOEXEC);
304 368
305 XSelectInput (display, root, PropertyChangeMask); 369 XSelectInput (display, root, PropertyChangeMask);
306#ifdef USE_XIM
307 xa_xim_servers = XInternAtom (display, "XIM_SERVERS", 0);
308#endif
309 370
310 flush (); 371 flush ();
311 372
312 return true; 373 return true;
313} 374}
349 // registers, as xlib crashes due to a race otherwise. 410 // registers, as xlib crashes due to a race otherwise.
350 Atom actual_type, *atoms; 411 Atom actual_type, *atoms;
351 int actual_format; 412 int actual_format;
352 unsigned long nitems, bytes_after; 413 unsigned long nitems, bytes_after;
353 414
354 if (XGetWindowProperty (display, root, xa_xim_servers, 0L, 1000000L, 415 if (XGetWindowProperty (display, root, xa[XA_XIM_SERVERS], 0L, 1000000L,
355 False, XA_ATOM, &actual_type, &actual_format, 416 False, XA_ATOM, &actual_type, &actual_format,
356 &nitems, &bytes_after, (unsigned char **)&atoms) 417 &nitems, &bytes_after, (unsigned char **)&atoms)
357 != Success ) 418 != Success )
358 return; 419 return;
359 420
379#ifdef USE_XIM 440#ifdef USE_XIM
380 if (!XFilterEvent (&xev, None)) 441 if (!XFilterEvent (&xev, None))
381 { 442 {
382 if (xev.type == PropertyNotify 443 if (xev.type == PropertyNotify
383 && xev.xany.window == root 444 && xev.xany.window == root
384 && xev.xproperty.atom == xa_xim_servers) 445 && xev.xproperty.atom == xa[XA_XIM_SERVERS])
385 im_change_check (); 446 im_change_check ();
386#endif 447#endif
387 for (int i = xw.size (); i--; ) 448 for (int i = xw.size (); i--; )
388 { 449 {
389 if (!xw[i]) 450 if (!xw[i])
479refcache<rxvt_display> displays; 540refcache<rxvt_display> displays;
480 541
481///////////////////////////////////////////////////////////////////////////// 542/////////////////////////////////////////////////////////////////////////////
482 543
483bool 544bool
484rxvt_color::set (rxvt_display *display, Pixel p) 545rxvt_color::set (rxvt_screen *screen, const char *name)
485{ 546{
486#if XFT 547#if XFT
487 XColor xc; 548 int l = strlen (name);
549 rxvt_rgba r;
550 char eos;
551 int mult;
488 552
489 xc.pixel = p; 553 if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
490 if (!XQueryColor (display->display, display->cmap, &xc)) 554 mult = rxvt_rgba::MAX_CC / 0x000f;
491 return false; 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);
492 563
493 XRenderColor d; 564 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
494 565 return set (screen, r);
495 d.red = xc.red;
496 d.green = xc.green;
497 d.blue = xc.blue;
498 d.alpha = 0xffff;
499
500 return
501 XftColorAllocValue (display->display,
502 display->visual,
503 display->cmap,
504 &d, &c);
505#else
506 this->p = p;
507#endif
508
509 return true;
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 566#else
519 XColor xc; 567 XColor xc;
520 568
521 if (XParseColor (display->display, display->cmap, name, &xc)) 569 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
522 return set (display, xc.red, xc.green, xc.blue); 570 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
523 571
524 return false; 572 return false;
525#endif 573#endif
526} 574}
527 575
528bool 576bool
529rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 577rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
530{ 578{
579#if XFT
580 XRenderPictFormat *format;
581
582 // FUCKING Xft gets it wrong, of course, so work around it
583 // transparency users should eat shit and die, and then
584 // XRenderQueryPictIndexValues themselves plenty.
585 if (screen->visual->c_class == TrueColor
586 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual)))
587 {
588 // the fun lies in doing everything manually...
589 c.color.red = rgba.r;
590 c.color.green = rgba.g;
591 c.color.blue = rgba.b;
592 c.color.alpha = rgba.a;
593
594 c.pixel = ((rgba.r * format->direct.redMask / rxvt_rgba::MAX_CC) << format->direct.red )
595 | ((rgba.g * format->direct.greenMask / rxvt_rgba::MAX_CC) << format->direct.green)
596 | ((rgba.b * format->direct.blueMask / rxvt_rgba::MAX_CC) << format->direct.blue )
597 | ((rgba.a * format->direct.alphaMask / rxvt_rgba::MAX_CC) << format->direct.alpha);
598
599 return true;
600 }
601 else
602 {
603 XRenderColor d;
604
605 d.red = rgba.r;
606 d.green = rgba.g;
607 d.blue = rgba.b;
608 d.alpha = rgba.a;
609
610 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c);
611 }
612
613 return false;
614#else
531 XColor xc; 615 XColor xc;
532 616
533 xc.red = cr; 617 xc.red = rgba.r;
534 xc.green = cg; 618 xc.green = rgba.g;
535 xc.blue = cb; 619 xc.blue = rgba.b;
536 xc.flags = DoRed | DoGreen | DoBlue; 620 xc.flags = DoRed | DoGreen | DoBlue;
537 621
538 if (XAllocColor (display->display, display->cmap, &xc)) 622 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
539 return set (display, xc.pixel); 623 {
624 p = xc.pixel;
625 return true;
626 }
540 627
541 return false; 628 return false;
629#endif
542} 630}
543 631
544void 632void
545rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 633rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
546{ 634{
547#if XFT 635#if XFT
548 cr = c.color.red; 636 rgba.r = c.color.red;
549 cg = c.color.green; 637 rgba.g = c.color.green;
550 cb = c.color.blue; 638 rgba.b = c.color.blue;
639 rgba.a = c.color.alpha;
551#else 640#else
552 XColor c; 641 XColor c;
553 642
554 c.pixel = p; 643 c.pixel = p;
555 XQueryColor (display->display, display->cmap, &c); 644 XQueryColor (screen->xdisp, screen->cmap, &c);
556 645
557 cr = c.red; 646 rgba.r = c.red;
558 cg = c.green; 647 rgba.g = c.green;
559 cb = c.blue; 648 rgba.b = c.blue;
649 rgba.a = rxvt_rgba::MAX_CC;
560#endif 650#endif
561} 651}
562 652
563void 653void
564rxvt_color::free (rxvt_display *display) 654rxvt_color::free (rxvt_screen *screen)
565{ 655{
566#if XFT 656#if XFT
567 XftColorFree (display->display, display->visual, display->cmap, &c); 657 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
568#else 658#else
569 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 659 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
570#endif 660#endif
571} 661}
572 662
573rxvt_color 663rxvt_color
574rxvt_color::fade (rxvt_display *display, int percent) 664rxvt_color::fade (rxvt_screen *screen, int percent)
575{ 665{
576 percent = 100 - percent;
577
578 unsigned short cr, cg, cb;
579 rxvt_color faded; 666 rxvt_color faded;
580 667
581 get (display, cr, cg, cb); 668 rxvt_rgba c;
669 get (screen, c);
582 670
583 faded.set ( 671 c.r = lerp (0, c.r, percent);
584 display, 672 c.g = lerp (0, c.g, percent);
585 cr * percent / 100, 673 c.b = lerp (0, c.b, percent);
586 cg * percent / 100, 674
587 cb * percent / 100 675 faded.set (screen, c);
588 );
589 676
590 return faded; 677 return faded;
591} 678}
592 679
593#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
594
595rxvt_color 680rxvt_color
596rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 681rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
597{ 682{
598 percent = 100 - percent; 683 rxvt_rgba c, fc;
599
600 unsigned short cr, cg, cb;
601 unsigned short fcr, fcg, fcb;
602 rxvt_color faded; 684 rxvt_color faded;
603 685
604 get (display, cr, cg, cb); 686 get (screen, c);
605 fadeto.get(display, fcr, fcg, fcb); 687 fadeto.get (screen, fc);
606 688
607 faded.set ( 689 faded.set (
608 display, 690 screen,
691 rxvt_rgba (
609 LERP (cr, fcr, percent), 692 lerp (fc.r, c.r, percent),
610 LERP (cg, fcg, percent), 693 lerp (fc.g, c.g, percent),
611 LERP (cb, fcb, percent) 694 lerp (fc.b, c.b, percent),
695 lerp (fc.a, c.a, percent)
696 )
612 ); 697 );
613 698
614 return faded; 699 return faded;
615} 700}
616 701

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines