#include <X11/Intrinsic.h>
#include <Xm/Label.h>
#include <Xm/Text.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>

Widget toplevel, manager, popup_btn, exit_btn;
Widget dialog_shell, dialog_box, dialog_text, dialog_label, dialog_btn;

void CreateDialogBox();
void PopupDialogBox();
void PopdownDialogBox();
void ExitCallback();

main (int argc, char **argv)
{
  XtAppContext context;

  toplevel = XtAppInitialize( &context, "Popup", NULL, 0,
                       &argc, argv, NULL, NULL,0) ;
  manager = XtCreateManagedWidget("manager", xmRowColumnWidgetClass, 
                       toplevel, NULL, 0);
  popup_btn =  XtVaCreateManagedWidget ( "popupBtn", xmPushButtonWidgetClass,
                       toplevel, NULL, 0);
  exit_btn =  XtVaCreateManagedWidget ( "exitBtn", xmPushButtonWidgetClass,
                       toplevel, NULL, 0);

  XtAddCallback(exit_btn, XmNactivateCallback, ExitCallback, NULL);

  CreateDialogBox();

  XtRealizeWidget(toplevel);
  XtAppMainLoop(context);

}

void 
CreateDialogBox()
{
  dialog_shell = XtCreatePopupShell("popupShell", transientShellWidgetClass,
                      toplevel, NULL, 0);
  dialog_box   = XtCreateManagedWidget("DialogBox", xmRowColumnWidgetClass,
                      dialog_shell, NULL, 0);
  dialog_label =  XtCreateManagedWidget("DialogLabel", xmLabelWidgetClass,
                      dialog_box, NULL, 0);
  dialog_text = XtCreateManagedWidget("DialogText", xmTextWidgetClass,
                      dialog_box, NULL, 0);
  dialog_btn = XtCreateManagedWidget("DialogBtn", xmPushButtonWidgetClass,
                      dialog_box, NULL, 0);

  XtAddCallback(dialog_btn,  XmNactivateCallback, PopdownDialogBox, NULL);
  XtAddCallback(dialog_text, XmNactivateCallback, PopdownDialogBox, NULL);

  XtRealizeWidget(dialog_shell);

}

void
PopupDialogBox(Widget w, XtPointer client, XtPointer call)
{
  Position x, y, root_x, root_y;

  XtVaGetValues(toplevel, XmNx, &x, XmNy, &y, NULL);
  XtTranslateCoords(toplevel, x, y, &root_x, &root_y);
  XtVaSetValues(dialog_shell, XmNx, root_x+50, XmNy, root_y+50, NULL);
  XtPopup (dialog_shell, XtGrabExclusive);
}

void 
PopdownDialogBox(Widget w, XtPointer client, XtPointer call)
{
  String string;
  
  XtVaGetValues(dialog_text, XmNvalue, &string, NULL);
  if(strlen(string)>0) {
    XtVaSetValues(toplevel, XmNtitle, &string, NULL);
    XFree(string);
  }
  
  XtPopdown(dialog_shell);  
}

void
ExitCallback(Widget w, XtPointer client, XtPointer call)
{
  exit(1);
}

