From 788519c6055dc2290c40fb1569d2889d8ef8e76b Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 21 Feb 2002 14:52:04 +0000 Subject: [PATCH] Some more NanoX compile fixes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14337 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/x11/nanox/X11/Xlib.h | 99 ++++++++++++++++++++- include/wx/x11/privx.h | 2 + src/x11/app.cpp | 2 + src/x11/dcclient.cpp | 12 +-- src/x11/font.cpp | 2 +- src/x11/nanox.c | 153 ++++++++++++++++++++++++-------- src/x11/palette.cpp | 4 +- src/x11/popupwin.cpp | 10 ++- 8 files changed, 237 insertions(+), 47 deletions(-) diff --git a/include/wx/x11/nanox/X11/Xlib.h b/include/wx/x11/nanox/X11/Xlib.h index 8698db12a3..3805751b1f 100644 --- a/include/wx/x11/nanox/X11/Xlib.h +++ b/include/wx/x11/nanox/X11/Xlib.h @@ -5,7 +5,11 @@ #ifndef _DUMMY_XLIBH_ #define _DUMMY_XLIBH_ +/* Move away the typedef in XtoNX.h */ +#define XFontStruct XFontStruct1 #include +#undef XFontStruct +#undef XCharStruct /* Data types */ @@ -16,6 +20,20 @@ typedef unsigned long VisualID; typedef int Bool; typedef long XID; typedef XID KeySym; +typedef struct { + GR_FONT_INFO info; + GR_FONT_ID fid; +} XFontStruct; +typedef struct { + short lbearing; /* origin to left edge of raster */ + short rbearing; /* origin to right edge of raster */ + short width; /* advance to next char's origin */ + short ascent; /* baseline to top edge of raster */ + short descent; /* baseline to bottom edge of raster */ + unsigned short attributes; /* per char flags (not predefined) */ +} XCharStruct; + + /* typedef unsigned long Time; */ #define Success 0 @@ -30,12 +48,77 @@ typedef XID KeySym; #define PropertyChangeMask GR_EVENT_MASK_SELECTION_CHANGED #define GraphicsExpose GR_EVENT_TYPE_EXPOSURE #define GraphicsExposeMask GR_EVENT_MASK_EXPOSURE +#define ColormapChangeMask 0 +#define FillSolid 0 +#define LineSolid 0 +#define LineOnOffDash 0 +#define CapNotLast 0 +#define CapRound 0 +#define CapProjecting 0 +#define CapButt 0 +#define JoinRound 0 +#define JoinBevel 0 +#define JoinMiter 0 +#define IncludeInferiors 0 +#define ClipByChildren 0 +#define DoRed 0 +#define DoGreen 0 +#define DoBlue 0 + +#define GXcopy GR_MODE_COPY +#define GXclear GR_MODE_CLEAR +#ifndef GXxor +#define GXxor GR_MODE_OR +#endif +#define GXinvert GR_MODE_INVERT +#define GXorReverse GR_MODE_ORREVERSE +#define GXandReverse GR_MODE_ANDREVERSE +#define GXand GR_MODE_AND +#define GXor GR_MODE_OR +#define GXandInverted GR_MODE_ANDINVERTED +#define GXnoop GR_MODE_NOOP +#define GXnor GR_MODE_NOR +#define GXequiv GR_MODE_EQUIV +#define GXcopyInverted GR_MODE_COPYINVERTED +#define GXorInverted GR_MODE_ORINVERTED +#define GXnand GR_MODE_NAND +#define GXset GR_MODE_SET + +inline void wxNoop() { /* Do nothing */ } #define XSynchronize(display,sync) #define XDefaultRootWindow(d) GR_ROOT_WINDOW_ID #define XFreePixmap(d, p) GrDestroyWindow(p) #define XFreeCursor(d, c) GrDestroyCursor(c) +#define XFreeGC(d, gc) GrDestroyGC(gc) +#define XSetBackground(d, gc, c) GrSetGCBackground(gc, c) #define DefaultVisual(d, s) ((Visual*) NULL) +#define DefaultColormap(d, s) DefaultColormapOfScreen((Screen*) NULL) +#define XSetFillStyle(d, gc, s) wxNoop() +#define XSetLineAttributes(d, gc, a, b, c, e) wxNoop() +#define XSetClipMask(d, gc, m) wxNoop() +#define XSetTSOrigin(d, gc, x, y) wxNoop() +#define XFillArc(d, w, gc, x, y, rx, ry, a1, a2) GrArcAngle(w, gc, x, y, rx, ry, a1, a2, GR_PIE) +#define XDrawArc(d, w, gc, x, y, rx, ry, a1, a2) GrArcAngle(w, gc, x, y, rx, ry, a1, a2, GR_ARC) +#define XDrawPoint(d, w, gc, x, y) GrPoint(w, gc, x, y) +#define XFillPolygon(d, w, gc, p, n, s, m) GrFillPoly(w, gc, n, p) +#define XDrawRectangle(d, w, gc, x, y, width, height) GrRect(w, gc, x, y, width, height) +#define XSetClipOrigin(d, gc, x, y) GrSetGCClipOrigin(gc, x, y) +#define XSetRegion(d, gc, r) GrSetGCRegion(gc, r) +#define XSetTile(d, gc, p) wxNoop() +#define XSetStipple(d, gc, p) wxNoop() +#define XSetSubwindowMode(d, gc, mode) wxNoop() +#define XFreeColormap(d, cmap) wxNoop() +#define XSetTransientForHint(d, w, p) wxNoop() +#define XUnionRegion(sr1,sr2,r) GrUnionRegion(r,sr1,sr2) +#define XIntersectRegion(sr1,sr2,r) GrIntersectRegion(r,sr1,sr2) +#define XEqualRegion(r1, r2) GrEqualRegion(r1, r2) +#define XEmptyRegion(r) GrEmptyRegion(r) +#define XOffsetRegion(r, x, y) GrOffsetRegion(r, x, y) +#define XClipBox(r, rect) GrGetRegionBox(r, rect) +#define XPointInRegion(r, x, y) GrPointInRegion(r, x, y) +#define XXorRegion(sr1, sr2, r) GrXorRegion(r, sr1, sr2) + /* These defines are wrongly defined in XtoNX.h, IMHO, * since they reference a static global. @@ -163,6 +246,10 @@ typedef int (*XErrorHandler) ( /* WARNING, this type not in Xlib spec */ #define PointerMotionMask GR_EVENT_MASK_MOUSE_POSITION #endif +#define ButtonMotionMask GR_EVENT_MASK_MOUSE_POSITION +#define KeymapStateMask 0 +#define StructureNotifyMask GR_EVENT_MASK_UPDATE + #ifndef FocusIn #define FocusIn GR_EVENT_TYPE_FOCUS_IN #define FocusOut GR_EVENT_TYPE_FOCUS_OUT @@ -177,7 +264,7 @@ extern "C" { Colormap DefaultColormapOfScreen(Screen* /* screen */) ; int XSetGraphicsExposures( Display* /* display */, GC /* gc */, Bool /* graphics_exposures */) ; -int XWarpPointer( Display* /* display */, Window /* srcW */, Window /* srcW */, +int XWarpPointer( Display* /* display */, Window /* srcW */, Window /* destW */, int /* srcX */, int /* srcY */, unsigned int /* srcWidth */, unsigned int /* srcHeight */, @@ -197,7 +284,7 @@ int XCopyPlane(Display* /* display */, Drawable src, Drawable dest, GC gc, int dest_x, int dest_y, unsigned long /* plane */) ; XErrorHandler XSetErrorHandler (XErrorHandler /* handler */); -Display *XOpenDisplay(const char *name); +Display *XOpenDisplay(char *name); Screen *XScreenOfDisplay(Display* /* display */, int /* screen_number */); int DisplayWidth(Display* /* display */, int /* screen */); @@ -207,6 +294,14 @@ int XAllocColor(Display* /* display */, Colormap /* cmap */, XColor* color); int XParseColor(Display* display, Colormap cmap, const char* cname, XColor* color); +int XDrawLine(Display* display, Window win, GC gc, + int x1, int y1, int x2, int y2); +int XTextExtents( XFontStruct* font, char* s, int len, int* direction, + int* ascent, int* descent2, XCharStruct* overall); +int XPending(Display *d); +XFontStruct* XLoadQueryFont(Display* display, const char* fontSpec); +int XFreeFont(Display* display, XFontStruct* fontStruct); +int XQueryColor(Display* display, Colormap cmap, XColor* color); #ifdef __cpluplus } diff --git a/include/wx/x11/privx.h b/include/wx/x11/privx.h index 42a54ddea6..31e5ebfc2f 100644 --- a/include/wx/x11/privx.h +++ b/include/wx/x11/privx.h @@ -73,6 +73,7 @@ bool wxWindowIsVisible(Window win); #define XExposeEventGetY(event) event->exposure.y #define XExposeEventGetWidth(event) event->exposure.width #define XExposeEventGetHeight(event) event->exposure.height +#define XFontStructGetAscent(f) f->info.baseline #else #define XEventGetWindow(event) event->xany.window #define XConfigureEventGetWidth(event) event->xconfigure.width @@ -81,6 +82,7 @@ bool wxWindowIsVisible(Window win); #define XExposeEventGetY(event) event->xexpose.y #define XExposeEventGetWidth(event) event->xexpose.width #define XExposeEventGetHeight(event) event->xexpose.height +#define XFontStructGetAscent(f) f->ascent #endif #endif diff --git a/src/x11/app.cpp b/src/x11/app.cpp index 7cacd7c24d..95b466af98 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -551,7 +551,9 @@ void wxApp::ProcessXEvent(WXEvent* _event) win->GetClearRegion().Union( XExposeEventGetX(event), XExposeEventGetY(event), XExposeEventGetWidth(event), XExposeEventGetHeight(event)); +#if !wxUSE_NANOX if (event->xexpose.count == 0) +#endif { // Only erase background, paint in idle time. win->SendEraseEvents(); diff --git a/src/x11/dcclient.cpp b/src/x11/dcclient.cpp index 68b68bf7b8..1af88bb272 100644 --- a/src/x11/dcclient.cpp +++ b/src/x11/dcclient.cpp @@ -1245,16 +1245,18 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) #endif XSetFont( (Display*) m_display, (GC) m_textGC, xfont->fid ); +#if !wxUSE_NANOX if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) - { +#endif + { XDrawString( (Display*) m_display, (Window) m_window, - (GC) m_textGC, x, y + xfont->ascent, text.c_str(), text.Len() ); - } + (GC) m_textGC, x, y + XFontStructGetAscent(xfont), text.c_str(), text.Len() ); + } #if 0 if (m_font.GetUnderlined()) { - wxCoord ul_y = y + font->ascent; + wxCoord ul_y = y + XFontStructGetAscent(font); if (font->descent > 0) ul_y++; gdk_draw_line( m_window, m_textGC, x, ul_y, x + width, ul_y); } @@ -1290,7 +1292,7 @@ void wxWindowDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoor int direction, ascent, descent2; XCharStruct overall; - XTextExtents( xfont, string.c_str(), string.Len(), &direction, + XTextExtents( xfont, (char*) string.c_str(), string.Len(), &direction, &ascent, &descent2, &overall); if (width) diff --git a/src/x11/font.cpp b/src/x11/font.cpp index d58155d263..6f6db81d0c 100644 --- a/src/x11/font.cpp +++ b/src/x11/font.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/motif/font.cpp +// Name: src/x11/font.cpp // Purpose: wxFont class // Author: Julian Smart // Modified by: diff --git a/src/x11/nanox.c b/src/x11/nanox.c index ccec8d0b60..73aede11b5 100644 --- a/src/x11/nanox.c +++ b/src/x11/nanox.c @@ -8,60 +8,61 @@ #if wxUSE_NANOX +#include +#include +#include "wx/defs.h" #include "wx/x11/nanox/X11/Xlib.h" /* Expands to some compatibility functions (see XtoNX.h) */ STATIC_FUNCTIONS -Colormap DefaultColormapOfScreen(Screen* /* screen */) -{ - static GR_PALETTE* s_globalColormap = 0; - static bool s_init = FALSE; +static GR_PALETTE* s_globalColormap = 0; - if (!s_init) +Colormap DefaultColormapOfScreen(Screen* screen) +{ + if (!s_globalColormap) { s_globalColormap = (GR_PALETTE*) malloc(sizeof(GR_PALETTE)); GrGetSystemPalette(s_globalColormap); - s_init = TRUE; } return s_globalColormap; } -int XSetGraphicsExposures( Display* /* display */, GC /* gc */, Bool /* graphics_exposures */) +int XSetGraphicsExposures( Display* display, GC gc, Bool graphics_exposures) { return Success ; } -int XWarpPointer( Display* /* display */, Window /* srcW */, Window /* srcW */, - int /* srcX */, int /* srcY */, - unsigned int /* srcWidth */, - unsigned int /* srcHeight */, +int XWarpPointer( Display* display, Window srcW, Window destW, + int srcX, int srcY, + unsigned int srcWidth, + unsigned int srcHeight, int destX, int destY) { GrMoveCursor(destX, destY); return Success; } -int XSetInputFocus(Display* /* display */, Window focus, int /* revert_to */, Time /* time */) +int XSetInputFocus(Display* display, Window focus, int revert_to, Time time) { GrSetFocus(focus); return Success; } -int XGetInputFocus(Display* /* display */, Window* /* focus_return */, int* /* revert_to_return */) +int XGetInputFocus(Display* display, Window* focus_return, int* revert_to_return) { * focus_return = GrGetFocus(); * revert_to_return = 0; return Success; } -int XGrabPointer(Display* /* display */, Window /* grab_window */, - Bool /* owner_events */, unsigned int /* event_mask */, - int /* pointer_mode */, int /* keyboard_mode */, - Window /* confine_to */, Cursor /* cursor */, Time /* time */) +int XGrabPointer(Display* display, Window grab_window, + Bool owner_events, unsigned int event_mask, + int pointer_mode, int keyboard_mode, + Window confine_to, Cursor cursor, Time time) { /* According to comments in srvevent.c in Nano-X, the pointer * is implicitly grabbed when a mouse button is down. @@ -70,12 +71,12 @@ int XGrabPointer(Display* /* display */, Window /* grab_window */, return Success; } -int XUngrabPointer(Display /* display */, Time /* time */) +int XUngrabPointer(Display display, Time time) { return Success; } -int XCopyArea(Display* /* display */, Drawable src, Drawable dest, GC gc, +int XCopyArea(Display* display, Drawable src, Drawable dest, GC gc, int src_x, int src_y, unsigned int width, unsigned int height, int dest_x, int dest_y) { @@ -85,9 +86,9 @@ int XCopyArea(Display* /* display */, Drawable src, Drawable dest, GC gc, return Success; } -int XCopyPlane(Display* /* display */, Drawable src, Drawable dest, GC gc, +int XCopyPlane(Display* display, Drawable src, Drawable dest, GC gc, int src_x, int src_y, unsigned int width, unsigned int height, - int dest_x, int dest_y, unsigned long /* plane */) + int dest_x, int dest_y, unsigned long plane) { GrCopyArea(dest, gc, dest_x, dest_y, width, height, src, @@ -145,7 +146,7 @@ typedef struct { Status XGetWindowAttributes(Display* display, Window w, - XWindowAttributes* window_attributes_return) + XWindowAttributes* window_attributes) { GR_WINDOW_INFO info; GrGetWindowInfo(w, & info); @@ -158,7 +159,7 @@ Status XGetWindowAttributes(Display* display, Window w, window_attributes->depth = 0; window_attributes->visual = NULL; window_attributes->root = 0; - window_attributes->class = info.inputonly ? InputOnly : InputOutput ; + window_attributes->_class = info.inputonly ? InputOnly : InputOutput ; window_attributes->bit_gravity = 0; window_attributes->win_gravity = 0; window_attributes->backing_store = 0; @@ -184,60 +185,140 @@ static void DefaultNanoXErrorHandler(GR_EVENT_ERROR* ep) { XErrorEvent errEvent; errEvent.type = ep->type; - errEvent.display = wxGlobalDisplay(); + errEvent.display = NULL; errEvent.resourceid = ep->id; errEvent.serial = 0; errEvent.error_code = ep->code; errEvent.request_code = 0; errEvent.minor_code = 0; - (*g_ErrorHandler)(wxGlobalDisplay(), & errEvent); + (*g_ErrorHandler)(NULL, & errEvent); } } XErrorHandler XSetErrorHandler (XErrorHandler handler) { XErrorHandler oldHandler = g_ErrorHandler; - g_errorHandler = handler; + g_ErrorHandler = handler; + GrSetErrorHandler(DefaultNanoXErrorHandler); return oldHandler; } -Screen *XScreenOfDisplay(Display* /* display */, - int /* screen_number */) +static Screen s_screen; +Screen *XScreenOfDisplay(Display* display, + int screen_number) { - static Screen s_screen; /* TODO: fill in the members. See Xlib.h */ return & s_screen; } -int DisplayWidth(Display* /* display */, int /* screen */) +int DisplayWidth(Display* display, int screen) { return _display.display_width; } -int DisplayHeight(Display* /* display */, int /* screen */) +int DisplayHeight(Display* display, int screen) { return _display.display_height; } -int DefaultDepth(Display* /* display */, int /* screen */) +int DefaultDepth(Display* display, int screen) { return _display.display_bpp; } -int XAllocColor(Display* /* display */, Colormap /* cmap */, +int XAllocColor(Display* display, Colormap cmap, XColor* color) { GR_PIXELVAL pixel; - GrFindColor(color, & pixel); - return pixel; + GrFindColor(GR_RGB(color->red, color->green, color->blue), & pixel); + color->pixel = pixel; + return 1; } -int XParseColor(Display* /* display */, Colormap /* cmap */, +int XParseColor(Display* display, Colormap cmap, const char* cname, XColor* color) { /* TODO */ return 0; } +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); + 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; +} + #endif /* wxUSE_NANOX */ diff --git a/src/x11/palette.cpp b/src/x11/palette.cpp index eb5cb7bdf1..8ee782b8e4 100644 --- a/src/x11/palette.cpp +++ b/src/x11/palette.cpp @@ -89,6 +89,7 @@ wxPaletteRefData::~wxPaletteRefData() if (pix_array_n > 0) { +#if !wxUSE_NANOX // XFreeColors(display, cmap, pix_array, pix_array_n, 0); // Be careful not to free '0' pixels... int i, j; @@ -97,9 +98,10 @@ wxPaletteRefData::~wxPaletteRefData() if(j > i) XFreeColors(display, cmap, &pix_array[i], j-i, 0); while(j