input: Allow repeat filtering to be disabled
authorSimon Glass <sjg@chromium.org>
Mon, 19 Oct 2015 03:17:25 +0000 (21:17 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 20 Nov 2015 03:13:40 +0000 (20:13 -0700)
Generally the input library handles processing of a list of scanned keys.
Repeated keys need to be generated based on a timer in this case, since all
that is provided is a list of keys current depressed.

Keyboards which do their own scanning will resend codes when they want to
inject a repeating key. Provide a function which tells the input library to
accept repeating keys and not to try to second-guess the caller.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
drivers/input/input.c
include/input.h

index 530bf5148b17e472a0f2f9317a7bad9614085abc..fc1c45c88fe4dddaa41bfb5f635595ca59dc8ad3 100644 (file)
@@ -413,8 +413,8 @@ static int _input_send_keycodes(struct input_config *config, int keycode[],
                 * insert another character if we later realise that we
                 * have missed a repeat slot.
                 */
-               is_repeat = config->repeat_rate_ms &&
-                       (int)get_timer(config->next_repeat_ms) >= 0;
+               is_repeat = config->allow_repeats || (config->repeat_rate_ms &&
+                       (int)get_timer(config->next_repeat_ms) >= 0);
                if (!is_repeat)
                        return 0;
        }
@@ -495,6 +495,11 @@ void input_set_delays(struct input_config *config, int repeat_delay_ms,
        config->repeat_rate_ms = repeat_rate_ms;
 }
 
+void input_allow_repeats(struct input_config *config, bool allow_repeats)
+{
+       config->allow_repeats = allow_repeats;
+}
+
 int input_add_tables(struct input_config *config)
 {
        int ret;
index 9942d6f77d5df9a4fc9c8fdcf97108330cf2e540..e56f5000906bdc607fb45091f1eb003822b07116 100644 (file)
@@ -57,6 +57,7 @@ struct input_config {
         *              unknown
         */
        int (*read_keys)(struct input_config *config);
+       bool allow_repeats;             /* Don't filter out repeats */
        unsigned int next_repeat_ms;    /* Next time we repeat a key */
        unsigned int repeat_delay_ms;   /* Time before autorepeat starts */
        unsigned int repeat_rate_ms;    /* Autorepeat rate in ms */
@@ -142,6 +143,24 @@ int input_stdio_register(struct stdio_dev *dev);
 void input_set_delays(struct input_config *config, int repeat_delay_ms,
               int repeat_rate_ms);
 
+/**
+ * Tell the input layer whether to allow the caller to determine repeats
+ *
+ * Generally the input library handles processing of a list of scanned keys.
+ * Repeated keys need to be generated based on a timer in this case, since all
+ * that is provided is a list of keys current depressed.
+ *
+ * Keyboards which do their own scanning will resend codes when they want to
+ * inject a repeating key. This function can be called at start-up to select
+ * this behaviour.
+ *
+ * @param config       Input state
+ * @param allow_repeats        true to repeat depressed keys every time
+ *                     input_send_keycodes() is called, false to do normal
+ *                     keyboard repeat processing with a timer.
+ */
+void input_allow_repeats(struct input_config *config, bool allow_repeats);
+
 /**
  * Set up the key map tables
  *