44
44
#include "kbdrepeat.h"
45
45
#include "kbddev.h"
48
/** Delay between auto-repeat state checks when no key is being repeated. */
49
static unsigned int CHECK_DELAY = 10000;
51
/*----------------------------------------------------------------------------*/
53
48
* Main loop handling the auto-repeat of keys.
60
55
* If the same key is still pressed, it uses the delay between repeats stored
61
56
* in the keyboard structure to wait until the key should be repeated.
63
58
* If the currently repeated key is not pressed any more (
64
* usb_kbd_repeat_stop() was called), it stops repeating it and starts
59
* usb_kbd_repeat_stop() was called), it stops repeating it and starts
67
62
* @note For accessing the keyboard device auto-repeat information a fibril
68
63
* mutex (repeat_mtx) from the @a kbd structure is used.
70
65
* @param kbd Keyboard device structure.
72
67
static void usb_kbd_repeat_loop(usb_kbd_t *kbd)
74
69
unsigned int delay = 0;
76
71
usb_log_debug("Starting autorepeat loop.\n");
79
// check if the kbd structure is usable
74
/* Check if the kbd structure is usable. */
80
75
if (!usb_kbd_is_initialized(kbd)) {
81
if (usb_kbd_is_ready_to_destroy(kbd)) {
76
usb_log_warning("kbd not ready, exiting autorepeat.\n");
88
fibril_mutex_lock(kbd->repeat_mtx);
80
fibril_mutex_lock(&kbd->repeat_mtx);
90
82
if (kbd->repeat.key_new > 0) {
91
83
if (kbd->repeat.key_new == kbd->repeat.key_repeated) {
92
usb_log_debug2("Repeating key: %u.\n",
84
usb_log_debug2("Repeating key: %u.\n",
93
85
kbd->repeat.key_repeated);
94
// ugly hack with the NULL
95
usb_kbd_push_ev(NULL, kbd, KEY_PRESS,
86
usb_kbd_push_ev(kbd, KEY_PRESS,
96
87
kbd->repeat.key_repeated);
97
88
delay = kbd->repeat.delay_between;
110
101
delay = CHECK_DELAY;
112
fibril_mutex_unlock(kbd->repeat_mtx);
103
fibril_mutex_unlock(&kbd->repeat_mtx);
114
104
async_usleep(delay);
118
107
/*----------------------------------------------------------------------------*/
120
109
* Main routine to be executed by a fibril for handling auto-repeat.
122
111
* Starts the loop for checking changes in auto-repeat.
124
113
* @param arg User-specified argument. Expects pointer to the keyboard device
125
114
* structure representing the keyboard.
130
119
int usb_kbd_repeat_fibril(void *arg)
132
121
usb_log_debug("Autorepeat fibril spawned.\n");
134
123
if (arg == NULL) {
135
124
usb_log_error("No device!\n");
139
usb_kbd_t *kbd = (usb_kbd_t *)arg;
128
usb_kbd_t *kbd = arg;
141
130
usb_kbd_repeat_loop(kbd);
146
134
/*----------------------------------------------------------------------------*/
148
136
* Start repeating particular key.
157
145
void usb_kbd_repeat_start(usb_kbd_t *kbd, unsigned int key)
159
fibril_mutex_lock(kbd->repeat_mtx);
147
fibril_mutex_lock(&kbd->repeat_mtx);
160
148
kbd->repeat.key_new = key;
161
fibril_mutex_unlock(kbd->repeat_mtx);
149
fibril_mutex_unlock(&kbd->repeat_mtx);
164
151
/*----------------------------------------------------------------------------*/
166
153
* Stop repeating particular key.
168
155
* @note Only one key is repeated at any time, but this function may be called
169
* even with key that is not currently repeated (in that case nothing
156
* even with key that is not currently repeated (in that case nothing
172
159
* @param kbd Keyboard device structure.
175
162
void usb_kbd_repeat_stop(usb_kbd_t *kbd, unsigned int key)
177
fibril_mutex_lock(kbd->repeat_mtx);
164
fibril_mutex_lock(&kbd->repeat_mtx);
178
165
if (key == kbd->repeat.key_new) {
179
166
kbd->repeat.key_new = 0;
181
fibril_mutex_unlock(kbd->repeat_mtx);
168
fibril_mutex_unlock(&kbd->repeat_mtx);