From 5c197c75466ba2e970402dd5e942903238d2aea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Thu, 13 Nov 2008 23:37:03 +0000 Subject: [PATCH] * Implemented setting the "click count" correctly in the Synaptics driver. * I feel the Synaptics driver is now good enough to give it more exposure and turned it on again. If it gives you trouble for some reason, you can turn it off again in ps2_dev.c, line 105. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28643 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/bus_managers/ps2/ps2_dev.c | 2 +- .../kernel/bus_managers/ps2/ps2_synaptics.c | 50 +++++++++++++------ .../kernel/bus_managers/ps2/ps2_synaptics.h | 12 +++-- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_dev.c b/src/add-ons/kernel/bus_managers/ps2/ps2_dev.c index 85d137dd8b..c2afd6871c 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_dev.c +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_dev.c @@ -102,7 +102,7 @@ ps2_dev_detect_pointing(ps2_dev *dev, device_hooks **hooks) // probe devices // the probe function has to set the dev name and the dev packet size -#if 0 +#if 1 status = probe_trackpoint(dev); if (status == B_OK) { *hooks = &gStandardMouseDeviceHooks; diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c b/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c index e273496dee..894d614571 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.c @@ -191,6 +191,7 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, float sens = 0; bigtime_t currentTime = system_time(); touchpad_settings * settings = &(cookie->settings); + uint32 buttons = event->buttons; if (!movement) return B_ERROR; @@ -241,8 +242,8 @@ touchevent_to_movement(synaptics_cookie* cookie, touch_event *event, isSideScrollingH = true; } if (isSideScrollingV || isSideScrollingH - ||(event->wValue == 0 && settings->scroll_twofinger) - ||(event->wValue == 1 && settings->scroll_multifinger)) { + || (event->wValue == 0 && settings->scroll_twofinger) + || (event->wValue == 1 && settings->scroll_multifinger)) { goto scrolling; } else { cookie->scrolling_started = false; @@ -266,8 +267,8 @@ movement: movement->ydelta = cookie->movement_maker.yDelta; // tap gesture - cookie->tap_delta_x+= cookie->movement_maker.xDelta; - cookie->tap_delta_y+= cookie->movement_maker.yDelta; + cookie->tap_delta_x += cookie->movement_maker.xDelta; + cookie->tap_delta_y += cookie->movement_maker.yDelta; if (cookie->tapdrag_started) { movement->buttons = 0x01; // left button @@ -295,6 +296,8 @@ movement: cookie->tap_delta_y = 0; } + cookie->buttons_state = movement->buttons; + return B_OK; scrolling: @@ -316,23 +319,22 @@ scrolling: movement->wheel_xdelta = 0; else if (isSideScrollingH && !isSideScrollingV) movement->wheel_ydelta = 0; + + cookie->buttons_state = movement->buttons; + return B_OK; notouch: TRACE("SYNAPTICS: no touch event\n"); cookie->scrolling_started = false; cookie->movement_started = false; - movement->buttons = event->buttons; - if (event->buttons) - movement->clicks = 1; if (cookie->tapdrag_started && (currentTime - cookie->tap_time) < SYN_TAP_TIMEOUT) { - movement->buttons = 0x01; - movement->clicks = 0; + buttons = 0x01; } - // if the movement stopped switch off the dap trag when timeout is expired + // if the movement stopped switch off the tap drag when timeout is expired if ((currentTime - cookie->tap_time) > SYN_TAP_TIMEOUT) { cookie->tapdrag_started = false; cookie->valid_edge_motion = false; @@ -350,19 +352,32 @@ notouch: if (cookie->tap_clicks > 1) { TRACE("SYNAPTICS: empty click\n"); - movement->buttons = 0x00; - movement->clicks = 0; + buttons = 0x00; cookie->tap_clicks = 0; cookie->double_click = true; } else { - movement->buttons = 0x01; - movement->clicks = 1; + buttons = 0x01; cookie->tap_started = false; cookie->tapdrag_started = true; cookie->double_click = false; } } + // set click count correctly according to double click timeout + if (buttons != 0 && cookie->buttons_state == 0) { + if (cookie->click_last_time + cookie->click_speed > currentTime) + cookie->click_count++; + else + cookie->click_count = 1; + + cookie->click_last_time = currentTime; + } + + movement->buttons = buttons; + cookie->buttons_state = buttons; + if (buttons) + movement->clicks = cookie->click_count; + return B_OK; } @@ -671,9 +686,11 @@ synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length) if ((status = get_synaptics_movment(cookie, &movement)) != B_OK) return status; return user_memcpy(buffer, &movement, sizeof(movement)); + case MS_IS_TOUCHPAD: TRACE("SYNAPTICS: MS_IS_TOUCHPAD\n"); return B_OK; + case MS_SET_TOUCHPAD_SETTINGS: TRACE("SYNAPTICS: MS_SET_TOUCHPAD_SETTINGS"); user_memcpy(&(cookie->settings), buffer, sizeof(touchpad_settings)); @@ -684,6 +701,11 @@ synaptics_ioctl(void *_cookie, uint32 op, void *buffer, size_t length) cookie->movement_maker.scroll_acceleration = cookie->settings.scroll_acceleration; return B_OK; + + case MS_SET_CLICKSPEED: + TRACE("SYNAPTICS: ioctl MS_SETCLICK (set click speed)\n"); + return user_memcpy(&cookie->click_speed, buffer, sizeof(bigtime_t)); + default: TRACE("SYNAPTICS: unknown opcode: %ld\n", op); return B_BAD_VALUE; diff --git a/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.h b/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.h index 15d506ab91..77d018f7a4 100644 --- a/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.h +++ b/src/add-ons/kernel/bus_managers/ps2/ps2_synaptics.h @@ -72,12 +72,11 @@ typedef struct { } touch_event; -typedef struct -{ - ps2_dev * dev; +typedef struct { + ps2_dev* dev; sem_id synaptics_sem; - packet_buffer * synaptics_ring_buffer; + packet_buffer* synaptics_ring_buffer; size_t packet_index; uint8 packet_buffer[PS2_PACKET_SYNAPTICS]; uint8 mode; @@ -94,6 +93,11 @@ typedef struct bool valid_edge_motion; bool double_click; + bigtime_t click_last_time; + bigtime_t click_speed; + int32 click_count; + uint32 buttons_state; + touchpad_settings settings; } synaptics_cookie;