Cursor (both the cursor itself and its visibility) are per thread on Windows and Wine's implementation outside of winex11.drv seem to agree with that. Using global cursor variable in winex11.drv leads to wrong cursor being set or set visible for a window when the app sets a cursor from the other thread.
Actually it's per thread input. Making it per thread will give the wrong results for instance when parent and child windows belong to different threads.