[Spice-devel] Issues with Clipboard Grab/Release Callbacks
Nick Couchman
vnick at apache.org
Mon Jun 20 18:53:09 UTC 2022
On Mon, Jun 20, 2022 at 2:46 PM Marc-André Lureau <
marcandre.lureau at gmail.com> wrote:
> Hi
>
> On Mon, Jun 20, 2022 at 6:09 PM Nick Couchman <vnick at apache.org> wrote:
>
>> Hello, everyone,
>> I've posted here, before, with some questions during my journey of trying
>> to add support for the SPICE protocol to the Guacamole project. The good
>> news is that I've actually made measurable progress in the implementation -
>> I can now connect to a SPICE server, and the basics work (mouse and
>> keyboard - mostly anyway), so I'm moving on to the extra stuff - clipboard,
>> audio, file transfer, etc.
>>
>> In working on the clipboard integration, I'm currently running into an
>> issue with a couple of the callback functions, specifically the clipboard
>> grab/release functions, where the number of arguments seems to be
>> mismatched. According to the documentation, these callbacks should be
>> called with the following arguments:
>>
>> gboolean
>> user_function (SpiceMainChannel *main,
>> guint selection,
>> gpointer types,
>> guint ntypes,
>> gpointer user_data)
>>
>>
> types is actually guint32*, but that's not the problem here.
>
Okay, I'll update that.
>
>
>> void
>> user_function (SpiceMainChannel *main,
>> guint selection,
>> gpointer user_data)
>>
>> I've implemented the callbacks with those arguments, as follows:
>>
>> void guac_spice_clipboard_selection_grab_handler(SpiceMainChannel channel,
>> guint selection, gpointer types, guint ntypes, guac_client*
>> client)
>>
>> void guac_spice_clipboard_selection_release_handler(SpiceMainChannel
>> channel,
>> guint selection, guac_client* client)
>>
>
> It looks correct. Can you point to your code connecting the signals with
> the handlers?
>
Sure - source code is here:
https://github.com/necouchman/guacamole-server/tree/working/spice-basic
Here's the section in the src/protocol/spice/client.c file that registers
the callbacks:
/* Register clipboard handlers. */
g_signal_connect(channel, SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION,
G_CALLBACK(guac_spice_clipboard_selection_handler), client);
g_signal_connect(channel,
SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION_GRAB,
G_CALLBACK(guac_spice_clipboard_selection_grab_handler),
client);
g_signal_connect(channel,
SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION_RELEASE,
G_CALLBACK(guac_spice_clipboard_selection_release_handler),
client);
g_signal_connect(channel,
SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION_REQUEST,
G_CALLBACK(guac_spice_clipboard_selection_request_handler),
client);
link to the full function is here:
https://github.com/necouchman/guacamole-server/blob/5e073802a0656e65b1bc8e7e6051831bea0d9508/src/protocols/spice/client.c#L236-L375
>
>
>>
>> and registered them appropriately. However, if I use them as implemented
>> above, when the callbacks are triggered, the application segfaults when I
>> try to access the "guac_client* client" data structure. I used GDB to try
>> to help track this down, and I noticed that the value of "client" was 0x1,
>> which looks less like a pointer to a memory location and more like the
>> number 1.
>>
>> So, I decided to add another argument to the callback functions, just
>> before the client argument:
>>
>> void guac_spice_clipboard_selection_grab_handler(SpiceMainChannel channel,
>> guint selection, gpointer types, guint ntypes, guint extra,
>> guac_client* client)
>>
>> void guac_spice_clipboard_selection_release_handler(SpiceMainChannel
>> channel,
>> guint selection, guint extra, guac_client* client)
>>
>> Strangely, this works - the client data structure can be referenced,
>> there are no segfaults (yet), etc. So, I decided to print the values that
>> are being passed for all of these parameters, and I get the following:
>>
>> guacd[100252]: DEBUG: Notifying client of clipboard grab in the guest.
>> guacd[100252]: DEBUG: Arg: channel: 0x00000000
>> guacd[100252]: DEBUG: Arg: selection: 1275303536
>> guacd[100252]: DEBUG: Arg: types: 0x00000001
>> guacd[100252]: DEBUG: Arg: ntypes: 1276022924
>> guacd[100252]: DEBUG: Arg: extra: 1
>>
>>
> Weird
>
>
>> I printed them in the format I thought they should be in based on what
>> the arguments are supposed to be - I probably should have just done all
>> hex. But, it seems like maybe the "extra" parameter being passed is in
>> front of the channel, since the channel is showing up as all zeros?
>>
>> I was trying to find the code where the callbacks are actually called -
>> I'm guessing, since this is clipboard integration, it'll be in the vdagent
>> code somewhere - but I was having trouble tracking that down.
>>
>>
> The callbacks are not directly called, since those a GObject signals. The
> main channel will call g_signal_emit().
>
>
Okay.
>
>
>> If anyone has any ideas, I'd appreciate the insight into this - I'm
>> puzzled by this apparent mismatch in the number of arguments. Also, if it
>> matters, I'm running CentOS 8 Stream, using Xspice to provide a test SPICE
>> server, and running spice-vdagentd/spice-vdagent within my X session. Yes,
>> I know Xspice is unmaintained, but I just needed something simple and that
>> I didn't have to spend a bunch of time building in order to give me a spice
>> server to point at, and, so far, this has been pretty reliable. Also, at
>> its core, it appears to use the same spice-qxl X driver that x11spice uses,
>> just with a simple Python wrapper script for generating an X config file
>> and starting the X server/display. So, I think it's still pretty "safe" for
>> attempting to develop this Guacamole integration - if for some reason you
>> believe me to be wrong about that, please let me know.
>>
>
> Your testing environment shouldn't be a problem, it's really your
> client-side code integration with spice-glib that looks broken.
>
>
That's what I was thinking, and maybe I'm just messing up something simple!
Thanks,
Nick
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20220620/30dc129a/attachment-0001.htm>
More information about the Spice-devel
mailing list