//This example shows bttns.  Bttns return a menu val
//unless you rig them to send macros.  Menu entries are
//about the same as bttns, but don't have a border.

I64 PopUpFreq()
{//See also PopUpRangeI64()
  I64 i;
  CDoc *doc=DocNew;
  DocPrint(doc,"$TX+CX,\"Set Freq\"$\n" //Centered text
        "$CM+LX,2,4$$BT,\"100 Hz\",LE=100$"
        "$CM+LX,18,0$$BT,\"200 Hz\",LE=200$"
        "$CM+LX,2,4$$BT,\"400 Hz\",LE=400$"
        "$CM+LX,18,0$$BT,\"800 Hz\",LE=800$\n");
  i=PopUpMenu(doc);
  if (i<0) i=0; // <SHIFT-ESC>
  DocDel(doc);
  return i;
}

#define MU_NOTHING      0
#define MU_SET_FREQ     1
#define MU_SND_ON       2
#define MU_SND_OFF      3

U0 MenuBttn()
{
  Bool done=FALSE;
  I64 i,j=0,freq=100;
  I64 old_flags=DocPut->flags;
//This allows keyboard navigation to skip nonselible entries.
  DocPut->flags|=DOCF_FORM;
  do {
    DocClear;
//Use <CTRL-l> to generate cursor movement expressions and check "Quote".
    "$CM+CX-RE,-4$Menu Demo\n\n";
    "$LM,8$"; //Set left margin
//These are bttns that return a val from a menu selection.
    if (!j)
      "\n$BT,\"Snd On\",LE=MU_SND_ON$\n\n\n";
    else
      "\n$BT,\"Snd Off\",LE=MU_SND_OFF$\n\n\n";
    "\n$BT,\"Set Freq\",LE=MU_SET_FREQ$\n\n\n"
          "\n$BT,\"Nothing\",LE=MU_NOTHING$\n\n\n"
          "\n$BT,\"Done\",LE=DOCM_CANCEL$\n\n\n";
    i=DocMenu(DocPut);
    DocBottom;
    switch (i) {
      case MU_NOTHING:
        break;
      case MU_SND_ON:
        j=freq;
        Snd(Freq2Ona(j));
        break;
      case MU_SND_OFF:
        j=0;
        Snd;
        break;
      case MU_SET_FREQ:
        freq=PopUpFreq;
        if (j) {
          j=freq;
          Snd(Freq2Ona(j));
        }
        break;
      default:
        done=TRUE;
    }
  } while (!done);
  DocPut->flags=DocPut->flags&~DOCF_FORM |
        old_flags & DOCF_FORM;
  DocClear;
  Snd;
}

MenuBttn;