@@ -23,8 +23,8 @@ import Foreign.ForeignPtr (withForeignPtr)
23
23
import Foreign.Marshal.Utils (maybeWith )
24
24
import Foreign.Marshal.Alloc (allocaBytes )
25
25
import Foreign.Marshal.Array (allocaArray )
26
- import Foreign.Ptr (FunPtr , Ptr , castFunPtrToPtr , castPtr , nullPtr )
27
- import Foreign.Ptr (intPtrToPtr , castPtrToFunPtr , freeHaskellFunPtr )
26
+ import Foreign.Ptr (FunPtr , Ptr , castFunPtrToPtr , nullPtr )
27
+ import Foreign.Ptr (intPtrToPtr , castPtrToFunPtr , freeHaskellFunPtr , ptrToIntPtr )
28
28
import Foreign.Storable (pokeByteOff )
29
29
import Foreign.C.Types (CIntPtr (.. ))
30
30
import Graphics.Win32.GDI.Types (HBITMAP , HCURSOR , HDC , HDWP , HRGN , HWND , PRGN )
@@ -204,6 +204,9 @@ type WindowClosure = HWND -> WindowMessage -> WPARAM -> LPARAM -> IO LRESULT
204
204
foreign import WINDOWS_CCONV " wrapper"
205
205
mkWindowClosure :: WindowClosure -> IO (FunPtr WindowClosure )
206
206
207
+ mkCIntPtr :: FunPtr a -> CIntPtr
208
+ mkCIntPtr = fromIntegral . ptrToIntPtr . castFunPtrToPtr
209
+
207
210
-- | The standard C wndproc for every window class registered by
208
211
-- 'registerClass' is a C function pointer provided with this library. It in
209
212
-- turn delegates to a Haskell function pointer stored in 'gWLP_USERDATA'.
@@ -218,10 +221,10 @@ setWindowClosure :: HWND -> WindowClosure -> IO (Maybe (FunPtr WindowClosure))
218
221
setWindowClosure wnd closure = do
219
222
fp <- mkWindowClosure closure
220
223
fpOld <- c_SetWindowLongPtr wnd (# {const GWLP_USERDATA })
221
- (castPtr (castFunPtrToPtr fp) )
222
- if fpOld == nullPtr
224
+ (mkCIntPtr fp )
225
+ if fpOld == 0
223
226
then return Nothing
224
- else return $ Just $ castPtrToFunPtr fpOld
227
+ else return $ Just $ castPtrToFunPtr $ intPtrToPtr $ fromIntegral fpOld
225
228
226
229
{- Note [SetWindowLongPtrW]
227
230
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -240,7 +243,7 @@ foreign import WINDOWS_CCONV unsafe "windows.h SetWindowLongPtrW"
240
243
#else
241
244
# error Unknown mingw32 arch
242
245
#endif
243
- c_SetWindowLongPtr :: HWND -> INT -> Ptr LONG -> IO (Ptr LONG )
246
+ c_SetWindowLongPtr :: HWND -> INT -> LONG_PTR -> IO (LONG_PTR )
244
247
245
248
#if defined(i386_HOST_ARCH)
246
249
foreign import WINDOWS_CCONV unsafe " windows.h GetWindowLongW"
0 commit comments