home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Graphics / Graphics.zip / xfitsvew.zip / XFITSview / moviebox.c < prev    next >
C/C++ Source or Header  |  1997-05-16  |  18KB  |  550 lines

  1. /* Movie control box  for XFITSview */
  2. /*-----------------------------------------------------------------------
  3. *  Copyright (C) 1996,1997
  4. *  Associated Universities, Inc. Washington DC, USA.
  5. *  This program is free software; you can redistribute it and/or
  6. *  modify it under the terms of the GNU General Public License as
  7. *  published by the Free Software Foundation; either version 2 of
  8. *  the License, or (at your option) any later version.
  9. *
  10. *  This program is distributed in the hope that it will be useful,
  11. *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. *  GNU General Public License for more details.
  14. *-----------------------------------------------------------------------*/
  15. #include <Xm/Xm.h> 
  16. #include <Xm/DialogS.h> 
  17. #include <Xm/MainW.h> 
  18. #include <Xm/ScrollBar.h>
  19. #include <Xm/Form.h>
  20. #include <Xm/PushB.h>
  21. #include <Xm/Label.h>
  22. #include <Xm/ToggleB.h>
  23. #include <Xm/RowColumn.h>
  24. #include <Xm/Separator.h>
  25. #include <Xm/MessageB.h>
  26. #include <Xm/TextF.h>
  27. #include <Xm/Text.h>
  28. #include <time.h>
  29. #include "imagedisp.h"
  30. #include "FITS2Pix.h"
  31. #include "wpos.h"
  32. #include "messagebox.h"
  33.  
  34. /* is the movie box active? */
  35. int MovieBoxActive = 0;
  36.  
  37. /* global structure for things to talk to each other */
  38. typedef struct {
  39.   ImageDisplay *BoxData;
  40.   int    StartPlane, EndPlane, CurPlane;
  41.   int    Stop;                /* if true stop button hit */
  42.   float  Dwell;
  43.   Widget dialog, start, end;  /* box, start, end planes */
  44.   Widget dwell;               /* Dwell time */
  45.   Widget PlaneScroll;         /* plane select/display scroll */
  46.   Widget PlaneScrollLabel;    /* label for plane number */
  47.   Widget PlaneLabel;          /* label for plane axis value */
  48.   Widget StopButton;          /* stop button */
  49.   Window window;              /* stop button window */
  50. } MovieBoxStuff;
  51. MovieBoxStuff MovieDia;
  52.  
  53. Boolean MovieCheckStop()
  54. /* searches event queue for click of Stop button */
  55. /* returns true if found */
  56. {
  57.   XButtonPressedEvent *StopEvent;
  58.   XEvent              evt;
  59.  
  60.   if (XCheckTypedEvent(XtDisplay(MovieDia.dialog), ButtonPress, &evt))
  61.     { StopEvent = (XButtonPressedEvent*)&evt;
  62.       if (StopEvent->window==MovieDia.window) { /* found it */
  63.     MovieDia.Stop = 1; 
  64. /* clear out queue */
  65.     while (XPending(XtDisplay(MovieDia.dialog)))
  66.       XNextEvent (XtDisplay(MovieDia.dialog), &evt);
  67.     XSync (XtDisplay(MovieDia.dialog), True);
  68.     return 1;}
  69.       else /* it's not yours - put it back */
  70.     {XPutBackEvent (XtDisplay(MovieDia.dialog), &evt); 
  71.      return 0;}
  72.     }
  73.   return 0;
  74. } /* end MovieCheckStop */
  75.  
  76. void ReadStartPlaneCB (Widget w, XtPointer clientData, XtPointer callData)
  77. /* get first plane for movie */
  78. {
  79.   ImageDisplay *IDdata = (ImageDisplay *)clientData;
  80.   char     *value=NULL;
  81.   int    itemp;
  82.  
  83. /* read value */
  84.   value = XmTextGetString (w);
  85.   if (!value) /* error */
  86.     {MessageShow ("Error reading start plane number");
  87.      MovieDia.Stop = 1; return;}
  88.   if (!sscanf (value, "%d", &itemp))
  89.    { /* error */
  90.      MessageShow("Error reading start plane number");
  91.      if (value) XtFree(value);
  92.      MovieDia.Stop = 1; return;}
  93.   if (value) XtFree(value);
  94.  
  95. /* internally 0 rel; externally 1 rel */
  96.   itemp--;
  97.  
  98. /* check value */
  99.   if ((image[CurImag].valid) && 
  100.       ((itemp<0) || (itemp>=image[CurImag].iNumPlanes)))
  101.     { /* error */
  102.       MessageShow ("Error: start plane number out of range");
  103.       MovieDia.Stop = 1; return;}
  104. /* OK, save */
  105.   MovieDia.StartPlane = itemp;
  106. } /* end ReadStartPlaneCB */
  107.  
  108. void ReadEndPlaneCB (Widget w, XtPointer clientData, XtPointer callData)
  109. /* get last plane for movie */
  110. {
  111.   ImageDisplay *IDdata = (ImageDisplay *)clientData;
  112.   char     *value=NULL;
  113.   int    itemp;
  114.  
  115. /* read value */
  116.   value = XmTextGetString (w);
  117.   if (!value) /* error */
  118.     {MessageShow("Error reading end plane number");
  119.      MovieDia.Stop = 1; return;}
  120.   if (!sscanf (value, "%d", &itemp))
  121.    { /* error */
  122.      MessageShow("Error reading end plane number");
  123.      if (value) XtFree(value);
  124.      MovieDia.Stop = 1; return;}
  125.   if (value) XtFree(value);
  126.  
  127. /* internally 0 rel; externally 1 rel */
  128.   itemp--;
  129.  
  130. /* check value */
  131.   if ((image[CurImag].valid) && 
  132.       ((itemp<0) || (itemp>=image[CurImag].iNumPlanes)))
  133.     { /* error */
  134.       MessageShow ("Error: end plane number out of range");
  135.       MovieDia.Stop = 1; return;}
  136. /* OK, save */
  137.   MovieDia.EndPlane = itemp;
  138. } /* end ReadEndPlaneCB */
  139.  
  140. void ReadDwellCB (Widget w, XtPointer clientData, XtPointer callData)
  141. /* get Dwell time */
  142. {
  143.   ImageDisplay *IDdata = (ImageDisplay *)clientData;
  144.   char     *value;
  145.   float    temp;
  146.  
  147. /* read value */
  148.   value = XmTextGetString (w);
  149.   if (!value) /* error */
  150.     {MessageShow ("Error Dwell time");
  151.      MovieDia.Stop = 1; return;}
  152.   if (!sscanf (value, "%e", &temp))
  153.    { /* error */
  154.      MessageShow ("Error Dwell time");
  155.      if (value) XtFree(value);
  156.      MovieDia.Stop = 1; return;}
  157.   if (value) XtFree(value);
  158.   if (MovieDia.Dwell<0.0) MovieDia.Dwell = 0.0;  /* constrain */
  159.   if (MovieDia.Dwell>100.0) MovieDia.Dwell = 100.0;
  160. /* OK, save */
  161.   MovieDia.Dwell = temp;
  162. } /* end ReadDwellCB */
  163.  
  164. void MovieLabelPlane(void)
  165. {
  166.   char axtype[9], label[20], string[30];
  167.   double value;
  168.   XmString     WierdString;
  169.  
  170.    /* value label */
  171.   strncpy(axtype, image[CurImag].cname[2]->sp, 8); 
  172.   axtype[8] = 0;
  173.   value = image[CurImag].crval[2] + 
  174.     (MovieDia.CurPlane - image[CurImag].crpix[2]) * 
  175.       image[CurImag].crinc[2];  /* assume linear */
  176.   AxisLabel(value, axtype, label);  /* human readable */
  177.   sprintf (string,"    %s",label);
  178.   WierdString = XmStringCreateSimple (string);
  179.   XtVaSetValues(MovieDia.PlaneLabel, 
  180.         XmNlabelString,   WierdString,
  181.         NULL);
  182.   XmStringFree(WierdString);
  183. } /* end MovieLabelPlane */
  184.  
  185. void MovieLoadPlane (void)
  186. /* Load plane CurPlane */
  187. {
  188.   XmString     WierdString;
  189.   char         valuestr[30];
  190.  
  191. /* make sure CurPlane in range */
  192.   if (MovieDia.EndPlane<MovieDia.StartPlane) 
  193.     MovieDia.EndPlane = MovieDia.StartPlane;
  194.   if (MovieDia.CurPlane>=image[CurImag].iNumPlanes) 
  195.     MovieDia.CurPlane = image[CurImag].iNumPlanes-1;
  196.   if (MovieDia.CurPlane<0)  MovieDia.CurPlane = 0;
  197.  
  198. /* load CurPlane */
  199.   if (!image[CurImag].valid) return;  /* tests for valid image */
  200.   if (!image[CurImag].FileName) return;  /* tests for valid name */
  201.   if (!image[CurImag].FileName->sp) return;
  202.   if (!image[CurImag].FileName->length) return;
  203.   image[CurImag].PlaneNo = MovieDia.CurPlane;
  204.  
  205.   if (FITS2Pix (&image[CurImag], MovieDia.BoxData, 0))
  206.     {/* error */
  207.       sprintf (szErrMess, "Error reading FITS file = %s", 
  208.         image[CurImag].FileName->sp);
  209.       MessageShow (szErrMess);}
  210.  
  211. /*  display */
  212.   PaintImage(MovieDia.BoxData);
  213.  
  214. /* update labels */
  215.   XtVaSetValues(MovieDia.PlaneScroll, 
  216.         XmNvalue,       MovieDia.CurPlane+1,
  217.         NULL);
  218.   sprintf (valuestr, "    Plane no. %d", MovieDia.CurPlane+1);
  219.   WierdString = XmStringCreateSimple (valuestr);
  220.   XtVaSetValues(MovieDia.PlaneScrollLabel, 
  221.         XmNlabelString,   WierdString,
  222.         NULL);
  223.   XmStringFree(WierdString);
  224.   MovieLabelPlane();
  225. } /* end MovieLoadPlane */
  226.  
  227. void MovieScrollPlaneCB (Widget w, XtPointer clientData, XtPointer callData)
  228. {
  229. /* scroll bar used to select plane */
  230.     ImageDisplay *IDdata = (ImageDisplay *)clientData;
  231.     XmScrollBarCallbackStruct *call_data = 
  232.       (XmScrollBarCallbackStruct *) callData;
  233.  
  234. /* read value of scrollbar */
  235.     MovieDia.CurPlane = call_data->value-1; /* 0 rel */
  236.  
  237. /* Show selected plane */
  238.     MovieLoadPlane();
  239. } /* end MovieScrollPlaneCB */
  240.  
  241. void MoviePlay (Widget w, XtPointer clientData, XtPointer callData)
  242. /* Display next plane and set next call */
  243. {
  244.   unsigned long interval, min_int;
  245.   XtIntervalId  timer;
  246.   int           count, i;
  247.  
  248.  /* Done? */
  249.   if (MovieDia.Stop) return; /* stop button */
  250.   if (MovieDia.CurPlane>=MovieDia.EndPlane) 
  251.     {MovieDia.Stop = 1; return;} /* done ?*/
  252.   if (MovieCheckStop()) return;
  253.   MovieDia.CurPlane++; /* next plane */
  254.  
  255. /* let server catch up */
  256. /*  XSynchronize(XtDisplay(MovieDia.dialog), True);*/
  257.  
  258. /* start timer */
  259.   interval = 1000.0 * MovieDia.Dwell;
  260.   timer = XtAppAddTimeOut(MovieDia.BoxData->app, interval, 
  261.           (XtTimerCallbackProc)MoviePlay, NULL);
  262. /*  fprintf (stderr,"MoviePlay: events pending = %d\n",
  263.        XPending(XtDisplay(MovieDia.dialog)));*/
  264. /* show next plane */
  265.   MovieLoadPlane();
  266.  
  267. } /* end MoviePlay */
  268.  
  269. /* button callbacks */
  270. void MoviePlayButCB (Widget w, XtPointer clientData, XtPointer callData)
  271. /* Play button hit */
  272. {
  273.   unsigned long interval;
  274.   Display *dpy = XtDisplay(w);
  275.  
  276. /* ignore if it's already running */
  277.   if (MovieDia.Stop==0) return;
  278.  
  279.   MovieDia.Stop = 0; /* indicate movie in progress */
  280.  
  281. /* get instructions */
  282.   ReadStartPlaneCB (MovieDia.start, (XtPointer)MovieDia.BoxData, NULL);
  283.   ReadEndPlaneCB (MovieDia.end, (XtPointer)MovieDia.BoxData, NULL);
  284.   ReadDwellCB (MovieDia.dwell, (XtPointer)MovieDia.BoxData, NULL);
  285.  
  286. /* see if any of the read routines has turned off the movie */
  287.   if (MovieDia.Stop) {
  288.     XBell(dpy, 50); 
  289.     return;}
  290.  
  291. /* start movie here */
  292.   MovieDia.CurPlane = MovieDia.StartPlane-1;
  293.  
  294.   MoviePlay (w, clientData, callData); /* first plane */
  295. } /* end MoviePlayButCB */
  296.  
  297. void MovieQuitButCB (Widget w, XtPointer clientData, XtPointer callData)
  298. /* Quit button hit */
  299. {
  300. /* if it's running just stop the movie */
  301.   if (MovieDia.Stop==0) 
  302.     {MovieDia.Stop = 1; return;}
  303.  
  304. /* I could just die */
  305.   XtDestroyWidget (MovieDia.dialog); /* your wish is granted */
  306.   MovieBoxActive = 0; /* mark as inactive */
  307. } /* end MovieQuitButCB */
  308.  
  309. void MovieStopButCB (Widget w, XtPointer clientData, XtPointer callData)
  310. /* Stop button hit */
  311. {
  312.   MovieDia.Stop = 1; /* leave marker */
  313.  
  314. } /* end MovieStopButCB */
  315.  
  316. void MovieBoxCB (Widget parent, XtPointer clientData, XtPointer callData)
  317. /* create dialog box for "Movie" display of planes */
  318. /* client data is ImageDisplay pointer */
  319. {
  320.   Widget form, label1, label2, label3, ScrollLab, PlaneLab;
  321.   Widget StartPla, EndPla, Dwell;
  322.   Widget PlayButton, QuitButton;
  323.   XmString     StartLab = NULL;
  324.   XmString     EndLab   = NULL;
  325.   XmString     DwellLab = NULL;
  326.   XmString     WierdString = NULL;
  327.   char         valuestr[30];
  328.   ImageDisplay *IDdata = (ImageDisplay*)clientData;
  329.   int          start, hiPlane;
  330.   short        xpos, ypos;
  331.   int          value, increment, slider_size, page_increment;
  332.  
  333.  
  334. /* register IDdata */
  335.   MovieDia.BoxData = IDdata;
  336.  
  337.   /* don't make another one */
  338.   if (MovieBoxActive) {
  339.     if (XtIsRealized (MovieDia.dialog))
  340.     XMapRaised (XtDisplay(IDdata->shell), XtWindow(MovieDia.dialog));
  341.     return;
  342.   }
  343.   StartLab = XmStringCreateSimple ("Planes");
  344.   EndLab   = XmStringCreateSimple ("to");
  345.   DwellLab = XmStringCreateSimple ("Dwell (sec)");
  346. /* mark as active */
  347.   MovieBoxActive = 1;
  348.  
  349.  
  350. /* other initialization */
  351.   MovieDia.CurPlane = image[CurImag].PlaneNo;
  352.   MovieDia.StartPlane = 1;
  353.   MovieDia.EndPlane = image[CurImag].iNumPlanes;
  354.   if (MovieDia.EndPlane<MovieDia.StartPlane) 
  355.     MovieDia.EndPlane = MovieDia.StartPlane;
  356.   MovieDia.Dwell = 1.0;
  357.   MovieDia.Stop = 1;
  358.   hiPlane = MovieDia.EndPlane+1;
  359.   if (hiPlane == MovieDia.StartPlane) hiPlane++;
  360.  
  361.   MovieDia.dialog = XtVaCreatePopupShell ("MovieBox",
  362.                  xmDialogShellWidgetClass, 
  363.                  IDdata->shell, 
  364.                  XmNautoUnmanage, False,
  365.                  XmNwidth,     150,
  366.                  XmNheight,    230,
  367.                  XmNdeleteResponse, XmDESTROY,
  368.                  NULL);
  369.  
  370. /* make Form widget to stick things on */
  371.   form = XtVaCreateManagedWidget ("MovieForm", xmFormWidgetClass,
  372.                   MovieDia.dialog,
  373.                   XmNautoUnmanage, False,
  374.                   XmNwidth,     150,
  375.                   XmNheight,    230,
  376.                   XmNx,           0,
  377.                   XmNy,           0,
  378.                   NULL);
  379.  
  380. /* Play button */
  381.   PlayButton = XtVaCreateManagedWidget (" Play ", xmPushButtonWidgetClass, 
  382.                     form, 
  383.                     XmNtopAttachment, XmATTACH_FORM,
  384.                     XmNleftAttachment,  XmATTACH_FORM,
  385.                     NULL);
  386.   XtAddCallback (PlayButton, XmNactivateCallback, MoviePlayButCB, 
  387.          (XtPointer)IDdata);
  388.  
  389. /* Stop button */
  390.   MovieDia.StopButton = XtVaCreateManagedWidget (" Stop ", 
  391.                     xmPushButtonWidgetClass, 
  392.                     form, 
  393.                     XmNtopAttachment, XmATTACH_FORM,
  394.                     XmNrightAttachment, XmATTACH_FORM,
  395.                     NULL);
  396.   XtAddCallback (MovieDia.StopButton, XmNactivateCallback, MovieStopButCB, 
  397.          (XtPointer)IDdata);
  398.  
  399. /* start Plane */
  400.   sprintf (valuestr, "%d", MovieDia.StartPlane);
  401.   MovieDia.start = XtVaCreateManagedWidget ("MovieStartPlane", 
  402.                                     xmTextFieldWidgetClass, 
  403.                     form, 
  404.                     XmNwidth,           75,
  405.                     XmNvalue,   valuestr,
  406.                     XmNtopAttachment, XmATTACH_WIDGET,
  407.                     XmNtopWidget,     MovieDia.StopButton,
  408.                     XmNrightAttachment,  XmATTACH_FORM,
  409.                     NULL);
  410.   label1 = XtVaCreateManagedWidget ("MovieStartLabel", xmLabelWidgetClass, 
  411.                     form, 
  412.                     XmNwidth,           75,
  413.                     XmNheight,          30,
  414.                     XmNlabelString,   StartLab,
  415.                     XmNtopAttachment, XmATTACH_WIDGET,
  416.                                     XmNtopWidget,      PlayButton,
  417.                     XmNleftAttachment,  XmATTACH_FORM,
  418.                     NULL);
  419.  
  420. /* end Plane */
  421.   sprintf (valuestr, "%d", MovieDia.EndPlane);
  422.   MovieDia.end = XtVaCreateManagedWidget ("MovieEndPlane", 
  423.                                     xmTextFieldWidgetClass, 
  424.                     form, 
  425.                     XmNwidth,           75,
  426.                     XmNvalue,   valuestr,
  427.                     XmNtopAttachment, XmATTACH_WIDGET,
  428.                     XmNtopWidget,     MovieDia.start,
  429.                     XmNrightAttachment,  XmATTACH_FORM,
  430.                     NULL);
  431.   label2 = XtVaCreateManagedWidget ("MovieEndLabel", xmLabelWidgetClass, 
  432.                     form, 
  433.                     XmNwidth,           75,
  434.                     XmNheight,          30,
  435.                     XmNlabelString,   EndLab,
  436.                     XmNtopAttachment, XmATTACH_WIDGET,
  437.                                     XmNtopWidget,      MovieDia.start,
  438.                     XmNleftAttachment,  XmATTACH_FORM,
  439.                     NULL);
  440.  
  441. /* Dwell */
  442.   sprintf (valuestr, "%f", MovieDia.Dwell);
  443.   MovieDia.dwell = XtVaCreateManagedWidget ("MovieDwell", 
  444.                                     xmTextFieldWidgetClass, 
  445.                     form, 
  446.                     XmNwidth,           75,
  447.                     XmNvalue,   valuestr,
  448.                     XmNtopAttachment, XmATTACH_WIDGET,
  449.                     XmNtopWidget,     MovieDia.end,
  450.                     XmNrightAttachment,  XmATTACH_FORM,
  451.                     NULL);
  452.  
  453.   label3 = XtVaCreateManagedWidget ("MovieDwellLabel", xmLabelWidgetClass, 
  454.                     form, 
  455.                     XmNwidth,           75,
  456.                     XmNheight,          30,
  457.                     XmNlabelString,   DwellLab,
  458.                     XmNtopAttachment, XmATTACH_WIDGET,
  459.                                     XmNtopWidget,      MovieDia.end,
  460.                     XmNleftAttachment,  XmATTACH_FORM,
  461.                     NULL);
  462. /* plane scroll */
  463.   slider_size = hiPlane/10; if (slider_size<1) slider_size = 1;
  464.   value = MovieDia.CurPlane+1;
  465.   increment = 1;
  466.   page_increment = hiPlane/10; if (page_increment<1) page_increment = 1;
  467.   MovieDia.PlaneScroll = XtVaCreateManagedWidget ("MoviePlaneScroll", 
  468.                                     xmScrollBarWidgetClass, 
  469.                     form,
  470.                     XmNwidth,            150,
  471.                     XmNheight,           20,
  472.                     XmNmaximum,    hiPlane+slider_size,
  473.                     XmNminimum,           1,
  474.                     XmNvalue,       MovieDia.CurPlane+1,
  475.                     XmNshowValue,       True,
  476.                     XmNorientation, XmHORIZONTAL,
  477.                     XmNprocessingDirection, XmMAX_ON_RIGHT,
  478.                     XmNleftAttachment,  XmATTACH_FORM,
  479.                     XmNtopAttachment, XmATTACH_WIDGET,
  480.                     XmNtopWidget,     MovieDia.dwell,
  481.                     XmNtopOffset,            10,
  482.                     NULL);
  483.   XmScrollBarSetValues (MovieDia.PlaneScroll, value, slider_size, 
  484.             increment, page_increment, False);
  485.  
  486.   XtAddCallback(MovieDia.PlaneScroll, XmNvalueChangedCallback, 
  487.                 MovieScrollPlaneCB, (XtPointer)IDdata);
  488.  
  489. /* scroll label */
  490.   sprintf (valuestr, "    Plane no. %d", MovieDia.CurPlane+1);
  491.   WierdString = XmStringCreateSimple (valuestr);
  492.   MovieDia.PlaneScrollLabel = XtVaCreateManagedWidget ("MovieScrollLabel", 
  493.                                     xmLabelWidgetClass, 
  494.                     form, 
  495.                     XmNwidth,           150,
  496.                     XmNtopAttachment, XmATTACH_WIDGET,
  497.                     XmNtopWidget,     MovieDia.PlaneScroll,
  498.                     XmNtopOffset,            10,
  499.                     XmNleftAttachment,  XmATTACH_FORM,
  500.                     NULL);
  501.   XtVaSetValues(MovieDia.PlaneScrollLabel, 
  502.         XmNlabelString,   WierdString,
  503.         NULL);
  504.  
  505. /* plane value label */
  506.   sprintf (valuestr, "Plane value label");
  507.   XmStringFree(WierdString);
  508.   WierdString = XmStringCreateSimple (valuestr);
  509.   MovieDia.PlaneLabel = XtVaCreateManagedWidget ("MoviePlaneLabel", 
  510.                                     xmLabelWidgetClass, 
  511.                     form, 
  512.                     XmNwidth,           150,
  513.                     XmNlabelString,   WierdString,
  514.                     XmNtopAttachment, XmATTACH_WIDGET,
  515.                     XmNtopWidget,  MovieDia.PlaneScrollLabel,
  516.                     XmNleftAttachment,  XmATTACH_FORM,
  517.                     NULL);
  518.   MovieLabelPlane(); /* fill in actual value */
  519.  
  520. /* Quit button */
  521.   QuitButton = XtVaCreateManagedWidget ("Quit", xmPushButtonWidgetClass, 
  522.                     form, 
  523.                     XmNbottomAttachment, XmATTACH_FORM,
  524.                     XmNrightAttachment, XmATTACH_FORM,
  525.                     NULL);
  526.   XtAddCallback (QuitButton, XmNactivateCallback, MovieQuitButCB, 
  527.          (XtPointer)IDdata);
  528.  
  529.   if (WierdString) XmStringFree(WierdString);
  530.   if (StartLab) XmStringFree(StartLab);
  531.   if (EndLab) XmStringFree(EndLab);
  532.   if (DwellLab) XmStringFree(DwellLab);
  533.  
  534. /* set it up */
  535.   XtManageChild (MovieDia.dialog);
  536.  
  537. /* put it some place reasonable */
  538. /*  where is parent? */
  539.      XtVaGetValues (IDdata->shell,
  540.             XmNx, &xpos,
  541.             XmNy, &ypos,
  542.             NULL);
  543.   ypos += 160;
  544.   if (xpos<0) xpos = 0;
  545.   XMoveWindow (XtDisplay(IDdata->shell), XtWindow(MovieDia.dialog), 
  546.            xpos, ypos);
  547.   MovieDia.window = XtWindow(MovieDia.StopButton); /* save Stop Button window */
  548. } /* end MovieBox */
  549.  
  550.