[Spice-devel] [PATCH linux vdagent v4 5/9] Factor a function out of get_current_mon_config()
Lukáš Hrázký
lhrazky at redhat.com
Fri Jan 18 12:54:43 UTC 2019
On Thu, 2019-01-17 at 16:14 -0600, Jonathon Jongsma wrote:
> When sending the guest xorg resolution to the vdagentd daemon, we get
> the current resolution with this function, which returns a
> VDAgentMonitorsConfig structure that must then be converted to the
> structure that we send to the daemon. Rather than re-using this function
> that returns the wrong type, factor out most of the functionality into a
> separate function. This function can be used by a new function to return
> a type appropriate for sending the xorg resolution to the daemon.
>
> This is necessary because in the next few commits I'll be changing the
> vdagentd protocol to send an additional display_id parameter to the
> daemon.
> ---
> src/vdagent/x11-randr.c | 73 +++++++++++++++++++++++++++++------------
> 1 file changed, 52 insertions(+), 21 deletions(-)
>
> diff --git a/src/vdagent/x11-randr.c b/src/vdagent/x11-randr.c
> index 5eff225..05a001e 100644
> --- a/src/vdagent/x11-randr.c
> +++ b/src/vdagent/x11-randr.c
> @@ -688,38 +688,69 @@ static int config_size(int num_of_monitors)
> num_of_monitors * sizeof(VDAgentMonConfig);
> }
>
> +
> +// 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)
Lines above too long.
> +{
> + g_return_val_if_fail (output_index < x11->randr.res->noutput, false);
> + g_return_val_if_fail (x != NULL, false);
> + g_return_val_if_fail (y != NULL, false);
> + g_return_val_if_fail (width != NULL, false);
> + g_return_val_if_fail (height != NULL, false);
> +
> + int j;
> + XRRCrtcInfo *crtc = NULL;
> + XRRModeInfo *mode;
> +
> + if (x11->randr.outputs[output_index]->ncrtc == 0)
> + goto zeroed; /* Monitor disabled */
> +
> + for (j = 0; crtc == NULL && j < x11->randr.outputs[output_index]->ncrtc; j++) {
> + crtc = crtc_from_id(x11, x11->randr.outputs[output_index]->crtcs[j]);
> + }
> + if (!crtc) {
> + // error. stale xrandr info?
> + return false;
> + }
> +
> + mode = mode_from_id(x11, crtc->mode);
> + if (!mode)
> + goto zeroed; /* monitor disabled */
> +
> + *x = crtc->x;
> + *y = crtc->y;
> + *width = mode->width;
> + *height = mode->height;
> + return true;
> +
> +zeroed:
> + *x = 0;
> + *y = 0;
> + *width = 0;
> + *height = 0;
> + return true;
> +}
> +
> static VDAgentMonitorsConfig *get_current_mon_config(struct vdagent_x11 *x11)
> {
> int i, num_of_monitors = 0;
> - XRRModeInfo *mode;
> XRRScreenResources *res = x11->randr.res;
> VDAgentMonitorsConfig *mon_config;
>
> mon_config = g_malloc0(config_size(res->noutput));
>
> for (i = 0 ; i < res->noutput; i++) {
> - int j;
> - XRRCrtcInfo *crtc = NULL;
> -
> - if (x11->randr.outputs[i]->ncrtc == 0)
> - continue; /* Monitor disabled, already zero-ed by calloc */
> - if (x11->randr.outputs[i]->crtc == 0)
> - continue; /* Monitor disabled */
> -
> - for (j = 0; crtc == NULL && j < x11->randr.outputs[i]->ncrtc; j++) {
> - crtc = crtc_from_id(x11, x11->randr.outputs[i]->crtcs[j]);
> - }
> - if (!crtc)
> + int x, y, width, height;
> + if (!get_monitor_info_for_output_index(x11, i, &x, &y, &width, &height)) {
> + syslog(LOG_WARNING, "Unable to get monitor info for output id %d", i);
> goto error;
> + }
>
> - mode = mode_from_id(x11, crtc->mode);
> - if (!mode)
> - continue; /* Monitor disabled, already zero-ed by calloc */
> -
> - mon_config->monitors[i].x = crtc->x;
> - mon_config->monitors[i].y = crtc->y;
> - mon_config->monitors[i].width = mode->width;
> - mon_config->monitors[i].height = mode->height;
> + VDAgentMonConfig *mon = &mon_config->monitors[i];
> + mon->x = x;
> + mon->y = y;
> + mon->width = width;
> + mon->height = height;
> num_of_monitors = i + 1;
> }
> mon_config->num_of_monitors = num_of_monitors;
Reviewed-by: Lukáš Hrázký <lhrazky at redhat.com>
More information about the Spice-devel
mailing list