[Spice-devel] [PATCH spice-gtk v3 1/4] gtk-session: use clear variable for array's size

Victor Toso victortoso at redhat.com
Mon May 22 18:08:37 UTC 2017


From: Victor Toso <me at victortoso.com>

By using 'num_types' variables, we have a clear variable with a clear
propose: It will track the number of VD_AGENT_CLIPBOARD types we are
storing in types[] array.

This new variable helps:
- removing one for that was counting the number stored types;
- reducing one for to the size of 'num_types'

A few extra comments were included to clarify what the logic should be
doing and a extra debug was included to point out situations where the
desktop has sent us valid clipboard data but none will be sent the
guest.

Signed-off-by: Victor Toso <victortoso at redhat.com>
Signed-off-by: Victor Toso <me at victortoso.com>
---
 src/spice-gtk-session.c | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/src/spice-gtk-session.c b/src/spice-gtk-session.c
index cfdfc4c..83eaa3e 100644
--- a/src/spice-gtk-session.c
+++ b/src/spice-gtk-session.c
@@ -616,6 +616,7 @@ static void clipboard_get_targets(GtkClipboard *clipboard,
 
     SpiceGtkSessionPrivate *s = self->priv;
     guint32 types[SPICE_N_ELEMENTS(atom2agent)] = { 0 };
+    gint num_types;
     char *name;
     int a, m, t;
     int selection;
@@ -635,38 +636,41 @@ static void clipboard_get_targets(GtkClipboard *clipboard,
         }
     }
 
+    /* Set all Atoms that matches our current protocol implementation */
+    num_types = 0;
     for (a = 0; a < n_atoms; a++) {
         name = gdk_atom_name(atoms[a]);
         for (m = 0; m < SPICE_N_ELEMENTS(atom2agent); m++) {
             if (strcasecmp(name, atom2agent[m].xatom) != 0) {
                 continue;
             }
-            /* found match */
-            for (t = 0; t < SPICE_N_ELEMENTS(atom2agent); t++) {
+
+            /* check if type is already in list */
+            for (t = 0; t < num_types; t++) {
                 if (types[t] == atom2agent[m].vdagent) {
-                    /* type already in list */
-                    break;
-                }
-                if (types[t] == 0) {
-                    /* add type to empty slot */
-                    types[t] = atom2agent[m].vdagent;
                     break;
                 }
             }
-            break;
+
+            if (types[t] == 0) {
+                /* add type to empty slot */
+                types[t] = atom2agent[m].vdagent;
+                num_types++;
+            }
         }
         g_free(name);
     }
-    for (t = 0; t < SPICE_N_ELEMENTS(atom2agent); t++) {
-        if (types[t] == 0) {
-            break;
-        }
+
+    if (num_types == 0) {
+        SPICE_DEBUG("No GdkAtoms will be sent from %d", n_atoms);
+        return;
     }
-    if (!s->clip_grabbed[selection] && t > 0) {
+
+    if (!s->clip_grabbed[selection]) {
         s->clip_grabbed[selection] = TRUE;
 
         if (spice_main_agent_test_capability(s->main, VD_AGENT_CAP_CLIPBOARD_BY_DEMAND))
-            spice_main_clipboard_selection_grab(s->main, selection, types, t);
+            spice_main_clipboard_selection_grab(s->main, selection, types, num_types);
         /* Sending a grab causes the agent to do an implicit release */
         s->nclip_targets[selection] = 0;
     }
-- 
2.13.0



More information about the Spice-devel mailing list