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.48 by root, Thu Feb 2 12:51:22 2006 UTC vs.
Revision 1.50 by root, Thu Feb 2 18:04:46 2006 UTC

177bool 177bool
178rxvt_xim::ref_init () 178rxvt_xim::ref_init ()
179{ 179{
180 display = GET_R->display; //HACK: TODO 180 display = GET_R->display; //HACK: TODO
181 181
182 xim = XOpenIM (display->display, NULL, NULL, NULL); 182 xim = XOpenIM (display->dpy, 0, 0, 0);
183 183
184 if (!xim) 184 if (!xim)
185 return false; 185 return false;
186 186
187 XIMCallback ximcallback; 187 XIMCallback ximcallback;
188 ximcallback.client_data = (XPointer)this; 188 ximcallback.client_data = (XPointer)this;
189 ximcallback.callback = im_destroy_cb; 189 ximcallback.callback = im_destroy_cb;
190 190
191 XSetIMValues (xim, XNDestroyCallback, &ximcallback, NULL); 191 XSetIMValues (xim, XNDestroyCallback, &ximcallback, 0);
192 192
193 return true; 193 return true;
194} 194}
195 195
196rxvt_xim::~rxvt_xim () 196rxvt_xim::~rxvt_xim ()
205 205
206void 206void
207rxvt_screen::set (rxvt_display *disp) 207rxvt_screen::set (rxvt_display *disp)
208{ 208{
209 display = disp; 209 display = disp;
210 xdisp = disp->display; 210 dpy = disp->dpy;
211 211
212 Screen *screen = ScreenOfDisplay (xdisp, disp->screen); 212 Screen *screen = ScreenOfDisplay (dpy, disp->screen);
213 213
214 depth = DefaultDepthOfScreen (screen); 214 depth = DefaultDepthOfScreen (screen);
215 visual = DefaultVisualOfScreen (screen); 215 visual = DefaultVisualOfScreen (screen);
216 cmap = DefaultColormapOfScreen (screen); 216 cmap = DefaultColormapOfScreen (screen);
217} 217}
222 set (disp); 222 set (disp);
223 223
224#if XFT 224#if XFT
225 XVisualInfo vinfo; 225 XVisualInfo vinfo;
226 226
227 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo)) 227 if (XMatchVisualInfo (dpy, display->screen, bitdepth, TrueColor, &vinfo))
228 { 228 {
229 depth = bitdepth; 229 depth = bitdepth;
230 visual = vinfo.visual; 230 visual = vinfo.visual;
231 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone); 231 cmap = XCreateColormap (dpy, disp->root, visual, AllocNone);
232 } 232 }
233#endif 233#endif
234} 234}
235 235
236void 236void
237rxvt_screen::clear () 237rxvt_screen::clear ()
238{ 238{
239 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (xdisp, display->screen))) 239 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (dpy, display->screen)))
240 XFreeColormap (xdisp, cmap); 240 XFreeColormap (dpy, cmap);
241} 241}
242 242
243///////////////////////////////////////////////////////////////////////////// 243/////////////////////////////////////////////////////////////////////////////
244 244
245rxvt_display::rxvt_display (const char *id) 245rxvt_display::rxvt_display (const char *id)
248, selection_owner (0) 248, selection_owner (0)
249{ 249{
250} 250}
251 251
252XrmDatabase 252XrmDatabase
253rxvt_display::get_resources () 253rxvt_display::get_resources (bool refresh)
254{ 254{
255 char *homedir = (char *)getenv ("HOME"); 255 char *homedir = (char *)getenv ("HOME");
256 char fname[1024]; 256 char fname[1024];
257 257
258 /* 258 /*
259 * get resources using the X library function 259 * get resources using the X library function
260 */ 260 */
261 char *displayResource, *xe; 261 char *displayResource, *xe;
262 XrmDatabase database, rdb1; 262 XrmDatabase rdb1, database = 0;
263
264 database = NULL;
265 263
266 // for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20 264 // for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20
267 265
268 // 6. System wide per application default file. 266 // 6. System wide per application default file.
269 267
279 // 5. User's per application default file. 277 // 5. User's per application default file.
280 // none 278 // none
281 279
282 // 4. User's defaults file. 280 // 4. User's defaults file.
283 /* Get any Xserver defaults */ 281 /* Get any Xserver defaults */
282 if (refresh)
283 {
284 // fucking xlib keeps a copy of the rm string
285 Atom actual_type;
286 int actual_format;
287 unsigned long nitems, nremaining;
288 char *val = 0;
289
290#if XLIB_ILLEGAL_ACCESS
291 if (dpy->xdefaults)
292 XFree (dpy->xdefaults);
293#endif
294
295 if (XGetWindowProperty (dpy, root, XA_RESOURCE_MANAGER,
296 0L, 100000000L, False,
297 XA_STRING, &actual_type, &actual_format,
298 &nitems, &nremaining,
299 (unsigned char **)&val) == Success
300 && actual_type == XA_STRING
301 && actual_format == 8)
302 displayResource = val;
303 else
304 {
305 displayResource = 0;
306 if (val)
307 XFree(val);
308 }
309
310#if XLIB_ILLEGAL_ACCESS
311 dpy->xdefaults = displayResource;
312#endif
313 }
314 else
284 displayResource = XResourceManagerString (display); 315 displayResource = XResourceManagerString (dpy);
285 316
286 if (displayResource != NULL) 317 if (displayResource)
287 { 318 {
288 if ((rdb1 = XrmGetStringDatabase (displayResource))) 319 if ((rdb1 = XrmGetStringDatabase (displayResource)))
289 XrmMergeDatabases (rdb1, &database); 320 XrmMergeDatabases (rdb1, &database);
290 } 321 }
291 else if (homedir) 322 else if (homedir)
294 325
295 if ((rdb1 = XrmGetFileDatabase (fname))) 326 if ((rdb1 = XrmGetFileDatabase (fname)))
296 XrmMergeDatabases (rdb1, &database); 327 XrmMergeDatabases (rdb1, &database);
297 } 328 }
298 329
330#if !XLIB_ILLEGAL_ACCESS
331 if (refresh && displayResource)
332 XFree (displayResource);
333#endif
334
299 /* Get screen specific resources */ 335 /* Get screen specific resources */
300 displayResource = XScreenResourceString (ScreenOfDisplay (display, screen)); 336 displayResource = XScreenResourceString (ScreenOfDisplay (dpy, screen));
301 337
302 if (displayResource != NULL) 338 if (displayResource)
303 { 339 {
304 if ((rdb1 = XrmGetStringDatabase (displayResource))) 340 if ((rdb1 = XrmGetStringDatabase (displayResource)))
305 /* Merge with screen-independent resources */ 341 /* Merge with screen-independent resources */
306 XrmMergeDatabases (rdb1, &database); 342 XrmMergeDatabases (rdb1, &database);
307 343
335 if (id[0] == ':') 371 if (id[0] == ':')
336 { 372 {
337 val = rxvt_malloc (5 + strlen (id) + 1); 373 val = rxvt_malloc (5 + strlen (id) + 1);
338 strcpy (val, "unix/"); 374 strcpy (val, "unix/");
339 strcat (val, id); 375 strcat (val, id);
340 display = XOpenDisplay (val); 376 dpy = XOpenDisplay (val);
341 free (val); 377 free (val);
342 } 378 }
343 else 379 else
344#endif 380#endif
345 display = 0; 381 dpy = 0;
346 382
347 if (!display) 383 if (!dpy)
348 display = XOpenDisplay (id); 384 dpy = XOpenDisplay (id);
349 385
350 if (!display) 386 if (!dpy)
351 return false; 387 return false;
352 388
353 screen = DefaultScreen (display); 389 screen = DefaultScreen (dpy);
354 root = DefaultRootWindow (display); 390 root = DefaultRootWindow (dpy);
355 391
356 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA); 392 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
357 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa); 393 XInternAtoms (dpy, (char **)xa_names, NUM_XA, False, xa);
358 394
359 XrmSetDatabase (display, get_resources ()); 395 XrmSetDatabase (dpy, get_resources (false));
360 396
361#ifdef POINTER_BLANK 397#ifdef POINTER_BLANK
362 XColor blackcolour; 398 XColor blackcolour;
363 blackcolour.red = 0; 399 blackcolour.red = 0;
364 blackcolour.green = 0; 400 blackcolour.green = 0;
365 blackcolour.blue = 0; 401 blackcolour.blue = 0;
366 Font f = XLoadFont (display, "fixed"); 402 Font f = XLoadFont (dpy, "fixed");
367 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 403 blank_cursor = XCreateGlyphCursor (dpy, f, f, ' ', ' ',
368 &blackcolour, &blackcolour); 404 &blackcolour, &blackcolour);
369 XUnloadFont (display, f); 405 XUnloadFont (dpy, f);
370#endif 406#endif
371 407
372 int fd = XConnectionNumber (display); 408 int fd = XConnectionNumber (dpy);
373 409
374#ifndef NO_SLOW_LINK_SUPPORT 410#ifndef NO_SLOW_LINK_SUPPORT
375 // try to detect wether we have a local connection. 411 // try to detect wether we have a local connection.
376 // assume unix domains socket == local, everything else not 412 // assume unix domains socket == local, everything else not
377 // TODO: might want to check for inet/127.0.0.1 413 // TODO: might want to check for inet/127.0.0.1
384#endif 420#endif
385 421
386 x_ev.start (fd, EVENT_READ); 422 x_ev.start (fd, EVENT_READ);
387 fcntl (fd, F_SETFD, FD_CLOEXEC); 423 fcntl (fd, F_SETFD, FD_CLOEXEC);
388 424
389 XSelectInput (display, root, PropertyChangeMask); 425 XSelectInput (dpy, root, PropertyChangeMask);
390 426
391 flush (); 427 flush ();
392 428
393 return true; 429 return true;
394} 430}
396void 432void
397rxvt_display::ref_next () 433rxvt_display::ref_next ()
398{ 434{
399 // TODO: somehow check wether the database files/resources changed 435 // TODO: somehow check wether the database files/resources changed
400 // before affording re-loading/parsing 436 // before affording re-loading/parsing
401 XrmDestroyDatabase (XrmGetDatabase (display)); 437 XrmDestroyDatabase (XrmGetDatabase (dpy));
402 XrmSetDatabase (display, get_resources ()); 438 XrmSetDatabase (dpy, get_resources (true));
403} 439}
404 440
405rxvt_display::~rxvt_display () 441rxvt_display::~rxvt_display ()
406{ 442{
407 if (!display) 443 if (!dpy)
408 return; 444 return;
409 445
410#ifdef POINTER_BLANK 446#ifdef POINTER_BLANK
411 XFreeCursor (display, blank_cursor); 447 XFreeCursor (dpy, blank_cursor);
412#endif 448#endif
413 x_ev.stop (); 449 x_ev.stop ();
414#ifdef USE_XIM 450#ifdef USE_XIM
415 xims.clear (); 451 xims.clear ();
416#endif 452#endif
417 XCloseDisplay (display); 453 XCloseDisplay (dpy);
418} 454}
419 455
420#ifdef USE_XIM 456#ifdef USE_XIM
421void rxvt_display::im_change_cb () 457void rxvt_display::im_change_cb ()
422{ 458{
430 // registers, as xlib crashes due to a race otherwise. 466 // registers, as xlib crashes due to a race otherwise.
431 Atom actual_type, *atoms; 467 Atom actual_type, *atoms;
432 int actual_format; 468 int actual_format;
433 unsigned long nitems, bytes_after; 469 unsigned long nitems, bytes_after;
434 470
435 if (XGetWindowProperty (display, root, xa[XA_XIM_SERVERS], 0L, 1000000L, 471 if (XGetWindowProperty (dpy, root, xa[XA_XIM_SERVERS], 0L, 1000000L,
436 False, XA_ATOM, &actual_type, &actual_format, 472 False, XA_ATOM, &actual_type, &actual_format,
437 &nitems, &bytes_after, (unsigned char **)&atoms) 473 &nitems, &bytes_after, (unsigned char **)&atoms)
438 != Success ) 474 != Success )
439 return; 475 return;
440 476
441 if (actual_type == XA_ATOM && actual_format == 32) 477 if (actual_type == XA_ATOM && actual_format == 32)
442 for (int i = 0; i < nitems; i++) 478 for (int i = 0; i < nitems; i++)
443 if (XGetSelectionOwner (display, atoms[i])) 479 if (XGetSelectionOwner (dpy, atoms[i]))
444 { 480 {
445 im_change_cb (); 481 im_change_cb ();
446 break; 482 break;
447 } 483 }
448 484
453void rxvt_display::x_cb (io_watcher &w, short revents) 489void rxvt_display::x_cb (io_watcher &w, short revents)
454{ 490{
455 do 491 do
456 { 492 {
457 XEvent xev; 493 XEvent xev;
458 XNextEvent (display, &xev); 494 XNextEvent (dpy, &xev);
459 495
460#ifdef USE_XIM 496#ifdef USE_XIM
461 if (!XFilterEvent (&xev, None)) 497 if (!XFilterEvent (&xev, None))
462 { 498 {
463 if (xev.type == PropertyNotify 499 if (xev.type == PropertyNotify
474 } 510 }
475#ifdef USE_XIM 511#ifdef USE_XIM
476 } 512 }
477#endif 513#endif
478 } 514 }
479 while (XEventsQueued (display, QueuedAlready)); 515 while (XEventsQueued (dpy, QueuedAlready));
480 516
481 XFlush (display); 517 XFlush (dpy);
482} 518}
483 519
484void rxvt_display::flush () 520void rxvt_display::flush ()
485{ 521{
486 if (XEventsQueued (display, QueuedAlready)) 522 if (XEventsQueued (dpy, QueuedAlready))
487 x_cb (x_ev, EVENT_READ); 523 x_cb (x_ev, EVENT_READ);
488 524
489 XFlush (display); 525 XFlush (dpy);
490} 526}
491 527
492void rxvt_display::reg (xevent_watcher *w) 528void rxvt_display::reg (xevent_watcher *w)
493{ 529{
494 xw.push_back (w); 530 xw.push_back (w);
551 587
552#endif 588#endif
553 589
554Atom rxvt_display::atom (const char *name) 590Atom rxvt_display::atom (const char *name)
555{ 591{
556 return XInternAtom (display, name, False); 592 return XInternAtom (dpy, name, False);
557} 593}
558 594
559///////////////////////////////////////////////////////////////////////////// 595/////////////////////////////////////////////////////////////////////////////
560 596
561template class refcache<rxvt_display>; 597template class refcache<rxvt_display>;
571 607
572 // FUCKING Xft gets it wrong, of course, so work around it. 608 // FUCKING Xft gets it wrong, of course, so work around it.
573 // Transparency users should eat shit and die, and then 609 // Transparency users should eat shit and die, and then
574 // XRenderQueryPictIndexValues themselves plenty. 610 // XRenderQueryPictIndexValues themselves plenty.
575 if ((screen->visual->c_class == TrueColor) 611 if ((screen->visual->c_class == TrueColor)
576 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) 612 && (format = XRenderFindVisualFormat (screen->dpy, screen->visual)))
577 { 613 {
578 // the fun lies in doing everything manually... 614 // the fun lies in doing everything manually...
579 c.color.red = color.r; 615 c.color.red = color.r;
580 c.color.green = color.g; 616 c.color.green = color.g;
581 c.color.blue = color.b; 617 c.color.blue = color.b;
595 d.red = color.r; 631 d.red = color.r;
596 d.green = color.g; 632 d.green = color.g;
597 d.blue = color.b; 633 d.blue = color.b;
598 d.alpha = color.a; 634 d.alpha = color.a;
599 635
600 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); 636 return XftColorAllocValue (screen->dpy, screen->visual, screen->cmap, &d, &c);
601 } 637 }
602#else 638#else
603 c.red = color.r; 639 c.red = color.r;
604 c.green = color.g; 640 c.green = color.g;
605 c.blue = color.b; 641 c.blue = color.b;
613 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) 649 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
614 / rgba::MAX_CC) << ctz (screen->visual->blue_mask ); 650 / rgba::MAX_CC) << ctz (screen->visual->blue_mask );
615 651
616 return true; 652 return true;
617 } 653 }
618 else if (XAllocColor (screen->xdisp, screen->cmap, &c)) 654 else if (XAllocColor (screen->dpy, screen->cmap, &c))
619 return true; 655 return true;
620 else 656 else
621 c.pixel = (color.r + color.g + color.b) > 128*3 657 c.pixel = (color.r + color.g + color.b) > 128*3
622 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)) 658 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->dpy))
623 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)); 659 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->dpy));
624#endif 660#endif
625 661
626 return false; 662 return false;
627} 663}
628 664
645 // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format 681 // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format
646 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%4hx/%4hx/%4hx/%4hx%c", &c.r, &c.g, &c.b, &c.a, &eos)) 682 if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%4hx/%4hx/%4hx/%4hx%c", &c.r, &c.g, &c.b, &c.a, &eos))
647 { 683 {
648 XColor xc, xc_exact; 684 XColor xc, xc_exact;
649 685
650 if (XParseColor (screen->xdisp, screen->cmap, name, &xc)) 686 if (XParseColor (screen->dpy, screen->cmap, name, &xc))
651 { 687 {
652 c.r = xc.red; 688 c.r = xc.red;
653 c.g = xc.green; 689 c.g = xc.green;
654 c.b = xc.blue; 690 c.b = xc.blue;
655 } 691 }
683 for (int i = 0; i < cmap_size; i++) 719 for (int i = 0; i < cmap_size; i++)
684 colors [i].pixel = i; 720 colors [i].pixel = i;
685 721
686 // many kilobytes transfer per colour, but pseudocolor isn't worth 722 // many kilobytes transfer per colour, but pseudocolor isn't worth
687 // many extra optimisations. 723 // many extra optimisations.
688 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size); 724 XQueryColors (screen->dpy, screen->cmap, colors, cmap_size);
689 725
690 int diff = 0x7fffffffUL; 726 int diff = 0x7fffffffUL;
691 XColor *best = colors; 727 XColor *best = colors;
692 728
693 for (int i = 0; i < cmap_size; i++) 729 for (int i = 0; i < cmap_size; i++)
745 781
746void 782void
747rxvt_color::free (rxvt_screen *screen) 783rxvt_color::free (rxvt_screen *screen)
748{ 784{
749#if XFT 785#if XFT
750 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 786 XftColorFree (screen->dpy, screen->visual, screen->cmap, &c);
751#else 787#else
752 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes); 788 XFreeColors (screen->dpy, screen->cmap, &c.pixel, 1, AllPlanes);
753#endif 789#endif
754} 790}
755 791
756void 792void
757rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to) 793rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines