[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