Somewhat big task, so probably needs some tracking.
The easiest way to map this to keep compatibility and do this safely is to keep AbstractClient::geometry() the same untouched true canonical source of the buffer location in compositor space.
Instead we should consider consider windowGeometry to be a set of margins to apply to/from this. Similar to the existing AbstractClient::borders.
AbstractClient can gain a realGeometry / setRealGeometry which add/subtract margins as appropriate.
(ideally we need a better name but both "Window Geometry" and "Client Geometry" are terms that are taken that also mean removing AbstractClient::borders )
Then most porting is just a case of switching methods.
* Send correct configure event so resizing works (pretty much done)
* Set correct popup location
* Adjust placement.cpp to use other method
* Adjust rules
* Adjust snapping