Re: [vdagent-linux v2] randr: handle XRRScreenChangeNotifyEvent

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On Wed, Oct 8, 2014 at 2:07 PM, Christophe Fergeau <cfergeau@xxxxxxxxxx> wrote:
On Wed, Aug 27, 2014 at 08:51:10PM +0200, Marc-André Lureau wrote:
> From: Marc-Andre Lureau <marcandre.lureau@xxxxxxxxxx>
>
> 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);
> +

Enabling this on just root_window[0] will still allow us to get events
for changes on any screen regardless of their root window?


This is randr code, there is a single root window.
 

>      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);

I think '0' is not good enough here and that the index of sce->window
should be used (see ConfigureNotify handling in
vdagent_x11_handle_event)

 same reason, only a single screen supported with randr.


> +            break;
> +        }
> +        case RRNotify: {

'case RRCrtcChangeNotify' as this is what was selected earlier?

RRCrtcChangeNotify is a event subtype of RRNotify, since that's the only one we can catch here, no need to filter futher.

Christophe

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel




--
Marc-André Lureau
_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel

[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]