summaryrefslogtreecommitdiff
path: root/src/vdagentd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vdagentd.c')
-rw-r--r--src/vdagentd.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/vdagentd.c b/src/vdagentd.c
index 18d7950..cee779b 100644
--- a/src/vdagentd.c
+++ b/src/vdagentd.c
@@ -45,6 +45,8 @@ struct agent_data {
char *session;
int width;
int height;
+ struct vdagentd_guest_xorg_resolution *screen_info;
+ int screen_count;
};
/* variables */
@@ -238,6 +240,8 @@ int virtio_port_read_complete(
uinput = vdagentd_uinput_create(uinput_device,
agent_data->width,
agent_data->height,
+ agent_data->screen_info,
+ agent_data->screen_count,
logfile, debug > 1);
if (!uinput) {
fprintf(logfile, "Fatal uinput error\n");
@@ -394,15 +398,20 @@ static void check_xorg_resolution(void)
{
struct agent_data *agent_data = udscs_get_user_data(active_session_conn);
- if (agent_data && agent_data->width) {
+ if (agent_data && agent_data->screen_info) {
if (!uinput)
uinput = vdagentd_uinput_create(uinput_device,
agent_data->width,
agent_data->height,
+ agent_data->screen_info,
+ agent_data->screen_count,
logfile, debug > 1);
else
- vdagentd_uinput_update_size(&uinput, agent_data->width,
- agent_data->height);
+ vdagentd_uinput_update_size(&uinput,
+ agent_data->width,
+ agent_data->height,
+ agent_data->screen_info,
+ agent_data->screen_count);
if (!uinput) {
fprintf(logfile, "Fatal uinput error\n");
retval = 1;
@@ -552,8 +561,7 @@ void agent_read_complete(struct udscs_connection **connp,
switch (header->type) {
case VDAGENTD_GUEST_XORG_RESOLUTION: {
- struct vdagentd_guest_xorg_resolution *res =
- (struct vdagentd_guest_xorg_resolution *)data;
+ struct vdagentd_guest_xorg_resolution *res;
int n = header->size / sizeof(*res);
/* Detect older version session agent, but don't disconnect, as
@@ -573,8 +581,18 @@ void agent_read_complete(struct udscs_connection **connp,
return;
}
+ free(agent_data->screen_info);
+ res = malloc(n * sizeof(*res));
+ if (!res) {
+ fprintf(logfile, "out of memory allocating screen info\n");
+ n = 0;
+ }
+ memcpy(res, data, n * sizeof(*res));
agent_data->width = header->arg1;
agent_data->height = header->arg2;
+ agent_data->screen_info = res;
+ agent_data->screen_count = n;
+
check_xorg_resolution();
break;
}