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.27 by root, Wed Jan 25 21:09:21 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 depth)
197{
198 set (disp);
199
200 XVisualInfo vinfo;
201
202 if (XMatchVisualInfo (xdisp, display->screen, depth, TrueColor, &vinfo))
203 {
204 this->depth = depth;
205 this->visual = vinfo.visual;
206 this->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, Pixel p)
487{ 540{
488#if XFT 541#if XFT
489 XColor xc; 542 XColor xc;
490 543
491 xc.pixel = p; 544 xc.pixel = p;
492 if (!XQueryColor (display->display, display->cmap, &xc)) 545 if (!XQueryColor (screen->xdisp, screen->cmap, &xc))
493 return false; 546 return false;
494 547
495 XRenderColor d; 548 XRenderColor d;
496 549
497 d.red = xc.red; 550 d.red = xc.red;
498 d.green = xc.green; 551 d.green = xc.green;
499 d.blue = xc.blue; 552 d.blue = xc.blue;
500 d.alpha = 0xffff; 553 d.alpha = 0xffff;
501 554
502 return 555 return
503 XftColorAllocValue (display->display, 556 XftColorAllocValue (screen->xdisp,
504 display->visual, 557 screen->visual,
505 display->cmap, 558 screen->cmap,
506 &d, &c); 559 &d, &c);
507#else 560#else
508 this->p = p; 561 this->p = p;
509#endif 562#endif
510 563
511 return true; 564 return true;
512} 565}
513 566
514bool 567bool
515rxvt_color::set (rxvt_display *display, const char *name) 568rxvt_color::set (rxvt_screen *screen, const char *name)
516{ 569{
517#if XFT 570#if XFT
518 return XftColorAllocName (display->display, display->visual, display->cmap, 571 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
519 name, &c);
520#else 572#else
521 XColor xc; 573 XColor xc;
522 574
523 if (XParseColor (display->display, display->cmap, name, &xc)) 575 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
524 return set (display, xc.red, xc.green, xc.blue); 576 return set (screen, xc.red, xc.green, xc.blue);
525 577
526 return false; 578 return false;
527#endif 579#endif
528} 580}
529 581
530bool 582bool
531rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 583rxvt_color::set (rxvt_screen *screen, unsigned short cr, unsigned short cg, unsigned short cb)
532{ 584{
533 XColor xc; 585 XColor xc;
534 586
535 xc.red = cr; 587 xc.red = cr;
536 xc.green = cg; 588 xc.green = cg;
537 xc.blue = cb; 589 xc.blue = cb;
538 xc.flags = DoRed | DoGreen | DoBlue; 590 xc.flags = DoRed | DoGreen | DoBlue;
539 591
540 if (XAllocColor (display->display, display->cmap, &xc)) 592 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
541 return set (display, xc.pixel); 593 return set (screen, xc.pixel);
542 594
543 return false; 595 return false;
544} 596}
545 597
546void 598void
547rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 599rxvt_color::get (rxvt_screen *screen, unsigned short &cr, unsigned short &cg, unsigned short &cb)
548{ 600{
549#if XFT 601#if XFT
550 cr = c.color.red; 602 cr = c.color.red;
551 cg = c.color.green; 603 cg = c.color.green;
552 cb = c.color.blue; 604 cb = c.color.blue;
553#else 605#else
554 XColor c; 606 XColor c;
555 607
556 c.pixel = p; 608 c.pixel = p;
557 XQueryColor (display->display, display->cmap, &c); 609 XQueryColor (screen->xdisp, screen->cmap, &c);
558 610
559 cr = c.red; 611 cr = c.red;
560 cg = c.green; 612 cg = c.green;
561 cb = c.blue; 613 cb = c.blue;
562#endif 614#endif
563} 615}
564 616
565void 617void
566rxvt_color::free (rxvt_display *display) 618rxvt_color::free (rxvt_screen *screen)
567{ 619{
568#if XFT 620#if XFT
569 XftColorFree (display->display, display->visual, display->cmap, &c); 621 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
570#else 622#else
571 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 623 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
572#endif 624#endif
573} 625}
574 626
575rxvt_color 627rxvt_color
576rxvt_color::fade (rxvt_display *display, int percent) 628rxvt_color::fade (rxvt_screen *screen, int percent)
577{ 629{
578 percent = 100 - percent; 630 percent = 100 - percent;
579 631
580 unsigned short cr, cg, cb; 632 unsigned short cr, cg, cb;
581 rxvt_color faded; 633 rxvt_color faded;
582 634
583 get (display, cr, cg, cb); 635 get (screen, cr, cg, cb);
584 636
585 faded.set ( 637 faded.set (
586 display, 638 screen,
587 cr * percent / 100, 639 cr * percent / 100,
588 cg * percent / 100, 640 cg * percent / 100,
589 cb * percent / 100 641 cb * percent / 100
590 ); 642 );
591 643
593} 645}
594 646
595#define LERP(a,b,p) (a * p + b * (100 - p)) / 100 647#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
596 648
597rxvt_color 649rxvt_color
598rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 650rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
599{ 651{
600 percent = 100 - percent; 652 percent = 100 - percent;
601 653
602 unsigned short cr, cg, cb; 654 unsigned short cr, cg, cb;
603 unsigned short fcr, fcg, fcb; 655 unsigned short fcr, fcg, fcb;
604 rxvt_color faded; 656 rxvt_color faded;
605 657
606 get (display, cr, cg, cb); 658 get (screen, cr, cg, cb);
607 fadeto.get(display, fcr, fcg, fcb); 659 fadeto.get (screen, fcr, fcg, fcb);
608 660
609 faded.set ( 661 faded.set (
610 display, 662 screen,
611 LERP (cr, fcr, percent), 663 LERP (cr, fcr, percent),
612 LERP (cg, fcg, percent), 664 LERP (cg, fcg, percent),
613 LERP (cb, fcb, percent) 665 LERP (cb, fcb, percent)
614 ); 666 );
615 667

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines