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@xxxxxxxxx <mailto:marcandre.lureau@xxxxxxxxx>> wrote: > > ping > > > On Wed, Aug 27, 2014 at 8:51 PM, Marc-André Lureau > <marcandre.lureau@xxxxxxxxxx <mailto:marcandre.lureau@xxxxxxxxxx>> > wrote: > > From: Marc-Andre Lureau <marcandre.lureau@xxxxxxxxxx > <mailto: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); > + > 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@xxxxxxxxxxxxxxxxxxxxx > <mailto:Spice-devel@xxxxxxxxxxxxxxxxxxxxx> > http://lists.freedesktop.org/mailman/listinfo/spice-devel > > > > > -- > Marc-André Lureau > > > > > -- > Marc-André Lureau > > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel > _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel