xref: /petsc/src/sys/classes/draw/interface/draw.c (revision 8a690491e6c6c591ad1bff5657f43271c38b9863)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
45c6c1daeSBarry Smith */
5af0996ceSBarry Smith #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
6665c2dedSJed Brown #include <petscviewer.h>
75c6c1daeSBarry Smith 
85c6c1daeSBarry Smith PetscClassId PETSC_DRAW_CLASSID;
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith static PetscBool PetscDrawPackageInitialized = PETSC_FALSE;
115c6c1daeSBarry Smith /*@C
125c6c1daeSBarry Smith   PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the Draw package. It is
135c6c1daeSBarry Smith   called from PetscFinalize().
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith   Level: developer
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith .keywords: Petsc, destroy, package, mathematica
185c6c1daeSBarry Smith .seealso: PetscFinalize()
195c6c1daeSBarry Smith @*/
205c6c1daeSBarry Smith PetscErrorCode  PetscDrawFinalizePackage(void)
215c6c1daeSBarry Smith {
2237e93019SBarry Smith   PetscErrorCode ierr;
2337e93019SBarry Smith 
245c6c1daeSBarry Smith   PetscFunctionBegin;
2537e93019SBarry Smith   ierr = PetscFunctionListDestroy(&PetscDrawList);CHKERRQ(ierr);
265c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_FALSE;
270f51fdf8SToby Isaac   PetscDrawRegisterAllCalled  = PETSC_FALSE;
285c6c1daeSBarry Smith   PetscFunctionReturn(0);
295c6c1daeSBarry Smith }
305c6c1daeSBarry Smith 
315c6c1daeSBarry Smith /*@C
325c6c1daeSBarry Smith   PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called
33*8a690491SBarry Smith   from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to PetscInitialize()
34*8a690491SBarry Smith   when using shared or static libraries.
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith   Level: developer
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith .keywords: Petsc, initialize, package
395c6c1daeSBarry Smith .seealso: PetscInitialize()
405c6c1daeSBarry Smith @*/
41607a6623SBarry Smith PetscErrorCode  PetscDrawInitializePackage(void)
425c6c1daeSBarry Smith {
435c6c1daeSBarry Smith   char           logList[256];
448e81d068SLisandro Dalcin   PetscBool      opt,pkg;
455c6c1daeSBarry Smith   PetscErrorCode ierr;
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith   PetscFunctionBegin;
485c6c1daeSBarry Smith   if (PetscDrawPackageInitialized) PetscFunctionReturn(0);
495c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_TRUE;
505c6c1daeSBarry Smith   /* Register Classes */
515c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID);CHKERRQ(ierr);
5271917b75SLisandro Dalcin   ierr = PetscClassIdRegister("Draw Axis",&PETSC_DRAWAXIS_CLASSID);CHKERRQ(ierr);
535c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID);CHKERRQ(ierr);
545c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID);CHKERRQ(ierr);
5571917b75SLisandro Dalcin   ierr = PetscClassIdRegister("Bar Graph",&PETSC_DRAWBAR_CLASSID);CHKERRQ(ierr);
565c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID);CHKERRQ(ierr);
575c6c1daeSBarry Smith   /* Register Constructors */
58607a6623SBarry Smith   ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
595c6c1daeSBarry Smith   /* Process info exclusions */
608e81d068SLisandro Dalcin   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
615c6c1daeSBarry Smith   if (opt) {
628e81d068SLisandro Dalcin     ierr = PetscStrInList("draw",logList,',',&pkg);CHKERRQ(ierr);
638e81d068SLisandro Dalcin     if (pkg) {
648e81d068SLisandro Dalcin       ierr = PetscInfoDeactivateClass(PETSC_DRAW_CLASSID);CHKERRQ(ierr);
658e81d068SLisandro Dalcin       ierr = PetscInfoDeactivateClass(PETSC_DRAWAXIS_CLASSID);CHKERRQ(ierr);
668e81d068SLisandro Dalcin       ierr = PetscInfoDeactivateClass(PETSC_DRAWLG_CLASSID);CHKERRQ(ierr);
678e81d068SLisandro Dalcin       ierr = PetscInfoDeactivateClass(PETSC_DRAWHG_CLASSID);CHKERRQ(ierr);
688e81d068SLisandro Dalcin       ierr = PetscInfoDeactivateClass(PETSC_DRAWBAR_CLASSID);CHKERRQ(ierr);
698e81d068SLisandro Dalcin       ierr = PetscInfoDeactivateClass(PETSC_DRAWSP_CLASSID);CHKERRQ(ierr);
705c6c1daeSBarry Smith     }
715c6c1daeSBarry Smith   }
725c6c1daeSBarry Smith   /* Process summary exclusions */
738e81d068SLisandro Dalcin   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
745c6c1daeSBarry Smith   if (opt) {
758e81d068SLisandro Dalcin     ierr = PetscStrInList("draw",logList,',',&pkg);CHKERRQ(ierr);
768e81d068SLisandro Dalcin     if (pkg) {
77fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAW_CLASSID);CHKERRQ(ierr);
78fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID);CHKERRQ(ierr);
79fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID);CHKERRQ(ierr);
80fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID);CHKERRQ(ierr);
81fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID);CHKERRQ(ierr);
82fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID);CHKERRQ(ierr);
835c6c1daeSBarry Smith     }
845c6c1daeSBarry Smith   }
858e81d068SLisandro Dalcin   /* Register package finalizer */
865c6c1daeSBarry Smith   ierr = PetscRegisterFinalize(PetscDrawFinalizePackage);CHKERRQ(ierr);
875c6c1daeSBarry Smith   PetscFunctionReturn(0);
885c6c1daeSBarry Smith }
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith /*@
915c6c1daeSBarry Smith    PetscDrawResizeWindow - Allows one to resize a window from a program.
925c6c1daeSBarry Smith 
935c6c1daeSBarry Smith    Collective on PetscDraw
945c6c1daeSBarry Smith 
955c6c1daeSBarry Smith    Input Parameter:
965c6c1daeSBarry Smith +  draw - the window
975c6c1daeSBarry Smith -  w,h - the new width and height of the window
985c6c1daeSBarry Smith 
995c6c1daeSBarry Smith    Level: intermediate
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith .seealso: PetscDrawCheckResizedWindow()
1025c6c1daeSBarry Smith @*/
1035c6c1daeSBarry Smith PetscErrorCode  PetscDrawResizeWindow(PetscDraw draw,int w,int h)
1045c6c1daeSBarry Smith {
1055c6c1daeSBarry Smith   PetscErrorCode ierr;
1065fd66863SKarl Rupp 
1075c6c1daeSBarry Smith   PetscFunctionBegin;
10873ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
10973ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,w,2);
11073ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,h,3);
1115c6c1daeSBarry Smith   if (draw->ops->resizewindow) {
1125c6c1daeSBarry Smith     ierr = (*draw->ops->resizewindow)(draw,w,h);CHKERRQ(ierr);
1135c6c1daeSBarry Smith   }
1145c6c1daeSBarry Smith   PetscFunctionReturn(0);
1155c6c1daeSBarry Smith }
1165c6c1daeSBarry Smith 
11773ecf448SLisandro Dalcin /*@
11873ecf448SLisandro Dalcin    PetscDrawGetWindowSize - Gets the size of the window.
11973ecf448SLisandro Dalcin 
12073ecf448SLisandro Dalcin    Not collective
12173ecf448SLisandro Dalcin 
12273ecf448SLisandro Dalcin    Input Parameter:
12373ecf448SLisandro Dalcin .  draw - the window
12473ecf448SLisandro Dalcin 
12573ecf448SLisandro Dalcin    Output Parameters:
12673ecf448SLisandro Dalcin .  w,h - the window width and height
12773ecf448SLisandro Dalcin 
12873ecf448SLisandro Dalcin    Level: intermediate
12973ecf448SLisandro Dalcin 
13073ecf448SLisandro Dalcin .seealso: PetscDrawResizeWindow(), PetscDrawCheckResizedWindow()
13173ecf448SLisandro Dalcin @*/
13273ecf448SLisandro Dalcin PetscErrorCode  PetscDrawGetWindowSize(PetscDraw draw,int *w,int *h)
13373ecf448SLisandro Dalcin {
13473ecf448SLisandro Dalcin   PetscFunctionBegin;
13573ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
13673ecf448SLisandro Dalcin   if (w) PetscValidPointer(w,2);
13773ecf448SLisandro Dalcin   if (h) PetscValidPointer(h,3);
13873ecf448SLisandro Dalcin   if (w) *w = draw->w;
13973ecf448SLisandro Dalcin   if (h) *h = draw->h;
14073ecf448SLisandro Dalcin   PetscFunctionReturn(0);
14173ecf448SLisandro Dalcin }
14273ecf448SLisandro Dalcin 
1435c6c1daeSBarry Smith /*@
1445c6c1daeSBarry Smith    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
1455c6c1daeSBarry Smith 
1465c6c1daeSBarry Smith    Collective on PetscDraw
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith    Input Parameter:
1495c6c1daeSBarry Smith .  draw - the window
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith    Level: advanced
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith .seealso: PetscDrawResizeWindow()
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith @*/
1565c6c1daeSBarry Smith PetscErrorCode  PetscDrawCheckResizedWindow(PetscDraw draw)
1575c6c1daeSBarry Smith {
1585c6c1daeSBarry Smith   PetscErrorCode ierr;
1595fd66863SKarl Rupp 
1605c6c1daeSBarry Smith   PetscFunctionBegin;
16173ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1625c6c1daeSBarry Smith   if (draw->ops->checkresizedwindow) {
1635c6c1daeSBarry Smith     ierr = (*draw->ops->checkresizedwindow)(draw);CHKERRQ(ierr);
1645c6c1daeSBarry Smith   }
1655c6c1daeSBarry Smith   PetscFunctionReturn(0);
1665c6c1daeSBarry Smith }
1675c6c1daeSBarry Smith 
1685c6c1daeSBarry Smith /*@C
1695c6c1daeSBarry Smith    PetscDrawGetTitle - Gets pointer to title of a PetscDraw context.
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith    Not collective
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith    Input Parameter:
1745c6c1daeSBarry Smith .  draw - the graphics context
1755c6c1daeSBarry Smith 
1765c6c1daeSBarry Smith    Output Parameter:
1775c6c1daeSBarry Smith .  title - the title
1785c6c1daeSBarry Smith 
1795c6c1daeSBarry Smith    Level: intermediate
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith .seealso: PetscDrawSetTitle()
1825c6c1daeSBarry Smith @*/
183f60c72e3SLisandro Dalcin PetscErrorCode  PetscDrawGetTitle(PetscDraw draw,const char *title[])
1845c6c1daeSBarry Smith {
1855c6c1daeSBarry Smith   PetscFunctionBegin;
1865c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1875c6c1daeSBarry Smith   PetscValidPointer(title,2);
1885c6c1daeSBarry Smith   *title = draw->title;
1895c6c1daeSBarry Smith   PetscFunctionReturn(0);
1905c6c1daeSBarry Smith }
1915c6c1daeSBarry Smith 
1925c6c1daeSBarry Smith /*@C
1935c6c1daeSBarry Smith    PetscDrawSetTitle - Sets the title of a PetscDraw context.
1945c6c1daeSBarry Smith 
1955b399a63SLisandro Dalcin    Collective on PetscDraw
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith    Input Parameters:
1985c6c1daeSBarry Smith +  draw - the graphics context
1995c6c1daeSBarry Smith -  title - the title
2005c6c1daeSBarry Smith 
2015c6c1daeSBarry Smith    Level: intermediate
2025c6c1daeSBarry Smith 
203231a95f8SBarry Smith    Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save
204231a95f8SBarry Smith    in the image.
205231a95f8SBarry Smith 
2065c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
2075c6c1daeSBarry Smith    title string after calling this routine.
2085c6c1daeSBarry Smith 
209231a95f8SBarry Smith    You can use PetscDrawAxisSetLabels() to indicate a title within the window
210231a95f8SBarry Smith 
2115c6c1daeSBarry Smith .seealso: PetscDrawGetTitle(), PetscDrawAppendTitle()
2125c6c1daeSBarry Smith @*/
2135c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetTitle(PetscDraw draw,const char title[])
2145c6c1daeSBarry Smith {
2155c6c1daeSBarry Smith   PetscErrorCode ierr;
2165fd66863SKarl Rupp 
2175c6c1daeSBarry Smith   PetscFunctionBegin;
2185c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2195c6c1daeSBarry Smith   PetscValidCharPointer(title,2);
2205c6c1daeSBarry Smith   ierr = PetscFree(draw->title);CHKERRQ(ierr);
2215c6c1daeSBarry Smith   ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
2225c6c1daeSBarry Smith   if (draw->ops->settitle) {
223815f00f0SLisandro Dalcin     ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr);
2245c6c1daeSBarry Smith   }
2255c6c1daeSBarry Smith   PetscFunctionReturn(0);
2265c6c1daeSBarry Smith }
2275c6c1daeSBarry Smith 
2285c6c1daeSBarry Smith /*@C
2295c6c1daeSBarry Smith    PetscDrawAppendTitle - Appends to the title of a PetscDraw context.
2305c6c1daeSBarry Smith 
2315b399a63SLisandro Dalcin    Collective on PetscDraw
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith    Input Parameters:
2345c6c1daeSBarry Smith +  draw - the graphics context
2355c6c1daeSBarry Smith -  title - the title
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith    Note:
2385c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
2395c6c1daeSBarry Smith    title string after calling this routine.
2405c6c1daeSBarry Smith 
2415c6c1daeSBarry Smith    Level: advanced
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith .seealso: PetscDrawSetTitle(), PetscDrawGetTitle()
2445c6c1daeSBarry Smith @*/
2455c6c1daeSBarry Smith PetscErrorCode  PetscDrawAppendTitle(PetscDraw draw,const char title[])
2465c6c1daeSBarry Smith {
2475c6c1daeSBarry Smith   PetscErrorCode ierr;
2485c6c1daeSBarry Smith 
2495c6c1daeSBarry Smith   PetscFunctionBegin;
2505c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2515b399a63SLisandro Dalcin   if (title) PetscValidCharPointer(title,2);
2525b399a63SLisandro Dalcin   if (!title || !title[0]) PetscFunctionReturn(0);
2535c6c1daeSBarry Smith 
2545c6c1daeSBarry Smith   if (draw->title) {
2555b399a63SLisandro Dalcin     size_t len1,len2;
2565b399a63SLisandro Dalcin     char   *newtitle;
2575c6c1daeSBarry Smith     ierr = PetscStrlen(title,&len1);CHKERRQ(ierr);
2585c6c1daeSBarry Smith     ierr = PetscStrlen(draw->title,&len2);CHKERRQ(ierr);
2595b399a63SLisandro Dalcin     ierr = PetscMalloc1(len1 + len2 + 1,&newtitle);CHKERRQ(ierr);
2605c6c1daeSBarry Smith     ierr = PetscStrcpy(newtitle,draw->title);CHKERRQ(ierr);
2615c6c1daeSBarry Smith     ierr = PetscStrcat(newtitle,title);CHKERRQ(ierr);
2625c6c1daeSBarry Smith     ierr = PetscFree(draw->title);CHKERRQ(ierr);
2635c6c1daeSBarry Smith     draw->title = newtitle;
2645c6c1daeSBarry Smith   } else {
2655c6c1daeSBarry Smith     ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
2665c6c1daeSBarry Smith   }
2675c6c1daeSBarry Smith   if (draw->ops->settitle) {
2685c6c1daeSBarry Smith     ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr);
2695c6c1daeSBarry Smith   }
2705c6c1daeSBarry Smith   PetscFunctionReturn(0);
2715c6c1daeSBarry Smith }
2725c6c1daeSBarry Smith 
273e118a51fSLisandro Dalcin static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
274e118a51fSLisandro Dalcin {
275e118a51fSLisandro Dalcin   PetscErrorCode ierr;
276e118a51fSLisandro Dalcin 
277e118a51fSLisandro Dalcin   PetscFunctionBegin;
2788067a7d5SLisandro Dalcin   if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0);
27949c04938SLisandro Dalcin   ierr = PetscDrawSaveMovie(draw);CHKERRQ(ierr);
280e118a51fSLisandro Dalcin   if (draw->savefinalfilename) {
281df8d4941SLisandro Dalcin     draw->savesinglefile = PETSC_TRUE;
28249c04938SLisandro Dalcin     ierr = PetscDrawSetSave(draw,draw->savefinalfilename);CHKERRQ(ierr);
283e118a51fSLisandro Dalcin     ierr = PetscDrawSave(draw);CHKERRQ(ierr);
284e118a51fSLisandro Dalcin   }
285e118a51fSLisandro Dalcin   ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr);
286e118a51fSLisandro Dalcin   PetscFunctionReturn(0);
287e118a51fSLisandro Dalcin }
288e118a51fSLisandro Dalcin 
2895c6c1daeSBarry Smith /*@
2905c6c1daeSBarry Smith    PetscDrawDestroy - Deletes a draw context.
2915c6c1daeSBarry Smith 
2925c6c1daeSBarry Smith    Collective on PetscDraw
2935c6c1daeSBarry Smith 
2945c6c1daeSBarry Smith    Input Parameters:
2955c6c1daeSBarry Smith .  draw - the drawing context
2965c6c1daeSBarry Smith 
2975c6c1daeSBarry Smith    Level: beginner
2985c6c1daeSBarry Smith 
2995c6c1daeSBarry Smith .seealso: PetscDrawCreate()
3005c6c1daeSBarry Smith 
3015c6c1daeSBarry Smith @*/
3025c6c1daeSBarry Smith PetscErrorCode  PetscDrawDestroy(PetscDraw *draw)
3035c6c1daeSBarry Smith {
3045c6c1daeSBarry Smith   PetscErrorCode ierr;
3055fd66863SKarl Rupp 
3065c6c1daeSBarry Smith   PetscFunctionBegin;
3075c6c1daeSBarry Smith   if (!*draw) PetscFunctionReturn(0);
3085c6c1daeSBarry Smith   PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1);
3095c6c1daeSBarry Smith   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0);
3105c6c1daeSBarry Smith 
3115c6c1daeSBarry Smith   if ((*draw)->pause == -2) {
3125c6c1daeSBarry Smith     (*draw)->pause = -1;
3135c6c1daeSBarry Smith     ierr = PetscDrawPause(*draw);CHKERRQ(ierr);
3145c6c1daeSBarry Smith   }
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith   /* if memory was published then destroy it */
317e04113cfSBarry Smith   ierr = PetscObjectSAWsViewOff((PetscObject)*draw);CHKERRQ(ierr);
3185c6c1daeSBarry Smith 
319e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy_Private(*draw);CHKERRQ(ierr);
320e118a51fSLisandro Dalcin 
3215c6c1daeSBarry Smith   if ((*draw)->ops->destroy) {
3225c6c1daeSBarry Smith     ierr = (*(*draw)->ops->destroy)(*draw);CHKERRQ(ierr);
3235c6c1daeSBarry Smith   }
324e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*draw)->popup);CHKERRQ(ierr);
3255c6c1daeSBarry Smith   ierr = PetscFree((*draw)->title);CHKERRQ(ierr);
3265c6c1daeSBarry Smith   ierr = PetscFree((*draw)->display);CHKERRQ(ierr);
3275c6c1daeSBarry Smith   ierr = PetscFree((*draw)->savefilename);CHKERRQ(ierr);
3288067a7d5SLisandro Dalcin   ierr = PetscFree((*draw)->saveimageext);CHKERRQ(ierr);
3298067a7d5SLisandro Dalcin   ierr = PetscFree((*draw)->savemovieext);CHKERRQ(ierr);
330287de1a7SBarry Smith   ierr = PetscFree((*draw)->savefinalfilename);CHKERRQ(ierr);
3315c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(draw);CHKERRQ(ierr);
3325c6c1daeSBarry Smith   PetscFunctionReturn(0);
3335c6c1daeSBarry Smith }
3345c6c1daeSBarry Smith 
3355c6c1daeSBarry Smith /*@
3365c6c1daeSBarry Smith    PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
3375c6c1daeSBarry Smith 
3385c6c1daeSBarry Smith    Collective on PetscDraw
3395c6c1daeSBarry Smith 
3405c6c1daeSBarry Smith    Input Parameter:
3415c6c1daeSBarry Smith .  draw - the original window
3425c6c1daeSBarry Smith 
3435c6c1daeSBarry Smith    Output Parameter:
3445c6c1daeSBarry Smith .  popup - the new popup window
3455c6c1daeSBarry Smith 
3465c6c1daeSBarry Smith    Level: advanced
3475c6c1daeSBarry Smith 
348ba1e01c4SBarry Smith .seealso: PetscDrawScalePopup(), PetscDrawCreate()
349ba1e01c4SBarry Smith 
3505c6c1daeSBarry Smith @*/
3515c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup)
3525c6c1daeSBarry Smith {
3535c6c1daeSBarry Smith   PetscErrorCode ierr;
3545fd66863SKarl Rupp 
3555c6c1daeSBarry Smith   PetscFunctionBegin;
3565c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3575c6c1daeSBarry Smith   PetscValidPointer(popup,2);
3585c6c1daeSBarry Smith 
359a297a907SKarl Rupp   if (draw->popup) *popup = draw->popup;
360a297a907SKarl Rupp   else if (draw->ops->getpopup) {
3615c6c1daeSBarry Smith     ierr = (*draw->ops->getpopup)(draw,popup);CHKERRQ(ierr);
3620b874712SBarry Smith     if (*popup) {
3630b874712SBarry Smith       ierr = PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");CHKERRQ(ierr);
364e118a51fSLisandro Dalcin       (*popup)->pause = 0.0;
3650b874712SBarry Smith       ierr = PetscDrawSetFromOptions(*popup);CHKERRQ(ierr);
36661f59835SBarry Smith     }
3670298fd71SBarry Smith   } else *popup = NULL;
3685c6c1daeSBarry Smith   PetscFunctionReturn(0);
3695c6c1daeSBarry Smith }
3705c6c1daeSBarry Smith 
37194ef8ddeSSatish Balay /*@C
3725c6c1daeSBarry Smith   PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith   Input Parameter:
3755c6c1daeSBarry Smith + draw - the drawing context
3765c6c1daeSBarry Smith - display - the X windows display
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith   Level: advanced
3795c6c1daeSBarry Smith 
380ba1e01c4SBarry Smith .seealso: PetscDrawCreate()
381ba1e01c4SBarry Smith 
3825c6c1daeSBarry Smith @*/
3835c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetDisplay(PetscDraw draw,const char display[])
3845c6c1daeSBarry Smith {
3855c6c1daeSBarry Smith   PetscErrorCode ierr;
3865c6c1daeSBarry Smith 
3875c6c1daeSBarry Smith   PetscFunctionBegin;
3885c6c1daeSBarry Smith   ierr = PetscFree(draw->display);CHKERRQ(ierr);
3895c6c1daeSBarry Smith   ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
3905c6c1daeSBarry Smith   PetscFunctionReturn(0);
3915c6c1daeSBarry Smith }
3925c6c1daeSBarry Smith 
39345f3bb6eSLisandro Dalcin 
39445f3bb6eSLisandro Dalcin /*@
39545f3bb6eSLisandro Dalcin    PetscDrawSetDoubleBuffer - Sets a window to be double buffered.
39645f3bb6eSLisandro Dalcin 
39745f3bb6eSLisandro Dalcin    Logically Collective on PetscDraw
3985c6c1daeSBarry Smith 
3995c6c1daeSBarry Smith    Input Parameter:
40045f3bb6eSLisandro Dalcin .  draw - the drawing context
40145f3bb6eSLisandro Dalcin 
40245f3bb6eSLisandro Dalcin    Level: intermediate
40345f3bb6eSLisandro Dalcin 
40445f3bb6eSLisandro Dalcin    Concepts: drawing^double buffer
40545f3bb6eSLisandro Dalcin    Concepts: graphics^double buffer
40645f3bb6eSLisandro Dalcin    Concepts: double buffer
40745f3bb6eSLisandro Dalcin 
40845f3bb6eSLisandro Dalcin @*/
40945f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawSetDoubleBuffer(PetscDraw draw)
4105c6c1daeSBarry Smith {
4115c6c1daeSBarry Smith   PetscErrorCode ierr;
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith   PetscFunctionBegin;
41445f3bb6eSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
41545f3bb6eSLisandro Dalcin   if (draw->ops->setdoublebuffer) {
41645f3bb6eSLisandro Dalcin     ierr = (*draw->ops->setdoublebuffer)(draw);CHKERRQ(ierr);
41745f3bb6eSLisandro Dalcin   }
4185c6c1daeSBarry Smith   PetscFunctionReturn(0);
4195c6c1daeSBarry Smith }
4205c6c1daeSBarry Smith 
4215c6c1daeSBarry Smith /*@C
4225c6c1daeSBarry Smith    PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned
4235c6c1daeSBarry Smith         by the one process.
4245c6c1daeSBarry Smith 
4255c6c1daeSBarry Smith    Collective on PetscDraw
4265c6c1daeSBarry Smith 
4275c6c1daeSBarry Smith    Input Parameter:
4285c6c1daeSBarry Smith .  draw - the original window
4295c6c1daeSBarry Smith 
4305c6c1daeSBarry Smith    Output Parameter:
4315c6c1daeSBarry Smith .  sdraw - the singleton window
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith    Level: advanced
4345c6c1daeSBarry Smith 
4355c6c1daeSBarry Smith .seealso: PetscDrawRestoreSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
4365c6c1daeSBarry Smith 
4375c6c1daeSBarry Smith @*/
4385c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw)
4395c6c1daeSBarry Smith {
4405c6c1daeSBarry Smith   PetscErrorCode ierr;
4415c6c1daeSBarry Smith   PetscMPIInt    size;
4425c6c1daeSBarry Smith 
4435c6c1daeSBarry Smith   PetscFunctionBegin;
4445c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4455c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
4465c6c1daeSBarry Smith 
447ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr);
448387ef4f7SLisandro Dalcin   if (size == 1) {
449387ef4f7SLisandro Dalcin     ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
450387ef4f7SLisandro Dalcin     *sdraw = draw;
451387ef4f7SLisandro Dalcin   } else {
4525c6c1daeSBarry Smith     if (draw->ops->getsingleton) {
4535c6c1daeSBarry Smith       ierr = (*draw->ops->getsingleton)(draw,sdraw);CHKERRQ(ierr);
4545c6c1daeSBarry Smith     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name);
4555c6c1daeSBarry Smith   }
4565c6c1daeSBarry Smith   PetscFunctionReturn(0);
4575c6c1daeSBarry Smith }
4585c6c1daeSBarry Smith 
4595c6c1daeSBarry Smith /*@C
4605c6c1daeSBarry Smith    PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned
4615c6c1daeSBarry Smith         by the one process.
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith    Collective on PetscDraw
4645c6c1daeSBarry Smith 
4655c6c1daeSBarry Smith    Input Parameters:
4665c6c1daeSBarry Smith +  draw - the original window
4675c6c1daeSBarry Smith -  sdraw - the singleton window
4685c6c1daeSBarry Smith 
4695c6c1daeSBarry Smith    Level: advanced
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith .seealso: PetscDrawGetSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith @*/
4745c6c1daeSBarry Smith PetscErrorCode  PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw)
4755c6c1daeSBarry Smith {
4765c6c1daeSBarry Smith   PetscErrorCode ierr;
4775c6c1daeSBarry Smith   PetscMPIInt    size;
4785c6c1daeSBarry Smith 
4795c6c1daeSBarry Smith   PetscFunctionBegin;
4805c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4815c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
4825c6c1daeSBarry Smith   PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2);
4835c6c1daeSBarry Smith 
484ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr);
485387ef4f7SLisandro Dalcin   if (size == 1) {
486387ef4f7SLisandro Dalcin     if (draw == *sdraw) {
487387ef4f7SLisandro Dalcin       ierr = PetscObjectDereference((PetscObject)draw);CHKERRQ(ierr);
488387ef4f7SLisandro Dalcin       *sdraw = NULL;
489387ef4f7SLisandro Dalcin     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore singleton, it is not the parent draw");
490387ef4f7SLisandro Dalcin   } else {
4915c6c1daeSBarry Smith     if (draw->ops->restoresingleton) {
4925c6c1daeSBarry Smith       ierr = (*draw->ops->restoresingleton)(draw,sdraw);CHKERRQ(ierr);
4935c6c1daeSBarry Smith     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot restore singleton for this type %s of draw object",((PetscObject)draw)->type_name);
4945c6c1daeSBarry Smith   }
4955c6c1daeSBarry Smith   PetscFunctionReturn(0);
4965c6c1daeSBarry Smith }
497