/* * Motif * * Copyright (c) 1987-2012, The Open Group. All rights reserved. * * These libraries and programs are free software; you can * redistribute them and/or modify them under the terms of the GNU * Lesser General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) * any later version. * * These libraries and programs are distributed in the hope that * they will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public * License along with these librararies and programs; if not, write * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth * Floor, Boston, MA 02110-1301 USA */ /* * Motif Release 1.2.4 */ #ifdef HAVE_CONFIG_H #include #endif #ifdef REV_INFO #ifndef lint static char rcsid[] = "$XConsortium: WmError.c /main/6 1996/10/07 14:27:34 drk $" #endif #endif /* * (c) Copyright 1987, 1988, 1989, 1990 HEWLETT-PACKARD COMPANY */ /* * Included Files: */ #include "WmGlobal.h" #include #ifdef WSM #include
#endif /* WSM */ #include "WmXSMP.h" /* * Function Declarations: */ #include "WmError.h" #ifdef DEBUG #define E_MAJOR_CODE 0 #define E_MINOR_CODE 1 #define E_RESOURCE_ID 2 #define E_ERROR_SERIAL 3 #define E_CURRENT_SERIAL 4 #define NUM_E_STRINGS 5 static char *pchErrorFormatNames [NUM_E_STRINGS] = { "MajorCode", "MinorCode", "ResourceID", "ErrorSerial", "CurrentSerial" }; static char *pchDefaultErrorFormat [NUM_E_STRINGS] = { " %d ", " %d ", " %ld ", " %ld ", " %ld " }; static char *pchErrorFormat [NUM_E_STRINGS]; #endif /* DEBUG */ /*************************************<->************************************* * * WmInitErrorHandler (display) * * * Description: * ----------- * This function initializes the window manager error handler. * * * Inputs: * ------ * display = display we're talking about * ------- * *************************************<->***********************************/ void WmInitErrorHandler (Display *display) { #ifdef DEBUG char buffer[BUFSIZ]; int i; /* * Fetch the X error format strings from XErrorDB */ for (i = 0; i< NUM_E_STRINGS; i++) { XGetErrorDatabaseText (display, "XlibMessage", pchErrorFormatNames[i], pchDefaultErrorFormat[i], buffer, BUFSIZ); if ((pchErrorFormat[i] = (char *) XtMalloc (1+strlen(buffer))) == NULL) { Warning ("Insufficient memory for error message initialization."); ExitWM (1); } strcpy(pchErrorFormat[i], buffer); } #endif /* DEBUG */ XSetErrorHandler (WmXErrorHandler); XSetIOErrorHandler (WmXIOErrorHandler); XtSetWarningHandler (WmXtWarningHandler); XtSetErrorHandler (WmXtErrorHandler); } /* END OF FUNCTION WmInitErrorHandler */ /*************************************<->************************************* * * WmXErrorHandler (display, errorEvent) * * * Description: * ----------- * This function is the X error handler that is registered with X to * handle X errors resulting from window management activities. * * * Inputs: * ------ * display = display on which X error occurred * * errorEvent = pointer to a block of information describing the error * * * Outputs: * ------- * wmGD.errorFlag = set to True * * Return = 0 * *************************************<->***********************************/ int WmXErrorHandler (Display *display, XErrorEvent *errorEvent) { ClientData *pCD; #ifdef DEBUG char buffer[BUFSIZ]; char message[BUFSIZ]; XGetErrorText (display, errorEvent->error_code, buffer, BUFSIZ); Warning ("X error occurred during window management operation"); fprintf (stderr, "Description = '%s'\n ", buffer); fprintf (stderr, pchErrorFormat[E_MAJOR_CODE], errorEvent->request_code); sprintf(message, "%d", errorEvent->request_code); XGetErrorDatabaseText (display, "XRequest", message, " ", buffer, BUFSIZ); fprintf (stderr, " (%s)\n ", buffer); fprintf (stderr, pchErrorFormat[E_MINOR_CODE], errorEvent->minor_code); fprintf (stderr, "\n "); fprintf (stderr, pchErrorFormat[E_RESOURCE_ID], errorEvent->resourceid); fprintf (stderr, "\n "); fprintf (stderr, pchErrorFormat[E_ERROR_SERIAL], errorEvent->serial); fprintf (stderr, "\n "); fprintf (stderr, pchErrorFormat[E_CURRENT_SERIAL], LastKnownRequestProcessed(display)); fprintf (stderr, "\n"); #endif /* DEBUG */ /* * Check for a BadWindow error for a managed window. If this error * is detected indicate in the client data that the window no longer * exists. */ if ((errorEvent->error_code == BadWindow) && !XFindContext (DISPLAY, errorEvent->resourceid, wmGD.windowContextType, (caddr_t *)&pCD)) { if (errorEvent->resourceid == pCD->client) { pCD->clientFlags |= CLIENT_DESTROYED; } } wmGD.errorFlag = True; wmGD.errorResource = errorEvent->resourceid; wmGD.errorRequestCode = errorEvent->request_code; return (0); } /* END OF FUNCTION WmXErrorHandler */ /*************************************<->************************************* * * WmXIOErrorHandler (display) * * * Description: * ----------- * This function is the X IO error handler that is registered with X to * handle X IO errors. This function exits the window manager. * * * Inputs: * ------ * display = X display on which the X IO error occurred * *************************************<->***********************************/ int WmXIOErrorHandler (Display *display) { char err[100]; sprintf (err, "%s: %s\n", "I/O error on display:", XDisplayString(display)); Warning(err); ExitWM (WM_ERROR_EXIT_VALUE); /*NOTREACHED*/ return 1; } /* END OF FUNCTIONS WmXIOErrorHandler */ /*************************************<->************************************* * * WmXtErrorHandler (message) * * * Description: * ----------- * This function is registered as the X Toolkit fatal error handler. * * * Inputs: * ------ * message = pointer to an error message * *************************************<->***********************************/ void WmXtErrorHandler (char *message) { Warning (message); ExitWM (WM_ERROR_EXIT_VALUE); } /* END OF FUNCTION WmXtErrorHandler */ /*************************************<->************************************* * * WmXtWarningHandler (message) * * * Description: * ----------- * This function is registered as an X Toolkit warning handler. * * * Inputs: * ------ * message = pointer to a warning message * *************************************<->***********************************/ void WmXtWarningHandler (char *message) { #ifdef DEBUG Warning (message); #endif /* DEBUG */ } /* END OF FUNCTIONS WmXtWarningHandler */ /*************************************<->************************************* * * Warning (message) * * * Description: * ----------- * This function lists a message to stderr. * * * Inputs: * ------ * message = pointer to a message string * *************************************<->***********************************/ void Warning (char *message) { #ifdef WSM char pch[MAXWMPATH+1]; sprintf (pch, "%s: %s\n", GETMESSAGE(20, 1, "Workspace Manager"), message); _DtSimpleError (wmGD.mwmName, DtIgnore, NULL, pch, NULL); #else /* WSM */ fprintf (stderr, "%s: %s\n", wmGD.mwmName, message); fflush (stderr); #endif /* WSM */ } /* END OF FUNCTION Warning */ #ifdef WSM #ifdef DEBUGGER /******************************<->************************************* * * PrintFormatted (format, message, message, ...) * * * Description: * ----------- * This function lists several messages to stderr using fprinf() * formatting capabilities. * * Inputs: * ------ * s0-s9 = pointers to message strings * * Comments: * ------ * Caller must provide his/her own argv[0] to this function. ******************************<->***********************************/ /*VARARGS1*/ void PrintFormatted(char *f, char *s0, char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8, char *s9) /* limit of ten args */ { fprintf( stderr, f, s0, s1, s2, s3, s4, s5, s6, s7, s8, s9); fflush (stderr); } /* END OF FUNCTION PrintFormatted */ /************************ eof **************************/ #endif /* DEBUGGER */ #endif /* WSM */