xpra icon
Bug tracker and wiki

Opened 5 years ago

Closed 5 years ago

#734 closed defect (fixed)

xterm's empty cursor does not show on win32

Reported by: Antoine Martin Owned by: Antoine Martin
Priority: major Milestone: 0.15
Component: platforms Version: trunk
Keywords: win32 Cc:

Description (last modified by Antoine Martin)

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).

Attachments (1)

win32-funny-cursor.png (45.8 KB) - added by Antoine Martin 5 years ago.
screenshot of the funny cursor displayed on win32

Download all attachments as: .zip

Change History (5)

Changed 5 years ago by Antoine Martin

Attachment: win32-funny-cursor.png added

screenshot of the funny cursor displayed on win32

comment:1 Changed 5 years ago by Antoine Martin

Description: modified (diff)
Owner: changed from Antoine Martin to Antoine Martin
Status: newassigned

comment:2 Changed 5 years ago by Antoine Martin

Description: modified (diff)

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.

Last edited 5 years ago by Antoine Martin (previous) (diff)

comment:3 Changed 5 years ago by 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)

Last edited 5 years ago by Antoine Martin (previous) (diff)

comment:4 Changed 5 years ago by Antoine Martin

Resolution: fixed
Status: assignedclosed

Backport in r8112.

Note: See TracTickets for help on using tickets.