+ Set the contents of a buffer into this surface. The x and y
+ arguments specify the location of the new pending buffer's upper
+ left corner, relative to the current buffer's upper left corner. In
+ other words, the x and y, and the width and height of the wl_buffer
+ together define in which directions the surface's size changes.
+
+ Surface contents are double-buffered state, see wl_surface.commit.
+
+ The initial surface contents are void; there is no content.
+ wl_surface.attach assigns the given wl_buffer as the pending wl_buffer.
+ wl_surface.commit applies the pending wl_buffer as the new
+ surface contents, and the size of the surface becomes the size of
+ the wl_buffer. The wl_buffer is also kept as pending, until
+ changed by wl_surface.attach or the wl_buffer is destroyed.
+
+ Committing a pending wl_buffer allows the compositor to read the
+ pixels in the wl_buffer. The compositor may access the pixels at any
+ time after the wl_surface.commit request. When the compositor will
+ not access the pixels anymore, it will send the wl_buffer.release
+ event. Only after receiving wl_buffer.release, the client may re-use
+ the wl_buffer. A wl_buffer, that has been attached and then replaced
+ by another attach instead of committed, will not receive a release
+ event, and is not used by the compositor.
+
+ Destroying the wl_buffer after wl_buffer.release does not change the
+ surface contents, even if the wl_buffer is still pending for the
+ next commit. In such case, the next commit does not change the
+ surface contents. However, if the client destroys the wl_buffer
+ before receiving wl_buffer.release, the surface contents become
+ undefined immediately.
+
+ Only if wl_surface.attach is sent with a nil wl_buffer, the
+ following wl_surface.commit will remove the surface content.