Win32 2.9.0.0 → 2.10.0.0
raw patch · 8 files changed
+913/−60 lines, 8 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- System.Win32.Console: [bottom] :: SMALL_RECT -> SHORT
- System.Win32.Console: [left] :: SMALL_RECT -> SHORT
- System.Win32.Console: [right] :: SMALL_RECT -> SHORT
- System.Win32.Console: [top] :: SMALL_RECT -> SHORT
- System.Win32.Console: [x] :: COORD -> SHORT
- System.Win32.Console: [y] :: COORD -> SHORT
+ Graphics.Win32.Window: isWindowVisible :: HWND -> IO Bool
+ System.Win32: GUID :: !Word32 -> !Word16 -> !Word16 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> GUID
+ System.Win32: LCNumericData :: !DWORD -> LCData
+ System.Win32: LCSignatureData :: !LOCALESIGNATURE -> LCData
+ System.Win32: LCTextualData :: !String -> LCData
+ System.Win32: LOCALESIGNATURE :: !UnicodeSubsetBitfield -> !DDWORD -> !DDWORD -> LOCALESIGNATURE
+ System.Win32: NLSVERSIONINFOEX :: DWORD -> DWORD -> DWORD -> DWORD -> GUID -> NLSVERSIONINFOEX
+ System.Win32: UnicodeSubsetBitfield :: !DDWORD -> !DDWORD -> UnicodeSubsetBitfield
+ System.Win32: [dwDefinedVersion] :: NLSVERSIONINFOEX -> DWORD
+ System.Win32: [dwEffectiveId] :: NLSVERSIONINFOEX -> DWORD
+ System.Win32: [dwNLSVersionInfoSize] :: NLSVERSIONINFOEX -> DWORD
+ System.Win32: [dwNLSVersion] :: NLSVERSIONINFOEX -> DWORD
+ System.Win32: [guidCustomVersion] :: NLSVERSIONINFOEX -> GUID
+ System.Win32: [lsCsbDefault] :: LOCALESIGNATURE -> !DDWORD
+ System.Win32: [lsCsbSupported] :: LOCALESIGNATURE -> !DDWORD
+ System.Win32: [lsUsb] :: LOCALESIGNATURE -> !UnicodeSubsetBitfield
+ System.Win32: [usbHigh] :: UnicodeSubsetBitfield -> !DDWORD
+ System.Win32: [usbLow] :: UnicodeSubsetBitfield -> !DDWORD
+ System.Win32: c_EnumSystemLocalesEx :: FunPtr LOCALE_ENUMPROCEX -> DWORD -> LPARAM -> LPVOID -> IO Bool
+ System.Win32: c_GetLocaleInfoEx :: LPCWSTR -> LCTYPE -> LPWSTR -> CInt -> IO CInt
+ System.Win32: c_GetNLSVersionEx :: NLS_FUNCTION -> LPCWSTR -> Ptr NLSVERSIONINFOEX -> IO Bool
+ System.Win32: c_GetSystemDefaultLocaleName :: LPWSTR -> CInt -> IO CInt
+ System.Win32: c_GetUserDefaultLocaleName :: LPWSTR -> CInt -> IO CInt
+ System.Win32: c_IsValidLocaleName :: LPCWSTR -> IO Bool
+ System.Win32: c_LCMapStringEx :: LPCWSTR -> LCMapFlags -> LPCWSTR -> CInt -> LPWSTR -> CInt -> Ptr NLSVERSIONINFOEX -> LPVOID -> LPARAM -> IO CInt
+ System.Win32: data GUID
+ System.Win32: data LCData
+ System.Win32: data LOCALESIGNATURE
+ System.Win32: data NLSVERSIONINFOEX
+ System.Win32: data UnicodeSubsetBitfield
+ System.Win32: enumSystemLocalesEx :: LOCALE_ENUMPROCEX -> EnumLocalesFlag -> LPARAM -> IO ()
+ System.Win32: enumSystemLocalesEx' :: EnumLocalesFlag -> Maybe Bool -> IO [String]
+ System.Win32: fromDateFormatPicture :: String -> Maybe String
+ System.Win32: fromTimeFormatPicture :: String -> Maybe String
+ System.Win32: getDefaultLocaleName :: String -> (LPWSTR -> CInt -> IO CInt) -> IO String
+ System.Win32: getLocaleInfoEx :: Maybe String -> LCTYPE -> IO LCData
+ System.Win32: getNLSVersionEx :: Maybe String -> IO NLSVERSIONINFOEX
+ System.Win32: getSystemDefaultLocaleName :: IO String
+ System.Win32: getUserDefaultLocaleName :: IO String
+ System.Win32: isValidLocaleName :: Maybe String -> IO Bool
+ System.Win32: lCMapStringEx :: Maybe String -> LCMapFlags -> String -> NLSVERSIONINFOEX -> IO String
+ System.Win32: lINGUISTIC_IGNORECASE :: LCMapFlags
+ System.Win32: lINGUISTIC_IGNOREDIACRITIC :: LCMapFlags
+ System.Win32: lOCALE_ALL :: EnumLocalesFlag
+ System.Win32: lOCALE_ALTERNATE_SORTS :: EnumLocalesFlag
+ System.Win32: lOCALE_FONTSIGNATURE :: LCTYPE
+ System.Win32: lOCALE_ICENTURY :: LCTYPE
+ System.Win32: lOCALE_ICOUNTRY :: LCTYPE
+ System.Win32: lOCALE_IDATE :: LCTYPE
+ System.Win32: lOCALE_IDAYLZERO :: LCTYPE
+ System.Win32: lOCALE_IDEFAULTANSICODEPAGE :: LCTYPE
+ System.Win32: lOCALE_IDEFAULTCODEPAGE :: LCTYPE
+ System.Win32: lOCALE_IDEFAULTCOUNTRY :: LCTYPE
+ System.Win32: lOCALE_IDEFAULTEBCDICCODEPAGE :: LCTYPE
+ System.Win32: lOCALE_IDEFAULTLANGUAGE :: LCTYPE
+ System.Win32: lOCALE_IDEFAULTMACCODEPAGE :: LCTYPE
+ System.Win32: lOCALE_IDIGITSUBSTITUTION :: LCTYPE
+ System.Win32: lOCALE_IGEOID :: LCTYPE
+ System.Win32: lOCALE_IINTLCURRDIGITS :: LCTYPE
+ System.Win32: lOCALE_ILANGUAGE :: LCTYPE
+ System.Win32: lOCALE_ILDATE :: LCTYPE
+ System.Win32: lOCALE_IMONLZERO :: LCTYPE
+ System.Win32: lOCALE_INEGSEPBYSPACE :: LCTYPE
+ System.Win32: lOCALE_INEGSIGNPOSN :: LCTYPE
+ System.Win32: lOCALE_INEGSYMPRECEDES :: LCTYPE
+ System.Win32: lOCALE_IOPTIONALCALENDAR :: LCTYPE
+ System.Win32: lOCALE_IPOSSEPBYSPACE :: LCTYPE
+ System.Win32: lOCALE_IPOSSIGNPOSN :: LCTYPE
+ System.Win32: lOCALE_IPSSYMPRECEDES :: LCTYPE
+ System.Win32: lOCALE_ITIMEMARKPOSN :: LCTYPE
+ System.Win32: lOCALE_ITLZERO :: LCTYPE
+ System.Win32: lOCALE_NAME_INVARIANT :: Maybe String
+ System.Win32: lOCALE_NAME_MAX_LENGTH :: CInt
+ System.Win32: lOCALE_NAME_SYSTEM_DEFAULT :: Maybe String
+ System.Win32: lOCALE_NAME_USER_DEFAULT :: Maybe String
+ System.Win32: lOCALE_PAPERSIZE :: LCTYPE
+ System.Win32: lOCALE_REPLACEMENT :: EnumLocalesFlag
+ System.Win32: lOCALE_RETURN_NUMBER :: LCTYPE
+ System.Win32: lOCALE_SABBREVCTRYNAME :: LCTYPE
+ System.Win32: lOCALE_SABBREVDAYNAME1 :: LCTYPE
+ System.Win32: lOCALE_SABBREVDAYNAME2 :: LCTYPE
+ System.Win32: lOCALE_SABBREVDAYNAME3 :: LCTYPE
+ System.Win32: lOCALE_SABBREVDAYNAME4 :: LCTYPE
+ System.Win32: lOCALE_SABBREVDAYNAME5 :: LCTYPE
+ System.Win32: lOCALE_SABBREVDAYNAME6 :: LCTYPE
+ System.Win32: lOCALE_SABBREVDAYNAME7 :: LCTYPE
+ System.Win32: lOCALE_SABBREVLANGNAME :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME1 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME10 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME11 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME12 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME13 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME2 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME3 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME4 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME5 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME6 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME7 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME8 :: LCTYPE
+ System.Win32: lOCALE_SABBREVMONTHNAME9 :: LCTYPE
+ System.Win32: lOCALE_SCONSOLEFALLBACKNAME :: LCTYPE
+ System.Win32: lOCALE_SDAYNAME1 :: LCTYPE
+ System.Win32: lOCALE_SDAYNAME2 :: LCTYPE
+ System.Win32: lOCALE_SDAYNAME3 :: LCTYPE
+ System.Win32: lOCALE_SDAYNAME4 :: LCTYPE
+ System.Win32: lOCALE_SDAYNAME5 :: LCTYPE
+ System.Win32: lOCALE_SDAYNAME6 :: LCTYPE
+ System.Win32: lOCALE_SDAYNAME7 :: LCTYPE
+ System.Win32: lOCALE_SDURATION :: LCTYPE
+ System.Win32: lOCALE_SENGCURRNAME :: LCTYPE
+ System.Win32: lOCALE_SENGLISHCOUNTRYNAME :: LCTYPE
+ System.Win32: lOCALE_SENGLISHLANGUAGENAME :: LCTYPE
+ System.Win32: lOCALE_SINTLSYMBOL :: LCTYPE
+ System.Win32: lOCALE_SISO3166CTRYNAME :: LCTYPE
+ System.Win32: lOCALE_SISO3166CTRYNAME2 :: LCTYPE
+ System.Win32: lOCALE_SISO639LANGNAME :: LCTYPE
+ System.Win32: lOCALE_SISO639LANGNAME2 :: LCTYPE
+ System.Win32: lOCALE_SKEYBOARDSTOINSTALL :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME1 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME10 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME11 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME12 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME13 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME2 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME3 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME4 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME5 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME6 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME7 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME8 :: LCTYPE
+ System.Win32: lOCALE_SMONTHNAME9 :: LCTYPE
+ System.Win32: lOCALE_SNAME :: LCTYPE
+ System.Win32: lOCALE_SNAN :: LCTYPE
+ System.Win32: lOCALE_SNATIVECOUNTRYNAME :: LCTYPE
+ System.Win32: lOCALE_SNATIVECURRNAME :: LCTYPE
+ System.Win32: lOCALE_SNATIVEDIGITS :: LCTYPE
+ System.Win32: lOCALE_SNEGINFINITY :: LCTYPE
+ System.Win32: lOCALE_SPARENT :: LCTYPE
+ System.Win32: lOCALE_SPOSINFINITY :: LCTYPE
+ System.Win32: lOCALE_SSCRIPTS :: LCTYPE
+ System.Win32: lOCALE_SSHORTESTDAYNAME1 :: LCTYPE
+ System.Win32: lOCALE_SSHORTESTDAYNAME2 :: LCTYPE
+ System.Win32: lOCALE_SSHORTESTDAYNAME3 :: LCTYPE
+ System.Win32: lOCALE_SSHORTESTDAYNAME4 :: LCTYPE
+ System.Win32: lOCALE_SSHORTESTDAYNAME5 :: LCTYPE
+ System.Win32: lOCALE_SSHORTESTDAYNAME6 :: LCTYPE
+ System.Win32: lOCALE_SSHORTESTDAYNAME7 :: LCTYPE
+ System.Win32: lOCALE_SSORTNAME :: LCTYPE
+ System.Win32: lOCALE_SUPPLEMENTAL :: EnumLocalesFlag
+ System.Win32: lOCALE_SYEARMONTH :: LCTYPE
+ System.Win32: lOCALE_WINDOWS :: EnumLocalesFlag
+ System.Win32: mkLOCALE_ENUMPROCEX :: LOCALE_ENUMPROCEX -> IO (FunPtr LOCALE_ENUMPROCEX)
+ System.Win32: nORM_LINGUISTIC_CASING :: LCMapFlags
+ System.Win32: trySized :: String -> (LPTSTR -> CInt -> IO CInt) -> IO String
+ System.Win32: type EnumLocalesFlag = DWORD
+ System.Win32: type LOCALE_ENUMPROCEX = LPWSTR -> EnumLocalesFlag -> LPARAM -> IO BOOL
+ System.Win32: type NLS_FUNCTION = DWORD
+ System.Win32.Console: [bottomPos] :: SMALL_RECT -> SHORT
+ System.Win32.Console: [leftPos] :: SMALL_RECT -> SHORT
+ System.Win32.Console: [rightPos] :: SMALL_RECT -> SHORT
+ System.Win32.Console: [topPos] :: SMALL_RECT -> SHORT
+ System.Win32.Console: [xPos] :: COORD -> SHORT
+ System.Win32.Console: [yPos] :: COORD -> SHORT
+ System.Win32.NLS: GUID :: !Word32 -> !Word16 -> !Word16 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> !Word8 -> GUID
+ System.Win32.NLS: LCNumericData :: !DWORD -> LCData
+ System.Win32.NLS: LCSignatureData :: !LOCALESIGNATURE -> LCData
+ System.Win32.NLS: LCTextualData :: !String -> LCData
+ System.Win32.NLS: LOCALESIGNATURE :: !UnicodeSubsetBitfield -> !DDWORD -> !DDWORD -> LOCALESIGNATURE
+ System.Win32.NLS: NLSVERSIONINFOEX :: DWORD -> DWORD -> DWORD -> DWORD -> GUID -> NLSVERSIONINFOEX
+ System.Win32.NLS: UnicodeSubsetBitfield :: !DDWORD -> !DDWORD -> UnicodeSubsetBitfield
+ System.Win32.NLS: [dwDefinedVersion] :: NLSVERSIONINFOEX -> DWORD
+ System.Win32.NLS: [dwEffectiveId] :: NLSVERSIONINFOEX -> DWORD
+ System.Win32.NLS: [dwNLSVersionInfoSize] :: NLSVERSIONINFOEX -> DWORD
+ System.Win32.NLS: [dwNLSVersion] :: NLSVERSIONINFOEX -> DWORD
+ System.Win32.NLS: [guidCustomVersion] :: NLSVERSIONINFOEX -> GUID
+ System.Win32.NLS: [lsCsbDefault] :: LOCALESIGNATURE -> !DDWORD
+ System.Win32.NLS: [lsCsbSupported] :: LOCALESIGNATURE -> !DDWORD
+ System.Win32.NLS: [lsUsb] :: LOCALESIGNATURE -> !UnicodeSubsetBitfield
+ System.Win32.NLS: [usbHigh] :: UnicodeSubsetBitfield -> !DDWORD
+ System.Win32.NLS: [usbLow] :: UnicodeSubsetBitfield -> !DDWORD
+ System.Win32.NLS: c_EnumSystemLocalesEx :: FunPtr LOCALE_ENUMPROCEX -> DWORD -> LPARAM -> LPVOID -> IO Bool
+ System.Win32.NLS: c_GetLocaleInfoEx :: LPCWSTR -> LCTYPE -> LPWSTR -> CInt -> IO CInt
+ System.Win32.NLS: c_GetNLSVersionEx :: NLS_FUNCTION -> LPCWSTR -> Ptr NLSVERSIONINFOEX -> IO Bool
+ System.Win32.NLS: c_GetSystemDefaultLocaleName :: LPWSTR -> CInt -> IO CInt
+ System.Win32.NLS: c_GetUserDefaultLocaleName :: LPWSTR -> CInt -> IO CInt
+ System.Win32.NLS: c_IsValidLocaleName :: LPCWSTR -> IO Bool
+ System.Win32.NLS: c_LCMapStringEx :: LPCWSTR -> LCMapFlags -> LPCWSTR -> CInt -> LPWSTR -> CInt -> Ptr NLSVERSIONINFOEX -> LPVOID -> LPARAM -> IO CInt
+ System.Win32.NLS: data GUID
+ System.Win32.NLS: data LCData
+ System.Win32.NLS: data LOCALESIGNATURE
+ System.Win32.NLS: data NLSVERSIONINFOEX
+ System.Win32.NLS: data UnicodeSubsetBitfield
+ System.Win32.NLS: enumSystemLocalesEx :: LOCALE_ENUMPROCEX -> EnumLocalesFlag -> LPARAM -> IO ()
+ System.Win32.NLS: enumSystemLocalesEx' :: EnumLocalesFlag -> Maybe Bool -> IO [String]
+ System.Win32.NLS: getDefaultLocaleName :: String -> (LPWSTR -> CInt -> IO CInt) -> IO String
+ System.Win32.NLS: getLocaleInfoEx :: Maybe String -> LCTYPE -> IO LCData
+ System.Win32.NLS: getNLSVersionEx :: Maybe String -> IO NLSVERSIONINFOEX
+ System.Win32.NLS: getSystemDefaultLocaleName :: IO String
+ System.Win32.NLS: getUserDefaultLocaleName :: IO String
+ System.Win32.NLS: instance Foreign.Storable.Storable System.Win32.NLS.GUID
+ System.Win32.NLS: instance Foreign.Storable.Storable System.Win32.NLS.LOCALESIGNATURE
+ System.Win32.NLS: instance Foreign.Storable.Storable System.Win32.NLS.NLSVERSIONINFOEX
+ System.Win32.NLS: instance Foreign.Storable.Storable System.Win32.NLS.UnicodeSubsetBitfield
+ System.Win32.NLS: instance GHC.Classes.Eq System.Win32.NLS.GUID
+ System.Win32.NLS: instance GHC.Classes.Eq System.Win32.NLS.LCData
+ System.Win32.NLS: instance GHC.Classes.Eq System.Win32.NLS.LOCALESIGNATURE
+ System.Win32.NLS: instance GHC.Classes.Eq System.Win32.NLS.NLSVERSIONINFOEX
+ System.Win32.NLS: instance GHC.Classes.Eq System.Win32.NLS.UnicodeSubsetBitfield
+ System.Win32.NLS: instance GHC.Show.Show System.Win32.NLS.GUID
+ System.Win32.NLS: instance GHC.Show.Show System.Win32.NLS.LCData
+ System.Win32.NLS: instance GHC.Show.Show System.Win32.NLS.LOCALESIGNATURE
+ System.Win32.NLS: instance GHC.Show.Show System.Win32.NLS.NLSVERSIONINFOEX
+ System.Win32.NLS: instance GHC.Show.Show System.Win32.NLS.UnicodeSubsetBitfield
+ System.Win32.NLS: isValidLocaleName :: Maybe String -> IO Bool
+ System.Win32.NLS: lCMapStringEx :: Maybe String -> LCMapFlags -> String -> NLSVERSIONINFOEX -> IO String
+ System.Win32.NLS: lINGUISTIC_IGNORECASE :: LCMapFlags
+ System.Win32.NLS: lINGUISTIC_IGNOREDIACRITIC :: LCMapFlags
+ System.Win32.NLS: lOCALE_ALL :: EnumLocalesFlag
+ System.Win32.NLS: lOCALE_ALTERNATE_SORTS :: EnumLocalesFlag
+ System.Win32.NLS: lOCALE_FONTSIGNATURE :: LCTYPE
+ System.Win32.NLS: lOCALE_ICENTURY :: LCTYPE
+ System.Win32.NLS: lOCALE_ICOUNTRY :: LCTYPE
+ System.Win32.NLS: lOCALE_IDATE :: LCTYPE
+ System.Win32.NLS: lOCALE_IDAYLZERO :: LCTYPE
+ System.Win32.NLS: lOCALE_IDEFAULTANSICODEPAGE :: LCTYPE
+ System.Win32.NLS: lOCALE_IDEFAULTCODEPAGE :: LCTYPE
+ System.Win32.NLS: lOCALE_IDEFAULTCOUNTRY :: LCTYPE
+ System.Win32.NLS: lOCALE_IDEFAULTEBCDICCODEPAGE :: LCTYPE
+ System.Win32.NLS: lOCALE_IDEFAULTLANGUAGE :: LCTYPE
+ System.Win32.NLS: lOCALE_IDEFAULTMACCODEPAGE :: LCTYPE
+ System.Win32.NLS: lOCALE_IDIGITSUBSTITUTION :: LCTYPE
+ System.Win32.NLS: lOCALE_IGEOID :: LCTYPE
+ System.Win32.NLS: lOCALE_IINTLCURRDIGITS :: LCTYPE
+ System.Win32.NLS: lOCALE_ILANGUAGE :: LCTYPE
+ System.Win32.NLS: lOCALE_ILDATE :: LCTYPE
+ System.Win32.NLS: lOCALE_IMONLZERO :: LCTYPE
+ System.Win32.NLS: lOCALE_INEGSEPBYSPACE :: LCTYPE
+ System.Win32.NLS: lOCALE_INEGSIGNPOSN :: LCTYPE
+ System.Win32.NLS: lOCALE_INEGSYMPRECEDES :: LCTYPE
+ System.Win32.NLS: lOCALE_IOPTIONALCALENDAR :: LCTYPE
+ System.Win32.NLS: lOCALE_IPOSSEPBYSPACE :: LCTYPE
+ System.Win32.NLS: lOCALE_IPOSSIGNPOSN :: LCTYPE
+ System.Win32.NLS: lOCALE_IPSSYMPRECEDES :: LCTYPE
+ System.Win32.NLS: lOCALE_ITIMEMARKPOSN :: LCTYPE
+ System.Win32.NLS: lOCALE_ITLZERO :: LCTYPE
+ System.Win32.NLS: lOCALE_NAME_INVARIANT :: Maybe String
+ System.Win32.NLS: lOCALE_NAME_MAX_LENGTH :: CInt
+ System.Win32.NLS: lOCALE_NAME_SYSTEM_DEFAULT :: Maybe String
+ System.Win32.NLS: lOCALE_NAME_USER_DEFAULT :: Maybe String
+ System.Win32.NLS: lOCALE_PAPERSIZE :: LCTYPE
+ System.Win32.NLS: lOCALE_REPLACEMENT :: EnumLocalesFlag
+ System.Win32.NLS: lOCALE_RETURN_NUMBER :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVCTRYNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVDAYNAME1 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVDAYNAME2 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVDAYNAME3 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVDAYNAME4 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVDAYNAME5 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVDAYNAME6 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVDAYNAME7 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVLANGNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME1 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME10 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME11 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME12 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME13 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME2 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME3 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME4 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME5 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME6 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME7 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME8 :: LCTYPE
+ System.Win32.NLS: lOCALE_SABBREVMONTHNAME9 :: LCTYPE
+ System.Win32.NLS: lOCALE_SCONSOLEFALLBACKNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SDAYNAME1 :: LCTYPE
+ System.Win32.NLS: lOCALE_SDAYNAME2 :: LCTYPE
+ System.Win32.NLS: lOCALE_SDAYNAME3 :: LCTYPE
+ System.Win32.NLS: lOCALE_SDAYNAME4 :: LCTYPE
+ System.Win32.NLS: lOCALE_SDAYNAME5 :: LCTYPE
+ System.Win32.NLS: lOCALE_SDAYNAME6 :: LCTYPE
+ System.Win32.NLS: lOCALE_SDAYNAME7 :: LCTYPE
+ System.Win32.NLS: lOCALE_SDURATION :: LCTYPE
+ System.Win32.NLS: lOCALE_SENGCURRNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SENGLISHCOUNTRYNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SENGLISHLANGUAGENAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SINTLSYMBOL :: LCTYPE
+ System.Win32.NLS: lOCALE_SISO3166CTRYNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SISO3166CTRYNAME2 :: LCTYPE
+ System.Win32.NLS: lOCALE_SISO639LANGNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SISO639LANGNAME2 :: LCTYPE
+ System.Win32.NLS: lOCALE_SKEYBOARDSTOINSTALL :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME1 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME10 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME11 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME12 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME13 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME2 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME3 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME4 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME5 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME6 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME7 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME8 :: LCTYPE
+ System.Win32.NLS: lOCALE_SMONTHNAME9 :: LCTYPE
+ System.Win32.NLS: lOCALE_SNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SNAN :: LCTYPE
+ System.Win32.NLS: lOCALE_SNATIVECOUNTRYNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SNATIVECURRNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SNATIVEDIGITS :: LCTYPE
+ System.Win32.NLS: lOCALE_SNEGINFINITY :: LCTYPE
+ System.Win32.NLS: lOCALE_SPARENT :: LCTYPE
+ System.Win32.NLS: lOCALE_SPOSINFINITY :: LCTYPE
+ System.Win32.NLS: lOCALE_SSCRIPTS :: LCTYPE
+ System.Win32.NLS: lOCALE_SSHORTESTDAYNAME1 :: LCTYPE
+ System.Win32.NLS: lOCALE_SSHORTESTDAYNAME2 :: LCTYPE
+ System.Win32.NLS: lOCALE_SSHORTESTDAYNAME3 :: LCTYPE
+ System.Win32.NLS: lOCALE_SSHORTESTDAYNAME4 :: LCTYPE
+ System.Win32.NLS: lOCALE_SSHORTESTDAYNAME5 :: LCTYPE
+ System.Win32.NLS: lOCALE_SSHORTESTDAYNAME6 :: LCTYPE
+ System.Win32.NLS: lOCALE_SSHORTESTDAYNAME7 :: LCTYPE
+ System.Win32.NLS: lOCALE_SSORTNAME :: LCTYPE
+ System.Win32.NLS: lOCALE_SUPPLEMENTAL :: EnumLocalesFlag
+ System.Win32.NLS: lOCALE_SYEARMONTH :: LCTYPE
+ System.Win32.NLS: lOCALE_WINDOWS :: EnumLocalesFlag
+ System.Win32.NLS: mkLOCALE_ENUMPROCEX :: LOCALE_ENUMPROCEX -> IO (FunPtr LOCALE_ENUMPROCEX)
+ System.Win32.NLS: nORM_LINGUISTIC_CASING :: LCMapFlags
+ System.Win32.NLS: type EnumLocalesFlag = DWORD
+ System.Win32.NLS: type LOCALE_ENUMPROCEX = LPWSTR -> EnumLocalesFlag -> LPARAM -> IO BOOL
+ System.Win32.NLS: type NLS_FUNCTION = DWORD
+ System.Win32.Time: LASTINPUTINFO :: DWORD -> LASTINPUTINFO
+ System.Win32.Time: c_GetLastInputInfo :: Ptr LASTINPUTINFO -> IO Bool
+ System.Win32.Time: c_GetTimeFormatEx :: LPCWSTR -> GetTimeFormatFlags -> Ptr SYSTEMTIME -> LPCWSTR -> LPWSTR -> CInt -> IO CInt
+ System.Win32.Time: data LASTINPUTINFO
+ System.Win32.Time: getIdleTime :: IO Integer
+ System.Win32.Time: getLastInputInfo :: IO DWORD
+ System.Win32.Time: getTimeFormatEx :: Maybe String -> GetTimeFormatFlags -> Maybe SYSTEMTIME -> Maybe String -> IO String
+ System.Win32.Time: instance Foreign.Storable.Storable System.Win32.Time.LASTINPUTINFO
+ System.Win32.Time: instance GHC.Show.Show System.Win32.Time.LASTINPUTINFO
+ System.Win32.Utils: fromDateFormatPicture :: String -> Maybe String
+ System.Win32.Utils: fromTimeFormatPicture :: String -> Maybe String
+ System.Win32.Utils: instance GHC.Classes.Eq System.Win32.Utils.DateFormatPicture
+ System.Win32.Utils: instance GHC.Classes.Eq System.Win32.Utils.TimeFormatPicture
+ System.Win32.Utils: instance GHC.Show.Show System.Win32.Utils.DateFormatPicture
+ System.Win32.Utils: instance GHC.Show.Show System.Win32.Utils.TimeFormatPicture
+ System.Win32.Utils: trySized :: String -> (LPTSTR -> CInt -> IO CInt) -> IO String
Files
- Graphics/Win32/Window.hsc +5/−2
- System/Win32/Console.hsc +12/−12
- System/Win32/NLS.hsc +479/−30
- System/Win32/Time.hsc +54/−3
- System/Win32/Utils.hs +343/−9
- Win32.cabal +1/−1
- changelog.md +18/−2
- include/alphablend.h +1/−1
Graphics/Win32/Window.hsc view
@@ -419,7 +419,7 @@ return size' foreign import WINDOWS_CCONV "windows.h GetWindowTextLengthW" c_GetWindowTextLength :: HWND -> IO Int-+ ---------------------------------------------------------------- -- Paint struct ----------------------------------------------------------------@@ -471,6 +471,9 @@ foreign import WINDOWS_CCONV "windows.h ShowWindow" showWindow :: HWND -> ShowWindowControl -> IO Bool +foreign import WINDOWS_CCONV "windows.h IsWindowVisible"+ isWindowVisible :: HWND -> IO Bool+ ---------------------------------------------------------------- -- Misc ----------------------------------------------------------------@@ -607,7 +610,7 @@ foreign import WINDOWS_CCONV unsafe "windows.h GetForegroundWindow" getForegroundWindow :: IO HWND-+ getParent :: HWND -> IO HWND getParent wnd = failIfNull "GetParent" $ c_GetParent wnd
System/Win32/Console.hsc view
@@ -170,8 +170,8 @@ (#poke CONSOLE_SCREEN_BUFFER_INFO, dwMaximumWindowSize) buf (dwMaximumWindowSize info) data COORD = COORD - { x :: SHORT - , y :: SHORT + { xPos :: SHORT + , yPos :: SHORT } deriving (Show, Eq) instance Storable COORD where @@ -182,14 +182,14 @@ y' <- (#peek COORD, Y) buf return $ COORD x' y' poke buf coord = do - (#poke COORD, X) buf (x coord) - (#poke COORD, Y) buf (y coord) + (#poke COORD, X) buf (xPos coord) + (#poke COORD, Y) buf (yPos coord) data SMALL_RECT = SMALL_RECT - { left :: SHORT - , top :: SHORT - , right :: SHORT - , bottom :: SHORT + { leftPos :: SHORT + , topPos :: SHORT + , rightPos :: SHORT + , bottomPos :: SHORT } deriving (Show, Eq) instance Storable SMALL_RECT where @@ -202,10 +202,10 @@ bottom' <- (#peek SMALL_RECT, Bottom) buf return $ SMALL_RECT left' top' right' bottom' poke buf small_rect = do - (#poke SMALL_RECT, Left) buf (left small_rect) - (#poke SMALL_RECT, Top) buf (top small_rect) - (#poke SMALL_RECT, Right) buf (right small_rect) - (#poke SMALL_RECT, Bottom) buf (bottom small_rect) + (#poke SMALL_RECT, Left) buf (leftPos small_rect) + (#poke SMALL_RECT, Top) buf (topPos small_rect) + (#poke SMALL_RECT, Right) buf (rightPos small_rect) + (#poke SMALL_RECT, Bottom) buf (bottomPos small_rect) foreign import WINDOWS_CCONV safe "windows.h GetConsoleScreenBufferInfo" c_GetConsoleScreenBufferInfo :: HANDLE -> Ptr CONSOLE_SCREEN_BUFFER_INFO -> IO BOOL
System/Win32/NLS.hsc view
@@ -22,17 +22,42 @@ mAKELANGID, pRIMARYLANGID, sUBLANGID ) where +import System.Win32.String (withTStringBufferLen) import System.Win32.Types+import System.Win32.Utils (trySized) +#if !MIN_VERSION_base(4,8,0)+import Control.Applicative ((<$>), (<*>))+#endif+import Control.Monad (when)+import Data.IORef (modifyIORef, newIORef, readIORef) import Foreign import Foreign.C+import Text.Printf (printf) ##include "windows_cconv.h" +-- Somewhere, WINVER and _WIN32_WINNT are being defined as less than 0x0600 -+-- that is, before Windows Vista. Support for Windows XP was dropped in+-- GHC 8.0.1 of May 2016. This forces them to be at least 0x0600.+#if WINVER < 0x0600+#undef WINVER+#define WINVER 0x0600+#endif+#if _WIN32_WINNT < 0x0600+#undef _WIN32_WINNT+#define _WIN32_WINNT 0x0600+#endif+ #include <windows.h>+#include "alignment.h" #include "errors.h" #include "win32debug.h"+#include "winnls_compat.h"+#include "winnt_compat.h" +type NLS_FUNCTION = DWORD+ #{enum LCID, , lOCALE_SYSTEM_DEFAULT = LOCALE_SYSTEM_DEFAULT , lOCALE_USER_DEFAULT = LOCALE_USER_DEFAULT@@ -60,37 +85,237 @@ type LCTYPE = UINT +-- The following locale information constants are excluded from the `enum` list+-- below, for the reason indicated:+-- LOCALE_IDIALINGCODE -- Introduced in Windows 10 but not supported. Synonym+ -- for LOCALE_ICOUNTRY.+-- 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_S1159.+-- LOCALE_SENGLISHDISPLAYNAME -- Introduced in Windows 7 but not supported.+-- LOCALE_SIETFLANGUAGE -- Not supported (deprecated from Windows Vista).+-- LOCALE_SNATIVEDISPLAYNAME -- Introduced in Windows 7 but not supported.+-- LOCALE_SNATIVELANGUAGENAME -- Introduced in Windows 7 but not supported.+-- LOCALE_SPERCENT -- Introduced in Windows 7 but not supported.+-- LOCALE_SPM -- Introduced in Windows 10 but not supported. Synonym for+ -- LOCALE_S2359.+-- LOCALE_SSHORTESTAM -- Not supported.+-- LOCALE_SSHORTESTPM -- Not supported.+-- LOCALE_SSHORTTIME -- Introduced in Windows 7 but not supported.++-- The following locale information constant is included in the list below, but+-- note:+-- LOCALE_IINTLCURRDIGITS -- Not supported by Windows 10, use+ -- LOCALE_ICURRDIGITS.+ #{enum LCTYPE,+ , lOCALE_FONTSIGNATURE = LOCALE_FONTSIGNATURE , lOCALE_ICALENDARTYPE = LOCALE_ICALENDARTYPE- , lOCALE_SDATE = LOCALE_SDATE+ , lOCALE_ICENTURY = LOCALE_ICENTURY+ , lOCALE_ICOUNTRY = LOCALE_ICOUNTRY , lOCALE_ICURRDIGITS = LOCALE_ICURRDIGITS- , lOCALE_SDECIMAL = LOCALE_SDECIMAL , lOCALE_ICURRENCY = LOCALE_ICURRENCY- , lOCALE_SGROUPING = LOCALE_SGROUPING+ , lOCALE_IDATE = LOCALE_IDATE+ , lOCALE_IDAYLZERO = LOCALE_IDAYLZERO+ , lOCALE_IDEFAULTANSICODEPAGE = LOCALE_IDEFAULTANSICODEPAGE+ , lOCALE_IDEFAULTCODEPAGE = LOCALE_IDEFAULTCODEPAGE+ , lOCALE_IDEFAULTCOUNTRY = LOCALE_IDEFAULTCOUNTRY+ , lOCALE_IDEFAULTEBCDICCODEPAGE = LOCALE_IDEFAULTEBCDICCODEPAGE+ , lOCALE_IDEFAULTLANGUAGE = LOCALE_IDEFAULTLANGUAGE+ , lOCALE_IDEFAULTMACCODEPAGE = LOCALE_IDEFAULTMACCODEPAGE , lOCALE_IDIGITS = LOCALE_IDIGITS- , lOCALE_SLIST = LOCALE_SLIST+ , lOCALE_IDIGITSUBSTITUTION = LOCALE_IDIGITSUBSTITUTION , lOCALE_IFIRSTDAYOFWEEK = LOCALE_IFIRSTDAYOFWEEK- , lOCALE_SLONGDATE = LOCALE_SLONGDATE , lOCALE_IFIRSTWEEKOFYEAR = LOCALE_IFIRSTWEEKOFYEAR- , lOCALE_SMONDECIMALSEP = LOCALE_SMONDECIMALSEP+ , lOCALE_IGEOID = LOCALE_IGEOID+ , lOCALE_IINTLCURRDIGITS = LOCALE_IINTLCURRDIGITS+ , lOCALE_ILANGUAGE = LOCALE_ILANGUAGE+ , lOCALE_ILDATE = LOCALE_ILDATE , lOCALE_ILZERO = LOCALE_ILZERO- , lOCALE_SMONGROUPING = LOCALE_SMONGROUPING , lOCALE_IMEASURE = LOCALE_IMEASURE- , lOCALE_SMONTHOUSANDSEP = LOCALE_SMONTHOUSANDSEP+ , lOCALE_IMONLZERO = LOCALE_IMONLZERO , lOCALE_INEGCURR = LOCALE_INEGCURR- , lOCALE_SNEGATIVESIGN = LOCALE_SNEGATIVESIGN , lOCALE_INEGNUMBER = LOCALE_INEGNUMBER+ , lOCALE_INEGSEPBYSPACE = LOCALE_INEGSEPBYSPACE+ , lOCALE_INEGSIGNPOSN = LOCALE_INEGSIGNPOSN+ , lOCALE_INEGSYMPRECEDES = LOCALE_INEGSYMPRECEDES+ , lOCALE_IOPTIONALCALENDAR = LOCALE_IOPTIONALCALENDAR+ , lOCALE_PAPERSIZE = LOCALE_IPAPERSIZE+ , lOCALE_IPOSSEPBYSPACE = LOCALE_IPOSSEPBYSPACE+ , lOCALE_IPOSSIGNPOSN = LOCALE_IPOSSIGNPOSN+ , lOCALE_IPSSYMPRECEDES = LOCALE_IPOSSYMPRECEDES+ , lOCALE_ITIME = LOCALE_ITIME+ , lOCALE_ITIMEMARKPOSN = LOCALE_ITIMEMARKPOSN+ , lOCALE_ITLZERO = LOCALE_ITLZERO+ , lOCALE_RETURN_NUMBER = LOCALE_RETURN_NUMBER+ , lOCALE_S1159 = LOCALE_S1159+ , lOCALE_S2359 = LOCALE_S2359+ , lOCALE_SABBREVCTRYNAME = LOCALE_SABBREVCTRYNAME+ , lOCALE_SABBREVDAYNAME1 = LOCALE_SABBREVDAYNAME1+ , lOCALE_SABBREVDAYNAME2 = LOCALE_SABBREVDAYNAME2+ , lOCALE_SABBREVDAYNAME3 = LOCALE_SABBREVDAYNAME3+ , lOCALE_SABBREVDAYNAME4 = LOCALE_SABBREVDAYNAME4+ , lOCALE_SABBREVDAYNAME5 = LOCALE_SABBREVDAYNAME5+ , lOCALE_SABBREVDAYNAME6 = LOCALE_SABBREVDAYNAME6+ , lOCALE_SABBREVDAYNAME7 = LOCALE_SABBREVDAYNAME7+ , lOCALE_SABBREVLANGNAME = LOCALE_SABBREVLANGNAME+ , lOCALE_SABBREVMONTHNAME1 = LOCALE_SABBREVMONTHNAME1+ , lOCALE_SABBREVMONTHNAME2 = LOCALE_SABBREVMONTHNAME2+ , lOCALE_SABBREVMONTHNAME3 = LOCALE_SABBREVMONTHNAME3+ , lOCALE_SABBREVMONTHNAME4 = LOCALE_SABBREVMONTHNAME4+ , lOCALE_SABBREVMONTHNAME5 = LOCALE_SABBREVMONTHNAME5+ , lOCALE_SABBREVMONTHNAME6 = LOCALE_SABBREVMONTHNAME6+ , lOCALE_SABBREVMONTHNAME7 = LOCALE_SABBREVMONTHNAME7+ , lOCALE_SABBREVMONTHNAME8 = LOCALE_SABBREVMONTHNAME8+ , lOCALE_SABBREVMONTHNAME9 = LOCALE_SABBREVMONTHNAME9+ , lOCALE_SABBREVMONTHNAME10 = LOCALE_SABBREVMONTHNAME10+ , lOCALE_SABBREVMONTHNAME11 = LOCALE_SABBREVMONTHNAME11+ , lOCALE_SABBREVMONTHNAME12 = LOCALE_SABBREVMONTHNAME12+ , lOCALE_SABBREVMONTHNAME13 = LOCALE_SABBREVMONTHNAME13+ , lOCALE_SCONSOLEFALLBACKNAME = LOCALE_SCONSOLEFALLBACKNAME+ , lOCALE_SCURRENCY = LOCALE_SCURRENCY+ , lOCALE_SDATE = LOCALE_SDATE+ , lOCALE_SDAYNAME1 = LOCALE_SDAYNAME1+ , lOCALE_SDAYNAME2 = LOCALE_SDAYNAME2+ , lOCALE_SDAYNAME3 = LOCALE_SDAYNAME3+ , lOCALE_SDAYNAME4 = LOCALE_SDAYNAME4+ , lOCALE_SDAYNAME5 = LOCALE_SDAYNAME5+ , lOCALE_SDAYNAME6 = LOCALE_SDAYNAME6+ , lOCALE_SDAYNAME7 = LOCALE_SDAYNAME7+ , lOCALE_SDECIMAL = LOCALE_SDECIMAL+ , lOCALE_SDURATION = LOCALE_SDURATION+ , lOCALE_SENGCURRNAME = LOCALE_SENGCURRNAME+ , lOCALE_SENGLISHCOUNTRYNAME = LOCALE_SENGLISHCOUNTRYNAME+ , lOCALE_SENGLISHLANGUAGENAME = LOCALE_SENGLISHLANGUAGENAME+ , lOCALE_SGROUPING = LOCALE_SGROUPING+ , lOCALE_SINTLSYMBOL = LOCALE_SINTLSYMBOL+ , lOCALE_SISO3166CTRYNAME = LOCALE_SISO3166CTRYNAME+ , lOCALE_SISO3166CTRYNAME2 = LOCALE_SISO3166CTRYNAME2+ , lOCALE_SISO639LANGNAME = LOCALE_SISO639LANGNAME+ , lOCALE_SISO639LANGNAME2 = LOCALE_SISO639LANGNAME2+ , lOCALE_SKEYBOARDSTOINSTALL = LOCALE_SKEYBOARDSTOINSTALL+ , lOCALE_SLIST = LOCALE_SLIST+ , lOCALE_SLONGDATE = LOCALE_SLONGDATE+ , lOCALE_SMONDECIMALSEP = LOCALE_SMONDECIMALSEP+ , lOCALE_SMONGROUPING = LOCALE_SMONGROUPING+ , lOCALE_SMONTHNAME1 = LOCALE_SMONTHNAME1+ , lOCALE_SMONTHNAME2 = LOCALE_SMONTHNAME2+ , lOCALE_SMONTHNAME3 = LOCALE_SMONTHNAME3+ , lOCALE_SMONTHNAME4 = LOCALE_SMONTHNAME4+ , lOCALE_SMONTHNAME5 = LOCALE_SMONTHNAME5+ , lOCALE_SMONTHNAME6 = LOCALE_SMONTHNAME6+ , lOCALE_SMONTHNAME7 = LOCALE_SMONTHNAME7+ , lOCALE_SMONTHNAME8 = LOCALE_SMONTHNAME8+ , lOCALE_SMONTHNAME9 = LOCALE_SMONTHNAME9+ , lOCALE_SMONTHNAME10 = LOCALE_SMONTHNAME10+ , lOCALE_SMONTHNAME11 = LOCALE_SMONTHNAME11+ , lOCALE_SMONTHNAME12 = LOCALE_SMONTHNAME12+ , lOCALE_SMONTHNAME13 = LOCALE_SMONTHNAME13+ , lOCALE_SMONTHOUSANDSEP = LOCALE_SMONTHOUSANDSEP+ , lOCALE_SNAME = LOCALE_SNAME+ , lOCALE_SNAN = LOCALE_SNAN+ , lOCALE_SNATIVECOUNTRYNAME = LOCALE_SNATIVECOUNTRYNAME+ , lOCALE_SNATIVECURRNAME = LOCALE_SNATIVECURRNAME+ , lOCALE_SNATIVEDIGITS = LOCALE_SNATIVEDIGITS+ , lOCALE_SNEGATIVESIGN = LOCALE_SNEGATIVESIGN+ , lOCALE_SNEGINFINITY = LOCALE_SNEGINFINITY+ , lOCALE_SPARENT = LOCALE_SPARENT+ , lOCALE_SPOSINFINITY = LOCALE_SPOSINFINITY , lOCALE_SPOSITIVESIGN = LOCALE_SPOSITIVESIGN+ , lOCALE_SSCRIPTS = LOCALE_SSCRIPTS , lOCALE_SSHORTDATE = LOCALE_SSHORTDATE- , lOCALE_ITIME = LOCALE_ITIME+ , lOCALE_SSHORTESTDAYNAME1 = LOCALE_SSHORTESTDAYNAME1+ , lOCALE_SSHORTESTDAYNAME2 = LOCALE_SSHORTESTDAYNAME2+ , lOCALE_SSHORTESTDAYNAME3 = LOCALE_SSHORTESTDAYNAME3+ , lOCALE_SSHORTESTDAYNAME4 = LOCALE_SSHORTESTDAYNAME4+ , lOCALE_SSHORTESTDAYNAME5 = LOCALE_SSHORTESTDAYNAME5+ , lOCALE_SSHORTESTDAYNAME6 = LOCALE_SSHORTESTDAYNAME6+ , lOCALE_SSHORTESTDAYNAME7 = LOCALE_SSHORTESTDAYNAME7+ , lOCALE_SSORTNAME = LOCALE_SSORTNAME , lOCALE_STHOUSAND = LOCALE_STHOUSAND- , lOCALE_S1159 = LOCALE_S1159 , lOCALE_STIME = LOCALE_STIME- , lOCALE_S2359 = LOCALE_S2359 , lOCALE_STIMEFORMAT = LOCALE_STIMEFORMAT- , lOCALE_SCURRENCY = LOCALE_SCURRENCY+ , lOCALE_SYEARMONTH = LOCALE_SYEARMONTH } +-- |Type representing locale data+data LCData+ -- | Data in the form of a Unicode string.+ = LCTextualData !String+ -- | Data in the form of a number. See 'lOCAL_RETURN_NUMBER' and @LOCAL_I*@+ -- locate information constants.+ | LCNumericData !DWORD+ -- | Data in the fomr of a 'LOCALESIGNATURE'. See 'lOCAL_FONTSIGNATURE' locale+ -- information constant.+ | LCSignatureData !LOCALESIGNATURE+ deriving (Eq, Show)++data LOCALESIGNATURE = LOCALESIGNATURE+ { lsUsb :: !UnicodeSubsetBitfield+ , lsCsbDefault :: !DDWORD+ , lsCsbSupported :: !DDWORD+ } deriving (Eq, Show)++instance Storable LOCALESIGNATURE where+ sizeOf = const #{size LOCALESIGNATURE}+ alignment _ = #alignment LOCALESIGNATURE+ peek buf = do+ lsUsb' <- (#peek LOCALESIGNATURE, lsUsb) buf+ lsCsbDefault' <- (#peek LOCALESIGNATURE, lsCsbDefault) buf+ lsCsbSupported' <- (#peek LOCALESIGNATURE, lsCsbSupported) buf+ return $ LOCALESIGNATURE lsUsb' lsCsbDefault' lsCsbSupported'+ poke buf info = do+ (#poke LOCALESIGNATURE, lsUsb) buf (lsUsb info)+ (#poke LOCALESIGNATURE, lsCsbDefault) buf (lsCsbDefault info)+ (#poke LOCALESIGNATURE, lsCsbSupported) buf (lsCsbSupported info)++-- | Type representing 128-bit Unicode subset bitfields, as the @base@ package+-- does include a module exporting a 128-bit unsigned integer type.+data UnicodeSubsetBitfield = UnicodeSubsetBitfield+ { usbLow :: !DDWORD+ , usbHigh :: !DDWORD+ } deriving (Eq, Show)++instance Storable UnicodeSubsetBitfield where+ sizeOf _ = 2 * sizeOf (undefined :: DDWORD)+ alignment _ = alignment (undefined :: DWORD)+ peek buf = do+ usbLow' <- (peekByteOff buf 0 :: IO DDWORD)+ usbHigh' <- (peekByteOff buf (sizeOf (undefined :: DDWORD)) :: IO DDWORD)+ return $ UnicodeSubsetBitfield usbLow' usbHigh'+ poke buf info = do+ pokeByteOff buf 0 (usbLow info)+ pokeByteOff buf (sizeOf (undefined :: DDWORD)) (usbHigh info)++getLocaleInfoEx :: Maybe String -> LCTYPE -> IO LCData+getLocaleInfoEx locale ty+ | ty == lOCALE_FONTSIGNATURE =+ getLocaleInfoEx' LCSignatureData localSigCharCount++ | ty .&. lOCALE_RETURN_NUMBER /= 0 =+ getLocaleInfoEx' LCNumericData dWORDCharCount++ | otherwise = maybeWith withTString locale $ \c_locale ->+ LCTextualData <$> trySized cFuncName (c_GetLocaleInfoEx c_locale ty)+ where+ cFuncName = "GetLocaleInfoEx"+ -- See https://docs.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-getlocaleinfoex+ localSigCharCount = (#size LOCALESIGNATURE) `div` (#size WCHAR)+ dWORDCharCount = (#size DWORD) `div` (#size WCHAR)++ getLocaleInfoEx' constructor bufSize = maybeWith withTString locale $+ \c_locale -> do+ value <- alloca $ \buf -> do+ _ <- failIfZero cFuncName+ $ c_GetLocaleInfoEx c_locale ty (castPtr buf) bufSize+ peek buf+ return $ constructor value++foreign import WINDOWS_CCONV unsafe "windows.h GetLocaleInfoEx"+ c_GetLocaleInfoEx :: LPCWSTR -> LCTYPE -> LPWSTR -> CInt -> IO CInt+ setLocaleInfo :: LCID -> LCTYPE -> String -> IO () setLocaleInfo locale ty info = withTString info $ \ c_info ->@@ -101,25 +326,153 @@ type LCMapFlags = DWORD #{enum LCMapFlags,- , lCMAP_BYTEREV = LCMAP_BYTEREV- , lCMAP_FULLWIDTH = LCMAP_FULLWIDTH- , lCMAP_HALFWIDTH = LCMAP_HALFWIDTH- , lCMAP_HIRAGANA = LCMAP_HIRAGANA- , lCMAP_KATAKANA = LCMAP_KATAKANA- , lCMAP_LOWERCASE = LCMAP_LOWERCASE- , lCMAP_SORTKEY = LCMAP_SORTKEY- , lCMAP_UPPERCASE = LCMAP_UPPERCASE- , nORM_IGNORECASE = NORM_IGNORECASE- , nORM_IGNORENONSPACE = NORM_IGNORENONSPACE- , nORM_IGNOREKANATYPE = NORM_IGNOREKANATYPE- , nORM_IGNORESYMBOLS = NORM_IGNORESYMBOLS- , nORM_IGNOREWIDTH = NORM_IGNOREWIDTH- , sORT_STRINGSORT = SORT_STRINGSORT- , lCMAP_LINGUISTIC_CASING = LCMAP_LINGUISTIC_CASING- , lCMAP_SIMPLIFIED_CHINESE = LCMAP_SIMPLIFIED_CHINESE- , lCMAP_TRADITIONAL_CHINESE = LCMAP_TRADITIONAL_CHINESE+ , lCMAP_BYTEREV = LCMAP_BYTEREV+ , lCMAP_FULLWIDTH = LCMAP_FULLWIDTH+ , lCMAP_HALFWIDTH = LCMAP_HALFWIDTH+ , lCMAP_HIRAGANA = LCMAP_HIRAGANA+ , lCMAP_KATAKANA = LCMAP_KATAKANA+ , lCMAP_LINGUISTIC_CASING = LCMAP_LINGUISTIC_CASING+ , lCMAP_LOWERCASE = LCMAP_LOWERCASE+ , lCMAP_SIMPLIFIED_CHINESE = LCMAP_SIMPLIFIED_CHINESE+ , lCMAP_SORTKEY = LCMAP_SORTKEY+ , lCMAP_TRADITIONAL_CHINESE = LCMAP_TRADITIONAL_CHINESE+ , lCMAP_UPPERCASE = LCMAP_UPPERCASE+ , lINGUISTIC_IGNORECASE = LINGUISTIC_IGNORECASE+ , lINGUISTIC_IGNOREDIACRITIC = LINGUISTIC_IGNOREDIACRITIC+ , nORM_IGNORECASE = NORM_IGNORECASE+ , nORM_IGNORENONSPACE = NORM_IGNORENONSPACE+ , nORM_IGNOREKANATYPE = NORM_IGNOREKANATYPE+ , nORM_IGNORESYMBOLS = NORM_IGNORESYMBOLS+ , nORM_IGNOREWIDTH = NORM_IGNOREWIDTH+ , nORM_LINGUISTIC_CASING = NORM_LINGUISTIC_CASING+ , sORT_STRINGSORT = SORT_STRINGSORT } +data NLSVERSIONINFOEX = NLSVERSIONINFOEX+ { dwNLSVersionInfoSize :: DWORD+ , dwNLSVersion :: DWORD+ , dwDefinedVersion :: DWORD+ , dwEffectiveId :: DWORD+ , guidCustomVersion :: GUID+ } deriving (Eq, Show)++instance Storable NLSVERSIONINFOEX where+ sizeOf = const #{size NLSVERSIONINFOEX}+ alignment _ = #alignment NLSVERSIONINFOEX+ peek buf = do+ dwNLSVersionInfoSize' <- (#peek NLSVERSIONINFOEX, dwNLSVersionInfoSize) buf+ dwNLSVersion' <- (#peek NLSVERSIONINFOEX, dwNLSVersion) buf+ dwDefinedVersion' <- (#peek NLSVERSIONINFOEX, dwDefinedVersion) buf+ dwEffectiveId' <- (#peek NLSVERSIONINFOEX, dwEffectiveId) buf+ guidCustomVersion' <- (#peek NLSVERSIONINFOEX, guidCustomVersion) buf+ return $ NLSVERSIONINFOEX dwNLSVersionInfoSize' dwNLSVersion'+ dwDefinedVersion' dwEffectiveId' guidCustomVersion'+ poke buf info = do+ (#poke NLSVERSIONINFOEX, dwNLSVersionInfoSize) buf+ (dwNLSVersionInfoSize info)+ (#poke NLSVERSIONINFOEX, dwNLSVersion) buf (dwNLSVersion info)+ (#poke NLSVERSIONINFOEX, dwDefinedVersion) buf (dwDefinedVersion info)+ (#poke NLSVERSIONINFOEX, dwEffectiveId) buf (dwEffectiveId info)+ (#poke NLSVERSIONINFOEX, guidCustomVersion) buf (guidCustomVersion info)++-- Based on the `UnpackedUUID` type of package `uuid-types`.+data GUID = GUID+ !Word32+ !Word16+ !Word16+ !Word8+ !Word8+ !Word8+ !Word8+ !Word8+ !Word8+ !Word8+ !Word8+ deriving (Eq)++instance Show GUID where+ show (GUID data1 data2 data3 b1 b2 b3 b4 b5 b6 b7 b8) =+ printf "{%.8x-%.4x-%.4x-%.2x%2x-%.2x%.2x%.2x%.2x%.2x%.2x}" data1 data2 data3 b1 b2 b3 b4 b5 b6 b7 b8++instance Storable GUID where+ sizeOf _ = 16+ alignment _ = 4+ peekByteOff p off = GUID+ <$> peekByteOff p off+ <*> peekByteOff p (off + 4)+ <*> peekByteOff p (off + 6)+ <*> peekByteOff p (off + 8)+ <*> peekByteOff p (off + 9)+ <*> peekByteOff p (off + 10)+ <*> peekByteOff p (off + 11)+ <*> peekByteOff p (off + 12)+ <*> peekByteOff p (off + 13)+ <*> peekByteOff p (off + 14)+ <*> peekByteOff p (off + 15)+ pokeByteOff p off (GUID data1 data2 data3 b1 b2 b3 b4 b5 b6 b7 b8) = do+ pokeByteOff p off data1+ pokeByteOff p (off + 4) data2+ pokeByteOff p (off + 6) data3+ pokeByteOff p (off + 8) b1+ pokeByteOff p (off + 9) b2+ pokeByteOff p (off + 10) b3+ pokeByteOff p (off + 11) b4+ pokeByteOff p (off + 12) b5+ pokeByteOff p (off + 13) b6+ pokeByteOff p (off + 14) b7+ pokeByteOff p (off + 15) b8++getNLSVersionEx :: Maybe String -> IO NLSVERSIONINFOEX+getNLSVersionEx locale = maybeWith withTString locale $ \c_locale ->+ with defaultVersionInfo $ \c_versionInfo -> do+ failIfFalse_ "GetNLSVersionEx" $+ c_GetNLSVersionEx function c_locale c_versionInfo+ peek c_versionInfo+ where+ function = #{const COMPARE_STRING}+ defaultVersionInfo = NLSVERSIONINFOEX+ { dwNLSVersionInfoSize = #{size NLSVERSIONINFOEX}+ , dwNLSVersion = 0+ , dwDefinedVersion = 0+ , dwEffectiveId = 0+ , guidCustomVersion = GUID 0 0 0 0 0 0 0 0 0 0 0+ }+foreign import WINDOWS_CCONV unsafe "windows.h GetNLSVersionEx"+ c_GetNLSVersionEx :: NLS_FUNCTION+ -> LPCWSTR+ -> Ptr NLSVERSIONINFOEX+ -> IO Bool++lCMapStringEx :: Maybe String+ -> LCMapFlags+ -> String+ -> NLSVERSIONINFOEX+ -> IO String+lCMapStringEx locale flags src versionInfo =+ maybeWith withTString locale $ \c_locale ->+ withTStringLen src $ \(c_src, src_len) ->+ with versionInfo $ \c_versionInfo -> do+ let c_src_len = fromIntegral src_len+ c_func s l = c_LCMapStringEx c_locale+ flags+ c_src c_src_len+ s l+ c_versionInfo+ nullPtr -- Reserved, must be NULL+ 0 -- Reserved, must be 0+ trySized "LCMapStringEx" c_func+foreign import WINDOWS_CCONV unsafe "windows.h LCMapStringEx"+ c_LCMapStringEx :: LPCWSTR+ -> LCMapFlags+ -> LPCWSTR+ -> CInt+ -> LPWSTR+ -> CInt+ -> Ptr NLSVERSIONINFOEX+ -> LPVOID+ -> LPARAM+ -> IO CInt+ lCMapString :: LCID -> LCMapFlags -> String -> Int -> IO String lCMapString locale flags src dest_size = withTStringLen src $ \ (c_src, src_len) ->@@ -137,9 +490,63 @@ , lCID_SUPPORTED = LCID_SUPPORTED } +isValidLocaleName :: Maybe String -> IO Bool+isValidLocaleName lpLocaleName =+ maybeWith withTString lpLocaleName c_IsValidLocaleName+foreign import WINDOWS_CCONV unsafe "windows.h IsValidLocaleName"+ c_IsValidLocaleName :: LPCWSTR -> IO Bool+ foreign import WINDOWS_CCONV unsafe "windows.h IsValidLocale" isValidLocale :: LCID -> LocaleTestFlags -> IO Bool +type EnumLocalesFlag = DWORD++-- The following locale enumeration flag constants are excluded from the `enum`+-- list below, for the reason indicated:+-- LOCALE_NEUTRALDATA -- Introduced in Windows 7 but not supported.++#{enum EnumLocalesFlag,+ , lOCALE_ALL = LOCALE_ALL+ , lOCALE_ALTERNATE_SORTS = LOCALE_ALTERNATE_SORTS+ , lOCALE_REPLACEMENT = LOCALE_REPLACEMENT+ , lOCALE_SUPPLEMENTAL = LOCALE_SUPPLEMENTAL+ , lOCALE_WINDOWS = LOCALE_WINDOWS+ }++type LOCALE_ENUMPROCEX = LPWSTR -> EnumLocalesFlag -> LPARAM -> IO BOOL+foreign import WINDOWS_CCONV "wrapper"+ mkLOCALE_ENUMPROCEX :: LOCALE_ENUMPROCEX -> IO (FunPtr LOCALE_ENUMPROCEX)++enumSystemLocalesEx :: LOCALE_ENUMPROCEX -> EnumLocalesFlag -> LPARAM -> IO ()+enumSystemLocalesEx callback dwFlags lParam = do+ c_callback <- mkLOCALE_ENUMPROCEX callback+ failIfFalse_ "EnumSystemLocalesEx" $+ c_EnumSystemLocalesEx c_callback dwFlags lParam nullPtr+ freeHaskellFunPtr c_callback+foreign import WINDOWS_CCONV safe "windows.h EnumSystemLocalesEx"+ c_EnumSystemLocalesEx :: (FunPtr LOCALE_ENUMPROCEX)+ -> DWORD+ -> LPARAM+ -> LPVOID+ -> IO Bool++enumSystemLocalesEx' :: EnumLocalesFlag+ -> Maybe Bool+ -- ^ Maybe include (or exclude) replacement locales?+ -> IO [String]+enumSystemLocalesEx' dwFlags mIsReplacement = do+ store <- newIORef []+ let localeEnumProcEx c_locale arg2 _ = do+ locale <- peekTString c_locale+ case mIsReplacement of+ Nothing -> modifyIORef store (locale:)+ Just isReplacement ->+ when (isReplacement == (arg2 .&. lOCALE_REPLACEMENT /= 0)) $+ modifyIORef store (locale:)+ return True+ enumSystemLocalesEx localeEnumProcEx dwFlags 0+ reverse <$> readIORef store+ foreign import WINDOWS_CCONV unsafe "windows.h IsValidCodePage" isValidCodePage :: CodePage -> IO Bool @@ -149,6 +556,42 @@ foreign import WINDOWS_CCONV unsafe "windows.h GetUserDefaultLangID" getUserDefaultLangID :: LANGID +-- #define LOCALE_NAME_INVARIANT L""+lOCALE_NAME_INVARIANT :: Maybe String+lOCALE_NAME_INVARIANT = Just ""++ -- #define LOCALE_NAME_SYSTEM_DEFAULT L"!x-sys-default-locale"+lOCALE_NAME_SYSTEM_DEFAULT :: Maybe String+lOCALE_NAME_SYSTEM_DEFAULT = Just "!x-sys-default-locale"++ -- #define LOCALE_NAME_USER_DEFAULT NULL+lOCALE_NAME_USER_DEFAULT :: Maybe String+lOCALE_NAME_USER_DEFAULT = Nothing++getUserDefaultLocaleName :: IO String+getUserDefaultLocaleName =+ getDefaultLocaleName "GetUserDefaultLocaleName" c_GetUserDefaultLocaleName+foreign import WINDOWS_CCONV unsafe "windows.h GetUserDefaultLocaleName"+ c_GetUserDefaultLocaleName :: LPWSTR -> CInt -> IO CInt++#{enum CInt,+ , lOCALE_NAME_MAX_LENGTH = LOCALE_NAME_MAX_LENGTH+ }++-- |Helper function for use with 'c_GetUserDefaultLocaleName' or+-- 'c_GetSystemDefaultLocaleName'. See 'getUserDefaultLocaleName' and+-- 'getSystemUserDefaultLocaleName'.+getDefaultLocaleName :: String -> (LPWSTR -> CInt -> IO CInt) -> IO String+getDefaultLocaleName cDefaultLocaleFuncName cDefaultLocaleFunc =+ withTStringBufferLen maxLength $ \(buf, len) -> do+ let c_len = fromIntegral len+ c_len' <- failIfZero cDefaultLocaleFuncName $+ cDefaultLocaleFunc buf c_len+ let len' = fromIntegral c_len'+ peekTStringLen (buf, len' - 1) -- Drop final null character+ where+ maxLength = fromIntegral lOCALE_NAME_MAX_LENGTH+ foreign import WINDOWS_CCONV unsafe "windows.h GetThreadLocale" getThreadLocale :: IO LCID @@ -157,6 +600,12 @@ foreign import WINDOWS_CCONV unsafe "windows.h GetSystemDefaultLangID" getSystemDefaultLangID :: LANGID++getSystemDefaultLocaleName :: IO String+getSystemDefaultLocaleName =+ getDefaultLocaleName "GetSystemDefaultLocaleName" c_GetSystemDefaultLocaleName+foreign import WINDOWS_CCONV unsafe "windows.h GetSystemDefaultLocaleName"+ c_GetSystemDefaultLocaleName :: LPWSTR -> CInt -> IO CInt foreign import WINDOWS_CCONV unsafe "windows.h GetOEMCP" getOEMCP :: CodePage
System/Win32/Time.hsc view
@@ -18,9 +18,12 @@ ----------------------------------------------------------------------------- module System.Win32.Time where -import System.Win32.Types ( DWORD, WORD, LONG, BOOL, failIf, failIf_, HANDLE- , peekTStringLen, LCID, LPTSTR, LPCTSTR, DDWORD- , LARGE_INTEGER, ddwordToDwords, dwordsToDdword )+import System.Win32.String ( peekTStringLen, withTString )+import System.Win32.Types ( BOOL, DDWORD, DWORD, HANDLE, LARGE_INTEGER, LCID+ , LONG, LPCTSTR, LPCWSTR, LPTSTR, LPWSTR, UINT, WORD+ , dwordsToDdword, ddwordToDwords, failIf+ , failIfFalse_, failIf_ )+import System.Win32.Utils ( trySized ) import Control.Monad ( when, liftM3, liftM ) import Data.Word ( Word8 )@@ -35,6 +38,7 @@ ##include "windows_cconv.h" #include <windows.h> #include "alignment.h"+#include "winnls_compat.h" ---------------------------------------------------------------- -- data types@@ -59,6 +63,8 @@ data TimeZoneId = TzIdUnknown | TzIdStandard | TzIdDaylight deriving (Show, Eq, Ord) +data LASTINPUTINFO = LASTINPUTINFO DWORD deriving (Show)+ ---------------------------------------------------------------- -- Instances ----------------------------------------------------------------@@ -128,6 +134,16 @@ dnam <- peekCWString (plusPtr buf (#offset TIME_ZONE_INFORMATION, DaylightName)) return $ TIME_ZONE_INFORMATION bias snam sdat sbia dnam ddat dbia +instance Storable LASTINPUTINFO where+ sizeOf = const (#size LASTINPUTINFO)+ alignment = sizeOf+ poke buf (LASTINPUTINFO t) = do+ (#poke LASTINPUTINFO, cbSize) buf ((#size LASTINPUTINFO) :: UINT)+ (#poke LASTINPUTINFO, dwTime) buf t+ peek buf = do+ t <- (#peek LASTINPUTINFO, dwTime) buf+ return $ LASTINPUTINFO t+ foreign import WINDOWS_CCONV "windows.h GetSystemTime" c_GetSystemTime :: Ptr SYSTEMTIME -> IO () getSystemTime :: IO SYSTEMTIME@@ -177,6 +193,21 @@ foreign import WINDOWS_CCONV "windows.h GetTickCount" getTickCount :: IO DWORD +foreign import WINDOWS_CCONV unsafe "windows.h GetLastInputInfo"+ c_GetLastInputInfo :: Ptr LASTINPUTINFO -> IO Bool+getLastInputInfo :: IO DWORD+getLastInputInfo =+ with (LASTINPUTINFO 0) $ \lii_p -> do+ failIfFalse_ "GetLastInputInfo" $ c_GetLastInputInfo lii_p+ LASTINPUTINFO lii <- peek lii_p+ return lii++getIdleTime :: IO Integer+getIdleTime = do+ lii <- getLastInputInfo+ now <- getTickCount+ return $ fromIntegral $ now - lii+ foreign import WINDOWS_CCONV "windows.h SetSystemTimeAdjustment" c_SetSystemTimeAdjustment :: DWORD -> BOOL -> IO BOOL setSystemTimeAdjustment :: Maybe Int -> IO ()@@ -303,6 +334,26 @@ , tIME_NOTIMEMARKER = TIME_NOTIMEMARKER , tIME_FORCE24HOURFORMAT= TIME_FORCE24HOURFORMAT }++getTimeFormatEx :: Maybe String+ -> GetTimeFormatFlags+ -> Maybe SYSTEMTIME+ -> Maybe String+ -> IO String+getTimeFormatEx locale flags st fmt =+ maybeWith withTString locale $ \c_locale ->+ maybeWith with st $ \c_st ->+ maybeWith withTString fmt $ \c_fmt -> do+ let c_func = c_GetTimeFormatEx c_locale flags c_st c_fmt+ trySized "GetTimeFormatEx" c_func+foreign import WINDOWS_CCONV "windows.h GetTimeFormatEx"+ c_GetTimeFormatEx :: LPCWSTR+ -> GetTimeFormatFlags+ -> Ptr SYSTEMTIME+ -> LPCWSTR+ -> LPWSTR+ -> CInt+ -> IO CInt foreign import WINDOWS_CCONV "windows.h GetTimeFormatW" c_GetTimeFormat :: LCID -> GetTimeFormatFlags -> Ptr SYSTEMTIME -> LPCTSTR -> LPTSTR -> CInt -> IO CInt
System/Win32/Utils.hs view
@@ -10,24 +10,34 @@ Utilities for calling Win32 API -} module System.Win32.Utils - ( try, tryWithoutNull, try' + ( try, tryWithoutNull, trySized, try' -- * Maybe values , maybePtr, ptrToMaybe, maybeNum, numToMaybe , peekMaybe, withMaybe + -- * Format picture translation + , fromDateFormatPicture + , fromTimeFormatPicture ) where + import Control.Monad ( unless ) +import Foreign.C.Types ( CInt ) import Foreign.Marshal.Array ( allocaArray, peekArray ) import Foreign.Marshal.Utils ( with ) import Foreign.Ptr ( Ptr, nullPtr ) import Foreign.Storable ( Storable(..) ) -import System.Win32.Types ( failIfZero - , failWith, getLastError, eRROR_INSUFFICIENT_BUFFER ) +import Text.ParserCombinators.ReadP ( ReadP, (<++), between, char, count + , readP_to_S, satisfy ) + + +import System.Win32.String ( LPTSTR, peekTString, peekTStringLen + , withTStringBufferLen ) +import System.Win32.Types ( BOOL, UINT, eRROR_INSUFFICIENT_BUFFER + , failIfZero, failWith, getLastError + , maybeNum, maybePtr, numToMaybe + , ptrToMaybe ) import qualified System.Win32.Types ( try ) -import System.Win32.String ( LPTSTR, peekTString ) -import System.Win32.Types ( BOOL, UINT, maybePtr, ptrToMaybe, maybeNum, numToMaybe ) import System.Win32.Word ( DWORD, PDWORD ) - -- | Support for API calls that are passed a fixed-size buffer and tell -- you via the return value if the buffer was too small. In that -- case, we extend the buffer size and try again. @@ -39,7 +49,7 @@ tryWithoutNull loc f n = do e <- allocaArray (fromIntegral n) $ \lptstr -> do r <- failIfZero loc $ f lptstr n - if (r > n) then return (Left r) else do + if r > n then return (Left r) else do str <- peekTString lptstr return (Right str) case e of @@ -56,16 +66,28 @@ unless (err_code == eRROR_INSUFFICIENT_BUFFER) $ failWith loc err_code r <- peek n' - if (r > n) then return (Left r) else do + if r > n then return (Left r) else do str <- peekArray (fromIntegral r) lptstr return (Right str) case e of Left r' -> try' loc f r' Right str -> return str +-- | Support for API calls that return the required size, in characters +-- including a null character, of the buffer when passed a buffer size of zero. +trySized :: String -> (LPTSTR -> CInt -> IO CInt) -> IO String +trySized wh f = do + c_len <- failIfZero wh $ f nullPtr 0 + let len = fromIntegral c_len + withTStringBufferLen len $ \(buf', len') -> do + let c_len' = fromIntegral len' + c_len'' <- failIfZero wh $ f buf' c_len' + let len'' = fromIntegral c_len'' + peekTStringLen (buf', len'' - 1) -- Drop final null character + -- | See also: 'Foreign.Marshal.Utils.maybePeek' function. peekMaybe :: Storable a => Ptr a -> IO (Maybe a) -peekMaybe p = +peekMaybe p = if p == nullPtr then return Nothing else Just `fmap` peek p @@ -74,3 +96,315 @@ withMaybe :: Storable a => Maybe a -> (Ptr a -> IO b) -> IO b withMaybe Nothing action = action nullPtr withMaybe (Just x) action = with x action + +-- | Type representing components of a Windows API day, month, year and era +-- format picture. +data DateFormatPicture + = Day + | Day0 -- Padded with zeros + | DayShort + | DayLong + | Month + | Month0 -- Padded with zeros + | MonthShort + | MonthLong + | YearVeryShort -- Year represented only by the last digit + | YearShort + | Year + | Era + | DateOther String + deriving (Eq, Show) + +fromDFP :: DateFormatPicture -> String +fromDFP Day = "%-e" -- No padding +fromDFP Day0 = "%d" -- Padded with zeros +fromDFP DayShort = "%a" -- eg Tue +fromDFP DayLong = "%A" -- eg Tuesday +fromDFP Month = "%-m" -- No padding +fromDFP Month0 = "%m" -- Padded with zeros +fromDFP MonthShort = "%b" -- eg Jan +fromDFP MonthLong = "%B" -- eg January +fromDFP YearVeryShort = "%-y" -- No direct equivalent of a one digit year, so + -- do not distinguish from a short year without + -- padding +fromDFP YearShort = "%y" +fromDFP Year = "%Y" +fromDFP Era = "" -- No equivalent +fromDFP (DateOther cs) = escape cs + +escape :: String -> String +escape [] = [] +escape (c:cs) = escape' c ++ escape cs + where + escape' '%' = "%%" + escape' '\t' = "%t" + escape' '\n' = "%n" + escape' c' = [c'] + +d :: ReadP Char +d = char 'd' + +day :: ReadP DateFormatPicture +day = do + _ <- d + return Day + +day0 :: ReadP DateFormatPicture +day0 = do + _ <- count 2 d + return Day0 + +dayShort :: ReadP DateFormatPicture +dayShort = do + _ <- count 3 d + return DayShort + +dayLong :: ReadP DateFormatPicture +dayLong = do + _ <- count 4 d + return DayLong + +days :: ReadP DateFormatPicture +days = dayLong <++ dayShort <++ day0 <++ day + +bigM :: ReadP Char +bigM = char 'M' + +month :: ReadP DateFormatPicture +month = do + _ <- bigM + return Month + +month0 :: ReadP DateFormatPicture +month0 = do + _ <- count 2 bigM + return Month0 + +monthShort :: ReadP DateFormatPicture +monthShort = do + _ <- count 3 bigM + return MonthShort + +monthLong :: ReadP DateFormatPicture +monthLong = do + _ <- count 4 bigM + return MonthLong + +months :: ReadP DateFormatPicture +months = monthLong <++ monthShort <++ month0 <++ month + +y :: ReadP Char +y = char 'y' + +yearVeryShort :: ReadP DateFormatPicture +yearVeryShort = do + _ <- y + return YearVeryShort + +yearShort :: ReadP DateFormatPicture +yearShort = do + _ <- count 2 y + return YearShort + +year :: ReadP DateFormatPicture +year = do + _ <- count 5 y <++ count 4 y + return Year + +years :: ReadP DateFormatPicture +years = year <++ yearShort <++ yearVeryShort + +g :: ReadP Char +g = char 'g' + +era :: ReadP DateFormatPicture +era = do + _ <- count 2 g <++ count 1 g + return Era + +quote :: ReadP Char +quote = char '\'' + +notQuote :: ReadP Char +notQuote = satisfy (/= '\'') + +escQuote :: ReadP Char +escQuote = do + _ <- count 2 quote + return '\'' + +quotedChars :: ReadP String +quotedChars = between quote quote $ greedy (escQuote <++ notQuote) + +-- | Although not documented at +-- https://docs.microsoft.com/en-us/windows/win32/intl/day--month--year--and-era-format-pictures +-- the format pictures used by Windows do not require all such characters to be +-- enclosed in single quotation marks. +nonDateSpecial :: ReadP Char +nonDateSpecial = satisfy (\c -> c `notElem` ['d', 'M', 'y', 'g', '\'']) + +nonDateSpecials :: ReadP String +nonDateSpecials = greedy1 nonDateSpecial + +dateOther :: ReadP DateFormatPicture +dateOther = do + chars <- greedy1 (nonDateSpecials <++ quotedChars) + return $ DateOther $ concat chars + +datePicture :: ReadP [DateFormatPicture] +datePicture = greedy (days <++ months <++ years <++ era <++ dateOther) + +-- | Type representing components of a Windows API hours, minute, and second +-- format picture. +data TimeFormatPicture + = Hours12 + | Hours012 -- Padded with zeros + | Hours24 + | Hours024 -- Padded with zeros + | Minutes + | Minutes0 -- Padded with zeros + | Seconds + | Seconds0 -- Padded with zeros + | TimeMarkerShort -- One-character time marker string, eg "A" and "P" + | TimeMarker -- Multi-character time marker string, eg "AM" and "PM" + | TimeOther String + deriving (Eq, Show) + +fromTFP :: TimeFormatPicture -> String +fromTFP Hours12 = "%-l" -- No padding +fromTFP Hours012 = "%I" -- Padded with zeros +fromTFP Hours24 = "%-k" -- No padding +fromTFP Hours024 = "%H" -- Padded with zeros +fromTFP Minutes = "%-M" -- No padding +fromTFP Minutes0 = "%M" -- Padded with zeros +fromTFP Seconds = "%-S" -- No padding +fromTFP Seconds0 = "%S" -- Padded with zeros +fromTFP TimeMarkerShort = "%p" -- No direct equivalent, so do not distinguish + -- from TimeMarker +fromTFP TimeMarker = "%p" +fromTFP (TimeOther cs) = escape cs + +h :: ReadP Char +h = char 'h' + +hours12 :: ReadP TimeFormatPicture +hours12 = do + _ <- h + return Hours12 + +hours012 :: ReadP TimeFormatPicture +hours012 = do + _ <- count 2 h + return Hours012 + +bigH :: ReadP Char +bigH = char 'H' + +hours24 :: ReadP TimeFormatPicture +hours24 = do + _ <- bigH + return Hours24 + +hours024 :: ReadP TimeFormatPicture +hours024 = do + _ <- count 2 bigH + return Hours024 + +hours :: ReadP TimeFormatPicture +hours = hours012 <++ hours12 <++ hours024 <++ hours24 + +m :: ReadP Char +m = char 'm' + +minute :: ReadP TimeFormatPicture +minute = do + _ <- m + return Minutes + +minute0 :: ReadP TimeFormatPicture +minute0 = do + _ <- count 2 m + return Minutes0 + +minutes :: ReadP TimeFormatPicture +minutes = minute0 <++ minute + +s :: ReadP Char +s = char 's' + +second :: ReadP TimeFormatPicture +second = do + _ <- s + return Seconds + +second0 :: ReadP TimeFormatPicture +second0 = do + _ <- count 2 s + return Seconds0 + +seconds :: ReadP TimeFormatPicture +seconds = second0 <++ second + +t :: ReadP Char +t = char 't' + +timeMarkerShort :: ReadP TimeFormatPicture +timeMarkerShort = do + _ <- t + return TimeMarkerShort + +timeMarker :: ReadP TimeFormatPicture +timeMarker = do + _ <- count 2 t + return TimeMarker + +timeMarkers :: ReadP TimeFormatPicture +timeMarkers = timeMarker <++ timeMarkerShort + +-- | Although not documented at +-- https://docs.microsoft.com/en-us/windows/win32/intl/hour--minute--and-second-format-pictures +-- the format pictures used by Windows do not require all such characters to be +-- enclosed in single quotation marks. +nonTimeSpecial :: ReadP Char +nonTimeSpecial = satisfy (\c -> c `notElem` ['h', 'H', 'm', 's', 't', '\'']) + +nonTimeSpecials :: ReadP String +nonTimeSpecials = greedy1 nonTimeSpecial + +timeOther :: ReadP TimeFormatPicture +timeOther = do + chars <- greedy1 (nonTimeSpecials <++ quotedChars) + return $ TimeOther $ concat chars + +timePicture :: ReadP [TimeFormatPicture] +timePicture = greedy (hours <++ minutes <++ seconds <++ timeMarkers <++ + timeOther) + +greedy :: ReadP a -> ReadP [a] +greedy p = greedy1 p <++ return [] + +greedy1 :: ReadP a -> ReadP [a] +greedy1 p = do + first <- p + rest <- greedy p + return (first : rest) + +parseMaybe :: ReadP a -> String -> Maybe a +parseMaybe parser input = + case readP_to_S parser input of + [] -> Nothing + ((result, _):_) -> Just result + +-- | Translate from a Windows API day, month, year, and era format picture to +-- the closest corresponding format string used by +-- 'Data.Time.Format.formatTime'. +fromDateFormatPicture :: String -> Maybe String +fromDateFormatPicture dfp = + fmap (concatMap fromDFP) $ parseMaybe datePicture dfp + +-- | Translate from a Windows API hours, minute, and second format picture to +-- the closest corresponding format string used by +-- 'Data.Time.Format.formatTime'. +fromTimeFormatPicture :: String -> Maybe String +fromTimeFormatPicture tfp = + fmap (concatMap fromTFP) $ parseMaybe timePicture tfp
Win32.cabal view
@@ -1,5 +1,5 @@ name: Win32-version: 2.9.0.0+version: 2.10.0.0 license: BSD3 license-file: LICENSE author: Alastair Reid, shelarcy, Tamar Christina
changelog.md view
@@ -1,12 +1,28 @@ # Changelog for [`Win32` package](http://hackage.haskell.org/package/Win32) +## 2.10.0.0 September 2020++* Add function `isWindowVisible`+* Add function `getLastInputInfo`+* Add function `getTickCount`+* Add function `getIdleTime`+* Add `enumSystemLocalesEx`, `enumSystemLocalesEx'`,+ `getSystemDefaultLocaleName`, `getUserDefaultLocaleName`, `isValidLocaleName`,+ `getLocaleInfoEx`, `getTimeFormatEx` and `lCMapStringEx`+* Add `trySized` - similar to `try` but for API calls that return the required+ size of the buffer when passed a buffer size of zero.+* Add `fromDateFormatPciture` and `fromTimeFormatPicture`, to translate from+ Windows date and time format pictures to format strings used by the `time`+ package.+* Renamed fields of `COORD` and `SMALL_RECT` to avoid name clashes. (See #157)+ ## 2.9.0.0 June 2020 * `setWindowClosure` now returns the old window closure.-* `defWindowProc` now assumes the data stored in `GWLP\_USERDATA` +* `defWindowProc` now assumes the data stored in `GWLP\_USERDATA` is the window closure (in line with `setWindowClosure` and the supplied C `genericWndProc`)-* `defWindowProc` now frees the window closure +* `defWindowProc` now frees the window closure * `getMessage` and `peekMessage` test for -1 to identify the error condition * Support creating symbolic links without Administrator privilege (See #147) * Support for `winio` the new Windows I/O manager.
include/alphablend.h view
@@ -1,6 +1,6 @@ #ifndef _ALPHABLEND_H #define _ALPHABLEND_H-#define WINVER 0x0500+ #include <windows.h> BOOL c_AlphaBlend ( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest