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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines