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.19 by root, Mon Nov 28 19:04:39 2005 UTC vs.
Revision 1.26 by root, Wed Jan 25 21:03:04 2006 UTC

25#include <rxvttoolkit.h> 25#include <rxvttoolkit.h>
26 26
27#include <unistd.h> 27#include <unistd.h>
28#include <fcntl.h> 28#include <fcntl.h>
29 29
30#include <sys/utsname.h>
31
30#ifndef NO_SLOW_LINK_SUPPORT 32#ifndef NO_SLOW_LINK_SUPPORT
31# include <sys/socket.h> 33# include <sys/socket.h>
32# include <sys/un.h> 34# include <sys/un.h>
33#endif 35#endif
34 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
35refcounted::refcounted (const char *id) 75refcounted::refcounted (const char *id)
36{ 76{
37 this->id = strdup (id); 77 this->id = strdup (id);
38} 78}
39 79
47{ 87{
48 for (T **i = this->begin (); i < this->end (); ++i) 88 for (T **i = this->begin (); i < this->end (); ++i)
49 { 89 {
50 if (!strcmp (id, (*i)->id)) 90 if (!strcmp (id, (*i)->id))
51 { 91 {
52 (*i)->referenced++; 92 ++(*i)->referenced;
93 (*i)->ref_next ();
53 return *i; 94 return *i;
54 } 95 }
55 } 96 }
56 97
57 T *obj = new T (id); 98 T *obj = new T (id);
58 99
59 obj->referenced = 1;
60
61 if (obj && obj->init ()) 100 if (obj && obj->ref_init ())
62 { 101 {
102 obj->referenced = 1;
63 this->push_back (obj); 103 this->push_back (obj);
64 return obj; 104 return obj;
65 } 105 }
66 else 106 else
67 { 107 {
91} 131}
92 132
93///////////////////////////////////////////////////////////////////////////// 133/////////////////////////////////////////////////////////////////////////////
94 134
95#ifdef USE_XIM 135#ifdef USE_XIM
136
96static void 137static void
97#if XIMCB_PROTO_BROKEN 138#if XIMCB_PROTO_BROKEN
98im_destroy_cb (XIC unused1, XPointer client_data, XPointer unused3) 139im_destroy_cb (XIC unused1, XPointer client_data, XPointer unused3)
99#else 140#else
100im_destroy_cb (XIM unused1, XPointer client_data, XPointer unused3) 141im_destroy_cb (XIM unused1, XPointer client_data, XPointer unused3)
107 148
108 display->xims.erase (find (display->xims.begin (), display->xims.end (), xim)); 149 display->xims.erase (find (display->xims.begin (), display->xims.end (), xim));
109 display->im_change_cb (); 150 display->im_change_cb ();
110} 151}
111 152
153bool
112bool rxvt_xim::init () 154rxvt_xim::ref_init ()
113{ 155{
114 display = GET_R->display; //HACK: TODO 156 display = GET_R->display; //HACK: TODO
115 157
116 xim = XOpenIM (display->display, NULL, NULL, NULL); 158 xim = XOpenIM (display->display, NULL, NULL, NULL);
117 159
130rxvt_xim::~rxvt_xim () 172rxvt_xim::~rxvt_xim ()
131{ 173{
132 if (xim) 174 if (xim)
133 XCloseIM (xim); 175 XCloseIM (xim);
134} 176}
177
135#endif 178#endif
179
180/////////////////////////////////////////////////////////////////////////////
181
182void
183rxvt_screen::set (rxvt_display *disp)
184{
185 display = disp;
186
187 xdisp = disp->display;
188
189 Screen *screen = ScreenOfDisplay (xdisp, disp->screen);
190
191 depth = DefaultDepthOfScreen (screen);
192 visual = DefaultVisualOfScreen (screen);
193 cmap = DefaultColormapOfScreen (screen);
194}
195
196void
197rxvt_screen::set (rxvt_display *disp, int depth)
198{
199 set (disp);
200
201 XVisualInfo vinfo;
202
203 if (XMatchVisualInfo (xdisp, display->screen, depth, TrueColor, &vinfo))
204 {
205 this->depth = depth;
206 this->visual = vinfo.visual;
207 this->cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone);
208 }
209}
210
211void
212rxvt_screen::clear ()
213{
214 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (xdisp, display->screen)))
215 XFreeColormap (xdisp, cmap);
216}
136 217
137///////////////////////////////////////////////////////////////////////////// 218/////////////////////////////////////////////////////////////////////////////
138 219
139rxvt_display::rxvt_display (const char *id) 220rxvt_display::rxvt_display (const char *id)
140: refcounted (id) 221: refcounted (id)
141, x_ev (this, &rxvt_display::x_cb) 222, x_ev (this, &rxvt_display::x_cb)
142, selection_owner (0) 223, selection_owner (0)
143{ 224{
144} 225}
145 226
227XrmDatabase
228rxvt_display::get_resources ()
229{
230 char *homedir = (char *)getenv ("HOME");
231 char fname[1024];
232
233 /*
234 * get resources using the X library function
235 */
236 char *displayResource, *xe;
237 XrmDatabase database, rdb1;
238
239 database = NULL;
240
241 // for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20
242
243 // 6. System wide per application default file.
244
245 /* Add in $XAPPLRESDIR/Rxvt only; not bothering with XUSERFILESEARCHPATH */
246 if ((xe = (char *)getenv ("XAPPLRESDIR")))
247 {
248 snprintf (fname, sizeof (fname), "%s/%s", xe, RESCLASS);
249
250 if ((rdb1 = XrmGetFileDatabase (fname)))
251 XrmMergeDatabases (rdb1, &database);
252 }
253
254 // 5. User's per application default file.
255 // none
256
257 // 4. User's defaults file.
258 /* Get any Xserver defaults */
259 displayResource = XResourceManagerString (display);
260
261 if (displayResource != NULL)
262 {
263 if ((rdb1 = XrmGetStringDatabase (displayResource)))
264 XrmMergeDatabases (rdb1, &database);
265 }
266 else if (homedir)
267 {
268 snprintf (fname, sizeof (fname), "%s/.Xdefaults", homedir);
269
270 if ((rdb1 = XrmGetFileDatabase (fname)))
271 XrmMergeDatabases (rdb1, &database);
272 }
273
274 /* Get screen specific resources */
275 displayResource = XScreenResourceString (ScreenOfDisplay (display, screen));
276
277 if (displayResource != NULL)
278 {
279 if ((rdb1 = XrmGetStringDatabase (displayResource)))
280 /* Merge with screen-independent resources */
281 XrmMergeDatabases (rdb1, &database);
282
283 XFree (displayResource);
284 }
285
286 // 3. User's per host defaults file
287 /* Add in XENVIRONMENT file */
288 if ((xe = (char *)getenv ("XENVIRONMENT"))
289 && (rdb1 = XrmGetFileDatabase (xe)))
290 XrmMergeDatabases (rdb1, &database);
291 else if (homedir)
292 {
293 struct utsname un;
294
295 if (!uname (&un))
296 {
297 snprintf (fname, sizeof (fname), "%s/.Xdefaults-%s", homedir, un.nodename);
298
299 if ((rdb1 = XrmGetFileDatabase (fname)))
300 XrmMergeDatabases (rdb1, &database);
301 }
302 }
303
304 return database;
305}
306
146bool rxvt_display::init () 307bool rxvt_display::ref_init ()
147{ 308{
148#ifdef LOCAL_X_IS_UNIX 309#ifdef LOCAL_X_IS_UNIX
149 if (id[0] == ':') 310 if (id[0] == ':')
150 { 311 {
151 val = rxvt_malloc (5 + strlen (id) + 1); 312 val = rxvt_malloc (5 + strlen (id) + 1);
164 if (!display) 325 if (!display)
165 return false; 326 return false;
166 327
167 screen = DefaultScreen (display); 328 screen = DefaultScreen (display);
168 root = DefaultRootWindow (display); 329 root = DefaultRootWindow (display);
169 visual = DefaultVisual (display, screen);
170 cmap = DefaultColormap (display, screen);
171 depth = DefaultDepth (display, screen);
172 330
173 int fd = XConnectionNumber (display); 331 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
332 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa);
174 333
175#ifndef NO_SLOW_LINK_SUPPORT 334 XrmSetDatabase (display, get_resources ());
176 // try to detect wether we have a local connection.
177 // assume unix domains socket == local, everything else not
178 // TODO: might want to check for inet/127.0.0.1
179 is_local = 0;
180 sockaddr_un sa;
181 socklen_t sl = sizeof (sa);
182
183 if (!getsockname (fd, (sockaddr *)&sa, &sl))
184 is_local = sa.sun_family == AF_LOCAL;
185#endif
186 335
187#ifdef POINTER_BLANK 336#ifdef POINTER_BLANK
188 XColor blackcolour; 337 XColor blackcolour;
189 blackcolour.red = 0; 338 blackcolour.red = 0;
190 blackcolour.green = 0; 339 blackcolour.green = 0;
193 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 342 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ',
194 &blackcolour, &blackcolour); 343 &blackcolour, &blackcolour);
195 XUnloadFont (display, f); 344 XUnloadFont (display, f);
196#endif 345#endif
197 346
198#ifdef PREFER_24BIT 347 int fd = XConnectionNumber (display);
199 /*
200 * If depth is not 24, look for a 24bit visual.
201 */
202 if (depth != 24)
203 {
204 XVisualInfo vinfo;
205 348
206 if (XMatchVisualInfo (display, screen, 24, TrueColor, &vinfo)) 349#ifndef NO_SLOW_LINK_SUPPORT
207 { 350 // try to detect wether we have a local connection.
208 depth = 24; 351 // assume unix domains socket == local, everything else not
209 visual = vinfo.visual; 352 // TODO: might want to check for inet/127.0.0.1
210 cmap = XCreateColormap (display, 353 is_local = 0;
211 RootWindow (display, screen), 354 sockaddr_un sa;
212 visual, AllocNone); 355 socklen_t sl = sizeof (sa);
213 } 356
214 } 357 if (!getsockname (fd, (sockaddr *)&sa, &sl))
358 is_local = sa.sun_family == AF_LOCAL;
215#endif 359#endif
216 360
217 x_ev.start (fd, EVENT_READ); 361 x_ev.start (fd, EVENT_READ);
218 fcntl (fd, F_SETFD, FD_CLOEXEC); 362 fcntl (fd, F_SETFD, FD_CLOEXEC);
219 363
220 XSelectInput (display, root, PropertyChangeMask); 364 XSelectInput (display, root, PropertyChangeMask);
221#ifdef USE_XIM
222 xa_xim_servers = XInternAtom (display, "XIM_SERVERS", 0);
223#endif
224 365
225 flush (); 366 flush ();
226 367
227 return true; 368 return true;
228} 369}
229 370
371void
372rxvt_display::ref_next ()
373{
374 // TODO: somehow check wether the database files/resources changed
375 // before re-loading/parsing
376 XrmDestroyDatabase (XrmGetDatabase (display));
377 XrmSetDatabase (display, get_resources ());
378}
379
230rxvt_display::~rxvt_display () 380rxvt_display::~rxvt_display ()
231{ 381{
382 if (!display)
383 return;
384
385#ifdef POINTER_BLANK
386 XFreeCursor (display, blank_cursor);
387#endif
232 x_ev.stop (); 388 x_ev.stop ();
233#ifdef USE_XIM 389#ifdef USE_XIM
234 xims.clear (); 390 xims.clear ();
235#endif 391#endif
236
237 if (display)
238 XCloseDisplay (display); 392 XCloseDisplay (display);
239} 393}
240 394
241#ifdef USE_XIM 395#ifdef USE_XIM
242void rxvt_display::im_change_cb () 396void rxvt_display::im_change_cb ()
243{ 397{
251 // registers, as xlib crashes due to a race otherwise. 405 // registers, as xlib crashes due to a race otherwise.
252 Atom actual_type, *atoms; 406 Atom actual_type, *atoms;
253 int actual_format; 407 int actual_format;
254 unsigned long nitems, bytes_after; 408 unsigned long nitems, bytes_after;
255 409
256 if (XGetWindowProperty (display, root, xa_xim_servers, 0L, 1000000L, 410 if (XGetWindowProperty (display, root, xa[XA_XIM_SERVERS], 0L, 1000000L,
257 False, XA_ATOM, &actual_type, &actual_format, 411 False, XA_ATOM, &actual_type, &actual_format,
258 &nitems, &bytes_after, (unsigned char **)&atoms) 412 &nitems, &bytes_after, (unsigned char **)&atoms)
259 != Success ) 413 != Success )
260 return; 414 return;
261 415
279 XNextEvent (display, &xev); 433 XNextEvent (display, &xev);
280 434
281#ifdef USE_XIM 435#ifdef USE_XIM
282 if (!XFilterEvent (&xev, None)) 436 if (!XFilterEvent (&xev, None))
283 { 437 {
284
285 if (xev.type == PropertyNotify 438 if (xev.type == PropertyNotify
286 && xev.xany.window == root 439 && xev.xany.window == root
287 && xev.xproperty.atom == xa_xim_servers) 440 && xev.xproperty.atom == xa[XA_XIM_SERVERS])
288 im_change_check (); 441 im_change_check ();
289#endif 442#endif
290 for (int i = xw.size (); i--; ) 443 for (int i = xw.size (); i--; )
291 { 444 {
292 if (!xw[i]) 445 if (!xw[i])
382refcache<rxvt_display> displays; 535refcache<rxvt_display> displays;
383 536
384///////////////////////////////////////////////////////////////////////////// 537/////////////////////////////////////////////////////////////////////////////
385 538
386bool 539bool
387rxvt_color::set (rxvt_display *display, Pixel p) 540rxvt_color::set (rxvt_screen *screen, Pixel p)
388{ 541{
389#if XFT 542#if XFT
390 XColor xc; 543 XColor xc;
391 544
392 xc.pixel = p; 545 xc.pixel = p;
393 if (!XQueryColor (display->display, display->cmap, &xc)) 546 if (!XQueryColor (screen->xdisp, screen->cmap, &xc))
394 return false; 547 return false;
395 548
396 XRenderColor d; 549 XRenderColor d;
397 550
398 d.red = xc.red; 551 d.red = xc.red;
399 d.green = xc.green; 552 d.green = xc.green;
400 d.blue = xc.blue; 553 d.blue = xc.blue;
401 d.alpha = 0xffff; 554 d.alpha = 0xffff;
402 555
403 return 556 return
404 XftColorAllocValue (display->display, 557 XftColorAllocValue (screen->xdisp,
405 display->visual, 558 screen->visual,
406 display->cmap, 559 screen->cmap,
407 &d, &c); 560 &d, &c);
408#else 561#else
409 this->p = p; 562 this->p = p;
410#endif 563#endif
411 564
412 return true; 565 return true;
413} 566}
414 567
415bool 568bool
416rxvt_color::set (rxvt_display *display, const char *name) 569rxvt_color::set (rxvt_screen *screen, const char *name)
417{ 570{
418#if XFT 571#if XFT
419 return XftColorAllocName (display->display, display->visual, display->cmap, 572 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
420 name, &c);
421#else 573#else
422 XColor xc; 574 XColor xc;
423 575
424 if (XParseColor (display->display, display->cmap, name, &xc)) 576 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
425 return set (display, xc.red, xc.green, xc.blue); 577 return set (screen, xc.red, xc.green, xc.blue);
426 578
427 return false; 579 return false;
428#endif 580#endif
429} 581}
430 582
431bool 583bool
432rxvt_color::set (rxvt_display *display, unsigned short cr, unsigned short cg, unsigned short cb) 584rxvt_color::set (rxvt_screen *screen, unsigned short cr, unsigned short cg, unsigned short cb)
433{ 585{
434 XColor xc; 586 XColor xc;
435 587
436 xc.red = cr; 588 xc.red = cr;
437 xc.green = cg; 589 xc.green = cg;
438 xc.blue = cb; 590 xc.blue = cb;
439 xc.flags = DoRed | DoGreen | DoBlue; 591 xc.flags = DoRed | DoGreen | DoBlue;
440 592
441 if (XAllocColor (display->display, display->cmap, &xc)) 593 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
442 return set (display, xc.pixel); 594 return set (screen, xc.pixel);
443 595
444 return false; 596 return false;
445} 597}
446 598
447void 599void
448rxvt_color::get (rxvt_display *display, unsigned short &cr, unsigned short &cg, unsigned short &cb) 600rxvt_color::get (rxvt_screen *screen, unsigned short &cr, unsigned short &cg, unsigned short &cb)
449{ 601{
450#if XFT 602#if XFT
451 cr = c.color.red; 603 cr = c.color.red;
452 cg = c.color.green; 604 cg = c.color.green;
453 cb = c.color.blue; 605 cb = c.color.blue;
454#else 606#else
455 XColor c; 607 XColor c;
456 608
457 c.pixel = p; 609 c.pixel = p;
458 XQueryColor (display->display, display->cmap, &c); 610 XQueryColor (screen->xdisp, screen->cmap, &c);
459 611
460 cr = c.red; 612 cr = c.red;
461 cg = c.green; 613 cg = c.green;
462 cb = c.blue; 614 cb = c.blue;
463#endif 615#endif
464} 616}
465 617
466void 618void
467rxvt_color::free (rxvt_display *display) 619rxvt_color::free (rxvt_screen *screen)
468{ 620{
469#if XFT 621#if XFT
470 XftColorFree (display->display, display->visual, display->cmap, &c); 622 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
471#else 623#else
472 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 624 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
473#endif 625#endif
474} 626}
475 627
476rxvt_color 628rxvt_color
477rxvt_color::fade (rxvt_display *display, int percent) 629rxvt_color::fade (rxvt_screen *screen, int percent)
478{ 630{
479 percent = 100 - percent; 631 percent = 100 - percent;
480 632
481 unsigned short cr, cg, cb; 633 unsigned short cr, cg, cb;
482 rxvt_color faded; 634 rxvt_color faded;
483 635
484 get (display, cr, cg, cb); 636 get (screen, cr, cg, cb);
485 637
486 faded.set ( 638 faded.set (
487 display, 639 screen,
488 cr * percent / 100, 640 cr * percent / 100,
489 cg * percent / 100, 641 cg * percent / 100,
490 cb * percent / 100 642 cb * percent / 100
491 ); 643 );
492 644
494} 646}
495 647
496#define LERP(a,b,p) (a * p + b * (100 - p)) / 100 648#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
497 649
498rxvt_color 650rxvt_color
499rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 651rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
500{ 652{
501 percent = 100 - percent; 653 percent = 100 - percent;
502 654
503 unsigned short cr, cg, cb; 655 unsigned short cr, cg, cb;
504 unsigned short fcr, fcg, fcb; 656 unsigned short fcr, fcg, fcb;
505 rxvt_color faded; 657 rxvt_color faded;
506 658
507 get (display, cr, cg, cb); 659 get (screen, cr, cg, cb);
508 fadeto.get(display, fcr, fcg, fcb); 660 fadeto.get (screen, fcr, fcg, fcb);
509 661
510 faded.set ( 662 faded.set (
511 display, 663 screen,
512 LERP (cr, fcr, percent), 664 LERP (cr, fcr, percent),
513 LERP (cg, fcg, percent), 665 LERP (cg, fcg, percent),
514 LERP (cb, fcb, percent) 666 LERP (cb, fcb, percent)
515 ); 667 );
516 668

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines