Blame clients/mwm/WmMain.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.1
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[] = "$TOG: WmMain.c /main/8 1998/04/20 13:01:09 mgreess $"
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
Packit b099d7
#include <X11/Xlocale.h>
Packit b099d7
#ifdef WSM
Packit b099d7
#include 
Packit b099d7
#include 
Packit b099d7
#endif /* WSM */
Packit b099d7
/*
Packit b099d7
 * include extern functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmCEvent.h"
Packit b099d7
#include "WmEvent.h"
Packit b099d7
#include "WmInitWs.h"
Packit b099d7
#ifdef WSM
Packit b099d7
#include "WmIPC.h"
Packit b099d7
#include "WmBackdrop.h"
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function Declarations:
Packit b099d7
 */
Packit b099d7
#ifdef WSM
Packit b099d7
int WmReturnIdentity (int argc, char *argv[], char *environ[]);
Packit b099d7
#define ManagedRoot(w) (!XFindContext (DISPLAY, (w), wmGD.screenContextType, \
Packit b099d7
(caddr_t *)&pSD) ? (SetActiveScreen (pSD), True) : \
Packit b099d7
(IsBackdropWindow (ACTIVE_PSD, (w))))
Packit b099d7
#else /* WSM */
Packit b099d7
#define ManagedRoot(w) (!XFindContext (DISPLAY, (w), wmGD.screenContextType, \
Packit b099d7
(caddr_t *)&pSD) ? (SetActiveScreen (pSD), True) : False)
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
WmScreenData *pSD;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Global Variables:
Packit b099d7
 */
Packit b099d7
Packit b099d7
WmGlobalData wmGD;
Packit b099d7
#ifndef NO_MESSAGE_CATALOG
Packit b099d7
NlsStrings wmNLS;
Packit b099d7
#endif
Packit b099d7
#ifdef WSM
Packit b099d7
int WmIdentity;
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  main (argc, argv, environ)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This is the main window manager function.  It calls window manager
Packit b099d7
 *  initializtion functions and has the main event processing loop.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  argc = number of command line arguments (+1)
Packit b099d7
 *
Packit b099d7
 *  argv = window manager command line arguments
Packit b099d7
 *
Packit b099d7
 *  environ = window manager environment
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
int
Packit b099d7
main (int argc, char *argv [], char *environ [])
Packit b099d7
{
Packit b099d7
    XEvent	event;
Packit b099d7
    Boolean	dispatchEvent;
Packit b099d7
Packit b099d7
    setlocale(LC_ALL, "");
Packit b099d7
Packit b099d7
#ifndef NO_MULTIBYTE
Packit b099d7
#ifdef WSM
Packit b099d7
    /*
Packit b099d7
     * Set up environment variables for this HP DT client
Packit b099d7
     */
Packit b099d7
    _DtEnvControl(DT_ENV_SET);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Force LANG lookup early. 
Packit b099d7
     * (Front end may change $LANG to 'C' as part
Packit b099d7
     *  of string space reduction optimization.)
Packit b099d7
     */
Packit b099d7
     {
Packit b099d7
	 char * foo = ((char *)GETMESSAGE(44, 1, ""));
Packit b099d7
     }
Packit b099d7
#endif /* WSM */
Packit b099d7
    XtSetLanguageProc (NULL, (XtLanguageProc)NULL, NULL);
Packit b099d7
#endif
Packit b099d7
#ifdef WSM
Packit b099d7
    /*  
Packit b099d7
     * Get Identity
Packit b099d7
     */
Packit b099d7
    WmIdentity = WmReturnIdentity(argc, argv, environ);
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Initialize the workspace:
Packit b099d7
     */
Packit b099d7
Packit b099d7
    InitWmGlobal (argc, argv, environ);
Packit b099d7
#ifdef WSM
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set up PATH variable if it must run as standalone command
Packit b099d7
     * invoker
Packit b099d7
     */
Packit b099d7
    if (wmGD.dtLite)
Packit b099d7
    {
Packit b099d7
	_DtEnvControl(DT_ENV_SET_BIN);
Packit b099d7
    }
Packit b099d7
#endif /* WSM */
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * MAIN EVENT HANDLING LOOP:
Packit b099d7
     */
Packit b099d7
Packit b099d7
    for (;;)
Packit b099d7
    {
Packit b099d7
        XtAppNextEvent (wmGD.mwmAppContext, &event);
Packit b099d7
Packit b099d7
Packit b099d7
        /*
Packit b099d7
	 * Check for, and process non-widget events.  The events may be
Packit b099d7
	 * reported to the root window, to some client frame window,
Packit b099d7
	 * to an icon window, or to a "special" window management window.
Packit b099d7
	 * The lock modifier is "filtered" out for window manager processing.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	wmGD.attributesWindow = 0L;
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
	if ((event.type == ButtonPress) || 
Packit b099d7
	    (event.type == ButtonRelease))
Packit b099d7
	{
Packit b099d7
	    if ((wmGD.evLastButton.button != 0) &&
Packit b099d7
		ReplayedButtonEvent (&(wmGD.evLastButton), 
Packit b099d7
				     &(event.xbutton)))
Packit b099d7
	    {
Packit b099d7
		wmGD.bReplayedButton = True;
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		/* save this button for next comparison */
Packit b099d7
		memcpy (&wmGD.evLastButton, &event, sizeof (XButtonEvent));
Packit b099d7
		wmGD.bReplayedButton = False;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
#endif /* WSM */
Packit b099d7
	dispatchEvent = True;
Packit b099d7
	if (wmGD.menuActive)
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Do special menu event preprocessing.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (wmGD.checkHotspot || wmGD.menuUnpostKeySpec ||
Packit b099d7
		wmGD.menuActive->accelKeySpecs)
Packit b099d7
	    {
Packit b099d7
	        dispatchEvent = WmDispatchMenuEvent ((XButtonEvent *) &event);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (dispatchEvent)
Packit b099d7
	{
Packit b099d7
	    if (ManagedRoot(event.xany.window))
Packit b099d7
	    {
Packit b099d7
	        dispatchEvent = WmDispatchWsEvent (&event);
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
	        dispatchEvent = WmDispatchClientEvent (&event);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (dispatchEvent)
Packit b099d7
	    {
Packit b099d7
                /*
Packit b099d7
                 * Dispatch widget related event:
Packit b099d7
                 */
Packit b099d7
Packit b099d7
                XtDispatchEvent (&event);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION main */
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
/******************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  WmReturnIdentity (argc, argv, environ)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function checks the last component of the (path)name
Packit b099d7
 *  contained in argv[0] and makes a global decision as to whether
Packit b099d7
 *  it should fetch resources as mwm or dtwm.
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  argc = number of command line arguments (+1)
Packit b099d7
 *
Packit b099d7
 *  argv = window manager command line arguments
Packit b099d7
 *
Packit b099d7
 *  environ = window manager environment
Packit b099d7
 *
Packit b099d7
 ******************************<->***********************************/
Packit b099d7
Packit b099d7
int WmReturnIdentity ( int argc, char *argv[], char *environ[]) 
Packit b099d7
{
Packit b099d7
	char *tempString;
Packit b099d7
	char *origPtr;
Packit b099d7
Packit b099d7
	/* assume it's dtwm until proven differently */
Packit b099d7
Packit b099d7
 	int retVal = DT_MWM;
Packit b099d7
Packit b099d7
	if (!(tempString = 
Packit b099d7
	      (char *)(XtMalloc ((unsigned int)(strlen (argv[0]) + 1)))))
Packit b099d7
	{
Packit b099d7
		Warning(((char *)GETMESSAGE(44, 2, "Insufficient memory for name of window manager")));
Packit b099d7
		exit(WM_ERROR_EXIT_VALUE);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	origPtr = tempString;
Packit b099d7
Packit b099d7
	if (strrchr(argv[0], '/'))
Packit b099d7
	{
Packit b099d7
		
Packit b099d7
		strcpy(tempString, (strrchr(argv[0], '/')));
Packit b099d7
Packit b099d7
		tempString++;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
		strcpy(tempString, argv[0]);
Packit b099d7
Packit b099d7
	if (!(strcmp(tempString, WM_RESOURCE_NAME)))
Packit b099d7
	/*
Packit b099d7
	 *
Packit b099d7
	 *   If it's explicity "mwm", then set our identity anew.
Packit b099d7
	 *
Packit b099d7
	 */
Packit b099d7
	{
Packit b099d7
		retVal = MWM;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XtFree((char *)origPtr);
Packit b099d7
Packit b099d7
	return(retVal);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION WmReturnIdentity */
Packit b099d7
#endif /* WSM */
Packit b099d7
#ifdef WSM
Packit b099d7
/*************************     eof   ******************************/
Packit b099d7
#endif /* WSM */