xref: /petsc/src/sys/classes/draw/interface/draw.c (revision 53c0d4ae618d507ffd9793a3bdcbc009f3c9f497) !
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
12811af0c4SBarry Smith   PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the `PetscDraw` package. It is
13811af0c4SBarry Smith   called from `PetscFinalize()`.
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith   Level: developer
165c6c1daeSBarry Smith 
17811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscFinalize()`
185c6c1daeSBarry Smith @*/
19d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawFinalizePackage(void)
20d71ae5a4SJacob Faibussowitsch {
215c6c1daeSBarry Smith   PetscFunctionBegin;
229566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&PetscDrawList));
235c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_FALSE;
240f51fdf8SToby Isaac   PetscDrawRegisterAllCalled  = PETSC_FALSE;
253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
265c6c1daeSBarry Smith }
275c6c1daeSBarry Smith 
285c6c1daeSBarry Smith /*@C
29811af0c4SBarry Smith   PetscInitializeDrawPackage - This function initializes everything in the `PetscDraw` package. It is called
30811af0c4SBarry 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 
35811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscInitialize()`
365c6c1daeSBarry Smith @*/
37d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawInitializePackage(void)
38d71ae5a4SJacob Faibussowitsch {
395c6c1daeSBarry Smith   char      logList[256];
408e81d068SLisandro Dalcin   PetscBool opt, pkg;
415c6c1daeSBarry Smith 
425c6c1daeSBarry Smith   PetscFunctionBegin;
433ba16761SJacob Faibussowitsch   if (PetscDrawPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
445c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_TRUE;
455c6c1daeSBarry Smith   /* Register Classes */
469566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Draw", &PETSC_DRAW_CLASSID));
479566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Draw Axis", &PETSC_DRAWAXIS_CLASSID));
489566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Line Graph", &PETSC_DRAWLG_CLASSID));
499566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Histogram", &PETSC_DRAWHG_CLASSID));
509566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Bar Graph", &PETSC_DRAWBAR_CLASSID));
519566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Scatter Plot", &PETSC_DRAWSP_CLASSID));
525c6c1daeSBarry Smith   /* Register Constructors */
539566063dSJacob 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;
649566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("draw", 6, classids));
655c6c1daeSBarry Smith   }
665c6c1daeSBarry Smith   /* Process summary exclusions */
679566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
685c6c1daeSBarry Smith   if (opt) {
699566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("draw", logList, ',', &pkg));
708e81d068SLisandro Dalcin     if (pkg) {
719566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAW_CLASSID));
729566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID));
739566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID));
749566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID));
759566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID));
769566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID));
775c6c1daeSBarry Smith     }
785c6c1daeSBarry Smith   }
798e81d068SLisandro Dalcin   /* Register package finalizer */
809566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscDrawFinalizePackage));
813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
825c6c1daeSBarry Smith }
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith /*@
855c6c1daeSBarry Smith    PetscDrawResizeWindow - Allows one to resize a window from a program.
865c6c1daeSBarry Smith 
87c3339decSBarry Smith    Collective
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 
95811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCheckResizedWindow()`
965c6c1daeSBarry Smith @*/
97d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawResizeWindow(PetscDraw draw, int w, int h)
98d71ae5a4SJacob Faibussowitsch {
995c6c1daeSBarry Smith   PetscFunctionBegin;
10073ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
10173ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw, w, 2);
10273ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw, h, 3);
103dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, resizewindow, w, h);
1043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1055c6c1daeSBarry Smith }
1065c6c1daeSBarry Smith 
10773ecf448SLisandro Dalcin /*@
10873ecf448SLisandro Dalcin    PetscDrawGetWindowSize - Gets the size of the window.
10973ecf448SLisandro Dalcin 
11073ecf448SLisandro Dalcin    Not collective
11173ecf448SLisandro Dalcin 
11273ecf448SLisandro Dalcin    Input Parameter:
11373ecf448SLisandro Dalcin .  draw - the window
11473ecf448SLisandro Dalcin 
11573ecf448SLisandro Dalcin    Output Parameters:
11673ecf448SLisandro Dalcin .  w,h - the window width and height
11773ecf448SLisandro Dalcin 
11873ecf448SLisandro Dalcin    Level: intermediate
11973ecf448SLisandro Dalcin 
120811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawResizeWindow()`, `PetscDrawCheckResizedWindow()`
12173ecf448SLisandro Dalcin @*/
122d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetWindowSize(PetscDraw draw, int *w, int *h)
123d71ae5a4SJacob Faibussowitsch {
12473ecf448SLisandro Dalcin   PetscFunctionBegin;
12573ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
12673ecf448SLisandro Dalcin   if (w) PetscValidPointer(w, 2);
12773ecf448SLisandro Dalcin   if (h) PetscValidPointer(h, 3);
12873ecf448SLisandro Dalcin   if (w) *w = draw->w;
12973ecf448SLisandro Dalcin   if (h) *h = draw->h;
1303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13173ecf448SLisandro Dalcin }
13273ecf448SLisandro Dalcin 
1335c6c1daeSBarry Smith /*@
1345c6c1daeSBarry Smith    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
1355c6c1daeSBarry Smith 
136c3339decSBarry Smith    Collective
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith    Input Parameter:
1395c6c1daeSBarry Smith .  draw - the window
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith    Level: advanced
1425c6c1daeSBarry Smith 
143811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawResizeWindow()`
1445c6c1daeSBarry Smith @*/
145d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw)
146d71ae5a4SJacob Faibussowitsch {
1475c6c1daeSBarry Smith   PetscFunctionBegin;
14873ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
149dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, checkresizedwindow);
1503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1515c6c1daeSBarry Smith }
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith /*@C
154811af0c4SBarry Smith    PetscDrawGetTitle - Gets pointer to title of a `PetscDraw` context.
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith    Not collective
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith    Input Parameter:
1595c6c1daeSBarry Smith .  draw - the graphics context
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith    Output Parameter:
1625c6c1daeSBarry Smith .  title - the title
1635c6c1daeSBarry Smith 
1645c6c1daeSBarry Smith    Level: intermediate
1655c6c1daeSBarry Smith 
166811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetTitle()`
1675c6c1daeSBarry Smith @*/
168d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetTitle(PetscDraw draw, const char *title[])
169d71ae5a4SJacob Faibussowitsch {
1705c6c1daeSBarry Smith   PetscFunctionBegin;
1715c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
1725c6c1daeSBarry Smith   PetscValidPointer(title, 2);
1735c6c1daeSBarry Smith   *title = draw->title;
1743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1755c6c1daeSBarry Smith }
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith /*@C
178811af0c4SBarry Smith    PetscDrawSetTitle - Sets the title of a `PetscDraw` context.
1795c6c1daeSBarry Smith 
180c3339decSBarry Smith    Collective
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith    Input Parameters:
1835c6c1daeSBarry Smith +  draw - the graphics context
1845c6c1daeSBarry Smith -  title - the title
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith    Level: intermediate
1875c6c1daeSBarry Smith 
188811af0c4SBarry Smith    Notes:
189811af0c4SBarry Smith    The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save
190231a95f8SBarry Smith    in the image.
191231a95f8SBarry Smith 
1925c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
1935c6c1daeSBarry Smith    title string after calling this routine.
1945c6c1daeSBarry Smith 
195811af0c4SBarry Smith    You can use `PetscDrawAxisSetLabels()` to indicate a title within the window
196231a95f8SBarry Smith 
197811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetTitle()`, `PetscDrawAppendTitle()`
1985c6c1daeSBarry Smith @*/
199d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetTitle(PetscDraw draw, const char title[])
200d71ae5a4SJacob Faibussowitsch {
2015c6c1daeSBarry Smith   PetscFunctionBegin;
2025c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2035c6c1daeSBarry Smith   PetscValidCharPointer(title, 2);
2049566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->title));
2059566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &draw->title));
206dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, settitle, draw->title);
2073ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2085c6c1daeSBarry Smith }
2095c6c1daeSBarry Smith 
2105c6c1daeSBarry Smith /*@C
211811af0c4SBarry Smith    PetscDrawAppendTitle - Appends to the title of a `PetscDraw` context.
2125c6c1daeSBarry Smith 
213c3339decSBarry Smith    Collective
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith    Input Parameters:
2165c6c1daeSBarry Smith +  draw - the graphics context
2175c6c1daeSBarry Smith -  title - the title
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith    Note:
2205c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
2215c6c1daeSBarry Smith    title string after calling this routine.
2225c6c1daeSBarry Smith 
2235c6c1daeSBarry Smith    Level: advanced
2245c6c1daeSBarry Smith 
225811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetTitle()`, `PetscDrawGetTitle()`
2265c6c1daeSBarry Smith @*/
227d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawAppendTitle(PetscDraw draw, const char title[])
228d71ae5a4SJacob Faibussowitsch {
2295c6c1daeSBarry Smith   PetscFunctionBegin;
2305c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2315b399a63SLisandro Dalcin   if (title) PetscValidCharPointer(title, 2);
2323ba16761SJacob Faibussowitsch   if (!title || !title[0]) PetscFunctionReturn(PETSC_SUCCESS);
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith   if (draw->title) {
2355b399a63SLisandro Dalcin     size_t len1, len2;
2365b399a63SLisandro Dalcin     char  *newtitle;
2379566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(title, &len1));
2389566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(draw->title, &len2));
2399566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(len1 + len2 + 1, &newtitle));
2409566063dSJacob Faibussowitsch     PetscCall(PetscStrcpy(newtitle, draw->title));
2419566063dSJacob Faibussowitsch     PetscCall(PetscStrcat(newtitle, title));
2429566063dSJacob Faibussowitsch     PetscCall(PetscFree(draw->title));
2435c6c1daeSBarry Smith     draw->title = newtitle;
2445c6c1daeSBarry Smith   } else {
2459566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(title, &draw->title));
2465c6c1daeSBarry Smith   }
247dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, settitle, draw->title);
2483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2495c6c1daeSBarry Smith }
2505c6c1daeSBarry Smith 
251d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
252d71ae5a4SJacob Faibussowitsch {
253e118a51fSLisandro Dalcin   PetscFunctionBegin;
2543ba16761SJacob Faibussowitsch   if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(PETSC_SUCCESS);
2559566063dSJacob Faibussowitsch   PetscCall(PetscDrawSaveMovie(draw));
256e118a51fSLisandro Dalcin   if (draw->savefinalfilename) {
257df8d4941SLisandro Dalcin     draw->savesinglefile = PETSC_TRUE;
2589566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetSave(draw, draw->savefinalfilename));
2599566063dSJacob Faibussowitsch     PetscCall(PetscDrawSave(draw));
260e118a51fSLisandro Dalcin   }
2619566063dSJacob Faibussowitsch   PetscCall(PetscBarrier((PetscObject)draw));
2623ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
263e118a51fSLisandro Dalcin }
264e118a51fSLisandro Dalcin 
2655c6c1daeSBarry Smith /*@
2665c6c1daeSBarry Smith    PetscDrawDestroy - Deletes a draw context.
2675c6c1daeSBarry Smith 
268c3339decSBarry Smith    Collective
2695c6c1daeSBarry Smith 
2705c6c1daeSBarry Smith    Input Parameters:
2715c6c1daeSBarry Smith .  draw - the drawing context
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith    Level: beginner
2745c6c1daeSBarry Smith 
275811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`
2765c6c1daeSBarry Smith @*/
277d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawDestroy(PetscDraw *draw)
278d71ae5a4SJacob Faibussowitsch {
2795c6c1daeSBarry Smith   PetscFunctionBegin;
2803ba16761SJacob Faibussowitsch   if (!*draw) PetscFunctionReturn(PETSC_SUCCESS);
2815c6c1daeSBarry Smith   PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 1);
2823ba16761SJacob Faibussowitsch   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(PETSC_SUCCESS);
2835c6c1daeSBarry Smith 
2845c6c1daeSBarry Smith   if ((*draw)->pause == -2) {
2855c6c1daeSBarry Smith     (*draw)->pause = -1;
2869566063dSJacob Faibussowitsch     PetscCall(PetscDrawPause(*draw));
2875c6c1daeSBarry Smith   }
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith   /* if memory was published then destroy it */
2909566063dSJacob Faibussowitsch   PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw));
2915c6c1daeSBarry Smith 
2929566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy_Private(*draw));
293e118a51fSLisandro Dalcin 
29448a46eb9SPierre Jolivet   if ((*draw)->ops->destroy) PetscCall((*(*draw)->ops->destroy)(*draw));
2959566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*draw)->popup));
2969566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->title));
2979566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->display));
2989566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefilename));
2999566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->saveimageext));
3009566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savemovieext));
3019566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefinalfilename));
3029566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(draw));
3033ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3045c6c1daeSBarry Smith }
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith /*@
307811af0c4SBarry Smith    PetscDrawGetPopup - Creates a popup window associated with a `PetscDraw` window.
3085c6c1daeSBarry Smith 
309c3339decSBarry Smith    Collective
3105c6c1daeSBarry Smith 
3115c6c1daeSBarry Smith    Input Parameter:
3125c6c1daeSBarry Smith .  draw - the original window
3135c6c1daeSBarry Smith 
3145c6c1daeSBarry Smith    Output Parameter:
3155c6c1daeSBarry Smith .  popup - the new popup window
3165c6c1daeSBarry Smith 
3175c6c1daeSBarry Smith    Level: advanced
3185c6c1daeSBarry Smith 
319811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawScalePopup()`, `PetscDrawCreate()`
3205c6c1daeSBarry Smith @*/
321d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetPopup(PetscDraw draw, PetscDraw *popup)
322d71ae5a4SJacob Faibussowitsch {
3235c6c1daeSBarry Smith   PetscFunctionBegin;
3245c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3255c6c1daeSBarry Smith   PetscValidPointer(popup, 2);
3265c6c1daeSBarry Smith 
327a297a907SKarl Rupp   if (draw->popup) *popup = draw->popup;
328a297a907SKarl Rupp   else if (draw->ops->getpopup) {
329dbbe0bcdSBarry Smith     PetscUseTypeMethod(draw, getpopup, popup);
3300b874712SBarry Smith     if (*popup) {
3319566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup, "popup_"));
332e118a51fSLisandro Dalcin       (*popup)->pause = 0.0;
3339566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetFromOptions(*popup));
33461f59835SBarry Smith     }
3350298fd71SBarry Smith   } else *popup = NULL;
3363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3375c6c1daeSBarry Smith }
3385c6c1daeSBarry Smith 
33994ef8ddeSSatish Balay /*@C
340811af0c4SBarry Smith   PetscDrawSetDisplay - Sets the display where a `PetscDraw` object will be displayed
3415c6c1daeSBarry Smith 
342d8d19677SJose E. Roman   Input Parameters:
3435c6c1daeSBarry Smith + draw - the drawing context
3445c6c1daeSBarry Smith - display - the X windows display
3455c6c1daeSBarry Smith 
3465c6c1daeSBarry Smith   Level: advanced
3475c6c1daeSBarry Smith 
348811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawOpenX()`, `PetscDrawCreate()`
3495c6c1daeSBarry Smith @*/
350d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetDisplay(PetscDraw draw, const char display[])
351d71ae5a4SJacob Faibussowitsch {
3525c6c1daeSBarry Smith   PetscFunctionBegin;
3539566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->display));
3549566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &draw->display));
3553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3565c6c1daeSBarry Smith }
3575c6c1daeSBarry Smith 
35845f3bb6eSLisandro Dalcin /*@
35945f3bb6eSLisandro Dalcin    PetscDrawSetDoubleBuffer - Sets a window to be double buffered.
36045f3bb6eSLisandro Dalcin 
361c3339decSBarry Smith    Logically Collective
3625c6c1daeSBarry Smith 
3635c6c1daeSBarry Smith    Input Parameter:
36445f3bb6eSLisandro Dalcin .  draw - the drawing context
36545f3bb6eSLisandro Dalcin 
36645f3bb6eSLisandro Dalcin    Level: intermediate
36745f3bb6eSLisandro Dalcin 
368811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawOpenX()`, `PetscDrawCreate()`
36945f3bb6eSLisandro Dalcin @*/
370d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw draw)
371d71ae5a4SJacob Faibussowitsch {
3725c6c1daeSBarry Smith   PetscFunctionBegin;
37345f3bb6eSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
374dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, setdoublebuffer);
3753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3765c6c1daeSBarry Smith }
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith /*@C
379811af0c4SBarry Smith    PetscDrawGetSingleton - Gain access to a `PetscDraw` object as if it were owned
3805c6c1daeSBarry Smith         by the one process.
3815c6c1daeSBarry Smith 
382c3339decSBarry Smith    Collective
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith    Input Parameter:
3855c6c1daeSBarry Smith .  draw - the original window
3865c6c1daeSBarry Smith 
3875c6c1daeSBarry Smith    Output Parameter:
3885c6c1daeSBarry Smith .  sdraw - the singleton window
3895c6c1daeSBarry Smith 
3905c6c1daeSBarry Smith    Level: advanced
3915c6c1daeSBarry Smith 
392811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRestoreSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()`
3935c6c1daeSBarry Smith @*/
394d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetSingleton(PetscDraw draw, PetscDraw *sdraw)
395d71ae5a4SJacob Faibussowitsch {
3965c6c1daeSBarry Smith   PetscMPIInt size;
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith   PetscFunctionBegin;
3995c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
4005c6c1daeSBarry Smith   PetscValidPointer(sdraw, 2);
4015c6c1daeSBarry Smith 
4029566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
403387ef4f7SLisandro Dalcin   if (size == 1) {
4049566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)draw));
405387ef4f7SLisandro Dalcin     *sdraw = draw;
406387ef4f7SLisandro Dalcin   } else {
4075c6c1daeSBarry Smith     if (draw->ops->getsingleton) {
408dbbe0bcdSBarry Smith       PetscUseTypeMethod(draw, getsingleton, sdraw);
40998921bdaSJacob Faibussowitsch     } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot get singleton for this type %s of draw object", ((PetscObject)draw)->type_name);
4105c6c1daeSBarry Smith   }
4113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4125c6c1daeSBarry Smith }
4135c6c1daeSBarry Smith 
4145c6c1daeSBarry Smith /*@C
415811af0c4SBarry Smith    PetscDrawRestoreSingleton - Remove access to a `PetscDraw` object obtained with `PetscDrawGetSingleton()`
4165c6c1daeSBarry Smith         by the one process.
4175c6c1daeSBarry Smith 
418c3339decSBarry Smith    Collective
4195c6c1daeSBarry Smith 
4205c6c1daeSBarry Smith    Input Parameters:
4215c6c1daeSBarry Smith +  draw - the original window
4225c6c1daeSBarry Smith -  sdraw - the singleton window
4235c6c1daeSBarry Smith 
4245c6c1daeSBarry Smith    Level: advanced
4255c6c1daeSBarry Smith 
426811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()`
4275c6c1daeSBarry Smith @*/
428d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw, PetscDraw *sdraw)
429d71ae5a4SJacob Faibussowitsch {
4305c6c1daeSBarry Smith   PetscMPIInt size;
4315c6c1daeSBarry Smith 
4325c6c1daeSBarry Smith   PetscFunctionBegin;
4335c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
4345c6c1daeSBarry Smith   PetscValidPointer(sdraw, 2);
4355c6c1daeSBarry Smith   PetscValidHeaderSpecific(*sdraw, PETSC_DRAW_CLASSID, 2);
4365c6c1daeSBarry Smith 
4379566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
438387ef4f7SLisandro Dalcin   if (size == 1) {
439387ef4f7SLisandro Dalcin     if (draw == *sdraw) {
4409566063dSJacob Faibussowitsch       PetscCall(PetscObjectDereference((PetscObject)draw));
441387ef4f7SLisandro Dalcin       *sdraw = NULL;
442387ef4f7SLisandro Dalcin     } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot restore singleton, it is not the parent draw");
443dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(draw, restoresingleton, sdraw);
4443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4455c6c1daeSBarry Smith }
446bb09dc67SDuncan Campbell 
447bb09dc67SDuncan Campbell /*@C
448bb09dc67SDuncan Campbell    PetscDrawSetVisible - Sets if the drawing surface (the 'window') is visible on its display.
449bb09dc67SDuncan Campbell 
450bb09dc67SDuncan Campbell    Input Parameters:
451bb09dc67SDuncan Campbell +  draw - the drawing window
452bb09dc67SDuncan Campbell -  visible - if the surface should be visible
453bb09dc67SDuncan Campbell 
454*53c0d4aeSBarry Smith    Level: intermediate
455*53c0d4aeSBarry Smith 
456bb09dc67SDuncan Campbell .seealso: `PetscDraw`
457bb09dc67SDuncan Campbell @*/
458bb09dc67SDuncan Campbell PetscErrorCode PetscDrawSetVisible(PetscDraw draw, PetscBool visible)
459bb09dc67SDuncan Campbell {
460bb09dc67SDuncan Campbell   PetscFunctionBegin;
461bb09dc67SDuncan Campbell   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
462bb09dc67SDuncan Campbell   PetscTryTypeMethod(draw, setvisible, visible);
463bb09dc67SDuncan Campbell   PetscFunctionReturn(PETSC_SUCCESS);
464bb09dc67SDuncan Campbell }
465