xref: /petsc/src/sys/classes/draw/interface/draw.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 
17db781477SPatrick Sanan .seealso: `PetscFinalize()`
185c6c1daeSBarry Smith @*/
199371c9d4SSatish Balay PetscErrorCode   PetscDrawFinalizePackage(void) {
205c6c1daeSBarry Smith     PetscFunctionBegin;
219566063dSJacob Faibussowitsch     PetscCall(PetscFunctionListDestroy(&PetscDrawList));
225c6c1daeSBarry Smith     PetscDrawPackageInitialized = PETSC_FALSE;
230f51fdf8SToby Isaac     PetscDrawRegisterAllCalled  = PETSC_FALSE;
245c6c1daeSBarry Smith     PetscFunctionReturn(0);
255c6c1daeSBarry Smith }
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith /*@C
285c6c1daeSBarry Smith   PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called
298a690491SBarry Smith   from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to PetscInitialize()
308a690491SBarry Smith   when using shared or static libraries.
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith   Level: developer
335c6c1daeSBarry Smith 
34db781477SPatrick Sanan .seealso: `PetscInitialize()`
355c6c1daeSBarry Smith @*/
369371c9d4SSatish Balay PetscErrorCode PetscDrawInitializePackage(void) {
375c6c1daeSBarry Smith   char      logList[256];
388e81d068SLisandro Dalcin   PetscBool opt, pkg;
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith   PetscFunctionBegin;
415c6c1daeSBarry Smith   if (PetscDrawPackageInitialized) PetscFunctionReturn(0);
425c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_TRUE;
435c6c1daeSBarry Smith   /* Register Classes */
449566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Draw", &PETSC_DRAW_CLASSID));
459566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Draw Axis", &PETSC_DRAWAXIS_CLASSID));
469566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Line Graph", &PETSC_DRAWLG_CLASSID));
479566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Histogram", &PETSC_DRAWHG_CLASSID));
489566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Bar Graph", &PETSC_DRAWBAR_CLASSID));
499566063dSJacob Faibussowitsch   PetscCall(PetscClassIdRegister("Scatter Plot", &PETSC_DRAWSP_CLASSID));
505c6c1daeSBarry Smith   /* Register Constructors */
519566063dSJacob Faibussowitsch   PetscCall(PetscDrawRegisterAll());
52e94e781bSJacob Faibussowitsch   /* Process Info */
53e94e781bSJacob Faibussowitsch   {
54e94e781bSJacob Faibussowitsch     PetscClassId classids[6];
55e94e781bSJacob Faibussowitsch 
56e94e781bSJacob Faibussowitsch     classids[0] = PETSC_DRAW_CLASSID;
57e94e781bSJacob Faibussowitsch     classids[1] = PETSC_DRAWAXIS_CLASSID;
58e94e781bSJacob Faibussowitsch     classids[2] = PETSC_DRAWLG_CLASSID;
59e94e781bSJacob Faibussowitsch     classids[3] = PETSC_DRAWHG_CLASSID;
60e94e781bSJacob Faibussowitsch     classids[4] = PETSC_DRAWBAR_CLASSID;
61e94e781bSJacob Faibussowitsch     classids[5] = PETSC_DRAWSP_CLASSID;
629566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("draw", 6, classids));
635c6c1daeSBarry Smith   }
645c6c1daeSBarry Smith   /* Process summary exclusions */
659566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
665c6c1daeSBarry Smith   if (opt) {
679566063dSJacob Faibussowitsch     PetscCall(PetscStrInList("draw", logList, ',', &pkg));
688e81d068SLisandro Dalcin     if (pkg) {
699566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAW_CLASSID));
709566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID));
719566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID));
729566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID));
739566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID));
749566063dSJacob Faibussowitsch       PetscCall(PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID));
755c6c1daeSBarry Smith     }
765c6c1daeSBarry Smith   }
778e81d068SLisandro Dalcin   /* Register package finalizer */
789566063dSJacob Faibussowitsch   PetscCall(PetscRegisterFinalize(PetscDrawFinalizePackage));
795c6c1daeSBarry Smith   PetscFunctionReturn(0);
805c6c1daeSBarry Smith }
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith /*@
835c6c1daeSBarry Smith    PetscDrawResizeWindow - Allows one to resize a window from a program.
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith    Collective on PetscDraw
865c6c1daeSBarry Smith 
87d8d19677SJose E. Roman    Input Parameters:
885c6c1daeSBarry Smith +  draw - the window
895c6c1daeSBarry Smith -  w,h - the new width and height of the window
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith    Level: intermediate
925c6c1daeSBarry Smith 
93db781477SPatrick Sanan .seealso: `PetscDrawCheckResizedWindow()`
945c6c1daeSBarry Smith @*/
959371c9d4SSatish Balay PetscErrorCode PetscDrawResizeWindow(PetscDraw draw, int w, int h) {
965c6c1daeSBarry Smith   PetscFunctionBegin;
9773ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
9873ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw, w, 2);
9973ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw, h, 3);
100dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, resizewindow, w, h);
1015c6c1daeSBarry Smith   PetscFunctionReturn(0);
1025c6c1daeSBarry Smith }
1035c6c1daeSBarry Smith 
10473ecf448SLisandro Dalcin /*@
10573ecf448SLisandro Dalcin    PetscDrawGetWindowSize - Gets the size of the window.
10673ecf448SLisandro Dalcin 
10773ecf448SLisandro Dalcin    Not collective
10873ecf448SLisandro Dalcin 
10973ecf448SLisandro Dalcin    Input Parameter:
11073ecf448SLisandro Dalcin .  draw - the window
11173ecf448SLisandro Dalcin 
11273ecf448SLisandro Dalcin    Output Parameters:
11373ecf448SLisandro Dalcin .  w,h - the window width and height
11473ecf448SLisandro Dalcin 
11573ecf448SLisandro Dalcin    Level: intermediate
11673ecf448SLisandro Dalcin 
117db781477SPatrick Sanan .seealso: `PetscDrawResizeWindow()`, `PetscDrawCheckResizedWindow()`
11873ecf448SLisandro Dalcin @*/
1199371c9d4SSatish Balay PetscErrorCode PetscDrawGetWindowSize(PetscDraw draw, int *w, int *h) {
12073ecf448SLisandro Dalcin   PetscFunctionBegin;
12173ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
12273ecf448SLisandro Dalcin   if (w) PetscValidPointer(w, 2);
12373ecf448SLisandro Dalcin   if (h) PetscValidPointer(h, 3);
12473ecf448SLisandro Dalcin   if (w) *w = draw->w;
12573ecf448SLisandro Dalcin   if (h) *h = draw->h;
12673ecf448SLisandro Dalcin   PetscFunctionReturn(0);
12773ecf448SLisandro Dalcin }
12873ecf448SLisandro Dalcin 
1295c6c1daeSBarry Smith /*@
1305c6c1daeSBarry Smith    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
1315c6c1daeSBarry Smith 
1325c6c1daeSBarry Smith    Collective on PetscDraw
1335c6c1daeSBarry Smith 
1345c6c1daeSBarry Smith    Input Parameter:
1355c6c1daeSBarry Smith .  draw - the window
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith    Level: advanced
1385c6c1daeSBarry Smith 
139db781477SPatrick Sanan .seealso: `PetscDrawResizeWindow()`
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith @*/
1429371c9d4SSatish Balay PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw) {
1435c6c1daeSBarry Smith   PetscFunctionBegin;
14473ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
145dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, checkresizedwindow);
1465c6c1daeSBarry Smith   PetscFunctionReturn(0);
1475c6c1daeSBarry Smith }
1485c6c1daeSBarry Smith 
1495c6c1daeSBarry Smith /*@C
1505c6c1daeSBarry Smith    PetscDrawGetTitle - Gets pointer to title of a PetscDraw context.
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith    Not collective
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith    Input Parameter:
1555c6c1daeSBarry Smith .  draw - the graphics context
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith    Output Parameter:
1585c6c1daeSBarry Smith .  title - the title
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith    Level: intermediate
1615c6c1daeSBarry Smith 
162db781477SPatrick Sanan .seealso: `PetscDrawSetTitle()`
1635c6c1daeSBarry Smith @*/
1649371c9d4SSatish Balay PetscErrorCode PetscDrawGetTitle(PetscDraw draw, const char *title[]) {
1655c6c1daeSBarry Smith   PetscFunctionBegin;
1665c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
1675c6c1daeSBarry Smith   PetscValidPointer(title, 2);
1685c6c1daeSBarry Smith   *title = draw->title;
1695c6c1daeSBarry Smith   PetscFunctionReturn(0);
1705c6c1daeSBarry Smith }
1715c6c1daeSBarry Smith 
1725c6c1daeSBarry Smith /*@C
1735c6c1daeSBarry Smith    PetscDrawSetTitle - Sets the title of a PetscDraw context.
1745c6c1daeSBarry Smith 
1755b399a63SLisandro Dalcin    Collective on PetscDraw
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith    Input Parameters:
1785c6c1daeSBarry Smith +  draw - the graphics context
1795c6c1daeSBarry Smith -  title - the title
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith    Level: intermediate
1825c6c1daeSBarry Smith 
183231a95f8SBarry Smith    Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save
184231a95f8SBarry Smith    in the image.
185231a95f8SBarry Smith 
1865c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
1875c6c1daeSBarry Smith    title string after calling this routine.
1885c6c1daeSBarry Smith 
189231a95f8SBarry Smith    You can use PetscDrawAxisSetLabels() to indicate a title within the window
190231a95f8SBarry Smith 
191db781477SPatrick Sanan .seealso: `PetscDrawGetTitle()`, `PetscDrawAppendTitle()`
1925c6c1daeSBarry Smith @*/
1939371c9d4SSatish Balay PetscErrorCode PetscDrawSetTitle(PetscDraw draw, const char title[]) {
1945c6c1daeSBarry Smith   PetscFunctionBegin;
1955c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
1965c6c1daeSBarry Smith   PetscValidCharPointer(title, 2);
1979566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->title));
1989566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &draw->title));
199dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, settitle, draw->title);
2005c6c1daeSBarry Smith   PetscFunctionReturn(0);
2015c6c1daeSBarry Smith }
2025c6c1daeSBarry Smith 
2035c6c1daeSBarry Smith /*@C
2045c6c1daeSBarry Smith    PetscDrawAppendTitle - Appends to the title of a PetscDraw context.
2055c6c1daeSBarry Smith 
2065b399a63SLisandro Dalcin    Collective on PetscDraw
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith    Input Parameters:
2095c6c1daeSBarry Smith +  draw - the graphics context
2105c6c1daeSBarry Smith -  title - the title
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith    Note:
2135c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
2145c6c1daeSBarry Smith    title string after calling this routine.
2155c6c1daeSBarry Smith 
2165c6c1daeSBarry Smith    Level: advanced
2175c6c1daeSBarry Smith 
218db781477SPatrick Sanan .seealso: `PetscDrawSetTitle()`, `PetscDrawGetTitle()`
2195c6c1daeSBarry Smith @*/
2209371c9d4SSatish Balay PetscErrorCode PetscDrawAppendTitle(PetscDraw draw, const char title[]) {
2215c6c1daeSBarry Smith   PetscFunctionBegin;
2225c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2235b399a63SLisandro Dalcin   if (title) PetscValidCharPointer(title, 2);
2245b399a63SLisandro Dalcin   if (!title || !title[0]) PetscFunctionReturn(0);
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith   if (draw->title) {
2275b399a63SLisandro Dalcin     size_t len1, len2;
2285b399a63SLisandro Dalcin     char  *newtitle;
2299566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(title, &len1));
2309566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(draw->title, &len2));
2319566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(len1 + len2 + 1, &newtitle));
2329566063dSJacob Faibussowitsch     PetscCall(PetscStrcpy(newtitle, draw->title));
2339566063dSJacob Faibussowitsch     PetscCall(PetscStrcat(newtitle, title));
2349566063dSJacob Faibussowitsch     PetscCall(PetscFree(draw->title));
2355c6c1daeSBarry Smith     draw->title = newtitle;
2365c6c1daeSBarry Smith   } else {
2379566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(title, &draw->title));
2385c6c1daeSBarry Smith   }
239dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, settitle, draw->title);
2405c6c1daeSBarry Smith   PetscFunctionReturn(0);
2415c6c1daeSBarry Smith }
2425c6c1daeSBarry Smith 
2439371c9d4SSatish Balay static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw) {
244e118a51fSLisandro Dalcin   PetscFunctionBegin;
2458067a7d5SLisandro Dalcin   if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0);
2469566063dSJacob Faibussowitsch   PetscCall(PetscDrawSaveMovie(draw));
247e118a51fSLisandro Dalcin   if (draw->savefinalfilename) {
248df8d4941SLisandro Dalcin     draw->savesinglefile = PETSC_TRUE;
2499566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetSave(draw, draw->savefinalfilename));
2509566063dSJacob Faibussowitsch     PetscCall(PetscDrawSave(draw));
251e118a51fSLisandro Dalcin   }
2529566063dSJacob Faibussowitsch   PetscCall(PetscBarrier((PetscObject)draw));
253e118a51fSLisandro Dalcin   PetscFunctionReturn(0);
254e118a51fSLisandro Dalcin }
255e118a51fSLisandro Dalcin 
2565c6c1daeSBarry Smith /*@
2575c6c1daeSBarry Smith    PetscDrawDestroy - Deletes a draw context.
2585c6c1daeSBarry Smith 
2595c6c1daeSBarry Smith    Collective on PetscDraw
2605c6c1daeSBarry Smith 
2615c6c1daeSBarry Smith    Input Parameters:
2625c6c1daeSBarry Smith .  draw - the drawing context
2635c6c1daeSBarry Smith 
2645c6c1daeSBarry Smith    Level: beginner
2655c6c1daeSBarry Smith 
266db781477SPatrick Sanan .seealso: `PetscDrawCreate()`
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith @*/
2699371c9d4SSatish Balay PetscErrorCode PetscDrawDestroy(PetscDraw *draw) {
2705c6c1daeSBarry Smith   PetscFunctionBegin;
2715c6c1daeSBarry Smith   if (!*draw) PetscFunctionReturn(0);
2725c6c1daeSBarry Smith   PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 1);
2735c6c1daeSBarry Smith   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0);
2745c6c1daeSBarry Smith 
2755c6c1daeSBarry Smith   if ((*draw)->pause == -2) {
2765c6c1daeSBarry Smith     (*draw)->pause = -1;
2779566063dSJacob Faibussowitsch     PetscCall(PetscDrawPause(*draw));
2785c6c1daeSBarry Smith   }
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith   /* if memory was published then destroy it */
2819566063dSJacob Faibussowitsch   PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw));
2825c6c1daeSBarry Smith 
2839566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy_Private(*draw));
284e118a51fSLisandro Dalcin 
285*48a46eb9SPierre Jolivet   if ((*draw)->ops->destroy) PetscCall((*(*draw)->ops->destroy)(*draw));
2869566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*draw)->popup));
2879566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->title));
2889566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->display));
2899566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefilename));
2909566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->saveimageext));
2919566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savemovieext));
2929566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefinalfilename));
2939566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(draw));
2945c6c1daeSBarry Smith   PetscFunctionReturn(0);
2955c6c1daeSBarry Smith }
2965c6c1daeSBarry Smith 
2975c6c1daeSBarry Smith /*@
2985c6c1daeSBarry Smith    PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith    Collective on PetscDraw
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith    Input Parameter:
3035c6c1daeSBarry Smith .  draw - the original window
3045c6c1daeSBarry Smith 
3055c6c1daeSBarry Smith    Output Parameter:
3065c6c1daeSBarry Smith .  popup - the new popup window
3075c6c1daeSBarry Smith 
3085c6c1daeSBarry Smith    Level: advanced
3095c6c1daeSBarry Smith 
310db781477SPatrick Sanan .seealso: `PetscDrawScalePopup()`, `PetscDrawCreate()`
311ba1e01c4SBarry Smith 
3125c6c1daeSBarry Smith @*/
3139371c9d4SSatish Balay PetscErrorCode PetscDrawGetPopup(PetscDraw draw, PetscDraw *popup) {
3145c6c1daeSBarry Smith   PetscFunctionBegin;
3155c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3165c6c1daeSBarry Smith   PetscValidPointer(popup, 2);
3175c6c1daeSBarry Smith 
318a297a907SKarl Rupp   if (draw->popup) *popup = draw->popup;
319a297a907SKarl Rupp   else if (draw->ops->getpopup) {
320dbbe0bcdSBarry Smith     PetscUseTypeMethod(draw, getpopup, popup);
3210b874712SBarry Smith     if (*popup) {
3229566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup, "popup_"));
323e118a51fSLisandro Dalcin       (*popup)->pause = 0.0;
3249566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetFromOptions(*popup));
32561f59835SBarry Smith     }
3260298fd71SBarry Smith   } else *popup = NULL;
3275c6c1daeSBarry Smith   PetscFunctionReturn(0);
3285c6c1daeSBarry Smith }
3295c6c1daeSBarry Smith 
33094ef8ddeSSatish Balay /*@C
3315c6c1daeSBarry Smith   PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
3325c6c1daeSBarry Smith 
333d8d19677SJose E. Roman   Input Parameters:
3345c6c1daeSBarry Smith + draw - the drawing context
3355c6c1daeSBarry Smith - display - the X windows display
3365c6c1daeSBarry Smith 
3375c6c1daeSBarry Smith   Level: advanced
3385c6c1daeSBarry Smith 
339db781477SPatrick Sanan .seealso: `PetscDrawCreate()`
340ba1e01c4SBarry Smith 
3415c6c1daeSBarry Smith @*/
3429371c9d4SSatish Balay PetscErrorCode PetscDrawSetDisplay(PetscDraw draw, const char display[]) {
3435c6c1daeSBarry Smith   PetscFunctionBegin;
3449566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->display));
3459566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &draw->display));
3465c6c1daeSBarry Smith   PetscFunctionReturn(0);
3475c6c1daeSBarry Smith }
3485c6c1daeSBarry Smith 
34945f3bb6eSLisandro Dalcin /*@
35045f3bb6eSLisandro Dalcin    PetscDrawSetDoubleBuffer - Sets a window to be double buffered.
35145f3bb6eSLisandro Dalcin 
35245f3bb6eSLisandro Dalcin    Logically Collective on PetscDraw
3535c6c1daeSBarry Smith 
3545c6c1daeSBarry Smith    Input Parameter:
35545f3bb6eSLisandro Dalcin .  draw - the drawing context
35645f3bb6eSLisandro Dalcin 
35745f3bb6eSLisandro Dalcin    Level: intermediate
35845f3bb6eSLisandro Dalcin 
35945f3bb6eSLisandro Dalcin @*/
3609371c9d4SSatish Balay PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw draw) {
3615c6c1daeSBarry Smith   PetscFunctionBegin;
36245f3bb6eSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
363dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, setdoublebuffer);
3645c6c1daeSBarry Smith   PetscFunctionReturn(0);
3655c6c1daeSBarry Smith }
3665c6c1daeSBarry Smith 
3675c6c1daeSBarry Smith /*@C
3685c6c1daeSBarry Smith    PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned
3695c6c1daeSBarry Smith         by the one process.
3705c6c1daeSBarry Smith 
3715c6c1daeSBarry Smith    Collective on PetscDraw
3725c6c1daeSBarry Smith 
3735c6c1daeSBarry Smith    Input Parameter:
3745c6c1daeSBarry Smith .  draw - the original window
3755c6c1daeSBarry Smith 
3765c6c1daeSBarry Smith    Output Parameter:
3775c6c1daeSBarry Smith .  sdraw - the singleton window
3785c6c1daeSBarry Smith 
3795c6c1daeSBarry Smith    Level: advanced
3805c6c1daeSBarry Smith 
381db781477SPatrick Sanan .seealso: `PetscDrawRestoreSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()`
3825c6c1daeSBarry Smith 
3835c6c1daeSBarry Smith @*/
3849371c9d4SSatish Balay PetscErrorCode PetscDrawGetSingleton(PetscDraw draw, PetscDraw *sdraw) {
3855c6c1daeSBarry Smith   PetscMPIInt size;
3865c6c1daeSBarry Smith 
3875c6c1daeSBarry Smith   PetscFunctionBegin;
3885c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3895c6c1daeSBarry Smith   PetscValidPointer(sdraw, 2);
3905c6c1daeSBarry Smith 
3919566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
392387ef4f7SLisandro Dalcin   if (size == 1) {
3939566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)draw));
394387ef4f7SLisandro Dalcin     *sdraw = draw;
395387ef4f7SLisandro Dalcin   } else {
3965c6c1daeSBarry Smith     if (draw->ops->getsingleton) {
397dbbe0bcdSBarry Smith       PetscUseTypeMethod(draw, getsingleton, sdraw);
39898921bdaSJacob Faibussowitsch     } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot get singleton for this type %s of draw object", ((PetscObject)draw)->type_name);
3995c6c1daeSBarry Smith   }
4005c6c1daeSBarry Smith   PetscFunctionReturn(0);
4015c6c1daeSBarry Smith }
4025c6c1daeSBarry Smith 
4035c6c1daeSBarry Smith /*@C
4045c6c1daeSBarry Smith    PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned
4055c6c1daeSBarry Smith         by the one process.
4065c6c1daeSBarry Smith 
4075c6c1daeSBarry Smith    Collective on PetscDraw
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith    Input Parameters:
4105c6c1daeSBarry Smith +  draw - the original window
4115c6c1daeSBarry Smith -  sdraw - the singleton window
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith    Level: advanced
4145c6c1daeSBarry Smith 
415db781477SPatrick Sanan .seealso: `PetscDrawGetSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()`
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith @*/
4189371c9d4SSatish Balay PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw, PetscDraw *sdraw) {
4195c6c1daeSBarry Smith   PetscMPIInt size;
4205c6c1daeSBarry Smith 
4215c6c1daeSBarry Smith   PetscFunctionBegin;
4225c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
4235c6c1daeSBarry Smith   PetscValidPointer(sdraw, 2);
4245c6c1daeSBarry Smith   PetscValidHeaderSpecific(*sdraw, PETSC_DRAW_CLASSID, 2);
4255c6c1daeSBarry Smith 
4269566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
427387ef4f7SLisandro Dalcin   if (size == 1) {
428387ef4f7SLisandro Dalcin     if (draw == *sdraw) {
4299566063dSJacob Faibussowitsch       PetscCall(PetscObjectDereference((PetscObject)draw));
430387ef4f7SLisandro Dalcin       *sdraw = NULL;
431387ef4f7SLisandro Dalcin     } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot restore singleton, it is not the parent draw");
432dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(draw, restoresingleton, sdraw);
4335c6c1daeSBarry Smith   PetscFunctionReturn(0);
4345c6c1daeSBarry Smith }
435