xref: /petsc/src/sys/classes/draw/interface/draw.c (revision 2fe279fdf3e687a416e4eadb7d3c7a82d60442c6)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
3665c2dedSJed Brown #include <petscviewer.h>
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith PetscClassId PETSC_DRAW_CLASSID;
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith static PetscBool PetscDrawPackageInitialized = PETSC_FALSE;
85c6c1daeSBarry Smith /*@C
9811af0c4SBarry Smith   PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the `PetscDraw` package. It is
10811af0c4SBarry Smith   called from `PetscFinalize()`.
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith   Level: developer
135c6c1daeSBarry Smith 
14811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscFinalize()`
155c6c1daeSBarry Smith @*/
16d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawFinalizePackage(void)
17d71ae5a4SJacob Faibussowitsch {
185c6c1daeSBarry Smith   PetscFunctionBegin;
199566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListDestroy(&PetscDrawList));
205c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_FALSE;
210f51fdf8SToby Isaac   PetscDrawRegisterAllCalled  = PETSC_FALSE;
223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
235c6c1daeSBarry Smith }
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith /*@C
26811af0c4SBarry Smith   PetscInitializeDrawPackage - This function initializes everything in the `PetscDraw` package. It is called
27811af0c4SBarry Smith   from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to `PetscInitialize()`
288a690491SBarry Smith   when using shared or static libraries.
295c6c1daeSBarry Smith 
305c6c1daeSBarry Smith   Level: developer
315c6c1daeSBarry Smith 
32811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscInitialize()`
335c6c1daeSBarry Smith @*/
34d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawInitializePackage(void)
35d71ae5a4SJacob Faibussowitsch {
365c6c1daeSBarry Smith   char      logList[256];
378e81d068SLisandro Dalcin   PetscBool opt, pkg;
385c6c1daeSBarry Smith 
395c6c1daeSBarry Smith   PetscFunctionBegin;
403ba16761SJacob Faibussowitsch   if (PetscDrawPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
415c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_TRUE;
425c6c1daeSBarry Smith   /* Register Classes */
439566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Draw", &PETSC_DRAW_CLASSID));
449566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Draw Axis", &PETSC_DRAWAXIS_CLASSID));
459566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Line Graph", &PETSC_DRAWLG_CLASSID));
469566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Histogram", &PETSC_DRAWHG_CLASSID));
479566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Bar Graph", &PETSC_DRAWBAR_CLASSID));
489566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Scatter Plot", &PETSC_DRAWSP_CLASSID));
495c6c1daeSBarry Smith   /* Register Constructors */
509566063dSJacob Faibussowitsch   PetscCall(PetscDrawRegisterAll());
51e94e781bSJacob Faibussowitsch   /* Process Info */
52e94e781bSJacob Faibussowitsch   {
53e94e781bSJacob Faibussowitsch     PetscClassId classids[6];
54e94e781bSJacob Faibussowitsch 
55e94e781bSJacob Faibussowitsch     classids[0] = PETSC_DRAW_CLASSID;
56e94e781bSJacob Faibussowitsch     classids[1] = PETSC_DRAWAXIS_CLASSID;
57e94e781bSJacob Faibussowitsch     classids[2] = PETSC_DRAWLG_CLASSID;
58e94e781bSJacob Faibussowitsch     classids[3] = PETSC_DRAWHG_CLASSID;
59e94e781bSJacob Faibussowitsch     classids[4] = PETSC_DRAWBAR_CLASSID;
60e94e781bSJacob Faibussowitsch     classids[5] = PETSC_DRAWSP_CLASSID;
619566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("draw", 6, classids));
625c6c1daeSBarry Smith   }
635c6c1daeSBarry Smith   /* Process summary exclusions */
649566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
655c6c1daeSBarry Smith   if (opt) {
669566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("draw", logList, ',', &pkg));
678e81d068SLisandro Dalcin     if (pkg) {
689566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAW_CLASSID));
699566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID));
709566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID));
719566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID));
729566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID));
739566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID));
745c6c1daeSBarry Smith     }
755c6c1daeSBarry Smith   }
768e81d068SLisandro Dalcin   /* Register package finalizer */
779566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscDrawFinalizePackage));
783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
795c6c1daeSBarry Smith }
805c6c1daeSBarry Smith 
815c6c1daeSBarry Smith /*@
825c6c1daeSBarry Smith    PetscDrawResizeWindow - Allows one to resize a window from a program.
835c6c1daeSBarry Smith 
84c3339decSBarry Smith    Collective
855c6c1daeSBarry Smith 
86d8d19677SJose E. Roman    Input Parameters:
875c6c1daeSBarry Smith +  draw - the window
88*2fe279fdSBarry Smith .  w - the new width of the window
89*2fe279fdSBarry Smith -  h - the new height of the window
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith    Level: intermediate
925c6c1daeSBarry Smith 
93811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCheckResizedWindow()`
945c6c1daeSBarry Smith @*/
95d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawResizeWindow(PetscDraw draw, int w, int h)
96d71ae5a4SJacob Faibussowitsch {
975c6c1daeSBarry Smith   PetscFunctionBegin;
9873ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
9973ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw, w, 2);
10073ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw, h, 3);
101dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, resizewindow, w, h);
1023ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1035c6c1daeSBarry Smith }
1045c6c1daeSBarry Smith 
10573ecf448SLisandro Dalcin /*@
10673ecf448SLisandro Dalcin    PetscDrawGetWindowSize - Gets the size of the window.
10773ecf448SLisandro Dalcin 
10820f4b53cSBarry Smith    Not Collective
10973ecf448SLisandro Dalcin 
11073ecf448SLisandro Dalcin    Input Parameter:
11173ecf448SLisandro Dalcin .  draw - the window
11273ecf448SLisandro Dalcin 
11373ecf448SLisandro Dalcin    Output Parameters:
11420f4b53cSBarry Smith +  w - the window width
11520f4b53cSBarry Smith -  h - the window height
11673ecf448SLisandro Dalcin 
11773ecf448SLisandro Dalcin    Level: intermediate
11873ecf448SLisandro Dalcin 
119811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawResizeWindow()`, `PetscDrawCheckResizedWindow()`
12073ecf448SLisandro Dalcin @*/
121d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetWindowSize(PetscDraw draw, int *w, int *h)
122d71ae5a4SJacob Faibussowitsch {
12373ecf448SLisandro Dalcin   PetscFunctionBegin;
12473ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
12573ecf448SLisandro Dalcin   if (w) PetscValidPointer(w, 2);
12673ecf448SLisandro Dalcin   if (h) PetscValidPointer(h, 3);
12773ecf448SLisandro Dalcin   if (w) *w = draw->w;
12873ecf448SLisandro Dalcin   if (h) *h = draw->h;
1293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13073ecf448SLisandro Dalcin }
13173ecf448SLisandro Dalcin 
1325c6c1daeSBarry Smith /*@
1335c6c1daeSBarry Smith    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
1345c6c1daeSBarry Smith 
135c3339decSBarry Smith    Collective
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith    Input Parameter:
1385c6c1daeSBarry Smith .  draw - the window
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith    Level: advanced
1415c6c1daeSBarry Smith 
142811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawResizeWindow()`
1435c6c1daeSBarry Smith @*/
144d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw)
145d71ae5a4SJacob Faibussowitsch {
1465c6c1daeSBarry Smith   PetscFunctionBegin;
14773ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
148dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, checkresizedwindow);
1493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1505c6c1daeSBarry Smith }
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith /*@C
153811af0c4SBarry Smith    PetscDrawGetTitle - Gets pointer to title of a `PetscDraw` context.
1545c6c1daeSBarry Smith 
15520f4b53cSBarry Smith    Not Collective
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith    Input Parameter:
1585c6c1daeSBarry Smith .  draw - the graphics context
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith    Output Parameter:
1615c6c1daeSBarry Smith .  title - the title
1625c6c1daeSBarry Smith 
1635c6c1daeSBarry Smith    Level: intermediate
1645c6c1daeSBarry Smith 
165811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetTitle()`
1665c6c1daeSBarry Smith @*/
167d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetTitle(PetscDraw draw, const char *title[])
168d71ae5a4SJacob Faibussowitsch {
1695c6c1daeSBarry Smith   PetscFunctionBegin;
1705c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
1715c6c1daeSBarry Smith   PetscValidPointer(title, 2);
1725c6c1daeSBarry Smith   *title = draw->title;
1733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1745c6c1daeSBarry Smith }
1755c6c1daeSBarry Smith 
1765c6c1daeSBarry Smith /*@C
177811af0c4SBarry Smith    PetscDrawSetTitle - Sets the title of a `PetscDraw` context.
1785c6c1daeSBarry Smith 
179c3339decSBarry Smith    Collective
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith    Input Parameters:
1825c6c1daeSBarry Smith +  draw - the graphics context
1835c6c1daeSBarry Smith -  title - the title
1845c6c1daeSBarry Smith 
1855c6c1daeSBarry Smith    Level: intermediate
1865c6c1daeSBarry Smith 
187811af0c4SBarry Smith    Notes:
188811af0c4SBarry Smith    The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save
189231a95f8SBarry Smith    in the image.
190231a95f8SBarry Smith 
1915c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
1925c6c1daeSBarry Smith    title string after calling this routine.
1935c6c1daeSBarry Smith 
194811af0c4SBarry Smith    You can use `PetscDrawAxisSetLabels()` to indicate a title within the window
195231a95f8SBarry Smith 
196811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetTitle()`, `PetscDrawAppendTitle()`
1975c6c1daeSBarry Smith @*/
198d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetTitle(PetscDraw draw, const char title[])
199d71ae5a4SJacob Faibussowitsch {
2005c6c1daeSBarry Smith   PetscFunctionBegin;
2015c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2025c6c1daeSBarry Smith   PetscValidCharPointer(title, 2);
2039566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->title));
2049566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &draw->title));
205dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, settitle, draw->title);
2063ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2075c6c1daeSBarry Smith }
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith /*@C
210811af0c4SBarry Smith    PetscDrawAppendTitle - Appends to the title of a `PetscDraw` context.
2115c6c1daeSBarry Smith 
212c3339decSBarry Smith    Collective
2135c6c1daeSBarry Smith 
2145c6c1daeSBarry Smith    Input Parameters:
2155c6c1daeSBarry Smith +  draw - the graphics context
2165c6c1daeSBarry Smith -  title - the title
2175c6c1daeSBarry Smith 
21820f4b53cSBarry Smith    Level: advanced
21920f4b53cSBarry Smith 
2205c6c1daeSBarry Smith    Note:
2215c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
2225c6c1daeSBarry Smith    title string after calling this routine.
2235c6c1daeSBarry Smith 
224811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetTitle()`, `PetscDrawGetTitle()`
2255c6c1daeSBarry Smith @*/
226d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawAppendTitle(PetscDraw draw, const char title[])
227d71ae5a4SJacob Faibussowitsch {
2285c6c1daeSBarry Smith   PetscFunctionBegin;
2295c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2305b399a63SLisandro Dalcin   if (title) PetscValidCharPointer(title, 2);
2313ba16761SJacob Faibussowitsch   if (!title || !title[0]) PetscFunctionReturn(PETSC_SUCCESS);
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith   if (draw->title) {
234c6a7a370SJeremy L Thompson     size_t len1, len2, new_len;
235c6a7a370SJeremy L Thompson     PetscCall(PetscStrlen(draw->title, &len1));
236c6a7a370SJeremy L Thompson     PetscCall(PetscStrlen(title, &len2));
237c6a7a370SJeremy L Thompson     new_len = len1 + len2 + 1;
238c6a7a370SJeremy L Thompson     PetscCall(PetscRealloc(new_len * sizeof(*(draw->title)), &draw->title));
239c6a7a370SJeremy L Thompson     PetscCall(PetscStrncpy(draw->title + len1, title, len2 + 1));
2405c6c1daeSBarry Smith   } else {
2419566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(title, &draw->title));
2425c6c1daeSBarry Smith   }
243dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, settitle, draw->title);
2443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2455c6c1daeSBarry Smith }
2465c6c1daeSBarry Smith 
247d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
248d71ae5a4SJacob Faibussowitsch {
249e118a51fSLisandro Dalcin   PetscFunctionBegin;
2503ba16761SJacob Faibussowitsch   if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(PETSC_SUCCESS);
2519566063dSJacob Faibussowitsch   PetscCall(PetscDrawSaveMovie(draw));
252e118a51fSLisandro Dalcin   if (draw->savefinalfilename) {
253df8d4941SLisandro Dalcin     draw->savesinglefile = PETSC_TRUE;
2549566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetSave(draw, draw->savefinalfilename));
2559566063dSJacob Faibussowitsch     PetscCall(PetscDrawSave(draw));
256e118a51fSLisandro Dalcin   }
2579566063dSJacob Faibussowitsch   PetscCall(PetscBarrier((PetscObject)draw));
2583ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
259e118a51fSLisandro Dalcin }
260e118a51fSLisandro Dalcin 
2615c6c1daeSBarry Smith /*@
2625c6c1daeSBarry Smith    PetscDrawDestroy - Deletes a draw context.
2635c6c1daeSBarry Smith 
264c3339decSBarry Smith    Collective
2655c6c1daeSBarry Smith 
26620f4b53cSBarry Smith    Input Parameter:
2675c6c1daeSBarry Smith .  draw - the drawing context
2685c6c1daeSBarry Smith 
2695c6c1daeSBarry Smith    Level: beginner
2705c6c1daeSBarry Smith 
271811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`
2725c6c1daeSBarry Smith @*/
273d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawDestroy(PetscDraw *draw)
274d71ae5a4SJacob Faibussowitsch {
2755c6c1daeSBarry Smith   PetscFunctionBegin;
2763ba16761SJacob Faibussowitsch   if (!*draw) PetscFunctionReturn(PETSC_SUCCESS);
2775c6c1daeSBarry Smith   PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 1);
2783ba16761SJacob Faibussowitsch   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(PETSC_SUCCESS);
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith   if ((*draw)->pause == -2) {
2815c6c1daeSBarry Smith     (*draw)->pause = -1;
2829566063dSJacob Faibussowitsch     PetscCall(PetscDrawPause(*draw));
2835c6c1daeSBarry Smith   }
2845c6c1daeSBarry Smith 
2855c6c1daeSBarry Smith   /* if memory was published then destroy it */
2869566063dSJacob Faibussowitsch   PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw));
2875c6c1daeSBarry Smith 
2889566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy_Private(*draw));
289e118a51fSLisandro Dalcin 
29048a46eb9SPierre Jolivet   if ((*draw)->ops->destroy) PetscCall((*(*draw)->ops->destroy)(*draw));
2919566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*draw)->popup));
2929566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->title));
2939566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->display));
2949566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefilename));
2959566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->saveimageext));
2969566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savemovieext));
2979566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefinalfilename));
2989566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(draw));
2993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3005c6c1daeSBarry Smith }
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith /*@
303811af0c4SBarry Smith    PetscDrawGetPopup - Creates a popup window associated with a `PetscDraw` window.
3045c6c1daeSBarry Smith 
305c3339decSBarry Smith    Collective
3065c6c1daeSBarry Smith 
3075c6c1daeSBarry Smith    Input Parameter:
3085c6c1daeSBarry Smith .  draw - the original window
3095c6c1daeSBarry Smith 
3105c6c1daeSBarry Smith    Output Parameter:
3115c6c1daeSBarry Smith .  popup - the new popup window
3125c6c1daeSBarry Smith 
3135c6c1daeSBarry Smith    Level: advanced
3145c6c1daeSBarry Smith 
315811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawScalePopup()`, `PetscDrawCreate()`
3165c6c1daeSBarry Smith @*/
317d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetPopup(PetscDraw draw, PetscDraw *popup)
318d71ae5a4SJacob Faibussowitsch {
3195c6c1daeSBarry Smith   PetscFunctionBegin;
3205c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3215c6c1daeSBarry Smith   PetscValidPointer(popup, 2);
3225c6c1daeSBarry Smith 
323a297a907SKarl Rupp   if (draw->popup) *popup = draw->popup;
324a297a907SKarl Rupp   else if (draw->ops->getpopup) {
325dbbe0bcdSBarry Smith     PetscUseTypeMethod(draw, getpopup, popup);
3260b874712SBarry Smith     if (*popup) {
3279566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup, "popup_"));
328e118a51fSLisandro Dalcin       (*popup)->pause = 0.0;
3299566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetFromOptions(*popup));
33061f59835SBarry Smith     }
3310298fd71SBarry Smith   } else *popup = NULL;
3323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3335c6c1daeSBarry Smith }
3345c6c1daeSBarry Smith 
33594ef8ddeSSatish Balay /*@C
336811af0c4SBarry Smith   PetscDrawSetDisplay - Sets the display where a `PetscDraw` object will be displayed
3375c6c1daeSBarry Smith 
338d8d19677SJose E. Roman   Input Parameters:
3395c6c1daeSBarry Smith + draw - the drawing context
3405c6c1daeSBarry Smith - display - the X windows display
3415c6c1daeSBarry Smith 
3425c6c1daeSBarry Smith   Level: advanced
3435c6c1daeSBarry Smith 
344811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawOpenX()`, `PetscDrawCreate()`
3455c6c1daeSBarry Smith @*/
346d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetDisplay(PetscDraw draw, const char display[])
347d71ae5a4SJacob Faibussowitsch {
3485c6c1daeSBarry Smith   PetscFunctionBegin;
3499566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->display));
3509566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &draw->display));
3513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3525c6c1daeSBarry Smith }
3535c6c1daeSBarry Smith 
35445f3bb6eSLisandro Dalcin /*@
35545f3bb6eSLisandro Dalcin    PetscDrawSetDoubleBuffer - Sets a window to be double buffered.
35645f3bb6eSLisandro Dalcin 
357c3339decSBarry Smith    Logically Collective
3585c6c1daeSBarry Smith 
3595c6c1daeSBarry Smith    Input Parameter:
36045f3bb6eSLisandro Dalcin .  draw - the drawing context
36145f3bb6eSLisandro Dalcin 
36245f3bb6eSLisandro Dalcin    Level: intermediate
36345f3bb6eSLisandro Dalcin 
364811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawOpenX()`, `PetscDrawCreate()`
36545f3bb6eSLisandro Dalcin @*/
366d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw draw)
367d71ae5a4SJacob Faibussowitsch {
3685c6c1daeSBarry Smith   PetscFunctionBegin;
36945f3bb6eSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
370dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, setdoublebuffer);
3713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3725c6c1daeSBarry Smith }
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith /*@C
375811af0c4SBarry Smith    PetscDrawGetSingleton - Gain access to a `PetscDraw` object as if it were owned
3765c6c1daeSBarry Smith         by the one process.
3775c6c1daeSBarry Smith 
378c3339decSBarry Smith    Collective
3795c6c1daeSBarry Smith 
3805c6c1daeSBarry Smith    Input Parameter:
3815c6c1daeSBarry Smith .  draw - the original window
3825c6c1daeSBarry Smith 
3835c6c1daeSBarry Smith    Output Parameter:
3845c6c1daeSBarry Smith .  sdraw - the singleton window
3855c6c1daeSBarry Smith 
3865c6c1daeSBarry Smith    Level: advanced
3875c6c1daeSBarry Smith 
388811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRestoreSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()`
3895c6c1daeSBarry Smith @*/
390d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetSingleton(PetscDraw draw, PetscDraw *sdraw)
391d71ae5a4SJacob Faibussowitsch {
3925c6c1daeSBarry Smith   PetscMPIInt size;
3935c6c1daeSBarry Smith 
3945c6c1daeSBarry Smith   PetscFunctionBegin;
3955c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3965c6c1daeSBarry Smith   PetscValidPointer(sdraw, 2);
3975c6c1daeSBarry Smith 
3989566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
399387ef4f7SLisandro Dalcin   if (size == 1) {
4009566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)draw));
401387ef4f7SLisandro Dalcin     *sdraw = draw;
402387ef4f7SLisandro Dalcin   } else {
4035c6c1daeSBarry Smith     if (draw->ops->getsingleton) {
404dbbe0bcdSBarry Smith       PetscUseTypeMethod(draw, getsingleton, sdraw);
40598921bdaSJacob Faibussowitsch     } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot get singleton for this type %s of draw object", ((PetscObject)draw)->type_name);
4065c6c1daeSBarry Smith   }
4073ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4085c6c1daeSBarry Smith }
4095c6c1daeSBarry Smith 
4105c6c1daeSBarry Smith /*@C
411811af0c4SBarry Smith    PetscDrawRestoreSingleton - Remove access to a `PetscDraw` object obtained with `PetscDrawGetSingleton()`
4125c6c1daeSBarry Smith         by the one process.
4135c6c1daeSBarry Smith 
414c3339decSBarry Smith    Collective
4155c6c1daeSBarry Smith 
4165c6c1daeSBarry Smith    Input Parameters:
4175c6c1daeSBarry Smith +  draw - the original window
4185c6c1daeSBarry Smith -  sdraw - the singleton window
4195c6c1daeSBarry Smith 
4205c6c1daeSBarry Smith    Level: advanced
4215c6c1daeSBarry Smith 
422811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()`
4235c6c1daeSBarry Smith @*/
424d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw, PetscDraw *sdraw)
425d71ae5a4SJacob Faibussowitsch {
4265c6c1daeSBarry Smith   PetscMPIInt size;
4275c6c1daeSBarry Smith 
4285c6c1daeSBarry Smith   PetscFunctionBegin;
4295c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
4305c6c1daeSBarry Smith   PetscValidPointer(sdraw, 2);
4315c6c1daeSBarry Smith   PetscValidHeaderSpecific(*sdraw, PETSC_DRAW_CLASSID, 2);
4325c6c1daeSBarry Smith 
4339566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
434387ef4f7SLisandro Dalcin   if (size == 1) {
435387ef4f7SLisandro Dalcin     if (draw == *sdraw) {
4369566063dSJacob Faibussowitsch       PetscCall(PetscObjectDereference((PetscObject)draw));
437387ef4f7SLisandro Dalcin       *sdraw = NULL;
438387ef4f7SLisandro Dalcin     } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot restore singleton, it is not the parent draw");
439dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(draw, restoresingleton, sdraw);
4403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4415c6c1daeSBarry Smith }
442bb09dc67SDuncan Campbell 
443bb09dc67SDuncan Campbell /*@C
444bb09dc67SDuncan Campbell   PetscDrawSetVisible - Sets if the drawing surface (the 'window') is visible on its display.
445bb09dc67SDuncan Campbell 
446bb09dc67SDuncan Campbell   Input Parameters:
447bb09dc67SDuncan Campbell + draw - the drawing window
448bb09dc67SDuncan Campbell - visible - if the surface should be visible
449bb09dc67SDuncan Campbell 
45053c0d4aeSBarry Smith   Level: intermediate
45153c0d4aeSBarry Smith 
452bb09dc67SDuncan Campbell .seealso: `PetscDraw`
453bb09dc67SDuncan Campbell @*/
454bb09dc67SDuncan Campbell PetscErrorCode PetscDrawSetVisible(PetscDraw draw, PetscBool visible)
455bb09dc67SDuncan Campbell {
456bb09dc67SDuncan Campbell   PetscFunctionBegin;
457bb09dc67SDuncan Campbell   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
458bb09dc67SDuncan Campbell   PetscTryTypeMethod(draw, setvisible, visible);
459bb09dc67SDuncan Campbell   PetscFunctionReturn(PETSC_SUCCESS);
460bb09dc67SDuncan Campbell }
461