This allows a better id allocation as devices are created after fixed ones. Also will allow to support more easily multiple monitor. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/stream-device.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/server/stream-device.c b/server/stream-device.c index 8909c9ba..f72140ab 100644 --- a/server/stream-device.c +++ b/server/stream-device.c @@ -67,7 +67,7 @@ stream_device_read_msg_from_dev(RedCharDevice *self, SpiceCharDeviceInstance *si SpiceCharDeviceInterface *sif; int n; - if (dev->has_error) { + if (dev->has_error || !dev->stream_channel) { return NULL; } @@ -223,11 +223,7 @@ stream_device_connect(RedsState *reds, SpiceCharDeviceInstance *sin) { SpiceCharDeviceInterface *sif; - StreamChannel *stream_channel = stream_channel_new(reds, 1); // TODO id - StreamDevice *dev = stream_device_new(sin, reds); - dev->stream_channel = stream_channel; - stream_channel_register_start_cb(stream_channel, stream_device_stream_start, dev); sif = spice_char_device_get_interface(sin); if (sif->state) { @@ -250,6 +246,25 @@ stream_device_dispose(GObject *object) } static void +allocate_channels(StreamDevice *dev) +{ + if (dev->stream_channel) { + return; + } + + SpiceServer* reds = red_char_device_get_server(RED_CHAR_DEVICE(dev)); + + int id = reds_get_free_channel_id(reds, SPICE_CHANNEL_DISPLAY); + g_return_if_fail(id >= 0); + + StreamChannel *stream_channel = stream_channel_new(reds, id); + + dev->stream_channel = stream_channel; + + stream_channel_register_start_cb(stream_channel, stream_device_stream_start, dev); +} + +static void stream_device_port_event(RedCharDevice *char_dev, uint8_t event) { if (event != SPICE_PORT_EVENT_OPENED && event != SPICE_PORT_EVENT_CLOSED) { @@ -260,10 +275,15 @@ stream_device_port_event(RedCharDevice *char_dev, uint8_t event) // reset device and channel on close/open device->opened = (event == SPICE_PORT_EVENT_OPENED); + if (device->opened) { + allocate_channels(device); + } device->hdr_pos = 0; device->has_error = false; red_char_device_reset(char_dev); - stream_channel_reset(device->stream_channel); + if (device->stream_channel) { + stream_channel_reset(device->stream_channel); + } } static void -- 2.13.5 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel