xref: /petsc/src/sys/classes/draw/interface/draw.c (revision 9566063d113dddea24716c546802770db7481bc0)
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 .seealso: PetscFinalize()
185c6c1daeSBarry Smith @*/
195c6c1daeSBarry Smith PetscErrorCode  PetscDrawFinalizePackage(void)
205c6c1daeSBarry Smith {
215c6c1daeSBarry Smith   PetscFunctionBegin;
22*9566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&PetscDrawList));
235c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_FALSE;
240f51fdf8SToby Isaac   PetscDrawRegisterAllCalled  = PETSC_FALSE;
255c6c1daeSBarry Smith   PetscFunctionReturn(0);
265c6c1daeSBarry Smith }
275c6c1daeSBarry Smith 
285c6c1daeSBarry Smith /*@C
295c6c1daeSBarry Smith   PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called
308a690491SBarry Smith   from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to PetscInitialize()
318a690491SBarry Smith   when using shared or static libraries.
325c6c1daeSBarry Smith 
335c6c1daeSBarry Smith   Level: developer
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith .seealso: PetscInitialize()
365c6c1daeSBarry Smith @*/
37607a6623SBarry Smith PetscErrorCode  PetscDrawInitializePackage(void)
385c6c1daeSBarry Smith {
395c6c1daeSBarry Smith   char           logList[256];
408e81d068SLisandro Dalcin   PetscBool      opt,pkg;
415c6c1daeSBarry Smith 
425c6c1daeSBarry Smith   PetscFunctionBegin;
435c6c1daeSBarry Smith   if (PetscDrawPackageInitialized) PetscFunctionReturn(0);
445c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_TRUE;
455c6c1daeSBarry Smith   /* Register Classes */
46*9566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID));
47*9566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Draw Axis",&PETSC_DRAWAXIS_CLASSID));
48*9566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID));
49*9566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID));
50*9566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Bar Graph",&PETSC_DRAWBAR_CLASSID));
51*9566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID));
525c6c1daeSBarry Smith   /* Register Constructors */
53*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawRegisterAll());
54e94e781bSJacob Faibussowitsch   /* Process Info */
55e94e781bSJacob Faibussowitsch   {
56e94e781bSJacob Faibussowitsch     PetscClassId  classids[6];
57e94e781bSJacob Faibussowitsch 
58e94e781bSJacob Faibussowitsch     classids[0] = PETSC_DRAW_CLASSID;
59e94e781bSJacob Faibussowitsch     classids[1] = PETSC_DRAWAXIS_CLASSID;
60e94e781bSJacob Faibussowitsch     classids[2] = PETSC_DRAWLG_CLASSID;
61e94e781bSJacob Faibussowitsch     classids[3] = PETSC_DRAWHG_CLASSID;
62e94e781bSJacob Faibussowitsch     classids[4] = PETSC_DRAWBAR_CLASSID;
63e94e781bSJacob Faibussowitsch     classids[5] = PETSC_DRAWSP_CLASSID;
64*9566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("draw", 6, classids));
655c6c1daeSBarry Smith   }
665c6c1daeSBarry Smith   /* Process summary exclusions */
67*9566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
685c6c1daeSBarry Smith   if (opt) {
69*9566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("draw",logList,',',&pkg));
708e81d068SLisandro Dalcin     if (pkg) {
71*9566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAW_CLASSID));
72*9566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID));
73*9566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID));
74*9566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID));
75*9566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID));
76*9566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID));
775c6c1daeSBarry Smith     }
785c6c1daeSBarry Smith   }
798e81d068SLisandro Dalcin   /* Register package finalizer */
80*9566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscDrawFinalizePackage));
815c6c1daeSBarry Smith   PetscFunctionReturn(0);
825c6c1daeSBarry Smith }
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith /*@
855c6c1daeSBarry Smith    PetscDrawResizeWindow - Allows one to resize a window from a program.
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith    Collective on PetscDraw
885c6c1daeSBarry Smith 
89d8d19677SJose E. Roman    Input Parameters:
905c6c1daeSBarry Smith +  draw - the window
915c6c1daeSBarry Smith -  w,h - the new width and height of the window
925c6c1daeSBarry Smith 
935c6c1daeSBarry Smith    Level: intermediate
945c6c1daeSBarry Smith 
955c6c1daeSBarry Smith .seealso: PetscDrawCheckResizedWindow()
965c6c1daeSBarry Smith @*/
975c6c1daeSBarry Smith PetscErrorCode  PetscDrawResizeWindow(PetscDraw draw,int w,int h)
985c6c1daeSBarry Smith {
995c6c1daeSBarry Smith   PetscFunctionBegin;
10073ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
10173ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,w,2);
10273ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,h,3);
1035c6c1daeSBarry Smith   if (draw->ops->resizewindow) {
104*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->resizewindow)(draw,w,h));
1055c6c1daeSBarry Smith   }
1065c6c1daeSBarry Smith   PetscFunctionReturn(0);
1075c6c1daeSBarry Smith }
1085c6c1daeSBarry Smith 
10973ecf448SLisandro Dalcin /*@
11073ecf448SLisandro Dalcin    PetscDrawGetWindowSize - Gets the size of the window.
11173ecf448SLisandro Dalcin 
11273ecf448SLisandro Dalcin    Not collective
11373ecf448SLisandro Dalcin 
11473ecf448SLisandro Dalcin    Input Parameter:
11573ecf448SLisandro Dalcin .  draw - the window
11673ecf448SLisandro Dalcin 
11773ecf448SLisandro Dalcin    Output Parameters:
11873ecf448SLisandro Dalcin .  w,h - the window width and height
11973ecf448SLisandro Dalcin 
12073ecf448SLisandro Dalcin    Level: intermediate
12173ecf448SLisandro Dalcin 
12273ecf448SLisandro Dalcin .seealso: PetscDrawResizeWindow(), PetscDrawCheckResizedWindow()
12373ecf448SLisandro Dalcin @*/
12473ecf448SLisandro Dalcin PetscErrorCode  PetscDrawGetWindowSize(PetscDraw draw,int *w,int *h)
12573ecf448SLisandro Dalcin {
12673ecf448SLisandro Dalcin   PetscFunctionBegin;
12773ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
12873ecf448SLisandro Dalcin   if (w) PetscValidPointer(w,2);
12973ecf448SLisandro Dalcin   if (h) PetscValidPointer(h,3);
13073ecf448SLisandro Dalcin   if (w) *w = draw->w;
13173ecf448SLisandro Dalcin   if (h) *h = draw->h;
13273ecf448SLisandro Dalcin   PetscFunctionReturn(0);
13373ecf448SLisandro Dalcin }
13473ecf448SLisandro Dalcin 
1355c6c1daeSBarry Smith /*@
1365c6c1daeSBarry Smith    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith    Collective on PetscDraw
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith    Input Parameter:
1415c6c1daeSBarry Smith .  draw - the window
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith    Level: advanced
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith .seealso: PetscDrawResizeWindow()
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith @*/
1485c6c1daeSBarry Smith PetscErrorCode  PetscDrawCheckResizedWindow(PetscDraw draw)
1495c6c1daeSBarry Smith {
1505c6c1daeSBarry Smith   PetscFunctionBegin;
15173ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1525c6c1daeSBarry Smith   if (draw->ops->checkresizedwindow) {
153*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->checkresizedwindow)(draw));
1545c6c1daeSBarry Smith   }
1555c6c1daeSBarry Smith   PetscFunctionReturn(0);
1565c6c1daeSBarry Smith }
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith /*@C
1595c6c1daeSBarry Smith    PetscDrawGetTitle - Gets pointer to title of a PetscDraw context.
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith    Not collective
1625c6c1daeSBarry Smith 
1635c6c1daeSBarry Smith    Input Parameter:
1645c6c1daeSBarry Smith .  draw - the graphics context
1655c6c1daeSBarry Smith 
1665c6c1daeSBarry Smith    Output Parameter:
1675c6c1daeSBarry Smith .  title - the title
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith    Level: intermediate
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith .seealso: PetscDrawSetTitle()
1725c6c1daeSBarry Smith @*/
173f60c72e3SLisandro Dalcin PetscErrorCode  PetscDrawGetTitle(PetscDraw draw,const char *title[])
1745c6c1daeSBarry Smith {
1755c6c1daeSBarry Smith   PetscFunctionBegin;
1765c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1775c6c1daeSBarry Smith   PetscValidPointer(title,2);
1785c6c1daeSBarry Smith   *title = draw->title;
1795c6c1daeSBarry Smith   PetscFunctionReturn(0);
1805c6c1daeSBarry Smith }
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith /*@C
1835c6c1daeSBarry Smith    PetscDrawSetTitle - Sets the title of a PetscDraw context.
1845c6c1daeSBarry Smith 
1855b399a63SLisandro Dalcin    Collective on PetscDraw
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith    Input Parameters:
1885c6c1daeSBarry Smith +  draw - the graphics context
1895c6c1daeSBarry Smith -  title - the title
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith    Level: intermediate
1925c6c1daeSBarry Smith 
193231a95f8SBarry Smith    Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save
194231a95f8SBarry Smith    in the image.
195231a95f8SBarry Smith 
1965c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
1975c6c1daeSBarry Smith    title string after calling this routine.
1985c6c1daeSBarry Smith 
199231a95f8SBarry Smith    You can use PetscDrawAxisSetLabels() to indicate a title within the window
200231a95f8SBarry Smith 
2015c6c1daeSBarry Smith .seealso: PetscDrawGetTitle(), PetscDrawAppendTitle()
2025c6c1daeSBarry Smith @*/
2035c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetTitle(PetscDraw draw,const char title[])
2045c6c1daeSBarry Smith {
2055c6c1daeSBarry Smith   PetscFunctionBegin;
2065c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2075c6c1daeSBarry Smith   PetscValidCharPointer(title,2);
208*9566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->title));
209*9566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title,&draw->title));
2105c6c1daeSBarry Smith   if (draw->ops->settitle) {
211*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->settitle)(draw,draw->title));
2125c6c1daeSBarry Smith   }
2135c6c1daeSBarry Smith   PetscFunctionReturn(0);
2145c6c1daeSBarry Smith }
2155c6c1daeSBarry Smith 
2165c6c1daeSBarry Smith /*@C
2175c6c1daeSBarry Smith    PetscDrawAppendTitle - Appends to the title of a PetscDraw context.
2185c6c1daeSBarry Smith 
2195b399a63SLisandro Dalcin    Collective on PetscDraw
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith    Input Parameters:
2225c6c1daeSBarry Smith +  draw - the graphics context
2235c6c1daeSBarry Smith -  title - the title
2245c6c1daeSBarry Smith 
2255c6c1daeSBarry Smith    Note:
2265c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
2275c6c1daeSBarry Smith    title string after calling this routine.
2285c6c1daeSBarry Smith 
2295c6c1daeSBarry Smith    Level: advanced
2305c6c1daeSBarry Smith 
2315c6c1daeSBarry Smith .seealso: PetscDrawSetTitle(), PetscDrawGetTitle()
2325c6c1daeSBarry Smith @*/
2335c6c1daeSBarry Smith PetscErrorCode  PetscDrawAppendTitle(PetscDraw draw,const char title[])
2345c6c1daeSBarry Smith {
2355c6c1daeSBarry Smith   PetscFunctionBegin;
2365c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2375b399a63SLisandro Dalcin   if (title) PetscValidCharPointer(title,2);
2385b399a63SLisandro Dalcin   if (!title || !title[0]) PetscFunctionReturn(0);
2395c6c1daeSBarry Smith 
2405c6c1daeSBarry Smith   if (draw->title) {
2415b399a63SLisandro Dalcin     size_t len1,len2;
2425b399a63SLisandro Dalcin     char   *newtitle;
243*9566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(title,&len1));
244*9566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(draw->title,&len2));
245*9566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(len1 + len2 + 1,&newtitle));
246*9566063dSJacob Faibussowitsch     PetscCall(PetscStrcpy(newtitle,draw->title));
247*9566063dSJacob Faibussowitsch     PetscCall(PetscStrcat(newtitle,title));
248*9566063dSJacob Faibussowitsch     PetscCall(PetscFree(draw->title));
2495c6c1daeSBarry Smith     draw->title = newtitle;
2505c6c1daeSBarry Smith   } else {
251*9566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(title,&draw->title));
2525c6c1daeSBarry Smith   }
2535c6c1daeSBarry Smith   if (draw->ops->settitle) {
254*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->settitle)(draw,draw->title));
2555c6c1daeSBarry Smith   }
2565c6c1daeSBarry Smith   PetscFunctionReturn(0);
2575c6c1daeSBarry Smith }
2585c6c1daeSBarry Smith 
259e118a51fSLisandro Dalcin static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
260e118a51fSLisandro Dalcin {
261e118a51fSLisandro Dalcin   PetscFunctionBegin;
2628067a7d5SLisandro Dalcin   if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0);
263*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawSaveMovie(draw));
264e118a51fSLisandro Dalcin   if (draw->savefinalfilename) {
265df8d4941SLisandro Dalcin     draw->savesinglefile = PETSC_TRUE;
266*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetSave(draw,draw->savefinalfilename));
267*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawSave(draw));
268e118a51fSLisandro Dalcin   }
269*9566063dSJacob Faibussowitsch   PetscCall(PetscBarrier((PetscObject)draw));
270e118a51fSLisandro Dalcin   PetscFunctionReturn(0);
271e118a51fSLisandro Dalcin }
272e118a51fSLisandro Dalcin 
2735c6c1daeSBarry Smith /*@
2745c6c1daeSBarry Smith    PetscDrawDestroy - Deletes a draw context.
2755c6c1daeSBarry Smith 
2765c6c1daeSBarry Smith    Collective on PetscDraw
2775c6c1daeSBarry Smith 
2785c6c1daeSBarry Smith    Input Parameters:
2795c6c1daeSBarry Smith .  draw - the drawing context
2805c6c1daeSBarry Smith 
2815c6c1daeSBarry Smith    Level: beginner
2825c6c1daeSBarry Smith 
2835c6c1daeSBarry Smith .seealso: PetscDrawCreate()
2845c6c1daeSBarry Smith 
2855c6c1daeSBarry Smith @*/
2865c6c1daeSBarry Smith PetscErrorCode  PetscDrawDestroy(PetscDraw *draw)
2875c6c1daeSBarry Smith {
2885c6c1daeSBarry Smith   PetscFunctionBegin;
2895c6c1daeSBarry Smith   if (!*draw) PetscFunctionReturn(0);
2905c6c1daeSBarry Smith   PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1);
2915c6c1daeSBarry Smith   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0);
2925c6c1daeSBarry Smith 
2935c6c1daeSBarry Smith   if ((*draw)->pause == -2) {
2945c6c1daeSBarry Smith     (*draw)->pause = -1;
295*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawPause(*draw));
2965c6c1daeSBarry Smith   }
2975c6c1daeSBarry Smith 
2985c6c1daeSBarry Smith   /* if memory was published then destroy it */
299*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw));
3005c6c1daeSBarry Smith 
301*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy_Private(*draw));
302e118a51fSLisandro Dalcin 
3035c6c1daeSBarry Smith   if ((*draw)->ops->destroy) {
304*9566063dSJacob Faibussowitsch     PetscCall((*(*draw)->ops->destroy)(*draw));
3055c6c1daeSBarry Smith   }
306*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*draw)->popup));
307*9566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->title));
308*9566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->display));
309*9566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefilename));
310*9566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->saveimageext));
311*9566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savemovieext));
312*9566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefinalfilename));
313*9566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(draw));
3145c6c1daeSBarry Smith   PetscFunctionReturn(0);
3155c6c1daeSBarry Smith }
3165c6c1daeSBarry Smith 
3175c6c1daeSBarry Smith /*@
3185c6c1daeSBarry Smith    PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
3195c6c1daeSBarry Smith 
3205c6c1daeSBarry Smith    Collective on PetscDraw
3215c6c1daeSBarry Smith 
3225c6c1daeSBarry Smith    Input Parameter:
3235c6c1daeSBarry Smith .  draw - the original window
3245c6c1daeSBarry Smith 
3255c6c1daeSBarry Smith    Output Parameter:
3265c6c1daeSBarry Smith .  popup - the new popup window
3275c6c1daeSBarry Smith 
3285c6c1daeSBarry Smith    Level: advanced
3295c6c1daeSBarry Smith 
330ba1e01c4SBarry Smith .seealso: PetscDrawScalePopup(), PetscDrawCreate()
331ba1e01c4SBarry Smith 
3325c6c1daeSBarry Smith @*/
3335c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup)
3345c6c1daeSBarry Smith {
3355c6c1daeSBarry Smith   PetscFunctionBegin;
3365c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3375c6c1daeSBarry Smith   PetscValidPointer(popup,2);
3385c6c1daeSBarry Smith 
339a297a907SKarl Rupp   if (draw->popup) *popup = draw->popup;
340a297a907SKarl Rupp   else if (draw->ops->getpopup) {
341*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->getpopup)(draw,popup));
3420b874712SBarry Smith     if (*popup) {
343*9566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_"));
344e118a51fSLisandro Dalcin       (*popup)->pause = 0.0;
345*9566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetFromOptions(*popup));
34661f59835SBarry Smith     }
3470298fd71SBarry Smith   } else *popup = NULL;
3485c6c1daeSBarry Smith   PetscFunctionReturn(0);
3495c6c1daeSBarry Smith }
3505c6c1daeSBarry Smith 
35194ef8ddeSSatish Balay /*@C
3525c6c1daeSBarry Smith   PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
3535c6c1daeSBarry Smith 
354d8d19677SJose E. Roman   Input Parameters:
3555c6c1daeSBarry Smith + draw - the drawing context
3565c6c1daeSBarry Smith - display - the X windows display
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith   Level: advanced
3595c6c1daeSBarry Smith 
360ba1e01c4SBarry Smith .seealso: PetscDrawCreate()
361ba1e01c4SBarry Smith 
3625c6c1daeSBarry Smith @*/
3635c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetDisplay(PetscDraw draw,const char display[])
3645c6c1daeSBarry Smith {
3655c6c1daeSBarry Smith   PetscFunctionBegin;
366*9566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->display));
367*9566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display,&draw->display));
3685c6c1daeSBarry Smith   PetscFunctionReturn(0);
3695c6c1daeSBarry Smith }
3705c6c1daeSBarry Smith 
37145f3bb6eSLisandro Dalcin /*@
37245f3bb6eSLisandro Dalcin    PetscDrawSetDoubleBuffer - Sets a window to be double buffered.
37345f3bb6eSLisandro Dalcin 
37445f3bb6eSLisandro Dalcin    Logically Collective on PetscDraw
3755c6c1daeSBarry Smith 
3765c6c1daeSBarry Smith    Input Parameter:
37745f3bb6eSLisandro Dalcin .  draw - the drawing context
37845f3bb6eSLisandro Dalcin 
37945f3bb6eSLisandro Dalcin    Level: intermediate
38045f3bb6eSLisandro Dalcin 
38145f3bb6eSLisandro Dalcin @*/
38245f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawSetDoubleBuffer(PetscDraw draw)
3835c6c1daeSBarry Smith {
3845c6c1daeSBarry Smith   PetscFunctionBegin;
38545f3bb6eSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
38645f3bb6eSLisandro Dalcin   if (draw->ops->setdoublebuffer) {
387*9566063dSJacob Faibussowitsch     PetscCall((*draw->ops->setdoublebuffer)(draw));
38845f3bb6eSLisandro Dalcin   }
3895c6c1daeSBarry Smith   PetscFunctionReturn(0);
3905c6c1daeSBarry Smith }
3915c6c1daeSBarry Smith 
3925c6c1daeSBarry Smith /*@C
3935c6c1daeSBarry Smith    PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned
3945c6c1daeSBarry Smith         by the one process.
3955c6c1daeSBarry Smith 
3965c6c1daeSBarry Smith    Collective on PetscDraw
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith    Input Parameter:
3995c6c1daeSBarry Smith .  draw - the original window
4005c6c1daeSBarry Smith 
4015c6c1daeSBarry Smith    Output Parameter:
4025c6c1daeSBarry Smith .  sdraw - the singleton window
4035c6c1daeSBarry Smith 
4045c6c1daeSBarry Smith    Level: advanced
4055c6c1daeSBarry Smith 
4065c6c1daeSBarry Smith .seealso: PetscDrawRestoreSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
4075c6c1daeSBarry Smith 
4085c6c1daeSBarry Smith @*/
4095c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw)
4105c6c1daeSBarry Smith {
4115c6c1daeSBarry Smith   PetscMPIInt    size;
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith   PetscFunctionBegin;
4145c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4155c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
4165c6c1daeSBarry Smith 
417*9566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size));
418387ef4f7SLisandro Dalcin   if (size == 1) {
419*9566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)draw));
420387ef4f7SLisandro Dalcin     *sdraw = draw;
421387ef4f7SLisandro Dalcin   } else {
4225c6c1daeSBarry Smith     if (draw->ops->getsingleton) {
423*9566063dSJacob Faibussowitsch       PetscCall((*draw->ops->getsingleton)(draw,sdraw));
42498921bdaSJacob Faibussowitsch     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name);
4255c6c1daeSBarry Smith   }
4265c6c1daeSBarry Smith   PetscFunctionReturn(0);
4275c6c1daeSBarry Smith }
4285c6c1daeSBarry Smith 
4295c6c1daeSBarry Smith /*@C
4305c6c1daeSBarry Smith    PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned
4315c6c1daeSBarry Smith         by the one process.
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith    Collective on PetscDraw
4345c6c1daeSBarry Smith 
4355c6c1daeSBarry Smith    Input Parameters:
4365c6c1daeSBarry Smith +  draw - the original window
4375c6c1daeSBarry Smith -  sdraw - the singleton window
4385c6c1daeSBarry Smith 
4395c6c1daeSBarry Smith    Level: advanced
4405c6c1daeSBarry Smith 
4415c6c1daeSBarry Smith .seealso: PetscDrawGetSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
4425c6c1daeSBarry Smith 
4435c6c1daeSBarry Smith @*/
4445c6c1daeSBarry Smith PetscErrorCode  PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw)
4455c6c1daeSBarry Smith {
4465c6c1daeSBarry Smith   PetscMPIInt    size;
4475c6c1daeSBarry Smith 
4485c6c1daeSBarry Smith   PetscFunctionBegin;
4495c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4505c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
4515c6c1daeSBarry Smith   PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2);
4525c6c1daeSBarry Smith 
453*9566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size));
454387ef4f7SLisandro Dalcin   if (size == 1) {
455387ef4f7SLisandro Dalcin     if (draw == *sdraw) {
456*9566063dSJacob Faibussowitsch       PetscCall(PetscObjectDereference((PetscObject)draw));
457387ef4f7SLisandro Dalcin       *sdraw = NULL;
458387ef4f7SLisandro Dalcin     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore singleton, it is not the parent draw");
459387ef4f7SLisandro Dalcin   } else {
4605c6c1daeSBarry Smith     if (draw->ops->restoresingleton) {
461*9566063dSJacob Faibussowitsch       PetscCall((*draw->ops->restoresingleton)(draw,sdraw));
46298921bdaSJacob Faibussowitsch     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot restore singleton for this type %s of draw object",((PetscObject)draw)->type_name);
4635c6c1daeSBarry Smith   }
4645c6c1daeSBarry Smith   PetscFunctionReturn(0);
4655c6c1daeSBarry Smith }
466