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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines