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.51 by root, Sat Feb 18 14:14:43 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 ()
201 201
202#endif 202#endif
203 203
204///////////////////////////////////////////////////////////////////////////// 204/////////////////////////////////////////////////////////////////////////////
205 205
206#if XFT
207rxvt_drawable::~rxvt_drawable ()
208{
209 if (xftdrawable)
210 XftDrawDestroy (xftdrawable);
211}
212
213rxvt_drawable::operator XftDraw *()
214{
215 if (!xftdrawable)
216 xftdrawable = XftDrawCreate (screen->dpy, drawable, screen->visual, screen->cmap);
217
218 return xftdrawable;
219}
220#endif
221
222/////////////////////////////////////////////////////////////////////////////
223
224#if XFT
225
226// not strictly necessary as it is only used with superclass of zero_initialised
227rxvt_screen::rxvt_screen ()
228: scratch_area (0)
229{
230}
231
232rxvt_drawable &rxvt_screen::scratch_drawable (int w, int h)
233{
234 // it's actually faster to re-allocate every time. don't ask me
235 // why, but its likely no big deal there are no roundtrips
236 // (I think/hope).
237 if (!scratch_area || w > scratch_w || h > scratch_h || 1/*D*/)
238 {
239 if (scratch_area)
240 {
241 XFreePixmap (dpy, scratch_area->drawable);
242 delete scratch_area;
243 }
244
245 Pixmap pm = XCreatePixmap (dpy, RootWindowOfScreen (ScreenOfDisplay (dpy, display->screen)),
246 scratch_w = w, scratch_h = h, depth);
247
248 scratch_area = new rxvt_drawable (this, pm);
249 }
250
251 return *scratch_area;
252}
253
254#endif
255
206void 256void
207rxvt_screen::set (rxvt_display *disp) 257rxvt_screen::set (rxvt_display *disp)
208{ 258{
209 display = disp; 259 display = disp;
210 xdisp = disp->display; 260 dpy = disp->dpy;
211 261
212 Screen *screen = ScreenOfDisplay (xdisp, disp->screen); 262 Screen *screen = ScreenOfDisplay (dpy, disp->screen);
213 263
214 depth = DefaultDepthOfScreen (screen); 264 depth = DefaultDepthOfScreen (screen);
215 visual = DefaultVisualOfScreen (screen); 265 visual = DefaultVisualOfScreen (screen);
216 cmap = DefaultColormapOfScreen (screen); 266 cmap = DefaultColormapOfScreen (screen);
217} 267}
222 set (disp); 272 set (disp);
223 273
224#if XFT 274#if XFT
225 XVisualInfo vinfo; 275 XVisualInfo vinfo;
226 276
227 if (XMatchVisualInfo (xdisp, display->screen, bitdepth, TrueColor, &vinfo)) 277 if (XMatchVisualInfo (dpy, display->screen, bitdepth, TrueColor, &vinfo))
228 { 278 {
229 depth = bitdepth; 279 depth = bitdepth;
230 visual = vinfo.visual; 280 visual = vinfo.visual;
231 cmap = XCreateColormap (xdisp, disp->root, visual, AllocNone); 281 cmap = XCreateColormap (dpy, disp->root, visual, AllocNone);
232 } 282 }
233#endif 283#endif
234} 284}
235 285
236void 286void
237rxvt_screen::clear () 287rxvt_screen::clear ()
238{ 288{
289#if XFT
290 if (scratch_area)
291 {
292 XFreePixmap (dpy, scratch_area->drawable);
293 delete scratch_area;
294 }
295#endif
296
239 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (xdisp, display->screen))) 297 if (cmap != DefaultColormapOfScreen (ScreenOfDisplay (dpy, display->screen)))
240 XFreeColormap (xdisp, cmap); 298 XFreeColormap (dpy, cmap);
241} 299}
242 300
243///////////////////////////////////////////////////////////////////////////// 301/////////////////////////////////////////////////////////////////////////////
244 302
245rxvt_display::rxvt_display (const char *id) 303rxvt_display::rxvt_display (const char *id)
248, selection_owner (0) 306, selection_owner (0)
249{ 307{
250} 308}
251 309
252XrmDatabase 310XrmDatabase
253rxvt_display::get_resources () 311rxvt_display::get_resources (bool refresh)
254{ 312{
255 char *homedir = (char *)getenv ("HOME"); 313 char *homedir = (char *)getenv ("HOME");
256 char fname[1024]; 314 char fname[1024];
257 315
258 /* 316 /*
259 * get resources using the X library function 317 * get resources using the X library function
260 */ 318 */
261 char *displayResource, *xe; 319 char *displayResource, *xe;
262 XrmDatabase database, rdb1; 320 XrmDatabase rdb1, database = 0;
263
264 database = NULL;
265 321
266 // for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20 322 // for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20
267 323
268 // 6. System wide per application default file. 324 // 6. System wide per application default file.
269 325
279 // 5. User's per application default file. 335 // 5. User's per application default file.
280 // none 336 // none
281 337
282 // 4. User's defaults file. 338 // 4. User's defaults file.
283 /* Get any Xserver defaults */ 339 /* Get any Xserver defaults */
340 if (refresh)
341 {
342 // fucking xlib keeps a copy of the rm string
343 Atom actual_type;
344 int actual_format;
345 unsigned long nitems, nremaining;
346 char *val = 0;
347
348#if XLIB_ILLEGAL_ACCESS
349 if (dpy->xdefaults)
350 XFree (dpy->xdefaults);
351#endif
352
353 if (XGetWindowProperty (dpy, root, XA_RESOURCE_MANAGER,
354 0L, 100000000L, False,
355 XA_STRING, &actual_type, &actual_format,
356 &nitems, &nremaining,
357 (unsigned char **)&val) == Success
358 && actual_type == XA_STRING
359 && actual_format == 8)
360 displayResource = val;
361 else
362 {
363 displayResource = 0;
364 if (val)
365 XFree(val);
366 }
367
368#if XLIB_ILLEGAL_ACCESS
369 dpy->xdefaults = displayResource;
370#endif
371 }
372 else
284 displayResource = XResourceManagerString (display); 373 displayResource = XResourceManagerString (dpy);
285 374
286 if (displayResource != NULL) 375 if (displayResource)
287 { 376 {
288 if ((rdb1 = XrmGetStringDatabase (displayResource))) 377 if ((rdb1 = XrmGetStringDatabase (displayResource)))
289 XrmMergeDatabases (rdb1, &database); 378 XrmMergeDatabases (rdb1, &database);
290 } 379 }
291 else if (homedir) 380 else if (homedir)
294 383
295 if ((rdb1 = XrmGetFileDatabase (fname))) 384 if ((rdb1 = XrmGetFileDatabase (fname)))
296 XrmMergeDatabases (rdb1, &database); 385 XrmMergeDatabases (rdb1, &database);
297 } 386 }
298 387
388#if !XLIB_ILLEGAL_ACCESS
389 if (refresh && displayResource)
390 XFree (displayResource);
391#endif
392
299 /* Get screen specific resources */ 393 /* Get screen specific resources */
300 displayResource = XScreenResourceString (ScreenOfDisplay (display, screen)); 394 displayResource = XScreenResourceString (ScreenOfDisplay (dpy, screen));
301 395
302 if (displayResource != NULL) 396 if (displayResource)
303 { 397 {
304 if ((rdb1 = XrmGetStringDatabase (displayResource))) 398 if ((rdb1 = XrmGetStringDatabase (displayResource)))
305 /* Merge with screen-independent resources */ 399 /* Merge with screen-independent resources */
306 XrmMergeDatabases (rdb1, &database); 400 XrmMergeDatabases (rdb1, &database);
307 401
335 if (id[0] == ':') 429 if (id[0] == ':')
336 { 430 {
337 val = rxvt_malloc (5 + strlen (id) + 1); 431 val = rxvt_malloc (5 + strlen (id) + 1);
338 strcpy (val, "unix/"); 432 strcpy (val, "unix/");
339 strcat (val, id); 433 strcat (val, id);
340 display = XOpenDisplay (val); 434 dpy = XOpenDisplay (val);
341 free (val); 435 free (val);
342 } 436 }
343 else 437 else
344#endif 438#endif
345 display = 0; 439 dpy = 0;
346 440
347 if (!display) 441 if (!dpy)
348 display = XOpenDisplay (id); 442 dpy = XOpenDisplay (id);
349 443
350 if (!display) 444 if (!dpy)
351 return false; 445 return false;
352 446
353 screen = DefaultScreen (display); 447 screen = DefaultScreen (dpy);
354 root = DefaultRootWindow (display); 448 root = DefaultRootWindow (dpy);
355 449
356 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA); 450 assert (sizeof (xa_names) / sizeof (char *) == NUM_XA);
357 XInternAtoms (display, (char **)xa_names, NUM_XA, False, xa); 451 XInternAtoms (dpy, (char **)xa_names, NUM_XA, False, xa);
358 452
359 XrmSetDatabase (display, get_resources ()); 453 XrmSetDatabase (dpy, get_resources (false));
360 454
361#ifdef POINTER_BLANK 455#ifdef POINTER_BLANK
362 XColor blackcolour; 456 XColor blackcolour;
363 blackcolour.red = 0; 457 blackcolour.red = 0;
364 blackcolour.green = 0; 458 blackcolour.green = 0;
365 blackcolour.blue = 0; 459 blackcolour.blue = 0;
366 Font f = XLoadFont (display, "fixed"); 460 Font f = XLoadFont (dpy, "fixed");
367 blank_cursor = XCreateGlyphCursor (display, f, f, ' ', ' ', 461 blank_cursor = XCreateGlyphCursor (dpy, f, f, ' ', ' ',
368 &blackcolour, &blackcolour); 462 &blackcolour, &blackcolour);
369 XUnloadFont (display, f); 463 XUnloadFont (dpy, f);
370#endif 464#endif
371 465
372 int fd = XConnectionNumber (display); 466 int fd = XConnectionNumber (dpy);
373 467
374#ifndef NO_SLOW_LINK_SUPPORT 468#ifndef NO_SLOW_LINK_SUPPORT
375 // try to detect wether we have a local connection. 469 // try to detect wether we have a local connection.
376 // assume unix domains socket == local, everything else not 470 // assume unix domains socket == local, everything else not
377 // TODO: might want to check for inet/127.0.0.1 471 // TODO: might want to check for inet/127.0.0.1
384#endif 478#endif
385 479
386 x_ev.start (fd, EVENT_READ); 480 x_ev.start (fd, EVENT_READ);
387 fcntl (fd, F_SETFD, FD_CLOEXEC); 481 fcntl (fd, F_SETFD, FD_CLOEXEC);
388 482
389 XSelectInput (display, root, PropertyChangeMask); 483 XSelectInput (dpy, root, PropertyChangeMask);
390 484
391 flush (); 485 flush ();
392 486
393 return true; 487 return true;
394} 488}
396void 490void
397rxvt_display::ref_next () 491rxvt_display::ref_next ()
398{ 492{
399 // TODO: somehow check wether the database files/resources changed 493 // TODO: somehow check wether the database files/resources changed
400 // before affording re-loading/parsing 494 // before affording re-loading/parsing
401 XrmDestroyDatabase (XrmGetDatabase (display)); 495 XrmDestroyDatabase (XrmGetDatabase (dpy));
402 XrmSetDatabase (display, get_resources ()); 496 XrmSetDatabase (dpy, get_resources (true));
403} 497}
404 498
405rxvt_display::~rxvt_display () 499rxvt_display::~rxvt_display ()
406{ 500{
407 if (!display) 501 if (!dpy)
408 return; 502 return;
409 503
410#ifdef POINTER_BLANK 504#ifdef POINTER_BLANK
411 XFreeCursor (display, blank_cursor); 505 XFreeCursor (dpy, blank_cursor);
412#endif 506#endif
413 x_ev.stop (); 507 x_ev.stop ();
414#ifdef USE_XIM 508#ifdef USE_XIM
415 xims.clear (); 509 xims.clear ();
416#endif 510#endif
417 XCloseDisplay (display); 511 XCloseDisplay (dpy);
418} 512}
419 513
420#ifdef USE_XIM 514#ifdef USE_XIM
421void rxvt_display::im_change_cb () 515void rxvt_display::im_change_cb ()
422{ 516{
430 // registers, as xlib crashes due to a race otherwise. 524 // registers, as xlib crashes due to a race otherwise.
431 Atom actual_type, *atoms; 525 Atom actual_type, *atoms;
432 int actual_format; 526 int actual_format;
433 unsigned long nitems, bytes_after; 527 unsigned long nitems, bytes_after;
434 528
435 if (XGetWindowProperty (display, root, xa[XA_XIM_SERVERS], 0L, 1000000L, 529 if (XGetWindowProperty (dpy, root, xa[XA_XIM_SERVERS], 0L, 1000000L,
436 False, XA_ATOM, &actual_type, &actual_format, 530 False, XA_ATOM, &actual_type, &actual_format,
437 &nitems, &bytes_after, (unsigned char **)&atoms) 531 &nitems, &bytes_after, (unsigned char **)&atoms)
438 != Success ) 532 != Success )
439 return; 533 return;
440 534
441 if (actual_type == XA_ATOM && actual_format == 32) 535 if (actual_type == XA_ATOM && actual_format == 32)
442 for (int i = 0; i < nitems; i++) 536 for (int i = 0; i < nitems; i++)
443 if (XGetSelectionOwner (display, atoms[i])) 537 if (XGetSelectionOwner (dpy, atoms[i]))
444 { 538 {
445 im_change_cb (); 539 im_change_cb ();
446 break; 540 break;
447 } 541 }
448 542
453void rxvt_display::x_cb (io_watcher &w, short revents) 547void rxvt_display::x_cb (io_watcher &w, short revents)
454{ 548{
455 do 549 do
456 { 550 {
457 XEvent xev; 551 XEvent xev;
458 XNextEvent (display, &xev); 552 XNextEvent (dpy, &xev);
459 553
460#ifdef USE_XIM 554#ifdef USE_XIM
461 if (!XFilterEvent (&xev, None)) 555 if (!XFilterEvent (&xev, None))
462 { 556 {
463 if (xev.type == PropertyNotify 557 if (xev.type == PropertyNotify
474 } 568 }
475#ifdef USE_XIM 569#ifdef USE_XIM
476 } 570 }
477#endif 571#endif
478 } 572 }
479 while (XEventsQueued (display, QueuedAlready)); 573 while (XEventsQueued (dpy, QueuedAlready));
480 574
481 XFlush (display); 575 XFlush (dpy);
482} 576}
483 577
484void rxvt_display::flush () 578void rxvt_display::flush ()
485{ 579{
486 if (XEventsQueued (display, QueuedAlready)) 580 if (XEventsQueued (dpy, QueuedAlready))
487 x_cb (x_ev, EVENT_READ); 581 x_cb (x_ev, EVENT_READ);
488 582
489 XFlush (display); 583 XFlush (dpy);
490} 584}
491 585
492void rxvt_display::reg (xevent_watcher *w) 586void rxvt_display::reg (xevent_watcher *w)
493{ 587{
494 xw.push_back (w); 588 xw.push_back (w);
551 645
552#endif 646#endif
553 647
554Atom rxvt_display::atom (const char *name) 648Atom rxvt_display::atom (const char *name)
555{ 649{
556 return XInternAtom (display, name, False); 650 return XInternAtom (dpy, name, False);
557} 651}
558 652
559///////////////////////////////////////////////////////////////////////////// 653/////////////////////////////////////////////////////////////////////////////
560 654
561template class refcache<rxvt_display>; 655template class refcache<rxvt_display>;
571 665
572 // FUCKING Xft gets it wrong, of course, so work around it. 666 // FUCKING Xft gets it wrong, of course, so work around it.
573 // Transparency users should eat shit and die, and then 667 // Transparency users should eat shit and die, and then
574 // XRenderQueryPictIndexValues themselves plenty. 668 // XRenderQueryPictIndexValues themselves plenty.
575 if ((screen->visual->c_class == TrueColor) 669 if ((screen->visual->c_class == TrueColor)
576 && (format = XRenderFindVisualFormat (screen->xdisp, screen->visual))) 670 && (format = XRenderFindVisualFormat (screen->dpy, screen->visual)))
577 { 671 {
578 // the fun lies in doing everything manually... 672 // the fun lies in doing everything manually...
579 c.color.red = color.r; 673 c.color.red = color.r;
580 c.color.green = color.g; 674 c.color.green = color.g;
581 c.color.blue = color.b; 675 c.color.blue = color.b;
595 d.red = color.r; 689 d.red = color.r;
596 d.green = color.g; 690 d.green = color.g;
597 d.blue = color.b; 691 d.blue = color.b;
598 d.alpha = color.a; 692 d.alpha = color.a;
599 693
600 return XftColorAllocValue (screen->xdisp, screen->visual, screen->cmap, &d, &c); 694 return XftColorAllocValue (screen->dpy, screen->visual, screen->cmap, &d, &c);
601 } 695 }
602#else 696#else
603 c.red = color.r; 697 c.red = color.r;
604 c.green = color.g; 698 c.green = color.g;
605 c.blue = color.b; 699 c.blue = color.b;
613 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask )) 707 | (color.b * (screen->visual->blue_mask >> ctz (screen->visual->blue_mask ))
614 / rgba::MAX_CC) << ctz (screen->visual->blue_mask ); 708 / rgba::MAX_CC) << ctz (screen->visual->blue_mask );
615 709
616 return true; 710 return true;
617 } 711 }
618 else if (XAllocColor (screen->xdisp, screen->cmap, &c)) 712 else if (XAllocColor (screen->dpy, screen->cmap, &c))
619 return true; 713 return true;
620 else 714 else
621 c.pixel = (color.r + color.g + color.b) > 128*3 715 c.pixel = (color.r + color.g + color.b) > 128*3
622 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)) 716 ? WhitePixelOfScreen (DefaultScreenOfDisplay (screen->dpy))
623 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->xdisp)); 717 : BlackPixelOfScreen (DefaultScreenOfDisplay (screen->dpy));
624#endif 718#endif
625 719
626 return false; 720 return false;
627} 721}
628 722
645 // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format 739 // 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)) 740 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 { 741 {
648 XColor xc, xc_exact; 742 XColor xc, xc_exact;
649 743
650 if (XParseColor (screen->xdisp, screen->cmap, name, &xc)) 744 if (XParseColor (screen->dpy, screen->cmap, name, &xc))
651 { 745 {
652 c.r = xc.red; 746 c.r = xc.red;
653 c.g = xc.green; 747 c.g = xc.green;
654 c.b = xc.blue; 748 c.b = xc.blue;
655 } 749 }
683 for (int i = 0; i < cmap_size; i++) 777 for (int i = 0; i < cmap_size; i++)
684 colors [i].pixel = i; 778 colors [i].pixel = i;
685 779
686 // many kilobytes transfer per colour, but pseudocolor isn't worth 780 // many kilobytes transfer per colour, but pseudocolor isn't worth
687 // many extra optimisations. 781 // many extra optimisations.
688 XQueryColors (screen->xdisp, screen->cmap, colors, cmap_size); 782 XQueryColors (screen->dpy, screen->cmap, colors, cmap_size);
689 783
690 int diff = 0x7fffffffUL; 784 int diff = 0x7fffffffUL;
691 XColor *best = colors; 785 XColor *best = colors;
692 786
693 for (int i = 0; i < cmap_size; i++) 787 for (int i = 0; i < cmap_size; i++)
745 839
746void 840void
747rxvt_color::free (rxvt_screen *screen) 841rxvt_color::free (rxvt_screen *screen)
748{ 842{
749#if XFT 843#if XFT
750 XftColorFree (screen->xdisp, screen->visual, screen->cmap, &c); 844 XftColorFree (screen->dpy, screen->visual, screen->cmap, &c);
751#else 845#else
752 XFreeColors (screen->xdisp, screen->cmap, &c.pixel, 1, AllPlanes); 846 XFreeColors (screen->dpy, screen->cmap, &c.pixel, 1, AllPlanes);
753#endif 847#endif
754} 848}
755 849
756void 850void
757rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to) 851rxvt_color::fade (rxvt_screen *screen, int percent, rxvt_color &result, const rgba &to)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines