Commit | Line | Data |
---|---|---|
2cd3138f GM |
1 | /* Copyright Massachusetts Institute of Technology 1985 */ |
2 | ||
e745ede7 DL |
3 | #include "copyright.h" |
4 | ||
e745ede7 DL |
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 | |
b782e2d7 DN |
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. */ | |
e745ede7 DL |
31 | { |
32 | register XMPane *p_ptr; /* XMPane pointer. */ | |
33 | register XMSelect *s_ptr; /* XMSelect pointer. */ | |
177c0ea7 | 34 | |
e745ede7 DL |
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 | } | |
ab5796a9 | 79 |