Blame clients/mwm/WmWinState.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * Motif Release 1.2.1
Packit b099d7
*/ 
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: WmWinState.c /main/6 1996/06/20 09:39:39 rswiston $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/*
Packit b099d7
 * (c) Copyright 1987, 1988, 1989, 1990 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Included Files:
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmGlobal.h"
Packit b099d7
#include "WmICCC.h"
Packit b099d7
#include "WmProtocol.h"
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * include extern functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmCDecor.h"
Packit b099d7
#include "WmFunction.h"
Packit b099d7
#include "WmIDecor.h"
Packit b099d7
#include "WmIPlace.h"
Packit b099d7
#include "WmIconBox.h"
Packit b099d7
#include "WmKeyFocus.h"
Packit b099d7
#ifdef PANELIST
Packit b099d7
#include "WmPanelP.h"  /* for typedef in WmManage.h */
Packit b099d7
#endif /* PANELIST */
Packit b099d7
#include "WmManage.h"
Packit b099d7
#include "WmProperty.h"
Packit b099d7
#include "WmWinInfo.h"
Packit b099d7
#include "WmWinList.h"
Packit b099d7
#ifdef WSM
Packit b099d7
#include "WmWrkspace.h"
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Function Declarations:
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include "WmWinState.h"
Packit b099d7
#ifdef PANELIST
Packit b099d7
static void SlideWindowOut (ClientData *pCD);
Packit b099d7
#endif /* PANELIST */
Packit b099d7
static void UnmapClients (ClientData *pCD, unsigned int event_mask);
Packit b099d7
static void SetupWindowStateWithEventMask (ClientData *pCD, int newState, Time setTime, unsigned int event_mask);
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * Global Variables:
Packit b099d7
 */
Packit b099d7
extern int firstTime;
Packit b099d7
Packit b099d7

Packit b099d7
/******************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetClientState (pCD, newState, setTime)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function is used to change the state of a client window (between
Packit b099d7
 *  withdrawn, normal, minimized, maximized).
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = This is a pointer to the window data for the window that
Packit b099d7
 *        is to have its state changed. The fields that are used
Packit b099d7
 *        are clientState, ...
Packit b099d7
 *
Packit b099d7
 *  newState = This is the state that the client window is to be changed to.
Packit b099d7
 *
Packit b099d7
 *  setTime = timestamp for state setting operations
Packit b099d7
 *
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  pCD.clientState = new client state
Packit b099d7
 *
Packit b099d7
 ******************************<->***********************************/
Packit b099d7
Packit b099d7
void SetClientState (ClientData *pCD, int newState, Time setTime)
Packit b099d7
{
Packit b099d7
	SetClientStateWithEventMask(pCD, newState, setTime, (unsigned int)0);
Packit b099d7
} /* END OF FUNCTION SetClientState */
Packit b099d7
Packit b099d7
void SetClientStateWithEventMask (ClientData *pCD, int newState, Time setTime, unsigned int event_mask)
Packit b099d7
{
Packit b099d7
    ClientData *pcdLeader;
Packit b099d7
    int currentState;
Packit b099d7
    WmScreenData *pSD = PSD_FOR_CLIENT(pCD);
Packit b099d7
#ifdef WSM
Packit b099d7
    Boolean notShowing = (newState & UNSEEN_STATE);
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
    currentState = pCD->clientState;
Packit b099d7
    if (currentState == newState)
Packit b099d7
    {
Packit b099d7
	/* no change in state */
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Undo the old state and setup the new state.  If this is a transient
Packit b099d7
     * window then insure that it is put in a state that is compatible
Packit b099d7
     * with its transient leader (e.g., it cannot be minimized separately).
Packit b099d7
     */
Packit b099d7
Packit b099d7
    pcdLeader = (pCD->transientLeader) ? FindTransientTreeLeader (pCD) : pCD;
Packit b099d7
#ifdef WSM
Packit b099d7
    SetClientWsIndex (pCD);
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
    if (pCD->transientLeader)
Packit b099d7
    {
Packit b099d7
	if ((pcdLeader->clientState == MINIMIZED_STATE) &&
Packit b099d7
	    (newState != WITHDRAWN_STATE))
Packit b099d7
	{
Packit b099d7
	    newState = MINIMIZED_STATE;
Packit b099d7
#ifdef WSM
Packit b099d7
	    if (notShowing)
Packit b099d7
	    {
Packit b099d7
		newState |= UNSEEN_STATE;
Packit b099d7
	    }
Packit b099d7
#endif /* WSM */
Packit b099d7
	}
Packit b099d7
	else if ((newState == MINIMIZED_STATE) &&
Packit b099d7
		 (pcdLeader->clientState != MINIMIZED_STATE))
Packit b099d7
	{
Packit b099d7
	    if (currentState == WITHDRAWN_STATE)
Packit b099d7
	    {
Packit b099d7
		newState = NORMAL_STATE;
Packit b099d7
#ifdef WSM
Packit b099d7
	    if (notShowing)
Packit b099d7
	    {
Packit b099d7
		newState |= UNSEEN_STATE;
Packit b099d7
	    }
Packit b099d7
#endif /* WSM */
Packit b099d7
	    }
Packit b099d7
	    else
Packit b099d7
	    {
Packit b099d7
		newState = currentState;
Packit b099d7
#ifdef WSM
Packit b099d7
	    if (notShowing)
Packit b099d7
	    {
Packit b099d7
		newState |= UNSEEN_STATE;
Packit b099d7
	    }
Packit b099d7
#endif /* WSM */
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	if (newState == currentState)
Packit b099d7
	{
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    switch (newState)
Packit b099d7
    {
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
        case UNSEEN_STATE | WITHDRAWN_STATE:
Packit b099d7
#else
Packit b099d7
	case WITHDRAWN_STATE:
Packit b099d7
#endif /* WSM */
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Free window manager resources (frame and icon).  The
Packit b099d7
	     * WM_STATE property is set in WithdrawWindow.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    UnManageWindow (pCD);
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case NORMAL_STATE:
Packit b099d7
	case MAXIMIZED_STATE:
Packit b099d7
	{
Packit b099d7
	    SetupWindowStateWithEventMask (pCD, newState, setTime, event_mask);
Packit b099d7
#ifdef WSM
Packit b099d7
	    XMapWindow (DISPLAY, pCD->client);
Packit b099d7
	    XMapWindow (DISPLAY, pCD->clientFrameWin);
Packit b099d7
#if defined(PANELIST)
Packit b099d7
            WmStopWaiting();   /* in WmIPC.c */
Packit b099d7
#endif /* PANELIST */
Packit b099d7
#endif /* WSM */
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	case MINIMIZED_STATE:
Packit b099d7
	{
Packit b099d7
	    Boolean clientHasFocus;
Packit b099d7
Packit b099d7
	    /*
Packit b099d7
	     * Transient windows are minimized with the rest of the transient
Packit b099d7
	     * tree, including the transient leader.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if ((pCD->clientState == NORMAL_STATE) ||
Packit b099d7
		(pCD->clientState == MAXIMIZED_STATE))
Packit b099d7
	    {
Packit b099d7
		if ((wmGD.keyboardFocus == pCD) ||
Packit b099d7
		    (pCD->transientChildren && wmGD.keyboardFocus &&
Packit b099d7
		     (pCD == FindTransientTreeLeader (wmGD.keyboardFocus))))
Packit b099d7
		{
Packit b099d7
		    clientHasFocus = True;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    clientHasFocus = False;
Packit b099d7
		}
Packit b099d7
Packit b099d7
		if (clientHasFocus ||
Packit b099d7
		  ((wmGD.nextKeyboardFocus == pCD) ||
Packit b099d7
		   (pCD->transientChildren && wmGD.keyboardFocus &&
Packit b099d7
		    (pCD == FindTransientTreeLeader (wmGD.nextKeyboardFocus)))))
Packit b099d7
	    	{
Packit b099d7
		    /*
Packit b099d7
		     * Give up the keyboard focus when minimized (including
Packit b099d7
		     * the case in which an associated transient window has
Packit b099d7
		     * the focus).  Immediately remove the focus indication
Packit b099d7
		     * from the window being minimized.
Packit b099d7
		     */
Packit b099d7
Packit b099d7
		    if (wmGD.autoKeyFocus &&
Packit b099d7
			(wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_EXPLICIT))
Packit b099d7
		    {
Packit b099d7
			AutoResetKeyFocus (pcdLeader, setTime);
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
		        Do_Focus_Key (NULL, setTime, 
Packit b099d7
				ALWAYS_SET_FOCUS | WORKSPACE_IF_NULL);
Packit b099d7
		    }
Packit b099d7
Packit b099d7
		    if (clientHasFocus)
Packit b099d7
		    {
Packit b099d7
			SetKeyboardFocus (NULL, 0);
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
Packit b099d7
		/* unmap main client and all transients */
Packit b099d7
		UnmapClients (pCD, event_mask);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    /*
Packit b099d7
	     * Display the icon for the minimized client.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (ICON_FRAME_WIN(pCD)) 
Packit b099d7
	    {
Packit b099d7
#ifdef WSM
Packit b099d7
		if (pCD->clientState & UNSEEN_STATE)
Packit b099d7
		{
Packit b099d7
		    if (pCD->iconWindow)
Packit b099d7
		    {
Packit b099d7
			XMapWindow (DISPLAY, pCD->iconWindow);
Packit b099d7
		    }
Packit b099d7
		    XMapWindow (DISPLAY, ICON_FRAME_WIN(pCD));
Packit b099d7
		}
Packit b099d7
Packit b099d7
		ShowAllIconsForMinimizedClient (pCD);
Packit b099d7
#else /* WSM */
Packit b099d7
		ShowIconForMinimizedClient (pSD->pActiveWS, pCD);
Packit b099d7
#endif /* WSM */
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    SetClientWMState (pCD, IconicState, MINIMIZED_STATE);
Packit b099d7
Packit b099d7
	    if ((pSD->useIconBox) && P_ICON_BOX(pCD))
Packit b099d7
	    {
Packit b099d7
		if ((pCD->clientFlags & ICON_BOX) && ACTIVE_ICON_TEXT_WIN)
Packit b099d7
		{
Packit b099d7
		    /*
Packit b099d7
		     * Hide active icon text window and reparent it to
Packit b099d7
		     * root
Packit b099d7
		     */
Packit b099d7
		    HideActiveIconText((WmScreenData *)NULL);
Packit b099d7
		    pSD->activeLabelParent = ACTIVE_ROOT;
Packit b099d7
		    XReparentWindow(DISPLAY, ACTIVE_ICON_TEXT_WIN , 
Packit b099d7
				ACTIVE_ROOT, 0, 0 );
Packit b099d7
		}
Packit b099d7
		if (ICON_FRAME_WIN(pCD))
Packit b099d7
		{
Packit b099d7
		    /* 
Packit b099d7
		     * force icon appearance in icon box to change 
Packit b099d7
		     */
Packit b099d7
		    IconExposureProc (pCD, True);
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
#ifdef WSM 
Packit b099d7
Packit b099d7
        case UNSEEN_STATE | NORMAL_STATE:
Packit b099d7
        case UNSEEN_STATE | MAXIMIZED_STATE:
Packit b099d7
        case UNSEEN_STATE | MINIMIZED_STATE:
Packit b099d7
	{
Packit b099d7
	    if (wmGD.keyboardFocus == pCD)
Packit b099d7
	    {
Packit b099d7
		/*
Packit b099d7
		 * Give up the keyboard focus 
Packit b099d7
		 */
Packit b099d7
		Do_Focus_Key ((ClientData *)NULL, 
Packit b099d7
			CurrentTime, ALWAYS_SET_FOCUS);
Packit b099d7
		SetKeyboardFocus (NULL, 0);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (!(pCD->clientState & UNSEEN_STATE) &&
Packit b099d7
		 (((pCD->clientState & ~UNSEEN_STATE) == NORMAL_STATE) ||
Packit b099d7
		  ((pCD->clientState & ~UNSEEN_STATE) == MAXIMIZED_STATE)))
Packit b099d7
	    {
Packit b099d7
		/* unmap main client and all transients */
Packit b099d7
		UnmapClients (pcdLeader, event_mask);
Packit b099d7
Packit b099d7
	    }
Packit b099d7
      
Packit b099d7
	    if (pCD->clientFrameWin) 
Packit b099d7
	    {
Packit b099d7
		if (!P_ICON_BOX(pCD))
Packit b099d7
		{
Packit b099d7
		    if (ICON_FRAME_WIN(pCD))
Packit b099d7
		    {
Packit b099d7
			XUnmapWindow (DISPLAY, ICON_FRAME_WIN(pCD));
Packit b099d7
		    }
Packit b099d7
		    if (pCD->iconWindow)
Packit b099d7
			XUnmapWindow (DISPLAY, pCD->iconWindow);
Packit b099d7
		} 
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    switch (newState & ~UNSEEN_STATE)
Packit b099d7
	    {
Packit b099d7
	    case MINIMIZED_STATE:
Packit b099d7
		SetClientWMState (pCD, IconicState, newState);
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	    case NORMAL_STATE:
Packit b099d7
	    case MAXIMIZED_STATE:
Packit b099d7
	    default:
Packit b099d7
		SetClientWMState (pCD, NormalState, newState);
Packit b099d7
		break;
Packit b099d7
	    }
Packit b099d7
        }
Packit b099d7
	break;
Packit b099d7
#endif /* WSM */
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetClientStateWithEventMask */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetupWindowStateWithEventMask (pCD, newState, setTime, event_mask)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function is used to setup a client window in the Normal or Maximized
Packit b099d7
 *  state.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = This is a pointer to the window data for the window that
Packit b099d7
 *        is to have its state changed.
Packit b099d7
 *
Packit b099d7
 *  newState = This is the state that the client window is to be changed to.
Packit b099d7
 *
Packit b099d7
 *  setTime = timestamp for state setting operations
Packit b099d7
 *
Packit b099d7
 *  event_mask = what to grab to prevent stray events going somewhere
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  pCD.clientState = new client state
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static void SetupWindowStateWithEventMask (ClientData *pCD, int newState, 
Packit b099d7
	Time setTime, unsigned int event_mask)
Packit b099d7
{
Packit b099d7
    int currentState;
Packit b099d7
#ifdef WSM
Packit b099d7
    int wsI, iplace;
Packit b099d7
    WmWorkspaceData *pWS_i;
Packit b099d7
#else /* WSM */
Packit b099d7
    WmWorkspaceData *pWS = PSD_FOR_CLIENT(pCD)->pActiveWS;
Packit b099d7
#endif /* WSM */
Packit b099d7
    WmScreenData *pSD = PSD_FOR_CLIENT(pCD);
Packit b099d7
Packit b099d7
    currentState = pCD->clientState;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * A transient window is not restored or maximized if the transient leader
Packit b099d7
     * is minimized.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (newState == NORMAL_STATE)
Packit b099d7
    {
Packit b099d7
	if (pCD->maxConfig == True)
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * The configuration function uses maxConfig to determine
Packit b099d7
	     * what the current configuration is (and then resets
Packit b099d7
	     * maxConfig) and uses the state paramenter to determine
Packit b099d7
	     * what the new configuration is.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    ConfigureNewState (pCD); 
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    else /* MAXIMIZED_STATE */
Packit b099d7
    {
Packit b099d7
	if (pCD->maxConfig == False)
Packit b099d7
	{
Packit b099d7
	    ConfigureNewState (pCD); 
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (currentState == MINIMIZED_STATE)
Packit b099d7
    {
Packit b099d7
	Boolean clearIconFocus;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * give up keyboard focus 
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if ((wmGD.keyboardFocus == pCD) ||
Packit b099d7
	    (wmGD.nextKeyboardFocus == pCD))
Packit b099d7
	{
Packit b099d7
	    Do_Focus_Key (NULL, setTime, ALWAYS_SET_FOCUS | WORKSPACE_IF_NULL);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (wmGD.keyboardFocus == pCD)
Packit b099d7
	{
Packit b099d7
	    clearIconFocus = True;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    clearIconFocus = False;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * The wm icon frame window and the client icon window
Packit b099d7
	 * (if it is being used) are mapped and the client window and
Packit b099d7
	 * client frame are unmapped.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (ICON_FRAME_WIN(pCD))
Packit b099d7
	{
Packit b099d7
	    if (pSD->useIconBox && P_ICON_BOX(pCD) && 
Packit b099d7
		!(pCD->clientFlags & ICON_BOX))
Packit b099d7
	    {
Packit b099d7
	        ShowClientIconState(pCD, newState);
Packit b099d7
	    }
Packit b099d7
	    else 
Packit b099d7
	    {
Packit b099d7
		Boolean doGrab = False;
Packit b099d7
    		if (event_mask)
Packit b099d7
		doGrab = (Success == XGrabPointer 
Packit b099d7
			(DISPLAY, DefaultRootWindow(DISPLAY),
Packit b099d7
			False, event_mask, GrabModeAsync, GrabModeAsync,
Packit b099d7
			None, None, CurrentTime));
Packit b099d7
	        XUnmapWindow (DISPLAY, ICON_FRAME_WIN(pCD));
Packit b099d7
	        if (pCD->iconWindow)
Packit b099d7
	        {
Packit b099d7
		    XUnmapWindow (DISPLAY, pCD->iconWindow);
Packit b099d7
	        }
Packit b099d7
    		if (event_mask && doGrab)
Packit b099d7
		{
Packit b099d7
			XEvent event;
Packit b099d7
			XMaskEvent(DISPLAY, event_mask, &event);
Packit b099d7
			XUngrabPointer(DISPLAY,CurrentTime);
Packit b099d7
		}
Packit b099d7
#ifdef WSM
Packit b099d7
	        if (wmGD.iconAutoPlace) 
Packit b099d7
	        {
Packit b099d7
                    for (wsI = 0; wsI < pCD->numInhabited; wsI++)
Packit b099d7
		    {
Packit b099d7
			iplace = pCD->pWsList[wsI].iconPlace;
Packit b099d7
			if (iplace != NO_ICON_PLACE)
Packit b099d7
			{
Packit b099d7
			    pWS_i = GetWorkspaceData (pCD->pSD,
Packit b099d7
						pCD->pWsList[wsI].wsID);
Packit b099d7
			    pWS_i->IPData.placeList[iplace].pCD = 
Packit b099d7
				    NULL;
Packit b099d7
			}
Packit b099d7
		    }
Packit b099d7
	        }
Packit b099d7
#else /* WSM */
Packit b099d7
	        if ((wmGD.iconAutoPlace) && (ICON_PLACE(pCD) != NO_ICON_PLACE))
Packit b099d7
	        {
Packit b099d7
		    pWS->IPData.placeList[ICON_PLACE(pCD)].pCD = 
Packit b099d7
			NULL;
Packit b099d7
	        }
Packit b099d7
#endif /* WSM */
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (clearIconFocus)
Packit b099d7
	    {
Packit b099d7
		ClearFocusIndication (pCD, False /*no refresh*/);
Packit b099d7
		wmGD.keyboardFocus = NULL;
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    if ((currentState != NORMAL_STATE) && (currentState != MAXIMIZED_STATE))
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Note that maximized state is considered a NormalState in
Packit b099d7
	 * the ICCC.  SetClientWMState also sets the state in the
Packit b099d7
	 * client data.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (currentState == MINIMIZED_STATE)
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * Raise the window(s) when they are deiconified.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    pCD->clientState = newState;
Packit b099d7
#ifdef WSM
Packit b099d7
		    wmGD.bSuspendSecondaryRestack = True;
Packit b099d7
#endif /* WSM */
Packit b099d7
	    F_Raise (NULL, pCD, NULL);
Packit b099d7
#ifdef WSM
Packit b099d7
		    wmGD.bSuspendSecondaryRestack = False;
Packit b099d7
#endif /* WSM */
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if ( (!(pCD->clientFlags & ICON_BOX)) || 
Packit b099d7
	     ((pCD->clientFlags & ICON_BOX) && (!(firstTime))) )
Packit b099d7
	{
Packit b099d7
#ifdef PANELIST
Packit b099d7
	  if ((currentState == WITHDRAWN_STATE) && 
Packit b099d7
	      (pCD->dtwmBehaviors & DtWM_BEHAVIOR_SUBPANEL) &&
Packit b099d7
	      !(pCD->transientChildren))
Packit b099d7
	  {
Packit b099d7
	      if (pCD->dtwmBehaviors & DtWM_BEHAVIOR_SUB_RESTORED)
Packit b099d7
	      {
Packit b099d7
		  pCD->dtwmBehaviors &= ~DtWM_BEHAVIOR_SUB_RESTORED;
Packit b099d7
		  pCD->dtwmBehaviors &= ~DtWM_BEHAVIOR_SUBPANEL;
Packit b099d7
		  XMapWindow (DISPLAY, pCD->client);
Packit b099d7
		  XMapWindow (DISPLAY, pCD->clientFrameWin);
Packit b099d7
	      }
Packit b099d7
	      else
Packit b099d7
	      {
Packit b099d7
		  SlideWindowOut (pCD);
Packit b099d7
	      }
Packit b099d7
	  }
Packit b099d7
	  else
Packit b099d7
#endif /* PANELIST */
Packit b099d7
	    MapClientWindows (pCD);
Packit b099d7
	}
Packit b099d7
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Set the WM_STATE property of the window and any associated
Packit b099d7
	 * transients, along with the clientState value.  The call
Packit b099d7
	 * is made with an indication of NORMAL_STATE to insure
Packit b099d7
	 * that transient window clientState values are setup
Packit b099d7
	 * correctly.  The top-level window clientState is set later.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	SetClientWMState (pCD, NormalState, NORMAL_STATE);
Packit b099d7
    }
Packit b099d7
    pCD->clientState = newState;
Packit b099d7
Packit b099d7
    if ((wmGD.keyboardFocusPolicy == KEYBOARD_FOCUS_EXPLICIT) &&
Packit b099d7
	(currentState == MINIMIZED_STATE) && wmGD.deiconifyKeyFocus)
Packit b099d7
    {
Packit b099d7
	ClientData *pcdFocus;
Packit b099d7
Packit b099d7
	pcdFocus = FindTransientFocus (pCD);
Packit b099d7
	if (pcdFocus)
Packit b099d7
	{
Packit b099d7
	    Do_Focus_Key (pcdFocus, setTime, ALWAYS_SET_FOCUS);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ( pSD->useIconBox &&  P_ICON_BOX(pCD) &&
Packit b099d7
	 (!(pCD->clientFlags & ICON_BOX)) && (ICON_FRAME_WIN(pCD)))
Packit b099d7
    {
Packit b099d7
	/* 
Packit b099d7
	 * force icon appearance in icon box to change 
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	IconExposureProc (pCD, True);
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetupWindowStateWithEventMask */
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ConfigureNewState (pcd)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Configure the window to a new state
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pcd		- pointer to client data
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 *  o This is only good for going between NORMAL and MAXIMIZED state.
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void ConfigureNewState (ClientData *pcd)
Packit b099d7
{
Packit b099d7
    if (pcd->maxConfig)
Packit b099d7
    {
Packit b099d7
	pcd->maxConfig = FALSE;
Packit b099d7
	RegenerateClientFrame(pcd);
Packit b099d7
	XResizeWindow (DISPLAY, pcd->client,
Packit b099d7
			   (unsigned int) pcd->clientWidth, 
Packit b099d7
			   (unsigned int) pcd->clientHeight);
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XResizeWindow (DISPLAY, pcd->client,
Packit b099d7
			   (unsigned int) pcd->maxWidth, 
Packit b099d7
			   (unsigned int) pcd->maxHeight);
Packit b099d7
	pcd->maxConfig = TRUE;
Packit b099d7
	RegenerateClientFrame(pcd);
Packit b099d7
    }
Packit b099d7
    SendConfigureNotify (pcd);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Force repaint if size doesn't change to update frame appearance.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((pcd->clientWidth == pcd->maxWidth) &&
Packit b099d7
        (pcd->clientHeight == pcd->maxHeight))
Packit b099d7
    {
Packit b099d7
	FrameExposureProc (pcd);
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION ConfigureNewState */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  UnmapClients (pCD, event_mask)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Unmap the window(s).  The indicated client may be the head of a transient
Packit b099d7
 *  tree - if it is unmap all windows in the transient tree.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD = pointer to client data of window(s) to be unmapped
Packit b099d7
 *  event_mask = what to grab to prevent stray events going somewhere. Our
Packit b099d7
 *	passive grab has just been activated -- but it is dropped when the
Packit b099d7
 * 	window is unmapped and the ButtonRelease event can go to the window
Packit b099d7
 *	now exposed. Avoid this by grabbing the ButtonRelease before the unmap
Packit b099d7
 *	and swallowing it.
Packit b099d7
 *	Also done for icon being unmapped.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static void UnmapClients (ClientData *pCD, unsigned int event_mask)
Packit b099d7
{
Packit b099d7
    ClientData *pNext;
Packit b099d7
    Boolean doGrab = False;
Packit b099d7
Packit b099d7
    pNext = pCD->transientChildren;
Packit b099d7
    while (pNext)
Packit b099d7
    {
Packit b099d7
	/* unmap all children first */
Packit b099d7
	if (pNext->transientChildren)
Packit b099d7
	    UnmapClients (pNext, (unsigned int) 0);
Packit b099d7
Packit b099d7
	/* then unmap all siblings at this level */
Packit b099d7
	XUnmapWindow (DISPLAY, pNext->clientFrameWin);
Packit b099d7
	XUnmapWindow (DISPLAY, pNext->client);
Packit b099d7
	pNext->wmUnmapCount++;
Packit b099d7
	pNext = pNext->transientSiblings;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (event_mask)
Packit b099d7
	doGrab = (Success == XGrabPointer (DISPLAY, DefaultRootWindow(DISPLAY),
Packit b099d7
		False, event_mask, GrabModeAsync, GrabModeAsync,
Packit b099d7
		None, None, CurrentTime));
Packit b099d7
    /* unmap this primary window */
Packit b099d7
    XUnmapWindow (DISPLAY, pCD->clientFrameWin); 
Packit b099d7
    XUnmapWindow (DISPLAY, pCD->client);
Packit b099d7
    if (event_mask && doGrab)
Packit b099d7
	{
Packit b099d7
	XEvent event;
Packit b099d7
	XMaskEvent(DISPLAY, event_mask, &event);
Packit b099d7
	XUngrabPointer(DISPLAY,CurrentTime);
Packit b099d7
	}
Packit b099d7
    pCD->wmUnmapCount++;
Packit b099d7
Packit b099d7
} /* END OF FUNCTION UnmapClients */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SetClientWMState (pCD, wmState, mwmState)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Set a new window manage state for a client window or a tree of transient
Packit b099d7
 *  client windows.
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD	= pointer to  client data
Packit b099d7
 *
Packit b099d7
 *  wmState = new state for WM_STATE property
Packit b099d7
 *
Packit b099d7
 *  mwmState = mwm client state
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void SetClientWMState (ClientData *pCD, int wmState, int mwmState)
Packit b099d7
{
Packit b099d7
    ClientData *pNext;
Packit b099d7
#ifdef WSM
Packit b099d7
    Boolean bToUnseen;
Packit b099d7
Packit b099d7
    bToUnseen = (mwmState & UNSEEN_STATE) != 0;
Packit b099d7
    mwmState &= ~UNSEEN_STATE;
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
    SetClientWsIndex (pCD);
Packit b099d7
#endif /* WSM */
Packit b099d7
    pNext = pCD->transientChildren;
Packit b099d7
    while (pNext)
Packit b099d7
    {
Packit b099d7
	if (pNext->transientChildren)
Packit b099d7
	{
Packit b099d7
	    SetClientWMState (pNext, wmState, mwmState);
Packit b099d7
	}
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
        SetClientWsIndex (pNext);
Packit b099d7
#endif /* WSM */
Packit b099d7
	SetWMState (pNext->client, wmState, ICON_FRAME_WIN(pNext));
Packit b099d7
	if (pNext->maxConfig && mwmState == NORMAL_STATE)
Packit b099d7
	{
Packit b099d7
	    pNext->clientState = MAXIMIZED_STATE;
Packit b099d7
	}
Packit b099d7
#ifdef WSM
Packit b099d7
	else if (!pNext->maxConfig && mwmState == MAXIMIZED_STATE)
Packit b099d7
	{
Packit b099d7
	    pNext->clientState = NORMAL_STATE;
Packit b099d7
	}
Packit b099d7
#endif /* WSM */
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    pNext->clientState = mwmState;
Packit b099d7
	}
Packit b099d7
#ifdef WSM
Packit b099d7
	if (bToUnseen)
Packit b099d7
	    pNext->clientState |= UNSEEN_STATE;
Packit b099d7
#endif /* WSM */
Packit b099d7
	pNext = pNext->transientSiblings;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    SetWMState (pCD->client, wmState, ICON_FRAME_WIN(pCD));
Packit b099d7
    pCD->clientState = mwmState;
Packit b099d7
#ifdef WSM
Packit b099d7
    if (bToUnseen)
Packit b099d7
	pCD->clientState |= UNSEEN_STATE;
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SetClientWMState */
Packit b099d7
Packit b099d7
#ifdef PANELIST
Packit b099d7

Packit b099d7
#define SLIDE_UP_PERCENTAGE	5
Packit b099d7
#define SLIDE_UP_DIVISOR	(100/SLIDE_UP_PERCENTAGE)
Packit b099d7
#define SLIDE_UP_INTERVAL	15
Packit b099d7
Packit b099d7
/******************************<->*************************************
Packit b099d7
 *
Packit b099d7
 * void SlideOutTimerProc (client_data, id)
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  An XtTimerCallbackProc to process slide up mapping of a panel
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  client_data = pointer to a SlideOutRec
Packit b099d7
 * 
Packit b099d7
 *  Outputs:
Packit b099d7
 *  -------
Packit b099d7
 *  
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  --------
Packit b099d7
 ******************************<->***********************************/
Packit b099d7
void
Packit b099d7
SlideOutTimerProc ( XtPointer client_data, XtIntervalId *id)
Packit b099d7
{
Packit b099d7
    SlideOutRec *pSOR = (SlideOutRec *) client_data;
Packit b099d7
    Boolean bDone = False;
Packit b099d7
Packit b099d7
    if (pSOR)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * compute next increment;
Packit b099d7
	 */
Packit b099d7
	switch (pSOR->direction)
Packit b099d7
	{
Packit b099d7
	    case SLIDE_NORTH:
Packit b099d7
		if (pSOR->mapping)
Packit b099d7
		{
Packit b099d7
		    pSOR->currY -= pSOR->incHeight;
Packit b099d7
		    pSOR->currHeight += pSOR->incHeight;
Packit b099d7
		    if ((pSOR->currY < pSOR->pCD->frameInfo.y) ||
Packit b099d7
			(pSOR->currHeight > pSOR->pCD->frameInfo.height))
Packit b099d7
		    {
Packit b099d7
			pSOR->currY = pSOR->pCD->frameInfo.y;
Packit b099d7
			pSOR->currHeight = pSOR->pCD->frameInfo.height;
Packit b099d7
		    }
Packit b099d7
		    bDone = (pSOR->currY == pSOR->pCD->frameInfo.y);
Packit b099d7
		}
Packit b099d7
		else 
Packit b099d7
		{
Packit b099d7
		    pSOR->currY += pSOR->incHeight;
Packit b099d7
		    if (pSOR->incHeight >= pSOR->currHeight)
Packit b099d7
		    {
Packit b099d7
			pSOR->currHeight = 0;
Packit b099d7
			bDone = True;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			pSOR->currHeight -= pSOR->incHeight;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	    case SLIDE_SOUTH:
Packit b099d7
		if (pSOR->mapping)
Packit b099d7
		{
Packit b099d7
		    pSOR->currHeight += pSOR->incHeight;
Packit b099d7
		    if (pSOR->currHeight > pSOR->pCD->frameInfo.height)
Packit b099d7
		    {
Packit b099d7
			pSOR->currHeight = pSOR->pCD->frameInfo.height;
Packit b099d7
		    }
Packit b099d7
		    bDone = 
Packit b099d7
		      (pSOR->currHeight == pSOR->pCD->frameInfo.height);
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    if (pSOR->incHeight >= pSOR->currHeight)
Packit b099d7
		    {
Packit b099d7
			pSOR->currHeight = 0;
Packit b099d7
			bDone = True;
Packit b099d7
		    }
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			pSOR->currHeight -= pSOR->incHeight;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
		break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * do next slide-up
Packit b099d7
	 */
Packit b099d7
	if (pSOR->currHeight > 0)
Packit b099d7
	{
Packit b099d7
	    XMoveResizeWindow (DISPLAY, pSOR->coverWin, 
Packit b099d7
		pSOR->currX, pSOR->currY,
Packit b099d7
		pSOR->currWidth, pSOR->currHeight);
Packit b099d7
Packit b099d7
	    XMoveResizeWindow (DISPLAY, pSOR->pCD->clientFrameWin, 
Packit b099d7
	        pSOR->currX, pSOR->currY, 
Packit b099d7
		pSOR->currWidth, pSOR->currHeight);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * See if we need to continue
Packit b099d7
	 */
Packit b099d7
	if (bDone)
Packit b099d7
	{
Packit b099d7
	    if (!pSOR->mapping)
Packit b099d7
	    {
Packit b099d7
		/* Time to really unmanage the slide-up */
Packit b099d7
		XtUnmanageChild (pSOR->wSubpanel);
Packit b099d7
	    }
Packit b099d7
            else
Packit b099d7
            {
Packit b099d7
                WmSubpanelPosted (DISPLAY1, pSOR->pCD->client);
Packit b099d7
                SendConfigureNotify(pSOR->pCD);
Packit b099d7
            }
Packit b099d7
Packit b099d7
	    /* done! clean up */
Packit b099d7
	    XDestroyWindow (DISPLAY, pSOR->coverWin);
Packit b099d7
	    pSOR->pCD->pSOR = NULL;
Packit b099d7
	    XtFree ((char *)pSOR);
Packit b099d7
	    wmGD.iSlideUpsInProgress -= 1;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /* re-arm the timer */
Packit b099d7
	    XtAppAddTimeOut(wmGD.mwmAppContext, pSOR->interval,
Packit b099d7
			    SlideOutTimerProc, (XtPointer)pSOR);
Packit b099d7
	    XSync (DISPLAY, False);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SlideOutTimerProc */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SlideWindowOut (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Maps a window with a slide-out effect.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD	= pointer to  client data
Packit b099d7
 *
Packit b099d7
 *  Comment:
Packit b099d7
 *  -------
Packit b099d7
 *  Only supports slide-up or slide-down 
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
static void
Packit b099d7
SlideWindowOut (ClientData *pCD)
Packit b099d7
{
Packit b099d7
    SlideOutRec *pSOR;
Packit b099d7
Packit b099d7
    if (pCD->pSOR)
Packit b099d7
    {
Packit b099d7
	pSOR = pCD->pSOR;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 *  Hmmm. We're already sliding this window.
Packit b099d7
	 *  If we're supposed to go in the other direction,
Packit b099d7
	 *  then turn it around.
Packit b099d7
	 */
Packit b099d7
	if (pSOR->mapping == True)
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * We're already mapping this guy, ignore this
Packit b099d7
	     * and finish what we've already got going.
Packit b099d7
	     */
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * We're not mapping this guy. Reverse course!!
Packit b099d7
	     */
Packit b099d7
	    pSOR->mapping = True;
Packit b099d7
Packit b099d7
	    /* insure the client window is mapped */
Packit b099d7
	    XMapWindow (DISPLAY, pCD->client);
Packit b099d7
Packit b099d7
	    /* handle the rest on the next timeout */
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* map the primary window */
Packit b099d7
    XMapWindow (DISPLAY, pCD->client);
Packit b099d7
    pSOR = (SlideOutRec *) XtMalloc (sizeof(SlideOutRec));
Packit b099d7
    if (pSOR)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Compute this ahead of time so we can check against
Packit b099d7
	 * the window size. If the window is short, we'll
Packit b099d7
	 * just map it, avoiding a lot of processing.
Packit b099d7
	 */
Packit b099d7
	pSOR->incHeight = (Dimension) (DisplayHeight(DISPLAY, 
Packit b099d7
			SCREEN_FOR_CLIENT(pCD))/SLIDE_UP_DIVISOR);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((pCD->slideDirection != SLIDE_NOT) && pSOR &&
Packit b099d7
	(pSOR->incHeight < pCD->frameInfo.height))
Packit b099d7
    {
Packit b099d7
	XSetWindowAttributes window_attribs;
Packit b099d7
	XWindowChanges window_changes;
Packit b099d7
	unsigned long mask;
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * Set up data for processing slide up
Packit b099d7
	 */
Packit b099d7
	pSOR->pCD = pCD;
Packit b099d7
	pSOR->interval = SLIDE_UP_INTERVAL;
Packit b099d7
	pSOR->direction = pCD->slideDirection;
Packit b099d7
	pSOR->mapping = True;
Packit b099d7
	pSOR->wSubpanel = NULL;
Packit b099d7
	pSOR->pCD->pSOR = pSOR;
Packit b099d7
	
Packit b099d7
	switch (pSOR->direction)
Packit b099d7
	{
Packit b099d7
	    case SLIDE_NORTH:
Packit b099d7
		pSOR->incWidth = 0;
Packit b099d7
		pSOR->currWidth = pCD->frameInfo.width;
Packit b099d7
		pSOR->currHeight = pSOR->incHeight;
Packit b099d7
		pSOR->currX = pCD->frameInfo.x;
Packit b099d7
		pSOR->currY = pCD->frameInfo.y + 
Packit b099d7
		    (pCD->frameInfo.height - pSOR->currHeight);
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	    case SLIDE_SOUTH:
Packit b099d7
		pSOR->incWidth = 0;
Packit b099d7
		pSOR->currWidth = pCD->frameInfo.width;
Packit b099d7
		pSOR->currHeight = pSOR->incHeight;
Packit b099d7
		pSOR->currX = pCD->frameInfo.x;
Packit b099d7
		pSOR->currY = pCD->frameInfo.y;
Packit b099d7
		break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Create screening window to hide the slide-up from button
Packit b099d7
	 * events until it is all the way up.
Packit b099d7
	 */
Packit b099d7
	mask = CWOverrideRedirect;
Packit b099d7
	window_attribs.override_redirect = True;
Packit b099d7
	pSOR->coverWin = XCreateWindow(DISPLAY,
Packit b099d7
			    RootWindow (DISPLAY, SCREEN_FOR_CLIENT(pCD)),
Packit b099d7
			    pSOR->currX, pSOR->currY, 
Packit b099d7
			    pSOR->currWidth, pSOR->currHeight, 0,
Packit b099d7
			    CopyFromParent,InputOnly,CopyFromParent,
Packit b099d7
			    mask, &window_attribs);
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * Put screen window above the slide-up client
Packit b099d7
	 */
Packit b099d7
        mask = CWStackMode | CWSibling;
Packit b099d7
        window_changes.stack_mode = Above;
Packit b099d7
        window_changes.sibling = pCD->clientFrameWin;
Packit b099d7
        XConfigureWindow (DISPLAY, pSOR->coverWin, mask, &window_changes);
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Start slide-up processing
Packit b099d7
	 */ 
Packit b099d7
	XMoveResizeWindow (DISPLAY, pSOR->coverWin, pSOR->currX, pSOR->currY,
Packit b099d7
	    pSOR->currWidth, pSOR->currHeight);
Packit b099d7
	XMoveResizeWindow (DISPLAY, pCD->clientFrameWin, 
Packit b099d7
	    pSOR->currX, pSOR->currY, pSOR->currWidth, pSOR->currHeight);
Packit b099d7
	XMapWindow (DISPLAY, pSOR->coverWin);
Packit b099d7
	XMapWindow (DISPLAY, pCD->clientFrameWin);
Packit b099d7
	XSync (DISPLAY, False);
Packit b099d7
Packit b099d7
	XtAppAddTimeOut(wmGD.mwmAppContext, pSOR->interval,
Packit b099d7
			SlideOutTimerProc, (XtPointer)pSOR);
Packit b099d7
	
Packit b099d7
	wmGD.iSlideUpsInProgress += 1;
Packit b099d7
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Not sliding because no direction specified or our window
Packit b099d7
	 * is just a little guy.
Packit b099d7
	 */
Packit b099d7
	XMapWindow (DISPLAY, pCD->clientFrameWin);
Packit b099d7
	if (pSOR) 
Packit b099d7
	{
Packit b099d7
	    XtFree ((char *) pSOR);
Packit b099d7
	    pCD->pSOR = NULL;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SlideOutWindow */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  SlideSubpanelBackIn (pCD, wSubpanel)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Slides a subpanel back in
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD	= pointer to  client data
Packit b099d7
 *  wSubpanel = subpanel widget to unmanage
Packit b099d7
 *
Packit b099d7
 *  Comment:
Packit b099d7
 *  -------
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void
Packit b099d7
SlideSubpanelBackIn (ClientData *pCD, Widget wSubpanel)
Packit b099d7
{
Packit b099d7
    SlideOutRec *pSOR;
Packit b099d7
Packit b099d7
    if (pCD->pSOR)
Packit b099d7
    {
Packit b099d7
	pSOR = pCD->pSOR;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 *  Hmmm. We're already sliding this window.
Packit b099d7
	 *  If we're supposed to go in the other direction,
Packit b099d7
	 *  then turn it around.
Packit b099d7
	 */
Packit b099d7
	if (pSOR->mapping == False)
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * We're already unmapping this guy, ignore this
Packit b099d7
	     * and finish what we've already got going.
Packit b099d7
	     */
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    /*
Packit b099d7
	     * We're mapping this guy. Reverse course!!
Packit b099d7
	     */
Packit b099d7
	    pSOR->mapping = False;
Packit b099d7
	    pSOR->wSubpanel = wSubpanel;
Packit b099d7
Packit b099d7
	    /* handle the rest on the next timeout */
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    pSOR = (SlideOutRec *) XtMalloc (sizeof(SlideOutRec));
Packit b099d7
    if (pSOR)
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Compute this ahead of time to check if our window
Packit b099d7
	 * is short. If it is, we'll just unmap it, avoiding
Packit b099d7
	 * a lot of extra work.
Packit b099d7
	 */
Packit b099d7
	pSOR->incHeight = (Dimension) (DisplayHeight(DISPLAY, 
Packit b099d7
		SCREEN_FOR_CLIENT(pCD))/SLIDE_UP_DIVISOR);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((pCD->slideDirection != SLIDE_NOT) && pSOR &&
Packit b099d7
	(pSOR->incHeight < pCD->frameInfo.height))
Packit b099d7
    {
Packit b099d7
	XSetWindowAttributes window_attribs;
Packit b099d7
	XWindowChanges window_changes;
Packit b099d7
	unsigned long mask;
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * Set up data for processing slide up
Packit b099d7
	 */
Packit b099d7
	pSOR->pCD = pCD;
Packit b099d7
	pSOR->interval = SLIDE_UP_INTERVAL;
Packit b099d7
	pSOR->direction = pCD->slideDirection;
Packit b099d7
	pSOR->mapping = False;
Packit b099d7
	pSOR->wSubpanel = wSubpanel;
Packit b099d7
	pSOR->pCD->pSOR = pSOR;
Packit b099d7
	
Packit b099d7
	pSOR->incWidth = 0;
Packit b099d7
	pSOR->currWidth = pCD->frameInfo.width;
Packit b099d7
	pSOR->currHeight = pCD->frameInfo.height;
Packit b099d7
	pSOR->currX = pCD->frameInfo.x;
Packit b099d7
	pSOR->currY = pCD->frameInfo.y;
Packit b099d7
Packit b099d7
	switch (pSOR->direction)
Packit b099d7
	{
Packit b099d7
	    case SLIDE_NORTH:
Packit b099d7
		pSOR->currHeight -= pSOR->incHeight;
Packit b099d7
		pSOR->currY += pSOR->incHeight;
Packit b099d7
		break;
Packit b099d7
Packit b099d7
	    case SLIDE_SOUTH:
Packit b099d7
		pSOR->currHeight -= pSOR->incHeight;
Packit b099d7
		break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Create screening window to hide the slide-up from button
Packit b099d7
	 * events until it is all the way up.
Packit b099d7
	 */
Packit b099d7
	mask = CWOverrideRedirect;
Packit b099d7
	window_attribs.override_redirect = True;
Packit b099d7
	pSOR->coverWin = XCreateWindow(DISPLAY,
Packit b099d7
			    RootWindow (DISPLAY, SCREEN_FOR_CLIENT(pCD)),
Packit b099d7
			    pSOR->currX, pSOR->currY, 
Packit b099d7
			    pSOR->currWidth, pSOR->currHeight, 0,
Packit b099d7
			    CopyFromParent,InputOnly,CopyFromParent,
Packit b099d7
			    mask, &window_attribs);
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * Put screen window above the slide-up client
Packit b099d7
	 */
Packit b099d7
	mask = CWStackMode | CWSibling;
Packit b099d7
	window_changes.stack_mode = Above;
Packit b099d7
	window_changes.sibling = pCD->clientFrameWin;
Packit b099d7
	XConfigureWindow (DISPLAY, pSOR->coverWin, mask, &window_changes);
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Start slide-up processing
Packit b099d7
	 */ 
Packit b099d7
	XMapWindow (DISPLAY, pSOR->coverWin);
Packit b099d7
Packit b099d7
	if (pSOR->currHeight > 0)
Packit b099d7
	{
Packit b099d7
	    XMoveResizeWindow (DISPLAY, pCD->clientFrameWin, 
Packit b099d7
		pSOR->currX, pSOR->currY, 
Packit b099d7
		pSOR->currWidth, pSOR->currHeight);
Packit b099d7
Packit b099d7
	    XMoveResizeWindow (DISPLAY, pSOR->coverWin, 
Packit b099d7
		pSOR->currX, pSOR->currY, 
Packit b099d7
		pSOR->currWidth, pSOR->currHeight);
Packit b099d7
Packit b099d7
	    XSync (DISPLAY, False);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	XtAppAddTimeOut(wmGD.mwmAppContext, pSOR->interval,
Packit b099d7
			SlideOutTimerProc, (XtPointer)pSOR);
Packit b099d7
Packit b099d7
	wmGD.iSlideUpsInProgress += 1;
Packit b099d7
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	/*
Packit b099d7
	 * Not sliding because no direction specified or our window
Packit b099d7
	 * is just a little guy.
Packit b099d7
	 */
Packit b099d7
	/* Just unmanage the slide-up */
Packit b099d7
	XtUnmanageChild (wSubpanel);
Packit b099d7
	if (pSOR) 
Packit b099d7
	{
Packit b099d7
	    XtFree ((char *) pSOR);
Packit b099d7
	    pCD->pSOR = NULL;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION SlideOutWindow */
Packit b099d7
#endif /* PANELIST */
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  MapClientWindows (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  Maps the window.  If this is a transient tree then all the windows in
Packit b099d7
 *  the transient tree are mapped.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD	= pointer to  client data
Packit b099d7
 * 
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void MapClientWindows (ClientData *pCD)
Packit b099d7
{
Packit b099d7
    ClientData *pNext;
Packit b099d7
Packit b099d7
Packit b099d7
    pNext = pCD->transientChildren;
Packit b099d7
    while (pNext)
Packit b099d7
    {
Packit b099d7
	/* map all transient children first */
Packit b099d7
	if (pNext->transientChildren)
Packit b099d7
	{
Packit b099d7
	    MapClientWindows (pNext);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/* then map all siblings at this level */
Packit b099d7
	XMapWindow (DISPLAY, pNext->client);
Packit b099d7
	XMapWindow (DISPLAY, pNext->clientFrameWin);
Packit b099d7
Packit b099d7
	pNext = pNext->transientSiblings;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* map the primary window */
Packit b099d7
    XMapWindow (DISPLAY, pCD->client);
Packit b099d7
    XMapWindow (DISPLAY, pCD->clientFrameWin);
Packit b099d7
Packit b099d7
} /* END OF FUNCTION MapClientWindows */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ShowIconForMinimizedClient (pWS, pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function shows the icon for the specified client.  If the icon
Packit b099d7
 *  is in an icon box then the "minimized" icon is displayed.  If the icon
Packit b099d7
 *  is on the root window it is mapped.
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pWS = pointer to workspace data
Packit b099d7
 *  pCD	= pointer to  client data
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void ShowIconForMinimizedClient (WmWorkspaceData *pWS, ClientData *pCD)
Packit b099d7
{
Packit b099d7
    WmScreenData *pSD = PSD_FOR_CLIENT(pCD);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Handle auto-placement for root icons (icons not in an icon
Packit b099d7
     * box).
Packit b099d7
     */
Packit b099d7
    if (wmGD.iconAutoPlace && !P_ICON_BOX(pCD))
Packit b099d7
    {
Packit b099d7
        if ((ICON_PLACE(pCD) == NO_ICON_PLACE) ||
Packit b099d7
	    ((pWS->IPData.placeList[ICON_PLACE(pCD)].pCD) &&
Packit b099d7
	     (pWS->IPData.placeList[ICON_PLACE(pCD)].pCD != pCD)))
Packit b099d7
        {
Packit b099d7
            /*
Packit b099d7
             * Icon place not defined or occupied by another client,
Packit b099d7
	     * find a free place to put the icon.
Packit b099d7
             */
Packit b099d7
Packit b099d7
	    if ((ICON_PLACE(pCD) = GetNextIconPlace (&pWS->IPData)) 
Packit b099d7
		== NO_ICON_PLACE)
Packit b099d7
	    {
Packit b099d7
	        ICON_PLACE(pCD) = 
Packit b099d7
		    CvtIconPositionToPlace (&pWS->IPData,
Packit b099d7
							 pCD->clientX,
Packit b099d7
			               	                 pCD->clientY);
Packit b099d7
	    }
Packit b099d7
	    CvtIconPlaceToPosition (&pWS->IPData, ICON_PLACE(pCD), 
Packit b099d7
				    &ICON_X(pCD), &ICON_Y(pCD));
Packit b099d7
Packit b099d7
#ifndef WSM
Packit b099d7
	    XMoveWindow (DISPLAY, ICON_FRAME_WIN(pCD), 
Packit b099d7
		ICON_X(pCD), ICON_Y(pCD));
Packit b099d7
#endif /* WSM */
Packit b099d7
Packit b099d7
        }
Packit b099d7
Packit b099d7
        pWS->IPData.placeList[ICON_PLACE(pCD)].pCD = pCD;
Packit b099d7
    }
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
    /*
Packit b099d7
     * If icon on root window and this workspace is active, the
Packit b099d7
     * make sure it's in the right place.
Packit b099d7
     */
Packit b099d7
    if ((pWS == pSD->pActiveWS) && !P_ICON_BOX(pCD))
Packit b099d7
    {
Packit b099d7
	XMoveWindow (DISPLAY, ICON_FRAME_WIN(pCD), 
Packit b099d7
	    ICON_X(pCD), ICON_Y(pCD));
Packit b099d7
    }
Packit b099d7
#endif /* WSM */
Packit b099d7
    if (pCD->iconWindow)
Packit b099d7
    {
Packit b099d7
        XMapWindow (DISPLAY, pCD->iconWindow);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((pSD->useIconBox) && P_ICON_BOX(pCD))
Packit b099d7
    {
Packit b099d7
        ShowClientIconState (pCD, MINIMIZED_STATE );
Packit b099d7
    }
Packit b099d7
    else
Packit b099d7
    {
Packit b099d7
	XWindowChanges windowChanges;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Map the icon on the screen at the appropriate place in the 
Packit b099d7
	 * window stack.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	if (wmGD.lowerOnIconify)
Packit b099d7
	{
Packit b099d7
	    if ((&pCD->iconEntry != pSD->lastClient) &&
Packit b099d7
		(pSD->lastClient))
Packit b099d7
	    {
Packit b099d7
		if (pSD->lastClient->type == MINIMIZED_STATE)
Packit b099d7
		{
Packit b099d7
		    windowChanges.sibling = 
Packit b099d7
			ICON_FRAME_WIN(pSD->lastClient->pCD);
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    windowChanges.sibling =
Packit b099d7
			pSD->lastClient->pCD->clientFrameWin;
Packit b099d7
		}
Packit b099d7
		windowChanges.stack_mode = Below;
Packit b099d7
		XConfigureWindow (DISPLAY, ICON_FRAME_WIN(pCD),
Packit b099d7
		    		  (CWSibling | CWStackMode), &windowChanges);
Packit b099d7
		MoveEntryInList (pWS, &pCD->iconEntry, 
Packit b099d7
		    False /*on bottom*/, NULL);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	else
Packit b099d7
	{
Packit b099d7
	    windowChanges.sibling = pCD->clientFrameWin;
Packit b099d7
	    windowChanges.stack_mode = Below;
Packit b099d7
	    XConfigureWindow (DISPLAY, ICON_FRAME_WIN(pCD),
Packit b099d7
	    		      (CWSibling | CWStackMode), &windowChanges);
Packit b099d7
	    MoveEntryInList (pWS, &pCD->iconEntry, False /*below*/,
Packit b099d7
			     &pCD->clientEntry);
Packit b099d7
	}
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7
        if (pWS == pSD->pActiveWS)
Packit b099d7
	{
Packit b099d7
	    XMapWindow (DISPLAY, ICON_FRAME_WIN(pCD));
Packit b099d7
	}
Packit b099d7
#else /* WSM */
Packit b099d7
	XMapWindow (DISPLAY, ICON_FRAME_WIN(pCD));
Packit b099d7
#endif /* WSM */
Packit b099d7
    }
Packit b099d7
Packit b099d7
} /* END OF FUNCTION ShowIconForMinimizedClient */
Packit b099d7
Packit b099d7
#ifdef WSM
Packit b099d7

Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ShowAllIconsForMinimizedClient (pCD)
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  Description:
Packit b099d7
 *  -----------
Packit b099d7
 *  This function places icons in all the workspaces for the minimized
Packit b099d7
 *  client. Since there is only one clientState per client (not per
Packit b099d7
 *  workspace), this loops over all workspace in which the client
Packit b099d7
 *  resides and places an icon in each.
Packit b099d7
 * 
Packit b099d7
 *
Packit b099d7
 *  Inputs:
Packit b099d7
 *  ------
Packit b099d7
 *  pCD	= pointer to  client data
Packit b099d7
 *
Packit b099d7
 *  Comments:
Packit b099d7
 *  ---------
Packit b099d7
 *  This operates by setting up the currentWsc index for each workspace
Packit b099d7
 *  and calling ShowIconForMinimizedClient, which makes heavy use of
Packit b099d7
 *  the macros that use the currentWsc index.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
void ShowAllIconsForMinimizedClient (ClientData *pCD)
Packit b099d7
{
Packit b099d7
    int saveWsc = pCD->currentWsc;
Packit b099d7
    int tmpWsc;
Packit b099d7
    WmWorkspaceData *pWS;
Packit b099d7
Packit b099d7
    for (tmpWsc = 0; tmpWsc < pCD->numInhabited; tmpWsc++)
Packit b099d7
    {
Packit b099d7
	pCD->currentWsc = tmpWsc;
Packit b099d7
	pWS = GetWorkspaceData (PSD_FOR_CLIENT(pCD),
Packit b099d7
				    pCD->pWsList[tmpWsc].wsID);
Packit b099d7
	ShowIconForMinimizedClient(pWS, pCD);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    pCD->currentWsc = saveWsc;
Packit b099d7
Packit b099d7
} /* END OF FUNCTION ShowAllIconsForMinimizedClient */
Packit b099d7
#endif /* WSM */
Packit b099d7