Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 352ac4bd authored by Henrik Rydberg's avatar Henrik Rydberg
Browse files

Input: Move autorepeat to the event-passing phase



Preparing to split event filtering and event passing, move the
autorepeat function to the point where the event is actually passed.

Tested-by: default avatarBenjamin Tissoires <benjamin.tissoires@enac.fr>
Tested-by: default avatarPing Cheng <pingc@wacom.com>
Acked-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarHenrik Rydberg <rydberg@euromail.se>
parent 0672120a
Loading
Loading
Loading
Loading
+25 −21
Original line number Diff line number Diff line
@@ -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
@@ -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);
	}

}

/*
@@ -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
@@ -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;