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.24 by root, Wed Jan 25 00:42:21 2006 UTC vs.
Revision 1.30 by root, Sun Jan 29 21:54:33 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
37const char *const xa_names[] =
38 {
39 "TEXT",
40 "COMPOUND_TEXT",
41 "UTF8_STRING",
42 "MULTIPLE",
43 "TARGETS",
44 "TIMESTAMP",
45 "VT_SELECTION",
46 "INCR",
47 "WM_PROTOCOLS",
48 "WM_DELETE_WINDOW",
49 "CLIPBOARD",
50#if ENABLE_FRILLS
51 "_MOTIF_WM_HINTS",
52#endif
53#if ENABLE_EWMH
54 "_NET_WM_PID",
55 "_NET_WM_NAME",
56 "_NET_WM_ICON_NAME",
57 "_NET_WM_PING",
58#endif
59#if USE_XIM
60 "WM_LOCALE_NAME",
61 "XIM_SERVERS",
62#endif
63#ifdef TRANSPARENT
64 "_XROOTPMAP_ID",
65 "ESETROOT_PMAP_ID",
66#endif
67#if ENABLE_XEMBED
68 "_XEMBED",
69 "_XEMBED_INFO",
70#endif
71 };
72
73/////////////////////////////////////////////////////////////////////////////
74
37refcounted::refcounted (const char *id) 75refcounted::refcounted (const char *id)
38{ 76{
39 this->id = strdup (id); 77 this->id = strdup (id);
40} 78}
41 79
139 177
140#endif 178#endif
141 179
142///////////////////////////////////////////////////////////////////////////// 180/////////////////////////////////////////////////////////////////////////////
143 181
182void
183rxvt_screen::set (rxvt_display *disp)
184{
185 display = disp;
186 xdisp = disp->display;
187
188 Screen *screen = ScreenOfDisplay (xdisp, disp->screen);
189
190 depth = DefaultDepthOfScreen (screen);
191 visual = DefaultVisualOfScreen (screen);
192 cmap = DefaultColormapOfScreen (screen);
193}
194
195void
196rxvt_screen::set (rxvt_display *disp, int bitdepth)
197{
198 set (disp);
199
200 XVisualInfo vinfo;
201
202 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo))
203 {
204 depth = bitdepth;
205 visual = vinfo.visual;
206 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone);
207 }
208}
209
210void
211rxvt_screen::clear ()
212{
213 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (xdisp, display->screen)))
214 XFreeColormap (xdisp, cmap);
215}
216
217/////////////////////////////////////////////////////////////////////////////
218
144rxvt_display::rxvt_display (const char *id) 219rxvt_display::rxvt_display (const char *id)
145: refcounted (id) 220: refcounted (id)
146, x_ev (this, &rxvt_display::x_cb) 221, x_ev (this, &rxvt_display::x_cb)
147, selection_owner (0) 222, selection_owner (0)
148{ 223{
249 if (!display) 324 if (!display)
250 return false; 325 return false;
251 326
252 screen = DefaultScreen (display); 327 screen = DefaultScreen (display);
253 root = DefaultRootWindow (display); 328 root = DefaultRootWindow (display);
254 visual = DefaultVisual (display, screen); 329
255 cmap = DefaultColormap (display, screen); 330 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
256 depth = DefaultDepth (display, screen); 331 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa);
257 332
258 XrmSetDatabase (display, get_resources ()); 333 XrmSetDatabase (display, get_resources ());
259 334
260#ifdef POINTER_BLANK 335#ifdef POINTER_BLANK
261 XColor blackcolour; 336 XColor blackcolour;
266 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 341 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ',
267 &blackcolour, &blackcolour); 342 &blackcolour, &blackcolour);
268 XUnloadFont (display, f); 343 XUnloadFont (display, f);
269#endif 344#endif
270 345
271#ifdef PREFER_24BIT
272 /*
273 * If depth is not 24, look for a 24bit visual.
274 */
275 if (depth != 24)
276 {
277 XVisualInfo vinfo;
278
279 if (XMatchVisualInfo (display, screen, 24, TrueColor, &vinfo))
280 {
281 depth = 24;
282 visual = vinfo.visual;
283 cmap = XCreateColormap (display,
284 RootWindow (display, screen),
285 visual, AllocNone);
286 }
287 }
288#endif
289
290 int fd = XConnectionNumber (display); 346 int fd = XConnectionNumber (display);
291 347
292#ifndef NO_SLOW_LINK_SUPPORT 348#ifndef NO_SLOW_LINK_SUPPORT
293 // try to detect wether we have a local connection. 349 // try to detect wether we have a local connection.
294 // assume unix domains socket == local, everything else not 350 // assume unix domains socket == local, everything else not
303 359
304 x_ev.start (fd, EVENT_READ); 360 x_ev.start (fd, EVENT_READ);
305 fcntl (fd, F_SETFD, FD_CLOEXEC); 361 fcntl (fd, F_SETFD, FD_CLOEXEC);
306 362
307 XSelectInput (display, root, PropertyChangeMask); 363 XSelectInput (display, root, PropertyChangeMask);
308#ifdef USE_XIM
309 xa_xim_servers = XInternAtom (display, "XIM_SERVERS", 0);
310#endif
311 364
312 flush (); 365 flush ();
313 366
314 return true; 367 return true;
315} 368}
351 // registers, as xlib crashes due to a race otherwise. 404 // registers, as xlib crashes due to a race otherwise.
352 Atom actual_type, *atoms; 405 Atom actual_type, *atoms;
353 int actual_format; 406 int actual_format;
354 unsigned long nitems, bytes_after; 407 unsigned long nitems, bytes_after;
355 408
356 if (XGetWindowProperty (display, root, xa_xim_servers, 0L, 1000000L, 409 if (XGetWindowProperty (display, root, xa[XA_XIM_SERVERS], 0L, 1000000L,
357 False, XA_ATOM, &actual_type, &actual_format, 410 False, XA_ATOM, &actual_type, &actual_format,
358 &nitems, &bytes_after, (unsigned char **)&atoms) 411 &nitems, &bytes_after, (unsigned char **)&atoms)
359 != Success ) 412 != Success )
360 return; 413 return;
361 414
381#ifdef USE_XIM 434#ifdef USE_XIM
382 if (!XFilterEvent (&xev, None)) 435 if (!XFilterEvent (&xev, None))
383 { 436 {
384 if (xev.type == PropertyNotify 437 if (xev.type == PropertyNotify
385 && xev.xany.window == root 438 && xev.xany.window == root
386 && xev.xproperty.atom == xa_xim_servers) 439 && xev.xproperty.atom == xa[XA_XIM_SERVERS])
387 im_change_check (); 440 im_change_check ();
388#endif 441#endif
389 for (int i = xw.size (); i--; ) 442 for (int i = xw.size (); i--; )
390 { 443 {
391 if (!xw[i]) 444 if (!xw[i])
481refcache<rxvt_display> displays; 534refcache<rxvt_display> displays;
482 535
483///////////////////////////////////////////////////////////////////////////// 536/////////////////////////////////////////////////////////////////////////////
484 537
485bool 538bool
486rxvt_color::set (rxvt_display *display, Pixel p) 539rxvt_color::set (rxvt_screen *screen, const char *name)
487{ 540{
488#if XFT 541#if XFT
489 XColor xc; 542 int l = strlen (name);
543 rxvt_rgba r;
544 char eos;
545 int mult;
490 546
491 xc.pixel = p; 547 if ( l == 1+4*1 && 4 == sscanf (name, "#%1hx%1hx%1hx%1hx%c", &r.a, &r.r, &r.g, &r.b, &eos))
492 if (!XQueryColor (display->display, display->cmap, &xc)) 548 mult = rxvt_rgba::MAX_CC / 0x000f;
493 return false; 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 = rxvt_rgba::MAX_CC / 0x00ff;
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 = rxvt_rgba::MAX_CC / 0xffff;
553 else if (l == 4+5*4 && 4 == sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &r.r, &r.g, &r.b, &r.a, &eos))
554 mult = rxvt_rgba::MAX_CC / 0xffff;
555 else
556 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
494 557
495 XRenderColor d; 558 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
496 559 return set (screen, r);
497 d.red = xc.red;
498 d.green = xc.green;
499 d.blue = xc.blue;
500 d.alpha = 0xffff;
501
502 return
503 XftColorAllocValue (display->display,
504 display->visual,
505 display->cmap,
506 &d, &c);
507#else
508 this->p = p;
509#endif
510
511 return true;
512}
513
514bool
515rxvt_color::set (rxvt_display *display, const char *name)
516{
517#if XFT
518 return XftColorAllocName (display->display, display->visual, display->cmap,
519 name, &c);
520#else 560#else
521 XColor xc; 561 XColor xc;
522 562
523 if (XParseColor (display->display, display->cmap, name, &xc)) 563 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
524 return set (display, xc.red, xc.green, xc.blue); 564 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
525 565
526 return false; 566 return false;
527#endif 567#endif
528} 568}
529 569
530bool 570bool
531rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 571rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
532{ 572{
573#if XFT
574 XRenderColor d;
575
576 d.red = rgba.r;
577 d.green = rgba.g;
578 d.blue = rgba.b;
579 d.alpha = rgba.a;
580
581 if (XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c))
582 {
583 // FUCKING Xft gets it wrong, of course, fix it for the common case
584 // transparency users should eat shit and die, and then
585 // XRenderQueryPictIndexValues themselves plenty.
586 if (screen->depth == 32 && screen->visual->c_class == TrueColor)
587 if ((screen->visual->red_mask | screen->visual->green_mask | screen->visual->blue_mask) == 0x00ffffffUL)
588 c.pixel = c.pixel & 0x00ffffffUL | ((rgba.a >> 8) << 24);
589 else if ((screen->visual->red_mask | screen->visual->green_mask | screen->visual->blue_mask) == 0xffffff00UL)
590 c.pixel = c.pixel & 0xffffff00UL | (rgba.a >> 8);
591
592 return true;
593 }
594
595 return false;
596#else
533 XColor xc; 597 XColor xc;
534 598
535 xc.red = cr; 599 xc.red = rgba.r;
536 xc.green = cg; 600 xc.green = rgba.g;
537 xc.blue = cb; 601 xc.blue = rgba.b;
538 xc.flags = DoRed | DoGreen | DoBlue; 602 xc.flags = DoRed | DoGreen | DoBlue;
539 603
540 if (XAllocColor (display->display, display->cmap, &xc)) 604 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
541 return set (display, xc.pixel); 605 {
606 p = xc.pixel;
607 return true;
608 }
542 609
543 return false; 610 return false;
611#endif
544} 612}
545 613
546void 614void
547rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 615rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
548{ 616{
549#if XFT 617#if XFT
550 cr = c.color.red; 618 rgba.r = c.color.red;
551 cg = c.color.green; 619 rgba.g = c.color.green;
552 cb = c.color.blue; 620 rgba.b = c.color.blue;
621 rgba.a = c.color.alpha;
553#else 622#else
554 XColor c; 623 XColor c;
555 624
556 c.pixel = p; 625 c.pixel = p;
557 XQueryColor (display->display, display->cmap, &c); 626 XQueryColor (screen->xdisp, screen->cmap, &c);
558 627
559 cr = c.red; 628 rgba.r = c.red;
560 cg = c.green; 629 rgba.g = c.green;
561 cb = c.blue; 630 rgba.b = c.blue;
631 rgba.a = rxvt_rgba::MAX_CC;
562#endif 632#endif
563} 633}
564 634
565void 635void
566rxvt_color::free (rxvt_display *display) 636rxvt_color::free (rxvt_screen *screen)
567{ 637{
568#if XFT 638#if XFT
569 XftColorFree (display->display, display->visual, display->cmap, &c); 639 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
570#else 640#else
571 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 641 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
572#endif 642#endif
573} 643}
574 644
575rxvt_color 645rxvt_color
576rxvt_color::fade (rxvt_display *display, int percent) 646rxvt_color::fade (rxvt_screen *screen, int percent)
577{ 647{
578 percent = 100 - percent;
579
580 unsigned short cr, cg, cb;
581 rxvt_color faded; 648 rxvt_color faded;
582 649
583 get (display, cr, cg, cb); 650 rxvt_rgba c;
651 get (screen, c);
584 652
585 faded.set ( 653 c.r = lerp (0, c.r, percent);
586 display, 654 c.g = lerp (0, c.g, percent);
587 cr * percent / 100, 655 c.b = lerp (0, c.b, percent);
588 cg * percent / 100, 656
589 cb * percent / 100 657 faded.set (screen, c);
590 );
591 658
592 return faded; 659 return faded;
593} 660}
594 661
595#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
596
597rxvt_color 662rxvt_color
598rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 663rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
599{ 664{
600 percent = 100 - percent; 665 rxvt_rgba c, fc;
601
602 unsigned short cr, cg, cb;
603 unsigned short fcr, fcg, fcb;
604 rxvt_color faded; 666 rxvt_color faded;
605 667
606 get (display, cr, cg, cb); 668 get (screen, c);
607 fadeto.get(display, fcr, fcg, fcb); 669 fadeto.get (screen, fc);
608 670
609 faded.set ( 671 faded.set (
610 display, 672 screen,
673 rxvt_rgba (
611 LERP (cr, fcr, percent), 674 lerp (fc.r, c.r, percent),
612 LERP (cg, fcg, percent), 675 lerp (fc.g, c.g, percent),
613 LERP (cb, fcb, percent) 676 lerp (fc.b, c.b, percent),
677 lerp (fc.a, c.a, percent)
678 )
614 ); 679 );
615 680
616 return faded; 681 return faded;
617} 682}
618 683

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines