mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2025-12-30 17:49:02 +00:00
Move InputsChannelClient to a separate file
Preparation for converting to GObject Acked-by: Frediano Ziglio <fziglio@redhat.com>
This commit is contained in:
parent
dbb6e71e8d
commit
6c4e86cbe3
@ -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 \
|
||||
|
||||
87
server/inputs-channel-client.c
Normal file
87
server/inputs-channel-client.c
Normal file
@ -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;
|
||||
}
|
||||
}
|
||||
48
server/inputs-channel-client.h
Normal file
48
server/inputs-channel-client.h
Normal file
@ -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_ */
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user