xref: /petsc/src/sys/classes/draw/impls/x/xinit.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith    This file contains routines to open an X window display and window
45c6c1daeSBarry Smith    This consists of a number of routines that set the various
55c6c1daeSBarry Smith    fields in the Window structure, which is passed to
65c6c1daeSBarry Smith    all of these routines.
75c6c1daeSBarry Smith 
85c6c1daeSBarry Smith    Note that if you use the default visual and colormap, then you
95c6c1daeSBarry Smith    can use these routines with any X toolkit that will give you the
105c6c1daeSBarry Smith    Window id of the window that it is managing.  Use that instead of the
115c6c1daeSBarry Smith    call to PetscDrawXiCreateWindow .  Similarly for the Display.
125c6c1daeSBarry Smith */
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith #include <../src/sys/classes/draw/impls/x/ximpl.h>
155c6c1daeSBarry Smith 
1645f3bb6eSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawSetColormap_X(PetscDraw_X*,Colormap);
175c6c1daeSBarry Smith 
185c6c1daeSBarry Smith /*
1915d5bc79SLisandro Dalcin   PetscDrawXiOpenDisplay - Open and setup a display
205c6c1daeSBarry Smith */
2109440f25SLisandro Dalcin static PetscErrorCode PetscDrawXiOpenDisplay(PetscDraw_X *XiWin,const char display[])
225c6c1daeSBarry Smith {
235c6c1daeSBarry Smith   PetscFunctionBegin;
2415d5bc79SLisandro Dalcin   XiWin->disp = XOpenDisplay(display);
255c6c1daeSBarry Smith   if (!XiWin->disp) {
2698921bdaSJacob Faibussowitsch     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to open display on %s\n\
2715d5bc79SLisandro Dalcin     Make sure your COMPUTE NODES are authorized to connect \n\
285c6c1daeSBarry Smith     to this X server and either your DISPLAY variable\n\
2915d5bc79SLisandro Dalcin     is set or you use the -display name option\n",display);
305c6c1daeSBarry Smith   }
315c6c1daeSBarry Smith   XiWin->screen     = DefaultScreen(XiWin->disp);
32481cee7bSLisandro Dalcin   XiWin->vis        = DefaultVisual(XiWin->disp,XiWin->screen);
33481cee7bSLisandro Dalcin   XiWin->depth      = DefaultDepth(XiWin->disp,XiWin->screen);
3415d5bc79SLisandro Dalcin   XiWin->cmap       = DefaultColormap(XiWin->disp,XiWin->screen);
3515d5bc79SLisandro Dalcin   XiWin->background = WhitePixel(XiWin->disp,XiWin->screen);
3615d5bc79SLisandro Dalcin   XiWin->foreground = BlackPixel(XiWin->disp,XiWin->screen);
375c6c1daeSBarry Smith   PetscFunctionReturn(0);
385c6c1daeSBarry Smith }
395c6c1daeSBarry Smith 
40815f00f0SLisandro Dalcin PetscErrorCode PetscDrawXiClose(PetscDraw_X *XiWin)
41815f00f0SLisandro Dalcin {
42815f00f0SLisandro Dalcin   PetscErrorCode ierr;
43815f00f0SLisandro Dalcin 
44815f00f0SLisandro Dalcin   PetscFunctionBegin;
45815f00f0SLisandro Dalcin   if (!XiWin) PetscFunctionReturn(0);
46815f00f0SLisandro Dalcin   ierr = PetscFree(XiWin->font);CHKERRQ(ierr);
47815f00f0SLisandro Dalcin   if (XiWin->disp) {
48815f00f0SLisandro Dalcin #if defined(PETSC_HAVE_SETJMP_H)
49815f00f0SLisandro Dalcin     jmp_buf              jmpbuf;
50815f00f0SLisandro Dalcin     PetscXIOErrorHandler xioerrhdl;
51815f00f0SLisandro Dalcin     ierr = PetscMemcpy(&jmpbuf,&PetscXIOErrorHandlerJumpBuf,sizeof(jmpbuf));CHKERRQ(ierr);
52815f00f0SLisandro Dalcin     xioerrhdl = PetscSetXIOErrorHandler(PetscXIOErrorHandlerJump);
53815f00f0SLisandro Dalcin     if (!setjmp(PetscXIOErrorHandlerJumpBuf))
54815f00f0SLisandro Dalcin #endif
55815f00f0SLisandro Dalcin     {
56815f00f0SLisandro Dalcin       XFreeGC(XiWin->disp,XiWin->gc.set);
57815f00f0SLisandro Dalcin       XCloseDisplay(XiWin->disp);
58815f00f0SLisandro Dalcin     }
59815f00f0SLisandro Dalcin     XiWin->disp = NULL;
60815f00f0SLisandro Dalcin #if defined(PETSC_HAVE_SETJMP_H)
61815f00f0SLisandro Dalcin     (void)PetscSetXIOErrorHandler(xioerrhdl);
62815f00f0SLisandro Dalcin     ierr = PetscMemcpy(&PetscXIOErrorHandlerJumpBuf,&jmpbuf,sizeof(jmpbuf));CHKERRQ(ierr);
63815f00f0SLisandro Dalcin #endif
64815f00f0SLisandro Dalcin   }
65815f00f0SLisandro Dalcin   PetscFunctionReturn(0);
66815f00f0SLisandro Dalcin }
67815f00f0SLisandro Dalcin 
685c6c1daeSBarry Smith /*
6909440f25SLisandro Dalcin    PetscDrawXiCreateGC - setup the GC structure
705c6c1daeSBarry Smith */
7109440f25SLisandro Dalcin static PetscErrorCode PetscDrawXiCreateGC(PetscDraw_X *XiWin,PetscDrawXiPixVal fg)
725c6c1daeSBarry Smith {
735c6c1daeSBarry Smith   XGCValues gcvalues;             /* window graphics context values */
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith   PetscFunctionBegin;
765c6c1daeSBarry Smith   /* Set the graphics contexts */
775c6c1daeSBarry Smith   /* create a gc for the ROP_SET operation (writing the fg value to a pixel) */
785c6c1daeSBarry Smith   /* (do this with function GXcopy; GXset will automatically write 1) */
795c6c1daeSBarry Smith   gcvalues.function   = GXcopy;
805c6c1daeSBarry Smith   gcvalues.foreground = fg;
815c6c1daeSBarry Smith   XiWin->gc.cur_pix   = fg;
825c6c1daeSBarry Smith   XiWin->gc.set       = XCreateGC(XiWin->disp,RootWindow(XiWin->disp,XiWin->screen),GCFunction|GCForeground,&gcvalues);
83*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!XiWin->gc.set,PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to create X graphics context");
8415d5bc79SLisandro Dalcin   PetscFunctionReturn(0);
8515d5bc79SLisandro Dalcin }
8615d5bc79SLisandro Dalcin 
8715d5bc79SLisandro Dalcin /*
88815f00f0SLisandro Dalcin    PetscDrawXiInit - basic setup the draw (display, graphics context, font)
8915d5bc79SLisandro Dalcin */
9065d9662dSLisandro Dalcin PetscErrorCode PetscDrawXiInit(PetscDraw_X *XiWin,const char display[])
9115d5bc79SLisandro Dalcin {
9215d5bc79SLisandro Dalcin   PetscErrorCode ierr;
9315d5bc79SLisandro Dalcin   PetscFunctionBegin;
9415d5bc79SLisandro Dalcin   ierr = PetscDrawXiOpenDisplay(XiWin,display);CHKERRQ(ierr);
9509440f25SLisandro Dalcin   ierr = PetscDrawXiCreateGC(XiWin,XiWin->foreground);CHKERRQ(ierr);
9615d5bc79SLisandro Dalcin   ierr = PetscDrawXiFontFixed(XiWin,6,10,&XiWin->font);CHKERRQ(ierr);
975c6c1daeSBarry Smith   PetscFunctionReturn(0);
985c6c1daeSBarry Smith }
995c6c1daeSBarry Smith 
1005c6c1daeSBarry Smith /*
10109440f25SLisandro Dalcin     This routine waits until the window is actually created or destroyed
10209440f25SLisandro Dalcin     Returns 0 if window is mapped; 1 if window is destroyed.
10309440f25SLisandro Dalcin  */
10409440f25SLisandro Dalcin static PetscErrorCode PetscDrawXiWaitMap(PetscDraw_X *XiWin)
10509440f25SLisandro Dalcin {
10609440f25SLisandro Dalcin   XEvent event;
10709440f25SLisandro Dalcin 
10809440f25SLisandro Dalcin   PetscFunctionBegin;
10909440f25SLisandro Dalcin   while (1) {
11009440f25SLisandro Dalcin     XMaskEvent(XiWin->disp,ExposureMask|StructureNotifyMask,&event);
11109440f25SLisandro Dalcin     if (event.xany.window != XiWin->win) break;
11209440f25SLisandro Dalcin     else {
11309440f25SLisandro Dalcin       switch (event.type) {
11409440f25SLisandro Dalcin       case ConfigureNotify:
11509440f25SLisandro Dalcin         /* window has been moved or resized */
11609440f25SLisandro Dalcin         XiWin->w = event.xconfigure.width  - 2 * event.xconfigure.border_width;
11709440f25SLisandro Dalcin         XiWin->h = event.xconfigure.height - 2 * event.xconfigure.border_width;
11809440f25SLisandro Dalcin         break;
11909440f25SLisandro Dalcin       case DestroyNotify:
12009440f25SLisandro Dalcin         PetscFunctionReturn(1);
12109440f25SLisandro Dalcin       case Expose:
12209440f25SLisandro Dalcin         PetscFunctionReturn(0);
12309440f25SLisandro Dalcin         /* else ignore event */
12409440f25SLisandro Dalcin       }
12509440f25SLisandro Dalcin     }
12609440f25SLisandro Dalcin   }
12709440f25SLisandro Dalcin   PetscFunctionReturn(0);
12809440f25SLisandro Dalcin }
12909440f25SLisandro Dalcin 
13009440f25SLisandro Dalcin /*
1315c6c1daeSBarry Smith     Actually display a window at [x,y] with sizes (w,h)
1325c6c1daeSBarry Smith */
13309440f25SLisandro Dalcin static PetscErrorCode PetscDrawXiDisplayWindow(PetscDraw_X *XiWin,char *label,int x,int y,int w,int h)
1345c6c1daeSBarry Smith {
1355c6c1daeSBarry Smith   unsigned int         wavail,havail;
1365c6c1daeSBarry Smith   XSizeHints           size_hints;
1375c6c1daeSBarry Smith   XWindowAttributes    in_window_attributes;
1385c6c1daeSBarry Smith   XSetWindowAttributes window_attributes;
13915d5bc79SLisandro Dalcin   unsigned int         border_width = 0;
14015d5bc79SLisandro Dalcin   unsigned long        backgnd_pixel = WhitePixel(XiWin->disp,XiWin->screen);
1415c6c1daeSBarry Smith   unsigned long        wmask;
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith   PetscFunctionBegin;
1445c6c1daeSBarry Smith   /* get the available widths */
1455c6c1daeSBarry Smith   wavail = DisplayWidth(XiWin->disp,XiWin->screen);
1465c6c1daeSBarry Smith   havail = DisplayHeight(XiWin->disp,XiWin->screen);
147*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(w <= 0 || h <= 0,PETSC_COMM_SELF,PETSC_ERR_LIB,"X Window display has invalid height or width");
1485c6c1daeSBarry Smith   if ((unsigned int)w > wavail) w = wavail;
1495c6c1daeSBarry Smith   if ((unsigned int)h > havail) h = havail;
1505c6c1daeSBarry Smith 
15115d5bc79SLisandro Dalcin   if (x < 0) x = (int)(wavail - (unsigned int)w + (unsigned int)x);
15215d5bc79SLisandro Dalcin   if (y < 0) y = (int)(havail - (unsigned int)h + (unsigned int)y);
15315d5bc79SLisandro Dalcin   x = ((unsigned int)x + w > wavail) ? (int)(wavail - (unsigned int)w) : x;
15415d5bc79SLisandro Dalcin   y = ((unsigned int)y + h > havail) ? (int)(havail - (unsigned int)h) : y;
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith   /* We need XCreateWindow since we may need an visual other than the default one */
1575c6c1daeSBarry Smith   XGetWindowAttributes(XiWin->disp,RootWindow(XiWin->disp,XiWin->screen),&in_window_attributes);
1585c6c1daeSBarry Smith   window_attributes.background_pixmap = None;
1595c6c1daeSBarry Smith   window_attributes.background_pixel  = backgnd_pixel;
1605c6c1daeSBarry Smith   /* No border for now */
1615c6c1daeSBarry Smith   window_attributes.border_pixmap     = None;
1625c6c1daeSBarry Smith   /*
1635c6c1daeSBarry Smith   window_attributes.border_pixel      = border_pixel;
1645c6c1daeSBarry Smith   */
1655c6c1daeSBarry Smith   window_attributes.bit_gravity       = in_window_attributes.bit_gravity;
1665c6c1daeSBarry Smith   window_attributes.win_gravity       = in_window_attributes.win_gravity;
1675c6c1daeSBarry Smith   /* Backing store is too slow in color systems */
16815d5bc79SLisandro Dalcin   window_attributes.backing_store     = NotUseful;
1695c6c1daeSBarry Smith   window_attributes.backing_pixel     = backgnd_pixel;
1705c6c1daeSBarry Smith   window_attributes.save_under        = 1;
1715c6c1daeSBarry Smith   window_attributes.event_mask        = 0;
1725c6c1daeSBarry Smith   window_attributes.do_not_propagate_mask = 0;
1735c6c1daeSBarry Smith   window_attributes.override_redirect = 0;
1745c6c1daeSBarry Smith   window_attributes.colormap          = XiWin->cmap;
1755c6c1daeSBarry Smith   /* None for cursor does NOT mean none, it means cursor of Parent */
1765c6c1daeSBarry Smith   window_attributes.cursor            = None;
177a297a907SKarl Rupp 
1785c6c1daeSBarry Smith   wmask = CWBackPixmap | CWBackPixel    | CWBorderPixmap  | CWBitGravity |
1795c6c1daeSBarry Smith           CWWinGravity | CWBackingStore | CWBackingPixel  | CWOverrideRedirect |
1805c6c1daeSBarry Smith           CWSaveUnder  | CWEventMask    | CWDontPropagate |
1815c6c1daeSBarry Smith           CWCursor     | CWColormap;
1825c6c1daeSBarry Smith 
18315d5bc79SLisandro Dalcin   XiWin->win = XCreateWindow(XiWin->disp,RootWindow(XiWin->disp,XiWin->screen),x,y,w,h,border_width,XiWin->depth,InputOutput,XiWin->vis,wmask,&window_attributes);
184*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!XiWin->win,PETSC_COMM_SELF,PETSC_ERR_LIB,"Unable to open X window");
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith   /* set window manager hints */
1875c6c1daeSBarry Smith   {
1885c6c1daeSBarry Smith     XWMHints      wm_hints;
1895c6c1daeSBarry Smith     XClassHint    class_hints;
1905c6c1daeSBarry Smith     XTextProperty windowname,iconname;
1915c6c1daeSBarry Smith 
192a297a907SKarl Rupp     if (label) XStringListToTextProperty(&label,1,&windowname);
193a297a907SKarl Rupp     else       XStringListToTextProperty(&label,0,&windowname);
194a297a907SKarl Rupp     if (label) XStringListToTextProperty(&label,1,&iconname);
195a297a907SKarl Rupp     else       XStringListToTextProperty(&label,0,&iconname);
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith     wm_hints.initial_state = NormalState;
1985c6c1daeSBarry Smith     wm_hints.input         = True;
1995c6c1daeSBarry Smith     wm_hints.flags         = StateHint|InputHint;
2005c6c1daeSBarry Smith 
2015c6c1daeSBarry Smith     /* These properties can be used by window managers to decide how to display a window */
2025c6c1daeSBarry Smith     class_hints.res_name  = (char*)"petsc";
2035c6c1daeSBarry Smith     class_hints.res_class = (char*)"PETSc";
2045c6c1daeSBarry Smith 
2055c6c1daeSBarry Smith     size_hints.x          = x;
2065c6c1daeSBarry Smith     size_hints.y          = y;
2075c6c1daeSBarry Smith     size_hints.min_width  = 4*border_width;
2085c6c1daeSBarry Smith     size_hints.min_height = 4*border_width;
2095c6c1daeSBarry Smith     size_hints.width      = w;
2105c6c1daeSBarry Smith     size_hints.height     = h;
2115c6c1daeSBarry Smith     size_hints.flags      = USPosition | USSize | PMinSize;
2125c6c1daeSBarry Smith 
21302c9f0b5SLisandro Dalcin     XSetWMProperties(XiWin->disp,XiWin->win,&windowname,&iconname,NULL,0,&size_hints,&wm_hints,&class_hints);
2145c6c1daeSBarry Smith     XFree((void*)windowname.value);
2155c6c1daeSBarry Smith     XFree((void*)iconname.value);
2165c6c1daeSBarry Smith   }
217481cee7bSLisandro Dalcin 
2185c6c1daeSBarry Smith   /* make the window visible */
2195c6c1daeSBarry Smith   XSelectInput(XiWin->disp,XiWin->win,ExposureMask|StructureNotifyMask);
2205c6c1daeSBarry Smith   XMapWindow(XiWin->disp,XiWin->win);
2215c6c1daeSBarry Smith   /* some window systems are cruel and interfere with the placement of
2225c6c1daeSBarry Smith      windows.  We wait here for the window to be created or to die */
223*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(PetscDrawXiWaitMap(XiWin),PETSC_COMM_SELF,PETSC_ERR_LIB,"Wait for X window failed");
22473ecf448SLisandro Dalcin   XSelectInput(XiWin->disp,XiWin->win,NoEventMask);
2255c6c1daeSBarry Smith   PetscFunctionReturn(0);
2265c6c1daeSBarry Smith }
2275c6c1daeSBarry Smith 
22815d5bc79SLisandro Dalcin PetscErrorCode PetscDrawXiQuickWindow(PetscDraw_X *XiWin,char *name,int x,int y,int nx,int ny)
2295c6c1daeSBarry Smith {
2305c6c1daeSBarry Smith   PetscErrorCode ierr;
2315c6c1daeSBarry Smith 
2325c6c1daeSBarry Smith   PetscFunctionBegin;
23315d5bc79SLisandro Dalcin   ierr = PetscDrawSetColormap_X(XiWin,(Colormap)0);CHKERRQ(ierr);
23415d5bc79SLisandro Dalcin   ierr = PetscDrawXiDisplayWindow(XiWin,name,x,y,nx,ny);CHKERRQ(ierr);
23515d5bc79SLisandro Dalcin   XSetWindowBackground(XiWin->disp,XiWin->win,XiWin->background);
23615d5bc79SLisandro Dalcin   XClearWindow(XiWin->disp,XiWin->win);
2375c6c1daeSBarry Smith   PetscFunctionReturn(0);
2385c6c1daeSBarry Smith }
2395c6c1daeSBarry Smith 
2405c6c1daeSBarry Smith /*
2415c6c1daeSBarry Smith    A version from an already defined window
2425c6c1daeSBarry Smith */
24315d5bc79SLisandro Dalcin PetscErrorCode PetscDrawXiQuickWindowFromWindow(PetscDraw_X *XiWin,Window win)
2445c6c1daeSBarry Smith {
2455c6c1daeSBarry Smith   XWindowAttributes attributes;
24615d5bc79SLisandro Dalcin   PetscErrorCode    ierr;
2475c6c1daeSBarry Smith 
2485c6c1daeSBarry Smith   PetscFunctionBegin;
24915d5bc79SLisandro Dalcin   XiWin->win = win;
25015d5bc79SLisandro Dalcin   XGetWindowAttributes(XiWin->disp,XiWin->win,&attributes);
25115d5bc79SLisandro Dalcin   ierr = PetscDrawSetColormap_X(XiWin,attributes.colormap);CHKERRQ(ierr);
2525c6c1daeSBarry Smith   PetscFunctionReturn(0);
2535c6c1daeSBarry Smith }
2545c6c1daeSBarry Smith 
25509440f25SLisandro Dalcin PetscErrorCode PetscDrawXiQuickPixmap(PetscDraw_X* XiWin)
25609440f25SLisandro Dalcin {
2575c6c1daeSBarry Smith   PetscFunctionBegin;
25809440f25SLisandro Dalcin   if (XiWin->drw) XFreePixmap(XiWin->disp,XiWin->drw);
25909440f25SLisandro Dalcin   XiWin->drw = XCreatePixmap(XiWin->disp,RootWindow(XiWin->disp,XiWin->screen),XiWin->w,XiWin->h,XiWin->depth);
26009440f25SLisandro Dalcin   PetscDrawXiSetPixVal(XiWin,XiWin->background);
26109440f25SLisandro Dalcin   XFillRectangle(XiWin->disp,XiWin->drw,XiWin->gc.set,0,0,XiWin->w,XiWin->h);
26209440f25SLisandro Dalcin   XSync(XiWin->disp,False);
2635c6c1daeSBarry Smith   PetscFunctionReturn(0);
2645c6c1daeSBarry Smith }
26548db01dbSLisandro Dalcin 
266bf780456SLisandro Dalcin PetscErrorCode PetscDrawXiResizeWindow(PetscDraw_X* XiWin,int w,int h)
267bf780456SLisandro Dalcin {
268bf780456SLisandro Dalcin   XEvent event;
269bf780456SLisandro Dalcin   PetscFunctionBegin;
270bf780456SLisandro Dalcin   XSelectInput(XiWin->disp,XiWin->win,StructureNotifyMask);
271bf780456SLisandro Dalcin   XResizeWindow(XiWin->disp,XiWin->win,(unsigned int)w,(unsigned int)h);
272bf780456SLisandro Dalcin   XWindowEvent(XiWin->disp,XiWin->win,StructureNotifyMask,&event);
273bf780456SLisandro Dalcin   XSelectInput(XiWin->disp,XiWin->win,NoEventMask);
274bf780456SLisandro Dalcin   PetscFunctionReturn(0);
275bf780456SLisandro Dalcin }
276bf780456SLisandro Dalcin 
27748db01dbSLisandro Dalcin PetscErrorCode PetscDrawXiGetGeometry(PetscDraw_X *XiWin,int *x,int *y,int *w,int *h)
27848db01dbSLisandro Dalcin {
27948db01dbSLisandro Dalcin   XWindowAttributes attributes;
28048db01dbSLisandro Dalcin   Window            root,parent,child;
28148db01dbSLisandro Dalcin   int               xx=0,yy=0;
28248db01dbSLisandro Dalcin   unsigned int      ww=0,hh=0,dummy;
28348db01dbSLisandro Dalcin   PetscFunctionBegin;
28448db01dbSLisandro Dalcin   if (XiWin->win) {
28548db01dbSLisandro Dalcin     XGetGeometry(XiWin->disp,XiWin->win,&parent,&xx,&yy,&ww,&hh,&dummy,&dummy);
28648db01dbSLisandro Dalcin     root = RootWindow(XiWin->disp,XiWin->screen);
28748db01dbSLisandro Dalcin     if (!XTranslateCoordinates(XiWin->disp,XiWin->win,root,0,0,&xx,&yy,&child)) {
28848db01dbSLisandro Dalcin       XGetWindowAttributes(XiWin->disp,XiWin->win,&attributes);
28948db01dbSLisandro Dalcin       root = attributes.screen->root;
29048db01dbSLisandro Dalcin       (void)XTranslateCoordinates(XiWin->disp,XiWin->win,root,0,0,&xx,&yy,&child);
29148db01dbSLisandro Dalcin     }
29248db01dbSLisandro Dalcin   } else if (XiWin->drw) {
29348db01dbSLisandro Dalcin     XGetGeometry(XiWin->disp,XiWin->drw,&root,&xx,&yy,&ww,&hh,&dummy,&dummy);
29448db01dbSLisandro Dalcin   }
29548db01dbSLisandro Dalcin   if (x) *x = xx;
29648db01dbSLisandro Dalcin   if (y) *y = yy;
29748db01dbSLisandro Dalcin   if (w) *w = (int)ww;
29848db01dbSLisandro Dalcin   if (h) *h = (int)hh;
29948db01dbSLisandro Dalcin   PetscFunctionReturn(0);
30048db01dbSLisandro Dalcin }
301