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 / InsSel.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  3KB  |  106 lines

  1. #include "copyright.h"
  2.  
  3. /* $Header: InsSel.c,v 1.3 87/12/20 12:05:16 rws Exp $ */
  4. /* Copyright    Massachusetts Institute of Technology    1985    */
  5.  
  6. /*
  7.  * XMenu:    MIT Project Athena, X Window system menu package
  8.  *
  9.  *     XMenuInsertSelection - Inserts a selection into an XMenu object
  10.  *
  11.  *    Author:        Tony Della Fera, DEC
  12.  *            20-Nov-85
  13.  *
  14.  */
  15.  
  16. #include "XMenuInt.h"
  17.  
  18. int
  19. XMenuInsertSelection(menu, p_num, s_num, data, label, active)
  20.     register XMenu *menu;    /* Menu object to be modified. */
  21.     register int p_num;        /* Pane number to be modified. */
  22.     register int s_num;        /* Selection number of new selection. */
  23.     char *data;            /* Data value. */
  24.     char *label;        /* Selection label. */
  25.     int active;            /* Make selection active? */
  26. {
  27.     register XMPane *p_ptr;    /* XMPane pointer. */
  28.     register XMSelect *s_ptr;    /* XMSelect pointer. */
  29.  
  30.     XMSelect *select;        /* Newly created selection. */
  31.  
  32.     int label_length;        /* Label lenght in characters. */
  33.     int label_width;        /* Label width in pixels. */
  34.     
  35.     /*
  36.      * Check for NULL pointers!
  37.      */
  38.     if (label == NULL) {
  39.     _XMErrorCode = XME_ARG_BOUNDS;
  40.     return(XM_FAILURE);
  41.     }
  42.  
  43.     /*
  44.      * Find the right pane.
  45.      */
  46.     p_ptr = _XMGetPanePtr(menu, p_num);
  47.     if (p_ptr == NULL) return(XM_FAILURE);
  48.  
  49.     /*
  50.      * Find the selection number one less than the one specified since that
  51.      * is the selection after which the insertion will occur.
  52.      */
  53.     s_ptr = _XMGetSelectionPtr(p_ptr, (s_num - 1));
  54.     if (s_ptr == NULL) return(XM_FAILURE);
  55.  
  56.     /*
  57.      * Calloc the XMSelect structure.
  58.      */
  59.     select = (XMSelect *)calloc(1, sizeof(XMSelect));
  60.     if (select == NULL) {
  61.     _XMErrorCode = XME_CALLOC;
  62.     return(XM_FAILURE);
  63.     }
  64.  
  65.     /*
  66.      * Determine label size.
  67.      */
  68.     label_length = strlen(label);
  69.     label_width = XTextWidth(menu->s_fnt_info, label, label_length);
  70.  
  71.  
  72.     /*
  73.      * Fill the XMSelect structure.
  74.      */
  75.     select->type = SELECTION;
  76.     select->active = active;
  77.     select->serial = -1;
  78.     select->label = label;
  79.     select->label_width = label_width;
  80.     select->label_length = label_length;
  81.     select->data = data;
  82.     select->parent_p = p_ptr;
  83.  
  84.     /*
  85.      * Insert the selection after the selection with the selection
  86.      * number one less than the desired number for the new selection.
  87.      */
  88.     insque(select, s_ptr);
  89.  
  90.     /*
  91.      * Update the selection count.
  92.      */
  93.     p_ptr->s_count++;
  94.  
  95.     /*
  96.      * Schedule a recompute.
  97.      */
  98.     menu->recompute = 1;
  99.  
  100.     /*
  101.      * Return the selection number just inserted.
  102.      */
  103.     _XMErrorCode = XME_NO_ERROR;
  104.     return(s_num);
  105. }
  106.