[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