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.43 by root, Tue Jan 31 18:36:35 2006 UTC vs.
Revision 1.51 by root, Sat Feb 18 14:14:43 2006 UTC

177bool 177bool
178rxvt_xim::ref_init () 178rxvt_xim::ref_init ()
179{ 179{
180 display = GET_R->display; //HACK: TODO 180 display = GET_R->display; //HACK: TODO
181 181
182 xim = XOpenIM (display->display, NULL, NULL, NULL); 182 xim = XOpenIM (display->dpy, 0, 0, 0);
183 183
184 if (!xim) 184 if (!xim)
185 return false; 185 return false;
186 186
187 XIMCallback ximcallback; 187 XIMCallback ximcallback;
188 ximcallback.client_data = (XPointer)this; 188 ximcallback.client_data = (XPointer)this;
189 ximcallback.callback = im_destroy_cb; 189 ximcallback.callback = im_destroy_cb;
190 190
191 XSetIMValues (xim, XNDestroyCallback, &ximcallback, NULL); 191 XSetIMValues (xim, XNDestroyCallback, &ximcallback, 0);
192 192
193 return true; 193 return true;
194} 194}
195 195
196rxvt_xim::~rxvt_xim () 196rxvt_xim::~rxvt_xim ()
201 201
202#endif 202#endif
203 203
204///////////////////////////////////////////////////////////////////////////// 204/////////////////////////////////////////////////////////////////////////////
205 205
206#if XFT
207rxvt_drawable::~rxvt_drawable ()
208{
209 if (xftdrawable)
210 XftDrawDestroy (xftdrawable);
211}
212
213rxvt_drawable::operator XftDraw *()
214{
215 if (!xftdrawable)
216 xftdrawable = XftDrawCreate (screen->dpy, drawable, screen->visual, screen->cmap);
217
218 return xftdrawable;
219}
220#endif
221
222/////////////////////////////////////////////////////////////////////////////
223
224#if XFT
225
226// not strictly necessary as it is only used with superclass of zero_initialised
227rxvt_screen::rxvt_screen ()
228: scratch_area (0)
229{
230}
231
232rxvt_drawable &rxvt_screen::scratch_drawable (int w, int h)
233{
234 // it's actually faster to re-allocate every time. don't ask me
235 // why, but its likely no big deal there are no roundtrips
236 // (I think/hope).
237 if (!scratch_area || w > scratch_w || h > scratch_h || 1/*D*/)
238 {
239 if (scratch_area)
240 {
241 XFreePixmap (dpy, scratch_area->drawable);
242 delete scratch_area;
243 }
244
245 Pixmap pm = XCreatePixmap (dpy, RootWindowOfScreen (ScreenOfDisplay (dpy, display->screen)),
246 scratch_w = w, scratch_h = h, depth);
247
248 scratch_area = new rxvt_drawable (this, pm);
249 }
250
251 return *scratch_area;
252}
253
254#endif
255
206void 256void
207rxvt_screen::set (rxvt_display *disp) 257rxvt_screen::set (rxvt_display *disp)
208{ 258{
209 display = disp; 259 display = disp;
210 xdisp = disp->display; 260 dpy = disp->dpy;
211 261
212 Screen *screen = ScreenOfDisplay (xdisp, disp->screen); 262 Screen *screen = ScreenOfDisplay (dpy, disp->screen);
213 263
214 depth = DefaultDepthOfScreen (screen); 264 depth = DefaultDepthOfScreen (screen);
215 visual = DefaultVisualOfScreen (screen); 265 visual = DefaultVisualOfScreen (screen);
216 cmap = DefaultColormapOfScreen (screen); 266 cmap = DefaultColormapOfScreen (screen);
217} 267}
222 set (disp); 272 set (disp);
223 273
224#if XFT 274#if XFT
225 XVisualInfo vinfo; 275 XVisualInfo vinfo;
226 276
227 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo)) 277 if (XMatchVisualInfo (dpy, display->screen, bitdepth, TrueColor, &vinfo))
228 { 278 {
229 depth = bitdepth; 279 depth = bitdepth;
230 visual = vinfo.visual; 280 visual = vinfo.visual;
231 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone); 281 cmap = XCreateColormap (dpy, disp->root, visual, AllocNone);
232 } 282 }
233#endif 283#endif
234} 284}
235 285
236void 286void
237rxvt_screen::clear () 287rxvt_screen::clear ()
238{ 288{
289#if XFT
290 if (scratch_area)
291 {
292 XFreePixmap (dpy, scratch_area->drawable);
293 delete scratch_area;
294 }
295#endif
296
239 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (xdisp, display->screen))) 297 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (dpy, display->screen)))
240 XFreeColormap (xdisp, cmap); 298 XFreeColormap (dpy, cmap);
241} 299}
242 300
243///////////////////////////////////////////////////////////////////////////// 301/////////////////////////////////////////////////////////////////////////////
244 302
245rxvt_display::rxvt_display (const char *id) 303rxvt_display::rxvt_display (const char *id)
248, selection_owner (0) 306, selection_owner (0)
249{ 307{
250} 308}
251 309
252XrmDatabase 310XrmDatabase
253rxvt_display::get_resources () 311rxvt_display::get_resources (bool refresh)
254{ 312{
255 char *homedir = (char *)getenv ("HOME"); 313 char *homedir = (char *)getenv ("HOME");
256 char fname[1024]; 314 char fname[1024];
257 315
258 /* 316 /*
259 * get resources using the X library function 317 * get resources using the X library function
260 */ 318 */
261 char *displayResource, *xe; 319 char *displayResource, *xe;
262 XrmDatabase database, rdb1; 320 XrmDatabase rdb1, database = 0;
263
264 database = NULL;
265 321
266 // for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20 322 // for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20
267 323
268 // 6. System wide per application default file. 324 // 6. System wide per application default file.
269 325
279 // 5. User's per application default file. 335 // 5. User's per application default file.
280 // none 336 // none
281 337
282 // 4. User's defaults file. 338 // 4. User's defaults file.
283 /* Get any Xserver defaults */ 339 /* Get any Xserver defaults */
340 if (refresh)
341 {
342 // fucking xlib keeps a copy of the rm string
343 Atom actual_type;
344 int actual_format;
345 unsigned long nitems, nremaining;
346 char *val = 0;
347
348#if XLIB_ILLEGAL_ACCESS
349 if (dpy->xdefaults)
350 XFree (dpy->xdefaults);
351#endif
352
353 if (XGetWindowProperty (dpy, root, XA_RESOURCE_MANAGER,
354 0L, 100000000L, False,
355 XA_STRING, &actual_type, &actual_format,
356 &nitems, &nremaining,
357 (unsigned char **)&val) == Success
358 && actual_type == XA_STRING
359 && actual_format == 8)
360 displayResource = val;
361 else
362 {
363 displayResource = 0;
364 if (val)
365 XFree(val);
366 }
367
368#if XLIB_ILLEGAL_ACCESS
369 dpy->xdefaults = displayResource;
370#endif
371 }
372 else
284 displayResource = XResourceManagerString (display); 373 displayResource = XResourceManagerString (dpy);
285 374
286 if (displayResource != NULL) 375 if (displayResource)
287 { 376 {
288 if ((rdb1 = XrmGetStringDatabase (displayResource))) 377 if ((rdb1 = XrmGetStringDatabase (displayResource)))
289 XrmMergeDatabases (rdb1, &database); 378 XrmMergeDatabases (rdb1, &database);
290 } 379 }
291 else if (homedir) 380 else if (homedir)
294 383
295 if ((rdb1 = XrmGetFileDatabase (fname))) 384 if ((rdb1 = XrmGetFileDatabase (fname)))
296 XrmMergeDatabases (rdb1, &database); 385 XrmMergeDatabases (rdb1, &database);
297 } 386 }
298 387
388#if !XLIB_ILLEGAL_ACCESS
389 if (refresh && displayResource)
390 XFree (displayResource);
391#endif
392
299 /* Get screen specific resources */ 393 /* Get screen specific resources */
300 displayResource = XScreenResourceString (ScreenOfDisplay (display, screen)); 394 displayResource = XScreenResourceString (ScreenOfDisplay (dpy, screen));
301 395
302 if (displayResource != NULL) 396 if (displayResource)
303 { 397 {
304 if ((rdb1 = XrmGetStringDatabase (displayResource))) 398 if ((rdb1 = XrmGetStringDatabase (displayResource)))
305 /* Merge with screen-independent resources */ 399 /* Merge with screen-independent resources */
306 XrmMergeDatabases (rdb1, &database); 400 XrmMergeDatabases (rdb1, &database);
307 401
335 if (id[0] == ':') 429 if (id[0] == ':')
336 { 430 {
337 val = rxvt_malloc (5 + strlen (id) + 1); 431 val = rxvt_malloc (5 + strlen (id) + 1);
338 strcpy (val, "unix/"); 432 strcpy (val, "unix/");
339 strcat (val, id); 433 strcat (val, id);
340 display = XOpenDisplay (val); 434 dpy = XOpenDisplay (val);
341 free (val); 435 free (val);
342 } 436 }
343 else 437 else
344#endif 438#endif
345 display = 0; 439 dpy = 0;
346 440
347 if (!display) 441 if (!dpy)
348 display = XOpenDisplay (id); 442 dpy = XOpenDisplay (id);
349 443
350 if (!display) 444 if (!dpy)
351 return false; 445 return false;
352 446
353 screen = DefaultScreen (display); 447 screen = DefaultScreen (dpy);
354 root = DefaultRootWindow (display); 448 root = DefaultRootWindow (dpy);
355 449
356 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA); 450 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
357 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa); 451 XInternAtoms (dpy, (char **)xa_names, NUM_XA, False, xa);
358 452
359 XrmSetDatabase (display, get_resources ()); 453 XrmSetDatabase (dpy, get_resources (false));
360 454
361#ifdef POINTER_BLANK 455#ifdef POINTER_BLANK
362 XColor blackcolour; 456 XColor blackcolour;
363 blackcolour.red = 0; 457 blackcolour.red = 0;
364 blackcolour.green = 0; 458 blackcolour.green = 0;
365 blackcolour.blue = 0; 459 blackcolour.blue = 0;
366 Font f = XLoadFont (display, "fixed"); 460 Font f = XLoadFont (dpy, "fixed");
367 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 461 blank_cursor = XCreateGlyphCursor (dpy, f, f, ' ', ' ',
368 &blackcolour, &blackcolour); 462 &blackcolour, &blackcolour);
369 XUnloadFont (display, f); 463 XUnloadFont (dpy, f);
370#endif 464#endif
371 465
372 int fd = XConnectionNumber (display); 466 int fd = XConnectionNumber (dpy);
373 467
374#ifndef NO_SLOW_LINK_SUPPORT 468#ifndef NO_SLOW_LINK_SUPPORT
375 // try to detect wether we have a local connection. 469 // try to detect wether we have a local connection.
376 // assume unix domains socket == local, everything else not 470 // assume unix domains socket == local, everything else not
377 // TODO: might want to check for inet/127.0.0.1 471 // TODO: might want to check for inet/127.0.0.1
384#endif 478#endif
385 479
386 x_ev.start (fd, EVENT_READ); 480 x_ev.start (fd, EVENT_READ);
387 fcntl (fd, F_SETFD, FD_CLOEXEC); 481 fcntl (fd, F_SETFD, FD_CLOEXEC);
388 482
389 XSelectInput (display, root, PropertyChangeMask); 483 XSelectInput (dpy, root, PropertyChangeMask);
390 484
391 flush (); 485 flush ();
392 486
393 return true; 487 return true;
394} 488}
395 489
396void 490void
397rxvt_display::ref_next () 491rxvt_display::ref_next ()
398{ 492{
399 // TODO: somehow check wether the database files/resources changed 493 // TODO: somehow check wether the database files/resources changed
400 // before re-loading/parsing 494 // before affording re-loading/parsing
401 XrmDestroyDatabase (XrmGetDatabase (display)); 495 XrmDestroyDatabase (XrmGetDatabase (dpy));
402 XrmSetDatabase (display, get_resources ()); 496 XrmSetDatabase (dpy, get_resources (true));
403} 497}
404 498
405rxvt_display::~rxvt_display () 499rxvt_display::~rxvt_display ()
406{ 500{
407 if (!display) 501 if (!dpy)
408 return; 502 return;
409 503
410#ifdef POINTER_BLANK 504#ifdef POINTER_BLANK
411 XFreeCursor (display, blank_cursor); 505 XFreeCursor (dpy, blank_cursor);
412#endif 506#endif
413 x_ev.stop (); 507 x_ev.stop ();
414#ifdef USE_XIM 508#ifdef USE_XIM
415 xims.clear (); 509 xims.clear ();
416#endif 510#endif
417 XCloseDisplay (display); 511 XCloseDisplay (dpy);
418} 512}
419 513
420#ifdef USE_XIM 514#ifdef USE_XIM
421void rxvt_display::im_change_cb () 515void rxvt_display::im_change_cb ()
422{ 516{
430 // registers, as xlib crashes due to a race otherwise. 524 // registers, as xlib crashes due to a race otherwise.
431 Atom actual_type, *atoms; 525 Atom actual_type, *atoms;
432 int actual_format; 526 int actual_format;
433 unsigned long nitems, bytes_after; 527 unsigned long nitems, bytes_after;
434 528
435 if (XGetWindowProperty (display, root, xa[XA_XIM_SERVERS], 0L, 1000000L, 529 if (XGetWindowProperty (dpy, root, xa[XA_XIM_SERVERS], 0L, 1000000L,
436 False, XA_ATOM, &actual_type, &actual_format, 530 False, XA_ATOM, &actual_type, &actual_format,
437 &nitems, &bytes_after, (unsigned char **)&atoms) 531 &nitems, &bytes_after, (unsigned char **)&atoms)
438 != Success ) 532 != Success )
439 return; 533 return;
440 534
441 if (actual_type == XA_ATOM && actual_format == 32) 535 if (actual_type == XA_ATOM && actual_format == 32)
442 for (int i = 0; i < nitems; i++) 536 for (int i = 0; i < nitems; i++)
443 if (XGetSelectionOwner (display, atoms[i])) 537 if (XGetSelectionOwner (dpy, atoms[i]))
444 { 538 {
445 im_change_cb (); 539 im_change_cb ();
446 break; 540 break;
447 } 541 }
448 542
453void rxvt_display::x_cb (io_watcher &w, short revents) 547void rxvt_display::x_cb (io_watcher &w, short revents)
454{ 548{
455 do 549 do
456 { 550 {
457 XEvent xev; 551 XEvent xev;
458 XNextEvent (display, &xev); 552 XNextEvent (dpy, &xev);
459 553
460#ifdef USE_XIM 554#ifdef USE_XIM
461 if (!XFilterEvent (&xev, None)) 555 if (!XFilterEvent (&xev, None))
462 { 556 {
463 if (xev.type == PropertyNotify 557 if (xev.type == PropertyNotify
474 } 568 }
475#ifdef USE_XIM 569#ifdef USE_XIM
476 } 570 }
477#endif 571#endif
478 } 572 }
479 while (XEventsQueued (display, QueuedAlready)); 573 while (XEventsQueued (dpy, QueuedAlready));
480 574
481 XFlush (display); 575 XFlush (dpy);
482} 576}
483 577
484void rxvt_display::flush () 578void rxvt_display::flush ()
485{ 579{
486 if (XEventsQueued (display, QueuedAlready)) 580 if (XEventsQueued (dpy, QueuedAlready))
487 x_cb (x_ev, EVENT_READ); 581 x_cb (x_ev, EVENT_READ);
488 582
489 XFlush (display); 583 XFlush (dpy);
490} 584}
491 585
492void rxvt_display::reg (xevent_watcher *w) 586void rxvt_display::reg (xevent_watcher *w)
493{ 587{
494 xw.push_back (w); 588 xw.push_back (w);
508 602
509 selection_owner = owner; 603 selection_owner = owner;
510} 604}
511 605
512#ifdef USE_XIM 606#ifdef USE_XIM
607
513void rxvt_display::reg (im_watcher *w) 608void rxvt_display::reg (im_watcher *w)
514{ 609{
515 imw.push_back (w); 610 imw.push_back (w);
516} 611}
517 612
541 return xim; 636 return xim;
542} 637}
543 638
544void rxvt_display::put_xim (rxvt_xim *xim) 639void rxvt_display::put_xim (rxvt_xim *xim)
545{ 640{
546#if XLIB_IS_RACEFREE 641# if XLIB_IS_RACEFREE
547 xims.put (xim); 642 xims.put (xim);
548#endif 643# endif
549} 644}
645
550#endif 646#endif
551 647
552Atom rxvt_display::atom (const char *name) 648Atom rxvt_display::atom (const char *name)
553{ 649{
554 return XInternAtom (display, name, False); 650 return XInternAtom (dpy, name, False);
555} 651}
556 652
557///////////////////////////////////////////////////////////////////////////// 653/////////////////////////////////////////////////////////////////////////////
558 654
559template class refcache<rxvt_display>; 655template class refcache<rxvt_display>;
565rxvt_color::alloc (rxvt_screen *screen, const rgba &color) 661rxvt_color::alloc (rxvt_screen *screen, const rgba &color)
566{ 662{
567#if XFT 663#if XFT
568 XRenderPictFormat *format; 664 XRenderPictFormat *format;
569 665
570 // FUCKING Xft gets it wrong, of course, so work around it 666 // FUCKING Xft gets it wrong, of course, so work around it.
571 // transparency users should eat shit and die, and then 667 // Transparency users should eat shit and die, and then
572 // XRenderQueryPictIndexValues themselves plenty. 668 // XRenderQueryPictIndexValues themselves plenty.
573 if ((screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor) 669 if ((screen->visual->c_class == TrueColor)
574 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) 670 && (format = XRenderFindVisualFormat (screen->dpy, screen->visual)))
575 { 671 {
576 // the fun lies in doing everything manually... 672 // the fun lies in doing everything manually...
577 c.color.red = color.r; 673 c.color.red = color.r;
578 c.color.green = color.g; 674 c.color.green = color.g;
579 c.color.blue = color.b; 675 c.color.blue = color.b;
593 d.red = color.r; 689 d.red = color.r;
594 d.green = color.g; 690 d.green = color.g;
595 d.blue = color.b; 691 d.blue = color.b;
596 d.alpha = color.a; 692 d.alpha = color.a;
597 693
598 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); 694 return XftColorAllocValue (screen->dpy, screen->visual, screen->cmap, &d, &c);
599 } 695 }
600#else 696#else
601 if (screen->visual->c_class == TrueColor || screen->visual->c_class == DirectColor)
602 {
603 c.red = color.g; 697 c.red = color.r;
604 c.green = color.g; 698 c.green = color.g;
605 c.blue = color.g; 699 c.blue = color.b;
700
701 if (screen->visual->c_class == TrueColor)
702 {
606 c.pixel = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask )) 703 c.pixel = (color.r * (screen->visual->red_mask >> ctz (screen->visual->red_mask ))
607 / rgba::MAX_CC) << ctz (screen->visual->red_mask ) 704 / rgba::MAX_CC) << ctz (screen->visual->red_mask )
608 | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask)) 705 | (color.g * (screen->visual->green_mask >> ctz (screen->visual->green_mask))
609 / rgba::MAX_CC) << ctz (screen->visual->green_mask) 706 / rgba::MAX_CC) << ctz (screen->visual->green_mask)
610 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) 707 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
611 / rgba::MAX_CC) << ctz (screen->visual->blue_mask ); 708 / rgba::MAX_CC) << ctz (screen->visual->blue_mask );
612 709
613 return true; 710 return true;
614 } 711 }
712 else if (XAllocColor (screen->dpy, screen->cmap, &c))
713 return true;
615 else 714 else
616 {
617 c.red = color.r;
618 c.green = color.g;
619 c.blue = color.b;
620
621 if (XAllocColor (screen->xdisp, screen->cmap, &c))
622 return true;
623 else
624 c.pixel = (color.r + color.g + color.b) > 128*3 715 c.pixel = (color.r + color.g + color.b) > 128*3
625 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)) 716 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->dpy))
626 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)); 717 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->dpy));
627 }
628#endif 718#endif
629 719
630 return false; 720 return false;
631} 721}
632 722
635{ 725{
636 rgba c; 726 rgba c;
637 char eos; 727 char eos;
638 int skip; 728 int skip;
639 729
730 // parse the nonstandard "[alphapercent]" prefix
640 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip)) 731 if (1 <= sscanf (name, "[%hd]%n", &c.a, &skip))
641 { 732 {
642 printf ("X %d\n", c.a);
643 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a); 733 c.a = lerp<int, int, int> (0, rgba::MAX_CC, c.a);
644 name += skip; 734 name += skip;
645 printf ("y %04x\n", c.a);
646 } 735 }
647 else 736 else
648 c.a = rgba::MAX_CC; 737 c.a = rgba::MAX_CC;
649 738
650 // parse the non-standard rgba format 739 // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format
651 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%hx/%hx/%hx/%hx%c", &c.r, &c.g, &c.b, &c.a, &eos)) 740 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%4hx/%4hx/%4hx/%4hx%c", &c.r, &c.g, &c.b, &c.a, &eos))
652 { 741 {
653 XColor xc, xc_exact; 742 XColor xc, xc_exact;
654 743
655 if (XParseColor (screen->xdisp, screen->cmap, name, &xc)) 744 if (XParseColor (screen->dpy, screen->cmap, name, &xc))
656 { 745 {
657 c.r = xc.red; 746 c.r = xc.red;
658 c.g = xc.green; 747 c.g = xc.green;
659 c.b = xc.blue; 748 c.b = xc.blue;
660 } 749 }
688 for (int i = 0; i < cmap_size; i++) 777 for (int i = 0; i < cmap_size; i++)
689 colors [i].pixel = i; 778 colors [i].pixel = i;
690 779
691 // many kilobytes transfer per colour, but pseudocolor isn't worth 780 // many kilobytes transfer per colour, but pseudocolor isn't worth
692 // many extra optimisations. 781 // many extra optimisations.
693 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size); 782 XQueryColors (screen->dpy, screen->cmap, colors, cmap_size);
694 783
695 int diff = 0x7fffffffUL; 784 int diff = 0x7fffffffUL;
696 XColor *best = colors; 785 XColor *best = colors;
697 786
698 for (int i = 0; i < cmap_size; i++) 787 for (int i = 0; i < cmap_size; i++)
719 808
720 return got; 809 return got;
721} 810}
722 811
723void 812void
724rxvt_color::get (rxvt_screen *screen, rgba &color) 813rxvt_color::get (rgba &color)
725{ 814{
726#if XFT 815#if XFT
727 color.r = c.color.red; 816 color.r = c.color.red;
728 color.g = c.color.green; 817 color.g = c.color.green;
729 color.b = c.color.blue; 818 color.b = c.color.blue;
734 color.b = c.blue; 823 color.b = c.blue;
735 color.a = rgba::MAX_CC; 824 color.a = rgba::MAX_CC;
736#endif 825#endif
737} 826}
738 827
828void
829rxvt_color::get (XColor &color)
830{
831 rgba c;
832 get (c);
833
834 color.red = c.r;
835 color.green = c.g;
836 color.blue = c.b;
837 color.pixel = (Pixel)*this;
838}
839
739void 840void
740rxvt_color::free (rxvt_screen *screen) 841rxvt_color::free (rxvt_screen *screen)
741{ 842{
742#if XFT 843#if XFT
743 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 844 XftColorFree (screen->dpy, screen->visual, screen->cmap, &c);
744#else 845#else
745 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes); 846 XFreeColors (screen->dpy, screen->cmap, &c.pixel, 1, AllPlanes);
746#endif 847#endif
747} 848}
748 849
749void 850void
750rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to) 851rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)
751{ 852{
752 rgba c; 853 rgba c;
753 get (screen, c); 854 get (c);
754 855
755 result.set ( 856 result.set (
756 screen, 857 screen,
757 rgba ( 858 rgba (
758 lerp (c.r, to.r, percent), 859 lerp (c.r, to.r, percent),

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines