Merge fixes for MinGW 4.8

Fix compilation problems in ANSI build and when using an old SDK.

Closes https://github.com/wxWidgets/wxWidgets/pull/289
This commit is contained in:
Vadim Zeitlin
2016-05-30 19:30:36 +02:00
5 changed files with 61 additions and 33 deletions

View File

@@ -0,0 +1,39 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/msw/private/dcdynwrap.h
// Purpose: Private dynamically loaded HDC-related functions
// Author: Vadim Zeitlin
// Created: 2016-05-26 (extracted from src/msw/dc.cpp)
// Copyright: (c) 2016 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_MSW_PRIVATE_DCDYNWRAP_H_
#define _WX_MSW_PRIVATE_DCDYNWRAP_H_
#include "wx/msw/wrapwin.h"
// Namespace for the wrapper functions, hopefully one day we'll be able to get
// rid of all of them and then it will be easy to find all occurrences of their
// use by just searching for this namespace name.
//
// All of the functions in this namespace must work *exactly* like the standard
// functions with the same name and just return an error if dynamically loading
// them failed.
//
// And they're all implemented in src/msw/dc.cpp.
namespace wxDynLoadWrappers
{
DWORD GetLayout(HDC hdc);
DWORD SetLayout(HDC hdc, DWORD dwLayout);
BOOL AlphaBlend(HDC hdcDest, int xDest, int yDest, int wDest, int hDest,
HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc,
BLENDFUNCTION bf);
BOOL GradientFill(HDC hdc, PTRIVERTEX pVert, ULONG numVert,
PVOID pMesh, ULONG numMesh, ULONG mode);
} // namespace wxDynLoadWrappers
#endif // _WX_MSW_PRIVATE_DCDYNWRAP_H_

View File

@@ -22,23 +22,6 @@
#pragma hdrstop #pragma hdrstop
#endif #endif
// This is a horrible hack which only works because we don't currently include
// <time.h> from wx/wxprec.h. It is needed because we need timezone-related
// stuff from MinGW time.h, but it is not compiled in strict ANSI mode and it
// is too complicated to be dealt with using wxDECL_FOR_STRICT_MINGW32(). So we
// just include the header after undefining __STRICT_ANSI__ to get all the
// declarations we need -- and then define it back to avoid inconsistencies in
// all our other headers.
//
// Note that the same hack is used for "environ" in utilscmn.cpp, so if the
// code here is modified because this hack becomes unnecessary or a better
// solution is found, the code there should be updated as well.
#ifdef wxNEEDS_STRICT_ANSI_WORKAROUNDS
#undef __STRICT_ANSI__
#include <time.h>
#define __STRICT_ANSI__
#endif
#include "wx/time.h" #include "wx/time.h"
#ifndef WX_PRECOMP #ifndef WX_PRECOMP
@@ -59,6 +42,7 @@
#include <time.h> #include <time.h>
wxDECL_FOR_STRICT_MINGW32(void, tzset, (void));
#if !defined(__WXMAC__) #if !defined(__WXMAC__)
#include <sys/types.h> // for time_t #include <sys/types.h> // for time_t

View File

@@ -23,12 +23,27 @@
#pragma hdrstop #pragma hdrstop
#endif #endif
// See comment about this hack in time.cpp: here we do it for environ external // This is a needed to get the declaration of the global "environ" variable
// variable which can't be easily declared when using MinGW in strict ANSI mode. // from MinGW headers which don't declare it there when in strict ANSI mode. We
// can't use the usual wxDECL_FOR_STRICT_MINGW32() hack for it because it's not
// even a variable, but a macro expanding to a function or a variable depending
// on the build and this is horribly brittle but there just doesn't seem to be
// any other alternative.
#ifdef wxNEEDS_STRICT_ANSI_WORKAROUNDS #ifdef wxNEEDS_STRICT_ANSI_WORKAROUNDS
#undef __STRICT_ANSI__ // Notice that undefining __STRICT_ANSI__ and including it here doesn't
// work because it could have been already included, e.g. when using PCH.
#include <stdlib.h> #include <stdlib.h>
#define __STRICT_ANSI__
#ifndef environ
// This just reproduces what stdlib.h does in MinGW 4.8.1.
#ifdef __MSVCRT__
wxDECL_FOR_STRICT_MINGW32(char ***, __p__environ, (void));
#define environ (*__p__environ())
#else
extern char *** _imp___environ_dll;
#define environ (*_imp___environ_dll)
#endif
#endif // defined(environ)
#endif #endif
#ifndef WX_PRECOMP #ifndef WX_PRECOMP

View File

@@ -47,6 +47,7 @@
#include "wx/renderer.h" #include "wx/renderer.h"
#include "wx/msw/private.h" #include "wx/msw/private.h"
#include "wx/msw/dc.h" #include "wx/msw/dc.h"
#include "wx/msw/private/dcdynwrap.h"
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// private functions // private functions
@@ -159,7 +160,7 @@ bool wxCheckListBoxItem::OnDrawItem(wxDC& dc, const wxRect& rc,
UINT uState = stat & wxOwnerDrawn::wxODSelected ? wxDSB_SELECTED : wxDSB_NORMAL; UINT uState = stat & wxOwnerDrawn::wxODSelected ? wxDSB_SELECTED : wxDSB_NORMAL;
// checkmarks should not be mirrored in RTL layout // checkmarks should not be mirrored in RTL layout
DWORD oldLayout = ::GetLayout(hdc); DWORD oldLayout = wxDynLoadWrappers::GetLayout(hdc);
if ( oldLayout & LAYOUT_RTL ) if ( oldLayout & LAYOUT_RTL )
::SetLayout(hdc, oldLayout | LAYOUT_BITMAPORIENTATIONPRESERVED); ::SetLayout(hdc, oldLayout | LAYOUT_BITMAPORIENTATIONPRESERVED);
wxDrawStateBitmap(hdc, hBmpCheck, x, y, uState); wxDrawStateBitmap(hdc, hBmpCheck, x, y, uState);

View File

@@ -240,13 +240,6 @@ wxIMPLEMENT_DYNAMIC_CLASS(wxGDIDLLsCleanupModule, wxModule);
#endif // USE_DYNAMIC_GDI_FUNCS #endif // USE_DYNAMIC_GDI_FUNCS
// Namespace for the wrapper functions, hopefully one day we'll be able to get
// rid of all of them and then it will be easy to find all occurrences of their
// use by just searching for this namespace name.
//
// All of the functions in this namespace must work *exactly* like the standard
// functions with the same name and just return an error if dynamically loading
// them failed.
namespace wxDynLoadWrappers namespace wxDynLoadWrappers
{ {
@@ -317,19 +310,16 @@ BOOL GradientFill(HDC hdc, PTRIVERTEX pVert, ULONG numVert,
#elif defined(USE_STATIC_GDI_FUNCS) #elif defined(USE_STATIC_GDI_FUNCS)
inline
DWORD GetLayout(HDC hdc) DWORD GetLayout(HDC hdc)
{ {
return ::GetLayout(hdc); return ::GetLayout(hdc);
} }
inline
DWORD SetLayout(HDC hdc, DWORD dwLayout) DWORD SetLayout(HDC hdc, DWORD dwLayout)
{ {
return ::SetLayout(hdc, dwLayout); return ::SetLayout(hdc, dwLayout);
} }
inline
BOOL AlphaBlend(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, BOOL AlphaBlend(HDC hdcDest, int xDest, int yDest, int wDest, int hDest,
HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc,
BLENDFUNCTION bf) BLENDFUNCTION bf)
@@ -339,7 +329,6 @@ BOOL AlphaBlend(HDC hdcDest, int xDest, int yDest, int wDest, int hDest,
bf); bf);
} }
inline
BOOL GradientFill(HDC hdc, PTRIVERTEX pVert, ULONG numVert, BOOL GradientFill(HDC hdc, PTRIVERTEX pVert, ULONG numVert,
PVOID pMesh, ULONG numMesh, ULONG mode) PVOID pMesh, ULONG numMesh, ULONG mode)
{ {