diff --git a/GI/Gdk/Functions.hs b/GI/Gdk/Functions.hs
--- a/GI/Gdk/Functions.hs
+++ b/GI/Gdk/Functions.hs
@@ -1224,8 +1224,7 @@
     actualLength' <- peek actualLength
     let result' = (/= 0) result
     actualPropertyType' <- peek actualPropertyType
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    actualPropertyType'' <- (\x -> Atom <$> newForeignPtr_ x) actualPropertyType'
+    actualPropertyType'' <- (newPtr Atom) actualPropertyType'
     actualFormat' <- peek actualFormat
     data_' <- peek data_
     data_'' <- (unpackByteStringWithLength actualLength') data_'
@@ -2424,8 +2423,7 @@
     let context' = unsafeManagedPtrCastPtr context
     result <- gdk_drag_get_selection context'
     checkUnexpectedReturnNULL "gdk_drag_get_selection" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Atom) result
     touchManagedPtr context
     return result'
 
diff --git a/GI/Gdk/Objects/Device.hs b/GI/Gdk/Objects/Device.hs
--- a/GI/Gdk/Objects/Device.hs
+++ b/GI/Gdk/Objects/Device.hs
@@ -1315,9 +1315,8 @@
 deviceListAxes _obj = liftIO $ do
     let _obj' = unsafeManagedPtrCastPtr _obj
     result <- gdk_device_list_axes _obj'
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
     result' <- unpackGList result
-    result'' <- mapM (\x -> Atom <$> newForeignPtr_ x) result'
+    result'' <- mapM (newPtr Atom) result'
     g_list_free result
     touchManagedPtr _obj
     return result''
diff --git a/GI/Gdk/Objects/DragContext.hs b/GI/Gdk/Objects/DragContext.hs
--- a/GI/Gdk/Objects/DragContext.hs
+++ b/GI/Gdk/Objects/DragContext.hs
@@ -365,9 +365,8 @@
 dragContextListTargets _obj = liftIO $ do
     let _obj' = unsafeManagedPtrCastPtr _obj
     result <- gdk_drag_context_list_targets _obj'
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
     result' <- unpackGList result
-    result'' <- mapM (\x -> Atom <$> newForeignPtr_ x) result'
+    result'' <- mapM (newPtr Atom) result'
     touchManagedPtr _obj
     return result''
 
diff --git a/GI/Gdk/Objects/Screen.hs b/GI/Gdk/Objects/Screen.hs
--- a/GI/Gdk/Objects/Screen.hs
+++ b/GI/Gdk/Objects/Screen.hs
@@ -618,8 +618,7 @@
     let _obj' = unsafeManagedPtrCastPtr _obj
     result <- gdk_screen_get_font_options _obj'
     maybeResult <- convertIfNonNull result $ \result' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        result'' <- (\x -> Cairo.FontOptions <$> newForeignPtr_ x) result'
+        result'' <- (newPtr Cairo.FontOptions) result'
         return result''
     touchManagedPtr _obj
     return maybeResult
diff --git a/GI/Gdk/Structs/Atom.hs b/GI/Gdk/Structs/Atom.hs
--- a/GI/Gdk/Structs/Atom.hs
+++ b/GI/Gdk/Structs/Atom.hs
@@ -46,6 +46,12 @@
 import GI.Gdk.Callbacks
 
 newtype Atom = Atom (ForeignPtr Atom)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr Atom where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noAtom :: Maybe Atom
 noAtom = Nothing
 
@@ -107,8 +113,7 @@
     let onlyIfExists' = (fromIntegral . fromEnum) onlyIfExists
     result <- gdk_atom_intern atomName' onlyIfExists'
     checkUnexpectedReturnNULL "gdk_atom_intern" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Atom) result
     freeMem atomName'
     return result'
 
@@ -133,8 +138,7 @@
     atomName' <- textToCString atomName
     result <- gdk_atom_intern_static_string atomName'
     checkUnexpectedReturnNULL "gdk_atom_intern_static_string" result
-    -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-    result' <- (\x -> Atom <$> newForeignPtr_ x) result
+    result' <- (newPtr Atom) result
     freeMem atomName'
     return result'
 
diff --git a/GI/Gdk/Structs/Atom.hs-boot b/GI/Gdk/Structs/Atom.hs-boot
--- a/GI/Gdk/Structs/Atom.hs-boot
+++ b/GI/Gdk/Structs/Atom.hs-boot
@@ -8,4 +8,5 @@
 import qualified Data.Map as Map
 
 newtype Atom = Atom (ForeignPtr Atom)
+instance WrappedPtr Atom where
 data AtomNameMethodInfo
diff --git a/GI/Gdk/Structs/EventAny.hs b/GI/Gdk/Structs/EventAny.hs
--- a/GI/Gdk/Structs/EventAny.hs
+++ b/GI/Gdk/Structs/EventAny.hs
@@ -54,9 +54,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventAny = EventAny (ForeignPtr EventAny)
+instance WrappedPtr EventAny where
+    wrappedPtrCalloc = callocBytes 24
+    wrappedPtrCopy = copyPtr 24
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventAny` struct initialized to zero.
 newZeroEventAny :: MonadIO m => m EventAny
-newZeroEventAny = liftIO $ callocBytes 24 >>= wrapPtr EventAny
+newZeroEventAny = liftIO $ wrappedPtrCalloc >>= wrapPtr EventAny
 
 instance tag ~ 'AttrSet => Constructible EventAny tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventAny.hs-boot b/GI/Gdk/Structs/EventAny.hs-boot
--- a/GI/Gdk/Structs/EventAny.hs-boot
+++ b/GI/Gdk/Structs/EventAny.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventAny = EventAny (ForeignPtr EventAny)
+instance WrappedPtr EventAny where
diff --git a/GI/Gdk/Structs/EventButton.hs b/GI/Gdk/Structs/EventButton.hs
--- a/GI/Gdk/Structs/EventButton.hs
+++ b/GI/Gdk/Structs/EventButton.hs
@@ -139,9 +139,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventButton = EventButton (ForeignPtr EventButton)
+instance WrappedPtr EventButton where
+    wrappedPtrCalloc = callocBytes 80
+    wrappedPtrCopy = copyPtr 80
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventButton` struct initialized to zero.
 newZeroEventButton :: MonadIO m => m EventButton
-newZeroEventButton = liftIO $ callocBytes 80 >>= wrapPtr EventButton
+newZeroEventButton = liftIO $ wrappedPtrCalloc >>= wrapPtr EventButton
 
 instance tag ~ 'AttrSet => Constructible EventButton tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventButton.hs-boot b/GI/Gdk/Structs/EventButton.hs-boot
--- a/GI/Gdk/Structs/EventButton.hs-boot
+++ b/GI/Gdk/Structs/EventButton.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventButton = EventButton (ForeignPtr EventButton)
+instance WrappedPtr EventButton where
diff --git a/GI/Gdk/Structs/EventConfigure.hs b/GI/Gdk/Structs/EventConfigure.hs
--- a/GI/Gdk/Structs/EventConfigure.hs
+++ b/GI/Gdk/Structs/EventConfigure.hs
@@ -76,9 +76,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventConfigure = EventConfigure (ForeignPtr EventConfigure)
+instance WrappedPtr EventConfigure where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventConfigure` struct initialized to zero.
 newZeroEventConfigure :: MonadIO m => m EventConfigure
-newZeroEventConfigure = liftIO $ callocBytes 40 >>= wrapPtr EventConfigure
+newZeroEventConfigure = liftIO $ wrappedPtrCalloc >>= wrapPtr EventConfigure
 
 instance tag ~ 'AttrSet => Constructible EventConfigure tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventConfigure.hs-boot b/GI/Gdk/Structs/EventConfigure.hs-boot
--- a/GI/Gdk/Structs/EventConfigure.hs-boot
+++ b/GI/Gdk/Structs/EventConfigure.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventConfigure = EventConfigure (ForeignPtr EventConfigure)
+instance WrappedPtr EventConfigure where
diff --git a/GI/Gdk/Structs/EventCrossing.hs b/GI/Gdk/Structs/EventCrossing.hs
--- a/GI/Gdk/Structs/EventCrossing.hs
+++ b/GI/Gdk/Structs/EventCrossing.hs
@@ -113,9 +113,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventCrossing = EventCrossing (ForeignPtr EventCrossing)
+instance WrappedPtr EventCrossing where
+    wrappedPtrCalloc = callocBytes 88
+    wrappedPtrCopy = copyPtr 88
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventCrossing` struct initialized to zero.
 newZeroEventCrossing :: MonadIO m => m EventCrossing
-newZeroEventCrossing = liftIO $ callocBytes 88 >>= wrapPtr EventCrossing
+newZeroEventCrossing = liftIO $ wrappedPtrCalloc >>= wrapPtr EventCrossing
 
 instance tag ~ 'AttrSet => Constructible EventCrossing tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventCrossing.hs-boot b/GI/Gdk/Structs/EventCrossing.hs-boot
--- a/GI/Gdk/Structs/EventCrossing.hs-boot
+++ b/GI/Gdk/Structs/EventCrossing.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventCrossing = EventCrossing (ForeignPtr EventCrossing)
+instance WrappedPtr EventCrossing where
diff --git a/GI/Gdk/Structs/EventDND.hs b/GI/Gdk/Structs/EventDND.hs
--- a/GI/Gdk/Structs/EventDND.hs
+++ b/GI/Gdk/Structs/EventDND.hs
@@ -77,9 +77,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventDND = EventDND (ForeignPtr EventDND)
+instance WrappedPtr EventDND where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventDND` struct initialized to zero.
 newZeroEventDND :: MonadIO m => m EventDND
-newZeroEventDND = liftIO $ callocBytes 40 >>= wrapPtr EventDND
+newZeroEventDND = liftIO $ wrappedPtrCalloc >>= wrapPtr EventDND
 
 instance tag ~ 'AttrSet => Constructible EventDND tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventDND.hs-boot b/GI/Gdk/Structs/EventDND.hs-boot
--- a/GI/Gdk/Structs/EventDND.hs-boot
+++ b/GI/Gdk/Structs/EventDND.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventDND = EventDND (ForeignPtr EventDND)
+instance WrappedPtr EventDND where
diff --git a/GI/Gdk/Structs/EventExpose.hs b/GI/Gdk/Structs/EventExpose.hs
--- a/GI/Gdk/Structs/EventExpose.hs
+++ b/GI/Gdk/Structs/EventExpose.hs
@@ -74,9 +74,14 @@
 import qualified GI.Cairo as Cairo
 
 newtype EventExpose = EventExpose (ForeignPtr EventExpose)
+instance WrappedPtr EventExpose where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventExpose` struct initialized to zero.
 newZeroEventExpose :: MonadIO m => m EventExpose
-newZeroEventExpose = liftIO $ callocBytes 56 >>= wrapPtr EventExpose
+newZeroEventExpose = liftIO $ wrappedPtrCalloc >>= wrapPtr EventExpose
 
 instance tag ~ 'AttrSet => Constructible EventExpose tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventExpose.hs-boot b/GI/Gdk/Structs/EventExpose.hs-boot
--- a/GI/Gdk/Structs/EventExpose.hs-boot
+++ b/GI/Gdk/Structs/EventExpose.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventExpose = EventExpose (ForeignPtr EventExpose)
+instance WrappedPtr EventExpose where
diff --git a/GI/Gdk/Structs/EventFocus.hs b/GI/Gdk/Structs/EventFocus.hs
--- a/GI/Gdk/Structs/EventFocus.hs
+++ b/GI/Gdk/Structs/EventFocus.hs
@@ -58,9 +58,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventFocus = EventFocus (ForeignPtr EventFocus)
+instance WrappedPtr EventFocus where
+    wrappedPtrCalloc = callocBytes 24
+    wrappedPtrCopy = copyPtr 24
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventFocus` struct initialized to zero.
 newZeroEventFocus :: MonadIO m => m EventFocus
-newZeroEventFocus = liftIO $ callocBytes 24 >>= wrapPtr EventFocus
+newZeroEventFocus = liftIO $ wrappedPtrCalloc >>= wrapPtr EventFocus
 
 instance tag ~ 'AttrSet => Constructible EventFocus tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventFocus.hs-boot b/GI/Gdk/Structs/EventFocus.hs-boot
--- a/GI/Gdk/Structs/EventFocus.hs-boot
+++ b/GI/Gdk/Structs/EventFocus.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventFocus = EventFocus (ForeignPtr EventFocus)
+instance WrappedPtr EventFocus where
diff --git a/GI/Gdk/Structs/EventGrabBroken.hs b/GI/Gdk/Structs/EventGrabBroken.hs
--- a/GI/Gdk/Structs/EventGrabBroken.hs
+++ b/GI/Gdk/Structs/EventGrabBroken.hs
@@ -75,9 +75,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventGrabBroken = EventGrabBroken (ForeignPtr EventGrabBroken)
+instance WrappedPtr EventGrabBroken where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventGrabBroken` struct initialized to zero.
 newZeroEventGrabBroken :: MonadIO m => m EventGrabBroken
-newZeroEventGrabBroken = liftIO $ callocBytes 40 >>= wrapPtr EventGrabBroken
+newZeroEventGrabBroken = liftIO $ wrappedPtrCalloc >>= wrapPtr EventGrabBroken
 
 instance tag ~ 'AttrSet => Constructible EventGrabBroken tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventGrabBroken.hs-boot b/GI/Gdk/Structs/EventGrabBroken.hs-boot
--- a/GI/Gdk/Structs/EventGrabBroken.hs-boot
+++ b/GI/Gdk/Structs/EventGrabBroken.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventGrabBroken = EventGrabBroken (ForeignPtr EventGrabBroken)
+instance WrappedPtr EventGrabBroken where
diff --git a/GI/Gdk/Structs/EventKey.hs b/GI/Gdk/Structs/EventKey.hs
--- a/GI/Gdk/Structs/EventKey.hs
+++ b/GI/Gdk/Structs/EventKey.hs
@@ -101,9 +101,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventKey = EventKey (ForeignPtr EventKey)
+instance WrappedPtr EventKey where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventKey` struct initialized to zero.
 newZeroEventKey :: MonadIO m => m EventKey
-newZeroEventKey = liftIO $ callocBytes 56 >>= wrapPtr EventKey
+newZeroEventKey = liftIO $ wrappedPtrCalloc >>= wrapPtr EventKey
 
 instance tag ~ 'AttrSet => Constructible EventKey tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventKey.hs-boot b/GI/Gdk/Structs/EventKey.hs-boot
--- a/GI/Gdk/Structs/EventKey.hs-boot
+++ b/GI/Gdk/Structs/EventKey.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventKey = EventKey (ForeignPtr EventKey)
+instance WrappedPtr EventKey where
diff --git a/GI/Gdk/Structs/EventMotion.hs b/GI/Gdk/Structs/EventMotion.hs
--- a/GI/Gdk/Structs/EventMotion.hs
+++ b/GI/Gdk/Structs/EventMotion.hs
@@ -107,9 +107,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventMotion = EventMotion (ForeignPtr EventMotion)
+instance WrappedPtr EventMotion where
+    wrappedPtrCalloc = callocBytes 80
+    wrappedPtrCopy = copyPtr 80
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventMotion` struct initialized to zero.
 newZeroEventMotion :: MonadIO m => m EventMotion
-newZeroEventMotion = liftIO $ callocBytes 80 >>= wrapPtr EventMotion
+newZeroEventMotion = liftIO $ wrappedPtrCalloc >>= wrapPtr EventMotion
 
 instance tag ~ 'AttrSet => Constructible EventMotion tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventMotion.hs-boot b/GI/Gdk/Structs/EventMotion.hs-boot
--- a/GI/Gdk/Structs/EventMotion.hs-boot
+++ b/GI/Gdk/Structs/EventMotion.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventMotion = EventMotion (ForeignPtr EventMotion)
+instance WrappedPtr EventMotion where
diff --git a/GI/Gdk/Structs/EventOwnerChange.hs b/GI/Gdk/Structs/EventOwnerChange.hs
--- a/GI/Gdk/Structs/EventOwnerChange.hs
+++ b/GI/Gdk/Structs/EventOwnerChange.hs
@@ -86,9 +86,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventOwnerChange = EventOwnerChange (ForeignPtr EventOwnerChange)
+instance WrappedPtr EventOwnerChange where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventOwnerChange` struct initialized to zero.
 newZeroEventOwnerChange :: MonadIO m => m EventOwnerChange
-newZeroEventOwnerChange = liftIO $ callocBytes 56 >>= wrapPtr EventOwnerChange
+newZeroEventOwnerChange = liftIO $ wrappedPtrCalloc >>= wrapPtr EventOwnerChange
 
 instance tag ~ 'AttrSet => Constructible EventOwnerChange tag where
     new _ attrs = do
@@ -247,8 +252,7 @@
 eventOwnerChangeReadSelection s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 40) :: IO (Ptr Atom)
     result <- convertIfNonNull val $ \val' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        val'' <- (\x -> Atom <$> newForeignPtr_ x) val'
+        val'' <- (newPtr Atom) val'
         return val''
     return result
 
diff --git a/GI/Gdk/Structs/EventOwnerChange.hs-boot b/GI/Gdk/Structs/EventOwnerChange.hs-boot
--- a/GI/Gdk/Structs/EventOwnerChange.hs-boot
+++ b/GI/Gdk/Structs/EventOwnerChange.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventOwnerChange = EventOwnerChange (ForeignPtr EventOwnerChange)
+instance WrappedPtr EventOwnerChange where
diff --git a/GI/Gdk/Structs/EventProperty.hs b/GI/Gdk/Structs/EventProperty.hs
--- a/GI/Gdk/Structs/EventProperty.hs
+++ b/GI/Gdk/Structs/EventProperty.hs
@@ -71,9 +71,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventProperty = EventProperty (ForeignPtr EventProperty)
+instance WrappedPtr EventProperty where
+    wrappedPtrCalloc = callocBytes 40
+    wrappedPtrCopy = copyPtr 40
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventProperty` struct initialized to zero.
 newZeroEventProperty :: MonadIO m => m EventProperty
-newZeroEventProperty = liftIO $ callocBytes 40 >>= wrapPtr EventProperty
+newZeroEventProperty = liftIO $ wrappedPtrCalloc >>= wrapPtr EventProperty
 
 instance tag ~ 'AttrSet => Constructible EventProperty tag where
     new _ attrs = do
@@ -173,8 +178,7 @@
 eventPropertyReadAtom s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 24) :: IO (Ptr Atom)
     result <- convertIfNonNull val $ \val' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        val'' <- (\x -> Atom <$> newForeignPtr_ x) val'
+        val'' <- (newPtr Atom) val'
         return val''
     return result
 
diff --git a/GI/Gdk/Structs/EventProperty.hs-boot b/GI/Gdk/Structs/EventProperty.hs-boot
--- a/GI/Gdk/Structs/EventProperty.hs-boot
+++ b/GI/Gdk/Structs/EventProperty.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventProperty = EventProperty (ForeignPtr EventProperty)
+instance WrappedPtr EventProperty where
diff --git a/GI/Gdk/Structs/EventProximity.hs b/GI/Gdk/Structs/EventProximity.hs
--- a/GI/Gdk/Structs/EventProximity.hs
+++ b/GI/Gdk/Structs/EventProximity.hs
@@ -73,9 +73,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventProximity = EventProximity (ForeignPtr EventProximity)
+instance WrappedPtr EventProximity where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventProximity` struct initialized to zero.
 newZeroEventProximity :: MonadIO m => m EventProximity
-newZeroEventProximity = liftIO $ callocBytes 32 >>= wrapPtr EventProximity
+newZeroEventProximity = liftIO $ wrappedPtrCalloc >>= wrapPtr EventProximity
 
 instance tag ~ 'AttrSet => Constructible EventProximity tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventProximity.hs-boot b/GI/Gdk/Structs/EventProximity.hs-boot
--- a/GI/Gdk/Structs/EventProximity.hs-boot
+++ b/GI/Gdk/Structs/EventProximity.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventProximity = EventProximity (ForeignPtr EventProximity)
+instance WrappedPtr EventProximity where
diff --git a/GI/Gdk/Structs/EventScroll.hs b/GI/Gdk/Structs/EventScroll.hs
--- a/GI/Gdk/Structs/EventScroll.hs
+++ b/GI/Gdk/Structs/EventScroll.hs
@@ -120,9 +120,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventScroll = EventScroll (ForeignPtr EventScroll)
+instance WrappedPtr EventScroll where
+    wrappedPtrCalloc = callocBytes 88
+    wrappedPtrCopy = copyPtr 88
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventScroll` struct initialized to zero.
 newZeroEventScroll :: MonadIO m => m EventScroll
-newZeroEventScroll = liftIO $ callocBytes 88 >>= wrapPtr EventScroll
+newZeroEventScroll = liftIO $ wrappedPtrCalloc >>= wrapPtr EventScroll
 
 instance tag ~ 'AttrSet => Constructible EventScroll tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventScroll.hs-boot b/GI/Gdk/Structs/EventScroll.hs-boot
--- a/GI/Gdk/Structs/EventScroll.hs-boot
+++ b/GI/Gdk/Structs/EventScroll.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventScroll = EventScroll (ForeignPtr EventScroll)
+instance WrappedPtr EventScroll where
diff --git a/GI/Gdk/Structs/EventSelection.hs b/GI/Gdk/Structs/EventSelection.hs
--- a/GI/Gdk/Structs/EventSelection.hs
+++ b/GI/Gdk/Structs/EventSelection.hs
@@ -87,9 +87,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventSelection = EventSelection (ForeignPtr EventSelection)
+instance WrappedPtr EventSelection where
+    wrappedPtrCalloc = callocBytes 64
+    wrappedPtrCopy = copyPtr 64
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventSelection` struct initialized to zero.
 newZeroEventSelection :: MonadIO m => m EventSelection
-newZeroEventSelection = liftIO $ callocBytes 64 >>= wrapPtr EventSelection
+newZeroEventSelection = liftIO $ wrappedPtrCalloc >>= wrapPtr EventSelection
 
 instance tag ~ 'AttrSet => Constructible EventSelection tag where
     new _ attrs = do
@@ -189,8 +194,7 @@
 eventSelectionReadSelection s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 24) :: IO (Ptr Atom)
     result <- convertIfNonNull val $ \val' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        val'' <- (\x -> Atom <$> newForeignPtr_ x) val'
+        val'' <- (newPtr Atom) val'
         return val''
     return result
 
@@ -222,8 +226,7 @@
 eventSelectionReadTarget s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 32) :: IO (Ptr Atom)
     result <- convertIfNonNull val $ \val' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        val'' <- (\x -> Atom <$> newForeignPtr_ x) val'
+        val'' <- (newPtr Atom) val'
         return val''
     return result
 
@@ -255,8 +258,7 @@
 eventSelectionReadProperty s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 40) :: IO (Ptr Atom)
     result <- convertIfNonNull val $ \val' -> do
-        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
-        val'' <- (\x -> Atom <$> newForeignPtr_ x) val'
+        val'' <- (newPtr Atom) val'
         return val''
     return result
 
diff --git a/GI/Gdk/Structs/EventSelection.hs-boot b/GI/Gdk/Structs/EventSelection.hs-boot
--- a/GI/Gdk/Structs/EventSelection.hs-boot
+++ b/GI/Gdk/Structs/EventSelection.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventSelection = EventSelection (ForeignPtr EventSelection)
+instance WrappedPtr EventSelection where
diff --git a/GI/Gdk/Structs/EventSetting.hs b/GI/Gdk/Structs/EventSetting.hs
--- a/GI/Gdk/Structs/EventSetting.hs
+++ b/GI/Gdk/Structs/EventSetting.hs
@@ -65,9 +65,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventSetting = EventSetting (ForeignPtr EventSetting)
+instance WrappedPtr EventSetting where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventSetting` struct initialized to zero.
 newZeroEventSetting :: MonadIO m => m EventSetting
-newZeroEventSetting = liftIO $ callocBytes 32 >>= wrapPtr EventSetting
+newZeroEventSetting = liftIO $ wrappedPtrCalloc >>= wrapPtr EventSetting
 
 instance tag ~ 'AttrSet => Constructible EventSetting tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventSetting.hs-boot b/GI/Gdk/Structs/EventSetting.hs-boot
--- a/GI/Gdk/Structs/EventSetting.hs-boot
+++ b/GI/Gdk/Structs/EventSetting.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventSetting = EventSetting (ForeignPtr EventSetting)
+instance WrappedPtr EventSetting where
diff --git a/GI/Gdk/Structs/EventTouch.hs b/GI/Gdk/Structs/EventTouch.hs
--- a/GI/Gdk/Structs/EventTouch.hs
+++ b/GI/Gdk/Structs/EventTouch.hs
@@ -123,9 +123,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventTouch = EventTouch (ForeignPtr EventTouch)
+instance WrappedPtr EventTouch where
+    wrappedPtrCalloc = callocBytes 96
+    wrappedPtrCopy = copyPtr 96
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventTouch` struct initialized to zero.
 newZeroEventTouch :: MonadIO m => m EventTouch
-newZeroEventTouch = liftIO $ callocBytes 96 >>= wrapPtr EventTouch
+newZeroEventTouch = liftIO $ wrappedPtrCalloc >>= wrapPtr EventTouch
 
 instance tag ~ 'AttrSet => Constructible EventTouch tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventTouch.hs-boot b/GI/Gdk/Structs/EventTouch.hs-boot
--- a/GI/Gdk/Structs/EventTouch.hs-boot
+++ b/GI/Gdk/Structs/EventTouch.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventTouch = EventTouch (ForeignPtr EventTouch)
+instance WrappedPtr EventTouch where
diff --git a/GI/Gdk/Structs/EventTouchpadPinch.hs b/GI/Gdk/Structs/EventTouchpadPinch.hs
--- a/GI/Gdk/Structs/EventTouchpadPinch.hs
+++ b/GI/Gdk/Structs/EventTouchpadPinch.hs
@@ -124,9 +124,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventTouchpadPinch = EventTouchpadPinch (ForeignPtr EventTouchpadPinch)
+instance WrappedPtr EventTouchpadPinch where
+    wrappedPtrCalloc = callocBytes 104
+    wrappedPtrCopy = copyPtr 104
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventTouchpadPinch` struct initialized to zero.
 newZeroEventTouchpadPinch :: MonadIO m => m EventTouchpadPinch
-newZeroEventTouchpadPinch = liftIO $ callocBytes 104 >>= wrapPtr EventTouchpadPinch
+newZeroEventTouchpadPinch = liftIO $ wrappedPtrCalloc >>= wrapPtr EventTouchpadPinch
 
 instance tag ~ 'AttrSet => Constructible EventTouchpadPinch tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventTouchpadPinch.hs-boot b/GI/Gdk/Structs/EventTouchpadPinch.hs-boot
--- a/GI/Gdk/Structs/EventTouchpadPinch.hs-boot
+++ b/GI/Gdk/Structs/EventTouchpadPinch.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventTouchpadPinch = EventTouchpadPinch (ForeignPtr EventTouchpadPinch)
+instance WrappedPtr EventTouchpadPinch where
diff --git a/GI/Gdk/Structs/EventTouchpadSwipe.hs b/GI/Gdk/Structs/EventTouchpadSwipe.hs
--- a/GI/Gdk/Structs/EventTouchpadSwipe.hs
+++ b/GI/Gdk/Structs/EventTouchpadSwipe.hs
@@ -112,9 +112,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventTouchpadSwipe = EventTouchpadSwipe (ForeignPtr EventTouchpadSwipe)
+instance WrappedPtr EventTouchpadSwipe where
+    wrappedPtrCalloc = callocBytes 88
+    wrappedPtrCopy = copyPtr 88
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventTouchpadSwipe` struct initialized to zero.
 newZeroEventTouchpadSwipe :: MonadIO m => m EventTouchpadSwipe
-newZeroEventTouchpadSwipe = liftIO $ callocBytes 88 >>= wrapPtr EventTouchpadSwipe
+newZeroEventTouchpadSwipe = liftIO $ wrappedPtrCalloc >>= wrapPtr EventTouchpadSwipe
 
 instance tag ~ 'AttrSet => Constructible EventTouchpadSwipe tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventTouchpadSwipe.hs-boot b/GI/Gdk/Structs/EventTouchpadSwipe.hs-boot
--- a/GI/Gdk/Structs/EventTouchpadSwipe.hs-boot
+++ b/GI/Gdk/Structs/EventTouchpadSwipe.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventTouchpadSwipe = EventTouchpadSwipe (ForeignPtr EventTouchpadSwipe)
+instance WrappedPtr EventTouchpadSwipe where
diff --git a/GI/Gdk/Structs/EventVisibility.hs b/GI/Gdk/Structs/EventVisibility.hs
--- a/GI/Gdk/Structs/EventVisibility.hs
+++ b/GI/Gdk/Structs/EventVisibility.hs
@@ -58,9 +58,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventVisibility = EventVisibility (ForeignPtr EventVisibility)
+instance WrappedPtr EventVisibility where
+    wrappedPtrCalloc = callocBytes 24
+    wrappedPtrCopy = copyPtr 24
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventVisibility` struct initialized to zero.
 newZeroEventVisibility :: MonadIO m => m EventVisibility
-newZeroEventVisibility = liftIO $ callocBytes 24 >>= wrapPtr EventVisibility
+newZeroEventVisibility = liftIO $ wrappedPtrCalloc >>= wrapPtr EventVisibility
 
 instance tag ~ 'AttrSet => Constructible EventVisibility tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventVisibility.hs-boot b/GI/Gdk/Structs/EventVisibility.hs-boot
--- a/GI/Gdk/Structs/EventVisibility.hs-boot
+++ b/GI/Gdk/Structs/EventVisibility.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventVisibility = EventVisibility (ForeignPtr EventVisibility)
+instance WrappedPtr EventVisibility where
diff --git a/GI/Gdk/Structs/EventWindowState.hs b/GI/Gdk/Structs/EventWindowState.hs
--- a/GI/Gdk/Structs/EventWindowState.hs
+++ b/GI/Gdk/Structs/EventWindowState.hs
@@ -64,9 +64,14 @@
 import GI.Gdk.Callbacks
 
 newtype EventWindowState = EventWindowState (ForeignPtr EventWindowState)
+instance WrappedPtr EventWindowState where
+    wrappedPtrCalloc = callocBytes 32
+    wrappedPtrCopy = copyPtr 32
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `EventWindowState` struct initialized to zero.
 newZeroEventWindowState :: MonadIO m => m EventWindowState
-newZeroEventWindowState = liftIO $ callocBytes 32 >>= wrapPtr EventWindowState
+newZeroEventWindowState = liftIO $ wrappedPtrCalloc >>= wrapPtr EventWindowState
 
 instance tag ~ 'AttrSet => Constructible EventWindowState tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/EventWindowState.hs-boot b/GI/Gdk/Structs/EventWindowState.hs-boot
--- a/GI/Gdk/Structs/EventWindowState.hs-boot
+++ b/GI/Gdk/Structs/EventWindowState.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype EventWindowState = EventWindowState (ForeignPtr EventWindowState)
+instance WrappedPtr EventWindowState where
diff --git a/GI/Gdk/Structs/Geometry.hs b/GI/Gdk/Structs/Geometry.hs
--- a/GI/Gdk/Structs/Geometry.hs
+++ b/GI/Gdk/Structs/Geometry.hs
@@ -153,9 +153,14 @@
 import GI.Gdk.Callbacks
 
 newtype Geometry = Geometry (ForeignPtr Geometry)
+instance WrappedPtr Geometry where
+    wrappedPtrCalloc = callocBytes 56
+    wrappedPtrCopy = copyPtr 56
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Geometry` struct initialized to zero.
 newZeroGeometry :: MonadIO m => m Geometry
-newZeroGeometry = liftIO $ callocBytes 56 >>= wrapPtr Geometry
+newZeroGeometry = liftIO $ wrappedPtrCalloc >>= wrapPtr Geometry
 
 instance tag ~ 'AttrSet => Constructible Geometry tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/Geometry.hs-boot b/GI/Gdk/Structs/Geometry.hs-boot
--- a/GI/Gdk/Structs/Geometry.hs-boot
+++ b/GI/Gdk/Structs/Geometry.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype Geometry = Geometry (ForeignPtr Geometry)
+instance WrappedPtr Geometry where
diff --git a/GI/Gdk/Structs/KeymapKey.hs b/GI/Gdk/Structs/KeymapKey.hs
--- a/GI/Gdk/Structs/KeymapKey.hs
+++ b/GI/Gdk/Structs/KeymapKey.hs
@@ -51,9 +51,14 @@
 import GI.Gdk.Callbacks
 
 newtype KeymapKey = KeymapKey (ForeignPtr KeymapKey)
+instance WrappedPtr KeymapKey where
+    wrappedPtrCalloc = callocBytes 12
+    wrappedPtrCopy = copyPtr 12
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `KeymapKey` struct initialized to zero.
 newZeroKeymapKey :: MonadIO m => m KeymapKey
-newZeroKeymapKey = liftIO $ callocBytes 12 >>= wrapPtr KeymapKey
+newZeroKeymapKey = liftIO $ wrappedPtrCalloc >>= wrapPtr KeymapKey
 
 instance tag ~ 'AttrSet => Constructible KeymapKey tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/KeymapKey.hs-boot b/GI/Gdk/Structs/KeymapKey.hs-boot
--- a/GI/Gdk/Structs/KeymapKey.hs-boot
+++ b/GI/Gdk/Structs/KeymapKey.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype KeymapKey = KeymapKey (ForeignPtr KeymapKey)
+instance WrappedPtr KeymapKey where
diff --git a/GI/Gdk/Structs/Point.hs b/GI/Gdk/Structs/Point.hs
--- a/GI/Gdk/Structs/Point.hs
+++ b/GI/Gdk/Structs/Point.hs
@@ -45,9 +45,14 @@
 import GI.Gdk.Callbacks
 
 newtype Point = Point (ForeignPtr Point)
+instance WrappedPtr Point where
+    wrappedPtrCalloc = callocBytes 8
+    wrappedPtrCopy = copyPtr 8
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `Point` struct initialized to zero.
 newZeroPoint :: MonadIO m => m Point
-newZeroPoint = liftIO $ callocBytes 8 >>= wrapPtr Point
+newZeroPoint = liftIO $ wrappedPtrCalloc >>= wrapPtr Point
 
 instance tag ~ 'AttrSet => Constructible Point tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/Point.hs-boot b/GI/Gdk/Structs/Point.hs-boot
--- a/GI/Gdk/Structs/Point.hs-boot
+++ b/GI/Gdk/Structs/Point.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype Point = Point (ForeignPtr Point)
+instance WrappedPtr Point where
diff --git a/GI/Gdk/Structs/TimeCoord.hs b/GI/Gdk/Structs/TimeCoord.hs
--- a/GI/Gdk/Structs/TimeCoord.hs
+++ b/GI/Gdk/Structs/TimeCoord.hs
@@ -39,9 +39,14 @@
 import GI.Gdk.Callbacks
 
 newtype TimeCoord = TimeCoord (ForeignPtr TimeCoord)
+instance WrappedPtr TimeCoord where
+    wrappedPtrCalloc = callocBytes 1032
+    wrappedPtrCopy = copyPtr 1032
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `TimeCoord` struct initialized to zero.
 newZeroTimeCoord :: MonadIO m => m TimeCoord
-newZeroTimeCoord = liftIO $ callocBytes 1032 >>= wrapPtr TimeCoord
+newZeroTimeCoord = liftIO $ wrappedPtrCalloc >>= wrapPtr TimeCoord
 
 instance tag ~ 'AttrSet => Constructible TimeCoord tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/TimeCoord.hs-boot b/GI/Gdk/Structs/TimeCoord.hs-boot
--- a/GI/Gdk/Structs/TimeCoord.hs-boot
+++ b/GI/Gdk/Structs/TimeCoord.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype TimeCoord = TimeCoord (ForeignPtr TimeCoord)
+instance WrappedPtr TimeCoord where
diff --git a/GI/Gdk/Structs/WindowAttr.hs b/GI/Gdk/Structs/WindowAttr.hs
--- a/GI/Gdk/Structs/WindowAttr.hs
+++ b/GI/Gdk/Structs/WindowAttr.hs
@@ -122,9 +122,14 @@
 import GI.Gdk.Callbacks
 
 newtype WindowAttr = WindowAttr (ForeignPtr WindowAttr)
+instance WrappedPtr WindowAttr where
+    wrappedPtrCalloc = callocBytes 80
+    wrappedPtrCopy = copyPtr 80
+    wrappedPtrFree = Just ptr_to_g_free
+
 -- | Construct a `WindowAttr` struct initialized to zero.
 newZeroWindowAttr :: MonadIO m => m WindowAttr
-newZeroWindowAttr = liftIO $ callocBytes 80 >>= wrapPtr WindowAttr
+newZeroWindowAttr = liftIO $ wrappedPtrCalloc >>= wrapPtr WindowAttr
 
 instance tag ~ 'AttrSet => Constructible WindowAttr tag where
     new _ attrs = do
diff --git a/GI/Gdk/Structs/WindowAttr.hs-boot b/GI/Gdk/Structs/WindowAttr.hs-boot
--- a/GI/Gdk/Structs/WindowAttr.hs-boot
+++ b/GI/Gdk/Structs/WindowAttr.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype WindowAttr = WindowAttr (ForeignPtr WindowAttr)
+instance WrappedPtr WindowAttr where
diff --git a/GI/Gdk/Structs/WindowRedirect.hs b/GI/Gdk/Structs/WindowRedirect.hs
--- a/GI/Gdk/Structs/WindowRedirect.hs
+++ b/GI/Gdk/Structs/WindowRedirect.hs
@@ -27,6 +27,12 @@
 import GI.Gdk.Callbacks
 
 newtype WindowRedirect = WindowRedirect (ForeignPtr WindowRedirect)
+-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
+instance WrappedPtr WindowRedirect where
+    wrappedPtrCalloc = return nullPtr
+    wrappedPtrCopy = return
+    wrappedPtrFree = Nothing
+
 noWindowRedirect :: Maybe WindowRedirect
 noWindowRedirect = Nothing
 
diff --git a/GI/Gdk/Structs/WindowRedirect.hs-boot b/GI/Gdk/Structs/WindowRedirect.hs-boot
--- a/GI/Gdk/Structs/WindowRedirect.hs-boot
+++ b/GI/Gdk/Structs/WindowRedirect.hs-boot
@@ -8,3 +8,4 @@
 import qualified Data.Map as Map
 
 newtype WindowRedirect = WindowRedirect (ForeignPtr WindowRedirect)
+instance WrappedPtr WindowRedirect where
diff --git a/GI/Gdk/Unions/Event.hs b/GI/Gdk/Unions/Event.hs
--- a/GI/Gdk/Unions/Event.hs
+++ b/GI/Gdk/Unions/Event.hs
@@ -379,7 +379,7 @@
 eventReadAny s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventAny)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 24 EventAny) val'
+        val'' <- (newPtr EventAny) val'
         return val''
     return result
 
@@ -411,7 +411,7 @@
 eventReadExpose s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventExpose)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 56 EventExpose) val'
+        val'' <- (newPtr EventExpose) val'
         return val''
     return result
 
@@ -443,7 +443,7 @@
 eventReadVisibility s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventVisibility)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 24 EventVisibility) val'
+        val'' <- (newPtr EventVisibility) val'
         return val''
     return result
 
@@ -475,7 +475,7 @@
 eventReadMotion s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventMotion)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 80 EventMotion) val'
+        val'' <- (newPtr EventMotion) val'
         return val''
     return result
 
@@ -507,7 +507,7 @@
 eventReadButton s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventButton)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 80 EventButton) val'
+        val'' <- (newPtr EventButton) val'
         return val''
     return result
 
@@ -539,7 +539,7 @@
 eventReadTouch s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventTouch)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 96 EventTouch) val'
+        val'' <- (newPtr EventTouch) val'
         return val''
     return result
 
@@ -571,7 +571,7 @@
 eventReadScroll s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventScroll)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 88 EventScroll) val'
+        val'' <- (newPtr EventScroll) val'
         return val''
     return result
 
@@ -603,7 +603,7 @@
 eventReadKey s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventKey)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 56 EventKey) val'
+        val'' <- (newPtr EventKey) val'
         return val''
     return result
 
@@ -635,7 +635,7 @@
 eventReadCrossing s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventCrossing)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 88 EventCrossing) val'
+        val'' <- (newPtr EventCrossing) val'
         return val''
     return result
 
@@ -667,7 +667,7 @@
 eventReadFocusChange s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventFocus)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 24 EventFocus) val'
+        val'' <- (newPtr EventFocus) val'
         return val''
     return result
 
@@ -699,7 +699,7 @@
 eventReadConfigure s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventConfigure)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 40 EventConfigure) val'
+        val'' <- (newPtr EventConfigure) val'
         return val''
     return result
 
@@ -731,7 +731,7 @@
 eventReadProperty s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventProperty)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 40 EventProperty) val'
+        val'' <- (newPtr EventProperty) val'
         return val''
     return result
 
@@ -763,7 +763,7 @@
 eventReadSelection s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventSelection)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 64 EventSelection) val'
+        val'' <- (newPtr EventSelection) val'
         return val''
     return result
 
@@ -795,7 +795,7 @@
 eventReadOwnerChange s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventOwnerChange)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 56 EventOwnerChange) val'
+        val'' <- (newPtr EventOwnerChange) val'
         return val''
     return result
 
@@ -827,7 +827,7 @@
 eventReadProximity s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventProximity)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 32 EventProximity) val'
+        val'' <- (newPtr EventProximity) val'
         return val''
     return result
 
@@ -859,7 +859,7 @@
 eventReadDnd s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventDND)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 40 EventDND) val'
+        val'' <- (newPtr EventDND) val'
         return val''
     return result
 
@@ -891,7 +891,7 @@
 eventReadWindowState s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventWindowState)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 32 EventWindowState) val'
+        val'' <- (newPtr EventWindowState) val'
         return val''
     return result
 
@@ -923,7 +923,7 @@
 eventReadSetting s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventSetting)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 32 EventSetting) val'
+        val'' <- (newPtr EventSetting) val'
         return val''
     return result
 
@@ -955,7 +955,7 @@
 eventReadGrabBroken s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventGrabBroken)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 40 EventGrabBroken) val'
+        val'' <- (newPtr EventGrabBroken) val'
         return val''
     return result
 
@@ -987,7 +987,7 @@
 eventReadTouchpadSwipe s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventTouchpadSwipe)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 88 EventTouchpadSwipe) val'
+        val'' <- (newPtr EventTouchpadSwipe) val'
         return val''
     return result
 
@@ -1019,7 +1019,7 @@
 eventReadTouchpadPinch s = liftIO $ withManagedPtr s $ \ptr -> do
     val <- peek (ptr `plusPtr` 0) :: IO (Ptr EventTouchpadPinch)
     result <- convertIfNonNull val $ \val' -> do
-        val'' <- (newPtr 104 EventTouchpadPinch) val'
+        val'' <- (newPtr EventTouchpadPinch) val'
         return val''
     return result
 
diff --git a/gi-gdk.cabal b/gi-gdk.cabal
--- a/gi-gdk.cabal
+++ b/gi-gdk.cabal
@@ -1,6 +1,6 @@
 -- Autogenerated, do not edit.
 name:               gi-gdk
-version:            0.3.18.14
+version:            0.3.18.15
 synopsis:           Gdk bindings
 description:        Bindings for Gdk, autogenerated by haskell-gi.
 homepage:           https://github.com/haskell-gi/haskell-gi
@@ -76,13 +76,13 @@
                         GI.Gdk.Unions.Event
     pkgconfig-depends:  gdk-3.0 >= 3.18
     build-depends: base >= 4.7 && <5,
-        haskell-gi-base >= 0.14 && < 1,
-        gi-glib >= 0.2.46.14 && < 0.2.47,
-        gi-gobject >= 0.2.46.14 && < 0.2.47,
-        gi-gdkpixbuf >= 0.2.32.14 && < 0.2.33,
-        gi-gio >= 0.2.46.14 && < 0.2.47,
-        gi-pango >= 0.1.38.14 && < 0.1.39,
-        gi-cairo >= 0.1.14.14 && < 0.1.15,
+        haskell-gi-base >= 0.15 && < 1,
+        gi-glib >= 0.2.46.15 && < 0.2.47,
+        gi-gobject >= 0.2.46.15 && < 0.2.47,
+        gi-gdkpixbuf >= 0.2.32.15 && < 0.2.33,
+        gi-gio >= 0.2.46.15 && < 0.2.47,
+        gi-pango >= 0.1.38.15 && < 0.1.39,
+        gi-cairo >= 0.1.14.15 && < 0.1.15,
         bytestring >= 0.10,
         containers >= 0.5,
         text >= 1.0,
