1/* Copyright Massachusetts Institute of Technology 1985 */ 2 3#include "copyright.h" 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 18int 19XMenuAddPane(display, menu, label, active) 20 Display *display; 21 register XMenu *menu; /* Menu object to be modified. */ 22 register char *label; /* Selection label. */ 23 int active; /* Make selection active? */ 24{ 25 register XMPane *pane; /* Newly created pane. */ 26 register XMSelect *select; /* Initial selection for the new pane. */ 27 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 } 52 53 /* 54 * Determine label size. 55 */ 56 label_length = strlen(label); 57 label_width = XTextWidth(menu->p_fnt_info, 58 label, 59 label_length); 60 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 /* 89 * Update the pane count. 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} 104 105/* arch-tag: 62a26021-f29d-48ba-96ef-3b6c4ebd6547 106 (do not change this comment) */ 107