xref: /petsc/src/sys/classes/draw/impls/x/xinit.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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 */
21d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawXiOpenDisplay(PetscDraw_X *XiWin, const char display[])
22d71ae5a4SJacob Faibussowitsch {
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\
299371c9d4SSatish Balay     is set or you use the -display name option\n",
309371c9d4SSatish Balay             display);
315c6c1daeSBarry Smith   }
325c6c1daeSBarry Smith   XiWin->screen     = DefaultScreen(XiWin->disp);
33481cee7bSLisandro Dalcin   XiWin->vis        = DefaultVisual(XiWin->disp, XiWin->screen);
34481cee7bSLisandro Dalcin   XiWin->depth      = DefaultDepth(XiWin->disp, XiWin->screen);
3515d5bc79SLisandro Dalcin   XiWin->cmap       = DefaultColormap(XiWin->disp, XiWin->screen);
3615d5bc79SLisandro Dalcin   XiWin->background = WhitePixel(XiWin->disp, XiWin->screen);
3715d5bc79SLisandro Dalcin   XiWin->foreground = BlackPixel(XiWin->disp, XiWin->screen);
38*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
395c6c1daeSBarry Smith }
405c6c1daeSBarry Smith 
41d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawXiClose(PetscDraw_X *XiWin)
42d71ae5a4SJacob Faibussowitsch {
43815f00f0SLisandro Dalcin   PetscFunctionBegin;
44*3ba16761SJacob Faibussowitsch   if (!XiWin) PetscFunctionReturn(PETSC_SUCCESS);
459566063dSJacob Faibussowitsch   PetscCall(PetscFree(XiWin->font));
46815f00f0SLisandro Dalcin   if (XiWin->disp) {
47815f00f0SLisandro Dalcin #if defined(PETSC_HAVE_SETJMP_H)
48815f00f0SLisandro Dalcin     jmp_buf              jmpbuf;
49815f00f0SLisandro Dalcin     PetscXIOErrorHandler xioerrhdl;
509566063dSJacob Faibussowitsch     PetscCall(PetscMemcpy(&jmpbuf, &PetscXIOErrorHandlerJumpBuf, sizeof(jmpbuf)));
51815f00f0SLisandro Dalcin     xioerrhdl = PetscSetXIOErrorHandler(PetscXIOErrorHandlerJump);
52815f00f0SLisandro Dalcin     if (!setjmp(PetscXIOErrorHandlerJumpBuf))
53815f00f0SLisandro Dalcin #endif
54815f00f0SLisandro Dalcin     {
55815f00f0SLisandro Dalcin       XFreeGC(XiWin->disp, XiWin->gc.set);
56815f00f0SLisandro Dalcin       XCloseDisplay(XiWin->disp);
57815f00f0SLisandro Dalcin     }
58815f00f0SLisandro Dalcin     XiWin->disp = NULL;
59815f00f0SLisandro Dalcin #if defined(PETSC_HAVE_SETJMP_H)
60815f00f0SLisandro Dalcin     (void)PetscSetXIOErrorHandler(xioerrhdl);
619566063dSJacob Faibussowitsch     PetscCall(PetscMemcpy(&PetscXIOErrorHandlerJumpBuf, &jmpbuf, sizeof(jmpbuf)));
62815f00f0SLisandro Dalcin #endif
63815f00f0SLisandro Dalcin   }
64*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
65815f00f0SLisandro Dalcin }
66815f00f0SLisandro Dalcin 
675c6c1daeSBarry Smith /*
6809440f25SLisandro Dalcin    PetscDrawXiCreateGC - setup the GC structure
695c6c1daeSBarry Smith */
70d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawXiCreateGC(PetscDraw_X *XiWin, PetscDrawXiPixVal fg)
71d71ae5a4SJacob Faibussowitsch {
725c6c1daeSBarry Smith   XGCValues gcvalues; /* window graphics context values */
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith   PetscFunctionBegin;
755c6c1daeSBarry Smith   /* Set the graphics contexts */
765c6c1daeSBarry Smith   /* create a gc for the ROP_SET operation (writing the fg value to a pixel) */
775c6c1daeSBarry Smith   /* (do this with function GXcopy; GXset will automatically write 1) */
785c6c1daeSBarry Smith   gcvalues.function   = GXcopy;
795c6c1daeSBarry Smith   gcvalues.foreground = fg;
805c6c1daeSBarry Smith   XiWin->gc.cur_pix   = fg;
815c6c1daeSBarry Smith   XiWin->gc.set       = XCreateGC(XiWin->disp, RootWindow(XiWin->disp, XiWin->screen), GCFunction | GCForeground, &gcvalues);
8208401ef6SPierre Jolivet   PetscCheck(XiWin->gc.set, PETSC_COMM_SELF, PETSC_ERR_LIB, "Unable to create X graphics context");
83*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8415d5bc79SLisandro Dalcin }
8515d5bc79SLisandro Dalcin 
8615d5bc79SLisandro Dalcin /*
87815f00f0SLisandro Dalcin    PetscDrawXiInit - basic setup the draw (display, graphics context, font)
8815d5bc79SLisandro Dalcin */
89d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawXiInit(PetscDraw_X *XiWin, const char display[])
90d71ae5a4SJacob Faibussowitsch {
9115d5bc79SLisandro Dalcin   PetscFunctionBegin;
929566063dSJacob Faibussowitsch   PetscCall(PetscDrawXiOpenDisplay(XiWin, display));
939566063dSJacob Faibussowitsch   PetscCall(PetscDrawXiCreateGC(XiWin, XiWin->foreground));
949566063dSJacob Faibussowitsch   PetscCall(PetscDrawXiFontFixed(XiWin, 6, 10, &XiWin->font));
95*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
965c6c1daeSBarry Smith }
975c6c1daeSBarry Smith 
985c6c1daeSBarry Smith /*
9911cc89d2SBarry Smith     This routine waits until the window is actually created. If the window was
10011cc89d2SBarry Smith     never mapped it generates an error
10109440f25SLisandro Dalcin */
102d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawXiWaitMap(PetscDraw_X *XiWin)
103d71ae5a4SJacob Faibussowitsch {
10409440f25SLisandro Dalcin   XEvent event;
10509440f25SLisandro Dalcin 
10609440f25SLisandro Dalcin   PetscFunctionBegin;
10709440f25SLisandro Dalcin   while (1) {
10809440f25SLisandro Dalcin     XMaskEvent(XiWin->disp, ExposureMask | StructureNotifyMask, &event);
10909440f25SLisandro Dalcin     if (event.xany.window != XiWin->win) break;
11009440f25SLisandro Dalcin     else {
11109440f25SLisandro Dalcin       switch (event.type) {
11209440f25SLisandro Dalcin       case ConfigureNotify:
11309440f25SLisandro Dalcin         /* window has been moved or resized */
11409440f25SLisandro Dalcin         XiWin->w = event.xconfigure.width - 2 * event.xconfigure.border_width;
11509440f25SLisandro Dalcin         XiWin->h = event.xconfigure.height - 2 * event.xconfigure.border_width;
11609440f25SLisandro Dalcin         break;
117d71ae5a4SJacob Faibussowitsch       case DestroyNotify:
118d71ae5a4SJacob Faibussowitsch         SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, "Window was not properly created");
11909440f25SLisandro Dalcin       case Expose:
120*3ba16761SJacob Faibussowitsch         PetscFunctionReturn(PETSC_SUCCESS);
12109440f25SLisandro Dalcin         /* else ignore event */
12209440f25SLisandro Dalcin       }
12309440f25SLisandro Dalcin     }
12409440f25SLisandro Dalcin   }
125*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12609440f25SLisandro Dalcin }
12709440f25SLisandro Dalcin 
12809440f25SLisandro Dalcin /*
1295c6c1daeSBarry Smith     Actually display a window at [x,y] with sizes (w,h)
1305c6c1daeSBarry Smith */
131d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawXiDisplayWindow(PetscDraw_X *XiWin, char *label, int x, int y, int w, int h)
132d71ae5a4SJacob Faibussowitsch {
1335c6c1daeSBarry Smith   unsigned int         wavail, havail;
1345c6c1daeSBarry Smith   XSizeHints           size_hints;
1355c6c1daeSBarry Smith   XWindowAttributes    in_window_attributes;
1365c6c1daeSBarry Smith   XSetWindowAttributes window_attributes;
13715d5bc79SLisandro Dalcin   unsigned int         border_width  = 0;
13815d5bc79SLisandro Dalcin   unsigned long        backgnd_pixel = WhitePixel(XiWin->disp, XiWin->screen);
1395c6c1daeSBarry Smith   unsigned long        wmask;
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith   PetscFunctionBegin;
1425c6c1daeSBarry Smith   /* get the available widths */
1435c6c1daeSBarry Smith   wavail = DisplayWidth(XiWin->disp, XiWin->screen);
1445c6c1daeSBarry Smith   havail = DisplayHeight(XiWin->disp, XiWin->screen);
145cc73adaaSBarry Smith   PetscCheck(w > 0 && h > 0, PETSC_COMM_SELF, PETSC_ERR_LIB, "X Window display has invalid height or width");
1465c6c1daeSBarry Smith   if ((unsigned int)w > wavail) w = wavail;
1475c6c1daeSBarry Smith   if ((unsigned int)h > havail) h = havail;
1485c6c1daeSBarry Smith 
14915d5bc79SLisandro Dalcin   if (x < 0) x = (int)(wavail - (unsigned int)w + (unsigned int)x);
15015d5bc79SLisandro Dalcin   if (y < 0) y = (int)(havail - (unsigned int)h + (unsigned int)y);
15115d5bc79SLisandro Dalcin   x = ((unsigned int)x + w > wavail) ? (int)(wavail - (unsigned int)w) : x;
15215d5bc79SLisandro Dalcin   y = ((unsigned int)y + h > havail) ? (int)(havail - (unsigned int)h) : y;
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith   /* We need XCreateWindow since we may need an visual other than the default one */
1555c6c1daeSBarry Smith   XGetWindowAttributes(XiWin->disp, RootWindow(XiWin->disp, XiWin->screen), &in_window_attributes);
1565c6c1daeSBarry Smith   window_attributes.background_pixmap = None;
1575c6c1daeSBarry Smith   window_attributes.background_pixel  = backgnd_pixel;
1585c6c1daeSBarry Smith   /* No border for now */
1595c6c1daeSBarry Smith   window_attributes.border_pixmap = None;
1605c6c1daeSBarry Smith   /*
1615c6c1daeSBarry Smith   window_attributes.border_pixel      = border_pixel;
1625c6c1daeSBarry Smith   */
1635c6c1daeSBarry Smith   window_attributes.bit_gravity = in_window_attributes.bit_gravity;
1645c6c1daeSBarry Smith   window_attributes.win_gravity = in_window_attributes.win_gravity;
1655c6c1daeSBarry Smith   /* Backing store is too slow in color systems */
16615d5bc79SLisandro Dalcin   window_attributes.backing_store         = NotUseful;
1675c6c1daeSBarry Smith   window_attributes.backing_pixel         = backgnd_pixel;
1685c6c1daeSBarry Smith   window_attributes.save_under            = 1;
1695c6c1daeSBarry Smith   window_attributes.event_mask            = 0;
1705c6c1daeSBarry Smith   window_attributes.do_not_propagate_mask = 0;
1715c6c1daeSBarry Smith   window_attributes.override_redirect     = 0;
1725c6c1daeSBarry Smith   window_attributes.colormap              = XiWin->cmap;
1735c6c1daeSBarry Smith   /* None for cursor does NOT mean none, it means cursor of Parent */
1745c6c1daeSBarry Smith   window_attributes.cursor = None;
175a297a907SKarl Rupp 
1769371c9d4SSatish Balay   wmask = CWBackPixmap | CWBackPixel | CWBorderPixmap | CWBitGravity | CWWinGravity | CWBackingStore | CWBackingPixel | CWOverrideRedirect | CWSaveUnder | CWEventMask | CWDontPropagate | CWCursor | CWColormap;
1775c6c1daeSBarry Smith 
17815d5bc79SLisandro 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);
17928b400f6SJacob Faibussowitsch   PetscCheck(XiWin->win, PETSC_COMM_SELF, PETSC_ERR_LIB, "Unable to open X window");
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith   /* set window manager hints */
1825c6c1daeSBarry Smith   {
1835c6c1daeSBarry Smith     XWMHints      wm_hints;
1845c6c1daeSBarry Smith     XClassHint    class_hints;
1855c6c1daeSBarry Smith     XTextProperty windowname, iconname;
1865c6c1daeSBarry Smith 
187a297a907SKarl Rupp     if (label) XStringListToTextProperty(&label, 1, &windowname);
188a297a907SKarl Rupp     else XStringListToTextProperty(&label, 0, &windowname);
189a297a907SKarl Rupp     if (label) XStringListToTextProperty(&label, 1, &iconname);
190a297a907SKarl Rupp     else XStringListToTextProperty(&label, 0, &iconname);
1915c6c1daeSBarry Smith 
1925c6c1daeSBarry Smith     wm_hints.initial_state = NormalState;
1935c6c1daeSBarry Smith     wm_hints.input         = True;
1945c6c1daeSBarry Smith     wm_hints.flags         = StateHint | InputHint;
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith     /* These properties can be used by window managers to decide how to display a window */
1975c6c1daeSBarry Smith     class_hints.res_name  = (char *)"petsc";
1985c6c1daeSBarry Smith     class_hints.res_class = (char *)"PETSc";
1995c6c1daeSBarry Smith 
2005c6c1daeSBarry Smith     size_hints.x          = x;
2015c6c1daeSBarry Smith     size_hints.y          = y;
2025c6c1daeSBarry Smith     size_hints.min_width  = 4 * border_width;
2035c6c1daeSBarry Smith     size_hints.min_height = 4 * border_width;
2045c6c1daeSBarry Smith     size_hints.width      = w;
2055c6c1daeSBarry Smith     size_hints.height     = h;
2065c6c1daeSBarry Smith     size_hints.flags      = USPosition | USSize | PMinSize;
2075c6c1daeSBarry Smith 
20802c9f0b5SLisandro Dalcin     XSetWMProperties(XiWin->disp, XiWin->win, &windowname, &iconname, NULL, 0, &size_hints, &wm_hints, &class_hints);
2095c6c1daeSBarry Smith     XFree((void *)windowname.value);
2105c6c1daeSBarry Smith     XFree((void *)iconname.value);
2115c6c1daeSBarry Smith   }
212481cee7bSLisandro Dalcin 
2135c6c1daeSBarry Smith   /* make the window visible */
2145c6c1daeSBarry Smith   XSelectInput(XiWin->disp, XiWin->win, ExposureMask | StructureNotifyMask);
2155c6c1daeSBarry Smith   XMapWindow(XiWin->disp, XiWin->win);
2165c6c1daeSBarry Smith   /* some window systems are cruel and interfere with the placement of
2175c6c1daeSBarry Smith      windows.  We wait here for the window to be created or to die */
218cc73adaaSBarry Smith   PetscCall(PetscDrawXiWaitMap(XiWin));
21973ecf448SLisandro Dalcin   XSelectInput(XiWin->disp, XiWin->win, NoEventMask);
220*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2215c6c1daeSBarry Smith }
2225c6c1daeSBarry Smith 
223d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawXiQuickWindow(PetscDraw_X *XiWin, char *name, int x, int y, int nx, int ny)
224d71ae5a4SJacob Faibussowitsch {
2255c6c1daeSBarry Smith   PetscFunctionBegin;
2269566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetColormap_X(XiWin, (Colormap)0));
2279566063dSJacob Faibussowitsch   PetscCall(PetscDrawXiDisplayWindow(XiWin, name, x, y, nx, ny));
22815d5bc79SLisandro Dalcin   XSetWindowBackground(XiWin->disp, XiWin->win, XiWin->background);
22915d5bc79SLisandro Dalcin   XClearWindow(XiWin->disp, XiWin->win);
230*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2315c6c1daeSBarry Smith }
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith /*
2345c6c1daeSBarry Smith    A version from an already defined window
2355c6c1daeSBarry Smith */
236d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawXiQuickWindowFromWindow(PetscDraw_X *XiWin, Window win)
237d71ae5a4SJacob Faibussowitsch {
2385c6c1daeSBarry Smith   XWindowAttributes attributes;
2395c6c1daeSBarry Smith 
2405c6c1daeSBarry Smith   PetscFunctionBegin;
24115d5bc79SLisandro Dalcin   XiWin->win = win;
24215d5bc79SLisandro Dalcin   XGetWindowAttributes(XiWin->disp, XiWin->win, &attributes);
2439566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetColormap_X(XiWin, attributes.colormap));
244*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2455c6c1daeSBarry Smith }
2465c6c1daeSBarry Smith 
247d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawXiQuickPixmap(PetscDraw_X *XiWin)
248d71ae5a4SJacob Faibussowitsch {
2495c6c1daeSBarry Smith   PetscFunctionBegin;
25009440f25SLisandro Dalcin   if (XiWin->drw) XFreePixmap(XiWin->disp, XiWin->drw);
25109440f25SLisandro Dalcin   XiWin->drw = XCreatePixmap(XiWin->disp, RootWindow(XiWin->disp, XiWin->screen), XiWin->w, XiWin->h, XiWin->depth);
25209440f25SLisandro Dalcin   PetscDrawXiSetPixVal(XiWin, XiWin->background);
25309440f25SLisandro Dalcin   XFillRectangle(XiWin->disp, XiWin->drw, XiWin->gc.set, 0, 0, XiWin->w, XiWin->h);
25409440f25SLisandro Dalcin   XSync(XiWin->disp, False);
255*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2565c6c1daeSBarry Smith }
25748db01dbSLisandro Dalcin 
258d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawXiResizeWindow(PetscDraw_X *XiWin, int w, int h)
259d71ae5a4SJacob Faibussowitsch {
260bf780456SLisandro Dalcin   XEvent event;
261bf780456SLisandro Dalcin   PetscFunctionBegin;
262bf780456SLisandro Dalcin   XSelectInput(XiWin->disp, XiWin->win, StructureNotifyMask);
263bf780456SLisandro Dalcin   XResizeWindow(XiWin->disp, XiWin->win, (unsigned int)w, (unsigned int)h);
264bf780456SLisandro Dalcin   XWindowEvent(XiWin->disp, XiWin->win, StructureNotifyMask, &event);
265bf780456SLisandro Dalcin   XSelectInput(XiWin->disp, XiWin->win, NoEventMask);
266*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
267bf780456SLisandro Dalcin }
268bf780456SLisandro Dalcin 
269d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawXiGetGeometry(PetscDraw_X *XiWin, int *x, int *y, int *w, int *h)
270d71ae5a4SJacob Faibussowitsch {
27148db01dbSLisandro Dalcin   XWindowAttributes attributes;
27248db01dbSLisandro Dalcin   Window            root, parent, child;
27348db01dbSLisandro Dalcin   int               xx = 0, yy = 0;
27448db01dbSLisandro Dalcin   unsigned int      ww = 0, hh = 0, dummy;
27548db01dbSLisandro Dalcin   PetscFunctionBegin;
27648db01dbSLisandro Dalcin   if (XiWin->win) {
27748db01dbSLisandro Dalcin     XGetGeometry(XiWin->disp, XiWin->win, &parent, &xx, &yy, &ww, &hh, &dummy, &dummy);
27848db01dbSLisandro Dalcin     root = RootWindow(XiWin->disp, XiWin->screen);
27948db01dbSLisandro Dalcin     if (!XTranslateCoordinates(XiWin->disp, XiWin->win, root, 0, 0, &xx, &yy, &child)) {
28048db01dbSLisandro Dalcin       XGetWindowAttributes(XiWin->disp, XiWin->win, &attributes);
28148db01dbSLisandro Dalcin       root = attributes.screen->root;
28248db01dbSLisandro Dalcin       (void)XTranslateCoordinates(XiWin->disp, XiWin->win, root, 0, 0, &xx, &yy, &child);
28348db01dbSLisandro Dalcin     }
28448db01dbSLisandro Dalcin   } else if (XiWin->drw) {
28548db01dbSLisandro Dalcin     XGetGeometry(XiWin->disp, XiWin->drw, &root, &xx, &yy, &ww, &hh, &dummy, &dummy);
28648db01dbSLisandro Dalcin   }
28748db01dbSLisandro Dalcin   if (x) *x = xx;
28848db01dbSLisandro Dalcin   if (y) *y = yy;
28948db01dbSLisandro Dalcin   if (w) *w = (int)ww;
29048db01dbSLisandro Dalcin   if (h) *h = (int)hh;
291*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
29248db01dbSLisandro Dalcin }
293