diff --git a/src/Codec/Binary/UTF8/Width.hs b/src/Codec/Binary/UTF8/Width.hs
--- a/src/Codec/Binary/UTF8/Width.hs
+++ b/src/Codec/Binary/UTF8/Width.hs
@@ -1,6 +1,6 @@
 -- Copyright 2009 Corey O'Connor
 {-# OPTIONS_GHC -D_XOPEN_SOURCE -fno-cse #-}
-{-# LANGUAGE ForeignFunctionInterface #-}
+{-# LANGUAGE ForeignFunctionInterface, BangPatterns #-}
 {-# INCLUDE <wchar.h> #-}
 module Codec.Binary.UTF8.Width ( wcwidth
                                , wcswidth
@@ -17,24 +17,24 @@
 import System.IO.Unsafe
 
 wcwidth :: Char -> Int
-wcwidth c = unsafePerformIO (withCWString [c] $ \ws -> do
+wcwidth c = unsafePerformIO (withCWString [c] $! \ws -> do
     wc <- peek ws
     -- putStr $ "wcwidth(0x" ++ showHex (fromEnum wc) "" ++ ")"
-    w <- wcwidth' wc  >>= return . fromIntegral
+    let !w = fromIntegral $! wcwidth' wc
     -- putStrLn $ " -> " ++ show w
     return w
     )
 {-# NOINLINE wcwidth #-}
 
-foreign import ccall unsafe "mk_wcwidth" wcwidth' :: CWchar -> IO CInt
+foreign import ccall unsafe "mk_wcwidth" wcwidth' :: CWchar -> CInt
 
 wcswidth :: String -> Int
-wcswidth str = unsafePerformIO (withCWString str $ \ws -> do
+wcswidth str = unsafePerformIO (withCWStringLen str $! \(ws, ws_len) -> do
     -- putStr $ "wcswidth(...)"
-    w <- wcswidth' ws  >>= return . fromIntegral
+    let !w = fromIntegral $! wcswidth' ws (fromIntegral ws_len)
     -- putStrLn $ " -> " ++ show w
     return w
     )
 {-# NOINLINE wcswidth #-}
 
-foreign import ccall unsafe "mk_wcswidth" wcswidth' :: Ptr CWchar -> IO CInt
+foreign import ccall unsafe "mk_wcswidth" wcswidth' :: Ptr CWchar -> CSize -> CInt
diff --git a/vty.cabal b/vty.cabal
--- a/vty.cabal
+++ b/vty.cabal
@@ -1,5 +1,5 @@
 Name:                vty
-Version:             4.0.0
+Version:             4.0.0.1
 License:             BSD3
 License-file:        LICENSE
 Author:              Stefan O'Rear, Corey O'Connor
