Win32 2.13.2.0 → 2.13.2.1
raw patch · 22 files changed
+193/−38 lines, 22 filessetup-changedPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- Graphics/Win32/GDI.hs +1/−1
- Graphics/Win32/GDI/Graphics2D.hs +1/−1
- Graphics/Win32/Icon.hs +7/−0
- Graphics/Win32/Message.hsc +3/−0
- Graphics/Win32/Misc.hsc +1/−1
- Graphics/Win32/Window.hsc +1/−1
- Setup.hs +0/−6
- System/Win32/Console.hsc +73/−4
- System/Win32/Encoding.hs +2/−2
- System/Win32/File.hsc +1/−1
- System/Win32/HardLink.hs +1/−1
- System/Win32/Info/Computer.hsc +2/−2
- System/Win32/NLS.hsc +3/−3
- System/Win32/Process.hsc +1/−1
- System/Win32/Security.hsc +1/−1
- System/Win32/SimpleMAPI.hsc +2/−2
- System/Win32/SymbolicLink.hsc +1/−1
- System/Win32/Types.hsc +52/−4
- Win32.cabal +2/−2
- cbits/dumpBMP.c +3/−3
- changelog.md +9/−1
- include/wincon_compat.h +26/−0
Graphics/Win32/GDI.hs view
@@ -16,7 +16,7 @@ ----------------------------------------------------------------------------- {-# OPTIONS_GHC -w #-}--- The above warning supression flag is a temporary kludge.+-- The above warning suppression flag is a temporary kludge. -- While working on this module you are encouraged to remove it and fix -- any warnings in the module. See -- https://ghc.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
Graphics/Win32/GDI/Graphics2D.hs view
@@ -102,7 +102,7 @@ -- Filled Shapes ---------------------------------------------------------------- --- ToDo: We ought to be able to specify a colour instead of the+-- TODO: We ought to be able to specify a colour instead of the -- Brush by adding 1 to colour number. fillRect :: HDC -> RECT -> HBRUSH -> IO ()
Graphics/Win32/Icon.hs view
@@ -19,6 +19,7 @@ module Graphics.Win32.Icon where +import Foreign (Ptr) import Graphics.Win32.GDI.Types import System.Win32.Types @@ -27,6 +28,12 @@ ---------------------------------------------------------------- -- Icons ----------------------------------------------------------------++createIcon :: HINSTANCE -> Int -> Int -> BYTE -> BYTE -> Ptr BYTE -> Ptr BYTE -> IO HICON+createIcon instance_ width height planes bitsPixel andBits xorBits =+ failIfNull "CreateIcon" $ c_CreateIcon instance_ width height planes bitsPixel andBits xorBits+foreign import WINDOWS_CCONV unsafe "windows.h CreateIcon"+ c_CreateIcon :: HINSTANCE -> Int -> Int -> BYTE -> BYTE -> Ptr BYTE -> Ptr BYTE -> IO HICON copyIcon :: HICON -> IO HICON copyIcon icon =
Graphics/Win32/Message.hsc view
@@ -158,6 +158,7 @@ , wM_QUEUESYNC = WM_QUEUESYNC , wM_USER = WM_USER , wM_APP = WM_APP+ , wM_SETICON = WM_SETICON } registerWindowMessage :: String -> IO WindowMessage@@ -173,6 +174,8 @@ , sIZE_MAXIMIZED = SIZE_MAXIMIZED , sIZE_MAXSHOW = SIZE_MAXSHOW , sIZE_MAXHIDE = SIZE_MAXHIDE+ , iCON_SMALL = ICON_SMALL+ , iCON_BIG = ICON_BIG } ----------------------------------------------------------------
Graphics/Win32/Misc.hsc view
@@ -268,7 +268,7 @@ type TIMERPROC = FunPtr (HWND -> UINT -> TimerId -> DWORD -> IO ()) --- ToDo: support the other two forms of timer initialisation+-- TODO: support the other two forms of timer initialisation -- Cause WM_TIMER events to be sent to window callback
Graphics/Win32/Window.hsc view
@@ -755,7 +755,7 @@ -- UpdateWindow (I think) -- RedrawWindow (I think) ----- The following dont have to be reentrant (according to documentation)+-- The following don't have to be reentrant (according to documentation) -- -- GetMessage -- PeekMessage
− Setup.hs
@@ -1,6 +0,0 @@-module Main (main) where--import Distribution.Simple--main :: IO ()-main = defaultMainWithHooks autoconfUserHooks
System/Win32/Console.hsc view
@@ -47,24 +47,30 @@ commandLineToArgv, -- * Screen buffer CONSOLE_SCREEN_BUFFER_INFO(..), + CONSOLE_SCREEN_BUFFER_INFOEX(..), COORD(..), SMALL_RECT(..), + COLORREF, getConsoleScreenBufferInfo, - getCurrentConsoleScreenBufferInfo + getCurrentConsoleScreenBufferInfo, + getConsoleScreenBufferInfoEx, + getCurrentConsoleScreenBufferInfoEx ) where #include <windows.h> #include "alignment.h" ##include "windows_cconv.h" +#include "wincon_compat.h" import System.Win32.Types import Graphics.Win32.Misc +import Graphics.Win32.GDI.Types (COLORREF) import Foreign.C.Types (CInt(..)) import Foreign.C.String (withCWString, CWString) -import Foreign.Ptr (Ptr) +import Foreign.Ptr (Ptr, plusPtr) import Foreign.Storable (Storable(..)) -import Foreign.Marshal.Array (peekArray) +import Foreign.Marshal.Array (peekArray, pokeArray) import Foreign.Marshal.Alloc (alloca) foreign import WINDOWS_CCONV unsafe "windows.h GetConsoleMode" @@ -131,7 +137,7 @@ foreign import WINDOWS_CCONV unsafe "Shellapi.h CommandLineToArgvW" c_CommandLineToArgvW :: CWString -> Ptr CInt -> IO (Ptr CWString) --- | This function can be used to parse commandline arguments and return +-- | This function can be used to parse command line arguments and return -- the split up arguments as elements in a list. commandLineToArgv :: String -> IO [String] commandLineToArgv [] = return [] @@ -169,6 +175,50 @@ (#poke CONSOLE_SCREEN_BUFFER_INFO, srWindow) buf (srWindow info) (#poke CONSOLE_SCREEN_BUFFER_INFO, dwMaximumWindowSize) buf (dwMaximumWindowSize info) +data CONSOLE_SCREEN_BUFFER_INFOEX = CONSOLE_SCREEN_BUFFER_INFOEX + { dwSizeEx :: COORD + , dwCursorPositionEx :: COORD + , wAttributesEx :: WORD + , srWindowEx :: SMALL_RECT + , dwMaximumWindowSizeEx :: COORD + , wPopupAttributes :: WORD + , bFullscreenSupported :: BOOL + , colorTable :: [COLORREF] + -- ^ Only the first 16 'COLORREF' values passed to the Windows Console + -- API. If fewer than 16 values, the remainder are padded with @0@ when + -- passed to the API. + } deriving (Show, Eq) + +instance Storable CONSOLE_SCREEN_BUFFER_INFOEX where + sizeOf = const #{size CONSOLE_SCREEN_BUFFER_INFOEX} + alignment = const #{alignment CONSOLE_SCREEN_BUFFER_INFOEX} + peek buf = do + dwSize' <- (#peek CONSOLE_SCREEN_BUFFER_INFOEX, dwSize) buf + dwCursorPosition' <- (#peek CONSOLE_SCREEN_BUFFER_INFOEX, dwCursorPosition) buf + wAttributes' <- (#peek CONSOLE_SCREEN_BUFFER_INFOEX, wAttributes) buf + srWindow' <- (#peek CONSOLE_SCREEN_BUFFER_INFOEX, srWindow) buf + dwMaximumWindowSize' <- (#peek CONSOLE_SCREEN_BUFFER_INFOEX, dwMaximumWindowSize) buf + wPopupAttributes' <- (#peek CONSOLE_SCREEN_BUFFER_INFOEX, wPopupAttributes) buf + bFullscreenSupported' <- (#peek CONSOLE_SCREEN_BUFFER_INFOEX, bFullscreenSupported) buf + colorTable' <- peekArray 16 ((#ptr CONSOLE_SCREEN_BUFFER_INFOEX, ColorTable) buf) + return $ CONSOLE_SCREEN_BUFFER_INFOEX dwSize' dwCursorPosition' + wAttributes' srWindow' dwMaximumWindowSize' wPopupAttributes' + bFullscreenSupported' colorTable' + poke buf info = do + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, cbSize) buf cbSize + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, dwSize) buf (dwSizeEx info) + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, dwCursorPosition) buf (dwCursorPositionEx info) + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, wAttributes) buf (wAttributesEx info) + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, srWindow) buf (srWindowEx info) + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, dwMaximumWindowSize) buf (dwMaximumWindowSizeEx info) + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, wPopupAttributes) buf (wPopupAttributes info) + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, bFullscreenSupported) buf (bFullscreenSupported info) + pokeArray ((#ptr CONSOLE_SCREEN_BUFFER_INFOEX, ColorTable) buf) colorTable' + where + cbSize :: ULONG + cbSize = #{size CONSOLE_SCREEN_BUFFER_INFOEX} + colorTable' = take 16 $ colorTable info ++ repeat 0 + data COORD = COORD { xPos :: SHORT , yPos :: SHORT @@ -210,6 +260,9 @@ foreign import WINDOWS_CCONV safe "windows.h GetConsoleScreenBufferInfo" c_GetConsoleScreenBufferInfo :: HANDLE -> Ptr CONSOLE_SCREEN_BUFFER_INFO -> IO BOOL +foreign import WINDOWS_CCONV safe "windows.h GetConsoleScreenBufferInfoEx" + c_GetConsoleScreenBufferInfoEx :: HANDLE -> Ptr CONSOLE_SCREEN_BUFFER_INFOEX -> IO BOOL + getConsoleScreenBufferInfo :: HANDLE -> IO CONSOLE_SCREEN_BUFFER_INFO getConsoleScreenBufferInfo h = alloca $ \ptr -> do failIfFalse_ "GetConsoleScreenBufferInfo" $ c_GetConsoleScreenBufferInfo h ptr @@ -219,3 +272,19 @@ getCurrentConsoleScreenBufferInfo = do h <- failIf (== nullHANDLE) "getStdHandle" $ getStdHandle sTD_OUTPUT_HANDLE getConsoleScreenBufferInfo h + +getConsoleScreenBufferInfoEx :: HANDLE -> IO CONSOLE_SCREEN_BUFFER_INFOEX +getConsoleScreenBufferInfoEx h = alloca $ \ptr -> do + -- The cbSize member must be set or GetConsoleScreenBufferInfoEx fails with + -- ERROR_INVALID_PARAMETER (87). + (#poke CONSOLE_SCREEN_BUFFER_INFOEX, cbSize) ptr cbSize + failIfFalse_ "GetConsoleScreenBufferInfoEx" $ c_GetConsoleScreenBufferInfoEx h ptr + peek ptr + where + cbSize :: ULONG + cbSize = #{size CONSOLE_SCREEN_BUFFER_INFOEX} + +getCurrentConsoleScreenBufferInfoEx :: IO CONSOLE_SCREEN_BUFFER_INFOEX +getCurrentConsoleScreenBufferInfoEx = do + h <- failIf (== nullHANDLE) "getStdHandle" $ getStdHandle sTD_OUTPUT_HANDLE + getConsoleScreenBufferInfoEx h
System/Win32/Encoding.hs view
@@ -8,7 +8,7 @@ Stability : Provisional Portability : Non-portable (Win32 API) - Enocode/Decode mutibyte charactor using Win32 API. + Enocode/Decode mutibyte character using Win32 API. -} module System.Win32.Encoding @@ -40,7 +40,7 @@ then return conCP else getACP --- | The "System.IO" output functions (e.g. `putStr`) don't +-- | The "System.IO" output functions (e.g., `putStr`) don't -- automatically convert to multibyte string on Windows, so this -- function is provided to make the conversion from a Unicode string -- in the given code page to a proper multibyte string. To get the
System/Win32/File.hsc view
@@ -882,7 +882,7 @@ ---------------------------------------------------------------- -- These functions are very unusual in the Win32 API:--- They dont return error codes+-- They don't return error codes foreign import WINDOWS_CCONV unsafe "windows.h AreFileApisANSI" areFileApisANSI :: IO Bool
System/Win32/HardLink.hs view
@@ -12,7 +12,7 @@ Note: You should worry about file system type when use this module's function in your application: - * NTFS only supprts this functionality. + * NTFS only supports this functionality. * ReFS doesn't support hard link currently. -}
System/Win32/Info/Computer.hsc view
@@ -126,7 +126,7 @@ -- Hardware Profiles ---------------------------------------------------------------- {- --- TODO: Deside HW_PROFILE_INFO type design +-- TODO: Decide HW_PROFILE_INFO type design type LPHW_PROFILE_INFO = Ptr HW_PROFILE_INFO @@ -195,7 +195,7 @@ with (fromIntegral maxLength) $ \len -> do failIfFalse_ "GetComputerName" $ c_GetUserName buf len - -- GetUserNameW includes NUL charactor. + -- GetUserNameW includes NUL character. peekTString buf where -- This requires Lmcons.h
System/Win32/NLS.hsc view
@@ -74,7 +74,7 @@ foreign import WINDOWS_CCONV unsafe "windows.h ConvertDefaultLocale" convertDefaultLocale :: LCID -> IO LCID --- ToDo: various enum functions.+-- TODO: various enum functions. #if !MIN_VERSION_base(4,15,0) type CodePage = UINT@@ -101,7 +101,7 @@ -- LOCALE_INEGATIVEPERCENT -- Introduced in Windows 7 but not supported. -- LOCALE_IPOSITIVEPERCENT -- Introduced in Windows 7 but not supported. -- LOCALE_IREADINGLAYOUT -- Introduced in Windows 7 but not supported.--- LOCALE_SAM -- Introduced by Windows 10 but not supported. Synonyn for+-- LOCALE_SAM -- Introduced by Windows 10 but not supported. Synonym for -- LOCALE_S1159. -- LOCALE_SENGLISHDISPLAYNAME -- Introduced in Windows 7 but not supported. -- LOCALE_SIETFLANGUAGE -- Not supported (deprecated from Windows Vista).@@ -801,7 +801,7 @@ -- ---------------------------------------------------------------------------- --- | The `System.IO` input functions (e.g. `getLine`) don't+-- | The `System.IO` input functions (e.g., `getLine`) don't -- automatically convert to Unicode, so this function is provided to -- make the conversion from a multibyte string in the given code page -- to a proper Unicode string. To get the code page for the console,
System/Win32/Process.hsc view
@@ -210,7 +210,7 @@ ok' <- c_Process32Next h pe readAndNext ok' pe (entry:res) --- | Enumerate moduless using Module32First and Module32Next+-- | Enumerate modules using Module32First and Module32Next th32SnapEnumModules :: Th32SnapHandle -> IO [ModuleEntry32] th32SnapEnumModules h = allocaBytes (#size MODULEENTRY32W) $ \pe -> do (#poke MODULEENTRY32W, dwSize) pe ((#size MODULEENTRY32W)::DWORD)
System/Win32/Security.hsc view
@@ -1,5 +1,5 @@ {-# OPTIONS_GHC -w #-}--- The above warning supression flag is a temporary kludge.+-- The above warning suppression flag is a temporary kludge. -- While working on this module you are encouraged to remove it and fix -- any warnings in the module. See -- https://ghc.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
System/Win32/SimpleMAPI.hsc view
@@ -107,9 +107,9 @@ , ((#const MAPI_E_TEXT_TOO_LARGE) , "Text too large") , ((#const MAPI_E_INVALID_SESSION) , "Invalid session") , ((#const MAPI_E_TYPE_NOT_SUPPORTED) , "Type not supported")- , ((#const MAPI_E_AMBIGUOUS_RECIPIENT) , "Ambigious recipient")+ , ((#const MAPI_E_AMBIGUOUS_RECIPIENT) , "Ambiguous recipient") #ifdef MAPI_E_AMBIGUOUS_RECIP- , ((#const MAPI_E_AMBIGUOUS_RECIP) , "Ambigious recipient")+ , ((#const MAPI_E_AMBIGUOUS_RECIP) , "Ambiguous recipient") #endif , ((#const MAPI_E_MESSAGE_IN_USE) , "Message in use") , ((#const MAPI_E_NETWORK_FAILURE) , "Network failure")
System/Win32/SymbolicLink.hsc view
@@ -16,7 +16,7 @@ * require to use 'Run As Administrator' to run your application. - * or modify your application's manifect file to add + * or modify your application's manifest file to add \<requestedExecutionLevel level='requireAdministrator' uiAccess='false'/\>. Starting from Windows 10 version 1703 (Creators Update), after enabling
System/Win32/Types.hsc view
@@ -57,13 +57,20 @@ #endif ##if defined(__IO_MANAGER_WINIO__)-import GHC.IO.Exception (ioException, IOException(..), IOErrorType(InappropriateType))+import Control.Monad (when, liftM2)+import Foreign.C.Types (CUIntPtr(..))+import Foreign.Marshal.Utils (fromBool, with)+import Foreign (peek)+import Foreign.Ptr (ptrToWordPtr)+import GHC.IO.Exception (ioException, IOException(..),+ IOErrorType(InappropriateType, ResourceBusy)) import GHC.IO.SubSystem ((<!>)) import GHC.IO.Handle.Windows+import GHC.IO.IOMode import GHC.IO.Windows.Handle (fromHANDLE, Io(), NativeHandle(), ConsoleHandle(), toHANDLE, handleToMode, optimizeFileAccess) import qualified GHC.Event.Windows as Mgr-import GHC.IO.Device (IODeviceType(..))+import GHC.IO.Device (IODeviceType(..), devType) ##endif #include <fcntl.h>@@ -232,6 +239,9 @@ iNVALID_HANDLE_VALUE :: HANDLE iNVALID_HANDLE_VALUE = castUINTPtrToPtr maxBound +iNVALID_SET_FILE_POINTER :: DWORD+iNVALID_SET_FILE_POINTER = #const INVALID_SET_FILE_POINTER+ foreign import ccall "_open_osfhandle" _open_osfhandle :: CIntPtr -> CInt -> IO CInt @@ -261,14 +271,52 @@ -- Attach the handle to the I/O manager's CompletionPort. This allows the -- I/O manager to service requests for this Handle. Mgr.associateHandle' handle- optimizeFileAccess handle let hwnd = fromHANDLE handle :: Io NativeHandle- -- Not sure if I need to use devType here..+ _type <- devType hwnd++ -- Use the rts to enforce any file locking we may need. mode <- handleToMode handle+ let write_lock = mode /= ReadMode++ case _type of+ -- Regular files need to be locked.+ -- See also Note [RTS File locking]+ RegularFile -> do+ optimizeFileAccess handle -- Set a few optimization flags on file handles.+ (unique_dev, unique_ino) <- getUniqueFileInfo handle+ r <- internal_lockFile+ (fromIntegral $ ptrToWordPtr handle) unique_dev unique_ino+ (fromBool write_lock)+ when (r == -1) $+ ioException (IOError Nothing ResourceBusy "hANDLEToHandle"+ "file is locked" Nothing Nothing)++ -- I don't see a reason for blocking directories. So unlike the FD+ -- implementation I'll allow it.+ _ -> return () mkHandleFromHANDLE hwnd Stream ("hwnd:" ++ show handle) mode Nothing++ -- | getUniqueFileInfo assumes the C call to getUniqueFileInfo+ -- succeeds.+ getUniqueFileInfo :: HANDLE -> IO (Word64, Word64)+ getUniqueFileInfo hnl = do+ with 0 $ \devptr -> do+ with 0 $ \inoptr -> do+ internal_getUniqueFileInfo hnl devptr inoptr+ liftM2 (,) (peek devptr) (peek inoptr) ##endif posix = _open_osfhandle (fromIntegral (ptrToIntPtr handle)) (#const _O_BINARY) >>= fdToHandle++##if defined(__IO_MANAGER_WINIO__)+foreign import ccall unsafe "lockFile"+ internal_lockFile :: CUIntPtr -> Word64 -> Word64 -> CInt -> IO CInt++-- | Returns -1 on error. Otherwise writes two values representing+-- the file into the given ptrs.+foreign import ccall unsafe "get_unique_file_info_hwnd"+ internal_getUniqueFileInfo :: HANDLE -> Ptr Word64 -> Ptr Word64 -> IO ()+##endif foreign import ccall unsafe "_get_osfhandle" c_get_osfhandle :: CInt -> IO HANDLE
Win32.cabal view
@@ -1,5 +1,5 @@ name: Win32-version: 2.13.2.0+version: 2.13.2.1 license: BSD3 license-file: LICENSE author: Alastair Reid, shelarcy, Tamar Christina@@ -108,7 +108,7 @@ ghc-options: -Wall include-dirs: include includes: "alphablend.h", "diatemp.h", "dumpBMP.h", "ellipse.h", "errors.h", "HsGDI.h", "HsWin32.h", "Win32Aux.h", "win32debug.h", "windows_cconv.h", "WndProc.h", "alignment.h"- install-includes: "HsWin32.h", "HsGDI.h", "WndProc.h", "windows_cconv.h", "alphablend.h", "winternl_compat.h", "winuser_compat.h", "winreg_compat.h", "tlhelp32_compat.h", "winnls_compat.h", "winnt_compat.h"+ install-includes: "HsWin32.h", "HsGDI.h", "WndProc.h", "windows_cconv.h", "alphablend.h", "wincon_compat.h", "winternl_compat.h", "winuser_compat.h", "winreg_compat.h", "tlhelp32_compat.h", "winnls_compat.h", "winnt_compat.h" c-sources: cbits/HsGDI.c cbits/HsWin32.c
cbits/dumpBMP.c view
@@ -64,7 +64,7 @@ // if BitCount != 0, color table will be retrieved // bmi.bmiHeader.biSize = 0x28; // GDI need this to work- bmi.bmiHeader.biBitCount = 0; // dont get the color table+ bmi.bmiHeader.biBitCount = 0; // don't get the color table if ((GetDIBits(hDC, hBmp, 0, 0, (LPSTR)NULL, &bmi, DIB_RGB_COLORS)) == 0) { fprintf(stderr, "GetDIBits failed!"); return;@@ -81,7 +81,7 @@ } //- // Note: 24 bits per pixel has no color table. So, we dont have to+ // Note: 24 bits per pixel has no color table. So, we don't have to // allocate memory for retrieving that. Otherwise, we do. // pbmi = &bmi; // assume no color table@@ -113,7 +113,7 @@ goto ErrExit1; } //- // Now that weve a bigger chunk of memory, lets copy the Bitmap+ // Now that we've a bigger chunk of memory, lets copy the Bitmap // info header data over // pjTmp = (PBYTE)pbmi;
changelog.md view
@@ -1,6 +1,14 @@ # Changelog for [`Win32` package](http://hackage.haskell.org/package/Win32) -## New - Unreleased+## 2.13.2.1 July 2022++* Add function `createIcon` (see #194)+* Add `WindowMessage` value `wM_SETICON` (see #194)+* Add `WPARAM` values `iCON_SMALL`, `iCON_BIG` (see #194)+* Add functions `getConsoleScreenBufferInfoEx` and+ `getCurrentConsoleScreenBufferInfoEx`++## 2.13.2.0 November 2021 * Set maximum string size for getComputerName. (See #190) * Update withHandleToHANDLENative to handle duplex and console handles (See #191)
+ include/wincon_compat.h view
@@ -0,0 +1,26 @@+/* The version of wincon.h provided by the version of MSYS2 included with x86+ * versions of GHC before GHC 7.10 excludes certain components introduced with+ * Windows Vista.+ */++#ifndef WINCON_COMPAT_H+#define WINCON_COMPAT_H++#if defined(x86_64_HOST_ARCH) || __GLASGOW_HASKELL__ > 708+#+#else++typedef struct _CONSOLE_SCREEN_BUFFER_INFOEX {+ ULONG cbSize;+ COORD dwSize;+ COORD dwCursorPosition;+ WORD wAttributes;+ SMALL_RECT srWindow;+ COORD dwMaximumWindowSize;+ WORD wPopupAttributes;+ WINBOOL bFullscreenSupported;+ COLORREF ColorTable[16];+} CONSOLE_SCREEN_BUFFER_INFOEX, *PCONSOLE_SCREEN_BUFFER_INFOEX;++#endif /* GHC version check */+#endif /* WINCON_COMPAT_H */