xref: /petsc/src/sys/classes/draw/interface/draw.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith /*
3*5c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
4*5c6c1daeSBarry Smith */
5*5c6c1daeSBarry Smith #include <petsc-private/drawimpl.h>  /*I "petscdraw.h" I*/
6*5c6c1daeSBarry Smith 
7*5c6c1daeSBarry Smith PetscClassId PETSC_DRAW_CLASSID;
8*5c6c1daeSBarry Smith 
9*5c6c1daeSBarry Smith static PetscBool  PetscDrawPackageInitialized = PETSC_FALSE;
10*5c6c1daeSBarry Smith #undef __FUNCT__
11*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawFinalizePackage"
12*5c6c1daeSBarry Smith /*@C
13*5c6c1daeSBarry Smith   PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the Draw package. It is
14*5c6c1daeSBarry Smith   called from PetscFinalize().
15*5c6c1daeSBarry Smith 
16*5c6c1daeSBarry Smith   Level: developer
17*5c6c1daeSBarry Smith 
18*5c6c1daeSBarry Smith .keywords: Petsc, destroy, package, mathematica
19*5c6c1daeSBarry Smith .seealso: PetscFinalize()
20*5c6c1daeSBarry Smith @*/
21*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawFinalizePackage(void)
22*5c6c1daeSBarry Smith {
23*5c6c1daeSBarry Smith   PetscFunctionBegin;
24*5c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_FALSE;
25*5c6c1daeSBarry Smith   PetscDrawList               = 0;
26*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
27*5c6c1daeSBarry Smith }
28*5c6c1daeSBarry Smith 
29*5c6c1daeSBarry Smith #undef __FUNCT__
30*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawInitializePackage"
31*5c6c1daeSBarry Smith /*@C
32*5c6c1daeSBarry Smith   PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called
33*5c6c1daeSBarry Smith   from PetscDLLibraryRegister() when using dynamic libraries, and on the call to PetscInitialize()
34*5c6c1daeSBarry Smith   when using static libraries.
35*5c6c1daeSBarry Smith 
36*5c6c1daeSBarry Smith   Input Parameter:
37*5c6c1daeSBarry Smith   path - The dynamic library path, or PETSC_NULL
38*5c6c1daeSBarry Smith 
39*5c6c1daeSBarry Smith   Level: developer
40*5c6c1daeSBarry Smith 
41*5c6c1daeSBarry Smith .keywords: Petsc, initialize, package
42*5c6c1daeSBarry Smith .seealso: PetscInitialize()
43*5c6c1daeSBarry Smith @*/
44*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawInitializePackage(const char path[])
45*5c6c1daeSBarry Smith {
46*5c6c1daeSBarry Smith   char              logList[256];
47*5c6c1daeSBarry Smith   char              *className;
48*5c6c1daeSBarry Smith   PetscBool         opt;
49*5c6c1daeSBarry Smith   PetscErrorCode    ierr;
50*5c6c1daeSBarry Smith 
51*5c6c1daeSBarry Smith   PetscFunctionBegin;
52*5c6c1daeSBarry Smith   if (PetscDrawPackageInitialized) PetscFunctionReturn(0);
53*5c6c1daeSBarry Smith   PetscDrawPackageInitialized = PETSC_TRUE;
54*5c6c1daeSBarry Smith   /* Register Classes */
55*5c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID);CHKERRQ(ierr);
56*5c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Axis",&PETSC_DRAWAXIS_CLASSID);CHKERRQ(ierr);
57*5c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID);CHKERRQ(ierr);
58*5c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID);CHKERRQ(ierr);
59*5c6c1daeSBarry Smith   ierr = PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID);CHKERRQ(ierr);
60*5c6c1daeSBarry Smith   /* Register Constructors */
61*5c6c1daeSBarry Smith   ierr = PetscDrawRegisterAll(path);CHKERRQ(ierr);
62*5c6c1daeSBarry Smith   /* Process info exclusions */
63*5c6c1daeSBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
64*5c6c1daeSBarry Smith   if (opt) {
65*5c6c1daeSBarry Smith     ierr = PetscStrstr(logList, "draw", &className);CHKERRQ(ierr);
66*5c6c1daeSBarry Smith     if (className) {
67*5c6c1daeSBarry Smith       ierr = PetscInfoDeactivateClass(0);CHKERRQ(ierr);
68*5c6c1daeSBarry Smith     }
69*5c6c1daeSBarry Smith   }
70*5c6c1daeSBarry Smith   /* Process summary exclusions */
71*5c6c1daeSBarry Smith   ierr = PetscOptionsGetString(PETSC_NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
72*5c6c1daeSBarry Smith   if (opt) {
73*5c6c1daeSBarry Smith     ierr = PetscStrstr(logList, "draw", &className);CHKERRQ(ierr);
74*5c6c1daeSBarry Smith     if (className) {
75*5c6c1daeSBarry Smith       ierr = PetscLogEventDeactivateClass(0);CHKERRQ(ierr);
76*5c6c1daeSBarry Smith     }
77*5c6c1daeSBarry Smith   }
78*5c6c1daeSBarry Smith   ierr = PetscRegisterFinalize(PetscDrawFinalizePackage);CHKERRQ(ierr);
79*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
80*5c6c1daeSBarry Smith }
81*5c6c1daeSBarry Smith 
82*5c6c1daeSBarry Smith #undef __FUNCT__
83*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawResizeWindow"
84*5c6c1daeSBarry Smith /*@
85*5c6c1daeSBarry Smith    PetscDrawResizeWindow - Allows one to resize a window from a program.
86*5c6c1daeSBarry Smith 
87*5c6c1daeSBarry Smith    Collective on PetscDraw
88*5c6c1daeSBarry Smith 
89*5c6c1daeSBarry Smith    Input Parameter:
90*5c6c1daeSBarry Smith +  draw - the window
91*5c6c1daeSBarry Smith -  w,h - the new width and height of the window
92*5c6c1daeSBarry Smith 
93*5c6c1daeSBarry Smith    Level: intermediate
94*5c6c1daeSBarry Smith 
95*5c6c1daeSBarry Smith .seealso: PetscDrawCheckResizedWindow()
96*5c6c1daeSBarry Smith @*/
97*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawResizeWindow(PetscDraw draw,int w,int h)
98*5c6c1daeSBarry Smith {
99*5c6c1daeSBarry Smith   PetscErrorCode ierr;
100*5c6c1daeSBarry Smith   PetscFunctionBegin;
101*5c6c1daeSBarry Smith   if (draw->ops->resizewindow) {
102*5c6c1daeSBarry Smith     ierr = (*draw->ops->resizewindow)(draw,w,h);CHKERRQ(ierr);
103*5c6c1daeSBarry Smith   }
104*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
105*5c6c1daeSBarry Smith }
106*5c6c1daeSBarry Smith 
107*5c6c1daeSBarry Smith #undef __FUNCT__
108*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCheckResizedWindow"
109*5c6c1daeSBarry Smith /*@
110*5c6c1daeSBarry Smith    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
111*5c6c1daeSBarry Smith 
112*5c6c1daeSBarry Smith    Collective on PetscDraw
113*5c6c1daeSBarry Smith 
114*5c6c1daeSBarry Smith    Input Parameter:
115*5c6c1daeSBarry Smith .  draw - the window
116*5c6c1daeSBarry Smith 
117*5c6c1daeSBarry Smith    Level: advanced
118*5c6c1daeSBarry Smith 
119*5c6c1daeSBarry Smith .seealso: PetscDrawResizeWindow()
120*5c6c1daeSBarry Smith 
121*5c6c1daeSBarry Smith @*/
122*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawCheckResizedWindow(PetscDraw draw)
123*5c6c1daeSBarry Smith {
124*5c6c1daeSBarry Smith   PetscErrorCode ierr;
125*5c6c1daeSBarry Smith   PetscFunctionBegin;
126*5c6c1daeSBarry Smith   if (draw->ops->checkresizedwindow) {
127*5c6c1daeSBarry Smith     ierr = (*draw->ops->checkresizedwindow)(draw);CHKERRQ(ierr);
128*5c6c1daeSBarry Smith   }
129*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
130*5c6c1daeSBarry Smith }
131*5c6c1daeSBarry Smith 
132*5c6c1daeSBarry Smith #undef __FUNCT__
133*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetTitle"
134*5c6c1daeSBarry Smith /*@C
135*5c6c1daeSBarry Smith    PetscDrawGetTitle - Gets pointer to title of a PetscDraw context.
136*5c6c1daeSBarry Smith 
137*5c6c1daeSBarry Smith    Not collective
138*5c6c1daeSBarry Smith 
139*5c6c1daeSBarry Smith    Input Parameter:
140*5c6c1daeSBarry Smith .  draw - the graphics context
141*5c6c1daeSBarry Smith 
142*5c6c1daeSBarry Smith    Output Parameter:
143*5c6c1daeSBarry Smith .  title - the title
144*5c6c1daeSBarry Smith 
145*5c6c1daeSBarry Smith    Level: intermediate
146*5c6c1daeSBarry Smith 
147*5c6c1daeSBarry Smith .seealso: PetscDrawSetTitle()
148*5c6c1daeSBarry Smith @*/
149*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetTitle(PetscDraw draw,char **title)
150*5c6c1daeSBarry Smith {
151*5c6c1daeSBarry Smith   PetscFunctionBegin;
152*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
153*5c6c1daeSBarry Smith   PetscValidPointer(title,2);
154*5c6c1daeSBarry Smith   *title = draw->title;
155*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
156*5c6c1daeSBarry Smith }
157*5c6c1daeSBarry Smith 
158*5c6c1daeSBarry Smith #undef __FUNCT__
159*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetTitle"
160*5c6c1daeSBarry Smith /*@C
161*5c6c1daeSBarry Smith    PetscDrawSetTitle - Sets the title of a PetscDraw context.
162*5c6c1daeSBarry Smith 
163*5c6c1daeSBarry Smith    Not collective (any processor or all may call this)
164*5c6c1daeSBarry Smith 
165*5c6c1daeSBarry Smith    Input Parameters:
166*5c6c1daeSBarry Smith +  draw - the graphics context
167*5c6c1daeSBarry Smith -  title - the title
168*5c6c1daeSBarry Smith 
169*5c6c1daeSBarry Smith    Level: intermediate
170*5c6c1daeSBarry Smith 
171*5c6c1daeSBarry Smith    Note:
172*5c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
173*5c6c1daeSBarry Smith    title string after calling this routine.
174*5c6c1daeSBarry Smith 
175*5c6c1daeSBarry Smith .seealso: PetscDrawGetTitle(), PetscDrawAppendTitle()
176*5c6c1daeSBarry Smith @*/
177*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetTitle(PetscDraw draw,const char title[])
178*5c6c1daeSBarry Smith {
179*5c6c1daeSBarry Smith   PetscErrorCode ierr;
180*5c6c1daeSBarry Smith   PetscFunctionBegin;
181*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
182*5c6c1daeSBarry Smith   PetscValidCharPointer(title,2);
183*5c6c1daeSBarry Smith   ierr = PetscFree(draw->title);CHKERRQ(ierr);
184*5c6c1daeSBarry Smith   ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
185*5c6c1daeSBarry Smith   if (draw->ops->settitle) {
186*5c6c1daeSBarry Smith     ierr = (*draw->ops->settitle)(draw,title);CHKERRQ(ierr);
187*5c6c1daeSBarry Smith   }
188*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
189*5c6c1daeSBarry Smith }
190*5c6c1daeSBarry Smith 
191*5c6c1daeSBarry Smith #undef __FUNCT__
192*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAppendTitle"
193*5c6c1daeSBarry Smith /*@C
194*5c6c1daeSBarry Smith    PetscDrawAppendTitle - Appends to the title of a PetscDraw context.
195*5c6c1daeSBarry Smith 
196*5c6c1daeSBarry Smith    Not collective (any processor or all can call this)
197*5c6c1daeSBarry Smith 
198*5c6c1daeSBarry Smith    Input Parameters:
199*5c6c1daeSBarry Smith +  draw - the graphics context
200*5c6c1daeSBarry Smith -  title - the title
201*5c6c1daeSBarry Smith 
202*5c6c1daeSBarry Smith    Note:
203*5c6c1daeSBarry Smith    A copy of the string is made, so you may destroy the
204*5c6c1daeSBarry Smith    title string after calling this routine.
205*5c6c1daeSBarry Smith 
206*5c6c1daeSBarry Smith    Level: advanced
207*5c6c1daeSBarry Smith 
208*5c6c1daeSBarry Smith .seealso: PetscDrawSetTitle(), PetscDrawGetTitle()
209*5c6c1daeSBarry Smith @*/
210*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawAppendTitle(PetscDraw draw,const char title[])
211*5c6c1daeSBarry Smith {
212*5c6c1daeSBarry Smith   PetscErrorCode ierr;
213*5c6c1daeSBarry Smith   size_t len1,len2,len;
214*5c6c1daeSBarry Smith   char   *newtitle;
215*5c6c1daeSBarry Smith 
216*5c6c1daeSBarry Smith   PetscFunctionBegin;
217*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
218*5c6c1daeSBarry Smith   if (!title) PetscFunctionReturn(0);
219*5c6c1daeSBarry Smith 
220*5c6c1daeSBarry Smith   if (draw->title) {
221*5c6c1daeSBarry Smith     ierr = PetscStrlen(title,&len1);CHKERRQ(ierr);
222*5c6c1daeSBarry Smith     ierr = PetscStrlen(draw->title,&len2);CHKERRQ(ierr);
223*5c6c1daeSBarry Smith     len  = len1 + len2;
224*5c6c1daeSBarry Smith     ierr = PetscMalloc((len + 1)*sizeof(char*),&newtitle);CHKERRQ(ierr);
225*5c6c1daeSBarry Smith     ierr = PetscStrcpy(newtitle,draw->title);CHKERRQ(ierr);
226*5c6c1daeSBarry Smith     ierr = PetscStrcat(newtitle,title);CHKERRQ(ierr);
227*5c6c1daeSBarry Smith     ierr = PetscFree(draw->title);CHKERRQ(ierr);
228*5c6c1daeSBarry Smith     draw->title = newtitle;
229*5c6c1daeSBarry Smith   } else {
230*5c6c1daeSBarry Smith     ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
231*5c6c1daeSBarry Smith   }
232*5c6c1daeSBarry Smith   if (draw->ops->settitle) {
233*5c6c1daeSBarry Smith     ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr);
234*5c6c1daeSBarry Smith   }
235*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
236*5c6c1daeSBarry Smith }
237*5c6c1daeSBarry Smith 
238*5c6c1daeSBarry Smith #undef __FUNCT__
239*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawDestroy"
240*5c6c1daeSBarry Smith /*@
241*5c6c1daeSBarry Smith    PetscDrawDestroy - Deletes a draw context.
242*5c6c1daeSBarry Smith 
243*5c6c1daeSBarry Smith    Collective on PetscDraw
244*5c6c1daeSBarry Smith 
245*5c6c1daeSBarry Smith    Input Parameters:
246*5c6c1daeSBarry Smith .  draw - the drawing context
247*5c6c1daeSBarry Smith 
248*5c6c1daeSBarry Smith    Level: beginner
249*5c6c1daeSBarry Smith 
250*5c6c1daeSBarry Smith .seealso: PetscDrawCreate()
251*5c6c1daeSBarry Smith 
252*5c6c1daeSBarry Smith @*/
253*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawDestroy(PetscDraw *draw)
254*5c6c1daeSBarry Smith {
255*5c6c1daeSBarry Smith   PetscErrorCode ierr;
256*5c6c1daeSBarry Smith   PetscFunctionBegin;
257*5c6c1daeSBarry Smith   if (!*draw) PetscFunctionReturn(0);
258*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1);
259*5c6c1daeSBarry Smith   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0);
260*5c6c1daeSBarry Smith 
261*5c6c1daeSBarry Smith   if ((*draw)->pause == -2) {
262*5c6c1daeSBarry Smith     (*draw)->pause = -1;
263*5c6c1daeSBarry Smith     ierr = PetscDrawPause(*draw);CHKERRQ(ierr);
264*5c6c1daeSBarry Smith   }
265*5c6c1daeSBarry Smith 
266*5c6c1daeSBarry Smith   /* if memory was published then destroy it */
267*5c6c1daeSBarry Smith   ierr = PetscObjectDepublish(*draw);CHKERRQ(ierr);
268*5c6c1daeSBarry Smith 
269*5c6c1daeSBarry Smith   if ((*draw)->ops->destroy) {
270*5c6c1daeSBarry Smith     ierr = (*(*draw)->ops->destroy)(*draw);CHKERRQ(ierr);
271*5c6c1daeSBarry Smith   }
272*5c6c1daeSBarry Smith   ierr = PetscFree((*draw)->title);CHKERRQ(ierr);
273*5c6c1daeSBarry Smith   ierr = PetscFree((*draw)->display);CHKERRQ(ierr);
274*5c6c1daeSBarry Smith   ierr = PetscFree((*draw)->savefilename);CHKERRQ(ierr);
275*5c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(draw);CHKERRQ(ierr);
276*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
277*5c6c1daeSBarry Smith }
278*5c6c1daeSBarry Smith 
279*5c6c1daeSBarry Smith #undef __FUNCT__
280*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetPopup"
281*5c6c1daeSBarry Smith /*@
282*5c6c1daeSBarry Smith    PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
283*5c6c1daeSBarry Smith 
284*5c6c1daeSBarry Smith    Collective on PetscDraw
285*5c6c1daeSBarry Smith 
286*5c6c1daeSBarry Smith    Input Parameter:
287*5c6c1daeSBarry Smith .  draw - the original window
288*5c6c1daeSBarry Smith 
289*5c6c1daeSBarry Smith    Output Parameter:
290*5c6c1daeSBarry Smith .  popup - the new popup window
291*5c6c1daeSBarry Smith 
292*5c6c1daeSBarry Smith    Level: advanced
293*5c6c1daeSBarry Smith 
294*5c6c1daeSBarry Smith @*/
295*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup)
296*5c6c1daeSBarry Smith {
297*5c6c1daeSBarry Smith   PetscErrorCode ierr;
298*5c6c1daeSBarry Smith   PetscFunctionBegin;
299*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
300*5c6c1daeSBarry Smith   PetscValidPointer(popup,2);
301*5c6c1daeSBarry Smith 
302*5c6c1daeSBarry Smith   if (draw->popup) {
303*5c6c1daeSBarry Smith     *popup = draw->popup;
304*5c6c1daeSBarry Smith   } else if (draw->ops->getpopup) {
305*5c6c1daeSBarry Smith     ierr = (*draw->ops->getpopup)(draw,popup);CHKERRQ(ierr);
306*5c6c1daeSBarry Smith   } else {
307*5c6c1daeSBarry Smith     *popup = PETSC_NULL;
308*5c6c1daeSBarry Smith   }
309*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
310*5c6c1daeSBarry Smith }
311*5c6c1daeSBarry Smith 
312*5c6c1daeSBarry Smith #undef __FUNCT__
313*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawDestroy_Null"
314*5c6c1daeSBarry Smith PetscErrorCode PetscDrawDestroy_Null(PetscDraw draw)
315*5c6c1daeSBarry Smith {
316*5c6c1daeSBarry Smith   PetscFunctionBegin;
317*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
318*5c6c1daeSBarry Smith }
319*5c6c1daeSBarry Smith 
320*5c6c1daeSBarry Smith #undef __FUNCT__
321*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawOpenNull"
322*5c6c1daeSBarry Smith /*
323*5c6c1daeSBarry Smith   PetscDrawOpenNull - Opens a null drawing context. All draw commands to
324*5c6c1daeSBarry Smith   it are ignored.
325*5c6c1daeSBarry Smith 
326*5c6c1daeSBarry Smith   Output Parameter:
327*5c6c1daeSBarry Smith . win - the drawing context
328*5c6c1daeSBarry Smith 
329*5c6c1daeSBarry Smith    Level: advanced
330*5c6c1daeSBarry Smith 
331*5c6c1daeSBarry Smith */
332*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawOpenNull(MPI_Comm comm,PetscDraw *win)
333*5c6c1daeSBarry Smith {
334*5c6c1daeSBarry Smith   PetscErrorCode ierr;
335*5c6c1daeSBarry Smith 
336*5c6c1daeSBarry Smith   PetscFunctionBegin;
337*5c6c1daeSBarry Smith   ierr = PetscDrawCreate(comm,PETSC_NULL,PETSC_NULL,0,0,1,1,win);CHKERRQ(ierr);
338*5c6c1daeSBarry Smith   ierr = PetscDrawSetType(*win,PETSC_DRAW_NULL);CHKERRQ(ierr);
339*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
340*5c6c1daeSBarry Smith }
341*5c6c1daeSBarry Smith 
342*5c6c1daeSBarry Smith #undef __FUNCT__
343*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetDisplay"
344*5c6c1daeSBarry Smith /*@
345*5c6c1daeSBarry Smith   PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
346*5c6c1daeSBarry Smith 
347*5c6c1daeSBarry Smith   Input Parameter:
348*5c6c1daeSBarry Smith + draw - the drawing context
349*5c6c1daeSBarry Smith - display - the X windows display
350*5c6c1daeSBarry Smith 
351*5c6c1daeSBarry Smith   Level: advanced
352*5c6c1daeSBarry Smith 
353*5c6c1daeSBarry Smith @*/
354*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetDisplay(PetscDraw draw,const char display[])
355*5c6c1daeSBarry Smith {
356*5c6c1daeSBarry Smith   PetscErrorCode ierr;
357*5c6c1daeSBarry Smith 
358*5c6c1daeSBarry Smith   PetscFunctionBegin;
359*5c6c1daeSBarry Smith   ierr          = PetscFree(draw->display);CHKERRQ(ierr);
360*5c6c1daeSBarry Smith   ierr          = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
361*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
362*5c6c1daeSBarry Smith }
363*5c6c1daeSBarry Smith 
364*5c6c1daeSBarry Smith EXTERN_C_BEGIN
365*5c6c1daeSBarry Smith #undef __FUNCT__
366*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCreate_Null"
367*5c6c1daeSBarry Smith /*
368*5c6c1daeSBarry Smith   PetscDrawCreate_Null - Opens a null drawing context. All draw commands to
369*5c6c1daeSBarry Smith   it are ignored.
370*5c6c1daeSBarry Smith 
371*5c6c1daeSBarry Smith   Input Parameter:
372*5c6c1daeSBarry Smith . win - the drawing context
373*5c6c1daeSBarry Smith */
374*5c6c1daeSBarry Smith PetscErrorCode PetscDrawCreate_Null(PetscDraw draw)
375*5c6c1daeSBarry Smith {
376*5c6c1daeSBarry Smith   PetscErrorCode ierr;
377*5c6c1daeSBarry Smith 
378*5c6c1daeSBarry Smith   PetscFunctionBegin;
379*5c6c1daeSBarry Smith   ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr);
380*5c6c1daeSBarry Smith   draw->ops->destroy = PetscDrawDestroy_Null;
381*5c6c1daeSBarry Smith   draw->ops->view    = 0;
382*5c6c1daeSBarry Smith   draw->pause   = 0.0;
383*5c6c1daeSBarry Smith   draw->coor_xl = 0.0;  draw->coor_xr = 1.0;
384*5c6c1daeSBarry Smith   draw->coor_yl = 0.0;  draw->coor_yr = 1.0;
385*5c6c1daeSBarry Smith   draw->port_xl = 0.0;  draw->port_xr = 1.0;
386*5c6c1daeSBarry Smith   draw->port_yl = 0.0;  draw->port_yr = 1.0;
387*5c6c1daeSBarry Smith   draw->popup   = 0;
388*5c6c1daeSBarry Smith 
389*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
390*5c6c1daeSBarry Smith }
391*5c6c1daeSBarry Smith EXTERN_C_END
392*5c6c1daeSBarry Smith 
393*5c6c1daeSBarry Smith #undef __FUNCT__
394*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetSingleton"
395*5c6c1daeSBarry Smith /*@C
396*5c6c1daeSBarry Smith    PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned
397*5c6c1daeSBarry Smith         by the one process.
398*5c6c1daeSBarry Smith 
399*5c6c1daeSBarry Smith    Collective on PetscDraw
400*5c6c1daeSBarry Smith 
401*5c6c1daeSBarry Smith    Input Parameter:
402*5c6c1daeSBarry Smith .  draw - the original window
403*5c6c1daeSBarry Smith 
404*5c6c1daeSBarry Smith    Output Parameter:
405*5c6c1daeSBarry Smith .  sdraw - the singleton window
406*5c6c1daeSBarry Smith 
407*5c6c1daeSBarry Smith    Level: advanced
408*5c6c1daeSBarry Smith 
409*5c6c1daeSBarry Smith .seealso: PetscDrawRestoreSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
410*5c6c1daeSBarry Smith 
411*5c6c1daeSBarry Smith @*/
412*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw)
413*5c6c1daeSBarry Smith {
414*5c6c1daeSBarry Smith   PetscErrorCode ierr;
415*5c6c1daeSBarry Smith   PetscMPIInt    size;
416*5c6c1daeSBarry Smith 
417*5c6c1daeSBarry Smith   PetscFunctionBegin;
418*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
419*5c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
420*5c6c1daeSBarry Smith 
421*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(((PetscObject)draw)->comm,&size);CHKERRQ(ierr);
422*5c6c1daeSBarry Smith   if (size == 1) {
423*5c6c1daeSBarry Smith     *sdraw = draw;
424*5c6c1daeSBarry Smith   } else {
425*5c6c1daeSBarry Smith     if (draw->ops->getsingleton) {
426*5c6c1daeSBarry Smith       ierr = (*draw->ops->getsingleton)(draw,sdraw);CHKERRQ(ierr);
427*5c6c1daeSBarry Smith     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name);
428*5c6c1daeSBarry Smith   }
429*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
430*5c6c1daeSBarry Smith }
431*5c6c1daeSBarry Smith 
432*5c6c1daeSBarry Smith #undef __FUNCT__
433*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRestoreSingleton"
434*5c6c1daeSBarry Smith /*@C
435*5c6c1daeSBarry Smith    PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned
436*5c6c1daeSBarry Smith         by the one process.
437*5c6c1daeSBarry Smith 
438*5c6c1daeSBarry Smith    Collective on PetscDraw
439*5c6c1daeSBarry Smith 
440*5c6c1daeSBarry Smith    Input Parameters:
441*5c6c1daeSBarry Smith +  draw - the original window
442*5c6c1daeSBarry Smith -  sdraw - the singleton window
443*5c6c1daeSBarry Smith 
444*5c6c1daeSBarry Smith    Level: advanced
445*5c6c1daeSBarry Smith 
446*5c6c1daeSBarry Smith .seealso: PetscDrawGetSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
447*5c6c1daeSBarry Smith 
448*5c6c1daeSBarry Smith @*/
449*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw)
450*5c6c1daeSBarry Smith {
451*5c6c1daeSBarry Smith   PetscErrorCode ierr;
452*5c6c1daeSBarry Smith   PetscMPIInt    size;
453*5c6c1daeSBarry Smith 
454*5c6c1daeSBarry Smith   PetscFunctionBegin;
455*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
456*5c6c1daeSBarry Smith   PetscValidPointer(sdraw,2);
457*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2);
458*5c6c1daeSBarry Smith 
459*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(((PetscObject)draw)->comm,&size);CHKERRQ(ierr);
460*5c6c1daeSBarry Smith   if (size != 1) {
461*5c6c1daeSBarry Smith     if (draw->ops->restoresingleton) {
462*5c6c1daeSBarry Smith       ierr = (*draw->ops->restoresingleton)(draw,sdraw);CHKERRQ(ierr);
463*5c6c1daeSBarry Smith     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot restore singleton for this type %s of draw object",((PetscObject)draw)->type_name);
464*5c6c1daeSBarry Smith   }
465*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
466*5c6c1daeSBarry Smith }
467*5c6c1daeSBarry Smith 
468*5c6c1daeSBarry Smith 
469*5c6c1daeSBarry Smith 
470*5c6c1daeSBarry Smith 
471*5c6c1daeSBarry Smith 
472*5c6c1daeSBarry Smith 
473*5c6c1daeSBarry Smith 
474