aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--RegUtils.hs44
1 files changed, 21 insertions, 23 deletions
diff --git a/RegUtils.hs b/RegUtils.hs
index ba997a1..eccb6ad 100644
--- a/RegUtils.hs
+++ b/RegUtils.hs
@@ -16,6 +16,7 @@ import Foreign.ForeignPtr ( withForeignPtr )
import Foreign.Marshal.Alloc ( alloca, allocaBytes )
import Foreign.Ptr ( castPtr, plusPtr )
import Foreign.Storable ( peek, poke, sizeOf )
+import Graphics.Win32.Window ( sendMessage )
import System.IO.Error ( mkIOError, doesNotExistErrorType )
import System.Win32.Types
import System.Win32.Registry
@@ -23,25 +24,25 @@ import System.Win32.Registry
getType :: HKEY -> String -> String -> IO (Maybe RegValueType)
getType key subKeyPath valueName =
bracket (regOpenKey key subKeyPath) regCloseKey $ \key ->
- withForeignPtr key $ \keyPtr ->
- withTString valueName $ \valueNamePtr ->
- alloca $ \typePtr -> do
- ret <- c_RegQueryValueEx keyPtr valueNamePtr nullPtr typePtr nullPtr nullPtr
+ withForeignPtr key $ \p_key ->
+ withTString valueName $ \p_valueName ->
+ alloca $ \p_type -> do
+ ret <- c_RegQueryValueEx p_key p_valueName nullPtr p_type nullPtr nullPtr
case ret of
0x0 -> do
- type' <- peek typePtr
- return $ Just type'
+ type_ <- peek p_type
+ return $ Just type_
0x2 -> return Nothing
_ -> failWith "RegQueryValueEx" ret
getString :: HKEY -> String -> String -> IO String
getString key subKeyPath valueName =
bracket (regOpenKey key subKeyPath) regCloseKey $ \key ->
- withForeignPtr key $ \keyPtr ->
- withTString valueName $ \valueNamePtr ->
+ withForeignPtr key $ \p_key ->
+ withTString valueName $ \p_valueName ->
alloca $ \dataSizePtr -> do
poke dataSizePtr 0
- ret <- c_RegQueryValueEx keyPtr valueNamePtr nullPtr nullPtr nullPtr dataSizePtr
+ ret <- c_RegQueryValueEx p_key p_valueName nullPtr nullPtr nullPtr dataSizePtr
case ret of
0x0 -> do
dataSize <- peek dataSizePtr
@@ -50,7 +51,7 @@ getString key subKeyPath valueName =
allocaBytes (fromIntegral newDataSize) $ \dataPtr -> do
poke (castPtr $ plusPtr dataPtr $ fromIntegral dataSize) '\0'
failUnlessSuccess "RegQueryValueEx" $
- c_RegQueryValueEx keyPtr valueNamePtr nullPtr nullPtr dataPtr dataSizePtr
+ c_RegQueryValueEx p_key p_valueName nullPtr nullPtr dataPtr dataSizePtr
peekTString $ castPtr dataPtr
0x2 -> ioError $ mkIOError doesNotExistErrorType "RegQueryValueEx" Nothing $ Just (subKeyPath ++ "\\" ++ valueName)
_ -> failWith "RegQueryValueEx" ret
@@ -58,31 +59,28 @@ getString key subKeyPath valueName =
setString :: HKEY -> String -> String -> String -> IO ()
setString key subKeyPath valueName valueValue =
bracket (regOpenKey key subKeyPath) regCloseKey $ \subKey ->
- withTString valueValue $ \ptr -> do
- type' <- getType key subKeyPath valueName
- regSetValueEx subKey valueName (fromMaybe rEG_SZ type') ptr $ (length valueValue + 1) * sizeOf (undefined :: TCHAR)
+ withTString valueValue $ \p_valueValue -> do
+ type_ <- getType key subKeyPath valueName
+ regSetValueEx subKey valueName (fromMaybe rEG_SZ type_) p_valueValue $ (length valueValue + 1) * sizeOf (undefined :: TCHAR)
notifyEnvironmentUpdate
-foreign import ccall "BroadcastSystemMessageW"
- c_BroadcastSystemMessage :: DWORD -> LPDWORD -> UINT -> WPARAM -> LPARAM -> IO LONG
-
notifyEnvironmentUpdate :: IO ()
notifyEnvironmentUpdate =
- withTString "Environment" $ \lparamPtr -> do
- let wparam = fromIntegral $ castPtrToUINTPtr nullPtr
- let lparam = fromIntegral $ castPtrToUINTPtr lparamPtr
- c_BroadcastSystemMessage bSF_POSTMESSAGE nullPtr wM_SETTINGCHANGE wparam lparam
+ withTString "Environment" $ \p_lparam -> do
+ let wparam = 0
+ let lparam = fromIntegral $ castPtrToUINTPtr p_lparam
+ let hwnd = castUINTPtrToPtr 0xffff
+ sendMessage hwnd wM_SETTINGCHANGE wparam lparam
return ()
where
- bSF_POSTMESSAGE = 0x10
wM_SETTINGCHANGE = 0x1A
delValue :: HKEY -> String -> String -> IO ()
delValue key subKeyPath valueName =
bracket (regOpenKey key subKeyPath) regCloseKey $ \subKey ->
withForeignPtr subKey $ \subKeyPtr ->
- withTString valueName $ \valueNamePtr -> do
- ret <- c_RegDeleteValue subKeyPtr valueNamePtr
+ withTString valueName $ \p_valueName -> do
+ ret <- c_RegDeleteValue subKeyPtr p_valueName
notifyEnvironmentUpdate
case ret of
0x0 -> return ()