|
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 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
#ifdef REV_INFO
|
|
Packit |
b099d7 |
#ifndef lint
|
|
Packit |
b099d7 |
static char rcsid[] = "$XConsortium: FindObjAtLoc.c /main/7 1995/07/14 11:33:04 drk $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/***********************************************************************
|
|
Packit |
b099d7 |
@(#)FindObjAtLoc.c 1.6.1.1 Date:1/22/91
|
|
Packit |
b099d7 |
Author: TAT
|
|
Packit |
b099d7 |
History:
|
|
Packit |
b099d7 |
05/24/90 SJS add to sccs
|
|
Packit |
b099d7 |
07/19/90 SJS correct Null sibling/first_child cases
|
|
Packit |
b099d7 |
07/24/90 SJS use some register variables
|
|
Packit |
b099d7 |
09/12/90 SJS check for the Map state of the objects
|
|
Packit |
b099d7 |
Calls:
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Summary:
|
|
Packit |
b099d7 |
Looks up the object lowest in the hierarchy and highest in
|
|
Packit |
b099d7 |
stacking order that contains the given x,y location. This object
|
|
Packit |
b099d7 |
must also be mapped (possibly should be viewable, but not sure yet)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
INPUTS
|
|
Packit |
b099d7 |
x,y - the location relative to the root window
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
OUTPUTS
|
|
Packit |
b099d7 |
none
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
RETURNS
|
|
Packit |
b099d7 |
Pointer to object which contains the given x,y location
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
#include <Xm/Xm.h>
|
|
Packit |
b099d7 |
#include "xislib.h"
|
|
Packit |
b099d7 |
#include <X11/IntrinsicP.h>
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XisObjectRecord *xisFindObjectAtLocation(x,y)
|
|
Packit |
b099d7 |
int x,y;
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int stack_top = 0;
|
|
Packit |
b099d7 |
register int done = False;
|
|
Packit |
b099d7 |
register XisObjectRecord *object;
|
|
Packit |
b099d7 |
register XisObjectRecord *save_object=NULL_Object;
|
|
Packit |
b099d7 |
XisObjectRecord *object_stack[100];
|
|
Packit |
b099d7 |
int border_width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check to see if the current l & y is valid */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ( x < 0 || y < 0 ||
|
|
Packit |
b099d7 |
x > DisplayWidth(xisDisplay,xisScreen) ||
|
|
Packit |
b099d7 |
y > DisplayHeight(xisDisplay,xisScreen) ) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
object = (&xisObjects[0]); /* Start at the Root object */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Perform Depth-First Search to find inner-most containing object */
|
|
Packit |
b099d7 |
/* As we go along create a stack of the objects we are in (!?!) */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
while (!done) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
border_width = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (object->id.widget != NULL) {
|
|
Packit |
b099d7 |
border_width =
|
|
Packit |
b099d7 |
(int) object->id.widget->core.border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check to see if the current x & y is within the object */
|
|
Packit |
b099d7 |
if ( ((object->x - border_width) <= x) &&
|
|
Packit |
b099d7 |
((object->y - border_width) <= y) &&
|
|
Packit |
b099d7 |
((object->x + object->width + border_width) > x) &&
|
|
Packit |
b099d7 |
((object->y + object->height + border_width) > y) &&
|
|
Packit |
b099d7 |
(object->visibility_state != IsUnmapped) ) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
save_object = object;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((save_object == object) && (object->first_child != NULL) ) {
|
|
Packit |
b099d7 |
object_stack[stack_top++] = object;
|
|
Packit |
b099d7 |
object = object->first_child;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else if (object->next_sibling != NULL) {
|
|
Packit |
b099d7 |
if ((object == save_object)) {
|
|
Packit |
b099d7 |
done = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
object = object->next_sibling;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
if ((object == save_object) ) {
|
|
Packit |
b099d7 |
done = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
object = NULL;
|
|
Packit |
b099d7 |
while (stack_top > 0) {
|
|
Packit |
b099d7 |
object = object_stack[--stack_top];
|
|
Packit |
b099d7 |
if (object == save_object)
|
|
Packit |
b099d7 |
done = True;
|
|
Packit |
b099d7 |
object = object->next_sibling;
|
|
Packit |
b099d7 |
if (object != NULL)
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (object == NULL)
|
|
Packit |
b099d7 |
done = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* End while(!done) */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(save_object);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* End xisFindObjectAtLocation() */
|