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