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.29 by root, Sun Jan 29 21:45:47 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
587 && screen->visual->c_class == TrueColor
588 && screen->visual->red_mask == 0x00ff0000
589 && screen->visual->green_mask == 0x0000ff00
590 && screen->visual->blue_mask == 0x000000ff)
591 c.pixel = c.pixel & 0x00ffffffUL | ((rgba.a >> 8) << 24);
592
593 return true;
594 }
595
596 return false;
597#else
571 XColor xc; 598 XColor xc;
572 599
573 xc.red = cr; 600 xc.red = rgba.r;
574 xc.green = cg; 601 xc.green = rgba.g;
575 xc.blue = cb; 602 xc.blue = rgba.b;
576 xc.flags = DoRed | DoGreen | DoBlue; 603 xc.flags = DoRed | DoGreen | DoBlue;
577 604
578 if (XAllocColor (display->display, display->cmap, &xc)) 605 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
579 return set (display, xc.pixel); 606 {
607 p = xc.pixel;
608 return true;
609 }
580 610
581 return false; 611 return false;
612#endif
582} 613}
583 614
584void 615void
585rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 616rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
586{ 617{
587#if XFT 618#if XFT
588 cr = c.color.red; 619 rgba.r = c.color.red;
589 cg = c.color.green; 620 rgba.g = c.color.green;
590 cb = c.color.blue; 621 rgba.b = c.color.blue;
622 rgba.a = c.color.alpha;
591#else 623#else
592 XColor c; 624 XColor c;
593 625
594 c.pixel = p; 626 c.pixel = p;
595 XQueryColor (display->display, display->cmap, &c); 627 XQueryColor (screen->xdisp, screen->cmap, &c);
596 628
597 cr = c.red; 629 rgba.r = c.red;
598 cg = c.green; 630 rgba.g = c.green;
599 cb = c.blue; 631 rgba.b = c.blue;
632 rgba.a = rxvt_rgba::MAX_CC;
600#endif 633#endif
601} 634}
602 635
603void 636void
604rxvt_color::free (rxvt_display *display) 637rxvt_color::free (rxvt_screen *screen)
605{ 638{
606#if XFT 639#if XFT
607 XftColorFree (display->display, display->visual, display->cmap, &c); 640 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
608#else 641#else
609 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 642 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
610#endif 643#endif
611} 644}
612 645
613rxvt_color 646rxvt_color
614rxvt_color::fade (rxvt_display *display, int percent) 647rxvt_color::fade (rxvt_screen *screen, int percent)
615{ 648{
616 percent = 100 - percent;
617
618 unsigned short cr, cg, cb;
619 rxvt_color faded; 649 rxvt_color faded;
620 650
621 get (display, cr, cg, cb); 651 rxvt_rgba c;
652 get (screen, c);
622 653
623 faded.set ( 654 c.r = lerp (0, c.r, percent);
624 display, 655 c.g = lerp (0, c.g, percent);
625 cr * percent / 100, 656 c.b = lerp (0, c.b, percent);
626 cg * percent / 100, 657
627 cb * percent / 100 658 faded.set (screen, c);
628 );
629 659
630 return faded; 660 return faded;
631} 661}
632 662
633#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
634
635rxvt_color 663rxvt_color
636rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 664rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
637{ 665{
638 percent = 100 - percent; 666 rxvt_rgba c, fc;
639
640 unsigned short cr, cg, cb;
641 unsigned short fcr, fcg, fcb;
642 rxvt_color faded; 667 rxvt_color faded;
643 668
644 get (display, cr, cg, cb); 669 get (screen, c);
645 fadeto.get(display, fcr, fcg, fcb); 670 fadeto.get (screen, fc);
646 671
647 faded.set ( 672 faded.set (
648 display, 673 screen,
674 rxvt_rgba (
649 LERP (cr, fcr, percent), 675 lerp (fc.r, c.r, percent),
650 LERP (cg, fcg, percent), 676 lerp (fc.g, c.g, percent),
651 LERP (cb, fcb, percent) 677 lerp (fc.b, c.b, percent),
678 lerp (fc.a, c.a, percent)
679 )
652 ); 680 );
653 681
654 return faded; 682 return faded;
655} 683}
656 684

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines