|
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 |
|