From: Jonathon Jongsma <jjongsma@xxxxxxxxxx> Preparation for converting to GObject Acked-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/Makefile.am | 2 + server/inputs-channel-client.c | 87 ++++++++++++++++++++++++++++++++++++++++++ server/inputs-channel-client.h | 48 +++++++++++++++++++++++ server/inputs-channel.c | 78 +++++++++++-------------------------- server/inputs-channel.h | 2 + 5 files changed, 161 insertions(+), 56 deletions(-) create mode 100644 server/inputs-channel-client.c create mode 100644 server/inputs-channel-client.h diff --git a/server/Makefile.am b/server/Makefile.am index 5a5c7e8..cca3b9b 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -80,6 +80,8 @@ libserver_la_SOURCES = \ glz-encoder-priv.h \ inputs-channel.c \ inputs-channel.h \ + inputs-channel-client.c \ + inputs-channel-client.h \ jpeg-encoder.c \ jpeg-encoder.h \ lz4-encoder.c \ diff --git a/server/inputs-channel-client.c b/server/inputs-channel-client.c new file mode 100644 index 0000000..f9dd6b2 --- /dev/null +++ b/server/inputs-channel-client.c @@ -0,0 +1,87 @@ +/* + Copyright (C) 2009-2015 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "inputs-channel-client.h" +#include "inputs-channel.h" +#include "migration-protocol.h" + +struct InputsChannelClient { + RedChannelClient base; + uint16_t motion_count; +}; + +RedChannelClient* inputs_channel_client_create(RedChannel *channel, + RedClient *client, + RedsStream *stream, + int monitor_latency, + int num_common_caps, + uint32_t *common_caps, + int num_caps, + uint32_t *caps) +{ + InputsChannelClient* icc = + (InputsChannelClient*)red_channel_client_create(sizeof(InputsChannelClient), + channel, client, + stream, + monitor_latency, + num_common_caps, + common_caps, num_caps, + caps); + if (icc) + icc->motion_count = 0; + return &icc->base; +} + +void inputs_channel_client_send_migrate_data(RedChannelClient *rcc, + SpiceMarshaller *m, + RedPipeItem *item) +{ + InputsChannelClient *icc = SPICE_CONTAINEROF(rcc, InputsChannelClient, base); + InputsChannel *inputs = (InputsChannel*)rcc->channel; + + inputs_channel_set_src_during_migrate(inputs, FALSE); + red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item); + + spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_MAGIC); + spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_VERSION); + spice_marshaller_add_uint16(m, icc->motion_count); +} + +void inputs_channel_client_handle_migrate_data(InputsChannelClient *icc, + uint16_t motion_count) +{ + icc->motion_count = motion_count; + + for (; icc->motion_count >= SPICE_INPUT_MOTION_ACK_BUNCH; + icc->motion_count -= SPICE_INPUT_MOTION_ACK_BUNCH) { + red_channel_client_pipe_add_type(&icc->base, RED_PIPE_ITEM_MOUSE_MOTION_ACK); + } +} + +void inputs_channel_client_on_mouse_motion(InputsChannelClient *icc) +{ + InputsChannel *inputs_channel = (InputsChannel *)icc->base.channel; + + if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 && + !inputs_channel_is_src_during_migrate(inputs_channel)) { + red_channel_client_pipe_add_type(&icc->base, RED_PIPE_ITEM_MOUSE_MOTION_ACK); + icc->motion_count = 0; + } +} diff --git a/server/inputs-channel-client.h b/server/inputs-channel-client.h new file mode 100644 index 0000000..e83cc29 --- /dev/null +++ b/server/inputs-channel-client.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2009-2015 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _INPUTS_CHANNEL_CLIENT_H_ +#define _INPUTS_CHANNEL_CLIENT_H_ + +#include "red-channel.h" + +typedef struct InputsChannelClient InputsChannelClient; + +RedChannelClient* inputs_channel_client_create(RedChannel *channel, + RedClient *client, + RedsStream *stream, + int monitor_latency, + int num_common_caps, + uint32_t *common_caps, + int num_caps, + uint32_t *caps); + +void inputs_channel_client_send_migrate_data(RedChannelClient *rcc, + SpiceMarshaller *m, + RedPipeItem *item); +void inputs_channel_client_handle_migrate_data(InputsChannelClient *icc, + uint16_t motion_count); +void inputs_channel_client_on_mouse_motion(InputsChannelClient *icc); + +enum { + RED_PIPE_ITEM_INPUTS_INIT = RED_PIPE_ITEM_TYPE_CHANNEL_BASE, + RED_PIPE_ITEM_MOUSE_MOTION_ACK, + RED_PIPE_ITEM_KEY_MODIFIERS, + RED_PIPE_ITEM_MIGRATE_DATA, +}; + +#endif /* _INPUTS_CHANNEL_CLIENT_H_ */ diff --git a/server/inputs-channel.c b/server/inputs-channel.c index 197823d..a971bbb 100644 --- a/server/inputs-channel.c +++ b/server/inputs-channel.c @@ -39,6 +39,7 @@ #include "reds.h" #include "reds-stream.h" #include "red-channel.h" +#include "inputs-channel-client.h" #include "main-channel-client.h" #include "inputs-channel.h" #include "migration-protocol.h" @@ -99,11 +100,6 @@ RedsState* spice_tablet_state_get_server(SpiceTabletState *st) return st->reds; } -typedef struct InputsChannelClient { - RedChannelClient base; - uint16_t motion_count; -} InputsChannelClient; - struct InputsChannel { RedChannel base; uint8_t recv_buf[RECEIVE_BUF_SIZE]; @@ -115,13 +111,6 @@ struct InputsChannel { SpiceTabletInstance *tablet; }; -enum { - RED_PIPE_ITEM_INPUTS_INIT = RED_PIPE_ITEM_TYPE_CHANNEL_BASE, - RED_PIPE_ITEM_MOUSE_MOTION_ACK, - RED_PIPE_ITEM_KEY_MODIFIERS, - RED_PIPE_ITEM_MIGRATE_DATA, -}; - typedef struct RedInputsPipeItem { RedPipeItem base; } RedInputsPipeItem; @@ -239,21 +228,6 @@ static RedPipeItem *red_inputs_key_modifiers_item_new( return &item->base; } -static void inputs_channel_send_migrate_data(RedChannelClient *rcc, - SpiceMarshaller *m, - RedPipeItem *item) -{ - InputsChannelClient *icc = SPICE_CONTAINEROF(rcc, InputsChannelClient, base); - InputsChannel *inputs = SPICE_CONTAINEROF(rcc->channel, InputsChannel, base); - - inputs->src_during_migrate = FALSE; - red_channel_client_init_send_data(rcc, SPICE_MSG_MIGRATE_DATA, item); - - spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_MAGIC); - spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_INPUTS_VERSION); - spice_marshaller_add_uint16(m, icc->motion_count); -} - static void inputs_channel_send_item(RedChannelClient *rcc, RedPipeItem *base) { SpiceMarshaller *m = red_channel_client_get_marshaller(rcc); @@ -283,7 +257,7 @@ static void inputs_channel_send_item(RedChannelClient *rcc, RedPipeItem *base) red_channel_client_init_send_data(rcc, SPICE_MSG_INPUTS_MOUSE_MOTION_ACK, base); break; case RED_PIPE_ITEM_MIGRATE_DATA: - inputs_channel_send_migrate_data(rcc, m, base); + inputs_channel_client_send_migrate_data(rcc, m, base); break; default: spice_warning("invalid pipe iten %d", base->type); @@ -331,11 +305,7 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui SpiceMouseInstance *mouse = inputs_channel_get_mouse(inputs_channel); SpiceMsgcMouseMotion *mouse_motion = message; - if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 && - !inputs_channel->src_during_migrate) { - red_channel_client_pipe_add_type(rcc, RED_PIPE_ITEM_MOUSE_MOTION_ACK); - icc->motion_count = 0; - } + inputs_channel_client_on_mouse_motion(icc); if (mouse && reds_get_mouse_mode(reds) == SPICE_MOUSE_MODE_SERVER) { SpiceMouseInterface *sif; sif = SPICE_CONTAINEROF(mouse->base.sif, SpiceMouseInterface, base); @@ -349,11 +319,7 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui SpiceMsgcMousePosition *pos = message; SpiceTabletInstance *tablet = inputs_channel_get_tablet(inputs_channel); - if (++icc->motion_count % SPICE_INPUT_MOTION_ACK_BUNCH == 0 && - !inputs_channel->src_during_migrate) { - red_channel_client_pipe_add_type(rcc, RED_PIPE_ITEM_MOUSE_MOTION_ACK); - icc->motion_count = 0; - } + inputs_channel_client_on_mouse_motion(icc); if (reds_get_mouse_mode(reds) != SPICE_MOUSE_MODE_CLIENT) { break; } @@ -523,7 +489,7 @@ static void inputs_connect(RedChannel *channel, RedClient *client, int num_common_caps, uint32_t *common_caps, int num_caps, uint32_t *caps) { - InputsChannelClient *icc; + RedChannelClient *rcc; if (!reds_stream_is_ssl(stream) && !red_client_during_migrate_at_target(client)) { main_channel_client_push_notify(red_client_get_main(client), @@ -531,18 +497,13 @@ static void inputs_connect(RedChannel *channel, RedClient *client, } spice_printerr("inputs channel client create"); - icc = (InputsChannelClient*)red_channel_client_create(sizeof(InputsChannelClient), - channel, - client, - stream, - FALSE, - num_common_caps, common_caps, - num_caps, caps); - if (!icc) { + rcc = inputs_channel_client_create(channel, client, stream, FALSE, + num_common_caps, common_caps, + num_caps, caps); + if (!rcc) { return; } - icc->motion_count = 0; - inputs_pipe_add_init(&icc->base); + inputs_pipe_add_init(rcc); } static void inputs_migrate(RedChannelClient *rcc) @@ -583,7 +544,7 @@ static int inputs_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t size, void *message) { - InputsChannelClient *icc = SPICE_CONTAINEROF(rcc, InputsChannelClient, base); + InputsChannelClient *icc = (InputsChannelClient*)rcc; InputsChannel *inputs = SPICE_CONTAINEROF(rcc->channel, InputsChannel, base); SpiceMigrateDataHeader *header; SpiceMigrateDataInputs *mig_data; @@ -598,12 +559,7 @@ static int inputs_channel_handle_migrate_data(RedChannelClient *rcc, return FALSE; } key_modifiers_sender(inputs); - icc->motion_count = mig_data->motion_count; - - for (; icc->motion_count >= SPICE_INPUT_MOTION_ACK_BUNCH; - icc->motion_count -= SPICE_INPUT_MOTION_ACK_BUNCH) { - red_channel_client_pipe_add_type(rcc, RED_PIPE_ITEM_MOUSE_MOTION_ACK); - } + inputs_channel_client_handle_migrate_data(icc, mig_data->motion_count); return TRUE; } @@ -709,3 +665,13 @@ void inputs_channel_detach_tablet(InputsChannel *inputs, SpiceTabletInstance *ta inputs->tablet = NULL; } +gboolean inputs_channel_is_src_during_migrate(InputsChannel *inputs) +{ + return inputs->src_during_migrate; +} + +void inputs_channel_set_src_during_migrate(InputsChannel *inputs, + gboolean value) +{ + inputs->src_during_migrate = value; +} diff --git a/server/inputs-channel.h b/server/inputs-channel.h index 9213aec..5b12fad 100644 --- a/server/inputs-channel.h +++ b/server/inputs-channel.h @@ -43,5 +43,7 @@ int inputs_channel_has_tablet(InputsChannel *inputs); void inputs_channel_detach_tablet(InputsChannel *inputs, SpiceTabletInstance *tablet); RedsState* spice_tablet_state_get_server(SpiceTabletState *dev); RedsState* spice_kbd_state_get_server(SpiceKbdState *dev); +gboolean inputs_channel_is_src_during_migrate(InputsChannel *inputs); +void inputs_channel_set_src_during_migrate(InputsChannel *inputs, gboolean value); #endif -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel