[Spice-devel] [PATCH linux vdagent v4 7/9] Send display_id down to the vdagentd daemon
Lukáš Hrázký
lhrazky at redhat.com
Fri Jan 18 13:17:31 UTC 2019
On Thu, 2019-01-17 at 16:14 -0600, Jonathon Jongsma wrote:
> Add a display_id field to the structure that we use to send down the
> list of guest display resolutions to the vdagentd daemon. This allows us
> to map the spice display id to the proper X display for determining
> mouse locations, etc.
> ---
> src/vdagent/x11-randr.c | 35 ++++++++++++++++++++++++++++++++---
> src/vdagentd-proto.h | 1 +
> src/vdagentd/uinput.c | 23 ++++++++++++++++++-----
> 3 files changed, 51 insertions(+), 8 deletions(-)
>
> diff --git a/src/vdagent/x11-randr.c b/src/vdagent/x11-randr.c
> index f3972c8..5749ae7 100644
> --- a/src/vdagent/x11-randr.c
> +++ b/src/vdagent/x11-randr.c
> @@ -688,6 +688,34 @@ static int config_size(int num_of_monitors)
> num_of_monitors * sizeof(VDAgentMonConfig);
> }
>
> +static int get_display_id_for_output_index(struct vdagent_x11 *x11, int output_index)
> +{
> + // invalid output index
> + if (output_index >= x11->randr.res->noutput) {
> + syslog(LOG_WARNING, "Invalid output index %d (>%d)", output_index, x11->randr.res->noutput);
> + return -1;
> + }
> +
> + if (g_hash_table_size(x11->guest_output_map) == 0) {
> + syslog(LOG_DEBUG, "No guest output map, using output index as display id");
> + return output_index;
> + }
> +
> + int display_id = -1;
> + RROutput output_id = x11->randr.res->outputs[output_index];
> + GHashTableIter iter;
> + gpointer key, value;
> + g_hash_table_iter_init(&iter, x11->guest_output_map);
> + while (g_hash_table_iter_next(&iter, &key, &value)) {
> + gint64 *other_id = value;
> + if (*other_id == output_id) {
> + return GPOINTER_TO_INT(key);
> + }
> + }
> +
> + syslog(LOG_WARNING, "Unable to find a display id for output index %d)", output_index);
> + return display_id;
> +}
>
> // gets monitor information about the specified output index and returns true if there was no error
> static bool get_monitor_info_for_output_index(struct vdagent_x11 *x11, int output_index, int *x, int *y, int *width, int *height)
> @@ -1075,11 +1103,12 @@ void vdagent_x11_send_daemon_guest_xorg_res(struct vdagent_x11 *x11, int update)
> for (i = 0; i < screen_count; i++) {
> struct vdagentd_guest_xorg_resolution *curr = &res[i];
> if (!get_monitor_info_for_output_index(x11, i, &curr->x, &curr->y,
> - &curr->width, &curr->height)
> + &curr->width, &curr->height))
Oh, so this definitely belongs to the previous patch.
Besides that,
Reviewed-by: Lukáš Hrázký <lhrazky at redhat.com>
> {
> g_free(res);
> goto no_info;
> }
> + curr->display_id = get_display_id_for_output_index(x11, i);
> }
> width = x11->width[0];
> height = x11->height[0];
> @@ -1131,8 +1160,8 @@ no_info:
> if (x11->debug) {
> syslog(LOG_DEBUG, "Sending guest screen resolutions to vdagentd:");
> for (i = 0; i < screen_count; i++) {
> - syslog(LOG_DEBUG, " screen %d %dx%d%+d%+d", i,
> - res[i].width, res[i].height, res[i].x, res[i].y);
> + syslog(LOG_DEBUG, " screen %d %dx%d%+d%+d, id=%d", i,
> + res[i].width, res[i].height, res[i].x, res[i].y, res[i].display_id);
> }
> }
>
> diff --git a/src/vdagentd-proto.h b/src/vdagentd-proto.h
> index 243a9c6..7eff71d 100644
> --- a/src/vdagentd-proto.h
> +++ b/src/vdagentd-proto.h
> @@ -53,6 +53,7 @@ struct vdagentd_guest_xorg_resolution {
> int height;
> int x;
> int y;
> + int display_id;
> };
>
> #endif
> diff --git a/src/vdagentd/uinput.c b/src/vdagentd/uinput.c
> index 4f854bf..ff37e1e 100644
> --- a/src/vdagentd/uinput.c
> +++ b/src/vdagentd/uinput.c
> @@ -175,6 +175,18 @@ static void uinput_send_event(struct vdagentd_uinput **uinputp,
> }
> }
>
> +static struct vdagentd_guest_xorg_resolution* lookup_screen_info(struct vdagentd_uinput *uinput, int display_id)
> +{
> + int i;
> + for (i = 0; i < uinput->screen_count; i++) {
> + if (uinput->screen_info[i].display_id == display_id) {
> + return &uinput->screen_info[i];
> + }
> + }
> + syslog(LOG_WARNING, "Unable to find output index for display id %d", display_id);
> + return NULL;
> +}
> +
> void vdagentd_uinput_do_mouse(struct vdagentd_uinput **uinputp,
> VDAgentMouseState *mouse)
> {
> @@ -196,16 +208,17 @@ void vdagentd_uinput_do_mouse(struct vdagentd_uinput **uinputp,
> int i, down;
>
> if (*uinputp) {
> - if (mouse->display_id >= uinput->screen_count) {
> - syslog(LOG_WARNING, "mouse event for unknown monitor (%d >= %d)",
> - mouse->display_id, uinput->screen_count);
> + struct vdagentd_guest_xorg_resolution *screen_info = lookup_screen_info(uinput, mouse->display_id);
> + if (screen_info == NULL) {
> + syslog(LOG_WARNING, "mouse event for unknown monitor %d",
> + mouse->display_id);
> return;
> }
> if (uinput->debug)
> syslog(LOG_DEBUG, "mouse-event: mon %d %dx%d", mouse->display_id,
> mouse->x, mouse->y);
> - mouse->x += uinput->screen_info[mouse->display_id].x;
> - mouse->y += uinput->screen_info[mouse->display_id].y;
> + mouse->x += screen_info->x;
> + mouse->y += screen_info->y;
> #ifdef WITH_STATIC_UINPUT
> mouse->x = mouse->x * 32767 / (uinput->width - 1);
> mouse->y = mouse->y * 32767 / (uinput->height - 1);
More information about the Spice-devel
mailing list