Wineconsole regressed between 10pm April 3 and 10pm April 4 (GMT). The IDA Pro disassembler (idaw.exe, available from http://www.datarescue.be/downloadfreeware.htm) fails due to changes on this date. This is a console mode program with turbo pascal style windows, for example windows have a little green square as a close box.
History:
Jan 1 CVS : program runs with good sized font, however bitmaps like the little green square show up as odd characters.
Apr 3 CVS : program runs with tiny font, bitmaps are displayed correctly.
Apr 4 CVS : window comes up, disappears, wine exits without an error.
(Normal behaviour: window comes up, is resized, initial screen is drawn.)
Thus the bug is: wine exits immediately after bringing up the window (but before drawing anything in it). This seems to be due to changes in xfont.c.
I offer here a choice of two patches that "fix" this. Surely neither of them is getting to the root cause of the problem. Either works, but with patch 2, the text comes up in a tiny font like with Apr 3 CVS, with patch 1 it comes up in a normal font (but no little bitmaps, like Jan 1 CVS).
All the best,
Duncan.
Patch 1 (also attachment 1). This reverts from using the global variable text_caps to using a local variable XTextCaps.
--- bad/graphics/x11drv/xfont.c.orig Wed May 1 09:42:32 2002 +++ bad/graphics/x11drv/xfont.c Wed May 1 09:46:39 2002 @@ -78,6 +78,11 @@ static fontAlias *aliasTable = NULL; +static UINT XTextCaps = (TC_OP_CHARACTER | TC_OP_STROKE | TC_CP_STROKE | TC_CR_ANY | + TC_SA_DOUBLE | TC_SA_INTEGER | TC_SA_CONTIN | + TC_UA_ABLE | TC_SO_ABLE | TC_RA_ABLE); + /* X11R6 adds TC_SF_X_YINDEP, maybe more... */ + static const char* INIFontMetrics = "cachedmetrics."; static const char* INIFontSection = "Software\Wine\Wine\Config\fonts"; static const char* INIAliasSection = "Alias"; @@ -948,7 +953,7 @@ aLFD.resolution_x = resx_string; strcpy(resy_string, resx_string); - if( uRelax == 0 && text_caps & TC_SF_X_YINDEP ) + if( uRelax == 0 && XTextCaps & TC_SF_X_YINDEP ) { if( fo->lf.lfWidth && !(fo->fo_flags & FO_SYNTH_WIDTH)) { @@ -2424,7 +2429,7 @@ fontInfo* pfi = pfm->pfi; /* device font to match */ LPLOGFONT16 plf = pfm->plf; /* wanted logical font */ UINT penalty = 0; - BOOL bR6 = pfm->flags & FO_MATCH_XYINDEP; /* from text_caps */ + BOOL bR6 = pfm->flags & FO_MATCH_XYINDEP; /* from XTextCaps */ BOOL bScale = pfi->fi_flags & FI_SCALABLE; int d = 0, height; @@ -2947,7 +2952,7 @@ strcpy(buffer, "-*-*-*-*-normal-*-[12 0 0 12]-*-72-*-*-*-iso8859-1"); if( (x_fs = TSXLoadQueryFont(gdi_display, buffer)) ) { - text_caps |= TC_SF_X_YINDEP; + XTextCaps |= TC_SF_X_YINDEP; TSXFreeFont(gdi_display, x_fs); } } @@ -2980,7 +2985,7 @@ XFONT_GetPointResolution( log_pixels_x, log_pixels_y ); if(X11DRV_XRender_Installed) - text_caps |= TC_VA_ABLE; + XTextCaps |= TC_VA_ABLE; return; } @@ -3055,7 +3060,7 @@ fm.plf = plf; fm.internal_charset = internal_charset; - if( text_caps & TC_SF_X_YINDEP ) fm.flags = FO_MATCH_XYINDEP; + if( XTextCaps & TC_SF_X_YINDEP ) fm.flags = FO_MATCH_XYINDEP; /* allocate new font cache entry */
-------------------------------------------------------------------
Patch 2 (also attachment 2). BOTH lines need to be changed.
--- bad/graphics/x11drv/xfont.c.orig Wed May 1 09:42:32 2002 +++ bad/graphics/x11drv/xfont.c Wed May 1 09:15:35 2002 @@ -2978,6 +2978,7 @@ void X11DRV_FONT_Init( int *log_pixels_x, int *log_pixels_y ) { XFONT_GetPointResolution( log_pixels_x, log_pixels_y ); + X11DRV_FONT_InitX11Metrics(); if(X11DRV_XRender_Installed) text_caps |= TC_VA_ABLE; @@ -3324,7 +3325,7 @@ LOGFONT16 lf16; /* don't enumerate x11 fonts if we're using client side fonts */ - if (physDev->dc->gdiFont) return FALSE; +/* if (physDev->dc->gdiFont) return FALSE;*/ FONT_LogFontWTo16(plf, &lf16); -------------------------------------------------------------------------------
For information, here are the changes to xfont.c between April 3 and April 4 (attachment 3).
diff -u -r --exclude=CVS 4_april_2002_mid/graphics/x11drv/xfont.c 4_april_2002/graphics/x11drv/xfont.c --- 4_april_2002_mid/graphics/x11drv/xfont.c Mon Apr 29 20:56:51 2002 +++ 4_april_2002/graphics/x11drv/xfont.c Sun Apr 28 20:53:50 2002 @@ -77,11 +77,6 @@ static fontAlias *aliasTable = NULL; -static UINT XTextCaps = (TC_OP_CHARACTER | TC_OP_STROKE | TC_CP_STROKE | TC_CR_ANY | - TC_SA_DOUBLE | TC_SA_INTEGER | TC_SA_CONTIN | - TC_UA_ABLE | TC_SO_ABLE | TC_RA_ABLE); - /* X11R6 adds TC_SF_X_YINDEP, maybe more... */ - static const char* INIFontMetrics = "cachedmetrics."; static const char* INIFontSection = "Software\Wine\Wine\Config\fonts"; static const char* INIAliasSection = "Alias"; @@ -952,7 +947,7 @@ aLFD.resolution_x = resx_string; strcpy(resy_string, resx_string); - if( uRelax == 0 && XTextCaps & TC_SF_X_YINDEP ) + if( uRelax == 0 && text_caps & TC_SF_X_YINDEP ) { if( fo->lf.lfWidth && !(fo->fo_flags & FO_SYNTH_WIDTH)) { @@ -2428,7 +2423,7 @@ fontInfo* pfi = pfm->pfi; /* device font to match */ LPLOGFONT16 plf = pfm->plf; /* wanted logical font */ UINT penalty = 0; - BOOL bR6 = pfm->flags & FO_MATCH_XYINDEP; /* from TextCaps */ + BOOL bR6 = pfm->flags & FO_MATCH_XYINDEP; /* from text_caps */ BOOL bScale = pfi->fi_flags & FI_SCALABLE; int d = 0, height; @@ -2834,24 +2829,22 @@ } /*********************************************************************** - * X11DRV_FONT_Init + * X11DRV_FONT_InitX11Metrics * * Initialize font resource list and allocate font cache. */ -int X11DRV_FONT_Init( int *log_pixels_x, int *log_pixels_y ) +void X11DRV_FONT_InitX11Metrics( void ) { char** x_pattern; unsigned x_checksum; - int i,res, x_count, fd, buf_size; + int i, x_count, fd, buf_size; char *buffer; HKEY hkey; - res = XFONT_GetPointResolution( log_pixels_x, log_pixels_y ); - + x_pattern = TSXListFonts(gdi_display, "*", MAX_FONTS, &x_count ); - TRACE("Font Mapper: initializing %i fonts [logical dpi=%i, default dpi=%i]\n", - x_count, res, DefResolution); + TRACE("Font Mapper: initializing %i x11 fonts\n", x_count); if (x_count == MAX_FONTS) MESSAGE("There may be more fonts available - try increasing the value of MAX_FONTS\n"); @@ -2917,7 +2910,7 @@ strcpy(buffer, "-*-*-*-*-normal-*-[12 0 0 12]-*-72-*-*-*-iso8859-1"); if( (x_fs = TSXLoadQueryFont(gdi_display, buffer)) ) { - XTextCaps |= TC_SF_X_YINDEP; + text_caps |= TC_SF_X_YINDEP; TSXFreeFont(gdi_display, x_fs); } } @@ -2939,11 +2932,20 @@ RAW_ASCENT = TSXInternAtom(gdi_display, "RAW_ASCENT", TRUE); RAW_DESCENT = TSXInternAtom(gdi_display, "RAW_DESCENT", TRUE); + return; +} + +/*********************************************************************** + * X11DRV_FONT_Init + */ +void X11DRV_FONT_Init( int *log_pixels_x, int *log_pixels_y ) +{ + XFONT_GetPointResolution( log_pixels_x, log_pixels_y ); if(X11DRV_XRender_Installed) - XTextCaps |= TC_VA_ABLE; + text_caps |= TC_VA_ABLE; - return XTextCaps; + return; } /********************************************************************** @@ -3016,7 +3018,7 @@ fm.plf = plf; fm.internal_charset = internal_charset; - if( XTextCaps & TC_SF_X_YINDEP ) fm.flags = FO_MATCH_XYINDEP; + if( text_caps & TC_SF_X_YINDEP ) fm.flags = FO_MATCH_XYINDEP; /* allocate new font cache entry */ @@ -3203,6 +3205,8 @@ EnterCriticalSection( &crtsc_fonts_X11 ); + if(fontList == NULL) X11DRV_FONT_InitX11Metrics(); + if( CHECK_PFONT(physDev->font) ) XFONT_ReleaseCacheEntry( __PFONT(physDev->font) ); @@ -3279,9 +3283,17 @@ ENUMLOGFONTEXW lf; NEWTEXTMETRICEXW tm; fontResource* pfr = fontList; - BOOL b, bRet = 0; + BOOL b, bRet = 0, using_gdi = 0; LOGFONT16 lf16; + DC *dc; + + dc = DC_GetDCPtr(hdc); + if(!dc) return FALSE; + if(dc->gdiFont) using_gdi = TRUE; + GDI_ReleaseObj(hdc); + /* don't enumerate x11 fonts if we're using client side fonts */ + if(using_gdi) return FALSE; FONT_LogFontWTo16(plf, &lf16);