… | |
… | |
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 3 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. |
… | |
… | |
277 | free (locale); |
277 | free (locale); |
278 | free (v_buffer); |
278 | free (v_buffer); |
279 | |
279 | |
280 | delete selection_req; |
280 | delete selection_req; |
281 | |
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 | |
282 | delete envv; |
287 | delete envv; |
283 | delete argv; |
288 | delete argv; |
284 | |
289 | |
285 | #ifdef KEYSYM_RESOURCE |
290 | #ifdef KEYSYM_RESOURCE |
286 | delete keyboard; |
291 | delete keyboard; |
287 | #endif |
292 | #endif |
288 | #ifndef NO_RESOURCES |
293 | #ifndef NO_RESOURCES |
289 | XrmDestroyDatabase (option_db); |
294 | XrmDestroyDatabase (option_db); |
290 | #endif |
295 | #endif |
|
|
296 | |
|
|
297 | SET_R ((rxvt_term *)0); |
291 | } |
298 | } |
292 | |
299 | |
293 | // child has exited, usually destroys |
300 | // child has exited, usually destroys |
294 | void |
301 | void |
295 | rxvt_term::child_cb (ev::child &w, int status) |
302 | rxvt_term::child_cb (ev::child &w, int status) |
… | |
… | |
383 | |
390 | |
384 | #if !ENABLE_MINIMAL |
391 | #if !ENABLE_MINIMAL |
385 | static void ecb_cold |
392 | static void ecb_cold |
386 | print_x_error (Display *dpy, XErrorEvent *event) |
393 | print_x_error (Display *dpy, XErrorEvent *event) |
387 | { |
394 | { |
388 | char buffer[BUFSIZ]; |
395 | char buffer[BUFSIZ]; |
389 | char mesg[BUFSIZ]; |
396 | char mesg[BUFSIZ]; |
390 | char number[32]; |
397 | char number[32]; |
391 | |
398 | |
392 | 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"); |
393 | |
400 | |
394 | XGetErrorDatabaseText (dpy, "XlibMessage", "ErrorSerial", "Error Serial #%d", mesg, BUFSIZ); |
401 | XGetErrorDatabaseText (dpy, "XlibMessage", "ErrorSerial", "Error Serial #%d", mesg, BUFSIZ); |
395 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->serial); |
402 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->serial); |
396 | |
403 | |
397 | XGetErrorText (dpy, event->error_code, buffer, BUFSIZ); |
404 | XGetErrorText (dpy, event->error_code, buffer, BUFSIZ); |
398 | XGetErrorDatabaseText (dpy, "XlibMessage", "XError", "X Error", mesg, BUFSIZ); |
405 | XGetErrorDatabaseText (dpy, "XlibMessage", "XError", "X Error", mesg, BUFSIZ); |
399 | rxvt_warn ("+ %s: %s\n", mesg, buffer); |
406 | rxvt_warn ("+ %s: %s\n", mesg, buffer); |
400 | |
407 | |
401 | XGetErrorDatabaseText (dpy, "XlibMessage", "MajorCode", "Request Major code %d", mesg, BUFSIZ); |
408 | XGetErrorDatabaseText (dpy, "XlibMessage", "MajorCode", "Request Major code %d", mesg, BUFSIZ); |
402 | 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); |
403 | |
410 | |
404 | if (event->request_code >= 128) |
411 | if (event->request_code >= 128) |
405 | { |
412 | { |
406 | #if 0 |
413 | #if 0 |
407 | /* 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 */ |
408 | int nexts; |
415 | int nexts; |
409 | char **exts = XListExtensions (dpy, &nexts); |
416 | char **exts = XListExtensions (dpy, &nexts); |
410 | |
417 | |
411 | while (nexts) |
418 | while (nexts) |
412 | { |
419 | { |
413 | char *extname = exts [nexts - 1]; |
420 | char *extname = exts [nexts - 1]; |
414 | int major, first_event, first_error; |
421 | int major, first_event, first_error; |
415 | |
422 | |
416 | 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) |
417 | { |
424 | { |
418 | XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); |
425 | XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); |
419 | 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); |
420 | |
427 | |
421 | snprintf (buffer, BUFSIZ, "%s.%d", extname, event->minor_code); |
428 | snprintf (buffer, BUFSIZ, "%s.%d", extname, event->minor_code); |
422 | XGetErrorDatabaseText (dpy, "XRequest", buffer, "an unregistered minor code", buffer, BUFSIZ); |
429 | XGetErrorDatabaseText (dpy, "XRequest", buffer, "an unregistered minor code", buffer, BUFSIZ); |
423 | rxvt_warn ("+ (which is %s)\n", buffer); |
430 | rxvt_warn ("+ (which is %s)\n", buffer); |
424 | |
431 | |
425 | break; |
432 | break; |
426 | } |
433 | } |
427 | |
434 | |
428 | printf ("nextss %d %s\n", nexts, extname);//D |
435 | printf ("nextss %d %s\n", nexts, extname);//D |
429 | --nexts; |
436 | --nexts; |
430 | ++exts; |
437 | ++exts; |
431 | } |
438 | } |
432 | #else |
439 | #else |
433 | int nexts = 0; |
440 | int nexts = 0; |
434 | char **exts = 0; |
441 | char **exts = 0; |
435 | #endif |
442 | #endif |
436 | |
443 | |
437 | if (!nexts) |
444 | if (!nexts) |
438 | { |
445 | { |
439 | rxvt_warn ("+ (which is an unknown extension)\n", buffer); |
446 | rxvt_warn ("+ (which is an unknown extension)\n", buffer); |
440 | |
447 | |
441 | XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); |
448 | XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); |
442 | 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); |
443 | |
450 | |
444 | #if 0 |
451 | #if 0 |
445 | sprintf (number, "RENDER.%d", event->minor_code); |
452 | sprintf (number, "RENDER.%d", event->minor_code); |
446 | XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); |
453 | XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); |
447 | rxvt_warn ("+ (which is %s)\n", buffer); |
454 | rxvt_warn ("+ (which is %s)\n", buffer); |
448 | #endif |
455 | #endif |
449 | } |
456 | } |
450 | |
457 | |
451 | XFreeExtensionList (exts); |
458 | XFreeExtensionList (exts); |
452 | } |
459 | } |
453 | else |
460 | else |
454 | { |
461 | { |
455 | sprintf (number, "%d", event->request_code); |
462 | sprintf (number, "%d", event->request_code); |
456 | XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); |
463 | XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); |
457 | rxvt_warn ("+ (which is %s)\n", buffer); |
464 | rxvt_warn ("+ (which is %s)\n", buffer); |
458 | } |
465 | } |
459 | |
466 | |
460 | if (event->error_code == BadWindow |
467 | if (event->error_code == BadWindow |
461 | || event->error_code == BadPixmap |
468 | || event->error_code == BadPixmap |
462 | || event->error_code == BadCursor |
469 | || event->error_code == BadCursor |
463 | || event->error_code == BadFont |
470 | || event->error_code == BadFont |
464 | || event->error_code == BadDrawable |
471 | || event->error_code == BadDrawable |
465 | || event->error_code == BadColor |
472 | || event->error_code == BadColor |
466 | || event->error_code == BadGC |
473 | || event->error_code == BadGC |
467 | || event->error_code == BadIDChoice |
474 | || event->error_code == BadIDChoice |
468 | || event->error_code == BadValue |
475 | || event->error_code == BadValue |
469 | || event->error_code == BadAtom) |
476 | || event->error_code == BadAtom) |
470 | { |
477 | { |
471 | if (event->error_code == BadValue) |
478 | if (event->error_code == BadValue) |
472 | XGetErrorDatabaseText (dpy, "XlibMessage", "Value", "Value 0x%x", mesg, BUFSIZ); |
479 | XGetErrorDatabaseText (dpy, "XlibMessage", "Value", "Value 0x%x", mesg, BUFSIZ); |
473 | else if (event->error_code == BadAtom) |
480 | else if (event->error_code == BadAtom) |
474 | XGetErrorDatabaseText (dpy, "XlibMessage", "AtomID", "AtomID 0x%x", mesg, BUFSIZ); |
481 | XGetErrorDatabaseText (dpy, "XlibMessage", "AtomID", "AtomID 0x%x", mesg, BUFSIZ); |
475 | else |
482 | else |
476 | XGetErrorDatabaseText (dpy, "XlibMessage", "ResourceID", "ResourceID 0x%x", mesg, BUFSIZ); |
483 | XGetErrorDatabaseText (dpy, "XlibMessage", "ResourceID", "ResourceID 0x%x", mesg, BUFSIZ); |
477 | |
484 | |
478 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->resourceid); |
485 | snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->resourceid); |
479 | } |
486 | } |
480 | } |
487 | } |
481 | #endif |
488 | #endif |
482 | |
489 | |
483 | int ecb_cold |
490 | int ecb_cold |
484 | rxvt_xerror_handler (Display *display, XErrorEvent *event) |
491 | rxvt_xerror_handler (Display *display, XErrorEvent *event) |
485 | { |
492 | { |
486 | if (GET_R->allowedxerror == -1) |
493 | if (GET_R && GET_R->allowedxerror == -1) |
487 | GET_R->allowedxerror = event->error_code; |
494 | GET_R->allowedxerror = event->error_code; |
488 | else |
495 | else |
489 | { |
496 | { |
490 | // 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, |
491 | // so just output the error and continue |
498 | // so just output the error and continue |
… | |
… | |
1370 | unsigned long fg, bg; |
1377 | unsigned long fg, bg; |
1371 | const char *p; |
1378 | const char *p; |
1372 | char **s; |
1379 | char **s; |
1373 | XIMStyles *xim_styles; |
1380 | XIMStyles *xim_styles; |
1374 | |
1381 | |
1375 | set_environ (envv); |
1382 | set_environ (env); |
1376 | |
1383 | |
1377 | if (!((p = XSetLocaleModifiers (modifiers)) && *p)) |
1384 | if (!((p = XSetLocaleModifiers (modifiers)) && *p)) |
1378 | return false; |
1385 | return false; |
1379 | |
1386 | |
1380 | input_method = display->get_xim (locale, modifiers); |
1387 | input_method = display->get_xim (locale, modifiers); |