+int XDrawLine(Display* display, Window win, GC gc,
+ int x1, int y1, int x2, int y2)
+{
+ GR_POINT points[2];
+ points[0].x = x1;
+ points[0].y = y1;
+ points[1].x = x2;
+ points[1].y = y2;
+
+ GrDrawLines(win, gc, points, 2);
+ return 1;
+}
+
+int XTextExtents( XFontStruct* font, char* s, int len, int* direction,
+ int* ascent, int* descent2, XCharStruct* overall)
+{
+ GR_SIZE retwidth, retheight, retbase;
+ GR_GC_ID gc = GrNewGC();
+
+ *ascent = font->info.baseline;
+ *direction = 1; /* ? */
+ *descent2 = 0; /* ? */
+
+ GrSetGCFont(gc, font->fid);
+
+ /* TODO need to set the relevant flags for the character set.
+ * A good trick might be to pass a wxString instead of char*
+ * to this function.
+ */
+
+ GrGetGCTextSize(gc, s, len, GR_TFASCII, & retwidth,
+ & retheight, & retbase);
+ if (overall)
+ {
+ overall->width = retwidth;
+ overall->lbearing = 0;
+ overall->rbearing = 0;
+ overall->ascent = *ascent;
+ overall->descent = 0;
+ overall->attributes = 0;
+ }
+
+ GrDestroyGC(gc);
+
+ return 1;
+}
+
+XFontStruct* XLoadQueryFont(Display* display, const char* fontSpec)
+{
+ /* TODO: map fontSpec to something sensible for Nano-X */
+ char *fontName = NULL;
+ XFontStruct* fontInfo = malloc(sizeof(XFontStruct));
+ fontInfo->fid = GrCreateFont(fontName, 0, 0);
+ GrGetFontInfo(fontInfo->fid, & fontInfo->info);
+ printf("Warning: should not call XLoadQueryFont since font spec is not used in Nano-X.\n");
+ return fontInfo;
+}
+
+int XFreeFont(Display* display, XFontStruct* fontStruct)
+{
+ GrDestroyFont(fontStruct->fid);
+ free(fontStruct);
+ return 1;
+}
+
+int XQueryColor(Display* display, Colormap cmap, XColor* color)
+{
+ /* cmap is a GR_PALETTE */
+ if (color->pixel < cmap->count)
+ {
+ color->red = cmap->palette[color->pixel].r;
+ color->green = cmap->palette[color->pixel].g;
+ color->blue = cmap->palette[color->pixel].b;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+int XConfigureWindow(Display* display, Window w, int mask, XWindowChanges* changes)
+{
+ if ((mask & CWX) && (mask & CWY))
+ GrMoveWindow(w, changes->x, changes->y);
+ if ((mask & CWWidth) && (mask & CWHeight))
+ GrResizeWindow(w, changes->width, changes->height);
+ if (mask & CWBorderWidth)
+ {
+ /* TODO */
+ }
+ if (mask & CWSibling)
+ {
+ /* TODO */
+ }
+ if (mask & CWStackMode)
+ {
+ /* TODO */
+ }
+ return 1;
+}
+
+int XTranslateCoordinates(Display* display, Window srcWindow, Window destWindow, int srcX, int srcY, int* destX, int* destY, Window* childReturn)
+{
+ int offx = 0;
+ int offy = 0;
+
+ Window w = srcWindow;
+ while (w != GR_ROOT_WINDOW_ID)
+ {
+ GR_WINDOW_INFO info;
+ GrGetWindowInfo(w, & info);
+ w = info.parent;
+
+ offx += info.x ;
+ offy += info.y ;
+ }
+
+ w = destWindow;
+
+ while (w != GR_ROOT_WINDOW_ID)
+ {
+ GR_WINDOW_INFO info;
+ GrGetWindowInfo(w, & info);
+ w = info.parent;
+
+ offx -= info.x ;
+ offy -= info.y ;
+ }
+
+ *destX = srcX + offx;
+ *destY = srcY + offy;
+
+ if (childReturn)
+ *childReturn = 0;
+
+ return 1;
+}
+
+/* Should not really be necessary but in no-optimize mode
+ * gcc complains that wxNoop is not found if wxNoop is inline.
+ */
+
+void wxNoop()
+{
+}
+