<div dir="ltr"><div>Hi,<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 20, 2022 at 10:00 PM Nick Couchman <<a href="mailto:vnick@apache.org">vnick@apache.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">On Mon, Jun 20, 2022 at 2:46 PM Marc-André Lureau <<a href="mailto:marcandre.lureau@gmail.com" target="_blank">marcandre.lureau@gmail.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Hi<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 20, 2022 at 6:09 PM Nick Couchman <<a href="mailto:vnick@apache.org" target="_blank">vnick@apache.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello, everyone,<div>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.</div><div><br></div><div>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:</div><div><br></div><div>gboolean<br>user_function (SpiceMainChannel *main,<br>               guint             selection,<br>               gpointer          types,<br>               guint             ntypes,<br>               gpointer          user_data)<br></div><div><br></div></div></blockquote><div><br></div><div>types is actually guint32*, but that's not the problem here.</div></div></div></blockquote><div><br></div><div>Okay, I'll update that.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div></div><div>void<br>user_function (SpiceMainChannel *main,<br>               guint             selection,<br>               gpointer          user_data)<br></div><div><br></div><div>I've implemented the callbacks with those arguments, as follows:<br><br>void guac_spice_clipboard_selection_grab_handler(SpiceMainChannel channel,<br>        guint selection, gpointer types, guint ntypes, guac_client* client)<br></div><div><br></div><div>void guac_spice_clipboard_selection_release_handler(SpiceMainChannel channel,<br>        guint selection, guac_client* client)<br></div></div></blockquote><div><br></div><div>It looks correct. Can you point to your code connecting the signals with the handlers?</div></div></div></blockquote><div><br></div><div>Sure - source code is here: <a href="https://github.com/necouchman/guacamole-server/tree/working/spice-basic" target="_blank">https://github.com/necouchman/guacamole-server/tree/working/spice-basic</a></div><div><br></div><div>Here's the section in the src/protocol/spice/client.c file that registers the callbacks:</div><div><br></div><div>        /* Register clipboard handlers. */<br>        g_signal_connect(channel, SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION,<br>                G_CALLBACK(guac_spice_clipboard_selection_handler), client);<br>        g_signal_connect(channel, SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION_GRAB,<br>                G_CALLBACK(guac_spice_clipboard_selection_grab_handler), client);<br>        g_signal_connect(channel, SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION_RELEASE,<br>                G_CALLBACK(guac_spice_clipboard_selection_release_handler), client);<br>        g_signal_connect(channel, SPICE_SIGNAL_MAIN_CLIPBOARD_SELECTION_REQUEST,<br>                G_CALLBACK(guac_spice_clipboard_selection_request_handler), client);<br></div><div><br></div><div>link to the full function is here:<br><a href="https://github.com/necouchman/guacamole-server/blob/5e073802a0656e65b1bc8e7e6051831bea0d9508/src/protocols/spice/client.c#L236-L375" target="_blank">https://github.com/necouchman/guacamole-server/blob/5e073802a0656e65b1bc8e7e6051831bea0d9508/src/protocols/spice/client.c#L236-L375</a></div></div></div></blockquote><div><br></div><div>Try changing the callbacks to accept a pointer, e.g.:</div><div><span class="gmail-blob-code-inner gmail-blob-code-marker gmail-js-code-nav-pass"><span class="gmail-pl-k">- void</span> <span class="gmail-pl-en">guac_spice_clipboard_selection_grab_handler</span>(SpiceMainChannel channel,</span></div><div><span class="gmail-blob-code-inner gmail-blob-code-marker gmail-js-code-nav-pass"><span class="gmail-blob-code-inner gmail-blob-code-marker gmail-js-code-nav-pass"><span class="gmail-pl-k">+void</span> <span class="gmail-pl-en">guac_spice_clipboard_selection_grab_handler</span>(SpiceMainChannel* channel,</span></span></div><div class="gmail_quote"><br><div> Regards,</div><div>    Uri.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><br></div><div>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.</div><div><br></div><div>So, I decided to add another argument to the callback functions, just before the client argument:</div><div><br></div><div>void guac_spice_clipboard_selection_grab_handler(SpiceMainChannel channel,<br>        guint selection, gpointer types, guint ntypes, guint extra, guac_client* client)<br></div><div><br></div><div>void guac_spice_clipboard_selection_release_handler(SpiceMainChannel channel,<br>        guint selection, guint extra, guac_client* client)<br></div><div><br></div><div>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:</div><div><br></div><div>guacd[100252]: DEBUG:    Notifying client of clipboard grab in the guest.<br>guacd[100252]: DEBUG: Arg: channel: 0x00000000<br>guacd[100252]: DEBUG: Arg: selection: 1275303536<br>guacd[100252]: DEBUG:       Arg: types: 0x00000001<br>guacd[100252]: DEBUG:   Arg: ntypes: 1276022924<br>guacd[100252]: DEBUG:  Arg: extra: 1<br></div><div><br></div></div></blockquote><div><br></div><div>Weird</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>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?</div><div><br></div><div>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.</div><div><br></div></div></blockquote><div><br></div><div>The callbacks are not directly called, since those a GObject signals. The main channel will call g_signal_emit().</div><div><br></div></div></div></blockquote><div><br></div><div>Okay.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>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.</div></div></blockquote><div><br></div><div>Your testing environment shouldn't be a problem, it's really your client-side code integration with spice-glib that looks broken.<br></div></div><br></div></blockquote><div><br></div><div>That's what I was thinking, and maybe I'm just messing up something simple!</div><div><br></div><div>Thanks,</div><div>Nick</div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
</blockquote></div></div>