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.22 by root, Mon Jan 9 05:08:02 2006 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;
369}
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 ());
228} 378}
229 379
230rxvt_display::~rxvt_display () 380rxvt_display::~rxvt_display ()
231{ 381{
232 if (!display) 382 if (!display)
255 // registers, as xlib crashes due to a race otherwise. 405 // registers, as xlib crashes due to a race otherwise.
256 Atom actual_type, *atoms; 406 Atom actual_type, *atoms;
257 int actual_format; 407 int actual_format;
258 unsigned long nitems, bytes_after; 408 unsigned long nitems, bytes_after;
259 409
260 if (XGetWindowProperty (display, root, xa_xim_servers, 0L, 1000000L, 410 if (XGetWindowProperty (display, root, xa[XA_XIM_SERVERS], 0L, 1000000L,
261 False, XA_ATOM, &actual_type, &actual_format, 411 False, XA_ATOM, &actual_type, &actual_format,
262 &nitems, &bytes_after, (unsigned char **)&atoms) 412 &nitems, &bytes_after, (unsigned char **)&atoms)
263 != Success ) 413 != Success )
264 return; 414 return;
265 415
285#ifdef USE_XIM 435#ifdef USE_XIM
286 if (!XFilterEvent (&xev, None)) 436 if (!XFilterEvent (&xev, None))
287 { 437 {
288 if (xev.type == PropertyNotify 438 if (xev.type == PropertyNotify
289 && xev.xany.window == root 439 && xev.xany.window == root
290 && xev.xproperty.atom == xa_xim_servers) 440 && xev.xproperty.atom == xa[XA_XIM_SERVERS])
291 im_change_check (); 441 im_change_check ();
292#endif 442#endif
293 for (int i = xw.size (); i--; ) 443 for (int i = xw.size (); i--; )
294 { 444 {
295 if (!xw[i]) 445 if (!xw[i])
385refcache<rxvt_display> displays; 535refcache<rxvt_display> displays;
386 536
387///////////////////////////////////////////////////////////////////////////// 537/////////////////////////////////////////////////////////////////////////////
388 538
389bool 539bool
390rxvt_color::set (rxvt_display *display, Pixel p) 540rxvt_color::set (rxvt_screen *screen, Pixel p)
391{ 541{
392#if XFT 542#if XFT
393 XColor xc; 543 XColor xc;
394 544
395 xc.pixel = p; 545 xc.pixel = p;
396 if (!XQueryColor (display->display, display->cmap, &xc)) 546 if (!XQueryColor (screen->xdisp, screen->cmap, &xc))
397 return false; 547 return false;
398 548
399 XRenderColor d; 549 XRenderColor d;
400 550
401 d.red = xc.red; 551 d.red = xc.red;
402 d.green = xc.green; 552 d.green = xc.green;
403 d.blue = xc.blue; 553 d.blue = xc.blue;
404 d.alpha = 0xffff; 554 d.alpha = 0xffff;
405 555
406 return 556 return
407 XftColorAllocValue (display->display, 557 XftColorAllocValue (screen->xdisp,
408 display->visual, 558 screen->visual,
409 display->cmap, 559 screen->cmap,
410 &d, &c); 560 &d, &c);
411#else 561#else
412 this->p = p; 562 this->p = p;
413#endif 563#endif
414 564
415 return true; 565 return true;
416} 566}
417 567
418bool 568bool
419rxvt_color::set (rxvt_display *display, const char *name) 569rxvt_color::set (rxvt_screen *screen, const char *name)
420{ 570{
421#if XFT 571#if XFT
422 return XftColorAllocName (display->display, display->visual, display->cmap, 572 return XftColorAllocName (screen->xdisp, screen->visual, screen->cmap, name, &c);
423 name, &c);
424#else 573#else
425 XColor xc; 574 XColor xc;
426 575
427 if (XParseColor (display->display, display->cmap, name, &xc)) 576 if (XParseColor (screen->xdisp, screen->cmap, name, &xc))
428 return set (display, xc.red, xc.green, xc.blue); 577 return set (screen, xc.red, xc.green, xc.blue);
429 578
430 return false; 579 return false;
431#endif 580#endif
432} 581}
433 582
434bool 583bool
435rxvt_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)
436{ 585{
437 XColor xc; 586 XColor xc;
438 587
439 xc.red = cr; 588 xc.red = cr;
440 xc.green = cg; 589 xc.green = cg;
441 xc.blue = cb; 590 xc.blue = cb;
442 xc.flags = DoRed | DoGreen | DoBlue; 591 xc.flags = DoRed | DoGreen | DoBlue;
443 592
444 if (XAllocColor (display->display, display->cmap, &xc)) 593 if (XAllocColor (screen->xdisp, screen->cmap, &xc))
445 return set (display, xc.pixel); 594 return set (screen, xc.pixel);
446 595
447 return false; 596 return false;
448} 597}
449 598
450void 599void
451rxvt_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)
452{ 601{
453#if XFT 602#if XFT
454 cr = c.color.red; 603 cr = c.color.red;
455 cg = c.color.green; 604 cg = c.color.green;
456 cb = c.color.blue; 605 cb = c.color.blue;
457#else 606#else
458 XColor c; 607 XColor c;
459 608
460 c.pixel = p; 609 c.pixel = p;
461 XQueryColor (display->display, display->cmap, &c); 610 XQueryColor (screen->xdisp, screen->cmap, &c);
462 611
463 cr = c.red; 612 cr = c.red;
464 cg = c.green; 613 cg = c.green;
465 cb = c.blue; 614 cb = c.blue;
466#endif 615#endif
467} 616}
468 617
469void 618void
470rxvt_color::free (rxvt_display *display) 619rxvt_color::free (rxvt_screen *screen)
471{ 620{
472#if XFT 621#if XFT
473 XftColorFree (display->display, display->visual, display->cmap, &c); 622 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c);
474#else 623#else
475 XFreeColors (display->display, display->cmap, &p, 1, AllPlanes); 624 XFreeColors (screen->xdisp, screen->cmap, &p, 1, AllPlanes);
476#endif 625#endif
477} 626}
478 627
479rxvt_color 628rxvt_color
480rxvt_color::fade (rxvt_display *display, int percent) 629rxvt_color::fade (rxvt_screen *screen, int percent)
481{ 630{
482 percent = 100 - percent; 631 percent = 100 - percent;
483 632
484 unsigned short cr, cg, cb; 633 unsigned short cr, cg, cb;
485 rxvt_color faded; 634 rxvt_color faded;
486 635
487 get (display, cr, cg, cb); 636 get (screen, cr, cg, cb);
488 637
489 faded.set ( 638 faded.set (
490 display, 639 screen,
491 cr * percent / 100, 640 cr * percent / 100,
492 cg * percent / 100, 641 cg * percent / 100,
493 cb * percent / 100 642 cb * percent / 100
494 ); 643 );
495 644
497} 646}
498 647
499#define LERP(a,b,p) (a * p + b * (100 - p)) / 100 648#define LERP(a,b,p) (a * p + b * (100 - p)) / 100
500 649
501rxvt_color 650rxvt_color
502rxvt_color::fade (rxvt_display *display, int percent, rxvt_color &fadeto) 651rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &fadeto)
503{ 652{
504 percent = 100 - percent; 653 percent = 100 - percent;
505 654
506 unsigned short cr, cg, cb; 655 unsigned short cr, cg, cb;
507 unsigned short fcr, fcg, fcb; 656 unsigned short fcr, fcg, fcb;
508 rxvt_color faded; 657 rxvt_color faded;
509 658
510 get (display, cr, cg, cb); 659 get (screen, cr, cg, cb);
511 fadeto.get(display, fcr, fcg, fcb); 660 fadeto.get (screen, fcr, fcg, fcb);
512 661
513 faded.set ( 662 faded.set (
514 display, 663 screen,
515 LERP (cr, fcr, percent), 664 LERP (cr, fcr, percent),
516 LERP (cg, fcg, percent), 665 LERP (cg, fcg, percent),
517 LERP (cb, fcb, percent) 666 LERP (cb, fcb, percent)
518 ); 667 );
519 668

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines