Skip to content

Commit

Permalink
Input: Move autorepeat to the event-passing phase
Browse files Browse the repository at this point in the history
Preparing to split event filtering and event passing, move the
autorepeat function to the point where the event is actually passed.

Tested-by: Benjamin Tissoires <[email protected]>
Tested-by: Ping Cheng <[email protected]>
Acked-by: Dmitry Torokhov <[email protected]>
Signed-off-by: Henrik Rydberg <[email protected]>
  • Loading branch information
rydberg committed Sep 19, 2012
1 parent 0672120 commit 352ac4b
Showing 1 changed file with 25 additions and 21 deletions.
46 changes: 25 additions & 21 deletions drivers/input/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,22 @@ static int input_defuzz_abs_event(int value, int old_val, int fuzz)
return value;
}

static void input_start_autorepeat(struct input_dev *dev, int code)
{
if (test_bit(EV_REP, dev->evbit) &&
dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] &&
dev->timer.data) {
dev->repeat_key = code;
mod_timer(&dev->timer,
jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]));
}
}

static void input_stop_autorepeat(struct input_dev *dev)
{
del_timer(&dev->timer);
}

/*
* Pass event first through all filters and then, if event has not been
* filtered out, through all open handles. This function is called with
Expand Down Expand Up @@ -105,6 +121,15 @@ static void input_pass_event(struct input_dev *dev,
}

rcu_read_unlock();

/* trigger auto repeat for key events */
if (type == EV_KEY && value != 2) {
if (value)
input_start_autorepeat(dev, code);
else
input_stop_autorepeat(dev);
}

}

/*
Expand Down Expand Up @@ -142,22 +167,6 @@ static void input_repeat_key(unsigned long data)
spin_unlock_irqrestore(&dev->event_lock, flags);
}

static void input_start_autorepeat(struct input_dev *dev, int code)
{
if (test_bit(EV_REP, dev->evbit) &&
dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] &&
dev->timer.data) {
dev->repeat_key = code;
mod_timer(&dev->timer,
jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]));
}
}

static void input_stop_autorepeat(struct input_dev *dev)
{
del_timer(&dev->timer);
}

#define INPUT_IGNORE_EVENT 0
#define INPUT_PASS_TO_HANDLERS 1
#define INPUT_PASS_TO_DEVICE 2
Expand Down Expand Up @@ -252,11 +261,6 @@ static void input_handle_event(struct input_dev *dev,

__change_bit(code, dev->key);
disposition = INPUT_PASS_TO_HANDLERS;

if (value)
input_start_autorepeat(dev, code);
else
input_stop_autorepeat(dev);
}
}
break;
Expand Down

0 comments on commit 352ac4b

Please sign in to comment.