xref: /petsc/src/sys/classes/draw/interface/draw.c (revision dbbe0bcd3f3a8fbab5a45420dc06f8387e5764c6)
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 @*/
195c6c1daeSBarry Smith PetscErrorCode  PetscDrawFinalizePackage(void)
205c6c1daeSBarry Smith {
215c6c1daeSBarry Smith   PetscFunctionBegin;
229566063dSJacob 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 
35db781477SPatrick Sanan .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 */
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));
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 
95db781477SPatrick Sanan .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);
103*dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw,resizewindow,w,h);
1045c6c1daeSBarry Smith   PetscFunctionReturn(0);
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 
120db781477SPatrick Sanan .seealso: `PetscDrawResizeWindow()`, `PetscDrawCheckResizedWindow()`
12173ecf448SLisandro Dalcin @*/
12273ecf448SLisandro Dalcin PetscErrorCode  PetscDrawGetWindowSize(PetscDraw draw,int *w,int *h)
12373ecf448SLisandro Dalcin {
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;
13073ecf448SLisandro Dalcin   PetscFunctionReturn(0);
13173ecf448SLisandro Dalcin }
13273ecf448SLisandro Dalcin 
1335c6c1daeSBarry Smith /*@
1345c6c1daeSBarry Smith    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
1355c6c1daeSBarry Smith 
1365c6c1daeSBarry Smith    Collective on PetscDraw
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith    Input Parameter:
1395c6c1daeSBarry Smith .  draw - the window
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith    Level: advanced
1425c6c1daeSBarry Smith 
143db781477SPatrick Sanan .seealso: `PetscDrawResizeWindow()`
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith @*/
1465c6c1daeSBarry Smith PetscErrorCode  PetscDrawCheckResizedWindow(PetscDraw draw)
1475c6c1daeSBarry Smith {
1485c6c1daeSBarry Smith   PetscFunctionBegin;
14973ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
150*dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw,checkresizedwindow);
1515c6c1daeSBarry Smith   PetscFunctionReturn(0);
1525c6c1daeSBarry Smith }
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith /*@C
1555c6c1daeSBarry Smith    PetscDrawGetTitle - Gets pointer to title of a PetscDraw context.
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith    Not collective
1585c6c1daeSBarry Smith 
1595c6c1daeSBarry Smith    Input Parameter:
1605c6c1daeSBarry Smith .  draw - the graphics context
1615c6c1daeSBarry Smith 
1625c6c1daeSBarry Smith    Output Parameter:
1635c6c1daeSBarry Smith .  title - the title
1645c6c1daeSBarry Smith 
1655c6c1daeSBarry Smith    Level: intermediate
1665c6c1daeSBarry Smith 
167db781477SPatrick Sanan .seealso: `PetscDrawSetTitle()`
1685c6c1daeSBarry Smith @*/
169f60c72e3SLisandro Dalcin PetscErrorCode  PetscDrawGetTitle(PetscDraw draw,const char *title[])
1705c6c1daeSBarry Smith {
1715c6c1daeSBarry Smith   PetscFunctionBegin;
1725c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1735c6c1daeSBarry Smith   PetscValidPointer(title,2);
1745c6c1daeSBarry Smith   *title = draw->title;
1755c6c1daeSBarry Smith   PetscFunctionReturn(0);
1765c6c1daeSBarry Smith }
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith /*@C
1795c6c1daeSBarry Smith    PetscDrawSetTitle - Sets the title of a PetscDraw context.
1805c6c1daeSBarry Smith 
1815b399a63SLisandro Dalcin    Collective on PetscDraw
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith    Input Parameters:
1845c6c1daeSBarry Smith +  draw - the graphics context
1855c6c1daeSBarry Smith -  title - the title
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith    Level: intermediate
1885c6c1daeSBarry Smith 
189231a95f8SBarry Smith    Note: 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 
195231a95f8SBarry Smith    You can use PetscDrawAxisSetLabels() to indicate a title within the window
196231a95f8SBarry Smith 
197db781477SPatrick Sanan .seealso: `PetscDrawGetTitle()`, `PetscDrawAppendTitle()`
1985c6c1daeSBarry Smith @*/
1995c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetTitle(PetscDraw draw,const char title[])
2005c6c1daeSBarry Smith {
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));
206*dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw,settitle,draw->title);
2075c6c1daeSBarry Smith   PetscFunctionReturn(0);
2085c6c1daeSBarry Smith }
2095c6c1daeSBarry Smith 
2105c6c1daeSBarry Smith /*@C
2115c6c1daeSBarry Smith    PetscDrawAppendTitle - Appends to the title of a PetscDraw context.
2125c6c1daeSBarry Smith 
2135b399a63SLisandro Dalcin    Collective on PetscDraw
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 
225db781477SPatrick Sanan .seealso: `PetscDrawSetTitle()`, `PetscDrawGetTitle()`
2265c6c1daeSBarry Smith @*/
2275c6c1daeSBarry Smith PetscErrorCode  PetscDrawAppendTitle(PetscDraw draw,const char title[])
2285c6c1daeSBarry Smith {
2295c6c1daeSBarry Smith   PetscFunctionBegin;
2305c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2315b399a63SLisandro Dalcin   if (title) PetscValidCharPointer(title,2);
2325b399a63SLisandro Dalcin   if (!title || !title[0]) PetscFunctionReturn(0);
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   }
247*dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw,settitle,draw->title);
2485c6c1daeSBarry Smith   PetscFunctionReturn(0);
2495c6c1daeSBarry Smith }
2505c6c1daeSBarry Smith 
251e118a51fSLisandro Dalcin static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
252e118a51fSLisandro Dalcin {
253e118a51fSLisandro Dalcin   PetscFunctionBegin;
2548067a7d5SLisandro Dalcin   if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0);
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));
262e118a51fSLisandro Dalcin   PetscFunctionReturn(0);
263e118a51fSLisandro Dalcin }
264e118a51fSLisandro Dalcin 
2655c6c1daeSBarry Smith /*@
2665c6c1daeSBarry Smith    PetscDrawDestroy - Deletes a draw context.
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith    Collective on PetscDraw
2695c6c1daeSBarry Smith 
2705c6c1daeSBarry Smith    Input Parameters:
2715c6c1daeSBarry Smith .  draw - the drawing context
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith    Level: beginner
2745c6c1daeSBarry Smith 
275db781477SPatrick Sanan .seealso: `PetscDrawCreate()`
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith @*/
2785c6c1daeSBarry Smith PetscErrorCode  PetscDrawDestroy(PetscDraw *draw)
2795c6c1daeSBarry Smith {
2805c6c1daeSBarry Smith   PetscFunctionBegin;
2815c6c1daeSBarry Smith   if (!*draw) PetscFunctionReturn(0);
2825c6c1daeSBarry Smith   PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1);
2835c6c1daeSBarry Smith   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0);
2845c6c1daeSBarry Smith 
2855c6c1daeSBarry Smith   if ((*draw)->pause == -2) {
2865c6c1daeSBarry Smith     (*draw)->pause = -1;
2879566063dSJacob Faibussowitsch     PetscCall(PetscDrawPause(*draw));
2885c6c1daeSBarry Smith   }
2895c6c1daeSBarry Smith 
2905c6c1daeSBarry Smith   /* if memory was published then destroy it */
2919566063dSJacob Faibussowitsch   PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw));
2925c6c1daeSBarry Smith 
2939566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy_Private(*draw));
294e118a51fSLisandro Dalcin 
2955c6c1daeSBarry Smith   if ((*draw)->ops->destroy) {
2969566063dSJacob Faibussowitsch     PetscCall((*(*draw)->ops->destroy)(*draw));
2975c6c1daeSBarry Smith   }
2989566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*draw)->popup));
2999566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->title));
3009566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->display));
3019566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefilename));
3029566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->saveimageext));
3039566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savemovieext));
3049566063dSJacob Faibussowitsch   PetscCall(PetscFree((*draw)->savefinalfilename));
3059566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(draw));
3065c6c1daeSBarry Smith   PetscFunctionReturn(0);
3075c6c1daeSBarry Smith }
3085c6c1daeSBarry Smith 
3095c6c1daeSBarry Smith /*@
3105c6c1daeSBarry Smith    PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith    Collective on PetscDraw
3135c6c1daeSBarry Smith 
3145c6c1daeSBarry Smith    Input Parameter:
3155c6c1daeSBarry Smith .  draw - the original window
3165c6c1daeSBarry Smith 
3175c6c1daeSBarry Smith    Output Parameter:
3185c6c1daeSBarry Smith .  popup - the new popup window
3195c6c1daeSBarry Smith 
3205c6c1daeSBarry Smith    Level: advanced
3215c6c1daeSBarry Smith 
322db781477SPatrick Sanan .seealso: `PetscDrawScalePopup()`, `PetscDrawCreate()`
323ba1e01c4SBarry Smith 
3245c6c1daeSBarry Smith @*/
3255c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup)
3265c6c1daeSBarry Smith {
3275c6c1daeSBarry Smith   PetscFunctionBegin;
3285c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3295c6c1daeSBarry Smith   PetscValidPointer(popup,2);
3305c6c1daeSBarry Smith 
331a297a907SKarl Rupp   if (draw->popup) *popup = draw->popup;
332a297a907SKarl Rupp   else if (draw->ops->getpopup) {
333*dbbe0bcdSBarry Smith     PetscUseTypeMethod(draw,getpopup ,popup);
3340b874712SBarry Smith     if (*popup) {
3359566063dSJacob Faibussowitsch       PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_"));
336e118a51fSLisandro Dalcin       (*popup)->pause = 0.0;
3379566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetFromOptions(*popup));
33861f59835SBarry Smith     }
3390298fd71SBarry Smith   } else *popup = NULL;
3405c6c1daeSBarry Smith   PetscFunctionReturn(0);
3415c6c1daeSBarry Smith }
3425c6c1daeSBarry Smith 
34394ef8ddeSSatish Balay /*@C
3445c6c1daeSBarry Smith   PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
3455c6c1daeSBarry Smith 
346d8d19677SJose E. Roman   Input Parameters:
3475c6c1daeSBarry Smith + draw - the drawing context
3485c6c1daeSBarry Smith - display - the X windows display
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith   Level: advanced
3515c6c1daeSBarry Smith 
352db781477SPatrick Sanan .seealso: `PetscDrawCreate()`
353ba1e01c4SBarry Smith 
3545c6c1daeSBarry Smith @*/
3555c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetDisplay(PetscDraw draw,const char display[])
3565c6c1daeSBarry Smith {
3575c6c1daeSBarry Smith   PetscFunctionBegin;
3589566063dSJacob Faibussowitsch   PetscCall(PetscFree(draw->display));
3599566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display,&draw->display));
3605c6c1daeSBarry Smith   PetscFunctionReturn(0);
3615c6c1daeSBarry Smith }
3625c6c1daeSBarry Smith 
36345f3bb6eSLisandro Dalcin /*@
36445f3bb6eSLisandro Dalcin    PetscDrawSetDoubleBuffer - Sets a window to be double buffered.
36545f3bb6eSLisandro Dalcin 
36645f3bb6eSLisandro Dalcin    Logically Collective on PetscDraw
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith    Input Parameter:
36945f3bb6eSLisandro Dalcin .  draw - the drawing context
37045f3bb6eSLisandro Dalcin 
37145f3bb6eSLisandro Dalcin    Level: intermediate
37245f3bb6eSLisandro Dalcin 
37345f3bb6eSLisandro Dalcin @*/
37445f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawSetDoubleBuffer(PetscDraw draw)
3755c6c1daeSBarry Smith {
3765c6c1daeSBarry Smith   PetscFunctionBegin;
37745f3bb6eSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
378*dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw,setdoublebuffer);
3795c6c1daeSBarry Smith   PetscFunctionReturn(0);
3805c6c1daeSBarry Smith }
3815c6c1daeSBarry Smith 
3825c6c1daeSBarry Smith /*@C
3835c6c1daeSBarry Smith    PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned
3845c6c1daeSBarry Smith         by the one process.
3855c6c1daeSBarry Smith 
3865c6c1daeSBarry Smith    Collective on PetscDraw
3875c6c1daeSBarry Smith 
3885c6c1daeSBarry Smith    Input Parameter:
3895c6c1daeSBarry Smith .  draw - the original window
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith    Output Parameter:
3925c6c1daeSBarry Smith .  sdraw - the singleton window
3935c6c1daeSBarry Smith 
3945c6c1daeSBarry Smith    Level: advanced
3955c6c1daeSBarry Smith 
396db781477SPatrick Sanan .seealso: `PetscDrawRestoreSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()`
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith @*/
3995c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw)
4005c6c1daeSBarry Smith {
4015c6c1daeSBarry Smith   PetscMPIInt    size;
4025c6c1daeSBarry Smith 
4035c6c1daeSBarry Smith   PetscFunctionBegin;
4045c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4055c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
4065c6c1daeSBarry Smith 
4079566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size));
408387ef4f7SLisandro Dalcin   if (size == 1) {
4099566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)draw));
410387ef4f7SLisandro Dalcin     *sdraw = draw;
411387ef4f7SLisandro Dalcin   } else {
4125c6c1daeSBarry Smith     if (draw->ops->getsingleton) {
413*dbbe0bcdSBarry Smith       PetscUseTypeMethod(draw,getsingleton ,sdraw);
41498921bdaSJacob Faibussowitsch     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name);
4155c6c1daeSBarry Smith   }
4165c6c1daeSBarry Smith   PetscFunctionReturn(0);
4175c6c1daeSBarry Smith }
4185c6c1daeSBarry Smith 
4195c6c1daeSBarry Smith /*@C
4205c6c1daeSBarry Smith    PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned
4215c6c1daeSBarry Smith         by the one process.
4225c6c1daeSBarry Smith 
4235c6c1daeSBarry Smith    Collective on PetscDraw
4245c6c1daeSBarry Smith 
4255c6c1daeSBarry Smith    Input Parameters:
4265c6c1daeSBarry Smith +  draw - the original window
4275c6c1daeSBarry Smith -  sdraw - the singleton window
4285c6c1daeSBarry Smith 
4295c6c1daeSBarry Smith    Level: advanced
4305c6c1daeSBarry Smith 
431db781477SPatrick Sanan .seealso: `PetscDrawGetSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()`
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith @*/
4345c6c1daeSBarry Smith PetscErrorCode  PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw)
4355c6c1daeSBarry Smith {
4365c6c1daeSBarry Smith   PetscMPIInt    size;
4375c6c1daeSBarry Smith 
4385c6c1daeSBarry Smith   PetscFunctionBegin;
4395c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4405c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
4415c6c1daeSBarry Smith   PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2);
4425c6c1daeSBarry Smith 
4439566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size));
444387ef4f7SLisandro Dalcin   if (size == 1) {
445387ef4f7SLisandro Dalcin     if (draw == *sdraw) {
4469566063dSJacob Faibussowitsch       PetscCall(PetscObjectDereference((PetscObject)draw));
447387ef4f7SLisandro Dalcin       *sdraw = NULL;
448387ef4f7SLisandro Dalcin     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore singleton, it is not the parent draw");
449*dbbe0bcdSBarry Smith   } else PetscUseTypeMethod(draw,restoresingleton ,sdraw);
4505c6c1daeSBarry Smith   PetscFunctionReturn(0);
4515c6c1daeSBarry Smith }
452