[Spice-devel] [PATCH vdagent v4 3/4] refetch _NET_WM_NAME in vdagent_x11_has_icons_on_desktop()

Jakub Janků janku.jakub.jj at gmail.com
Tue Dec 5 18:45:52 UTC 2017


Don't cache _NET_WM_NAME, instead refetch it with each
vdagent_x11_has_icons_on_desktop() call so that correct result is returned
even if the window manager changes during the lifetime of vdagent_x11 struct.
Remove char *net_wm_name from vdagent_x11.

Remove x11 argument from vdagent_x11_has_icons_on_desktop().

Since the name is refetched, don't log it in vdagent_x11_create().
---
 src/vdagent/vdagent.c  |  8 ++++----
 src/vdagent/x11-priv.h |  1 -
 src/vdagent/x11.c      | 24 ++++++++++++------------
 src/vdagent/x11.h      |  2 +-
 4 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/src/vdagent/vdagent.c b/src/vdagent/vdagent.c
index 4710a44..d86ee25 100644
--- a/src/vdagent/vdagent.c
+++ b/src/vdagent/vdagent.c
@@ -109,7 +109,7 @@ static const gchar *xfer_get_download_directory(VDAgent *agent)
         return fx_dir;
     }
 
-    return g_get_user_special_dir(vdagent_x11_has_icons_on_desktop(agent->x11) ?
+    return g_get_user_special_dir(vdagent_x11_has_icons_on_desktop() ?
                                   G_USER_DIRECTORY_DESKTOP :
                                   G_USER_DIRECTORY_DOWNLOAD);
 }
@@ -123,6 +123,7 @@ static const gchar *xfer_get_download_directory(VDAgent *agent)
 static gboolean vdagent_init_file_xfer(VDAgent *agent)
 {
     const gchar *xfer_dir;
+    gboolean open_dir;
 
     if (agent->xfers != NULL) {
         syslog(LOG_DEBUG, "File-xfer already initialized");
@@ -137,11 +138,10 @@ static gboolean vdagent_init_file_xfer(VDAgent *agent)
         return FALSE;
     }
 
-    if (fx_open_dir == -1)
-        fx_open_dir = !vdagent_x11_has_icons_on_desktop(agent->x11);
+    open_dir = fx_open_dir == -1 ? !vdagent_x11_has_icons_on_desktop() : fx_open_dir;
 
     agent->xfers = vdagent_file_xfers_create(agent->conn, xfer_dir,
-                                             fx_open_dir, debug);
+                                             open_dir, debug);
     return (agent->xfers != NULL);
 }
 
diff --git a/src/vdagent/x11-priv.h b/src/vdagent/x11-priv.h
index 677a44d..3776098 100644
--- a/src/vdagent/x11-priv.h
+++ b/src/vdagent/x11-priv.h
@@ -87,7 +87,6 @@ struct vdagent_x11 {
     Window root_window[MAX_SCREENS];
     Window selection_window;
     struct udscs_connection *vdagentd;
-    char *net_wm_name;
     int debug;
     int fd;
     int screen_count;
diff --git a/src/vdagent/x11.c b/src/vdagent/x11.c
index ec068f4..fcbd01d 100644
--- a/src/vdagent/x11.c
+++ b/src/vdagent/x11.c
@@ -228,18 +228,18 @@ struct vdagent_x11 *vdagent_x11_create(struct udscs_connection *vdagentd,
     }
     vdagent_x11_send_daemon_guest_xorg_res(x11, 1);
 
-    /* Get net_wm_name, since we are started at the same time as the wm,
-       sometimes we need to wait a bit for it to show up. */
-    i = 10;
-    x11->net_wm_name = (gchar *)vdagent_x11_get_wm_name();
-    while (!strcmp(x11->net_wm_name, "unknown") && --i > 0) {
+    /* Since we are started at the same time as the wm,
+       sometimes we need to wait a bit for the _NET_WM_NAME to show up. */
+    const gchar *net_wm_name;
+    for (i = 0; i < 9; i++) {
+        net_wm_name = vdagent_x11_get_wm_name();
+        if (strcmp(net_wm_name, "unknown"))
+            break;
         usleep(100000);
-        x11->net_wm_name = (gchar *)vdagent_x11_get_wm_name();
     }
-    x11->net_wm_name = g_strdup(x11->net_wm_name);
     if (x11->debug)
-        syslog(LOG_DEBUG, "net_wm_name: \"%s\", has icons: %d",
-               x11->net_wm_name, vdagent_x11_has_icons_on_desktop(x11));
+        syslog(LOG_DEBUG, "%s: net_wm_name=\"%s\", has icons=%d",
+               __func__, net_wm_name, vdagent_x11_has_icons_on_desktop(x11));
 
     /* Flush output buffers and consume any pending events */
     vdagent_x11_do_read(x11);
@@ -262,7 +262,6 @@ void vdagent_x11_destroy(struct vdagent_x11 *x11, int vdagentd_disconnected)
     }
 
     XCloseDisplay(x11->display);
-    g_free(x11->net_wm_name);
     free(x11->randr.failed_conf);
     free(x11);
 }
@@ -1291,7 +1290,7 @@ void vdagent_x11_client_disconnected(struct vdagent_x11 *x11)
    whitelist approach, so any unknown desktop will end up with saving
    file-xfers to the xdg download dir, and opening the xdg download dir with
    xdg-open when the file-xfer completes. */
-int vdagent_x11_has_icons_on_desktop(struct vdagent_x11 *x11)
+int vdagent_x11_has_icons_on_desktop()
 {
     const char * const wms_with_icons_on_desktop[] = {
         "Metacity", /* GNOME-2 or GNOME-3 fallback */
@@ -1299,10 +1298,11 @@ int vdagent_x11_has_icons_on_desktop(struct vdagent_x11 *x11)
         "Marco",    /* Mate */
         NULL
     };
+    const gchar *net_wm_name = vdagent_x11_get_wm_name();
     int i;
 
     for (i = 0; wms_with_icons_on_desktop[i]; i++)
-        if (!strcmp(x11->net_wm_name, wms_with_icons_on_desktop[i]))
+        if (!strcmp(net_wm_name, wms_with_icons_on_desktop[i]))
             return 1;
 
     return 0;
diff --git a/src/vdagent/x11.h b/src/vdagent/x11.h
index 4fd0380..a8ceb08 100644
--- a/src/vdagent/x11.h
+++ b/src/vdagent/x11.h
@@ -48,6 +48,6 @@ void vdagent_x11_clipboard_release(struct vdagent_x11 *x11, uint8_t selection);
 
 void vdagent_x11_client_disconnected(struct vdagent_x11 *x11);
 
-int vdagent_x11_has_icons_on_desktop(struct vdagent_x11 *x11);
+int vdagent_x11_has_icons_on_desktop();
 
 #endif
-- 
2.14.3



More information about the Spice-devel mailing list