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.31 by root, Sun Jan 29 22:27:04 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
37const char *const xa_names[] = 41const char *const xa_names[] =
38 { 42 {
39 "TEXT", 43 "TEXT",
40 "COMPOUND_TEXT", 44 "COMPOUND_TEXT",
41 "UTF8_STRING", 45 "UTF8_STRING",
177 181
178#endif 182#endif
179 183
180///////////////////////////////////////////////////////////////////////////// 184/////////////////////////////////////////////////////////////////////////////
181 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}
222
223/////////////////////////////////////////////////////////////////////////////
224
182rxvt_display::rxvt_display (const char *id) 225rxvt_display::rxvt_display (const char *id)
183: refcounted (id) 226: refcounted (id)
184, x_ev (this, &rxvt_display::x_cb) 227, x_ev (this, &rxvt_display::x_cb)
185, selection_owner (0) 228, selection_owner (0)
186{ 229{
287 if (!display) 330 if (!display)
288 return false; 331 return false;
289 332
290 screen = DefaultScreen (display); 333 screen = DefaultScreen (display);
291 root = DefaultRootWindow (display); 334 root = DefaultRootWindow (display);
292 visual = DefaultVisual (display, screen);
293 cmap = DefaultColormap (display, screen);
294 depth = DefaultDepth (display, screen);
295 335
296 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA); 336 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
297 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa); 337 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa);
298 338
299 XrmSetDatabase (display, get_resources ()); 339 XrmSetDatabase (display, get_resources ());
307 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 347 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ',
308 &blackcolour, &blackcolour); 348 &blackcolour, &blackcolour);
309 XUnloadFont (display, f); 349 XUnloadFont (display, f);
310#endif 350#endif
311 351
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); 352 int fd = XConnectionNumber (display);
332 353
333#ifndef NO_SLOW_LINK_SUPPORT 354#ifndef NO_SLOW_LINK_SUPPORT
334 // try to detect wether we have a local connection. 355 // try to detect wether we have a local connection.
335 // assume unix domains socket == local, everything else not 356 // assume unix domains socket == local, everything else not
519refcache<rxvt_display> displays; 540refcache<rxvt_display> displays;
520 541
521///////////////////////////////////////////////////////////////////////////// 542/////////////////////////////////////////////////////////////////////////////
522 543
523bool 544bool
524rxvt_color::set (rxvt_display *display, Pixel p) 545rxvt_color::set (rxvt_screen *screen, const char *name)
525{ 546{
526#if XFT 547#if XFT
527 XColor xc; 548 int l = strlen (name);
549 rxvt_rgba r;
550 char eos;
551 int mult;
528 552
529 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))
530 if (!XQueryColor (display->display, display->cmap, &xc)) 554 mult = rxvt_rgba::MAX_CC / 0x000f;
531 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);
532 563
533 XRenderColor d; 564 r.r *= mult; r.g *= mult; r.b *= mult; r.a *= mult;
534 565 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 566#else
559 XColor xc; 567 XColor xc;
560 568
561 if (XParseColor (display->display, display->cmap, name, &xc)) 569 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
562 return set (display, xc.red, xc.green, xc.blue); 570 return set (screen, rxvt_rgba (xc.red, xc.green, xc.blue));
563 571
564 return false; 572 return false;
565#endif 573#endif
566} 574}
567 575
568bool 576bool
569rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 577rxvt_color::set (rxvt_screen *screen, rxvt_rgba rgba)
570{ 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 >> (16 - popcount (format->direct.redMask )) << format->direct.red)
595 | (rgba.g >> (16 - popcount (format->direct.greenMask)) << format->direct.green)
596 | (rgba.b >> (16 - popcount (format->direct.blueMask )) << format->direct.blue)
597 | (rgba.a >> (16 - popcount (format->direct.alphaMask)) << 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
571 XColor xc; 615 XColor xc;
572 616
573 xc.red = cr; 617 xc.red = rgba.r;
574 xc.green = cg; 618 xc.green = rgba.g;
575 xc.blue = cb; 619 xc.blue = rgba.b;
576 xc.flags = DoRed | DoGreen | DoBlue; 620 xc.flags = DoRed | DoGreen | DoBlue;
577 621
578 if (XAllocColor (display->display, display->cmap, &xc)) 622 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
579 return set (display, xc.pixel); 623 {
624 p = xc.pixel;
625 return true;
626 }
580 627
581 return false; 628 return false;
629#endif
582} 630}
583 631
584void 632void
585rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 633rxvt_color::get (rxvt_screen *screen, rxvt_rgba &rgba)
586{ 634{
587#if XFT 635#if XFT
588 cr = c.color.red; 636 rgba.r = c.color.red;
589 cg = c.color.green; 637 rgba.g = c.color.green;
590 cb = c.color.blue; 638 rgba.b = c.color.blue;
639 rgba.a = c.color.alpha;
591#else 640#else
592 XColor c; 641 XColor c;
593 642
594 c.pixel = p; 643 c.pixel = p;
595 XQueryColor (display->display, display->cmap, &c); 644 XQueryColor (screen->xdisp, screen->cmap, &c);
596 645
597 cr = c.red; 646 rgba.r = c.red;
598 cg = c.green; 647 rgba.g = c.green;
599 cb = c.blue; 648 rgba.b = c.blue;
649 rgba.a = rxvt_rgba::MAX_CC;
600#endif 650#endif
601} 651}
602 652
603void 653void
604rxvt_color::free (rxvt_display *display) 654rxvt_color::free (rxvt_screen *screen)
605{ 655{
606#if XFT 656#if XFT
607 XftColorFree (display->display, display->visual, display->cmap, &c); 657 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
608#else 658#else
609 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 659 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
610#endif 660#endif
611} 661}
612 662
613rxvt_color 663rxvt_color
614rxvt_color::fade (rxvt_display *display, int percent) 664rxvt_color::fade (rxvt_screen *screen, int percent)
615{ 665{
616 percent = 100 - percent;
617
618 unsigned short cr, cg, cb;
619 rxvt_color faded; 666 rxvt_color faded;
620 667
621 get (display, cr, cg, cb); 668 rxvt_rgba c;
669 get (screen, c);
622 670
623 faded.set ( 671 c.r = lerp (0, c.r, percent);
624 display, 672 c.g = lerp (0, c.g, percent);
625 cr * percent / 100, 673 c.b = lerp (0, c.b, percent);
626 cg * percent / 100, 674
627 cb * percent / 100 675 faded.set (screen, c);
628 );
629 676
630 return faded; 677 return faded;
631} 678}
632 679
633#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
634
635rxvt_color 680rxvt_color
636rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 681rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
637{ 682{
638 percent = 100 - percent; 683 rxvt_rgba c, fc;
639
640 unsigned short cr, cg, cb;
641 unsigned short fcr, fcg, fcb;
642 rxvt_color faded; 684 rxvt_color faded;
643 685
644 get (display, cr, cg, cb); 686 get (screen, c);
645 fadeto.get(display, fcr, fcg, fcb); 687 fadeto.get (screen, fc);
646 688
647 faded.set ( 689 faded.set (
648 display, 690 screen,
691 rxvt_rgba (
649 LERP (cr, fcr, percent), 692 lerp (fc.r, c.r, percent),
650 LERP (cg, fcg, percent), 693 lerp (fc.g, c.g, percent),
651 LERP (cb, fcb, percent) 694 lerp (fc.b, c.b, percent),
695 lerp (fc.a, c.a, percent)
696 )
652 ); 697 );
653 698
654 return faded; 699 return faded;
655} 700}
656 701

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines