Commit | Line | Data |
---|---|---|
e745ede7 | 1 | /* Copyright Massachusetts Institute of Technology 1985 */ |
2cd3138f GM |
2 | |
3 | #include "copyright.h" | |
e745ede7 DL |
4 | |
5 | /* | |
6 | * XMenu: MIT Project Athena, X Window system menu package | |
7 | * | |
8 | * XMenuAddPane - Adds a pane to an XMenu object. | |
9 | * | |
10 | * Author: Tony Della Fera, DEC | |
11 | * August, 1985 | |
12 | * | |
13 | */ | |
14 | ||
15 | #include <config.h> | |
16 | #include "XMenuInt.h" | |
17 | ||
18 | int | |
b782e2d7 DN |
19 | XMenuAddPane(Display *display, register XMenu *menu, register char *label, int active) |
20 | ||
21 | /* Menu object to be modified. */ | |
22 | /* Selection label. */ | |
23 | /* Make selection active? */ | |
e745ede7 DL |
24 | { |
25 | register XMPane *pane; /* Newly created pane. */ | |
26 | register XMSelect *select; /* Initial selection for the new pane. */ | |
177c0ea7 | 27 | |
e745ede7 DL |
28 | int label_length; /* Label length in characters. */ |
29 | int label_width; /* Label width in pixels. */ | |
30 | ||
31 | /* | |
32 | * Check for NULL pointers! | |
33 | */ | |
34 | if (label == NULL) { | |
35 | _XMErrorCode = XME_ARG_BOUNDS; | |
36 | return(XM_FAILURE); | |
37 | } | |
38 | ||
39 | /* | |
40 | * Calloc the XMPane structure and the initial XMSelect. | |
41 | */ | |
42 | pane = (XMPane *)calloc(1, sizeof(XMPane)); | |
43 | if (pane == NULL) { | |
44 | _XMErrorCode = XME_CALLOC; | |
45 | return(XM_FAILURE); | |
46 | } | |
47 | select = (XMSelect *)calloc(1, sizeof(XMSelect)); | |
48 | if (select == NULL) { | |
49 | _XMErrorCode = XME_CALLOC; | |
50 | return(XM_FAILURE); | |
51 | } | |
177c0ea7 | 52 | |
e745ede7 DL |
53 | /* |
54 | * Determine label size. | |
55 | */ | |
56 | label_length = strlen(label); | |
57 | label_width = XTextWidth(menu->p_fnt_info, | |
58 | label, | |
59 | label_length); | |
177c0ea7 | 60 | |
e745ede7 DL |
61 | /* |
62 | * Set up the initial selection. | |
63 | * Values not explicitly set are zeroed by calloc. | |
64 | */ | |
65 | select->next = select; | |
66 | select->prev = select; | |
67 | select->type = SL_HEADER; | |
68 | select->serial = -1; | |
69 | select->parent_p = pane; | |
70 | ||
71 | /* | |
72 | * Fill the XMPane structure. | |
73 | * X and Y position are set to 0 since a recompute will follow. | |
74 | */ | |
75 | pane->type = PANE; | |
76 | pane->active = active; | |
77 | pane->serial = -1; | |
78 | pane->label = label; | |
79 | pane->label_width = label_width; | |
80 | pane->label_length = label_length; | |
81 | pane->s_list = select; | |
82 | ||
83 | /* | |
84 | * Insert the pane at the end of the pane list. | |
85 | */ | |
86 | emacs_insque(pane, menu->p_list->prev); | |
87 | ||
88 | /* | |
177c0ea7 | 89 | * Update the pane count. |
e745ede7 DL |
90 | */ |
91 | menu->p_count++; | |
92 | ||
93 | /* | |
94 | * Schedule a recompute. | |
95 | */ | |
96 | menu->recompute = 1; | |
97 | ||
98 | /* | |
99 | * Return the pane number just added. | |
100 | */ | |
101 | _XMErrorCode = XME_NO_ERROR; | |
102 | return((menu->p_count - 1)); | |
103 | } | |
ab5796a9 MB |
104 | |
105 | /* arch-tag: 62a26021-f29d-48ba-96ef-3b6c4ebd6547 | |
106 | (do not change this comment) */ |