Ping?
On 07/14/2016 12:11 AM, Ulf Brosziewski wrote:
> Sorry for the repetition, it seems that single-touch state
> needs the same treatment as MT state when wsmouse is being
> reopened. Single-touch state "synchronizes" itself immediately
> when the first changes occur, but it may happen that the first
> touch after a restart with dirty state won't trigger pointer
> motion (if there is no update of the contact count).
>
> The patch reverts wsmouse_mt_init to its previous form, the
> input state will now be cleared completely by wsmousedoopen.
>
> OK?
>
>
> Index: wsmouse.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/wscons/wsmouse.c,v
> retrieving revision 1.32
> diff -u -p -r1.32 wsmouse.c
> --- wsmouse.c 12 Jul 2016 22:02:53 -0000 1.32
> +++ wsmouse.c 13 Jul 2016 21:59:01 -0000
> @@ -379,6 +379,8 @@ wsmousedoopen(struct wsmouse_softc *sc,
> {
> sc->sc_base.me_evp = evp;
>
> + wsmouse_input_reset(&sc->input);
> +
> /* enable the device, and punt if that's not possible */
> return (*sc->sc_accessops->enable)(sc->sc_accesscookie);
> }
> @@ -1266,8 +1268,11 @@ wsmouse_mt_init(struct device *sc, int n
> &((struct wsmouse_softc *) sc)->input;
> int n, size;
>
> + if (num_slots == input->mt.num_slots
> + && (!tracking == ((input->flags & MT_TRACKING) == 0)))
> + return (0);
> +
> free_mt_slots(input);
> - memset(&input->mt, 0, sizeof(struct mt_state));
>
> if (tracking)
> input->flags |= MT_TRACKING;
> @@ -1375,4 +1380,25 @@ void
> wsmouse_input_cleanup(struct wsmouseinput *input)
> {
> free_mt_slots(input);
> +}
> +
> +void
> +wsmouse_input_reset(struct wsmouseinput *input)
> +{
> + int num_slots, *matrix;
> + struct mt_slot *slots;
> +
> + memset(&input->btn, 0, sizeof(struct btn_state));
> + memset(&input->motion, 0, sizeof(struct motion_state));
> + memset(&input->touch, 0, sizeof(struct touch_state));
> + input->touch.min_pressure = input->params.pressure_hi;
> + if ((num_slots = input->mt.num_slots)) {
> + slots = input->mt.slots;
> + matrix = input->mt.matrix;
> + memset(&input->mt, 0, sizeof(struct mt_state));
> + memset(slots, 0, num_slots * sizeof(struct mt_slot));
> + input->mt.num_slots = num_slots;
> + input->mt.slots = slots;
> + input->mt.matrix = matrix;
> + }
> }
> Index: wsmouseinput.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/wscons/wsmouseinput.h,v
> retrieving revision 1.1
> diff -u -p -r1.1 wsmouseinput.h
> --- wsmouseinput.h 30 Mar 2016 23:34:12 -0000 1.1
> +++ wsmouseinput.h 13 Jul 2016 21:59:01 -0000
> @@ -141,6 +141,7 @@ void wsmouse_init_scaling(struct wsmouse
>
> void wsmouse_input_init(struct wsmouseinput *, struct wseventvar **);
> void wsmouse_input_cleanup(struct wsmouseinput *);
> +void wsmouse_input_reset(struct wsmouseinput *);
>
>
> #define FOREACHBIT(v, i) \
>
>