[Spice-devel] [vdagent-linux v2] randr: handle XRRScreenChangeNotifyEvent

Alon Levy alon at pobox.com
Wed Oct 8 03:49:44 PDT 2014


On 10/08/2014 01:10 PM, Marc-André Lureau wrote:
> ping

I didn't test this, looks good, just one single line if, do with it as
you will. And unrelated, but you use TRUE/FALSE constants for handled,
maybe nice to use them too (at least be consistent that is) in
vdagent_x11_handle_event.

> 
> On Mon, Sep 8, 2014 at 11:34 AM, Marc-André Lureau
> <marcandre.lureau at gmail.com <mailto:marcandre.lureau at gmail.com>> wrote:
> 
>     ping
> 
> 
>     On Wed, Aug 27, 2014 at 8:51 PM, Marc-André Lureau
>     <marcandre.lureau at redhat.com <mailto:marcandre.lureau at redhat.com>>
>     wrote:
> 
>         From: Marc-Andre Lureau <marcandre.lureau at redhat.com
>         <mailto:marcandre.lureau at redhat.com>>
> 
>         Make sure vdagent follows the current monitor configuration.  This
>         solves a number of issue where the pointer input is off, because the
>         uinput tablet isn't reconfigured.
> 
>         https://bugzilla.redhat.com/show_bug.cgi?id=1086657
>         ---
>          src/vdagent-x11-priv.h  |  4 +++-
>          src/vdagent-x11-randr.c | 34 +++++++++++++++++++++++++++++++++-
>          src/vdagent-x11.c       |  4 +++-
>          3 files changed, 39 insertions(+), 3 deletions(-)
> 
>         diff --git a/src/vdagent-x11-priv.h b/src/vdagent-x11-priv.h
>         index 38f852e..d60cc07 100644
>         --- a/src/vdagent-x11-priv.h
>         +++ b/src/vdagent-x11-priv.h
>         @@ -95,6 +95,7 @@ struct vdagent_x11 {
>              int height[MAX_SCREENS];
>              int has_xfixes;
>              int xfixes_event_base;
>         +    int xrandr_event_base;
>              int max_prop_size;
>              int expected_targets_notifies[256];
>              int clipboard_owner[256];
>         @@ -145,7 +146,8 @@ void
>         vdagent_x11_send_daemon_guest_xorg_res(struct vdagent_x11 *x11,
>                                                      int update);
>          void vdagent_x11_randr_handle_root_size_change(struct
>         vdagent_x11 *x11,
>                                                      int screen, int
>         width, int height);
>         -
>         +int vdagent_x11_randr_handle_event(struct vdagent_x11 *x11,
>         +    XEvent event);
>          void vdagent_x11_set_error_handler(struct vdagent_x11 *x11,
>              int (*handler)(Display *, XErrorEvent *));
>          int vdagent_x11_restore_error_handler(struct vdagent_x11 *x11);
>         diff --git a/src/vdagent-x11-randr.c b/src/vdagent-x11-randr.c
>         index 5faaee6..c6f790e 100644
>         --- a/src/vdagent-x11-randr.c
>         +++ b/src/vdagent-x11-randr.c
>         @@ -132,12 +132,15 @@ void vdagent_x11_randr_init(struct
>         vdagent_x11 *x11)
>                  return;
>              }
> 
>         -    if (XRRQueryExtension(x11->display, &i, &i)) {
>         +    if (XRRQueryExtension(x11->display,
>         &x11->xrandr_event_base, &i)) {
>                  XRRQueryVersion(x11->display, &x11->xrandr_major,
>         &x11->xrandr_minor);
>                  if (x11->xrandr_major == 1 && x11->xrandr_minor >= 3)
>                      x11->has_xrandr = 1;
>              }
> 
>         +    XRRSelectInput(x11->display, x11->root_window[0],
>         +        RRScreenChangeNotifyMask | RRCrtcChangeNotifyMask);
>         +
>              if (x11->has_xrandr) {
>                  update_randr_res(x11, 0);
>              } else {
>         @@ -466,6 +469,8 @@ static int set_screen_to_best_size(struct
>         vdagent_x11 *x11, int width, int heigh
>          void vdagent_x11_randr_handle_root_size_change(struct
>         vdagent_x11 *x11,
>              int screen, int width, int height)
>          {
>         +    update_randr_res(x11, 0);
>         +
>              if (width == x11->width[screen] && height ==
>         x11->height[screen]) {
>                  return;
>              }
>         @@ -481,6 +486,33 @@ void
>         vdagent_x11_randr_handle_root_size_change(struct vdagent_x11 *x11,
>              }
>          }
> 
>         +int vdagent_x11_randr_handle_event(struct vdagent_x11 *x11,
>         +    XEvent event)
>         +{
>         +    int handled = TRUE;
>         +
>         +    switch (event.type - x11->xrandr_event_base) {
>         +        case RRScreenChangeNotify: {
>         +            XRRScreenChangeNotifyEvent *sce =
>         +                (XRRScreenChangeNotifyEvent *) &event;
>         +            vdagent_x11_randr_handle_root_size_change(x11, 0,
>         +                sce->width, sce->height);
>         +            break;
>         +        }
>         +        case RRNotify: {
>         +            update_randr_res(x11, 0);
>         +            if (!x11->dont_send_guest_xorg_res)
>         +                vdagent_x11_send_daemon_guest_xorg_res(x11, 1);
>         +            break;
>         +        }
>         +        default:
>         +            handled = FALSE;
>         +            break;
>         +    }
>         +
>         +    return handled;
>         +}
>         +
>          static int min_int(int x, int y)
>          {
>              return x > y ? y : x;
>         diff --git a/src/vdagent-x11.c b/src/vdagent-x11.c
>         index 752b337..9619dc5 100644
>         --- a/src/vdagent-x11.c
>         +++ b/src/vdagent-x11.c
>         @@ -503,9 +503,11 @@ static void vdagent_x11_handle_event(struct
>         vdagent_x11 *x11, XEvent event)
>                  return;
>              }
> 
>         +    if (vdagent_x11_randr_handle_event(x11, event))
>         +        return;
>         +
>              switch (event.type) {
>              case ConfigureNotify:
>         -        // TODO: handle CrtcConfigureNotify,
>         OutputConfigureNotify can be ignored.
>                  for (i = 0; i < x11->screen_count; i++)
>                      if (event.xconfigure.window == x11->root_window[i])
>                          break;
>         --
>         1.9.3
> 
>         _______________________________________________
>         Spice-devel mailing list
>         Spice-devel at lists.freedesktop.org
>         <mailto:Spice-devel at lists.freedesktop.org>
>         http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 
> 
> 
> 
>     -- 
>     Marc-André Lureau
> 
> 
> 
> 
> -- 
> Marc-André Lureau
> 
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 



More information about the Spice-devel mailing list