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.30 by root, Sun Jan 29 21:54:33 2006 UTC

177 177
178#endif 178#endif
179 179
180///////////////////////////////////////////////////////////////////////////// 180/////////////////////////////////////////////////////////////////////////////
181 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
182rxvt_display::rxvt_display (const char *id) 219rxvt_display::rxvt_display (const char *id)
183: refcounted (id) 220: refcounted (id)
184, x_ev (this, &rxvt_display::x_cb) 221, x_ev (this, &rxvt_display::x_cb)
185, selection_owner (0) 222, selection_owner (0)
186{ 223{
287 if (!display) 324 if (!display)
288 return false; 325 return false;
289 326
290 screen = DefaultScreen (display); 327 screen = DefaultScreen (display);
291 root = DefaultRootWindow (display); 328 root = DefaultRootWindow (display);
292 visual = DefaultVisual (display, screen);
293 cmap = DefaultColormap (display, screen);
294 depth = DefaultDepth (display, screen);
295 329
296 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA); 330 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
297 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa); 331 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa);
298 332
299 XrmSetDatabase (display, get_resources ()); 333 XrmSetDatabase (display, get_resources ());
307 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 341 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ',
308 &blackcolour, &blackcolour); 342 &blackcolour, &blackcolour);
309 XUnloadFont (display, f); 343 XUnloadFont (display, f);
310#endif 344#endif
311 345
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); 346 int fd = XConnectionNumber (display);
332 347
333#ifndef NO_SLOW_LINK_SUPPORT 348#ifndef NO_SLOW_LINK_SUPPORT
334 // try to detect wether we have a local connection. 349 // try to detect wether we have a local connection.
335 // assume unix domains socket == local, everything else not 350 // assume unix domains socket == local, everything else not
519refcache<rxvt_display> displays; 534refcache<rxvt_display> displays;
520 535
521///////////////////////////////////////////////////////////////////////////// 536/////////////////////////////////////////////////////////////////////////////
522 537
523bool 538bool
524rxvt_color::set (rxvt_display *display, Pixel p) 539rxvt_color::set (rxvt_screen *screen, const char *name)
525{ 540{
526#if XFT 541#if XFT
527 XColor xc; 542 int l = strlen (name);
543 rxvt_rgba r;
544 char eos;
545 int mult;
528 546
529 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))
530 if (!XQueryColor (display->display, display->cmap, &xc)) 548 mult = rxvt_rgba::MAX_CC / 0x000f;
531 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);
532 557
533 XRenderColor d; 558 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
534 559 return set (screen, r);
535 d.red = xc.red;
536 d.green = xc.green;
537 d.blue = xc.blue;
538 d.alpha = 0xffff;
539
540 return
541 XftColorAllocValue (display->display,
542 display->visual,
543 display->cmap,
544 &d, &c);
545#else
546 this->p = p;
547#endif
548
549 return true;
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 560#else
559 XColor xc; 561 XColor xc;
560 562
561 if (XParseColor (display->display, display->cmap, name, &xc)) 563 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
562 return set (display, xc.red, xc.green, xc.blue); 564 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
563 565
564 return false; 566 return false;
565#endif 567#endif
566} 568}
567 569
568bool 570bool
569rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 571rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
570{ 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
571 XColor xc; 597 XColor xc;
572 598
573 xc.red = cr; 599 xc.red = rgba.r;
574 xc.green = cg; 600 xc.green = rgba.g;
575 xc.blue = cb; 601 xc.blue = rgba.b;
576 xc.flags = DoRed | DoGreen | DoBlue; 602 xc.flags = DoRed | DoGreen | DoBlue;
577 603
578 if (XAllocColor (display->display, display->cmap, &xc)) 604 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
579 return set (display, xc.pixel); 605 {
606 p = xc.pixel;
607 return true;
608 }
580 609
581 return false; 610 return false;
611#endif
582} 612}
583 613
584void 614void
585rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 615rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
586{ 616{
587#if XFT 617#if XFT
588 cr = c.color.red; 618 rgba.r = c.color.red;
589 cg = c.color.green; 619 rgba.g = c.color.green;
590 cb = c.color.blue; 620 rgba.b = c.color.blue;
621 rgba.a = c.color.alpha;
591#else 622#else
592 XColor c; 623 XColor c;
593 624
594 c.pixel = p; 625 c.pixel = p;
595 XQueryColor (display->display, display->cmap, &c); 626 XQueryColor (screen->xdisp, screen->cmap, &c);
596 627
597 cr = c.red; 628 rgba.r = c.red;
598 cg = c.green; 629 rgba.g = c.green;
599 cb = c.blue; 630 rgba.b = c.blue;
631 rgba.a = rxvt_rgba::MAX_CC;
600#endif 632#endif
601} 633}
602 634
603void 635void
604rxvt_color::free (rxvt_display *display) 636rxvt_color::free (rxvt_screen *screen)
605{ 637{
606#if XFT 638#if XFT
607 XftColorFree (display->display, display->visual, display->cmap, &c); 639 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
608#else 640#else
609 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 641 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
610#endif 642#endif
611} 643}
612 644
613rxvt_color 645rxvt_color
614rxvt_color::fade (rxvt_display *display, int percent) 646rxvt_color::fade (rxvt_screen *screen, int percent)
615{ 647{
616 percent = 100 - percent;
617
618 unsigned short cr, cg, cb;
619 rxvt_color faded; 648 rxvt_color faded;
620 649
621 get (display, cr, cg, cb); 650 rxvt_rgba c;
651 get (screen, c);
622 652
623 faded.set ( 653 c.r = lerp (0, c.r, percent);
624 display, 654 c.g = lerp (0, c.g, percent);
625 cr * percent / 100, 655 c.b = lerp (0, c.b, percent);
626 cg * percent / 100, 656
627 cb * percent / 100 657 faded.set (screen, c);
628 );
629 658
630 return faded; 659 return faded;
631} 660}
632 661
633#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
634
635rxvt_color 662rxvt_color
636rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 663rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
637{ 664{
638 percent = 100 - percent; 665 rxvt_rgba c, fc;
639
640 unsigned short cr, cg, cb;
641 unsigned short fcr, fcg, fcb;
642 rxvt_color faded; 666 rxvt_color faded;
643 667
644 get (display, cr, cg, cb); 668 get (screen, c);
645 fadeto.get(display, fcr, fcg, fcb); 669 fadeto.get (screen, fc);
646 670
647 faded.set ( 671 faded.set (
648 display, 672 screen,
673 rxvt_rgba (
649 LERP (cr, fcr, percent), 674 lerp (fc.r, c.r, percent),
650 LERP (cg, fcg, percent), 675 lerp (fc.g, c.g, percent),
651 LERP (cb, fcb, percent) 676 lerp (fc.b, c.b, percent),
677 lerp (fc.a, c.a, percent)
678 )
652 ); 679 );
653 680
654 return faded; 681 return faded;
655} 682}
656 683

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines