From: Jonathon Jongsma <jjongsma@xxxxxxxxxx> Also change API of reds_has_vdagent() to take RedsState arg. Removes another global variable. --- server/inputs-channel.c | 8 ++++---- server/main-channel.c | 2 +- server/reds-private.h | 1 + server/reds.c | 54 ++++++++++++++++++++++++------------------------- server/reds.h | 2 +- 5 files changed, 33 insertions(+), 34 deletions(-) diff --git a/server/inputs-channel.c b/server/inputs-channel.c index c00285c..6c832a2 100644 --- a/server/inputs-channel.c +++ b/server/inputs-channel.c @@ -361,8 +361,8 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui if (reds_get_mouse_mode(reds) != SPICE_MOUSE_MODE_CLIENT) { break; } - spice_assert((reds_get_agent_mouse() && reds_has_vdagent()) || tablet); - if (!reds_get_agent_mouse() || !reds_has_vdagent()) { + spice_assert((reds_get_agent_mouse() && reds_has_vdagent(reds)) || tablet); + if (!reds_get_agent_mouse() || !reds_has_vdagent(reds)) { SpiceTabletInterface *sif; sif = SPICE_CONTAINEROF(tablet->base.sif, SpiceTabletInterface, base); sif->position(tablet, pos->x, pos->y, RED_MOUSE_STATE_TO_LOCAL(pos->buttons_state)); @@ -385,7 +385,7 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui dz = 1; } if (reds_get_mouse_mode(reds) == SPICE_MOUSE_MODE_CLIENT) { - if (reds_get_agent_mouse() && reds_has_vdagent()) { + if (reds_get_agent_mouse() && reds_has_vdagent(reds)) { inputs_channel->mouse_state.buttons = RED_MOUSE_BUTTON_STATE_TO_AGENT(mouse_press->buttons_state) | (dz == -1 ? VD_AGENT_UBUTTON_MASK : 0) | @@ -407,7 +407,7 @@ static int inputs_channel_handle_parsed(RedChannelClient *rcc, uint32_t size, ui case SPICE_MSGC_INPUTS_MOUSE_RELEASE: { SpiceMsgcMouseRelease *mouse_release = message; if (reds_get_mouse_mode(reds) == SPICE_MOUSE_MODE_CLIENT) { - if (reds_get_agent_mouse() && reds_has_vdagent()) { + if (reds_get_agent_mouse() && reds_has_vdagent(reds)) { inputs_channel->mouse_state.buttons = RED_MOUSE_BUTTON_STATE_TO_AGENT(mouse_release->buttons_state); reds_handle_agent_mouse_event(reds, &inputs_channel->mouse_state); diff --git a/server/main-channel.c b/server/main-channel.c index 1f4fcaa..aa2b03c 100644 --- a/server/main-channel.c +++ b/server/main-channel.c @@ -545,7 +545,7 @@ static void main_channel_marshall_init(RedChannelClient *rcc, if (item->is_client_mouse_allowed) { init.supported_mouse_modes |= SPICE_MOUSE_MODE_CLIENT; } - init.agent_connected = reds_has_vdagent(); + init.agent_connected = reds_has_vdagent(reds); init.agent_tokens = REDS_AGENT_WINDOW_SIZE; init.multi_media_time = item->multi_media_time; init.ram_hint = item->ram_hint; diff --git a/server/reds-private.h b/server/reds-private.h index 7f1a6df..4b7bf50 100644 --- a/server/reds-private.h +++ b/server/reds-private.h @@ -199,6 +199,7 @@ struct RedsState { GArray *renderers; int spice_port; + SpiceCharDeviceInstance *vdagent; }; #endif diff --git a/server/reds.c b/server/reds.c index bb5df6a..be90161 100644 --- a/server/reds.c +++ b/server/reds.c @@ -73,7 +73,6 @@ #include "reds-private.h" SpiceCoreInterfaceInternal *core = NULL; - static SpiceCoreInterface *core_public = NULL; static SpiceTimer *adapter_timer_add(const SpiceCoreInterfaceInternal *iface, SpiceTimerFunc func, void *opaque) @@ -130,7 +129,6 @@ static SpiceCoreInterfaceInternal core_interface_adapter = { .channel_event = adapter_channel_event, }; -static SpiceCharDeviceInstance *vdagent = NULL; static SpiceMigrateInstance *migration_interface = NULL; /* Debugging only variable: allow multiple client connections to the spice @@ -468,9 +466,9 @@ static void reds_reset_vdp(RedsState *reds) spice_char_device_reset(state->base); } - sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base); + sif = SPICE_CONTAINEROF(reds->vdagent->base.sif, SpiceCharDeviceInterface, base); if (sif->state) { - sif->state(vdagent, 0); + sif->state(reds->vdagent, 0); } } @@ -612,7 +610,7 @@ static void reds_update_mouse_mode(RedsState *reds) int allowed = 0; int qxl_count = red_dispatcher_qxl_count(); - if ((agent_mouse && vdagent) || + if ((agent_mouse && reds->vdagent) || ((reds->inputs_channel && inputs_channel_has_tablet(reds->inputs_channel)) && qxl_count == 1)) { allowed = reds->dispatcher_allows_client_mouse; @@ -637,7 +635,7 @@ static void reds_agent_remove(RedsState *reds) // part of the clients are during target migration. reds_reset_vdp(reds); - vdagent = NULL; + reds->vdagent = NULL; reds_update_mouse_mode(reds); if (reds_main_channel_connected(reds) && !red_channel_is_waiting_for_migrate_data(&reds->main_channel->base)) { @@ -736,15 +734,15 @@ static SpiceCharDeviceMsgToClient *vdi_port_read_one_msg_from_device(SpiceCharDe VDIReadBuf *dispatch_buf; int n; - if (!vdagent) { + if (!reds->vdagent) { return NULL; } - spice_assert(vdagent == sin); - sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base); - while (vdagent) { + spice_assert(reds->vdagent == sin); + sif = SPICE_CONTAINEROF(reds->vdagent->base.sif, SpiceCharDeviceInterface, base); + while (reds->vdagent) { switch (state->read_state) { case VDI_PORT_READ_STATE_READ_HEADER: - n = sif->read(vdagent, state->receive_pos, state->receive_len); + n = sif->read(reds->vdagent, state->receive_pos, state->receive_len); if (!n) { return NULL; } @@ -766,7 +764,7 @@ static SpiceCharDeviceMsgToClient *vdi_port_read_one_msg_from_device(SpiceCharDe state->read_state = VDI_PORT_READ_STATE_READ_DATA; } case VDI_PORT_READ_STATE_READ_DATA: - n = sif->read(vdagent, state->receive_pos, state->receive_len); + n = sif->read(reds->vdagent, state->receive_pos, state->receive_len); if (!n) { return NULL; } @@ -845,9 +843,9 @@ static void vdi_port_remove_client(RedClient *client, void *opaque) /****************************************************************************/ -int reds_has_vdagent(void) +int reds_has_vdagent(RedsState *reds) { - return !!vdagent; + return !!reds->vdagent; } void reds_handle_agent_mouse_event(RedsState *reds, const VDAgentMouseState *mouse_state) @@ -944,10 +942,10 @@ void reds_on_main_agent_start(RedsState *reds, MainChannelClient *mcc, uint32_t SpiceCharDeviceState *dev_state = reds->agent_state.base; RedChannelClient *rcc; - if (!vdagent) { + if (!reds->vdagent) { return; } - spice_assert(vdagent->st && vdagent->st == dev_state); + spice_assert(reds->vdagent->st && reds->vdagent->st == dev_state); rcc = main_channel_client_get_base(mcc); reds->agent_state.client_agent_started = TRUE; /* @@ -983,11 +981,11 @@ void reds_on_main_agent_start(RedsState *reds, MainChannelClient *mcc, uint32_t void reds_on_main_agent_tokens(MainChannelClient *mcc, uint32_t num_tokens) { - if (!vdagent) { + if (!reds->vdagent) { return; } - spice_assert(vdagent->st); - spice_char_device_send_to_client_tokens_add(vdagent->st, + spice_assert(reds->vdagent->st); + spice_char_device_send_to_client_tokens_add(reds->vdagent->st, main_channel_client_get_base(mcc)->client, num_tokens); } @@ -1183,7 +1181,7 @@ void reds_marshall_migrate_data(RedsState *reds, SpiceMarshaller *m) spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_MAIN_MAGIC); spice_marshaller_add_uint32(m, SPICE_MIGRATE_DATA_MAIN_VERSION); - if (!vdagent) { + if (!reds->vdagent) { uint8_t *null_agent_mig_data; spice_assert(!agent_state->base); /* MSG_AGENT_CONNECTED_TOKENS is supported by the client @@ -1345,7 +1343,7 @@ int reds_handle_migrate_data(RedsState *reds, MainChannelClient *mcc, } if (mig_data->agent_base.connected) { if (agent_state->base) { // agent was attached before migration data has arrived - if (!vdagent) { + if (!reds->vdagent) { spice_assert(agent_state->plug_generation > 0); main_channel_push_agent_disconnected(reds->main_channel); spice_debug("agent is no longer connected"); @@ -1368,7 +1366,7 @@ int reds_handle_migrate_data(RedsState *reds, MainChannelClient *mcc, } } else { spice_debug("agent was not attached on the source host"); - if (vdagent) { + if (reds->vdagent) { /* spice_char_device_client_remove disables waiting for migration data */ spice_char_device_client_remove(agent_state->base, main_channel_client_get_base(mcc)->client); @@ -1700,7 +1698,7 @@ static void reds_handle_main_link(RedsState *reds, RedLinkInfo *link) free(link_mess); red_client_set_main(client, mcc); - if (vdagent) { + if (reds->vdagent) { if (mig_target) { spice_warning("unexpected: vdagent attached to destination during migration"); } @@ -2994,12 +2992,12 @@ static SpiceCharDeviceState *attach_to_red_agent(RedsState *reds, SpiceCharDevic spice_char_device_state_reset_dev_instance(state->base, sin); } - vdagent = sin; + reds->vdagent = sin; reds_update_mouse_mode(reds); - sif = SPICE_CONTAINEROF(vdagent->base.sif, SpiceCharDeviceInterface, base); + sif = SPICE_CONTAINEROF(reds->vdagent->base.sif, SpiceCharDeviceInterface, base); if (sif->state) { - sif->state(vdagent, 1); + sif->state(reds->vdagent, 1); } if (!reds_main_channel_connected(reds)) { @@ -3124,7 +3122,7 @@ static int spice_server_char_device_add_interface(SpiceServer *s, spice_info("CHAR_DEVICE %s", char_device->subtype); if (strcmp(char_device->subtype, SUBTYPE_VDAGENT) == 0) { - if (vdagent) { + if (s->vdagent) { spice_warning("vdagent already attached"); return -1; } @@ -3171,7 +3169,7 @@ static void spice_server_char_device_remove_interface(RedsState *reds, SpiceBase spice_info("remove CHAR_DEVICE %s", char_device->subtype); if (strcmp(char_device->subtype, SUBTYPE_VDAGENT) == 0) { - if (vdagent) { + if (reds->vdagent) { reds_agent_remove(reds); } } diff --git a/server/reds.h b/server/reds.h index 4034199..24fb2a6 100644 --- a/server/reds.h +++ b/server/reds.h @@ -60,7 +60,7 @@ void reds_register_channel(RedsState *reds, RedChannel *channel); void reds_unregister_channel(RedsState *reds, RedChannel *channel); int reds_get_mouse_mode(RedsState *reds); // used by inputs_channel int reds_get_agent_mouse(void); // used by inputs_channel -int reds_has_vdagent(void); // used by inputs channel +int reds_has_vdagent(RedsState *reds); // used by inputs channel void reds_handle_agent_mouse_event(RedsState *reds, const VDAgentMouseState *mouse_state); // used by inputs_channel GArray* reds_get_renderers(RedsState *reds); -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel