xref: /petsc/src/sys/classes/draw/interface/draw.c (revision d8d19677bbccf95218448bee62e6b87f4513e133)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
45c6c1daeSBarry Smith */
5af0996ceSBarry Smith #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
6665c2dedSJed Brown #include <petscviewer.h>
75c6c1daeSBarry Smith 
85c6c1daeSBarry Smith PetscClassId PETSC_DRAW_CLASSID;
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith static PetscBool PetscDrawPackageInitialized = PETSC_FALSE;
115c6c1daeSBarry Smith /*@C
125c6c1daeSBarry Smith   PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the Draw package. It is
135c6c1daeSBarry Smith   called from PetscFinalize().
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith   Level: developer
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith .seealso: PetscFinalize()
185c6c1daeSBarry Smith @*/
195c6c1daeSBarry Smith PetscErrorCode  PetscDrawFinalizePackage(void)
205c6c1daeSBarry Smith {
2137e93019SBarry Smith   PetscErrorCode ierr;
2237e93019SBarry Smith 
235c6c1daeSBarry Smith   PetscFunctionBegin;
2437e93019SBarry Smith   ierr = PetscFunctionListDestroy(&PetscDrawList);CHKERRQ(ierr);
255c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_FALSE;
260f51fdf8SToby Isaac   PetscDrawRegisterAllCalled  = PETSC_FALSE;
275c6c1daeSBarry Smith   PetscFunctionReturn(0);
285c6c1daeSBarry Smith }
295c6c1daeSBarry Smith 
305c6c1daeSBarry Smith /*@C
315c6c1daeSBarry Smith   PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called
328a690491SBarry Smith   from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to PetscInitialize()
338a690491SBarry Smith   when using shared or static libraries.
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith   Level: developer
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith .seealso: PetscInitialize()
385c6c1daeSBarry Smith @*/
39607a6623SBarry Smith PetscErrorCode  PetscDrawInitializePackage(void)
405c6c1daeSBarry Smith {
415c6c1daeSBarry Smith   char           logList[256];
428e81d068SLisandro Dalcin   PetscBool      opt,pkg;
435c6c1daeSBarry Smith   PetscErrorCode ierr;
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith   PetscFunctionBegin;
465c6c1daeSBarry Smith   if (PetscDrawPackageInitialized) PetscFunctionReturn(0);
475c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_TRUE;
485c6c1daeSBarry Smith   /* Register Classes */
495c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID);CHKERRQ(ierr);
5071917b75SLisandro Dalcin   ierr = PetscClassIdRegister("Draw Axis",&PETSC_DRAWAXIS_CLASSID);CHKERRQ(ierr);
515c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID);CHKERRQ(ierr);
525c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID);CHKERRQ(ierr);
5371917b75SLisandro Dalcin   ierr = PetscClassIdRegister("Bar Graph",&PETSC_DRAWBAR_CLASSID);CHKERRQ(ierr);
545c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID);CHKERRQ(ierr);
555c6c1daeSBarry Smith   /* Register Constructors */
56607a6623SBarry Smith   ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
57e94e781bSJacob Faibussowitsch   /* Process Info */
58e94e781bSJacob Faibussowitsch   {
59e94e781bSJacob Faibussowitsch     PetscClassId  classids[6];
60e94e781bSJacob Faibussowitsch 
61e94e781bSJacob Faibussowitsch     classids[0] = PETSC_DRAW_CLASSID;
62e94e781bSJacob Faibussowitsch     classids[1] = PETSC_DRAWAXIS_CLASSID;
63e94e781bSJacob Faibussowitsch     classids[2] = PETSC_DRAWLG_CLASSID;
64e94e781bSJacob Faibussowitsch     classids[3] = PETSC_DRAWHG_CLASSID;
65e94e781bSJacob Faibussowitsch     classids[4] = PETSC_DRAWBAR_CLASSID;
66e94e781bSJacob Faibussowitsch     classids[5] = PETSC_DRAWSP_CLASSID;
67e94e781bSJacob Faibussowitsch     ierr = PetscInfoProcessClass("draw", 6, classids);CHKERRQ(ierr);
685c6c1daeSBarry Smith   }
695c6c1daeSBarry Smith   /* Process summary exclusions */
708e81d068SLisandro Dalcin   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
715c6c1daeSBarry Smith   if (opt) {
728e81d068SLisandro Dalcin     ierr = PetscStrInList("draw",logList,',',&pkg);CHKERRQ(ierr);
738e81d068SLisandro Dalcin     if (pkg) {
74fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAW_CLASSID);CHKERRQ(ierr);
75fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID);CHKERRQ(ierr);
76fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID);CHKERRQ(ierr);
77fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID);CHKERRQ(ierr);
78fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID);CHKERRQ(ierr);
79fa2bb9feSLisandro Dalcin       ierr = PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID);CHKERRQ(ierr);
805c6c1daeSBarry Smith     }
815c6c1daeSBarry Smith   }
828e81d068SLisandro Dalcin   /* Register package finalizer */
835c6c1daeSBarry Smith   ierr = PetscRegisterFinalize(PetscDrawFinalizePackage);CHKERRQ(ierr);
845c6c1daeSBarry Smith   PetscFunctionReturn(0);
855c6c1daeSBarry Smith }
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith /*@
885c6c1daeSBarry Smith    PetscDrawResizeWindow - Allows one to resize a window from a program.
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith    Collective on PetscDraw
915c6c1daeSBarry Smith 
92*d8d19677SJose E. Roman    Input Parameters:
935c6c1daeSBarry Smith +  draw - the window
945c6c1daeSBarry Smith -  w,h - the new width and height of the window
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith    Level: intermediate
975c6c1daeSBarry Smith 
985c6c1daeSBarry Smith .seealso: PetscDrawCheckResizedWindow()
995c6c1daeSBarry Smith @*/
1005c6c1daeSBarry Smith PetscErrorCode  PetscDrawResizeWindow(PetscDraw draw,int w,int h)
1015c6c1daeSBarry Smith {
1025c6c1daeSBarry Smith   PetscErrorCode ierr;
1035fd66863SKarl Rupp 
1045c6c1daeSBarry Smith   PetscFunctionBegin;
10573ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
10673ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,w,2);
10773ecf448SLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,h,3);
1085c6c1daeSBarry Smith   if (draw->ops->resizewindow) {
1095c6c1daeSBarry Smith     ierr = (*draw->ops->resizewindow)(draw,w,h);CHKERRQ(ierr);
1105c6c1daeSBarry Smith   }
1115c6c1daeSBarry Smith   PetscFunctionReturn(0);
1125c6c1daeSBarry Smith }
1135c6c1daeSBarry Smith 
11473ecf448SLisandro Dalcin /*@
11573ecf448SLisandro Dalcin    PetscDrawGetWindowSize - Gets the size of the window.
11673ecf448SLisandro Dalcin 
11773ecf448SLisandro Dalcin    Not collective
11873ecf448SLisandro Dalcin 
11973ecf448SLisandro Dalcin    Input Parameter:
12073ecf448SLisandro Dalcin .  draw - the window
12173ecf448SLisandro Dalcin 
12273ecf448SLisandro Dalcin    Output Parameters:
12373ecf448SLisandro Dalcin .  w,h - the window width and height
12473ecf448SLisandro Dalcin 
12573ecf448SLisandro Dalcin    Level: intermediate
12673ecf448SLisandro Dalcin 
12773ecf448SLisandro Dalcin .seealso: PetscDrawResizeWindow(), PetscDrawCheckResizedWindow()
12873ecf448SLisandro Dalcin @*/
12973ecf448SLisandro Dalcin PetscErrorCode  PetscDrawGetWindowSize(PetscDraw draw,int *w,int *h)
13073ecf448SLisandro Dalcin {
13173ecf448SLisandro Dalcin   PetscFunctionBegin;
13273ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
13373ecf448SLisandro Dalcin   if (w) PetscValidPointer(w,2);
13473ecf448SLisandro Dalcin   if (h) PetscValidPointer(h,3);
13573ecf448SLisandro Dalcin   if (w) *w = draw->w;
13673ecf448SLisandro Dalcin   if (h) *h = draw->h;
13773ecf448SLisandro Dalcin   PetscFunctionReturn(0);
13873ecf448SLisandro Dalcin }
13973ecf448SLisandro Dalcin 
1405c6c1daeSBarry Smith /*@
1415c6c1daeSBarry Smith    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith    Collective on PetscDraw
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith    Input Parameter:
1465c6c1daeSBarry Smith .  draw - the window
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith    Level: advanced
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith .seealso: PetscDrawResizeWindow()
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith @*/
1535c6c1daeSBarry Smith PetscErrorCode  PetscDrawCheckResizedWindow(PetscDraw draw)
1545c6c1daeSBarry Smith {
1555c6c1daeSBarry Smith   PetscErrorCode ierr;
1565fd66863SKarl Rupp 
1575c6c1daeSBarry Smith   PetscFunctionBegin;
15873ecf448SLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1595c6c1daeSBarry Smith   if (draw->ops->checkresizedwindow) {
1605c6c1daeSBarry Smith     ierr = (*draw->ops->checkresizedwindow)(draw);CHKERRQ(ierr);
1615c6c1daeSBarry Smith   }
1625c6c1daeSBarry Smith   PetscFunctionReturn(0);
1635c6c1daeSBarry Smith }
1645c6c1daeSBarry Smith 
1655c6c1daeSBarry Smith /*@C
1665c6c1daeSBarry Smith    PetscDrawGetTitle - Gets pointer to title of a PetscDraw context.
1675c6c1daeSBarry Smith 
1685c6c1daeSBarry Smith    Not collective
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith    Input Parameter:
1715c6c1daeSBarry Smith .  draw - the graphics context
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith    Output Parameter:
1745c6c1daeSBarry Smith .  title - the title
1755c6c1daeSBarry Smith 
1765c6c1daeSBarry Smith    Level: intermediate
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith .seealso: PetscDrawSetTitle()
1795c6c1daeSBarry Smith @*/
180f60c72e3SLisandro Dalcin PetscErrorCode  PetscDrawGetTitle(PetscDraw draw,const char *title[])
1815c6c1daeSBarry Smith {
1825c6c1daeSBarry Smith   PetscFunctionBegin;
1835c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1845c6c1daeSBarry Smith   PetscValidPointer(title,2);
1855c6c1daeSBarry Smith   *title = draw->title;
1865c6c1daeSBarry Smith   PetscFunctionReturn(0);
1875c6c1daeSBarry Smith }
1885c6c1daeSBarry Smith 
1895c6c1daeSBarry Smith /*@C
1905c6c1daeSBarry Smith    PetscDrawSetTitle - Sets the title of a PetscDraw context.
1915c6c1daeSBarry Smith 
1925b399a63SLisandro Dalcin    Collective on PetscDraw
1935c6c1daeSBarry Smith 
1945c6c1daeSBarry Smith    Input Parameters:
1955c6c1daeSBarry Smith +  draw - the graphics context
1965c6c1daeSBarry Smith -  title - the title
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith    Level: intermediate
1995c6c1daeSBarry Smith 
200231a95f8SBarry Smith    Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save
201231a95f8SBarry Smith    in the image.
202231a95f8SBarry Smith 
2035c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
2045c6c1daeSBarry Smith    title string after calling this routine.
2055c6c1daeSBarry Smith 
206231a95f8SBarry Smith    You can use PetscDrawAxisSetLabels() to indicate a title within the window
207231a95f8SBarry Smith 
2085c6c1daeSBarry Smith .seealso: PetscDrawGetTitle(), PetscDrawAppendTitle()
2095c6c1daeSBarry Smith @*/
2105c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetTitle(PetscDraw draw,const char title[])
2115c6c1daeSBarry Smith {
2125c6c1daeSBarry Smith   PetscErrorCode ierr;
2135fd66863SKarl Rupp 
2145c6c1daeSBarry Smith   PetscFunctionBegin;
2155c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2165c6c1daeSBarry Smith   PetscValidCharPointer(title,2);
2175c6c1daeSBarry Smith   ierr = PetscFree(draw->title);CHKERRQ(ierr);
2185c6c1daeSBarry Smith   ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
2195c6c1daeSBarry Smith   if (draw->ops->settitle) {
220815f00f0SLisandro Dalcin     ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr);
2215c6c1daeSBarry Smith   }
2225c6c1daeSBarry Smith   PetscFunctionReturn(0);
2235c6c1daeSBarry Smith }
2245c6c1daeSBarry Smith 
2255c6c1daeSBarry Smith /*@C
2265c6c1daeSBarry Smith    PetscDrawAppendTitle - Appends to the title of a PetscDraw context.
2275c6c1daeSBarry Smith 
2285b399a63SLisandro Dalcin    Collective on PetscDraw
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith    Input Parameters:
2315c6c1daeSBarry Smith +  draw - the graphics context
2325c6c1daeSBarry Smith -  title - the title
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith    Note:
2355c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
2365c6c1daeSBarry Smith    title string after calling this routine.
2375c6c1daeSBarry Smith 
2385c6c1daeSBarry Smith    Level: advanced
2395c6c1daeSBarry Smith 
2405c6c1daeSBarry Smith .seealso: PetscDrawSetTitle(), PetscDrawGetTitle()
2415c6c1daeSBarry Smith @*/
2425c6c1daeSBarry Smith PetscErrorCode  PetscDrawAppendTitle(PetscDraw draw,const char title[])
2435c6c1daeSBarry Smith {
2445c6c1daeSBarry Smith   PetscErrorCode ierr;
2455c6c1daeSBarry Smith 
2465c6c1daeSBarry Smith   PetscFunctionBegin;
2475c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2485b399a63SLisandro Dalcin   if (title) PetscValidCharPointer(title,2);
2495b399a63SLisandro Dalcin   if (!title || !title[0]) PetscFunctionReturn(0);
2505c6c1daeSBarry Smith 
2515c6c1daeSBarry Smith   if (draw->title) {
2525b399a63SLisandro Dalcin     size_t len1,len2;
2535b399a63SLisandro Dalcin     char   *newtitle;
2545c6c1daeSBarry Smith     ierr = PetscStrlen(title,&len1);CHKERRQ(ierr);
2555c6c1daeSBarry Smith     ierr = PetscStrlen(draw->title,&len2);CHKERRQ(ierr);
2565b399a63SLisandro Dalcin     ierr = PetscMalloc1(len1 + len2 + 1,&newtitle);CHKERRQ(ierr);
2575c6c1daeSBarry Smith     ierr = PetscStrcpy(newtitle,draw->title);CHKERRQ(ierr);
2585c6c1daeSBarry Smith     ierr = PetscStrcat(newtitle,title);CHKERRQ(ierr);
2595c6c1daeSBarry Smith     ierr = PetscFree(draw->title);CHKERRQ(ierr);
2605c6c1daeSBarry Smith     draw->title = newtitle;
2615c6c1daeSBarry Smith   } else {
2625c6c1daeSBarry Smith     ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
2635c6c1daeSBarry Smith   }
2645c6c1daeSBarry Smith   if (draw->ops->settitle) {
2655c6c1daeSBarry Smith     ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr);
2665c6c1daeSBarry Smith   }
2675c6c1daeSBarry Smith   PetscFunctionReturn(0);
2685c6c1daeSBarry Smith }
2695c6c1daeSBarry Smith 
270e118a51fSLisandro Dalcin static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
271e118a51fSLisandro Dalcin {
272e118a51fSLisandro Dalcin   PetscErrorCode ierr;
273e118a51fSLisandro Dalcin 
274e118a51fSLisandro Dalcin   PetscFunctionBegin;
2758067a7d5SLisandro Dalcin   if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0);
27649c04938SLisandro Dalcin   ierr = PetscDrawSaveMovie(draw);CHKERRQ(ierr);
277e118a51fSLisandro Dalcin   if (draw->savefinalfilename) {
278df8d4941SLisandro Dalcin     draw->savesinglefile = PETSC_TRUE;
27949c04938SLisandro Dalcin     ierr = PetscDrawSetSave(draw,draw->savefinalfilename);CHKERRQ(ierr);
280e118a51fSLisandro Dalcin     ierr = PetscDrawSave(draw);CHKERRQ(ierr);
281e118a51fSLisandro Dalcin   }
282e118a51fSLisandro Dalcin   ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr);
283e118a51fSLisandro Dalcin   PetscFunctionReturn(0);
284e118a51fSLisandro Dalcin }
285e118a51fSLisandro Dalcin 
2865c6c1daeSBarry Smith /*@
2875c6c1daeSBarry Smith    PetscDrawDestroy - Deletes a draw context.
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith    Collective on PetscDraw
2905c6c1daeSBarry Smith 
2915c6c1daeSBarry Smith    Input Parameters:
2925c6c1daeSBarry Smith .  draw - the drawing context
2935c6c1daeSBarry Smith 
2945c6c1daeSBarry Smith    Level: beginner
2955c6c1daeSBarry Smith 
2965c6c1daeSBarry Smith .seealso: PetscDrawCreate()
2975c6c1daeSBarry Smith 
2985c6c1daeSBarry Smith @*/
2995c6c1daeSBarry Smith PetscErrorCode  PetscDrawDestroy(PetscDraw *draw)
3005c6c1daeSBarry Smith {
3015c6c1daeSBarry Smith   PetscErrorCode ierr;
3025fd66863SKarl Rupp 
3035c6c1daeSBarry Smith   PetscFunctionBegin;
3045c6c1daeSBarry Smith   if (!*draw) PetscFunctionReturn(0);
3055c6c1daeSBarry Smith   PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1);
3065c6c1daeSBarry Smith   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0);
3075c6c1daeSBarry Smith 
3085c6c1daeSBarry Smith   if ((*draw)->pause == -2) {
3095c6c1daeSBarry Smith     (*draw)->pause = -1;
3105c6c1daeSBarry Smith     ierr = PetscDrawPause(*draw);CHKERRQ(ierr);
3115c6c1daeSBarry Smith   }
3125c6c1daeSBarry Smith 
3135c6c1daeSBarry Smith   /* if memory was published then destroy it */
314e04113cfSBarry Smith   ierr = PetscObjectSAWsViewOff((PetscObject)*draw);CHKERRQ(ierr);
3155c6c1daeSBarry Smith 
316e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy_Private(*draw);CHKERRQ(ierr);
317e118a51fSLisandro Dalcin 
3185c6c1daeSBarry Smith   if ((*draw)->ops->destroy) {
3195c6c1daeSBarry Smith     ierr = (*(*draw)->ops->destroy)(*draw);CHKERRQ(ierr);
3205c6c1daeSBarry Smith   }
321e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*draw)->popup);CHKERRQ(ierr);
3225c6c1daeSBarry Smith   ierr = PetscFree((*draw)->title);CHKERRQ(ierr);
3235c6c1daeSBarry Smith   ierr = PetscFree((*draw)->display);CHKERRQ(ierr);
3245c6c1daeSBarry Smith   ierr = PetscFree((*draw)->savefilename);CHKERRQ(ierr);
3258067a7d5SLisandro Dalcin   ierr = PetscFree((*draw)->saveimageext);CHKERRQ(ierr);
3268067a7d5SLisandro Dalcin   ierr = PetscFree((*draw)->savemovieext);CHKERRQ(ierr);
327287de1a7SBarry Smith   ierr = PetscFree((*draw)->savefinalfilename);CHKERRQ(ierr);
3285c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(draw);CHKERRQ(ierr);
3295c6c1daeSBarry Smith   PetscFunctionReturn(0);
3305c6c1daeSBarry Smith }
3315c6c1daeSBarry Smith 
3325c6c1daeSBarry Smith /*@
3335c6c1daeSBarry Smith    PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
3345c6c1daeSBarry Smith 
3355c6c1daeSBarry Smith    Collective on PetscDraw
3365c6c1daeSBarry Smith 
3375c6c1daeSBarry Smith    Input Parameter:
3385c6c1daeSBarry Smith .  draw - the original window
3395c6c1daeSBarry Smith 
3405c6c1daeSBarry Smith    Output Parameter:
3415c6c1daeSBarry Smith .  popup - the new popup window
3425c6c1daeSBarry Smith 
3435c6c1daeSBarry Smith    Level: advanced
3445c6c1daeSBarry Smith 
345ba1e01c4SBarry Smith .seealso: PetscDrawScalePopup(), PetscDrawCreate()
346ba1e01c4SBarry Smith 
3475c6c1daeSBarry Smith @*/
3485c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup)
3495c6c1daeSBarry Smith {
3505c6c1daeSBarry Smith   PetscErrorCode ierr;
3515fd66863SKarl Rupp 
3525c6c1daeSBarry Smith   PetscFunctionBegin;
3535c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3545c6c1daeSBarry Smith   PetscValidPointer(popup,2);
3555c6c1daeSBarry Smith 
356a297a907SKarl Rupp   if (draw->popup) *popup = draw->popup;
357a297a907SKarl Rupp   else if (draw->ops->getpopup) {
3585c6c1daeSBarry Smith     ierr = (*draw->ops->getpopup)(draw,popup);CHKERRQ(ierr);
3590b874712SBarry Smith     if (*popup) {
3600b874712SBarry Smith       ierr = PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");CHKERRQ(ierr);
361e118a51fSLisandro Dalcin       (*popup)->pause = 0.0;
3620b874712SBarry Smith       ierr = PetscDrawSetFromOptions(*popup);CHKERRQ(ierr);
36361f59835SBarry Smith     }
3640298fd71SBarry Smith   } else *popup = NULL;
3655c6c1daeSBarry Smith   PetscFunctionReturn(0);
3665c6c1daeSBarry Smith }
3675c6c1daeSBarry Smith 
36894ef8ddeSSatish Balay /*@C
3695c6c1daeSBarry Smith   PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
3705c6c1daeSBarry Smith 
371*d8d19677SJose E. Roman   Input Parameters:
3725c6c1daeSBarry Smith + draw - the drawing context
3735c6c1daeSBarry Smith - display - the X windows display
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith   Level: advanced
3765c6c1daeSBarry Smith 
377ba1e01c4SBarry Smith .seealso: PetscDrawCreate()
378ba1e01c4SBarry Smith 
3795c6c1daeSBarry Smith @*/
3805c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetDisplay(PetscDraw draw,const char display[])
3815c6c1daeSBarry Smith {
3825c6c1daeSBarry Smith   PetscErrorCode ierr;
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith   PetscFunctionBegin;
3855c6c1daeSBarry Smith   ierr = PetscFree(draw->display);CHKERRQ(ierr);
3865c6c1daeSBarry Smith   ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
3875c6c1daeSBarry Smith   PetscFunctionReturn(0);
3885c6c1daeSBarry Smith }
3895c6c1daeSBarry Smith 
39045f3bb6eSLisandro Dalcin /*@
39145f3bb6eSLisandro Dalcin    PetscDrawSetDoubleBuffer - Sets a window to be double buffered.
39245f3bb6eSLisandro Dalcin 
39345f3bb6eSLisandro Dalcin    Logically Collective on PetscDraw
3945c6c1daeSBarry Smith 
3955c6c1daeSBarry Smith    Input Parameter:
39645f3bb6eSLisandro Dalcin .  draw - the drawing context
39745f3bb6eSLisandro Dalcin 
39845f3bb6eSLisandro Dalcin    Level: intermediate
39945f3bb6eSLisandro Dalcin 
40045f3bb6eSLisandro Dalcin @*/
40145f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawSetDoubleBuffer(PetscDraw draw)
4025c6c1daeSBarry Smith {
4035c6c1daeSBarry Smith   PetscErrorCode ierr;
4045c6c1daeSBarry Smith 
4055c6c1daeSBarry Smith   PetscFunctionBegin;
40645f3bb6eSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
40745f3bb6eSLisandro Dalcin   if (draw->ops->setdoublebuffer) {
40845f3bb6eSLisandro Dalcin     ierr = (*draw->ops->setdoublebuffer)(draw);CHKERRQ(ierr);
40945f3bb6eSLisandro Dalcin   }
4105c6c1daeSBarry Smith   PetscFunctionReturn(0);
4115c6c1daeSBarry Smith }
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith /*@C
4145c6c1daeSBarry Smith    PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned
4155c6c1daeSBarry Smith         by the one process.
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith    Collective on PetscDraw
4185c6c1daeSBarry Smith 
4195c6c1daeSBarry Smith    Input Parameter:
4205c6c1daeSBarry Smith .  draw - the original window
4215c6c1daeSBarry Smith 
4225c6c1daeSBarry Smith    Output Parameter:
4235c6c1daeSBarry Smith .  sdraw - the singleton window
4245c6c1daeSBarry Smith 
4255c6c1daeSBarry Smith    Level: advanced
4265c6c1daeSBarry Smith 
4275c6c1daeSBarry Smith .seealso: PetscDrawRestoreSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
4285c6c1daeSBarry Smith 
4295c6c1daeSBarry Smith @*/
4305c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw)
4315c6c1daeSBarry Smith {
4325c6c1daeSBarry Smith   PetscErrorCode ierr;
4335c6c1daeSBarry Smith   PetscMPIInt    size;
4345c6c1daeSBarry Smith 
4355c6c1daeSBarry Smith   PetscFunctionBegin;
4365c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4375c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
4385c6c1daeSBarry Smith 
439ffc4695bSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRMPI(ierr);
440387ef4f7SLisandro Dalcin   if (size == 1) {
441387ef4f7SLisandro Dalcin     ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
442387ef4f7SLisandro Dalcin     *sdraw = draw;
443387ef4f7SLisandro Dalcin   } else {
4445c6c1daeSBarry Smith     if (draw->ops->getsingleton) {
4455c6c1daeSBarry Smith       ierr = (*draw->ops->getsingleton)(draw,sdraw);CHKERRQ(ierr);
4465c6c1daeSBarry Smith     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name);
4475c6c1daeSBarry Smith   }
4485c6c1daeSBarry Smith   PetscFunctionReturn(0);
4495c6c1daeSBarry Smith }
4505c6c1daeSBarry Smith 
4515c6c1daeSBarry Smith /*@C
4525c6c1daeSBarry Smith    PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned
4535c6c1daeSBarry Smith         by the one process.
4545c6c1daeSBarry Smith 
4555c6c1daeSBarry Smith    Collective on PetscDraw
4565c6c1daeSBarry Smith 
4575c6c1daeSBarry Smith    Input Parameters:
4585c6c1daeSBarry Smith +  draw - the original window
4595c6c1daeSBarry Smith -  sdraw - the singleton window
4605c6c1daeSBarry Smith 
4615c6c1daeSBarry Smith    Level: advanced
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith .seealso: PetscDrawGetSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
4645c6c1daeSBarry Smith 
4655c6c1daeSBarry Smith @*/
4665c6c1daeSBarry Smith PetscErrorCode  PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw)
4675c6c1daeSBarry Smith {
4685c6c1daeSBarry Smith   PetscErrorCode ierr;
4695c6c1daeSBarry Smith   PetscMPIInt    size;
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith   PetscFunctionBegin;
4725c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4735c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
4745c6c1daeSBarry Smith   PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2);
4755c6c1daeSBarry Smith 
476ffc4695bSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRMPI(ierr);
477387ef4f7SLisandro Dalcin   if (size == 1) {
478387ef4f7SLisandro Dalcin     if (draw == *sdraw) {
479387ef4f7SLisandro Dalcin       ierr = PetscObjectDereference((PetscObject)draw);CHKERRQ(ierr);
480387ef4f7SLisandro Dalcin       *sdraw = NULL;
481387ef4f7SLisandro Dalcin     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore singleton, it is not the parent draw");
482387ef4f7SLisandro Dalcin   } else {
4835c6c1daeSBarry Smith     if (draw->ops->restoresingleton) {
4845c6c1daeSBarry Smith       ierr = (*draw->ops->restoresingleton)(draw,sdraw);CHKERRQ(ierr);
4855c6c1daeSBarry Smith     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot restore singleton for this type %s of draw object",((PetscObject)draw)->type_name);
4865c6c1daeSBarry Smith   }
4875c6c1daeSBarry Smith   PetscFunctionReturn(0);
4885c6c1daeSBarry Smith }
489