Blame clients/mwm/WmError.c

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