Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 204387
b: refs/heads/master
c: 0b778e7
h: refs/heads/master
i:
  204385: 443d786
  204383: 87afe8b
v: v3
  • Loading branch information
Chase Douglas authored and Jiri Kosina committed Jun 24, 2010
1 parent f9ad662 commit 4d4b9c5
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 16 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8d93efb27ab8927ffc7a357f1b2d10039de50ed4
refs/heads/master: 0b778e76c1e7ccf49f8980b594e72f984095fd26
43 changes: 28 additions & 15 deletions trunk/drivers/hid/hid-magicmouse.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,17 @@ static bool emulate_scroll_wheel = true;
module_param(emulate_scroll_wheel, bool, 0644);
MODULE_PARM_DESC(emulate_scroll_wheel, "Emulate a scroll wheel");

static unsigned int scroll_speed = 32;
static int param_set_scroll_speed(const char *val, struct kernel_param *kp) {
unsigned long speed;
if (!val || strict_strtoul(val, 0, &speed) || speed > 63)
return -EINVAL;
scroll_speed = speed;
return 0;
}
module_param_call(scroll_speed, param_set_scroll_speed, param_get_uint, &scroll_speed, 0644);
MODULE_PARM_DESC(scroll_speed, "Scroll speed, value from 0 (slow) to 63 (fast)");

static bool scroll_acceleration = false;
module_param(scroll_acceleration, bool, 0644);
MODULE_PARM_DESC(scroll_acceleration, "Accelerate sequential scroll events");
Expand All @@ -54,6 +65,8 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie
#define TOUCH_STATE_START 0x30
#define TOUCH_STATE_DRAG 0x40

#define SCROLL_ACCEL_DEFAULT 7

/**
* struct magicmouse_sc - Tracks Magic Mouse-specific data.
* @input: Input device through which we report events.
Expand Down Expand Up @@ -145,7 +158,7 @@ static void magicmouse_emit_buttons(struct magicmouse_sc *msc, int state)
input_report_key(msc->input, BTN_RIGHT, state & 2);

if (state != last_state)
msc->scroll_accel = 0;
msc->scroll_accel = SCROLL_ACCEL_DEFAULT;
}

static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tdata)
Expand All @@ -167,30 +180,28 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
* vertical touch motions.
*/
if (emulate_scroll_wheel) {
static const int accel_profile[] = {
256, 228, 192, 160, 128, 96, 64, 32,
};
unsigned long now = jiffies;
int step = msc->touches[id].scroll_y - y;

/* Reset acceleration after half a second. */
if (time_after(now, msc->scroll_jiffies + HZ / 2))
msc->scroll_accel = 0;

/* Calculate and apply the scroll motion. */
switch (tdata[7] & TOUCH_STATE_MASK) {
case TOUCH_STATE_START:
msc->touches[id].scroll_y = y;
if (scroll_acceleration)
msc->scroll_accel = min_t(int,
msc->scroll_accel + 1,
ARRAY_SIZE(accel_profile) - 1);

/* Reset acceleration after half a second. */
if (scroll_acceleration && time_before(now,
msc->scroll_jiffies + HZ / 2))
msc->scroll_accel = max_t(int,
msc->scroll_accel - 1, 1);
else
msc->scroll_accel = SCROLL_ACCEL_DEFAULT;

break;
case TOUCH_STATE_DRAG:
step = step / accel_profile[msc->scroll_accel];
step /= (64 - (int)scroll_speed) * msc->scroll_accel;
if (step != 0) {
msc->touches[id].scroll_y -=
step * accel_profile[msc->scroll_accel];
msc->touches[id].scroll_y -= step *
(64 - scroll_speed) * msc->scroll_accel;
msc->scroll_jiffies = now;
input_report_rel(input, REL_WHEEL, step);
}
Expand Down Expand Up @@ -351,6 +362,8 @@ static int magicmouse_probe(struct hid_device *hdev,
return -ENOMEM;
}

msc->scroll_accel = SCROLL_ACCEL_DEFAULT;

msc->quirks = id->driver_data;
hid_set_drvdata(hdev, msc);

Expand Down

0 comments on commit 4d4b9c5

Please sign in to comment.