Blame clients/mwm/WmCEvent.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 REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: WmCEvent.c /main/10 1996/08/09 15:05:39 rswiston $"
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"
Packit b099d7
#include "WmICCC.h"
Packit b099d7
Packit b099d7
#include <X11/Xatom.h>
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * include extern functions
Packit b099d7
 */
Packit b099d7
#include "WmCEvent.h"
Packit b099d7
#include "WmCDecor.h"
Packit b099d7
#include "WmColormap.h"
Packit b099d7
#include "WmEvent.h"
Packit b099d7
#include "WmFeedback.h"
Packit b099d7
#include "WmFunction.h"
Packit b099d7
#include "WmIDecor.h"
Packit b099d7
#include "WmKeyFocus.h"
Packit b099d7
#ifdef PANELIST
Packit b099d7
#include "WmPanelP.h"
Packit b099d7
#endif /* PANELIST */
Packit b099d7
#include "WmManage.h"
Packit b099d7
#include "WmMenu.h"
Packit b099d7
#include "WmProperty.h"
Packit b099d7
#include "WmProtocol.h"
Packit b099d7
#include "WmWinConf.h"
Packit b099d7
#include "WmWinInfo.h"
Packit b099d7
#include "WmWinList.h"
Packit b099d7
#include "WmWinState.h"
Packit b099d7
#ifdef WSM
Packit b099d7
#include "WmWrkspace.h"
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Global Variables:
Packit b099d7
 */
Packit b099d7
Packit b099d7
extern unsigned int buttonModifierMasks[];
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetupCButtonBindings (window, buttonSpecs)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function sets up the event handling necessary to support user
Packit b099d7
 *  specified button bindings for window manager functions that apply to
Packit b099d7
 *  the client window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  window = grab window id
Packit b099d7
 *
Packit b099d7
 *  buttonSpecs = list of button bindings for window manager functions
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetupCButtonBindings (Window window, ButtonSpec *buttonSpecs)
Packit b099d7
{
Packit b099d7
    ButtonSpec *buttonSpec;
Packit b099d7
    unsigned int eventMask;
Packit b099d7
    unsigned int grabState;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If the context of the button binding includes "window" do button
Packit b099d7
     * grabs to get the button events that invoke window manger functions.
Packit b099d7
     * !!! don't do redundant grabs !!!
Packit b099d7
     */
Packit b099d7
Packit b099d7
    buttonSpec = buttonSpecs;
Packit b099d7
    while (buttonSpec)
Packit b099d7
    {
Packit b099d7
	if ((buttonSpec->context & F_CONTEXT_WINDOW) &&
Packit b099d7
	    (buttonSpec->subContext & F_SUBCONTEXT_W_CLIENT))
Packit b099d7
	{
Packit b099d7
	    eventMask = ButtonMotionMask | ButtonReleaseMask;
Packit b099d7
Packit b099d7
	    if (buttonSpec->eventType == ButtonRelease)
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * Don't include the button down in the grab state.
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		grabState = buttonSpec->state &
Packit b099d7
				~(buttonModifierMasks[buttonSpec->button]);
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		grabState = buttonSpec->state;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    WmGrabButton (DISPLAY, buttonSpec->button, grabState,
Packit b099d7
	        window, False, eventMask, GrabModeSync,
Packit b099d7
	        GrabModeAsync, None, None);
Packit b099d7
	}
Packit b099d7
	/*
Packit b099d7
	 * If the window context is not "window" a general grab is not
Packit b099d7
	 * necessary.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	buttonSpec = buttonSpec->nextButtonSpec;
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetupCButtonBindings */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  WmDispatchClientEvent (event)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function detects and dispatches events that are reported to a client
Packit b099d7
 *  frame or icon window that are not widget-related (i.e. they would not be
Packit b099d7
 *  dispatched by the Xtk intrinsics).
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  event = This is an X event that has been retrieved by XtNextEvent.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = If True the event should be dispatched by the toolkit,
Packit b099d7
 *      otherwise the event should not be dispatched.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Boolean WmDispatchClientEvent (XEvent *event)
Packit b099d7
{
Packit b099d7
    ClientData * pCD = NULL;
Packit b099d7
#ifndef	IBM_169380
Packit b099d7
    ClientData **cmap_window_data = NULL;
Packit b099d7
#endif
Packit b099d7
    Boolean dispatchEvent = False;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Detect and dispatch non-widget events that have been reported to
Packit b099d7
     * an icon or a client window frame.
Packit b099d7
     */
Packit b099d7
Packit b099d7
#ifndef IBM_169380
Packit b099d7
    if ((XFindContext (DISPLAY, event->xany.window, wmGD.windowContextType,
Packit b099d7
            (caddr_t *)&pCD)) &&
Packit b099d7
        (XFindContext (DISPLAY, event->xany.window, wmGD.cmapWindowContextType,
Packit b099d7
            (caddr_t *)&cmap_window_data)))
Packit b099d7
#else
Packit b099d7
    if (XFindContext (DISPLAY, event->xany.window, wmGD.windowContextType,
Packit b099d7
	    (caddr_t *)&pCD))
Packit b099d7
#endif
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 *  Set active screen if we're not sure. 
Packit b099d7
	 */
Packit b099d7
	if (wmGD.queryScreen)
Packit b099d7
	    DetermineActiveScreen (event);
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Handle events on windows that are made by mwm for
Packit b099d7
	 * non-client-specific functions.  Also handle "leftover"
Packit b099d7
	 * events on windows that used to be managed by mwm
Packit b099d7
	 * (e.g. ConfigureRequest events).
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	return (HandleEventsOnSpecialWindows (event));
Packit b099d7
    }
Packit b099d7
Packit b099d7
#ifndef IBM_169380
Packit b099d7
    if (cmap_window_data)
Packit b099d7
    /*
Packit b099d7
     * Event is on a subwindow that is specified in one or more toplevel
Packit b099d7
     * window's WM_COLORMAP_WINDOWS property.  (Most likely this is a
Packit b099d7
     * ColormapNotify event.)  It could have more than one pCD associated
Packit b099d7
     * with it, so we have to choose one.  If one of the pCD's currently has
Packit b099d7
     * the Colormap Focus, then let's use that one.  Otherwise, just use
Packit b099d7
     * the 1st one.
Packit b099d7
     */
Packit b099d7
    {
Packit b099d7
        int j;
Packit b099d7
        for (j = 0; cmap_window_data[j]; j++)
Packit b099d7
        {
Packit b099d7
            if (ACTIVE_PSD->colormapFocus == cmap_window_data[j])
Packit b099d7
            {
Packit b099d7
                pCD = cmap_window_data[j];
Packit b099d7
                break;
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
        /*
Packit b099d7
         * None of the pCD's in the list have Colormap Focus.  So, just
Packit b099d7
         * set pCD to the 1st one in the list.
Packit b099d7
         */
Packit b099d7
        if (!pCD)
Packit b099d7
            pCD = cmap_window_data[0];
Packit b099d7
    }
Packit b099d7
#endif
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     *  Set active screen if this is not a FocusOut event.
Packit b099d7
     *  We don't need to set it on focus out AND we use
Packit b099d7
     *  (SCREEN_FOR_CLIENT(pCD) != ACTIVE_SCREEN) in
Packit b099d7
     *  in HandleCFocusOut to determine if a new colormap needs
Packit b099d7
     *  to be installed.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (!(event->type == FocusOut))
Packit b099d7
    {
Packit b099d7
	SetActiveScreen (PSD_FOR_CLIENT(pCD));
Packit b099d7
    }
Packit b099d7
#ifdef WSM
Packit b099d7
    /* Get workspace specific client data */
Packit b099d7
    SetClientWsIndex (pCD);
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Handle events on top-level client windows.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (event->xany.window == pCD->client)
Packit b099d7
    {
Packit b099d7
	return (HandleEventsOnClientWindow (pCD, event));
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Handle events on windows created by mwm (for icons and client window
Packit b099d7
     * frames) and on non-top-level client windows (e.g., colormap
Packit b099d7
     * windows).
Packit b099d7
     */
Packit b099d7
Packit b099d7
    switch (event->type)
Packit b099d7
    {
Packit b099d7
	case ButtonPress:
Packit b099d7
	{
Packit b099d7
	    dispatchEvent = HandleCButtonPress (pCD, (XButtonEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case ButtonRelease:
Packit b099d7
	{
Packit b099d7
	    if (wmGD.menuActive)
Packit b099d7
	    {
Packit b099d7
		dispatchEvent = True; /* have the toolkit dispatch the event */
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		HandleCButtonRelease (pCD, (XButtonEvent *)event);
Packit b099d7
	    }
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case KeyPress:
Packit b099d7
	{
Packit b099d7
	    dispatchEvent = HandleCKeyPress (pCD, (XKeyEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case MotionNotify:
Packit b099d7
	{
Packit b099d7
	    HandleCMotionNotify (pCD, (XMotionEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case Expose:
Packit b099d7
	{
Packit b099d7
	    /* 
Packit b099d7
	     * If multiple expose events, wait for last one.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (event->xexpose.count == 0) 
Packit b099d7
	    {
Packit b099d7
		if (event->xexpose.window == ICON_FRAME_WIN(pCD))
Packit b099d7
		{
Packit b099d7
		    IconExposureProc (pCD, True);
Packit b099d7
		    if (P_ICON_BOX(pCD))
Packit b099d7
		    {
Packit b099d7
			dispatchEvent = True;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
		else if (event->xexpose.window == 
Packit b099d7
			     pCD->pSD->activeIconTextWin)
Packit b099d7
		{
Packit b099d7
		    PaintActiveIconText (pCD, FALSE);
Packit b099d7
		}
Packit b099d7
		else if (!(pCD->clientFlags & CLIENT_DESTROYED))
Packit b099d7
		{
Packit b099d7
		    if ((event->xexpose.window == pCD->clientFrameWin) ||
Packit b099d7
			 (event->xexpose.window == pCD->clientTitleWin))
Packit b099d7
		    {
Packit b099d7
			FrameExposureProc (pCD);
Packit b099d7
		    }
Packit b099d7
		    if (event->xexpose.window == pCD->clientBaseWin)
Packit b099d7
		    {
Packit b099d7
			BaseWinExposureProc (pCD);
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
#ifdef PANELIST
Packit b099d7
		else if (pCD->clientFlags & FRONT_PANEL_BOX)
Packit b099d7
		{
Packit b099d7
	        /*
Packit b099d7
		 *
Packit b099d7
		 *  Then this client is the shell for the 
Packit b099d7
		 *  front panel and we want the toolkit to repaint
Packit b099d7
		 *  it.
Packit b099d7
		 *
Packit b099d7
		 */
Packit b099d7
		    dispatchEvent = True;
Packit b099d7
		}
Packit b099d7
#endif /* PANELIST */
Packit b099d7
	    }
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case EnterNotify:
Packit b099d7
	{
Packit b099d7
	    HandleCEnterNotify (pCD, (XEnterWindowEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case LeaveNotify:
Packit b099d7
	{
Packit b099d7
	    HandleCLeaveNotify (pCD, (XLeaveWindowEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case FocusIn:
Packit b099d7
	{
Packit b099d7
	    dispatchEvent = HandleCFocusIn (pCD, (XFocusChangeEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case FocusOut:
Packit b099d7
	{
Packit b099d7
	    dispatchEvent = HandleCFocusOut (pCD, (XFocusChangeEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case DestroyNotify:
Packit b099d7
	{
Packit b099d7
	    if (((XDestroyWindowEvent *)event)->window == pCD->client)
Packit b099d7
	    {
Packit b099d7
	        pCD->clientFlags |= CLIENT_DESTROYED;
Packit b099d7
	        UnManageWindow (pCD);
Packit b099d7
	    }
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case UnmapNotify:
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * This event is generated when a managed  client window is 
Packit b099d7
	     * unmapped by the client or when the window manager unmaps the
Packit b099d7
	     * client window; check the wmMapCount to determine if this is
Packit b099d7
	     * the result of a window manager unmap. If this is a client
Packit b099d7
	     * unmap then the window is to be withdrawn from window manager
Packit b099d7
	     * control.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (((XUnmapEvent *)event)->window == pCD->client)
Packit b099d7
	    {
Packit b099d7
	        if (pCD->wmUnmapCount)
Packit b099d7
	        {
Packit b099d7
		    pCD->wmUnmapCount--;
Packit b099d7
	        }
Packit b099d7
	        else
Packit b099d7
	        {
Packit b099d7
		    UnManageWindow (pCD);
Packit b099d7
	        }
Packit b099d7
            }
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case MapRequest:
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * This is a request to change the state of the client window from
Packit b099d7
	     * iconic (minimized) to normal.
Packit b099d7
	     */
Packit b099d7
#ifdef WSM
Packit b099d7
            if (!ClientInWorkspace (ACTIVE_WS, pCD))
Packit b099d7
	    {
Packit b099d7
		if (pCD->absentMapBehavior == AMAP_BEHAVIOR_IGNORE)
Packit b099d7
		{
Packit b099d7
		    SetClientState (pCD, NORMAL_STATE|UNSEEN_STATE, 
Packit b099d7
				    GetTimestamp ());
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    HonorAbsentMapBehavior(pCD);
Packit b099d7
		    SetClientState (pCD, NORMAL_STATE, GetTimestamp ());
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		SetClientState (pCD, NORMAL_STATE, GetTimestamp ());
Packit b099d7
	    }
Packit b099d7
#else /* WSM */
Packit b099d7
	    SetClientState (pCD, NORMAL_STATE, GetTimestamp ());
Packit b099d7
#endif /* WSM */
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case ConfigureRequest:
Packit b099d7
	{
Packit b099d7
	    HandleCConfigureRequest (pCD, (XConfigureRequestEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case ColormapNotify:
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Process changes to client window colormaps:
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    HandleCColormapNotify (pCD, (XColormapEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case ClientMessage:
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Handle client message events.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    HandleClientMessage (pCD, (XClientMessageEvent *)event);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
	case ReparentNotify:
Packit b099d7
	{
Packit b099d7
	    if ((((XReparentEvent *)event)->window == pCD->client) &&
Packit b099d7
		(((XReparentEvent *)event)->parent != pCD->clientBaseWin))
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * The window was reparented away from the frame.
Packit b099d7
		 * Unmanage to clean up the now empty frame.
Packit b099d7
		 *
Packit b099d7
		 * Note: We get here when the reparent is done while
Packit b099d7
		 * the client is unmapped (e.g. iconified). Otherwise
Packit b099d7
		 * the reparent will generate an UnmapNotify which
Packit b099d7
		 * will also cause us to unmanage the client.
Packit b099d7
		 */
Packit b099d7
		UnManageWindow (pCD);
Packit b099d7
	      }
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    } /* end of event.type switch */
Packit b099d7
Packit b099d7
Packit b099d7
    return (dispatchEvent);
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION WmDispatchClientEvent */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleEventsOnSpecialWindows (pEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Handles events on special window manager windows and "leftover" events
Packit b099d7
 *  from destroyed client window frames.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pEvent = pointer to an XEvent structure
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = If True the event should be dispatched by the toolkit,
Packit b099d7
 *      otherwise the event should not be dispatched.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Boolean HandleEventsOnSpecialWindows (XEvent *pEvent)
Packit b099d7
{
Packit b099d7
    Boolean dispatchEvent = True;
Packit b099d7
#ifdef WSM
Packit b099d7
    WmScreenData *pSD;
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * The window is not a root window or a client frame window.  Check for
Packit b099d7
     * a special window manager window.  Have the toolkit dispatch the event
Packit b099d7
     * if the event is not on a special window.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (pEvent->xany.window == ACTIVE_ROOT)
Packit b099d7
    {
Packit b099d7
	if (pEvent->type == FocusIn)
Packit b099d7
	{
Packit b099d7
	    SetKeyboardFocus ((ClientData *) NULL, REFRESH_LAST_FOCUS);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else if (pEvent->xany.window == ACTIVE_PSD->feedbackWin)
Packit b099d7
    {
Packit b099d7
	if (pEvent->type == Expose)
Packit b099d7
	{
Packit b099d7
	    if (pEvent->xexpose.count == 0)
Packit b099d7
	    {
Packit b099d7
	        PaintFeedbackWindow(ACTIVE_PSD);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	dispatchEvent = False; /* don't have the toolkit dispatch the event */
Packit b099d7
    }
Packit b099d7
    else if (pEvent->xany.window == ACTIVE_PSD->inputScreenWindow)
Packit b099d7
    {
Packit b099d7
	if (pEvent->type == ButtonPress)
Packit b099d7
	{
Packit b099d7
	    F_Beep (NULL, (ClientData *) NULL, (XEvent *) NULL);
Packit b099d7
	}
Packit b099d7
	else if ((wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_POINTER) &&
Packit b099d7
		 (pEvent->type == EnterNotify))
Packit b099d7
	{
Packit b099d7
	    HandleWsEnterNotify ((XEnterWindowEvent *)pEvent);
Packit b099d7
	}
Packit b099d7
	dispatchEvent = False; /* don't have the toolkit dispatch the event */
Packit b099d7
    }
Packit b099d7
#ifdef  WSM
Packit b099d7
    else if (!XFindContext (DISPLAY, pEvent->xany.window,
Packit b099d7
		    wmGD.mwmWindowContextType, (caddr_t *)&pSD))
Packit b099d7
    {
Packit b099d7
	if ((pEvent->type == PropertyNotify) &&
Packit b099d7
	    (pEvent->xproperty.atom == wmGD.xa_DT_WM_REQUEST) &&
Packit b099d7
	    (pEvent->xproperty.state == PropertyNewValue))
Packit b099d7
	{
Packit b099d7
	    HandleDtWmRequest (pSD, pEvent);
Packit b099d7
	}
Packit b099d7
	if (pEvent->type == ClientMessage)
Packit b099d7
	{
Packit b099d7
	    HandleDtWmClientMessage ((XClientMessageEvent *)pEvent);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
#endif /* WSM */
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Events may come in for a client frame base window that no
Packit b099d7
	 * longer exists (the client window was just unmanaged but the
Packit b099d7
	 * the client did some action before the un-reparenting was
Packit b099d7
	 * actually done).  Confirm that this is the case and then
Packit b099d7
	 * handle the request as if it came in as a root window event.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	switch (pEvent->type)
Packit b099d7
	{
Packit b099d7
	    case ConfigureRequest:
Packit b099d7
	    {
Packit b099d7
		if (GetParentWindow (pEvent->xconfigurerequest.window) ==
Packit b099d7
		    ACTIVE_ROOT)
Packit b099d7
		{
Packit b099d7
		    /*
Packit b099d7
		     * This is an event for a client base window that
Packit b099d7
		     * no longer exists.  Handle the event as if it is a
Packit b099d7
		     * root window event.
Packit b099d7
		     */
Packit b099d7
Packit b099d7
		    dispatchEvent =  WmDispatchWsEvent (pEvent);
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    case MapRequest:
Packit b099d7
	    {
Packit b099d7
		if (GetParentWindow (pEvent->xmaprequest.window) ==
Packit b099d7
		    ACTIVE_ROOT)
Packit b099d7
		{
Packit b099d7
		    /*
Packit b099d7
		     * This is an event for a client base window that
Packit b099d7
		     * no longer exists.  Handle the event as if it is a
Packit b099d7
		     * root window event.
Packit b099d7
		     */
Packit b099d7
Packit b099d7
		    dispatchEvent = WmDispatchWsEvent (pEvent);
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (dispatchEvent);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleEventsOnSpecialWindows */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleEventsOnClientWindow (pCD, pEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Handles events on a client top-level window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 *  pEvent = pointer to an XEvent structure
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = If True the event should be dispatched by the toolkit,
Packit b099d7
 *      otherwise the event should not be dispatched.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Boolean HandleEventsOnClientWindow (ClientData *pCD, XEvent *pEvent)
Packit b099d7
{
Packit b099d7
    Boolean doXtDispatchEvent = True;
Packit b099d7
Packit b099d7
#ifndef NO_SHAPE
Packit b099d7
    if (pEvent->type == (wmGD.shapeEventBase+ShapeNotify))
Packit b099d7
    {
Packit b099d7
        HandleCShapeNotify (pCD, (XShapeEvent *)pEvent);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
#endif /* NO_SHAPE */
Packit b099d7
    switch (pEvent->type)
Packit b099d7
    {
Packit b099d7
	case ColormapNotify:
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Process changes to top-level client window colormaps:
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    HandleCColormapNotify (pCD, (XColormapEvent *)pEvent);
Packit b099d7
	    doXtDispatchEvent = False;
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case PropertyNotify:
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Process property changes on managed client windows:
Packit b099d7
	     */
Packit b099d7
		
Packit b099d7
	    HandleCPropertyNotify (pCD, (XPropertyEvent *)pEvent);
Packit b099d7
	    doXtDispatchEvent = False;
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case ClientMessage:
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Handle client message events.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    HandleClientMessage (pCD, (XClientMessageEvent *)pEvent);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (doXtDispatchEvent);
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleEventsOnClientWindow */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCPropertyNotify (pCD, propertyEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function handles propertyNotify events (indicating window property
Packit b099d7
 *  changes) that are reported to the client window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to the client data for the client window that got the event
Packit b099d7
 *
Packit b099d7
 *  propertyEvent = propertyNotify event that was received
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleCPropertyNotify (ClientData *pCD, XPropertyEvent *propertyEvent)
Packit b099d7
{
Packit b099d7
Packit b099d7
    switch (propertyEvent->atom)
Packit b099d7
    {
Packit b099d7
        case XA_WM_HINTS:
Packit b099d7
	{
Packit b099d7
	    ProcessWmHints (pCD, FALSE /*not first time*/);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
        case XA_WM_NORMAL_HINTS:
Packit b099d7
	{
Packit b099d7
	    ProcessWmNormalHints (pCD, FALSE /*not first time*/, 0);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
        case XA_WM_NAME:
Packit b099d7
	{
Packit b099d7
	    ProcessWmWindowTitle (pCD, FALSE /*not first time*/);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
        case XA_WM_ICON_NAME:
Packit b099d7
	{
Packit b099d7
	    ProcessWmIconTitle (pCD, FALSE /*not first time*/);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
        case XA_WM_CLASS:
Packit b099d7
	{
Packit b099d7
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
        case XA_WM_COMMAND:
Packit b099d7
	{
Packit b099d7
	    if (pCD->clientFlags & CLIENT_TERMINATING)
Packit b099d7
	    {
Packit b099d7
		DeleteClientWmTimers (pCD);
Packit b099d7
		XKillClient (DISPLAY, pCD->client);
Packit b099d7
	    }
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
        case XA_WM_TRANSIENT_FOR:
Packit b099d7
        {
Packit b099d7
	    /*
Packit b099d7
	     * here we handle the special case of dialogs that are
Packit b099d7
	     * mapped before the windows they are transient for are
Packit b099d7
	     * mapped.  Xm handles this case by waiting for the
Packit b099d7
	     * transient_for window to appear before setting the
Packit b099d7
	     * WM_TRANSIENT_FOR property on the dialog.  Mwm has to
Packit b099d7
	     * notice this property change and re-organize things
Packit b099d7
	     * so the dialog is treated as a transient window.
Packit b099d7
	     *
Packit b099d7
	     * Note that we also handle the case of the WM_TRANSIENT_FOR
Packit b099d7
	     * property being removed. 
Packit b099d7
	     */
Packit b099d7
	    DeleteClientFromList (pCD->pSD->pActiveWS, pCD);
Packit b099d7
	    ProcessWmTransientFor(pCD);
Packit b099d7
	    AddClientToList(pCD->pSD->pActiveWS, pCD, True);
Packit b099d7
	    if (pCD->transientLeader != NULL)
Packit b099d7
		StackTransientWindow(pCD);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	default:
Packit b099d7
	{
Packit b099d7
	    if (propertyEvent->atom == wmGD.xa_WM_PROTOCOLS)
Packit b099d7
	    {
Packit b099d7
		ProcessWmProtocols (pCD);
Packit b099d7
	    }
Packit b099d7
#ifdef WSM
Packit b099d7
	    else if (propertyEvent->atom == wmGD.xa_DT_WORKSPACE_HINTS)
Packit b099d7
	    {
Packit b099d7
		(void) ProcessWorkspaceHints (pCD);
Packit b099d7
	    }
Packit b099d7
#endif /* WSM */
Packit b099d7
	    else if (propertyEvent->atom == wmGD.xa_MWM_MESSAGES)
Packit b099d7
	    {
Packit b099d7
		if (pCD->protocolFlags & PROTOCOL_MWM_MESSAGES)
Packit b099d7
		{
Packit b099d7
		    ProcessMwmMessages (pCD);
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    else if (propertyEvent->atom == wmGD.xa_SM_CLIENT_ID)
Packit b099d7
	    {
Packit b099d7
		ProcessSmClientID(pCD);
Packit b099d7
	    }
Packit b099d7
	    else if (propertyEvent->atom == wmGD.xa_WMSAVE_HINT)
Packit b099d7
	    {
Packit b099d7
		ProcessWmSaveHint(pCD);
Packit b099d7
	    }
Packit b099d7
	    else if (propertyEvent->atom == wmGD.xa_WM_COLORMAP_WINDOWS)
Packit b099d7
	    {
Packit b099d7
		if (propertyEvent->state == PropertyNewValue)
Packit b099d7
		{
Packit b099d7
		    ProcessWmColormapWindows (pCD);
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    /* property was deleted */
Packit b099d7
		    ResetColormapData (pCD, NULL, 0);
Packit b099d7
		}
Packit b099d7
Packit b099d7
		if ((ACTIVE_PSD->colormapFocus == pCD) &&
Packit b099d7
		    ((pCD->clientState == NORMAL_STATE) ||
Packit b099d7
		     (pCD->clientState == MAXIMIZED_STATE)))
Packit b099d7
		{
Packit b099d7
		    /*
Packit b099d7
		     * The client window has the colormap focus, install the
Packit b099d7
		     * colormap.
Packit b099d7
		     */
Packit b099d7
#ifndef OLD_COLORMAP /* colormap */
Packit b099d7
		    /*
Packit b099d7
		     * We just changed the colormaps list,
Packit b099d7
		     * so we need to re-run the whole thing.
Packit b099d7
		     */
Packit b099d7
		    pCD->clientCmapFlagsInitialized = 0;
Packit b099d7
		    ProcessColormapList (ACTIVE_PSD, pCD);
Packit b099d7
#else /* OSF original */
Packit b099d7
		    WmInstallColormap (ACTIVE_PSD, pCD->clientColormap);
Packit b099d7
#endif
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCPropertyNotify */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCButtonPress (pCD, buttonEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with a button
Packit b099d7
 *  press event on the client window (including frame) or icon.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data (identifies client window)
Packit b099d7
 *
Packit b099d7
 *  buttonEvent = ButtonPress event on client window
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = True if the event should be dispatched by XtDispatchEvent
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Boolean HandleCButtonPress (ClientData *pCD, XButtonEvent *buttonEvent)
Packit b099d7
{
Packit b099d7
    Boolean dispatchEvent = False;
Packit b099d7
    Boolean replayEvent = True;
Packit b099d7
    Context context;
Packit b099d7
    int partContext;
Packit b099d7
    Context subContext;
Packit b099d7
    static Time baseWinTime = 0;
Packit b099d7
    static unsigned int baseWinButton = 0;
Packit b099d7
Packit b099d7
    wmGD.passButtonsCheck = True;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Find out the event context and process the event accordingly.
Packit b099d7
     * If the event is due to a key focus selection grab or an application
Packit b099d7
     * modal grab then handle the grab (only these types of grabs are
Packit b099d7
     * done on the client window frame base window)..
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (wmGD.menuActive)
Packit b099d7
    {
Packit b099d7
	dispatchEvent = True;	/* have the toolkit dispatch the event */
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	IdentifyEventContext (buttonEvent, pCD, &context, &partContext);
Packit b099d7
	subContext = (1L << partContext);
Packit b099d7
Packit b099d7
        if (buttonEvent->window == pCD->clientBaseWin)
Packit b099d7
        {
Packit b099d7
            /* save time of event caught by base window grab */
Packit b099d7
            baseWinTime = buttonEvent->time;
Packit b099d7
            baseWinButton = buttonEvent->button;
Packit b099d7
	}
Packit b099d7
 
Packit b099d7
        /*
Packit b099d7
         * If this event was caught by the base window grab and
Packit b099d7
         * replayed, then don't reprocess if caught by the frame
Packit b099d7
         * window. (Replayed events have the same time.)
Packit b099d7
         */
Packit b099d7
        if (!((buttonEvent->window == pCD->clientFrameWin) &&
Packit b099d7
              (buttonEvent->button == baseWinButton) &&
Packit b099d7
              (buttonEvent->time == baseWinTime)))
Packit b099d7
	{
Packit b099d7
Packit b099d7
#ifndef MOTIF_ONE_DOT_ONE
Packit b099d7
	    /*
Packit b099d7
	     * Motif 1.2, ignore replayed events UNPOST_AND_REPLAY events
Packit b099d7
	     * generated from the menu system (time stamps are exactly
Packit b099d7
	     * the same for the replayed event)
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (wmGD.clickData.time == buttonEvent->time)
Packit b099d7
	    {
Packit b099d7
		dispatchEvent = False;
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		ProcessClickBPress (buttonEvent, pCD, context, subContext);
Packit b099d7
	    }
Packit b099d7
#else
Packit b099d7
	    ProcessClickBPress (buttonEvent, pCD, context, subContext);
Packit b099d7
#endif
Packit b099d7
Packit b099d7
	    if (CheckForButtonAction (buttonEvent, context, subContext, pCD) 
Packit b099d7
		&& pCD)
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * Button bindings have been processed, now check for bindings
Packit b099d7
		 * that associated with the built-in semantics of the window
Packit b099d7
		 * frame decorations.
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		CheckButtonPressBuiltin (buttonEvent, context, subContext,
Packit b099d7
		    partContext, pCD);
Packit b099d7
Packit b099d7
		/*
Packit b099d7
		 * For case where button action causes lower, but
Packit b099d7
		 * builtin causes focus - disable auto raise until
Packit b099d7
		 * we receive focusIn or focusOut.
Packit b099d7
		 */
Packit b099d7
		pCD->focusAutoRaiseDisablePending = False;
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
	       /*
Packit b099d7
		* Else skip built-in processing due to execution of a function
Packit b099d7
		* that does on-going event processing or that has changed the
Packit b099d7
		* client state (e.g., f.move or f.minimize).
Packit b099d7
		*/
Packit b099d7
Packit b099d7
		replayEvent = False;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (buttonEvent->window == pCD->clientBaseWin)
Packit b099d7
    {
Packit b099d7
	ProcessButtonGrabOnClient (pCD, buttonEvent, replayEvent);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (dispatchEvent);
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCButtonPress */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ProcessButtonGrabOnClient (pCD, buttonEvent, replayEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function handles an activated button grab on the client window
Packit b099d7
 *  frame base window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data of window associated with the grab
Packit b099d7
 *
Packit b099d7
 *  buttonEvent = ButtonPress event on client window
Packit b099d7
 *
Packit b099d7
 *  replayEvent = True if event should be replayed
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void ProcessButtonGrabOnClient (ClientData *pCD, XButtonEvent *buttonEvent, Boolean replayEvent)
Packit b099d7
{
Packit b099d7
    ButtonSpec *buttonSpec;
Packit b099d7
    Boolean passButton;
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
    if ((buttonEvent->button == SELECT_BUTTON) && 
Packit b099d7
	((buttonEvent->state == 0) ||
Packit b099d7
	 (NOLOCKMOD(buttonEvent->state) == 0)))
Packit b099d7
    {
Packit b099d7
	passButton = wmGD.passSelectButton;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	passButton = wmGD.passButtons;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IS_APP_MODALIZED(pCD) || !passButton)
Packit b099d7
    {
Packit b099d7
	replayEvent = False;
Packit b099d7
    }
Packit b099d7
    else if (replayEvent)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Replay the event as long as there is not another button binding
Packit b099d7
	 * for the button release.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	buttonSpec = ACTIVE_PSD->buttonSpecs;
Packit b099d7
	while (buttonSpec)
Packit b099d7
	{
Packit b099d7
	    if ((buttonSpec->eventType == ButtonRelease) &&
Packit b099d7
		((buttonEvent->state == buttonSpec->state) ||
Packit b099d7
		 (NOLOCKMOD(buttonEvent->state) == buttonSpec->state)) &&
Packit b099d7
		(buttonEvent->button == buttonSpec->button))
Packit b099d7
	    {
Packit b099d7
		replayEvent = False;
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    buttonSpec = buttonSpec->nextButtonSpec;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (replayEvent && wmGD.passButtonsCheck)
Packit b099d7
    {
Packit b099d7
	XAllowEvents (DISPLAY, ReplayPointer, CurrentTime);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	if (IS_APP_MODALIZED(pCD))
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * The grab is done on a window that has an application modal
Packit b099d7
	     * secondary window.  Beep to indicate no client processing of
Packit b099d7
	     * the event.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    F_Beep (NULL, pCD, (XEvent *) NULL);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XAllowEvents (DISPLAY, AsyncPointer, CurrentTime);
Packit b099d7
    }
Packit b099d7
    XAllowEvents (DISPLAY, AsyncKeyboard, CurrentTime);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION ProcessButtonGrabOnClient */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  CheckButtonPressBuiltin (buttonEvent, context, subContext, partContext, pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function checks to see if a built-in window manager function
Packit b099d7
 *  has been selected.  If yes, then the function is done.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  buttonEvent = pointer to button event
Packit b099d7
 *
Packit b099d7
 *  context = button event context (root, icon, window)
Packit b099d7
 *
Packit b099d7
 *  subContext = button event subcontext (title, system button, ...)
Packit b099d7
 *
Packit b099d7
 *  partContext = part context within a window manager component
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void CheckButtonPressBuiltin (XButtonEvent *buttonEvent, Context context, Context subContext, int partContext, ClientData *pCD)
Packit b099d7
{
Packit b099d7
    /*
Packit b099d7
     * All builtin button bindings are based on button 1 with no
Packit b099d7
     * modifiers. (Ignore locking modifiers)
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (((buttonEvent->button != SELECT_BUTTON)  && 
Packit b099d7
	 (buttonEvent->button != DMANIP_BUTTON)) || 
Packit b099d7
	   NOLOCKMOD(buttonEvent->state))
Packit b099d7
    {
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Process the builtin button bindings based on the window manager
Packit b099d7
     * component that was selected.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (context & F_CONTEXT_ICON)
Packit b099d7
    {
Packit b099d7
	HandleIconButtonPress (pCD, buttonEvent);
Packit b099d7
    }
Packit b099d7
    else if (context & F_CONTEXT_ICONBOX)
Packit b099d7
    {
Packit b099d7
	HandleIconBoxButtonPress (pCD, buttonEvent, subContext);
Packit b099d7
    }
Packit b099d7
    else if (context & F_CONTEXT_WINDOW)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * A client window frame component was selected.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * If the keyboard focus policy is explicit then all window frame
Packit b099d7
	 * components set the keyboard input focus when selected.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_EXPLICIT)
Packit b099d7
	{
Packit b099d7
	    /* If we've just done f.lower, disable focusAutoRaise. */
Packit b099d7
	    if (pCD && pCD->focusAutoRaiseDisablePending)
Packit b099d7
	      pCD->focusAutoRaiseDisabled = True;
Packit b099d7
Packit b099d7
	    Do_Focus_Key (pCD, buttonEvent->time,
Packit b099d7
		(long)((partContext == FRAME_CLIENT) ? CLIENT_AREA_FOCUS : 0));
Packit b099d7
	}
Packit b099d7
Packit b099d7
Packit b099d7
	/*
Packit b099d7
         * Process the builtin button bindings based on the client window
Packit b099d7
	 * frame component that was selected.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if ((buttonEvent->button == SELECT_BUTTON) && 
Packit b099d7
	    (subContext == F_SUBCONTEXT_W_SYSTEM))
Packit b099d7
	{
Packit b099d7
	    int flags = 0;
Packit b099d7
Packit b099d7
            /*
Packit b099d7
	     * System menu button component:
Packit b099d7
             * SELECT_BUTTON Press - post the system menu.
Packit b099d7
	     * SELECT_BUTTON double-click - close the window.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    PushGadgetIn (pCD, partContext);
Packit b099d7
Packit b099d7
	    if ((wmGD.clickData.doubleClickContext == F_SUBCONTEXT_W_SYSTEM) &&
Packit b099d7
	        wmGD.systemButtonClick2 &&
Packit b099d7
	        (pCD->clientFunctions & MWM_FUNC_CLOSE))
Packit b099d7
	    {
Packit b099d7
	        /*
Packit b099d7
	         * Close the client window.  Don't do any of the other
Packit b099d7
	         * system menu button actions.
Packit b099d7
	         */
Packit b099d7
Packit b099d7
		wmGD.clickData.clickPending = False;
Packit b099d7
		wmGD.clickData.doubleClickPending = False;
Packit b099d7
		F_Kill (NULL, pCD, (XEvent *) buttonEvent);
Packit b099d7
		return;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (pCD->clientState == NORMAL_STATE)
Packit b099d7
	    {
Packit b099d7
		context = F_CONTEXT_NORMAL;
Packit b099d7
	    }
Packit b099d7
	    else if (pCD->clientState == MAXIMIZED_STATE)
Packit b099d7
	    {
Packit b099d7
	        context = F_CONTEXT_MAXIMIZE;
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
	        context = F_CONTEXT_ICON;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    /*
Packit b099d7
	     * Set up for "sticky" menu processing if specified.
Packit b099d7
	     */
Packit b099d7
	    if (wmGD.systemButtonClick)
Packit b099d7
	    {
Packit b099d7
		wmGD.checkHotspot = True;
Packit b099d7
		flags |= POST_STICKY;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
            pCD->grabContext = context;
Packit b099d7
Packit b099d7
	    PostMenu (pCD->systemMenuSpec, pCD, 0, 0, SELECT_BUTTON, 
Packit b099d7
		      context, flags, (XEvent *)buttonEvent);
Packit b099d7
Packit b099d7
	}
Packit b099d7
	else if (subContext == F_SUBCONTEXT_W_TITLE)
Packit b099d7
	{
Packit b099d7
            /*
Packit b099d7
	     * Title component:
Packit b099d7
             * SELECT_BUTTON  or DMANIP_BUTTON Press - 
Packit b099d7
	     *               start looking for a move.
Packit b099d7
             */
Packit b099d7
Packit b099d7
	    PushGadgetIn (pCD, partContext);
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Fix for 5075 - Check to make sure that MWM_FUNC_MOVE is set in the
Packit b099d7
 *                clientFunctions.  This is necessary because the title
Packit b099d7
 *                bar is added based on a number of decorations even if
Packit b099d7
 *                the resources or the user has specifically requested
Packit b099d7
 *                that "move" not be one of them.
Packit b099d7
 */
Packit b099d7
            if (pCD->clientFunctions & MWM_FUNC_MOVE)
Packit b099d7
            {
Packit b099d7
	      wmGD.preMove = True;
Packit b099d7
	      wmGD.preMoveX = buttonEvent->x_root;
Packit b099d7
	      wmGD.preMoveY = buttonEvent->y_root;
Packit b099d7
	      wmGD.configButton = buttonEvent->button;
Packit b099d7
	      wmGD.configAction = MOVE_CLIENT;
Packit b099d7
            }
Packit b099d7
/*
Packit b099d7
 * End fix 5075
Packit b099d7
 */
Packit b099d7
Packit b099d7
	}
Packit b099d7
	else if (subContext & F_SUBCONTEXT_W_RBORDER)
Packit b099d7
	{
Packit b099d7
            /*
Packit b099d7
	     * Resize border handle components:
Packit b099d7
             * SELECT_BUTTON or DMANIP_BUTTON Press - 
Packit b099d7
	     *              start looking for a resize.
Packit b099d7
             */
Packit b099d7
Packit b099d7
	    wmGD.preMove = True;
Packit b099d7
	    wmGD.preMoveX = buttonEvent->x_root;
Packit b099d7
	    wmGD.preMoveY = buttonEvent->y_root;
Packit b099d7
	    wmGD.configButton = buttonEvent->button;
Packit b099d7
	    wmGD.configAction = RESIZE_CLIENT;
Packit b099d7
	    wmGD.configPart = partContext;
Packit b099d7
	    wmGD.configSet = True;
Packit b099d7
	}
Packit b099d7
	else if ((buttonEvent->button == SELECT_BUTTON) &&
Packit b099d7
            (subContext & (F_SUBCONTEXT_W_MINIMIZE|F_SUBCONTEXT_W_MAXIMIZE)))
Packit b099d7
	{
Packit b099d7
            /*
Packit b099d7
	     * Minimize and maximize button components:
Packit b099d7
             * SELECT_BUTTON Press - start of a click.
Packit b099d7
             */
Packit b099d7
Packit b099d7
	    PushGadgetIn (pCD, partContext);
Packit b099d7
	}
Packit b099d7
	   
Packit b099d7
	/*
Packit b099d7
	 * Other components: no action
Packit b099d7
	 */
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION CheckButtonPressBuiltin */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleIconButtonPress (pCD, buttonEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function handles builtin functions in the icon context.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data of the icon that received the button event
Packit b099d7
 *
Packit b099d7
 *  buttonEvent = pointer to the button event that occurred
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleIconButtonPress (ClientData *pCD, XButtonEvent *buttonEvent)
Packit b099d7
{
Packit b099d7
    int newState;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Do icon component button press actions:
Packit b099d7
     * Button 1 press - set the keyboard input focus if policy is explicit
Packit b099d7
     * Button 1 double-click - normalize the icon
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (wmGD.clickData.doubleClickContext == F_SUBCONTEXT_I_ALL)
Packit b099d7
    {
Packit b099d7
        /*
Packit b099d7
         * A double-click was done, normalize the icon.
Packit b099d7
         */
Packit b099d7
Packit b099d7
	if (pCD->maxConfig)
Packit b099d7
	{
Packit b099d7
	    newState = MAXIMIZED_STATE;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    newState = NORMAL_STATE;
Packit b099d7
	}
Packit b099d7
Packit b099d7
        SetClientState (pCD, newState, buttonEvent->time);
Packit b099d7
	wmGD.clickData.clickPending = False;
Packit b099d7
	wmGD.clickData.doubleClickPending = False;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
        /*
Packit b099d7
         * This is a regular button press (it may be the start of a 
Packit b099d7
         * double-click).  Set the focus and top the icon if appropriate.
Packit b099d7
         */
Packit b099d7
Packit b099d7
        if (wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_EXPLICIT)
Packit b099d7
        {
Packit b099d7
	    Do_Focus_Key (pCD, buttonEvent->time, ALWAYS_SET_FOCUS);
Packit b099d7
        }
Packit b099d7
Packit b099d7
Packit b099d7
        /*
Packit b099d7
         * Indicate that a move may be starting; wait for button motion
Packit b099d7
         * events before moving the icon.
Packit b099d7
         */
Packit b099d7
Packit b099d7
        wmGD.preMove = True;
Packit b099d7
        wmGD.preMoveX = buttonEvent->x_root;
Packit b099d7
        wmGD.preMoveY = buttonEvent->y_root;
Packit b099d7
        wmGD.configButton = buttonEvent->button;
Packit b099d7
        wmGD.configAction = MOVE_CLIENT;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleIconButtonPress */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleIconBoxButtonPress (pCD, buttonEvent, subContext)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function handles builtin functions in the iconbox context.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data of the icon that received the button event
Packit b099d7
 *
Packit b099d7
 *  buttonEvent = pointer to the button event that occurred
Packit b099d7
 *
Packit b099d7
 *  subContext = context id of event location inside icon box
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleIconBoxButtonPress (ClientData *pCD, XButtonEvent *buttonEvent, Context subContext)
Packit b099d7
{
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Do iconbox icon component button press actions:
Packit b099d7
     * Button 1 press - select the icon
Packit b099d7
     * Button 1 double-click - normalize the icon or raise the window
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((wmGD.clickData.doubleClickContext == F_SUBCONTEXT_IB_IICON) ||
Packit b099d7
       (wmGD.clickData.doubleClickContext == F_SUBCONTEXT_IB_WICON))
Packit b099d7
    {
Packit b099d7
	F_Restore_And_Raise ((String)NULL, pCD, (XEvent *)NULL);
Packit b099d7
    }
Packit b099d7
    else if ((subContext == F_SUBCONTEXT_IB_IICON) ||
Packit b099d7
	     (subContext == F_SUBCONTEXT_IB_WICON))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Indicate that a move may be starting; wait for button motion
Packit b099d7
	 * events before moving the icon.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	wmGD.preMove = True;
Packit b099d7
	wmGD.preMoveX = buttonEvent->x_root;
Packit b099d7
	wmGD.preMoveY = buttonEvent->y_root;
Packit b099d7
	wmGD.configButton = buttonEvent->button;
Packit b099d7
	wmGD.configAction = MOVE_CLIENT;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Do icon box icon actions:
Packit b099d7
     * Button 1 press - select the icon in the icon box
Packit b099d7
     */
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * XmProcessTraversal will move the selection cursor to the
Packit b099d7
     * widget that was "boinked" with the mouse
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((P_ICON_BOX(pCD)->pCD_iconBox == wmGD.keyboardFocus) ||
Packit b099d7
	(P_ICON_BOX(pCD)->pCD_iconBox == wmGD.nextKeyboardFocus))
Packit b099d7
    {
Packit b099d7
	XmProcessTraversal (XtWindowToWidget(DISPLAY, ICON_FRAME_WIN(pCD)), 
Packit b099d7
			    XmTRAVERSE_CURRENT);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleIconBoxButtonPress */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCButtonRelease (pCD, buttonEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with a button
Packit b099d7
 *  release event on the client window (including frame) or icon.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data for the window/icon that got the event
Packit b099d7
 *
Packit b099d7
 *  buttonEvent = pointer to the button event that occurred
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  ---------
Packit b099d7
 *  Skip builtin processing if move or resize button actions were started
Packit b099d7
 *  due to button-up bindings.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleCButtonRelease (ClientData *pCD, XButtonEvent *buttonEvent)
Packit b099d7
{
Packit b099d7
    Context context;
Packit b099d7
    Context subContext;
Packit b099d7
    int partContext;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Find out whether the event was on the client window frame or the icon
Packit b099d7
     * and process the event accordingly.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    IdentifyEventContext (buttonEvent, pCD, &context, &partContext);
Packit b099d7
    subContext = (1L << partContext);
Packit b099d7
Packit b099d7
    ProcessClickBRelease (buttonEvent, pCD, context, subContext);
Packit b099d7
Packit b099d7
    if (CheckForButtonAction (buttonEvent, context, subContext, pCD) && pCD)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Button bindings have been processed, now check for bindings
Packit b099d7
	 * that associated with the built-in semantics of the window
Packit b099d7
	 * frame decorations.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
        CheckButtonReleaseBuiltin (buttonEvent, context, subContext, pCD);
Packit b099d7
    }
Packit b099d7
    /*
Packit b099d7
     * Else skip built-in processing due to execution of a function that
Packit b099d7
     * does on-going event processing or that has changed the client state
Packit b099d7
     * (e.g., f.move or f.minimize).
Packit b099d7
     */
Packit b099d7
Packit b099d7
Packit b099d7
    /* clear preMove state */
Packit b099d7
    wmGD.preMove = False;
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCButtonRelease */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCKeyPress (pCD, keyEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with a key
Packit b099d7
 *  press event on the client window (including frame) or icon.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data for the window/icon that got the event
Packit b099d7
 *
Packit b099d7
 *  keyEvent = pointer to the key event that occurred
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = True if the event should be dispatched by XtDispatchEvent
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Boolean HandleCKeyPress (ClientData *pCD, XKeyEvent *keyEvent)
Packit b099d7
{
Packit b099d7
    Boolean dispatchEvent = False;
Packit b099d7
    Boolean checkKeyEvent = True;
Packit b099d7
Packit b099d7
Packit b099d7
    if (wmGD.menuActive)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * The active menu accelerators have been checked and keyEvent was
Packit b099d7
	 * not one of them.  We will check for an iconbox icon widget key and
Packit b099d7
	 * for pass keys mode and then have the toolkit dispatch the event, 
Packit b099d7
	 * without rechecking the client accelerator list.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	dispatchEvent = True;
Packit b099d7
	checkKeyEvent = False;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If pass keys is active then only check for getting out of the pass
Packit b099d7
     * keys mode if the event is on the client frame or icon frame window.
Packit b099d7
     * Unfreeze the keyboard and replay the key if pass keys is active.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (((keyEvent->window == ICON_FRAME_WIN(pCD)) ||
Packit b099d7
	 (keyEvent->window == pCD->pSD->activeIconTextWin)) &&
Packit b099d7
	P_ICON_BOX(pCD))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * This is a non-grabbed key that is intended for the icon widget
Packit b099d7
	 * in the iconbox.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	dispatchEvent = True; /* have the toolkit dispatch the event */
Packit b099d7
	checkKeyEvent = False;
Packit b099d7
	if (keyEvent->window == pCD->pSD->activeIconTextWin)
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * The event is really for the icon, not the active
Packit b099d7
	     * label, so ... correct the window id 
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    keyEvent->window = ICON_FRAME_WIN(pCD);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else if (wmGD.passKeysActive)
Packit b099d7
    {
Packit b099d7
	if (wmGD.passKeysKeySpec &&
Packit b099d7
	    ((wmGD.passKeysKeySpec->state == keyEvent->state) ||
Packit b099d7
	     (wmGD.passKeysKeySpec->state == NOLOCKMOD(keyEvent->state))) &&
Packit b099d7
	    (wmGD.passKeysKeySpec->keycode == keyEvent->keycode))
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Get out of the pass keys mode.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    F_Pass_Key (NULL, (ClientData *) NULL, (XEvent *) NULL);
Packit b099d7
	    XAllowEvents (DISPLAY, AsyncKeyboard, CurrentTime);
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    XAllowEvents (DISPLAY, ReplayKeyboard, CurrentTime);
Packit b099d7
	}
Packit b099d7
	checkKeyEvent = False;
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XAllowEvents (DISPLAY, AsyncKeyboard, CurrentTime);
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Check for a "general" key binding that has been set only for the
Packit b099d7
     * icon context.  These key bindings are set with the keyBinding
Packit b099d7
     * resource or as accelerators in icon context menus.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (checkKeyEvent && (keyEvent->window == ICON_FRAME_WIN(pCD)))
Packit b099d7
    {
Packit b099d7
	if ((checkKeyEvent = HandleKeyPress (keyEvent, 
Packit b099d7
					     ACTIVE_PSD->keySpecs, True,
Packit b099d7
					     F_CONTEXT_ICON, False,
Packit b099d7
					     (ClientData *)NULL))
Packit b099d7
	    && ACTIVE_PSD->acceleratorMenuCount)
Packit b099d7
	{
Packit b099d7
	    int n;
Packit b099d7
Packit b099d7
	    for (n = 0; ((keyEvent->keycode != 0) &&
Packit b099d7
			 (n < ACTIVE_PSD->acceleratorMenuCount)); n++)
Packit b099d7
	    {
Packit b099d7
		if (!HandleKeyPress (keyEvent,
Packit b099d7
		           ACTIVE_PSD->acceleratorMenuSpecs[n]->accelKeySpecs,
Packit b099d7
			   True, F_CONTEXT_ICON, True,(ClientData *)NULL))
Packit b099d7
		{
Packit b099d7
		    checkKeyEvent = False;
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Check for a key binding that has been set as an accelerator in the
Packit b099d7
     * system menu.  We only do the first accelerator found.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (checkKeyEvent && pCD->systemMenuSpec &&
Packit b099d7
        (pCD->systemMenuSpec->accelKeySpecs))
Packit b099d7
    {
Packit b099d7
	HandleKeyPress (keyEvent, pCD->systemMenuSpec->accelKeySpecs,
Packit b099d7
			FALSE, 0, TRUE,(ClientData *)NULL );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (dispatchEvent);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCKeyPress */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  CheckButtonReleaseBuiltin (buttonEvent, context, subContext, pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function checks to see if a built-in window manager function
Packit b099d7
 *  has been activated as a result of a button release. If yes, then the
Packit b099d7
 *  associated function is done.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  buttonEvent = pointer to a button release event
Packit b099d7
 *
Packit b099d7
 *  context = button event context (root, icon, window)
Packit b099d7
 *
Packit b099d7
 *  subContext = button event subcontext (title, system button, ...)
Packit b099d7
 *
Packit b099d7
 *  pCD = pointer to client data for the window/icon that got the event
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void CheckButtonReleaseBuiltin (XButtonEvent *buttonEvent, Context context, Context subContext, ClientData *pCD)
Packit b099d7
{
Packit b099d7
    /*
Packit b099d7
     * All builtin button buindings are based on button 1 with no modifiers.
Packit b099d7
     * (Ignore locking modifiers).
Packit b099d7
     *
Packit b099d7
     * Test the event for a ``button up'' transition on buttons we are
Packit b099d7
     * interested in.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (!((buttonEvent->button == SELECT_BUTTON) &&
Packit b099d7
	  (NOLOCKMOD(buttonEvent->state) == SELECT_BUTTON_MASK)) &&
Packit b099d7
	!((buttonEvent->button == DMANIP_BUTTON) &&
Packit b099d7
	  (NOLOCKMOD(buttonEvent->state) == DMANIP_BUTTON_MASK)))
Packit b099d7
    {
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Process the builtin button bindings based on the window manager
Packit b099d7
     * component that was selected.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((buttonEvent->button == SELECT_BUTTON) &&
Packit b099d7
	(context & F_CONTEXT_ICON))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Do the icon component button release actions:
Packit b099d7
	 * SELECT_BUTTON click - post the system menu if specified.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (wmGD.iconClick &&
Packit b099d7
	    (wmGD.clickData.clickContext == F_SUBCONTEXT_I_ALL))
Packit b099d7
	{
Packit b099d7
	    wmGD.checkHotspot = True;
Packit b099d7
Packit b099d7
	    /*
Packit b099d7
	     * Post the system menu with traversal on (Button 1 should be
Packit b099d7
	     * used to manipulate the menu).
Packit b099d7
	     */
Packit b099d7
	    pCD->grabContext = F_CONTEXT_ICON;
Packit b099d7
	    PostMenu (pCD->systemMenuSpec, pCD, 0, 0, NoButton, 
Packit b099d7
		      F_CONTEXT_ICON, POST_STICKY, (XEvent *)buttonEvent);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
/* post menu from icon in iconbox */
Packit b099d7
    else if ((buttonEvent->button == SELECT_BUTTON) &&
Packit b099d7
	     (context & F_CONTEXT_ICONBOX))
Packit b099d7
    {
Packit b099d7
        if ((wmGD.iconClick)  &&
Packit b099d7
            (((pCD->clientState == MINIMIZED_STATE)  &&
Packit b099d7
	      (wmGD.clickData.clickContext == F_SUBCONTEXT_IB_IICON)) ||
Packit b099d7
	     (wmGD.clickData.clickContext == F_SUBCONTEXT_IB_WICON))  )
Packit b099d7
        {
Packit b099d7
            wmGD.checkHotspot = True;
Packit b099d7
	    
Packit b099d7
            /*
Packit b099d7
             * Post the system menu with traversal on (Button 1 should be
Packit b099d7
             * used to manipulate the menu.
Packit b099d7
             */
Packit b099d7
            if ((wmGD.clickData.clickContext == F_SUBCONTEXT_IB_IICON) &&
Packit b099d7
                (pCD->clientState == MINIMIZED_STATE))
Packit b099d7
            {
Packit b099d7
		pCD->grabContext = F_SUBCONTEXT_IB_IICON;
Packit b099d7
                PostMenu (pCD->systemMenuSpec, pCD, 0, 0, NoButton,
Packit b099d7
                          F_SUBCONTEXT_IB_IICON, POST_STICKY, (XEvent *)buttonEvent);
Packit b099d7
            }
Packit b099d7
            else
Packit b099d7
            {
Packit b099d7
		pCD->grabContext = F_SUBCONTEXT_IB_WICON;
Packit b099d7
                PostMenu (pCD->systemMenuSpec, pCD, 0, 0, NoButton,
Packit b099d7
                          F_SUBCONTEXT_IB_WICON, POST_STICKY, (XEvent *)buttonEvent);
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
/* end of post menu from icon in iconbox */
Packit b099d7
    else if (context & F_CONTEXT_WINDOW)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * The button release is on a client window frame component.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if ((buttonEvent->button == SELECT_BUTTON) &&
Packit b099d7
	    (subContext == F_SUBCONTEXT_W_MINIMIZE))
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Minimize button:
Packit b099d7
	     * Button 1 click - minimize the window.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (wmGD.clickData.clickContext == F_SUBCONTEXT_W_MINIMIZE)
Packit b099d7
	    {
Packit b099d7
		SetClientState (pCD, MINIMIZED_STATE, buttonEvent->time);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	else if ((buttonEvent->button == SELECT_BUTTON) &&
Packit b099d7
	         (subContext == F_SUBCONTEXT_W_MAXIMIZE))
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Maximize button:
Packit b099d7
	     * Button 1 click - maximize the window.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (wmGD.clickData.clickContext == F_SUBCONTEXT_W_MAXIMIZE)
Packit b099d7
	    {
Packit b099d7
		if (pCD->clientState == NORMAL_STATE)
Packit b099d7
		{
Packit b099d7
	            SetClientState (pCD, MAXIMIZED_STATE, buttonEvent->time);
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    SetClientState (pCD, NORMAL_STATE, buttonEvent->time);
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Clear the pre-configuration info that supports the move threshold.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    wmGD.preMove = False;
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION CheckButtonReleaseBuiltin */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCMotionNotify (pCD, motionEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with a motion
Packit b099d7
 *  notify event on the client window (including frame) or icon.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to the client data for the window/icon that got the motion
Packit b099d7
 *
Packit b099d7
 *  motionEvent = pointer to the motion event
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleCMotionNotify (ClientData *pCD, XMotionEvent *motionEvent)
Packit b099d7
{
Packit b099d7
    int diffX;
Packit b099d7
    int diffY;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Do pre-move processing (to support the move threshold) if appropriate:
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (wmGD.preMove)
Packit b099d7
    {
Packit b099d7
	diffX = motionEvent->x_root - wmGD.preMoveX;
Packit b099d7
	if (diffX < 0) diffX = -diffX;
Packit b099d7
	diffY = motionEvent->y_root - wmGD.preMoveY;
Packit b099d7
	if (diffY < 0) diffY = -diffY;
Packit b099d7
Packit b099d7
Packit b099d7
	if ((diffX >= wmGD.moveThreshold) || (diffY >= wmGD.moveThreshold)) 
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * The move threshold has been exceded; start the config action.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    wmGD.clickData.clickPending = False;
Packit b099d7
	    wmGD.clickData.doubleClickPending = False;
Packit b099d7
	    wmGD.preMove = False;
Packit b099d7
Packit b099d7
	    if (wmGD.configAction == MOVE_CLIENT)
Packit b099d7
	    {
Packit b099d7
		HandleClientFrameMove (pCD, (XEvent *) motionEvent);
Packit b099d7
	    }
Packit b099d7
	    else if (wmGD.configAction == RESIZE_CLIENT)
Packit b099d7
	    {
Packit b099d7
		HandleClientFrameResize (pCD, (XEvent *) motionEvent);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCMotionNotify */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCEnterNotify (pCD, enterEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with an enter
Packit b099d7
 *  window event on the client window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to the client data for the window/icon that was entered
Packit b099d7
 *
Packit b099d7
 *  enterEvent = pointer to the enter event
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleCEnterNotify (ClientData *pCD, XEnterWindowEvent *enterEvent)
Packit b099d7
{
Packit b099d7
    XEvent          report;
Packit b099d7
    Boolean	    MatchFound;
Packit b099d7
    Window	    enterWindow;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * If a client is being configured don't change the keyboard input
Packit b099d7
     * focus.  The input focus is "fixed" after the configuration has been
Packit b099d7
     * completed.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (pCD->clientState == MINIMIZED_STATE)
Packit b099d7
    {
Packit b099d7
	enterWindow = ICON_FRAME_WIN(pCD);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	enterWindow = pCD->clientFrameWin;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    MatchFound = XCheckTypedWindowEvent(DISPLAY, enterWindow,
Packit b099d7
				    LeaveNotify, &report);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * NOTE: Handle focus change for when user clicks button in the
Packit b099d7
     * process of moving focus the matching event will be NotifyGrab.
Packit b099d7
     *
Packit b099d7
     * IF (((no_match) ||
Packit b099d7
     *      (another window has focus and button grabbed)) &&
Packit b099d7
     *     pointer_mode)
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((enterEvent->detail != NotifyInferior) &&
Packit b099d7
	(((!MatchFound || (report.xcrossing.detail == NotifyInferior)) &&
Packit b099d7
	  ((enterEvent->mode == NotifyNormal) ||
Packit b099d7
	   (enterEvent->mode == NotifyUngrab)) &&
Packit b099d7
	  !wmGD.menuActive) ||
Packit b099d7
Packit b099d7
	 (wmGD.keyboardFocus &&
Packit b099d7
	  (wmGD.keyboardFocus->clientFrameWin != enterWindow) &&
Packit b099d7
	  (enterEvent->mode == NotifyGrab))) &&
Packit b099d7
Packit b099d7
	((wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_POINTER) ||
Packit b099d7
	 (wmGD.colormapFocusPolicy == CMAP_FOCUS_POINTER)))
Packit b099d7
    {
Packit b099d7
	/* 
Packit b099d7
	 * Make sure that EnterNotify is applicable; don't do anything if
Packit b099d7
	 * the window is minimized (not currently visible) or the event is
Packit b099d7
	 * associated with an icon in the icon box.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (!(((enterEvent->window == pCD->clientFrameWin) &&
Packit b099d7
	      (pCD->clientState == MINIMIZED_STATE)) ||
Packit b099d7
	     (((enterEvent->window == ICON_FRAME_WIN(pCD)) && 
Packit b099d7
	       P_ICON_BOX(pCD)) ||
Packit b099d7
	      (enterEvent->window == pCD->pSD->activeIconTextWin))))
Packit b099d7
Packit b099d7
	{
Packit b099d7
	    if (wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_POINTER)
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * Set the focus only if the window does not currently have
Packit b099d7
		 * or if another window is in the process of getting the
Packit b099d7
		 * focus (this check avoids redundant focus setting).
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		if ((pCD != wmGD.keyboardFocus) ||
Packit b099d7
		    (pCD != wmGD.nextKeyboardFocus))
Packit b099d7
		{
Packit b099d7
Packit b099d7
	            Do_Focus_Key (pCD, enterEvent->time, ALWAYS_SET_FOCUS);
Packit b099d7
Packit b099d7
                    /* Does the event need to be replayed for modalized windows ? */
Packit b099d7
                    if ( wmGD.replayEnterEvent )
Packit b099d7
                        /* Yes, save the event. */
Packit b099d7
                        memcpy( &wmGD.savedEnterEvent, enterEvent, 
Packit b099d7
                                sizeof( XEnterWindowEvent ) );
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * The original code counted on getting a focus out event as a result
Packit b099d7
 * of setting the input focus in Do_Focus_key.  That would cause
Packit b099d7
 * SetkeyboardFocus to get called.  Unfortunately, you cannot depend on
Packit b099d7
 * getting a focus out.  You may have already had focus yourself.
Packit b099d7
 *
Packit b099d7
 * This bug can be produced by:
Packit b099d7
 *	* bring up a menu and leave it posted
Packit b099d7
 *	* move to a different window and click
Packit b099d7
 *	* the menu comes unposted, the new window has input focus, but no
Packit b099d7
 *	  client active decorations are changed.
Packit b099d7
 */
Packit b099d7
#ifdef SGI_FOCUS_PATCH
Packit b099d7
		    SetKeyboardFocus (pCD, REFRESH_LAST_FOCUS);
Packit b099d7
#endif
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    if (wmGD.colormapFocusPolicy == CMAP_FOCUS_POINTER)
Packit b099d7
	    {
Packit b099d7
	        SetColormapFocus (ACTIVE_PSD, pCD);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCEnterNotify */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCLeaveNotify (pCD, leaveEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with an leave
Packit b099d7
 *  window event on the client window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to the client data for the window/icon that was leaveed
Packit b099d7
 *
Packit b099d7
 *  leaveEvent = pointer to the leave event
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleCLeaveNotify (ClientData *pCD, XLeaveWindowEvent *leaveEvent)
Packit b099d7
{
Packit b099d7
    XEvent          report;
Packit b099d7
    Window	    leaveWindow;
Packit b099d7
Packit b099d7
    if (pCD->clientState == MINIMIZED_STATE)
Packit b099d7
    {
Packit b099d7
	leaveWindow = ICON_FRAME_WIN(pCD);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	leaveWindow = pCD->clientFrameWin;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Don't remove enterEvents when user double clicks on an icon in
Packit b099d7
     * an iconbox.  Otherwise the window that gets normalized will get
Packit b099d7
     * matching enter events and not get the focus.
Packit b099d7
     */
Packit b099d7
    if (P_ICON_BOX(pCD) &&
Packit b099d7
	(P_ICON_BOX(pCD)->pCD_iconBox != wmGD.keyboardFocus) &&
Packit b099d7
	(P_ICON_BOX(pCD)->pCD_iconBox != wmGD.nextKeyboardFocus))
Packit b099d7
    {
Packit b099d7
	XCheckTypedWindowEvent(DISPLAY, leaveWindow, EnterNotify, &report);
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCLeaveNotify */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCFocusIn (pCD, focusChangeEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with a focus
Packit b099d7
 *  in event.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to the client data for the window/icon that was entered
Packit b099d7
 *
Packit b099d7
 *  enterEvent = pointer to the focus in event
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = True if event is to be dispatched by the toolkit
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Boolean HandleCFocusIn (ClientData *pCD, XFocusChangeEvent *focusChangeEvent)
Packit b099d7
{
Packit b099d7
    Boolean setupNextFocus;
Packit b099d7
    Boolean doXtDispatchEvent = False;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Ignore the event if it is for a window that is no longer viewable.
Packit b099d7
     * This is the case for a client window FocusIn event that is being
Packit b099d7
     * processed for a window that has been minimized.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((focusChangeEvent->window == ICON_FRAME_WIN(pCD)) && 
Packit b099d7
	P_ICON_BOX(pCD))
Packit b099d7
    {
Packit b099d7
	doXtDispatchEvent = True;
Packit b099d7
    }
Packit b099d7
    else if (((focusChangeEvent->mode == NotifyNormal) ||
Packit b099d7
	     (focusChangeEvent->mode == NotifyWhileGrabbed)) &&
Packit b099d7
	    !((focusChangeEvent->window == pCD->clientBaseWin) &&
Packit b099d7
	      (pCD->clientState == MINIMIZED_STATE)) &&
Packit b099d7
	    !((focusChangeEvent->window == ICON_FRAME_WIN(pCD)) &&
Packit b099d7
	      (pCD->clientState != MINIMIZED_STATE)))
Packit b099d7
    {
Packit b099d7
	setupNextFocus = (wmGD.keyboardFocus == wmGD.nextKeyboardFocus);
Packit b099d7
Packit b099d7
	if (wmGD.keyboardFocus != pCD)
Packit b099d7
	{
Packit b099d7
	    if ((focusChangeEvent->detail == NotifyNonlinear) ||
Packit b099d7
	        (focusChangeEvent->detail == NotifyNonlinearVirtual))
Packit b099d7
	    {
Packit b099d7
	        SetKeyboardFocus (pCD, REFRESH_LAST_FOCUS);
Packit b099d7
		if (setupNextFocus)
Packit b099d7
		{
Packit b099d7
		    wmGD.nextKeyboardFocus = wmGD.keyboardFocus;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    /* Re: CR 4896                                                  */
Packit b099d7
	    /* this part added to try and fix the %#$!@!!&* focus bug.      */
Packit b099d7
            /* this seems to solve most of the problem.  This still leaves  */
Packit b099d7
            /* times when clicking on an icon toggles the focus back to the */
Packit b099d7
            /* the previous focus window.                                   */
Packit b099d7
            /* Another patch was added to WmEvent.c to fix that problem.    */
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
	        SetKeyboardFocus (pCD, REFRESH_LAST_FOCUS);
Packit b099d7
		if (setupNextFocus) wmGD.nextKeyboardFocus = wmGD.keyboardFocus;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	else if ((focusChangeEvent->detail == NotifyInferior) &&
Packit b099d7
		 (wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_EXPLICIT))
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * The client window was withdrawn (unmapped or destroyed).
Packit b099d7
	     * Reset the focus.
Packit b099d7
	     * !!! pointer focus !!!
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (wmGD.autoKeyFocus)
Packit b099d7
	    {
Packit b099d7
		/* !!! fix this up to handle transient windows !!! */
Packit b099d7
		AutoResetKeyFocus (wmGD.keyboardFocus, GetTimestamp ());
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		Do_Focus_Key ((ClientData *) NULL, GetTimestamp (), 
Packit b099d7
			ALWAYS_SET_FOCUS);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    pCD->focusAutoRaiseDisabled = False;
Packit b099d7
Packit b099d7
    return (doXtDispatchEvent);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCFocusIn */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCFocusOut (pCD, focusChangeEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with a focus
Packit b099d7
 *  out event that applies to a client window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to the client data for the window/icon that was entered
Packit b099d7
 *
Packit b099d7
 *  enterEvent = pointer to the focus out event
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  RETURN = True if event is to be dispatched by the toolkit
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Boolean HandleCFocusOut (ClientData *pCD, XFocusChangeEvent *focusChangeEvent)
Packit b099d7
{
Packit b099d7
    Boolean doXtDispatchEvent = False;
Packit b099d7
    long focusFlags = REFRESH_LAST_FOCUS ;
Packit b099d7
Packit b099d7
    pCD->focusAutoRaiseDisabled = False;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Ignore the event if it is for a window that is no longer viewable.
Packit b099d7
     * This is the case for a client window FocusOut event that is being
Packit b099d7
     * processed for a window that has been minimized. Also, ignore focus
Packit b099d7
     * out events for clients that aren't on the current screen.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (((focusChangeEvent->window == ICON_FRAME_WIN(pCD)) && 
Packit b099d7
	 P_ICON_BOX(pCD)) ||
Packit b099d7
	(SCREEN_FOR_CLIENT(pCD) != ACTIVE_SCREEN))
Packit b099d7
    {
Packit b099d7
	doXtDispatchEvent = True;
Packit b099d7
    }
Packit b099d7
    else if ((wmGD.keyboardFocus == pCD) &&
Packit b099d7
	     (focusChangeEvent->mode == NotifyNormal) &&
Packit b099d7
	     ((focusChangeEvent->detail == NotifyNonlinear) ||
Packit b099d7
	      (focusChangeEvent->detail == NotifyNonlinearVirtual)) &&
Packit b099d7
	     !((focusChangeEvent->window == pCD->clientBaseWin) &&
Packit b099d7
	       (pCD->clientState == MINIMIZED_STATE)) &&
Packit b099d7
	     !((focusChangeEvent->window == ICON_FRAME_WIN(pCD)) &&
Packit b099d7
	       (pCD->clientState != MINIMIZED_STATE)))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * The keyboard focus was shifted to another window, maybe on
Packit b099d7
	 * another screen.  Clear the focus indication and reset focus
Packit b099d7
	 * handling for the client window.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * use SCREEN_SWITCH_FOCUS in SetKeyboardFocus to
Packit b099d7
	 * not call SetColormapFocus if we are moveing
Packit b099d7
	 * to another screen
Packit b099d7
	 */
Packit b099d7
	if (SCREEN_FOR_CLIENT(pCD) != ACTIVE_SCREEN)
Packit b099d7
	{
Packit b099d7
	    focusFlags |= SCREEN_SWITCH_FOCUS;
Packit b099d7
	}
Packit b099d7
	SetKeyboardFocus ((ClientData *) NULL, focusFlags);
Packit b099d7
	if (wmGD.nextKeyboardFocus == pCD)
Packit b099d7
	{
Packit b099d7
	    wmGD.nextKeyboardFocus = NULL;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (doXtDispatchEvent);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCFocusOut */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCConfigureRequest (pCD, configureRequest)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This functions handles ConfigureRequest events that are for client windows.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 *  configureRequest = a pointer to a ConfigureRequest event
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleCConfigureRequest (ClientData *pCD, XConfigureRequestEvent *configureRequest)
Packit b099d7
{
Packit b099d7
    unsigned int mask = configureRequest->value_mask;
Packit b099d7
    int stackMode = configureRequest->detail;
Packit b099d7
    unsigned int changeMask;
Packit b099d7
    ClientData *pcdLeader;
Packit b099d7
    ClientData *pcdSibling;
Packit b099d7
    ClientListEntry *pStackEntry;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Call ProcessNewConfiguration to handle window moving and resizing.
Packit b099d7
     * Send ConfigureNotify event (based on ICCCM conventions).
Packit b099d7
     * Then process the request for stacking.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((configureRequest->window == pCD->client) &&
Packit b099d7
	(mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth)))
Packit b099d7
    {
Packit b099d7
	if (pCD->maxConfig) {
Packit b099d7
	    ProcessNewConfiguration (pCD,
Packit b099d7
		(mask & CWX) ? configureRequest->x : pCD->maxX,
Packit b099d7
		(mask & CWY) ? configureRequest->y : pCD->maxY,
Packit b099d7
		(unsigned int) ((mask & CWWidth) ? 
Packit b099d7
		    configureRequest->width : pCD->maxWidth),
Packit b099d7
		(unsigned int) ((mask & CWHeight) ? 
Packit b099d7
		    configureRequest->height : pCD->maxHeight),
Packit b099d7
		True /*client request*/);
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    int xOff, yOff;
Packit b099d7
Packit b099d7
	    /* CDExc21094 - ProcessNewConfiguration() offsets the */
Packit b099d7
	    /* x and y positions passed in; in order to keep them */
Packit b099d7
	    /* the same, we offset them in the opposite direction. */
Packit b099d7
	    if (wmGD.positionIsFrame)
Packit b099d7
	    {
Packit b099d7
		xOff = pCD->clientOffset.x;
Packit b099d7
		yOff = pCD->clientOffset.y;
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		xOff = yOff = 0;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    ProcessNewConfiguration (pCD,
Packit b099d7
		(mask & CWX) ? configureRequest->x : pCD->clientX - xOff,
Packit b099d7
		(mask & CWY) ? configureRequest->y : pCD->clientY - yOff,
Packit b099d7
		(unsigned int) ((mask & CWWidth) ? 
Packit b099d7
		    configureRequest->width : pCD->clientWidth),
Packit b099d7
		(unsigned int) ((mask & CWHeight) ? 
Packit b099d7
		    configureRequest->height : pCD->clientHeight),
Packit b099d7
		True /*client request*/);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (mask & CWStackMode)
Packit b099d7
    {
Packit b099d7
	changeMask = mask & (CWSibling | CWStackMode);
Packit b099d7
	if (changeMask & CWSibling)
Packit b099d7
	{
Packit b099d7
	    if (XFindContext (DISPLAY, configureRequest->above,
Packit b099d7
		    wmGD.windowContextType, (caddr_t *)&pcdSibling))
Packit b099d7
	    {
Packit b099d7
		changeMask &= ~CWSibling;
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * For client requests only primary windows can be
Packit b099d7
		 * restacked relative to one another.
Packit b099d7
		 */
Packit b099d7
Packit b099d7
		pcdLeader = FindTransientTreeLeader (pCD);
Packit b099d7
		pcdSibling = FindTransientTreeLeader (pcdSibling);
Packit b099d7
		if (pcdLeader == pcdSibling)
Packit b099d7
		{
Packit b099d7
		    changeMask &= ~CWSibling;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    pStackEntry = &pcdSibling->clientEntry;
Packit b099d7
		    if ((stackMode == Above) || (stackMode == TopIf))
Packit b099d7
		    {
Packit b099d7
			/* lower the window to just above the sibling */
Packit b099d7
			Do_Lower (pcdLeader, pStackEntry, STACK_NORMAL);
Packit b099d7
	    	    }
Packit b099d7
	    	    else if ((stackMode == Below) || (stackMode == BottomIf))
Packit b099d7
	    	    {
Packit b099d7
			/* raise the window to just below the sibling */
Packit b099d7
			Do_Raise (pcdLeader, pStackEntry, STACK_NORMAL);
Packit b099d7
	    	    }
Packit b099d7
	    	    else if (stackMode == Opposite)
Packit b099d7
	    	    {
Packit b099d7
			F_Raise_Lower (NULL, pCD, (XEvent *)configureRequest);
Packit b099d7
	    	    }
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (!(changeMask & CWSibling))
Packit b099d7
	{
Packit b099d7
	    if ((stackMode == Above) || (stackMode == TopIf))
Packit b099d7
	    {
Packit b099d7
		Do_Raise (pCD, (ClientListEntry *) NULL, STACK_NORMAL);
Packit b099d7
	    }
Packit b099d7
	    else if ((stackMode == Below) || (stackMode == BottomIf))
Packit b099d7
	    {
Packit b099d7
		Do_Lower (pCD, (ClientListEntry *) NULL, STACK_NORMAL);
Packit b099d7
	    }
Packit b099d7
	    else if (stackMode == Opposite)
Packit b099d7
	    {
Packit b099d7
		F_Raise_Lower (NULL, pCD, (XEvent *) configureRequest);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/* !!! should a synthetic ConfigureNotify be sent? !!! */
Packit b099d7
        if ((configureRequest->window == pCD->client) &&
Packit b099d7
	    !(mask & (CWX | CWY | CWWidth | CWHeight | CWBorderWidth)))
Packit b099d7
	{
Packit b099d7
	    SendConfigureNotify (pCD);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCConfigureRequest */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCColormapNotify (pCD, colorEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function does window management actions associated with a colormap
Packit b099d7
 *  notify event on the client window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 *  colorEvent = a ColormapNotify event
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleCColormapNotify (ClientData *pCD, XColormapEvent *colorEvent)
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
#ifndef	IBM_169380
Packit b099d7
    ClientData  **cmap_window_data;
Packit b099d7
#endif
Packit b099d7
    Boolean newClientColormap = False;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * The colormap of the top-level client window or one of its subwindows
Packit b099d7
     * has been changed.
Packit b099d7
     */
Packit b099d7
Packit b099d7
Packit b099d7
    if (colorEvent->new)
Packit b099d7
    {
Packit b099d7
        /*
Packit b099d7
         * The colormap has been changed.
Packit b099d7
         */
Packit b099d7
Packit b099d7
        /*
Packit b099d7
         * !!! when the server ColormapNotify problem is fixed !!!
Packit b099d7
         * !!! use the colormap id from the event              !!!
Packit b099d7
         */
Packit b099d7
        if (WmGetWindowAttributes (colorEvent->window))
Packit b099d7
        {
Packit b099d7
	    colorEvent->colormap = wmGD.windowAttributes.colormap;
Packit b099d7
        }
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
        /*
Packit b099d7
         * !!! remove the above code when the problem is fixed  !!!
Packit b099d7
         */
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Identify the colormap that the window manager has associated
Packit b099d7
	 * with the window.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
#ifndef IBM_169380
Packit b099d7
        if ((pCD->clientCmapCount == 0) && (colorEvent->window == pCD->client))
Packit b099d7
#endif
Packit b099d7
	if (pCD->clientCmapCount == 0)
Packit b099d7
	{
Packit b099d7
	    /* no subwindow colormaps; change top-level window colormap */
Packit b099d7
#ifdef  IBM_169380
Packit b099d7
	    if (colorEvent->window == pCD->client)
Packit b099d7
	    {
Packit b099d7
#endif
Packit b099d7
	        if (colorEvent->colormap == None)
Packit b099d7
	        {
Packit b099d7
	            /* use the workspace colormap */
Packit b099d7
	            pCD->clientColormap = 
Packit b099d7
			ACTIVE_PSD->workspaceColormap;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
	            pCD->clientColormap = colorEvent->colormap;
Packit b099d7
		}
Packit b099d7
		newClientColormap = True;
Packit b099d7
#ifdef  IBM_169380
Packit b099d7
	    }
Packit b099d7
#endif
Packit b099d7
	}
Packit b099d7
Packit b099d7
#ifndef	IBM_169380
Packit b099d7
        if (!XFindContext (DISPLAY, colorEvent->window,
Packit b099d7
            wmGD.cmapWindowContextType, (caddr_t *)&cmap_window_data))
Packit b099d7
        {
Packit b099d7
            /*
Packit b099d7
             * The WM_COLORMAP_WINDOWS property of a toplevel window may
Packit b099d7
             * specify colorEvent->window.  If so, we must update the
Packit b099d7
             * colormap information it holds in clientCmapList.
Packit b099d7
             */
Packit b099d7
            ClientData  *any_pCD;
Packit b099d7
            int         j;
Packit b099d7
Packit b099d7
            for (j = 0; cmap_window_data[j] != NULL; j++)
Packit b099d7
            {
Packit b099d7
                any_pCD = cmap_window_data[j];
Packit b099d7
                for (i = 0; i < any_pCD->clientCmapCount; i++)
Packit b099d7
                {
Packit b099d7
                    if (any_pCD->cmapWindows[i] == colorEvent->window)
Packit b099d7
                    {
Packit b099d7
                        if (colorEvent->colormap == None)
Packit b099d7
                        {
Packit b099d7
                            /* use the workspace colormap */
Packit b099d7
                            any_pCD->clientCmapList[i] =
Packit b099d7
                                ACTIVE_PSD->workspaceColormap;
Packit b099d7
                        }
Packit b099d7
                        else
Packit b099d7
                        {
Packit b099d7
                            any_pCD->clientCmapList[i] = colorEvent->colormap;
Packit b099d7
                        }
Packit b099d7
                        if (i == any_pCD->clientCmapIndex)
Packit b099d7
                        {
Packit b099d7
                            any_pCD->clientColormap =
Packit b099d7
                                any_pCD->clientCmapList[i];
Packit b099d7
                            if (any_pCD == pCD)
Packit b099d7
                            {
Packit b099d7
                                newClientColormap = True;
Packit b099d7
                            }
Packit b099d7
                        }
Packit b099d7
                        break;
Packit b099d7
                    }
Packit b099d7
                }
Packit b099d7
            }
Packit b099d7
        }
Packit b099d7
#else
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /* there are subwindow colormaps */
Packit b099d7
	    for (i = 0; i < pCD->clientCmapCount; i++)
Packit b099d7
	    {
Packit b099d7
		if (pCD->cmapWindows[i] == colorEvent->window)
Packit b099d7
		{
Packit b099d7
		    if (colorEvent->colormap == None)
Packit b099d7
		    {
Packit b099d7
			/* use the workspace colormap */
Packit b099d7
			pCD->clientCmapList[i] = 
Packit b099d7
			    ACTIVE_PSD->workspaceColormap;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			pCD->clientCmapList[i] = colorEvent->colormap;
Packit b099d7
		    }
Packit b099d7
		    if (i == pCD->clientCmapIndex)
Packit b099d7
		    {
Packit b099d7
			newClientColormap = True;
Packit b099d7
			pCD->clientColormap = pCD->clientCmapList[i];
Packit b099d7
		    }
Packit b099d7
		    break;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
#endif	/* IBM_169380 */
Packit b099d7
Packit b099d7
	if ((ACTIVE_PSD->colormapFocus == pCD) && newClientColormap &&
Packit b099d7
	    ((pCD->clientState == NORMAL_STATE) ||
Packit b099d7
	    (pCD->clientState == MAXIMIZED_STATE)))
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * The client window has the colormap focus, install the
Packit b099d7
	     * colormap.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    WmInstallColormap (ACTIVE_PSD, pCD->clientColormap);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleCColormapNotify */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleClientMessage (pCD, clientEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function handles client message events that are sent to the root
Packit b099d7
 *  window.  The window manager action that is taken depends on the
Packit b099d7
 *  message_type of the event.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data
Packit b099d7
 *
Packit b099d7
 *  clientEvent = pointer to a client message event on the root window
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void HandleClientMessage (ClientData *pCD, XClientMessageEvent *clientEvent)
Packit b099d7
{
Packit b099d7
    unsigned int newState;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Process the client message event based on the message_type.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (clientEvent->message_type == wmGD.xa_WM_CHANGE_STATE)
Packit b099d7
    {
Packit b099d7
	if ((clientEvent->data.l[0] == IconicState) &&
Packit b099d7
	    (pCD->clientFunctions & MWM_FUNC_MINIMIZE))
Packit b099d7
	{
Packit b099d7
	    newState = MINIMIZED_STATE;
Packit b099d7
	}
Packit b099d7
	else if (clientEvent->data.l[0] == NormalState)
Packit b099d7
	{
Packit b099d7
	    newState = NORMAL_STATE;
Packit b099d7
	}
Packit b099d7
#ifdef WSM
Packit b099d7
	if (!ClientInWorkspace (ACTIVE_WS, pCD))
Packit b099d7
	{
Packit b099d7
	    newState |= UNSEEN_STATE;
Packit b099d7
	}
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
	SetClientState (pCD, newState, GetTimestamp ());
Packit b099d7
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION HandleClientMessage */
Packit b099d7
Packit b099d7
Packit b099d7
#ifndef NO_SHAPE
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  HandleCShapeNotify (pCD, shapeEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Handle a shape notify event on a client window. Keeps track of
Packit b099d7
 *  the shaped state of the client window and calls
Packit b099d7
 *  SetFrameShape() to reshape the frame accordingly.
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  shapeEvent = pointer to a shape notify in event on the client window.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
void
Packit b099d7
HandleCShapeNotify (ClientData *pCD,  XShapeEvent *shapeEvent)
Packit b099d7
{
Packit b099d7
    if (pCD)
Packit b099d7
    {
Packit b099d7
	if (shapeEvent->kind != ShapeBounding)
Packit b099d7
	{
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	pCD->wShaped = shapeEvent->shaped;
Packit b099d7
	SetFrameShape (pCD);
Packit b099d7
    }
Packit b099d7
} /* END OF FUNCTION HandleCShapeNotify */
Packit b099d7
#endif /* NO_SHAPE */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetParentWindow (window)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function identifies the parent window of the specified window.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  window = find the parent of this window
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  Return = return the window id of the parent of the specified window
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
Window GetParentWindow (Window window)
Packit b099d7
{
Packit b099d7
    Window root;
Packit b099d7
    Window parent;
Packit b099d7
    Window *children;
Packit b099d7
    unsigned int nchildren;
Packit b099d7
Packit b099d7
Packit b099d7
    if (XQueryTree (DISPLAY, window, &root, &parent, &children, &nchildren))
Packit b099d7
    {
Packit b099d7
	if (nchildren)
Packit b099d7
	{
Packit b099d7
	    XFree ((char *)children);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	parent = (Window)0L;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (parent);
Packit b099d7
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetParentWindow */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  DetermineActiveScreen (pEvent)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function determines the currently active screen
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pEvent = pointer to an event structure
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  ACTIVE_PSD =  set to point to the screen data for the currently
Packit b099d7
 *                active scree;
Packit b099d7
 *  wmGD.queryScreen =  set to False if we're sure about the ACTIVE_PSD
Packit b099d7
 *                      setting
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void DetermineActiveScreen (XEvent *pEvent)
Packit b099d7
{
Packit b099d7
    WmScreenData *pSD;
Packit b099d7
Packit b099d7
    switch (pEvent->type)
Packit b099d7
    {
Packit b099d7
	case NoExpose:
Packit b099d7
	case GraphicsExpose:
Packit b099d7
		break;		/* ignore these events */
Packit b099d7
Packit b099d7
        default:
Packit b099d7
		/*
Packit b099d7
		 * Get the screen that the event occurred on.
Packit b099d7
		 */
Packit b099d7
		pSD = GetScreenForWindow (pEvent->xany.window);
Packit b099d7
Packit b099d7
		if (pSD) 
Packit b099d7
		{
Packit b099d7
		    /*
Packit b099d7
		     * Set the ACTIVE_PSD to the event's screen to
Packit b099d7
		     * make sure the event gets handled correctly.
Packit b099d7
		     */
Packit b099d7
		    SetActiveScreen (pSD);
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION DetermineActiveScreen */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  GetScreenForWindow (win)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function determines the screen for a window
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  win = window id
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  value of function = pointer to screen data (pSD) or NULL on failure
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
WmScreenData * GetScreenForWindow (win)
Packit b099d7
    Window win;
Packit b099d7
Packit b099d7
{
Packit b099d7
    XWindowAttributes attribs;
Packit b099d7
    WmScreenData *pSD = NULL;
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Get the screen that the event occurred on.
Packit b099d7
     */
Packit b099d7
    if (XGetWindowAttributes (DISPLAY, win, &attribs))
Packit b099d7
    {
Packit b099d7
	if (!XFindContext (DISPLAY, attribs.root, wmGD.screenContextType, 
Packit b099d7
			    (caddr_t *)&pSD))
Packit b099d7
	{
Packit b099d7
	    if (pSD && !pSD->screenTopLevelW)
Packit b099d7
	    {
Packit b099d7
		pSD = NULL;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (pSD);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION GetScreenForWindow */