diff options
author | Daniel P. Berrange <berrange@redhat.com> | 2011-07-11 20:03:32 +0100 |
---|---|---|
committer | Daniel P. Berrange <berrange@redhat.com> | 2011-07-11 20:03:32 +0100 |
commit | 1def55556f4b2c37e349117ccfcf1c33130abd10 (patch) | |
tree | 5ed1671d426855554f084bb588fc442715a9cfa3 /src/virt-viewer-display-spice.c | |
parent | 9501b9885ac7de3f12e7fa9f30d87bb4ea71664b (diff) | |
download | virt-viewer-1def55556f4b2c37e349117ccfcf1c33130abd10.tar.gz virt-viewer-1def55556f4b2c37e349117ccfcf1c33130abd10.tar.xz virt-viewer-1def55556f4b2c37e349117ccfcf1c33130abd10.zip |
Split pull part of VirtViewerDisplay out into VirtViewerSession
To facilitate introduction of multi-head support, pull some of
the VirtViewerDisplay class out into a new VirtViewerSession
class.
Diffstat (limited to 'src/virt-viewer-display-spice.c')
-rw-r--r-- | src/virt-viewer-display-spice.c | 290 |
1 files changed, 53 insertions, 237 deletions
diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c index cb30153..6d0e0a0 100644 --- a/src/virt-viewer-display-spice.c +++ b/src/virt-viewer-display-spice.c @@ -32,36 +32,47 @@ G_DEFINE_TYPE (VirtViewerDisplaySpice, virt_viewer_display_spice, VIRT_VIEWER_TYPE_DISPLAY) +struct _VirtViewerDisplaySpicePrivate { + SpiceChannel *channel; + SpiceDisplay *display; +}; -static void virt_viewer_display_spice_close(VirtViewerDisplay *display); -static void virt_viewer_display_spice_send_keys(VirtViewerDisplay *display, const guint *keyvals, int nkeyvals); +#define VIRT_VIEWER_DISPLAY_SPICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_DISPLAY_SPICE, VirtViewerDisplaySpicePrivate)) + +static void virt_viewer_display_spice_send_keys(VirtViewerDisplay *display, + const guint *keyvals, + int nkeyvals); static GdkPixbuf *virt_viewer_display_spice_get_pixbuf(VirtViewerDisplay *display); -static gboolean virt_viewer_display_spice_open_fd(VirtViewerDisplay *display, int fd); -static gboolean virt_viewer_display_spice_open_host(VirtViewerDisplay *display, char *host, char *port); -static gboolean virt_viewer_display_spice_channel_open_fd(VirtViewerDisplay *display, VirtViewerDisplayChannel *channel, int fd); -static void virt_viewer_display_spice_channel_new(SpiceSession *s, - SpiceChannel *channel, - VirtViewerDisplay *display); -static void virt_viewer_display_spice_channel_destroy(SpiceSession *s, - SpiceChannel *channel, - VirtViewerDisplay *display); + +static void +virt_viewer_display_spice_finalize(GObject *obj) +{ + VirtViewerDisplaySpice *spice = VIRT_VIEWER_DISPLAY_SPICE(obj); + + g_object_unref(spice->priv->display); + g_object_unref(spice->priv->channel); + + G_OBJECT_CLASS(virt_viewer_display_spice_parent_class)->finalize(obj); +} static void virt_viewer_display_spice_class_init(VirtViewerDisplaySpiceClass *klass) { VirtViewerDisplayClass *dclass = VIRT_VIEWER_DISPLAY_CLASS(klass); + GObjectClass *oclass = G_OBJECT_CLASS(klass); + + oclass->finalize = virt_viewer_display_spice_finalize; - dclass->close = virt_viewer_display_spice_close; dclass->send_keys = virt_viewer_display_spice_send_keys; dclass->get_pixbuf = virt_viewer_display_spice_get_pixbuf; - dclass->open_fd = virt_viewer_display_spice_open_fd; - dclass->open_host = virt_viewer_display_spice_open_host; - dclass->channel_open_fd = virt_viewer_display_spice_channel_open_fd; + + g_type_class_add_private(oclass, sizeof(VirtViewerDisplaySpicePrivate)); } static void virt_viewer_display_spice_init(VirtViewerDisplaySpice *self G_GNUC_UNUSED) { + self->priv = VIRT_VIEWER_DISPLAY_SPICE_GET_PRIVATE(self); } static void @@ -72,9 +83,9 @@ virt_viewer_display_spice_send_keys(VirtViewerDisplay *display, VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); g_return_if_fail(self != NULL); - g_return_if_fail(self->display != NULL); + g_return_if_fail(self->priv->display != NULL); - spice_display_send_keys(self->display, keyvals, nkeyvals, SPICE_DISPLAY_KEY_EVENT_CLICK); + spice_display_send_keys(self->priv->display, keyvals, nkeyvals, SPICE_DISPLAY_KEY_EVENT_CLICK); } static GdkPixbuf * @@ -83,140 +94,12 @@ virt_viewer_display_spice_get_pixbuf(VirtViewerDisplay *display) VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); g_return_val_if_fail(self != NULL, NULL); - g_return_val_if_fail(self->display != NULL, NULL); + g_return_val_if_fail(self->priv->display != NULL, NULL); - return spice_display_get_pixbuf(self->display); + return spice_display_get_pixbuf(self->priv->display); } static void -virt_viewer_display_spice_close(VirtViewerDisplay *display) -{ - VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); - - g_return_if_fail(self != NULL); - - if (self->session) { - spice_session_disconnect(self->session); - g_object_unref(self->session); - - if (self->audio) - g_object_unref(self->audio); - self->audio = NULL; - - if (self->display) - gtk_container_remove(GTK_CONTAINER(self), GTK_WIDGET(self->display)); - self->display = NULL; - } - - self->session = spice_session_new(); - g_signal_connect(self->session, "channel-new", - G_CALLBACK(virt_viewer_display_spice_channel_new), self); - g_signal_connect(self->session, "channel-destroy", - G_CALLBACK(virt_viewer_display_spice_channel_destroy), self); - -} - -static gboolean -virt_viewer_display_spice_open_host(VirtViewerDisplay *display, - char *host, - char *port) -{ - VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); - - g_return_val_if_fail(self != NULL, FALSE); - g_return_val_if_fail(self->session != NULL, FALSE); - - g_object_set(self->session, - "host", host, - "port", port, - NULL); - - return spice_session_connect(self->session); -} - -static gboolean -virt_viewer_display_spice_open_fd(VirtViewerDisplay *display, - int fd) -{ - VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); - - g_return_val_if_fail(self != NULL, FALSE); - - return spice_session_open_fd(self->session, fd); -} - -static gboolean -virt_viewer_display_spice_channel_open_fd(VirtViewerDisplay *display, - VirtViewerDisplayChannel *channel, - int fd) -{ - VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); - - g_return_val_if_fail(self != NULL, FALSE); - - return spice_channel_open_fd(SPICE_CHANNEL(channel), fd); -} - -static void -virt_viewer_display_spice_channel_open_fd_request(SpiceChannel *channel, - gint tls G_GNUC_UNUSED, - VirtViewerDisplay *display) -{ - g_signal_emit_by_name(display, "display-channel-open", channel); -} - -static void -virt_viewer_display_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED, - SpiceChannelEvent event, - VirtViewerDisplay *display) -{ - VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); - char *password = NULL; - - g_return_if_fail(self != NULL); - - switch (event) { - case SPICE_CHANNEL_OPENED: - DEBUG_LOG("main channel: opened"); - break; - case SPICE_CHANNEL_CLOSED: - DEBUG_LOG("main channel: closed"); - g_signal_emit_by_name(display, "display-disconnected"); - break; - case SPICE_CHANNEL_ERROR_CONNECT: - DEBUG_LOG("main channel: failed to connect"); - g_signal_emit_by_name(display, "display-disconnected"); - break; - case SPICE_CHANNEL_ERROR_AUTH: - DEBUG_LOG("main channel: auth failure (wrong password?)"); - int ret = virt_viewer_auth_collect_credentials("SPICE", - NULL, - NULL, &password); - if (ret < 0) { - g_signal_emit_by_name(display, "display-auth-refused", - _("Unable to collect credentials")); - } else { - g_object_set(self->session, "password", password, NULL); - spice_session_connect(self->session); - } - break; - default: - g_warning("unknown main channel event: %d", event); - g_signal_emit_by_name(display, "display-disconnected"); - break; - } - - g_free(password); -} - - -/* - * Called when desktop size changes. - * - * It either tries to resize the main window, or it triggers - * recalculation of the display within existing window size - */ -static void virt_viewer_display_spice_primary_create(SpiceChannel *channel G_GNUC_UNUSED, gint format G_GNUC_UNUSED, gint width, @@ -226,106 +109,39 @@ virt_viewer_display_spice_primary_create(SpiceChannel *channel G_GNUC_UNUSED, gpointer imgdata G_GNUC_UNUSED, VirtViewerDisplay *display) { - DEBUG_LOG("desktop resize %dx%d", width, height); + DEBUG_LOG("desktop resize %dx%d", width, height); - virt_viewer_display_set_desktop_size(display, width, height); - g_signal_emit_by_name(display, "display-initialized"); - g_signal_emit_by_name(display, "display-desktop-resize"); + virt_viewer_display_set_desktop_size(display, width, height); + g_signal_emit_by_name(display, "display-desktop-resize"); } -static void -virt_viewer_display_spice_channel_new(SpiceSession *s, - SpiceChannel *channel, - VirtViewerDisplay *display) -{ - VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); - int id; - - g_return_if_fail(self != NULL); - - g_signal_connect(channel, "open-fd", - G_CALLBACK(virt_viewer_display_spice_channel_open_fd_request), self); - - g_object_get(channel, "channel-id", &id, NULL); - - if (SPICE_IS_MAIN_CHANNEL(channel)) { - g_signal_connect(channel, "channel-event", - G_CALLBACK(virt_viewer_display_spice_main_channel_event), self); - } - - if (SPICE_IS_DISPLAY_CHANNEL(channel)) { - if (id != 0) - return; - - DEBUG_LOG("new display channel (#%d)", id); - g_signal_connect(channel, "display-primary-create", - G_CALLBACK(virt_viewer_display_spice_primary_create), display); - - self->display = spice_display_new(s, id); - gtk_container_add(GTK_CONTAINER(self), GTK_WIDGET(self->display)); - gtk_widget_show(GTK_WIDGET(self->display)); - g_object_set(self->display, - "grab-keyboard", TRUE, - "grab-mouse", TRUE, - "resize-guest", FALSE, - "scaling", TRUE, - "auto-clipboard", TRUE, - NULL); - - g_signal_emit_by_name(display, "display-connected"); - } - - if (SPICE_IS_INPUTS_CHANNEL(channel)) { - DEBUG_LOG("new inputs channel"); - } - - if (SPICE_IS_PLAYBACK_CHANNEL(channel)) { - DEBUG_LOG("new audio channel"); - if (self->audio != NULL) - return; - self->audio = spice_audio_new(s, NULL, NULL); - } -} - -static void -virt_viewer_display_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s, - SpiceChannel *channel, - VirtViewerDisplay *display) -{ - VirtViewerDisplaySpice *self = VIRT_VIEWER_DISPLAY_SPICE(display); - int id; - - g_return_if_fail(self != NULL); - - g_object_get(channel, "channel-id", &id, NULL); - if (SPICE_IS_MAIN_CHANNEL(channel)) { - DEBUG_LOG("zap main channel"); - } - - if (SPICE_IS_DISPLAY_CHANNEL(channel)) { - DEBUG_LOG("zap display channel (#%d)", id); - } - - if (SPICE_IS_PLAYBACK_CHANNEL(channel) && self->audio) { - DEBUG_LOG("zap audio channel"); - g_object_unref(self->audio); - self->audio = NULL; - } -} - GtkWidget * -virt_viewer_display_spice_new(void) +virt_viewer_display_spice_new(SpiceChannel *channel, + SpiceDisplay *display) { VirtViewerDisplaySpice *self; self = g_object_new(VIRT_VIEWER_TYPE_DISPLAY_SPICE, NULL); - self->session = spice_session_new(); - g_signal_connect(self->session, "channel-new", - G_CALLBACK(virt_viewer_display_spice_channel_new), self); - g_signal_connect(self->session, "channel-destroy", - G_CALLBACK(virt_viewer_display_spice_channel_destroy), self); + self->priv->channel = channel; + self->priv->display = display; + + g_object_ref(channel); + g_object_ref(display); + + g_signal_connect(channel, "display-primary-create", + G_CALLBACK(virt_viewer_display_spice_primary_create), self); + + gtk_container_add(GTK_CONTAINER(self), GTK_WIDGET(self->priv->display)); + gtk_widget_show(GTK_WIDGET(self->priv->display)); + g_object_set(self->priv->display, + "grab-keyboard", TRUE, + "grab-mouse", TRUE, + "resize-guest", FALSE, + "scaling", TRUE, + "auto-clipboard", TRUE, + NULL); return GTK_WIDGET(self); } |