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

I64 PopUpFreq()
{//See also $LK,"PopUpRangeI64",A="MN: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 MenuButton()
{
  Bool done=FALSE;
  I64 i,j=0,freq=100;
  I64 old_flags=DocPut->flags;
//This allows keyboard navigation to skip nonselectible 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 buttons 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=DocMenuDo(DocPut);
    DocBottom;
    switch (i) {
      case MU_NOTHING:
	break;
      case MU_SND_ON:
	j=freq;
	Snd(j);
	break;
      case MU_SND_OFF:
	j=0;
	Snd(j);
	break;
      case MU_SET_FREQ:
	freq=PopUpFreq;
	if (j) {
	  j=freq;
	  Snd(j);
	}
	break;
      default:
	done=TRUE;
    }
  } while (!done);
  DocPut->flags=DocPut->flags&~DOCF_FORM |
		     old_flags & DOCF_FORM;
  DocClear;
  Snd(0);
}

MenuButton;
