Xpra: Ticket #734: xterm's empty cursor does not show on win32

All the cursor tests seem to pass and look fine (custom cursor, all cursors) but the cursor used by xterm when you hit one of the modifier keys (at least for shift, control and alt) which is a completely empty one of size 6x13 (the size of one character on the default xterm) 312 bytes of rgb data, shows up late (only shows when you move the mouse, at which point the xterm resets it) and it looks different from what it should be..

I managed to capture a screenshot of it by delaying the sending of cursors in ServerSource.send_cursor by 5 seconds, then hitting one of the special modifier keys, waiting 5 seconds, seeing the cursor log message on the client then moving the mouse and asking gimp to take a screen capture! Here it is: screenshot of the funny cursor displayed on win32

I think this ticket is important because I have also seen crashes in the cursor code on win32 with the GTK3 port (#640).

Sun, 09 Nov 2014 09:35:00 GMT - Antoine Martin: attachment set

screenshot of the funny cursor displayed on win32

Sun, 09 Nov 2014 09:39:18 GMT - Antoine Martin: owner, status, description changed

Sun, 09 Nov 2014 10:32:48 GMT - Antoine Martin: description changed

Adding this code to send_cursor:

if len(cpixels)==312:
    import binascii
    cursorlog.info("cursor data=%s", binascii.hexlify(cpixels))

I can verify that the cursor data being sent consists of 312 bytes null bytes. Both for Linux clients and win32...

So r8089 adds this same empty cursor to the custom cursor test code to make it easier to test, and we can see that the cursor is only applied when the mouse is moved (a GTK or win32 bug - not sure which, not sure there's much we can do about that).

Eventually found that we must provide fixed sized cursor pixel data on win32. GTK should really shield us from this sort of (annoying) details rather than giving us broken cursors!

So r8090 scales it to the exact size the OS wants - which is slightly problematic for cursors that are not square, like the one from the xterm: we scale 13x6 to 32x32 (and maybe 64x64 or other on high dpi displays apparently). Maybe we should paste the cursor onto an empty 32x32 transparent frame instead? (but only if the frame is bigger than the cursor!..) This will have to do for now. It may well fix the crash with GTK3 too.

More complicated backport than usual because the metrics stuff is not present in the 0.14 branch: done in r8092.

Fri, 14 Nov 2014 17:48:37 GMT - Antoine Martin:

Better solution using gtk.gdk.Pixbuf.copy_area in r8112: we only scale the cursor if we have to, otherwise fill with empty pixels. (will backport)

Note: unfortunately this does not fix the cursor crashes on win32 with gtk3 (see ticket:640#comment:12)

Wed, 19 Nov 2014 00:02:17 GMT - Antoine Martin: status changed; resolution set

Backport in r8112.

Sat, 23 Jan 2021 05:04:24 GMT - migration script:

this ticket has been moved to: https://github.com/Xpra-org/xpra/issues/734