home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gwm18a.zip / error.c < prev    next >
C/C++ Source or Header  |  1995-07-03  |  4KB  |  201 lines

  1. /* Copyright 1989 GROUPE BULL -- See license conditions in file COPYRIGHT
  2.  * Copyright 1989 Massachusetts Institute of Technology
  3.  */
  4. /**************************************\
  5. *                          *
  6. *     BULL WINDOW MANAGER for X11    *
  7. *                        *
  8. *         error handling.           *
  9. *                        *
  10. \**************************************/
  11.  
  12. /*  include  */
  13. #include     <stdio.h>
  14. #include    <errno.h>
  15. #include     "EXTERN.h"
  16. #include     "gwm.h"
  17. #include    "wl_atom.h"
  18. #include    "yacc.h"
  19.  
  20. /*  external  */
  21.  
  22. extern void     UserMessage();
  23.  
  24. /*  global  */
  25.  
  26. /* request error codes */
  27.  
  28. #define MAX_X_EVENT 64
  29.  
  30. #ifdef SECURE
  31. char *eventtype[MAX_X_EVENT] = {
  32.     "zero",
  33.     "one",
  34.     "KeyPress",
  35.     "KeyRelease",
  36.     "ButtonPress",
  37.     "ButtonRelease",
  38.     "MotionNotify",
  39.     "EnterNotify",
  40.     "LeaveNotify",
  41.     "FocusIn",
  42.     "FocusOut",
  43.     "KeymapNotify",
  44.     "Expose",
  45.     "GraphicsExpose",
  46.     "NoExpose",
  47.     "VisibilityNotify",
  48.     "CreateNotify",
  49.     "DestroyNotify",
  50.     "UnmapNotify",
  51.     "MapNotify",
  52.     "MapRequest",
  53.     "ReparentNotify",
  54.     "ConfigureNotify",
  55.     "ConfigureRequest",
  56.     "GravityNotify",
  57.     "ResizeRequest",
  58.     "CirculateNotify",
  59.     "CirculateRequest",
  60.     "PropertyNotify",
  61.     "SelectionClear",
  62.     "SelectionRequest",
  63.     "SelectionNotify",
  64.     "ColormapNotify",
  65.     "ClientMessage",
  66.     "MappingNotify",
  67.     "LASTEvent",
  68.     "GWMUserEvent"
  69. };
  70.  
  71. #endif /* SECURE */
  72.  
  73. #ifdef DO_BUS_ERROR
  74. #define DoABusError() *((int *)0) = 1
  75. #else /* DO_BUS_ERROR */
  76. #define DoABusError()
  77. #endif /* DO_BUS_ERROR */
  78.  
  79. /*  routines  */
  80.  
  81. /* purposeful silent error handler */
  82.  
  83. NoXError(display, error)
  84. Display        *display;
  85. XErrorEvent    *error;
  86. {
  87.     ErrorStatus = error -> error_code;
  88. }
  89.  
  90. /*
  91.  * Normal verbose error handler 
  92.  */
  93.  
  94. XError(display, error)
  95. Display        *display;
  96. XErrorEvent    *error;
  97. {
  98.     char            msg[MAX_TEMP_STRING_SIZE], buffer[MAX_TEMP_STRING_SIZE];
  99.     char            number[32];
  100.  
  101.     /* aborts if anything occurs while decorating */
  102.  
  103.     if (GWM_window_being_decorated
  104.     && error -> error_code == BadWindow
  105.     && error -> resourceid == GWM_window_being_decorated -> client) {
  106.     ClientWindowClose(GWM_window_being_decorated);
  107.     GWM_window_being_decorated = 0;
  108.     /* flush errors, there are surely more coming along! */
  109.     FlushXErrors();
  110.     longjmp(wool_goes_here_on_error, 1);
  111.     } else if (wool_do_print_errors
  112. #ifndef DEBUG
  113.            && error -> error_code != BadWindow
  114.            && error -> error_code != BadDrawable
  115. #endif
  116.            ) {
  117.     if (GWM_Synchronize) {        /* only meaningful when sync */
  118.         if (wool_is_reading_file) {
  119.         wool_printf("\"%s\"", wool_is_reading_file);
  120.         wool_printf(": line %d, ", yylineno);
  121.         }
  122.         wool_stack_dump(0);
  123.     }
  124.     wool_puts("Gwm X error: ");
  125.     sprintf(number, "%d", error -> request_code);
  126.     XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer,
  127.                   MAX_TEMP_STRING_SIZE);
  128.     sprintf(msg, "%s(0x%x): ", buffer, error -> resourceid);
  129.     wool_puts(msg);
  130.     XGetErrorText(display, error -> error_code, msg,
  131.               MAX_TEMP_STRING_SIZE);
  132.     wool_puts(msg);
  133.     if (error -> minor_code)
  134.         sprintf(msg, " (minor = %d)", error -> minor_code);
  135.     wool_newline();
  136.     yyoutflush();
  137.     }
  138.     ErrorStatus = error -> error_code;
  139.     stop_if_in_dbx();
  140.     DoABusError();
  141. }
  142.  
  143. Error(s1, s2)
  144. char           *s1, *s2;
  145. {
  146.     UserMessage(s1, s2);
  147. }
  148.  
  149. void
  150. UserMessage(s1, s2)
  151. char           *s1, *s2;
  152. {
  153.     wool_puts(s1);
  154.     wool_puts(s2);
  155.     wool_newline();
  156. }
  157.  
  158. /* what to do when a wool-error occurs?
  159.  */
  160.  
  161. wool_error_handler()
  162. {
  163.     if (GWM_ServerGrabbed)
  164.     remove_grab(0);
  165.     if (GWM_is_restarting || GWM_is_ending)
  166.     GWM_BusErrorSignalHandler(0);    /* skip wool when error in ending */
  167.     if (GWM_Window_being_opened)
  168.         XMapWindow(dpy, GWM_Window_being_opened -> hook);
  169. }
  170.  
  171. /* some silent X primitives */
  172.  
  173. int
  174. GwmSilentXGetWindowProperty(display,w,property,long_offset,long_length,
  175.                 delete,req_type,actual_type_return,
  176.                 actual_format_return,nitems_return,
  177.                 bytes_after_return,prop_return)
  178.     Display*         display;
  179.     Window         w;
  180.     Atom         property;
  181.     long         long_offset;
  182.     long         long_length;
  183.     Bool         delete;
  184.     Atom         req_type;
  185.     Atom*         actual_type_return;
  186.     int*         actual_format_return;
  187.     unsigned long*     nitems_return;
  188.     unsigned long*     bytes_after_return;
  189.     unsigned char**     prop_return;
  190. {
  191.     int result;
  192.     XSetErrorHandler(NoXError);
  193.     result = XGetWindowProperty(display,w,property,long_offset,long_length,
  194.                 delete,req_type,actual_type_return,
  195.                 actual_format_return,nitems_return,
  196.                 bytes_after_return,prop_return);
  197.     XSync(dpy, 0);
  198.     XSetErrorHandler(XError);
  199.     return result;
  200. }
  201.