The application code needs signals from VirtViewerSession to be
emitted for it to work. Since the VirtViewerSessionOvirt instance
wraps the VirtViewerSessionSpice instance, it needs to forward
the signals it gets.
---
src/virt-viewer-session-ovirt.c | 66 +++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/src/virt-viewer-session-ovirt.c b/src/virt-viewer-session-ovirt.c
index 5b71c83..f5eb9b9 100644
--- a/src/virt-viewer-session-ovirt.c
+++ b/src/virt-viewer-session-ovirt.c
@@ -190,6 +190,59 @@ parse_uri(VirtViewerSession *session, const gchar *uri)
return TRUE;
}
+typedef struct {
+ const char *signal;
+ VirtViewerSession *session;
+} SignalContext;
+
+static void destroy_context(gpointer user_data, G_GNUC_UNUSED GClosure
*closure)
+{
+ g_slice_free(SignalContext, user_data);
+}
+
+static void reemit_signal_VOID(G_GNUC_UNUSED GObject *object,
+ gpointer user_data)
+{
+ SignalContext *context = (SignalContext *)user_data;
+
+ g_message("Forwarding %s from VirtViewerSessionSpice to
VirtViewerSessionOvirt",
+ context->signal);
+ g_signal_emit_by_name(context->session, context->signal);
+}
+
+static void reemit_signal_POINTER(G_GNUC_UNUSED GObject *object,
+ gpointer signal_data,
+ gpointer *user_data)
+{
+ SignalContext *context = (SignalContext *)user_data;
+
+ g_message("Forwarding %s from VirtViewerSessionSpice to
VirtViewerSessionOvirt",
+ context->signal);
+ g_signal_emit_by_name(context->session, context->signal, signal_data);
+}
+
+static void proxy_signal_VOID(VirtViewerSessionOvirt *ovirt,
+ const char *signal)
+{
+ SignalContext *context = g_slice_new(SignalContext);
+ context->signal = signal;
+ context->session = VIRT_VIEWER_SESSION(ovirt);
+ g_signal_connect_data(G_OBJECT(ovirt->priv->real_session), signal,
+ G_CALLBACK(reemit_signal_VOID), context,
+ destroy_context, 0);
+}
+
+static void proxy_signal_POINTER(VirtViewerSessionOvirt *ovirt,
+ const char *signal)
+{
+ SignalContext *context = g_slice_new(SignalContext);
+ context->signal = signal;
+ context->session = VIRT_VIEWER_SESSION(ovirt);
+ g_signal_connect_data(G_OBJECT(ovirt->priv->real_session), signal,
+ G_CALLBACK(reemit_signal_POINTER), context,
+ destroy_context, 0);
+}
+
static void
create_spice_session(VirtViewerSessionOvirt *ovirt,
const char *address,
@@ -219,6 +272,19 @@ create_spice_session(VirtViewerSessionOvirt *ovirt,
ovirt->priv->real_session = virt_viewer_session_spice_new(app,
ovirt->priv->main_window);
g_object_unref(app);
+ proxy_signal_POINTER(ovirt, "session-auth-failed");
+ proxy_signal_POINTER(ovirt, "session-auth-refused");
+ proxy_signal_VOID(ovirt, "session-bell");
+ proxy_signal_VOID(ovirt, "session-cancelled");
+ proxy_signal_POINTER(ovirt, "session-channel-open");
+ proxy_signal_POINTER(ovirt, "session-cut-text");
+ proxy_signal_VOID(ovirt, "session-connected");
+ proxy_signal_VOID(ovirt, "session-disconnected");
+ proxy_signal_POINTER(ovirt, "session-display-added");
+ proxy_signal_POINTER(ovirt, "session-display-removed");
+ proxy_signal_VOID(ovirt, "session-initialized");
+ proxy_signal_POINTER(ovirt, "session-usb-failed");
+
virt_viewer_session_open_uri(ovirt->priv->real_session, spice_uri);
g_free(spice_uri);
}
--
1.7.10.2
_______________________________________________
virt-tools-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-tools-list