[Spice-devel] [PATCH 03/14] Move InputsChannelClient to a separate file
Jonathon Jongsma
jjongsma at redhat.com
Tue May 3 20:00:19 UTC 2016
Preparation for converting to GObject
---
server/Makefile.am | 2 +
server/inputs-channel-client.c | 92 ++++++++++++++++++++++++++++++++++++++++++
server/inputs-channel-client.h | 44 ++++++++++++++++++++
server/inputs-channel.c | 76 ++++++++++------------------------
server/inputs-channel.h | 11 ++++-
5 files changed, 169 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 786cd42..66b7f73 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..adcc5c6
--- /dev/null
+++ b/server/inputs-channel-client.c
@@ -0,0 +1,92 @@
+/*
+ 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;
+};
+
+InputsChannelClient* 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;
+}
+
+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;
+ }
+}
+
+RedChannelClient* inputs_channel_client_get_base(InputsChannelClient* icc)
+{
+ return &icc->base;
+}
diff --git a/server/inputs-channel-client.h b/server/inputs-channel-client.h
new file mode 100644
index 0000000..e655d9f
--- /dev/null
+++ b/server/inputs-channel-client.h
@@ -0,0 +1,44 @@
+/*
+ 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;
+
+InputsChannelClient* 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);
+
+/* FIXME: temporary until GObjectification */
+RedChannelClient* inputs_channel_client_get_base(InputsChannelClient* icc);
+
+#endif /* _INPUTS_CHANNEL_CLIENT_H_ */
diff --git a/server/inputs-channel.c b/server/inputs-channel.c
index b768c95..8f548c6 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;
@@ -153,7 +142,7 @@ void inputs_channel_set_tablet_logical_size(InputsChannel *inputs, int x_res, in
sif->set_logical_size(inputs->tablet, x_res, y_res);
}
-const VDAgentMouseState *inputs_channel_get_mouse_state(InputsChannel *inputs)
+VDAgentMouseState *inputs_channel_get_mouse_state(InputsChannel *inputs)
{
return &inputs->mouse_state;
}
@@ -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_release_pipe_item(RedChannelClient *rcc,
RedPipeItem *base, int item_pushed)
{
@@ -289,7 +263,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);
@@ -337,11 +311,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);
@@ -355,11 +325,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;
}
@@ -541,18 +507,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);
+ icc = inputs_channel_client_create(channel, client, stream, FALSE,
+ num_common_caps, common_caps,
+ num_caps, caps);
if (!icc) {
return;
}
- icc->motion_count = 0;
- inputs_pipe_add_init(&icc->base);
+ inputs_pipe_add_init(inputs_channel_client_get_base(icc));
}
static void inputs_migrate(RedChannelClient *rcc)
@@ -593,7 +554,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;
@@ -608,12 +569,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;
}
@@ -721,3 +677,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 fce757f..ce25ac7 100644
--- a/server/inputs-channel.h
+++ b/server/inputs-channel.h
@@ -27,7 +27,7 @@
typedef struct InputsChannel InputsChannel;
InputsChannel* inputs_channel_new(RedsState *reds);
-const VDAgentMouseState *inputs_channel_get_mouse_state(InputsChannel *inputs);
+VDAgentMouseState *inputs_channel_get_mouse_state(InputsChannel *inputs);
void inputs_channel_on_keyboard_leds_change(InputsChannel *inputs, uint8_t leds);
void inputs_channel_set_tablet_logical_size(InputsChannel *inputs, int x_res, int y_res);
@@ -41,5 +41,14 @@ 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);
+
+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
--
2.4.11
More information about the Spice-devel
mailing list