[TMP] enable load_prefer_newer
[bpt/emacs.git] / oldXMenu / InsPane.c
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 * XMenuInsertPane - Inserts a pane into an XMenu object in
10 * a particular position.
11 *
12 * Author: Tony Della Fera, DEC
13 * 20-Nov-85
14 *
15 */
16
17 #include "XMenuInt.h"
18
19 int
20 XMenuInsertPane(register XMenu *menu, register int p_num, char *label, int active)
21 /* Menu object to be modified. */
22 /* Pane number of new pane. */
23 /* Selection label. */
24 /* Make selection active? */
25 {
26 register XMPane *p_ptr; /* XMPane pointer. */
27 register XMPane *pane; /* Newly created pane. */
28 register XMSelect *sel; /* Initial selection for the new pane. */
29
30 int label_length; /* Label length in characters. */
31 int label_width; /* Label width in pixels. */
32
33 /*
34 * Check for NULL pointers!
35 */
36 if (label == NULL) {
37 _XMErrorCode = XME_ARG_BOUNDS;
38 return(XM_FAILURE);
39 }
40
41 /*
42 * Find the pane number one less than the one specified since that
43 * is the pane after which the insertion will occur.
44 */
45 p_ptr = _XMGetPanePtr(menu, (p_num - 1));
46 if (p_ptr == NULL) return(XM_FAILURE);
47
48 /*
49 * Calloc the XMPane structure and the initial XMSelect.
50 */
51 pane = (XMPane *)calloc(1, sizeof(XMPane));
52 if (pane == NULL) {
53 _XMErrorCode = XME_CALLOC;
54 return(XM_FAILURE);
55 }
56 sel = (XMSelect *)calloc(1, sizeof(XMSelect));
57 if (sel == NULL) {
58 _XMErrorCode = XME_CALLOC;
59 return(XM_FAILURE);
60 }
61
62 /*
63 * Determine label size.
64 */
65 label_length = strlen(label);
66 label_width = XTextWidth(menu->p_fnt_info, label, label_length);
67
68 /*
69 * Set up the initial selection.
70 * Values not explicitly set are zeroed by calloc.
71 */
72 sel->next = sel;
73 sel->prev = sel;
74 sel->type = SL_HEADER;
75 sel->serial = -1;
76 sel->parent_p = pane;
77
78 /*
79 * Fill the XMPane structure.
80 */
81 pane->type = PANE;
82 pane->active = active;
83 pane->serial = -1;
84 pane->label = label;
85 pane->label_width = label_width;
86 pane->label_length = label_length;
87 pane->s_list = sel;
88
89 /*
90 * Insert the pane after the pane with the pane
91 * number one less than the desired number for the
92 * new pane.
93 */
94 emacs_insque(pane, p_ptr);
95
96 /*
97 * Update the pane count.
98 */
99 menu->p_count++;
100
101 /*
102 * Schedule a recompute.
103 */
104 menu->recompute = 1;
105
106 /*
107 * Return the number of the pane just added.
108 */
109 _XMErrorCode = XME_NO_ERROR;
110 return(p_num);
111 }