magic/windows/windSearch.c

204 lines
5.6 KiB
C

/* windSearch.c -
*
* Functions to find & enumerate windows.
*
* *********************************************************************
* * Copyright (C) 1985, 1990 Regents of the University of California. *
* * Permission to use, copy, modify, and distribute this *
* * software and its documentation for any purpose and without *
* * fee is hereby granted, provided that the above copyright *
* * notice appear in all copies. The University of California *
* * makes no representations about the suitability of this *
* * software for any purpose. It is provided "as is" without *
* * express or implied warranty. Export of this software outside *
* * of the United States of America may require an export license. *
* *********************************************************************
*/
#ifndef lint
static char rcsid[] __attribute__ ((unused)) = "$Header$";
#endif /* not lint */
#include <stdio.h>
#include "utils/magic.h"
#include "utils/geometry.h"
#include "windows/windows.h"
#include "graphics/glyphs.h"
#include "windows/windInt.h"
/*
* ----------------------------------------------------------------------------
* windSearchPoint --
*
* Find the window that is displayed at a given screen point.
*
* Results:
* A pointer to the window that contains the point, or NULL if no
* window fits the bill. This routine is dangerous, since in some
* window packages more that one window may contain that point. In
* particular, under Sun Windows ALL windows contain the point (0, 0).
*
* If 'inside' is non-NULL, it points to a boolean variable which will be
* set to TRUE if the point is in the interior of the window, and FALSE
* if it is in the border of the window.
*
* Side effects:
* None.
* ----------------------------------------------------------------------------
*/
MagWindow *
windSearchPoint(p, inside)
Point *p; /* A point in screen coordinates */
bool *inside; /* A pointer to a boolean variable that is set to
* TRUE if the point is in the interior of the window,
* and FALSE if it is in the border. If this pointer
* is NULL then 'inside' is not filled in.
*/
{
MagWindow *w;
for(w = windTopWindow; w != (MagWindow *) NULL; w = w->w_nextWindow)
{
if (GEO_ENCLOSE(p, &(w->w_allArea) ))
{
if (inside != (bool *) NULL)
*inside = GEO_ENCLOSE(p, &(w->w_screenArea) );
return w;
}
}
return (MagWindow *) NULL;
}
/*
* ----------------------------------------------------------------------------
*
* WindSearchWid --
*
* Find a window given its window ID.
*
* Results:
* A pointer to the window, of NULL if not found..
*
* Side Effects:
* None.
*
* ----------------------------------------------------------------------------
*/
MagWindow *
WindSearchWid(wid)
int wid;
{
MagWindow *w;
for(w = windTopWindow; w != (MagWindow *) NULL; w = w->w_nextWindow) {
if (w->w_wid == wid) return w;
}
return NULL;
}
/*
* ----------------------------------------------------------------------------
*
* WindSearchData --
*
* Find a window with a matching w_grdata record.
*
* Results:
* A pointer to the window, of NULL if not found..
*
* Side Effects:
* None.
*
* ----------------------------------------------------------------------------
*/
MagWindow *
WindSearchData(grdata)
ClientData grdata;
{
MagWindow *w;
for(w = windTopWindow; w != (MagWindow *) NULL; w = w->w_nextWindow) {
if (w->w_grdata == grdata) return w;
}
return NULL;
}
/*
* ----------------------------------------------------------------------------
* WindSearch --
*
* Search for all of the client's windows that contain a particular
* surface area, whether exposed or not.
*
* Results:
* None.
*
* Side effects:
* Calls the function 'func' for each window that matches. 'func' should
* be of the form
*
* int func(window, clientData)
* MagWindow *window;
* ClientData clientData;
* {
* }
*
* Window is the window that matched the search, and clientData is the
* clientData parameter supplied to this procedure.
* If the function returns a non-zero value the search is aborted, and
* that value is returned. Otherwise the search continues and 0 is
* returned.
* ----------------------------------------------------------------------------
*/
int
WindSearch(client, surfaceID, surfaceArea, func, clientData)
WindClient client; /* Search for the windows that belong to
* this client. NULL means all clients.
*/
ClientData surfaceID; /* The unique ID of the surface that we
* are looking for. If NULL then look for
* any surface.
*/
Rect *surfaceArea; /* The area that we are looking for in surface
* coordinates. If NULL then match without
* regard to the area in the window.
*/
int (*func)(); /* The function to call with each window
* that matches.
*/
ClientData clientData; /* The client data to be passed to the caller's
* function.
*/
{
MagWindow *w;
int res = 0;
for (w = windTopWindow; w != (MagWindow *) NULL; w = w->w_nextWindow)
{
if ( ((client == (WindClient) NULL) || (w->w_client == client)) &&
((surfaceID == (ClientData) NULL) ||
(w->w_surfaceID == surfaceID)) )
{
if (surfaceArea == (Rect *) NULL)
{
res = (*func)(w, clientData);
if (res != 0) return res;
continue; /* continue on to next window */
}
else if (GEO_TOUCH(surfaceArea, &(w->w_surfaceArea) ))
{
res = (*func)(w, clientData);
if (res != 0) return res;
}
}
}
return 0;
}