Subversion Repositories HelenOS

Rev

Rev 2787 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2787 Rev 4377
Line 38... Line 38...
38
 
38
 
39
atomic_t keybuffer_futex = FUTEX_INITIALIZER;
39
atomic_t keybuffer_futex = FUTEX_INITIALIZER;
40
 
40
 
41
/** Clear key buffer.
41
/** Clear key buffer.
42
 */
42
 */
43
void keybuffer_free(keybuffer_t *keybuffer)
43
void keybuffer_free(keybuffer_t *keybuffer)
44
{
44
{
45
    futex_down(&keybuffer_futex);
45
    futex_down(&keybuffer_futex);
46
    keybuffer->head = 0;
46
    keybuffer->head = 0;
47
    keybuffer->tail = 0;
47
    keybuffer->tail = 0;
48
    keybuffer->items = 0;
48
    keybuffer->items = 0;
Line 73... Line 73...
73
int keybuffer_empty(keybuffer_t *keybuffer)
73
int keybuffer_empty(keybuffer_t *keybuffer)
74
{
74
{
75
    return (keybuffer->items == 0);
75
    return (keybuffer->items == 0);
76
}
76
}
77
 
77
 
78
/** Push key to key buffer.
78
/** Push key event to key buffer.
-
 
79
 *
79
 * If buffer is full, character is ignored.
80
 * If the buffer is full, the event is ignored.
-
 
81
 *
80
 * @param key code of stored key
82
 * @param keybuffer The keybuffer.
-
 
83
 * @param ev        The event to push.
81
 */
84
 */
82
void keybuffer_push(keybuffer_t *keybuffer, int key)
85
void keybuffer_push(keybuffer_t *keybuffer, const kbd_event_t *ev)
83
{
86
{
84
    futex_down(&keybuffer_futex);
87
    futex_down(&keybuffer_futex);
85
    if (keybuffer->items < KEYBUFFER_SIZE) {
88
    if (keybuffer->items < KEYBUFFER_SIZE) {
86
        keybuffer->fifo[keybuffer->tail] = key;
89
        keybuffer->fifo[keybuffer->tail] = *ev;
87
        keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE;
90
        keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE;
88
        keybuffer->items++;
91
        keybuffer->items++;
89
    }
92
    }
90
    futex_up(&keybuffer_futex);
93
    futex_up(&keybuffer_futex);
91
}
94
}
92
 
95
 
93
/** Pop character from buffer.
96
/** Pop event from buffer.
-
 
97
 *
94
 * @param c pointer to space where to store character from buffer.
98
 * @param edst  Pointer to where the event should be saved.
95
 * @return zero on empty buffer, nonzero else
99
 * @return  Zero on empty buffer, nonzero otherwise.
96
 */
100
 */
97
int keybuffer_pop(keybuffer_t *keybuffer, int *c)
101
int keybuffer_pop(keybuffer_t *keybuffer, kbd_event_t *edst)
98
{
102
{
99
    futex_down(&keybuffer_futex);
103
    futex_down(&keybuffer_futex);
100
    if (keybuffer->items > 0) {
104
    if (keybuffer->items > 0) {
101
        keybuffer->items--;
105
        keybuffer->items--;
102
        *c = (keybuffer->fifo[keybuffer->head]) ;
106
        *edst = (keybuffer->fifo[keybuffer->head]) ;
103
        keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE;
107
        keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE;
104
        futex_up(&keybuffer_futex);
108
        futex_up(&keybuffer_futex);
105
        return 1;
109
        return 1;
106
    }
110
    }
107
    futex_up(&keybuffer_futex);
111
    futex_up(&keybuffer_futex);