Hi Pierre. Thank you for taking the time to create a patch.

My biggest change was moving the following up in the HandleState
function, so the low level state is corrected *before* doing button
detection (this removed the quirk that depended on the order in which
fingers hit the touchpad):

//Correct HW state by throwing out fingers outside of the active area
    inside_active_area = FALSE;
    hw->numFingers = 0;
    for (int i = 0; i < hw->num_mt_mask; i++) {
        ValuatorMask *f1;
        Bool mt_inside;
        double x1, y1;

        if (hw->slot_state[i] == SLOTSTATE_EMPTY || hw->slot_state[i] == 
SLOTSTATE_CLOSE)
            continue;

        f1 = hw->mt_mask[i];
        x1 = valuator_mask_get_double(f1, 0);
        y1 = valuator_mask_get_double(f1, 1);
        mt_inside = is_inside_active_area(priv, x1, y1);
        if (!mt_inside) {
            hw->slot_state[i] = SLOTSTATE_EMPTY;
            continue;
        }
        if (!inside_active_area) {
            inside_active_area = TRUE;
            hw->x = x1;
            hw->y = y1;
        }
        hw->numFingers++;
    }

You may notice that I removed the check to see if the touchpad is a
clickpad - I did this because it did not look like the code was being
executed. You could put that back in (turned out I was not actually
replacing the installed driver when I did "make install").


Secondly, I also removed something odd from is_inside_active_area. That 
function now looks like:

static Bool is_inside_active_area(SynapticsPrivate * priv, int x, int y) {
        if ((priv->synpara.area_left_edge != 0) && (x < 
priv->synpara.area_left_edge))
                return FALSE;
        else if ((priv->synpara.area_right_edge != 0) && (x > 
priv->synpara.area_right_edge))
                return FALSE;

        if ((priv->synpara.area_top_edge != 0) && (y < 
priv->synpara.area_top_edge))
                return FALSE;
        else if ((priv->synpara.area_bottom_edge != 0) && (y > 
priv->synpara.area_bottom_edge))
                return FALSE;

        return TRUE;
}

I did this mainly because the code that was there was not consistent
with how the function is being used now - it would return true in
circumstances when the source finger was NOT in the active area but if
something else was (which could mess up the finger count). I don't think
I tried the first change without the second, but it is certainly
plausible that the second change could fix the type of behavior you are
talking about. I have not seen such behavior on my machine with these
changes.

It seems suspicious that the patched driver would result in no changes.
I would make sure that you are actually running your custom version of
the driver and not the stock version. Try to break something
deliberately - I would suggest putting:

if (hw->numFingers > 1) hw->numFingers = 1;

After the first change and try to run the new driver. If two-finger
scroll still works you know that you are running the old driver.

Bryan

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1026046

Title:
  Missing support for thumb resting on bottom of clickpad

To manage notifications about this bug go to:
https://bugs.launchpad.net/xserver-xorg-input-synaptics/+bug/1026046/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to