http://bugs.winehq.org/show_bug.cgi?id=13683
--- Comment #29 from Christopher Thielen christopher@thielen.co --- I'm wondering if maybe the game is using the regular user32 cursor stuff.
Looking at the dumped resources, the game actually has dozens of different bitmaps depending on what the cursor is "holding" (the missing cursor is shaped like a hand that can drag items around).
I re-ran the WINEDEBUG output but added +timestamp to help make sense of some of it. Here's what I found, searching for and excluding certain strings to bring down the log noise:
(Timestamps start at 708 and end at 1100 - I take it those units are seconds?)
In particular, there are calls to CopyImage and I added some TRACEs to the codepath to see that it follows the IMAGE_ICON,IMAGE_CURSOR case and, in particular, hits a case where somebody left a FIXME:
if (icon->rsrc && (flags & LR_COPYFROMRESOURCE)) res = CURSORICON_Load( icon->module, icon->resname, desiredx, desiredy, depth, !icon->is_icon, flags ); else { // GAME HITS THIS CODE PATH res = CopyIcon( hnd ); /* FIXME: change size if necessary */ }
Does this mean anything to anyone? Am I correct in assuming its building cursors using CopyIcon and CreateBitmap?
I tried Googling around for some code to dump these bitmaps to a file to confirm but haven't been able to write anything yet.
$ cat ./maybe_multiple_cursors.log | grep -i "cursor:" | grep -v "X11" | grep -vi "clip" | grep -vi "xinput"
715.053:trace:cursor:LoadCursorA (nil), #7f00 715.132:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.133:trace:cursor:LoadCursorA (nil), #7f00 715.133:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.133:trace:cursor:LoadCursorA (nil), #7f00 715.133:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.133:trace:cursor:LoadCursorA (nil), #7f00 715.133:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.133:trace:cursor:LoadCursorA (nil), #7f01 715.133:trace:cursor:CURSORICON_Load (nil), #7f01, 0x0, depth 32, fCursor 1, flags 0x8040 715.134:trace:cursor:LoadCursorA (nil), #7f00 715.134:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.134:trace:cursor:LoadCursorA (nil), #7f00 715.134:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.134:trace:cursor:LoadCursorA (nil), #7f00 715.134:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.134:trace:cursor:LoadCursorA (nil), #7f00 715.134:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.134:trace:cursor:LoadCursorA (nil), #7f00 715.134:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.134:trace:cursor:LoadCursorA (nil), #7f00 715.134:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.516:trace:cursor:LoadCursorW (nil), #7f00 715.516:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.606:trace:cursor:LoadIconA (nil), #7f05 715.612:trace:cursor:LoadIconW (nil), #7f05 715.612:trace:cursor:CURSORICON_Load (nil), #7f05, 0x0, depth 32, fCursor 0, flags 0x8040 715.613:trace:cursor:GetIconInfoExW 0x10028 => 32x32 715.618:trace:cursor:LoadIconW (nil), #7f05 715.618:trace:cursor:CURSORICON_Load (nil), #7f05, 0x0, depth 32, fCursor 0, flags 0x8040 715.618:trace:cursor:LoadCursorW (nil), #7f00 715.618:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.619:trace:cursor:CopyImage hnd=0x10028, type=1, desiredx=16, desiredy=16, flags=0 715.622:trace:cursor:LoadCursorA (nil), #7f00 715.649:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.649:trace:cursor:LoadCursorA (nil), #7f00 715.649:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.650:trace:cursor:LoadCursorA (nil), #7f00 715.650:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.650:trace:cursor:LoadCursorA (nil), #7f00 715.650:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.650:trace:cursor:LoadCursorA (nil), #7f01 715.650:trace:cursor:CURSORICON_Load (nil), #7f01, 0x0, depth 32, fCursor 1, flags 0x8040 715.650:trace:cursor:LoadCursorA (nil), #7f00 715.650:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.650:trace:cursor:LoadCursorA (nil), #7f00 715.650:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.650:trace:cursor:LoadCursorA (nil), #7f00 715.650:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.650:trace:cursor:LoadCursorA (nil), #7f00 715.650:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.651:trace:cursor:LoadCursorA (nil), #7f00 715.651:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.651:trace:cursor:LoadCursorA (nil), #7f00 715.651:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.651:trace:cursor:CURSORICON_Load (nil), #7f05, 0x0, depth 32, fCursor 0, flags 0x8040 715.651:trace:cursor:LoadCursorA (nil), #7f00 715.651:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.710:trace:cursor:CopyImage hnd=0x10036, type=1, desiredx=16, desiredy=16, flags=0 715.801:trace:cursor:LoadCursorW (nil), #7f00 715.801:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.801:trace:cursor:LoadCursorW (nil), #7f00 715.801:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.832:trace:cursor:LoadCursorW (nil), #7f00 715.832:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.832:trace:cursor:LoadCursorW (nil), #7f00 715.832:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.833:trace:cursor:LoadCursorW (nil), #7f00 715.833:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.877:trace:cursor:LoadCursorW (nil), #7f01 715.877:trace:cursor:CURSORICON_Load (nil), #7f01, 0x0, depth 32, fCursor 1, flags 0x8040 715.929:trace:cursor:LoadCursorW (nil), #7f00 715.929:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.929:trace:cursor:LoadCursorW (nil), #7f00 715.952:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.952:trace:cursor:LoadCursorW (nil), #7f00 715.952:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.952:trace:cursor:LoadCursorW (nil), #7f00 715.952:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 715.952:trace:cursor:LoadCursorW (nil), #7f00 715.952:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.008:trace:cursor:LoadCursorW (nil), #7f00 716.009:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.009:trace:cursor:LoadCursorW (nil), #7f00 716.009:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.009:trace:cursor:LoadCursorW (nil), #7f00 716.009:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.037:trace:cursor:LoadCursorW (nil), #7f00 716.037:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.037:trace:cursor:LoadCursorW (nil), #7f00 716.037:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.037:trace:cursor:CURSORICON_Load 0x7e330000, #0016, 0x0, depth 32, fCursor 0, flags 0x0000 716.037:trace:cursor:CURSORICON_Load 0x7e330000, #0019, 0x0, depth 32, fCursor 0, flags 0x0000 716.038:trace:cursor:CURSORICON_Load 0x7e330000, #001c, 0x0, depth 32, fCursor 0, flags 0x0000 716.038:trace:cursor:LoadCursorW (nil), #7f00 716.038:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.038:trace:cursor:LoadCursorW (nil), #7f00 716.038:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.038:trace:cursor:LoadCursorW (nil), #7f00 716.038:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 716.835:trace:cursor:CreateIconFromResourceEx 0x37dc22 (1128 bytes), ver 00030000, 32x32 icon 717.048:trace:cursor:LoadCursorA (nil), #7f00 717.048:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.048:trace:cursor:SetCursor 0x10022 717.048:trace:cursor:GetIconInfoExW 0x10022 => 32x32 717.223:trace:cursor:set_window_cursor cursor 0x10022 created 1200034 717.242:trace:cursor:LoadCursorA (nil), #7f00 717.243:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.243:trace:cursor:LoadCursorA (nil), #7f00 717.243:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.243:trace:cursor:LoadCursorA (nil), #7f00 717.243:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.243:trace:cursor:LoadCursorA (nil), #7f00 717.243:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.244:trace:cursor:LoadCursorA (nil), #7f01 717.244:trace:cursor:CURSORICON_Load (nil), #7f01, 0x0, depth 32, fCursor 1, flags 0x8040 717.244:trace:cursor:LoadCursorA (nil), #7f00 717.244:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.244:trace:cursor:LoadCursorA (nil), #7f00 717.244:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.244:trace:cursor:LoadCursorA (nil), #7f00 717.244:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.244:trace:cursor:LoadCursorA (nil), #7f00 717.244:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.244:trace:cursor:LoadCursorA (nil), #7f00 717.244:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 717.245:trace:cursor:LoadCursorA (nil), #7f00 717.245:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 718.386:trace:cursor:LoadIconA 0x400000, (null) 718.386:trace:cursor:CURSORICON_Load 0x400000, (null), 0x0, depth 32, fCursor 0, flags 0x8040 718.387:trace:cursor:LoadCursorA (nil), #7f00 718.387:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 718.387:trace:cursor:LoadCursorA (nil), #7f00 718.387:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 718.387:trace:cursor:LoadCursorA (nil), #7f00 718.387:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 718.388:trace:cursor:LoadCursorA (nil), #7f00 718.388:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 718.388:trace:cursor:LoadCursorA (nil), #7f00 718.388:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 718.388:trace:cursor:LoadCursorA (nil), #7f00 718.388:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 718.389:trace:cursor:LoadCursorA (nil), #7f00 718.389:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 719.203:trace:cursor:LoadCursorA (nil), #7f00 719.203:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 719.203:trace:cursor:SetCursor 0x10032 719.255:trace:cursor:LoadCursorW (nil), #7f00 719.255:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 719.256:trace:cursor:GetIconInfoExW 0x10032 => 32x32 719.257:trace:cursor:set_window_cursor cursor 0x10032 created 1600019 719.259:trace:cursor:LoadCursorA (nil), #7f00 719.259:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 719.259:trace:cursor:SetCursor 0x10022 719.274:trace:cursor:LoadIconW (nil), #7f05 719.274:trace:cursor:CURSORICON_Load (nil), #7f05, 0x0, depth 32, fCursor 0, flags 0x8040 719.275:trace:cursor:GetIconInfoExW 0x10036 => 32x32 720.599:trace:cursor:ShowCursor 0, count=-1 728.763:trace:cursor:SetCursor 0x10032 750.856:trace:cursor:LoadCursorW (nil), #7f00 750.856:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 750.857:trace:cursor:LoadIconW (nil), #7f00 750.857:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 0, flags 0x8040 750.885:trace:cursor:CopyImage hnd=0x4004e, type=1, desiredx=16, desiredy=16, flags=0 1091.390:trace:cursor:SetCursor (nil) 1091.392:trace:cursor:LoadCursorA (nil), #7f00 1091.392:trace:cursor:CURSORICON_Load (nil), #7f00, 0x0, depth 32, fCursor 1, flags 0x8040 1091.392:trace:cursor:SetCursor 0x10022