home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / emacs-18.59-src.tgz / emacs-18.59-src.tar / fsf / emacs18 / oldXMenu / AddPane.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  104 lines

  1. #include "copyright.h"
  2.  
  3. /* $Header: AddPane.c,v 1.3 87/12/20 12:03:52 rws Exp $ */
  4. /* Copyright    Massachusetts Institute of Technology    1985    */
  5.  
  6. /*
  7.  * XMenu:    MIT Project Athena, X Window system menu package
  8.  *
  9.  *     XMenuAddPane - Adds a pane to an XMenu object.
  10.  *
  11.  *    Author:        Tony Della Fera, DEC
  12.  *            August, 1985
  13.  *
  14.  */
  15.  
  16. #include "XMenuInt.h"
  17.  
  18. int
  19. XMenuAddPane(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.     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.