1 /* Copyright    Massachusetts Institute of Technology    1985	*/
2 
3 #include "copyright.h"
4 
5 
6 /*
7  * XMenu:	MIT Project Athena, X Window system menu package
8  *
9  *	XMenuLocate - Return data necessary to position and locate
10  *		      a menu on the screen.
11  *
12  *	Author:		Tony Della Fera, DEC
13  *			January 11, 1985
14  *
15  */
16 
17 #include "XMenuInt.h"
18 
19 int
XMenuLocate(register Display * display,register XMenu * menu,int p_num,int s_num,int x_pos,int y_pos,int * ul_x,int * ul_y,int * width,int * height)20 XMenuLocate(register Display *display, register XMenu *menu, int p_num, int s_num, int x_pos, int y_pos, int *ul_x, int *ul_y, int *width, int *height)
21                               	/* Previously opened display. */
22                          	/* Menu object being located. */
23               			/* Active pane number. */
24               			/* Active selection number. */
25               			/* X coordinate of mouse active position. */
26               			/* Y coordinate of mouse active position. */
27               			/* Returned upper left menu X coordinate. */
28               			/* Returned upper left menu Y coordinate. */
29                			/* Returned menu width. */
30                 		/* Returned menu height. */
31 {
32     register XMPane *p_ptr;	/* XMPane pointer. */
33     register XMSelect *s_ptr;	/* XMSelect pointer. */
34 
35     /*
36      * Are the position arguments positive?
37      */
38     if ((x_pos <= 0) || (y_pos <= 0)) {
39 	_XMErrorCode = XME_ARG_BOUNDS;
40 	return(XM_FAILURE);
41     }
42 
43     /*
44      * Find the right pane.
45      */
46     p_ptr = _XMGetPanePtr(menu, p_num);
47     if (p_ptr == NULL) return(XM_FAILURE);
48 
49     /*
50      * Find the right selection.
51      */
52       s_ptr = _XMGetSelectionPtr(p_ptr, s_num);
53 
54     /*
55      * Check to see that the menu's dependencies have been
56      * recomputed and are up to date.  If not, do it now.
57      */
58     if (menu->recompute) XMenuRecompute(display, menu);
59 
60     /*
61      * Compute the new menu origin such that the active point lies
62      * in the center of the desired active pane and selection.
63      * This sets the values of ul_x and ul_y.
64      */
65     _XMTransToOrigin(display, menu, p_ptr, s_ptr, x_pos, y_pos, ul_x, ul_y);
66 
67     /*
68      * Set remaining return argument values.
69      */
70     *width = menu->width;
71     *height = menu->height;
72 
73     /*
74      * Return successfully.
75      */
76     _XMErrorCode = XME_NO_ERROR;
77     return(XM_SUCCESS);
78 }
79 
80