Blame demos/programs/popups/autopopups.c

Packit b099d7
/* $XConsortium: autopopups.c /main/5 1995/07/15 20:45:56 drk $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <stdlib.h>
Packit b099d7
#include <X11/Xlib.h>
Packit b099d7
#include <X11/IntrinsicP.h>
Packit b099d7
#include <X11/CompositeP.h>
Packit b099d7
#include <Xm/XmP.h>
Packit b099d7
#include <Xm/Frame.h>
Packit b099d7
#include <Xm/Label.h>
Packit b099d7
#include <Xm/PushB.h>
Packit b099d7
#include <Xm/PushBG.h>
Packit b099d7
#include <Xm/LabelG.h>
Packit b099d7
#include <Xm/SeparatoG.h>
Packit b099d7
#include <Xm/RowColumn.h>
Packit b099d7
#include <Xm/BulletinB.h>
Packit b099d7
#include <Xm/DrawingA.h>
Packit b099d7
Packit b099d7
XtAppContext context;
Packit b099d7
#define APP_CLASS "AutomaticPopups"
Packit b099d7
Packit b099d7
Widget exitpb;
Packit b099d7
Packit b099d7
void QuitAppl(Widget, char *, XmPushButtonCallbackStruct *);
Packit b099d7
void ExposeCB(Widget, char *, XmDrawingAreaCallbackStruct *);
Packit b099d7
void ButtonEventHandler(Widget, XtPointer, XEvent*);
Packit b099d7
void PopupHandlerCB(Widget, XtPointer, XmPopupHandlerCallbackStruct *);
Packit b099d7
void addButton(Widget, char*);
Packit b099d7
void addChildren(Widget, char*);
Packit b099d7
Packit b099d7
int circlex, circley, circled;
Packit b099d7
int rectx, recty, recth, rectw;
Packit b099d7
Packit b099d7
Widget	popup1, popup2, popup3, popup4, popup5;
Packit b099d7
Packit b099d7
int main(int argc, char **argv)
Packit b099d7
{
Packit b099d7
  Widget        shell;
Packit b099d7
  Widget        frame1, frame2;
Packit b099d7
  Widget	da1, da2;
Packit b099d7
  Widget	btn1, btn2, label1, label2, btn3, sbtn1;
Packit b099d7
  Widget	explain;
Packit b099d7
  Arg		args[10];
Packit b099d7
  int		count;
Packit b099d7
  XmString	str, tmp1, tmp2;
Packit b099d7
Packit b099d7
  shell     = XtVaAppInitialize(&context, APP_CLASS, NULL, 0, &argc, argv,
Packit b099d7
				NULL, 0);
Packit b099d7
Packit b099d7
  frame1 = XmCreateFrame(shell, "outerframe", NULL, 0);
Packit b099d7
  XtManageChild(frame1);
Packit b099d7
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNpopupEnabled, XmPOPUP_AUTOMATIC_RECURSIVE); count++;
Packit b099d7
  popup1 = XmCreatePopupMenu(frame1, "popupOF", args, count);
Packit b099d7
Packit b099d7
  addChildren(popup1, "OuterFrameMenu");
Packit b099d7
Packit b099d7
  str = XmStringCreateLocalized("OuterFrame");
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNlabelString, str); count++;
Packit b099d7
  XtSetArg(args[count], XmNframeChildType, XmFRAME_TITLE_CHILD); count++;
Packit b099d7
  label1 = XmCreateLabel(frame1, "label1", args, count);
Packit b099d7
  XtManageChild(label1);
Packit b099d7
  XmStringFree(str);
Packit b099d7
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNheight, 500); count++;
Packit b099d7
  XtSetArg(args[count], XmNwidth, 500); count++;
Packit b099d7
  XtSetArg(args[count], XmNframeChildType, XmFRAME_WORKAREA_CHILD); count++;
Packit b099d7
  XtSetArg(args[count], XmNresizePolicy, XmRESIZE_NONE); count++;
Packit b099d7
  da1 = XmCreateDrawingArea(frame1, "da1", args, count);
Packit b099d7
  XtManageChild(da1);
Packit b099d7
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNx, 100); count++;
Packit b099d7
  XtSetArg(args[count], XmNy, 100); count++;
Packit b099d7
  frame2 = XmCreateFrame(da1, "innerframe", args, count);
Packit b099d7
  XtManageChild(frame2);
Packit b099d7
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNpopupEnabled, XmPOPUP_AUTOMATIC_RECURSIVE); count++;
Packit b099d7
  popup2 = XmCreatePopupMenu(frame2, "popupIF", args, count);
Packit b099d7
Packit b099d7
  addChildren(popup2, "InnerFrameMenu");
Packit b099d7
  addButton(popup2, "Make me different");
Packit b099d7
Packit b099d7
  str = XmStringCreateLocalized("InnerFrame");
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNlabelString, str); count++;
Packit b099d7
  XtSetArg(args[count], XmNframeChildType, XmFRAME_TITLE_CHILD); count++;
Packit b099d7
  label2 = XmCreateLabel(frame2, "label2", args, count);
Packit b099d7
  XtManageChild(label2);
Packit b099d7
  XmStringFree(str);
Packit b099d7
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNheight, 300); count++;
Packit b099d7
  XtSetArg(args[count], XmNwidth, 300); count++;
Packit b099d7
  XtSetArg(args[count], XmNframeChildType, XmFRAME_WORKAREA_CHILD); count++;
Packit b099d7
  XtSetArg(args[count], XmNresizePolicy, XmRESIZE_NONE); count++;
Packit b099d7
  da2 = XmCreateDrawingArea(frame2, "da2", args, count);
Packit b099d7
  XtManageChild(da2);
Packit b099d7
  XtAddCallback(da2, XmNexposeCallback, (XtCallbackProc) ExposeCB, NULL);
Packit b099d7
  XtAddCallback(da2, XmNpopupHandlerCallback, 
Packit b099d7
		(XtCallbackProc) PopupHandlerCB, NULL);
Packit b099d7
Packit b099d7
  count = 0;
Packit b099d7
  str = XmStringCreateLocalized(
Packit b099d7
	"Click Button3 anywhere to cause a popup menu");
Packit b099d7
  tmp1 = XmStringConcat(str, XmStringSeparatorCreate());
Packit b099d7
  XmStringFree(str);
Packit b099d7
  tmp2 = XmStringCreateLocalized(
Packit b099d7
         "to be posted.  Note that the posted menu");
Packit b099d7
  str = XmStringConcat(tmp1, tmp2);
Packit b099d7
  XmStringFree(tmp1);
Packit b099d7
  XmStringFree(tmp2);
Packit b099d7
  tmp1 = XmStringConcat(str, XmStringSeparatorCreate());
Packit b099d7
  XmStringFree(str);
Packit b099d7
  tmp2 = XmStringCreateLocalized(
Packit b099d7
         "differs depending on where you click.");
Packit b099d7
  str = XmStringConcat(tmp1, tmp2);
Packit b099d7
  XmStringFree(tmp1);
Packit b099d7
  XmStringFree(tmp2);
Packit b099d7
Packit b099d7
  XtSetArg(args[count], XmNx, 10); count++;
Packit b099d7
  XtSetArg(args[count], XmNy, 200); count++;
Packit b099d7
  XtSetArg(args[count], XmNlabelString, str); count++;
Packit b099d7
  XtSetArg(args[count], XmNalignment, XmALIGNMENT_BEGINNING); count++;
Packit b099d7
  explain = XmCreateLabelGadget(da2, "Explain", args, count);
Packit b099d7
  XtManageChild(explain);
Packit b099d7
  XmStringFree(str);
Packit b099d7
Packit b099d7
  circlex = 40; circley = 120; circled = 30;
Packit b099d7
  rectx = 80; recty = 120; recth = 30; rectw = 60;
Packit b099d7
Packit b099d7
  str = XmStringCreateLocalized("Quit");
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNlabelString, str); count++;
Packit b099d7
  XtSetArg(args[count], XmNx, 40); count++;
Packit b099d7
  XtSetArg(args[count], XmNy, 40); count++;
Packit b099d7
  btn1 = XmCreatePushButton(da2, "pb1", args, count);
Packit b099d7
  XtManageChild(btn1);
Packit b099d7
  XtAddCallback(btn1, XmNactivateCallback, 
Packit b099d7
		(XtCallbackProc) QuitAppl, NULL);
Packit b099d7
Packit b099d7
  str = XmStringCreateLocalized("Another Button With no Menu");
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNlabelString, str); count++;
Packit b099d7
  XtSetArg(args[count], XmNx, 40); count++;
Packit b099d7
  XtSetArg(args[count], XmNy, 80); count++;
Packit b099d7
  btn3 = XmCreatePushButton(da2, "pb3", args, count);
Packit b099d7
  XtManageChild(btn3);
Packit b099d7
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNpopupEnabled, XmPOPUP_AUTOMATIC); count++;
Packit b099d7
  popup4 = XmCreatePopupMenu(btn1, "popupBtn1", args, count);
Packit b099d7
Packit b099d7
  addChildren(popup4, "SharedMenu");
Packit b099d7
  addButton(popup4, "Do something more");
Packit b099d7
  addButton(popup4, "What else?");
Packit b099d7
Packit b099d7
Packit b099d7
  str = XmStringCreateLocalized("PushMe");
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNlabelString, str); count++;
Packit b099d7
  XtSetArg(args[count], XmNx, 40); count++;
Packit b099d7
  XtSetArg(args[count], XmNy, 40); count++;
Packit b099d7
  btn2 = XmCreatePushButton(da1, "pb2", args, count);
Packit b099d7
  XtManageChild(btn2);
Packit b099d7
Packit b099d7
  str = XmStringCreateLocalized("I share a menu");
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNlabelString, str); count++;
Packit b099d7
  XtSetArg(args[count], XmNx, 240); count++;
Packit b099d7
  XtSetArg(args[count], XmNy, 40); count++;
Packit b099d7
  sbtn1 = XmCreatePushButton(da1, "sharepb1", args, count);
Packit b099d7
  XtManageChild(sbtn1);
Packit b099d7
Packit b099d7
  /* Associate a menu with this button */
Packit b099d7
  XmAddToPostFromList(popup4, sbtn1);
Packit b099d7
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNpopupEnabled, XmPOPUP_AUTOMATIC); count++;
Packit b099d7
  popup3 = XmCreatePopupMenu(btn2, "popupBtn2", args, count);
Packit b099d7
Packit b099d7
  addChildren(popup3, "Button2Menu");
Packit b099d7
  addButton(popup3, "Do something more");
Packit b099d7
  
Packit b099d7
  count = 0;
Packit b099d7
  XtSetArg(args[count], XmNpopupEnabled, True); count++;
Packit b099d7
  popup4 = XmCreatePopupMenu(da2, "PopupObjects1", args, count);
Packit b099d7
Packit b099d7
  addChildren(popup4, "ObjectMenu");
Packit b099d7
  addButton(popup4, "Flip");
Packit b099d7
  addButton(popup4, "Size");
Packit b099d7
  addButton(popup4, "Stretch");
Packit b099d7
  
Packit b099d7
  XtRealizeWidget(shell);
Packit b099d7
Packit b099d7
  XtAppMainLoop(context);
Packit b099d7
Packit b099d7
  return 0;    /* make compiler happy */
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
void 
Packit b099d7
QuitAppl(Widget w, char *i, XmPushButtonCallbackStruct *e)
Packit b099d7
{
Packit b099d7
  exit(0);
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
addChildren(Widget popup, char* label)
Packit b099d7
{
Packit b099d7
  XmString str;
Packit b099d7
  Arg args[2];
Packit b099d7
  Widget child;
Packit b099d7
Packit b099d7
  str = XmStringCreateLocalized(label);
Packit b099d7
  XtSetArg(args[0], XmNlabelString, str);
Packit b099d7
  child = XmCreateLabelGadget(popup, "Title", args, 1);
Packit b099d7
  XtManageChild(child);
Packit b099d7
  XmStringFree(str);
Packit b099d7
Packit b099d7
  child = XmCreateSeparatorGadget(popup, "Sep", NULL, 0);
Packit b099d7
  XtManageChild(child);
Packit b099d7
Packit b099d7
  addButton(popup, "Cut");
Packit b099d7
  addButton(popup, "Copy");
Packit b099d7
  addButton(popup, "Paste");
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
addButton(Widget parent, char* label) 
Packit b099d7
{
Packit b099d7
  Widget ch;
Packit b099d7
  XmString str;
Packit b099d7
  Arg args[2];
Packit b099d7
Packit b099d7
  str = XmStringCreateLocalized(label);
Packit b099d7
  XtSetArg(args[0], XmNlabelString, str);
Packit b099d7
  ch = XmCreatePushButtonGadget(parent, label, args, 1);
Packit b099d7
  XtManageChild(ch);
Packit b099d7
  XmStringFree(str);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
GC drawGC = NULL;
Packit b099d7
Packit b099d7
void 
Packit b099d7
ExposeCB(Widget da, char *ig, XmDrawingAreaCallbackStruct *cbs)
Packit b099d7
{
Packit b099d7
  Arg args[2];
Packit b099d7
  XGCValues gcv;
Packit b099d7
  Pixel fg;
Packit b099d7
  Pixel bg;
Packit b099d7
Packit b099d7
  if (drawGC == NULL) {
Packit b099d7
    XtSetArg (args[0], XmNforeground, &fg;;
Packit b099d7
    XtSetArg (args[1], XmNbackground, &bg;;
Packit b099d7
    XtGetValues (da, args, 2);
Packit b099d7
    gcv.foreground = fg;
Packit b099d7
    gcv.background = bg;
Packit b099d7
    gcv.line_width = 2;
Packit b099d7
    drawGC = XtGetGC (da, GCForeground | GCBackground | GCLineWidth, &gcv;;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  XDrawArc(XtDisplay(da), XtWindow(da), drawGC,
Packit b099d7
	   circlex, circley, circled, circled, 
Packit b099d7
	   0, (360 * 64));
Packit b099d7
  XDrawRectangle(XtDisplay(da), XtWindow(da), drawGC, 
Packit b099d7
		 rectx, recty, rectw, recth);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
PopupHandlerCB(Widget da, XtPointer ignore, XmPopupHandlerCallbackStruct *phcs)
Packit b099d7
{
Packit b099d7
  int radius;
Packit b099d7
  int dx, dy;
Packit b099d7
  XButtonEvent *bevent = (XButtonEvent *) phcs -> event;
Packit b099d7
  int eventx, eventy;
Packit b099d7
  Position wox, woy;
Packit b099d7
Packit b099d7
  /* Translate event coordinates to this widget */
Packit b099d7
  /* First get origin of this widget */
Packit b099d7
  XtTranslateCoords(da, 0, 0, &wox, &woy;;
Packit b099d7
Packit b099d7
  /* Now calculate relative offset */
Packit b099d7
  eventx = bevent -> x_root - wox;
Packit b099d7
  eventy = bevent -> y_root - woy;
Packit b099d7
  
Packit b099d7
  /* Check for hit in circle or rectangle to post special 
Packit b099d7
     menus */
Packit b099d7
Packit b099d7
  dx = eventx - rectx;
Packit b099d7
  dy = eventy - recty;
Packit b099d7
Packit b099d7
  if (dx > 0 && dx < rectw &&
Packit b099d7
      dy > 0 && dy < recth) {
Packit b099d7
    phcs -> menuToPost = popup4;
Packit b099d7
    return;
Packit b099d7
  }
Packit b099d7
Packit b099d7
  dx = eventx - circlex;
Packit b099d7
  dy = eventy - circley;
Packit b099d7
Packit b099d7
  dx -= circled / 2;
Packit b099d7
  dy -= circled / 2;
Packit b099d7
Packit b099d7
  radius = (dx * dx) + (dy * dy);
Packit b099d7
Packit b099d7
  if (radius < ((circled * circled) / 4))
Packit b099d7
    phcs -> menuToPost = popup4;
Packit b099d7
}