[Spice-devel] [PATCH 04/18] keep dispatcher list in RedsState
Frediano Ziglio
fziglio at redhat.com
Mon Feb 15 16:01:05 UTC 2016
This duplicate the other list which will be removed
Signed-off-by: Jonathon Jongsma <jjongsma at redhat.com>
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
server/red-dispatcher.c | 22 +++++++++-------------
server/red-dispatcher.h | 2 +-
server/reds-private.h | 2 +-
server/reds.c | 15 +++++++++++----
4 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/server/red-dispatcher.c b/server/red-dispatcher.c
index 9ec760f..68423a1 100644
--- a/server/red-dispatcher.c
+++ b/server/red-dispatcher.c
@@ -713,19 +713,6 @@ void red_dispatcher_on_sv_change(void)
}
}
-void red_dispatcher_set_mouse_mode(uint32_t mode)
-{
- RedWorkerMessageSetMouseMode payload;
- RedDispatcher *now = dispatchers;
- while (now) {
- payload.mode = mode;
- dispatcher_send_message(&now->dispatcher,
- RED_WORKER_MESSAGE_SET_MOUSE_MODE,
- &payload);
- now = now->next;
- }
-}
-
void red_dispatcher_on_vm_stop(void)
{
RedDispatcher *now = dispatchers;
@@ -1101,3 +1088,12 @@ void red_dispatcher_clear_pending(RedDispatcher *red_dispatcher, int pending)
clear_bit(pending, &red_dispatcher->pending);
}
+
+void red_dispatcher_set_mouse_mode(RedDispatcher *dispatcher, uint32_t mode)
+{
+ RedWorkerMessageSetMouseMode payload;
+ payload.mode = mode;
+ dispatcher_send_message(&dispatcher->dispatcher,
+ RED_WORKER_MESSAGE_SET_MOUSE_MODE,
+ &payload);
+}
diff --git a/server/red-dispatcher.h b/server/red-dispatcher.h
index 4aa5854..1c0c218 100644
--- a/server/red-dispatcher.h
+++ b/server/red-dispatcher.h
@@ -28,7 +28,7 @@ void red_dispatcher_init(QXLInstance *qxl);
void red_dispatcher_on_ic_change(void);
void red_dispatcher_on_sv_change(void);
-void red_dispatcher_set_mouse_mode(uint32_t mode);
+void red_dispatcher_set_mouse_mode(RedDispatcher *dispatcher, uint32_t mode);
void red_dispatcher_on_vm_stop(void);
void red_dispatcher_on_vm_start(void);
int red_dispatcher_count(void);
diff --git a/server/reds-private.h b/server/reds-private.h
index 2272d4c..c214091 100644
--- a/server/reds-private.h
+++ b/server/reds-private.h
@@ -241,7 +241,7 @@ struct RedsState {
RedSSLParameters ssl_parameters;
SpiceCoreInterfaceInternal *core;
-
+ GList *dispatchers;
};
#endif
diff --git a/server/reds.c b/server/reds.c
index 418f89a..3882477 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -556,11 +556,16 @@ int reds_get_mouse_mode(RedsState *reds)
static void reds_set_mouse_mode(RedsState *reds, uint32_t mode)
{
+ GList *l;
+
if (reds->mouse_mode == mode) {
return;
}
reds->mouse_mode = mode;
- red_dispatcher_set_mouse_mode(reds->mouse_mode);
+
+ for (l = reds->dispatchers; l != NULL; l = l->next)
+ red_dispatcher_set_mouse_mode(l->data, mode);
+
main_channel_push_mouse_mode(reds->main_channel, reds->mouse_mode, reds->is_client_mouse_allowed);
}
@@ -572,9 +577,10 @@ gboolean reds_get_agent_mouse(const RedsState *reds)
static void reds_update_mouse_mode(RedsState *reds)
{
int allowed = 0;
+ int qxl_count = g_list_length(reds->dispatchers);
if ((reds->agent_mouse && reds->vdagent) ||
- (inputs_channel_has_tablet(reds->inputs_channel))) {
+ (inputs_channel_has_tablet(reds->inputs_channel) && qxl_count == 1)) {
allowed = reds->dispatcher_allows_client_mouse;
}
if (allowed == reds->is_client_mouse_allowed) {
@@ -1668,7 +1674,7 @@ static void reds_handle_main_link(RedsState *reds, RedLinkInfo *link)
}
if (!mig_target) {
- main_channel_push_init(mcc, red_dispatcher_count(),
+ main_channel_push_init(mcc, g_list_length(reds->dispatchers),
reds->mouse_mode, reds->is_client_mouse_allowed,
reds_get_mm_time() - MM_TIME_DELTA,
red_dispatcher_qxl_ram_size());
@@ -1814,7 +1820,7 @@ void reds_on_client_semi_seamless_migrate_complete(RedsState *reds, RedClient *c
mcc = red_client_get_main(client);
// TODO: not doing net test. consider doing it on client_migrate_info
- main_channel_push_init(mcc, red_dispatcher_count(),
+ main_channel_push_init(mcc, g_list_length(reds->dispatchers),
reds->mouse_mode, reds->is_client_mouse_allowed,
reds_get_mm_time() - MM_TIME_DELTA,
red_dispatcher_qxl_ram_size());
@@ -3196,6 +3202,7 @@ SPICE_GNUC_VISIBLE int spice_server_add_interface(SpiceServer *s,
qxl->st->scanout.drm_dma_buf_fd = -1;
qxl->st->qif = SPICE_CONTAINEROF(interface, QXLInterface, base);
red_dispatcher_init(qxl);
+ reds->dispatchers = g_list_prepend(reds->dispatchers, qxl->st->dispatcher);
} else if (strcmp(interface->type, SPICE_INTERFACE_TABLET) == 0) {
SpiceTabletInstance *tablet = SPICE_CONTAINEROF(sin, SpiceTabletInstance, base);
--
2.5.0
More information about the Spice-devel
mailing list