|
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
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
#ifdef REV_INFO
|
|
Packit |
b099d7 |
#ifndef lint
|
|
Packit |
b099d7 |
static char rcsid[] = "$XConsortium: WmSignal.c /main/6 1996/10/17 16:20:07 drk $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
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" /* This should be the first include */
|
|
Packit |
b099d7 |
#include <sys/types.h>
|
|
Packit |
b099d7 |
#include <sys/wait.h>
|
|
Packit |
b099d7 |
#include <signal.h>
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* include extern functions
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "WmFeedback.h"
|
|
Packit |
b099d7 |
#include "WmFunction.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Function Declarations:
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "WmSignal.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Global Variables:
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef WSM
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* AbortWmSignalHandler ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* This function is called on receipt of a fatal signal. We reset
|
|
Packit |
b099d7 |
* the keyboard focus to pointer root before aborting.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
AbortWmSignalHandler (int sig)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
struct sigaction sa;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Set input focus back to pointer root
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
XSetInputFocus(DISPLAY, PointerRoot, RevertToPointerRoot, CurrentTime);
|
|
Packit |
b099d7 |
XSync (DISPLAY, False);
|
|
Packit |
b099d7 |
XCloseDisplay (DISPLAY);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Invoke the default handler
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
(void) sigemptyset(&sa.sa_mask);
|
|
Packit |
b099d7 |
sa.sa_flags = 0;
|
|
Packit |
b099d7 |
sa.sa_handler = SIG_DFL;
|
|
Packit |
b099d7 |
(void) sigaction (sig, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
kill (getpid(), sig);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* END OF FUNCTION AbortSignalHandler */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* RestoreDefaultSignalHandlers ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* This function sets up the signal handlers for the window manager.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
RestoreDefaultSignalHandlers (void)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
struct sigaction sa;
|
|
Packit |
b099d7 |
struct sigaction osa;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Restore default action for signals we're interested in.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(void) sigemptyset(&sa.sa_mask);
|
|
Packit |
b099d7 |
sa.sa_flags = 0;
|
|
Packit |
b099d7 |
sa.sa_handler = SIG_DFL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((sigaction (SIGINT, (struct sigaction *) 0, &osa) != 0) ||
|
|
Packit |
b099d7 |
(osa.sa_handler != SIG_IGN))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
(void) sigaction (SIGINT, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((sigaction (SIGHUP, (struct sigaction *) 0, &osa) != 0) ||
|
|
Packit |
b099d7 |
(osa.sa_handler != SIG_IGN))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
(void) sigaction (SIGHUP, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(void) sigaction (SIGQUIT, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGTERM, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGPIPE, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGCHLD, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGILL, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGFPE, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGBUS, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGSEGV, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
#ifdef SIGSYS
|
|
Packit |
b099d7 |
(void) sigaction (SIGSYS, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
#endif /* WSM */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SetupWmSignalHandlers ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* This function sets up the signal handlers for the window manager.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void SetupWmSignalHandlers (int dummy)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
void (*signalHandler) ();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef WSM
|
|
Packit |
b099d7 |
struct sigaction sa;
|
|
Packit |
b099d7 |
struct sigaction osa;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Catch software signals that we ask the user about
|
|
Packit |
b099d7 |
* before quitting.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
(void) sigemptyset(&sa.sa_mask);
|
|
Packit |
b099d7 |
sa.sa_flags = 0;
|
|
Packit |
b099d7 |
sa.sa_handler = QuitWmSignalHandler;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((sigaction (SIGINT, (struct sigaction *) 0, &osa) != 0) ||
|
|
Packit |
b099d7 |
(osa.sa_handler != SIG_IGN))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
(void) sigaction (SIGINT, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((sigaction (SIGHUP, (struct sigaction *) 0, &osa) != 0) ||
|
|
Packit |
b099d7 |
(osa.sa_handler != SIG_IGN))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
(void) sigaction (SIGHUP, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(void) sigaction (SIGQUIT, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGTERM, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Ignore child death
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef SA_NOCLDWAIT
|
|
Packit |
b099d7 |
sa.sa_flags = SA_NOCLDWAIT; /* Don't create zombies */
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
sa.sa_flags = 0;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
sa.sa_handler = SIG_IGN;
|
|
Packit |
b099d7 |
(void) sigaction (SIGCHLD, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
sa.sa_flags = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Catch other fatal signals so we can reset the
|
|
Packit |
b099d7 |
* keyboard focus to pointer root before aborting
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
sa.sa_handler = AbortWmSignalHandler;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(void) sigaction (SIGILL, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGFPE, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGBUS, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
(void) sigaction (SIGSEGV, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
#ifdef SIGSYS
|
|
Packit |
b099d7 |
(void) sigaction (SIGSYS, &sa, (struct sigaction *) 0);
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#else /* not WSM - original mwm code*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
signalHandler = (void (*)())signal (SIGINT, SIG_IGN);
|
|
Packit |
b099d7 |
if (signalHandler != (void (*)())SIG_IGN)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
signal (SIGINT, QuitWmSignalHandler);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
signalHandler = (void (*)())signal (SIGHUP, SIG_IGN);
|
|
Packit |
b099d7 |
if (signalHandler != (void (*)())SIG_IGN)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
signal (SIGHUP, QuitWmSignalHandler);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
signal (SIGQUIT, QuitWmSignalHandler);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
signal (SIGTERM, QuitWmSignalHandler);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
signal (SIGCHLD, ChildProcSignalHandler);
|
|
Packit |
b099d7 |
#endif /* WSM */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* END OF FUNCTION SetupWmSignalHandlers */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* QuitWmSignalHandler ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* This function is called on receipt of a signal that is to terminate the
|
|
Packit |
b099d7 |
* window manager.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void QuitWmSignalHandler (int dummy)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (wmGD.showFeedback & WM_SHOW_FB_KILL)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ConfirmAction (ACTIVE_PSD, QUIT_MWM_ACTION);
|
|
Packit |
b099d7 |
XFlush(DISPLAY);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Do_Quit_Mwm(False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* END OF FUNCTION QuitWmSignalHandler */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ChildProcSignalHandler ()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* This function is called on receipt of a signal that the child of the
|
|
Packit |
b099d7 |
* window manager has terminated.
|
|
Packit |
b099d7 |
* This child signal handler is primarily used to wait() for child
|
|
Packit |
b099d7 |
* processes that were inherited from the user's .xsession if the last
|
|
Packit |
b099d7 |
* command in the .xsession is a "exec mwm". These inherited child
|
|
Packit |
b099d7 |
* processes were not spawned the WmFunction.c:F_Exec() routine and
|
|
Packit |
b099d7 |
* therefore would not be reaped by the wait() in that routine until
|
|
Packit |
b099d7 |
* a menu item using F_Exec() was invoked by the user.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void ChildProcSignalHandler (int dummy)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
pid_t pid;
|
|
Packit |
b099d7 |
int status;
|
|
Packit |
b099d7 |
void (*intStat) ();
|
|
Packit |
b099d7 |
void (*quitStat) ();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
intStat = (void (*)())signal (SIGINT, SIG_IGN);
|
|
Packit |
b099d7 |
quitStat = (void (*)())signal (SIGQUIT, SIG_IGN);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pid = wait(&status);
|
|
Packit |
b099d7 |
signal(SIGCHLD, ChildProcSignalHandler);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
signal (SIGINT, intStat);
|
|
Packit |
b099d7 |
signal (SIGQUIT, quitStat);
|
|
Packit |
b099d7 |
}
|