A clarification - the way CCSObject works means that "object types" in libcompizconfig can't be behind opaque pointers is because at the moment we are just doing allocation manually (eg no fooNew ... yet as its nontrivial with the current design). In order to ensure that we get enough allocated for CCSObject and can access it easily from any object type is to make it the first member of the struct and then hide everything behind the priv pointer it provides.
A clarification - the way CCSObject works means that "object types" in libcompizconfig can't be behind opaque pointers is because at the moment we are just doing allocation manually (eg no fooNew ... yet as its nontrivial with the current design). In order to ensure that we get enough allocated for CCSObject and can access it easily from any object type is to make it the first member of the struct and then hide everything behind the priv pointer it provides.