Blame tests/Auto/lib/Synth/other/FindObjAtLoc.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * 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() */