… | |
… | |
11 | * Copyright (c) 1997 mj olesen <olesen@me.QueensU.CA> |
11 | * Copyright (c) 1997 mj olesen <olesen@me.QueensU.CA> |
12 | * - extensive modifications |
12 | * - extensive modifications |
13 | * Copyright (c) 1997,1998 Oezguer Kesim <kesim@math.fu-berlin.de> |
13 | * Copyright (c) 1997,1998 Oezguer Kesim <kesim@math.fu-berlin.de> |
14 | * Copyright (c) 1998-2001 Geoff Wing <gcw@pobox.com> |
14 | * Copyright (c) 1998-2001 Geoff Wing <gcw@pobox.com> |
15 | * - extensive modifications |
15 | * - extensive modifications |
16 | * Copyright (c) 2003-2010 Marc Lehmann <schmorp@schmorp.de> |
16 | * Copyright (c) 2003-2014 Marc Lehmann <schmorp@schmorp.de> |
17 | * |
17 | * |
18 | * This program is free software; you can redistribute it and/or modify |
18 | * This program is free software; you can redistribute it and/or modify |
19 | * it under the terms of the GNU General Public License as published by |
19 | * it under the terms of the GNU General Public License as published by |
20 | * the Free Software Foundation; either version 2 of the License, or |
20 | * the Free Software Foundation; either version 3 of the License, or |
21 | * (at your option) any later version. |
21 | * (at your option) any later version. |
22 | * |
22 | * |
23 | * This program is distributed in the hope that it will be useful, |
23 | * This program is distributed in the hope that it will be useful, |
24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
24 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
25 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
… | |
… | |
239 | |
239 | |
240 | #if USE_XIM |
240 | #if USE_XIM |
241 | im_destroy (); |
241 | im_destroy (); |
242 | #endif |
242 | #endif |
243 | scrollBar.destroy (); |
243 | scrollBar.destroy (); |
|
|
244 | |
|
|
245 | if (gc) |
244 | if (gc) XFreeGC (dpy, gc); |
246 | XFreeGC (dpy, gc); |
245 | |
247 | |
246 | delete drawable; |
248 | delete drawable; |
|
|
249 | |
247 | // destroy all windows |
250 | // destroy all windows |
248 | if (parent) |
251 | if (parent) |
249 | XDestroyWindow (dpy, parent); |
252 | XDestroyWindow (dpy, parent); |
250 | |
253 | |
251 | for (int i = 0; i < TOTAL_COLORS; i++) |
254 | for (int i = 0; i < TOTAL_COLORS; i++) |
… | |
… | |
274 | free (locale); |
277 | free (locale); |
275 | free (v_buffer); |
278 | free (v_buffer); |
276 | |
279 | |
277 | delete selection_req; |
280 | delete selection_req; |
278 | |
281 | |
|
|
282 | if (env && memcmp (env, envv->begin (), envv->size () * sizeof (char *))) |
|
|
283 | rxvt_warn ("env has been modified, probably as a result of a lib calling setenv.\n"); |
|
|
284 | |
|
|
285 | delete env; |
|
|
286 | |
279 | delete envv; |
287 | delete envv; |
280 | delete argv; |
288 | delete argv; |
281 | |
289 | |
282 | #ifdef KEYSYM_RESOURCE |
290 | #ifdef KEYSYM_RESOURCE |
283 | delete keyboard; |
291 | delete keyboard; |
284 | #endif |
292 | #endif |
285 | #ifndef NO_RESOURCES |
293 | #ifndef NO_RESOURCES |
286 | XrmDestroyDatabase (option_db); |
294 | XrmDestroyDatabase (option_db); |
287 | #endif |
295 | #endif |
|
|
296 | |
|
|
297 | SET_R ((rxvt_term *)0); |
288 | } |
298 | } |
289 | |
299 | |
290 | // child has exited, usually destroys |
300 | // child has exited, usually destroys |
291 | void |
301 | void |
292 | rxvt_term::child_cb (ev::child &w, int status) |
302 | rxvt_term::child_cb (ev::child &w, int status) |
… | |
… | |
380 | |
390 | |
381 | #if !ENABLE_MINIMAL |
391 | #if !ENABLE_MINIMAL |
382 | static void ecb_cold |
392 | static void ecb_cold |
383 | print_x_error (Display *dpy, XErrorEvent *event) |
393 | print_x_error (Display *dpy, XErrorEvent *event) |
384 | { |
394 | { |
385 | char buffer[BUFSIZ]; |
395 | char buffer[BUFSIZ]; |
386 | char mesg[BUFSIZ]; |
396 | char mesg[BUFSIZ]; |
387 | char number[32]; |
397 | char number[32]; |
388 | |
398 | |
389 | rxvt_warn ("An X Error occurred, trying to continue after report.\n"); |
399 | rxvt_warn ("An X Error occurred, trying to continue after report.\n"); |
390 | |
400 | |
391 | XGetErrorDatabaseText (dpy, "XlibMessage", "ErrorSerial", "Error Serial #%d", mesg, BUFSIZ); |
401 | XGetErrorDatabaseText (dpy, "XlibMessage", "ErrorSerial", "Error Serial #%d", mesg, BUFSIZ); |
392 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->serial); |
402 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->serial); |
393 | |
403 | |
394 | XGetErrorText (dpy, event->error_code, buffer, BUFSIZ); |
404 | XGetErrorText (dpy, event->error_code, buffer, BUFSIZ); |
395 | XGetErrorDatabaseText (dpy, "XlibMessage", "XError", "X Error", mesg, BUFSIZ); |
405 | XGetErrorDatabaseText (dpy, "XlibMessage", "XError", "X Error", mesg, BUFSIZ); |
396 | rxvt_warn ("+ %s: %s\n", mesg, buffer); |
406 | rxvt_warn ("+ %s: %s\n", mesg, buffer); |
397 | |
407 | |
398 | XGetErrorDatabaseText (dpy, "XlibMessage", "MajorCode", "Request Major code %d", mesg, BUFSIZ); |
408 | XGetErrorDatabaseText (dpy, "XlibMessage", "MajorCode", "Request Major code %d", mesg, BUFSIZ); |
399 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->request_code); |
409 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->request_code); |
400 | |
410 | |
401 | if (event->request_code >= 128) |
411 | if (event->request_code >= 128) |
402 | { |
412 | { |
403 | #if 0 |
413 | #if 0 |
404 | /* XListExtensions and probably query extensions hangs when there are multiple queues errors */ |
414 | /* XListExtensions and probably query extensions hangs when there are multiple queues errors */ |
405 | int nexts; |
415 | int nexts; |
406 | char **exts = XListExtensions (dpy, &nexts); |
416 | char **exts = XListExtensions (dpy, &nexts); |
407 | |
417 | |
408 | while (nexts) |
418 | while (nexts) |
409 | { |
419 | { |
410 | char *extname = exts [nexts - 1]; |
420 | char *extname = exts [nexts - 1]; |
411 | int major, first_event, first_error; |
421 | int major, first_event, first_error; |
412 | |
422 | |
413 | if (XQueryExtension (dpy, extname, &major, &first_event, &first_error) && major == event->request_code) |
423 | if (XQueryExtension (dpy, extname, &major, &first_event, &first_error) && major == event->request_code) |
414 | { |
424 | { |
415 | XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); |
425 | XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); |
416 | rxvt_warn ("+ (which is extension %s minor code %d)\n", extname, event->minor_code); |
426 | rxvt_warn ("+ (which is extension %s minor code %d)\n", extname, event->minor_code); |
417 | |
427 | |
418 | snprintf (buffer, BUFSIZ, "%s.%d", extname, event->minor_code); |
428 | snprintf (buffer, BUFSIZ, "%s.%d", extname, event->minor_code); |
419 | XGetErrorDatabaseText (dpy, "XRequest", buffer, "an unregistered minor code", buffer, BUFSIZ); |
429 | XGetErrorDatabaseText (dpy, "XRequest", buffer, "an unregistered minor code", buffer, BUFSIZ); |
420 | rxvt_warn ("+ (which is %s)\n", buffer); |
430 | rxvt_warn ("+ (which is %s)\n", buffer); |
421 | |
431 | |
422 | break; |
432 | break; |
423 | } |
433 | } |
424 | |
434 | |
425 | printf ("nextss %d %s\n", nexts, extname);//D |
435 | printf ("nextss %d %s\n", nexts, extname);//D |
426 | --nexts; |
436 | --nexts; |
427 | ++exts; |
437 | ++exts; |
428 | } |
438 | } |
429 | #else |
439 | #else |
430 | int nexts = 0; |
440 | int nexts = 0; |
431 | char **exts = 0; |
441 | char **exts = 0; |
432 | #endif |
442 | #endif |
433 | |
443 | |
434 | if (!nexts) |
444 | if (!nexts) |
435 | { |
445 | { |
436 | rxvt_warn ("+ (which is an unknown extension)\n", buffer); |
446 | rxvt_warn ("+ (which is an unknown extension)\n", buffer); |
437 | |
447 | |
438 | XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); |
448 | XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); |
439 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->minor_code); |
449 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->minor_code); |
440 | |
450 | |
441 | #if 0 |
451 | #if 0 |
442 | sprintf (number, "RENDER.%d", event->minor_code); |
452 | sprintf (number, "RENDER.%d", event->minor_code); |
443 | XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); |
453 | XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); |
444 | rxvt_warn ("+ (which is %s)\n", buffer); |
454 | rxvt_warn ("+ (which is %s)\n", buffer); |
445 | #endif |
455 | #endif |
446 | } |
456 | } |
447 | |
457 | |
448 | XFreeExtensionList (exts); |
458 | XFreeExtensionList (exts); |
449 | } |
459 | } |
450 | else |
460 | else |
451 | { |
461 | { |
452 | sprintf (number, "%d", event->request_code); |
462 | sprintf (number, "%d", event->request_code); |
453 | XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); |
463 | XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); |
454 | rxvt_warn ("+ (which is %s)\n", buffer); |
464 | rxvt_warn ("+ (which is %s)\n", buffer); |
455 | } |
465 | } |
456 | |
466 | |
457 | if (event->error_code == BadWindow |
467 | if (event->error_code == BadWindow |
458 | || event->error_code == BadPixmap |
468 | || event->error_code == BadPixmap |
459 | || event->error_code == BadCursor |
469 | || event->error_code == BadCursor |
460 | || event->error_code == BadFont |
470 | || event->error_code == BadFont |
461 | || event->error_code == BadDrawable |
471 | || event->error_code == BadDrawable |
462 | || event->error_code == BadColor |
472 | || event->error_code == BadColor |
463 | || event->error_code == BadGC |
473 | || event->error_code == BadGC |
464 | || event->error_code == BadIDChoice |
474 | || event->error_code == BadIDChoice |
465 | || event->error_code == BadValue |
475 | || event->error_code == BadValue |
466 | || event->error_code == BadAtom) |
476 | || event->error_code == BadAtom) |
467 | { |
477 | { |
468 | if (event->error_code == BadValue) |
478 | if (event->error_code == BadValue) |
469 | XGetErrorDatabaseText (dpy, "XlibMessage", "Value", "Value 0x%x", mesg, BUFSIZ); |
479 | XGetErrorDatabaseText (dpy, "XlibMessage", "Value", "Value 0x%x", mesg, BUFSIZ); |
470 | else if (event->error_code == BadAtom) |
480 | else if (event->error_code == BadAtom) |
471 | XGetErrorDatabaseText (dpy, "XlibMessage", "AtomID", "AtomID 0x%x", mesg, BUFSIZ); |
481 | XGetErrorDatabaseText (dpy, "XlibMessage", "AtomID", "AtomID 0x%x", mesg, BUFSIZ); |
472 | else |
482 | else |
473 | XGetErrorDatabaseText (dpy, "XlibMessage", "ResourceID", "ResourceID 0x%x", mesg, BUFSIZ); |
483 | XGetErrorDatabaseText (dpy, "XlibMessage", "ResourceID", "ResourceID 0x%x", mesg, BUFSIZ); |
474 | |
484 | |
475 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->resourceid); |
485 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->resourceid); |
476 | } |
486 | } |
477 | } |
487 | } |
478 | #endif |
488 | #endif |
479 | |
489 | |
480 | int ecb_cold |
490 | int ecb_cold |
481 | rxvt_xerror_handler (Display *display, XErrorEvent *event) |
491 | rxvt_xerror_handler (Display *display, XErrorEvent *event) |
482 | { |
492 | { |
483 | if (GET_R->allowedxerror == -1) |
493 | if (GET_R && GET_R->allowedxerror == -1) |
484 | GET_R->allowedxerror = event->error_code; |
494 | GET_R->allowedxerror = event->error_code; |
485 | else |
495 | else |
486 | { |
496 | { |
487 | // GET_R is most likely not the terminal which caused the error, |
497 | // GET_R is most likely not the terminal which caused the error, |
488 | // so just output the error and continue |
498 | // so just output the error and continue |
… | |
… | |
1367 | unsigned long fg, bg; |
1377 | unsigned long fg, bg; |
1368 | const char *p; |
1378 | const char *p; |
1369 | char **s; |
1379 | char **s; |
1370 | XIMStyles *xim_styles; |
1380 | XIMStyles *xim_styles; |
1371 | |
1381 | |
1372 | set_environ (envv); |
1382 | set_environ (env); |
1373 | |
1383 | |
1374 | if (! ((p = XSetLocaleModifiers (modifiers)) && *p)) |
1384 | if (!((p = XSetLocaleModifiers (modifiers)) && *p)) |
1375 | return false; |
1385 | return false; |
1376 | |
1386 | |
1377 | input_method = display->get_xim (locale, modifiers); |
1387 | input_method = display->get_xim (locale, modifiers); |
1378 | if (input_method == NULL) |
1388 | if (input_method == NULL) |
1379 | return false; |
1389 | return false; |
… | |
… | |
1687 | rxvt_term::update_background () |
1697 | rxvt_term::update_background () |
1688 | { |
1698 | { |
1689 | if (update_background_ev.is_active ()) |
1699 | if (update_background_ev.is_active ()) |
1690 | return; |
1700 | return; |
1691 | |
1701 | |
1692 | bg_invalidate (); |
|
|
1693 | |
|
|
1694 | if (!mapped) |
|
|
1695 | return; |
|
|
1696 | |
|
|
1697 | ev_tstamp to_wait = 0.5 - (ev::now () - bg_valid_since); |
1702 | ev_tstamp to_wait = 0.5 - (ev::now () - bg_valid_since); |
1698 | |
1703 | |
1699 | if (to_wait <= 0.) |
1704 | if (to_wait <= 0.) |
1700 | bg_render (); |
1705 | bg_render (); |
1701 | else |
1706 | else |