[Spice-devel] [PATCH] client: support clipboard/selection-owner model
Hans de Goede
hdegoede at redhat.com
Mon Sep 27 05:50:06 PDT 2010
Hi,
On a second review I've found some more issues with the X11 client
copy paste code, note some of this were already present before
the patch in question.
1) You're using the XA_PRIMARY selection, this is the one which
gets set as soon as you select anything with the mouse cursor,
no need to press ctrl-c or ctrl-x to set it, so it gets changed
all the time! Note this is also the one which usually gets pasted
with the middle mouse button. I believe that rather then the
XA_PRIMARY you want the selection identified by the clipboard
atom, which uses the normal ctrl-c + ctrl-v copy / paste behavior
2) In the SelectionNotify event case in root_win_proc the following
check is made:
if (type != event.xselection.target) {
But type can be the INCR atom as well and this is valid too, as the
code acknowledges by checking for it later on:
if (type == incr_atom) {
Which will never be reached as the above check will fail in this
case.
Also when the type is INCR, there is no reason to do the second
request with the indicated size, as the resulting data (which is an
32 bit integer indicating the minimum size of the data which will
be send) will get thrown away anyways.
3) In the none INCR case the property is never deleted, but it should
be once we're done reading it, see:
http://tronche.com/gui/x/icccm/sec-2.html#s-2.4
At the end of the paragraph, I believe we can do this by simply
setting the delete flag to true when the second XGetWindowProperty
call is made.
4) If we get a SelectionRequest with a type which we do not support, we
should send back a SelectionNotify event with the property set to none
to indicate that we cannot fulfill the request.
Like wise when Platform::request_clipboard_notification fails, or the
client receives a SelectionNotify with a property of None in response
to the Platform::request_clipboard_notification() the client should
send a message to the agent that it could not get the desired data
(so that under Linux the agent can generate a SelectionNotify with a
property of None to let the requesting app inside the guest know
we cannot give it the type it is asking for).
I suggest we add a VD_AGENT_CLIPBOARD_NONE for this to the below enum,
enum {
VD_AGENT_CLIPBOARD_UTF8_TEXT = 1,
VD_AGENT_CLIPBOARD_BITMAP,
};
We could make this have value 0.
5) When receiving a SelectionRequest event, we MUST always accept the
TARGETS and MULTIPLE atoms as targets, see:
http://tronche.com/gui/x/icccm/sec-2.html#s-2.6.2
The handling of neither of this is really easy, for TARGETS we should
ask the agent what types (VD_AGENT_CLIPBOARD_*) the current clipboard
contents can be converted too, and then report that back. This
requires some vd agent protocol enhancements.
The handling of MULTIPLE is no fun either, as that will require
multiple round trips to the agent, and we need to keep track
where we are in the array of requests.
Regards,
Hans
More information about the Spice-devel
mailing list