|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* $Header: XMenuInsPane.c,v 10.9 86/02/12 16:19:21 tony Rel $ */ ! 4: /* Copyright Massachusetts Institute of Technology 1985 */ ! 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 "XMenuInternal.h" ! 18: ! 19: int ! 20: XMenuInsertPane(menu, p_num, label, active) ! 21: register XMenu *menu; /* Menu object to be modified. */ ! 22: register int p_num; /* Pane number of new pane. */ ! 23: char *label; /* Selection label. */ ! 24: int active; /* Make selection active? */ ! 25: { ! 26: register int i; /* Loop counter. */ ! 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 lenght 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_width = XQueryWidth(label, menu->p_fnt_info->id); ! 67: label_length = strlen(label); ! 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: 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.