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