Subversion Repositories HelenOS

Rev

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

Rev 2927 Rev 4343
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
 
-
 
96
void keybuffer_push0(keybuffer_t *keybuffer, int c)
-
 
97
{
-
 
98
    kbd_event_t ev;
-
 
99
 
-
 
100
    ev.key = c; ev.mods = 0; ev.c = c;
-
 
101
    keybuffer_push(keybuffer, &ev);
-
 
102
}
-
 
103
 
93
/** Pop character from buffer.
104
/** Pop event from buffer.
-
 
105
 *
94
 * @param c pointer to space where to store character from buffer.
106
 * @param edst  Pointer to where the event should be saved.
95
 * @return zero on empty buffer, nonzero else
107
 * @return  Zero on empty buffer, nonzero otherwise.
96
 */
108
 */
97
int keybuffer_pop(keybuffer_t *keybuffer, int *c)
109
int keybuffer_pop(keybuffer_t *keybuffer, kbd_event_t *edst)
98
{
110
{
99
    futex_down(&keybuffer_futex);
111
    futex_down(&keybuffer_futex);
100
    if (keybuffer->items > 0) {
112
    if (keybuffer->items > 0) {
101
        keybuffer->items--;
113
        keybuffer->items--;
102
        *c = (keybuffer->fifo[keybuffer->head]) ;
114
        *edst = (keybuffer->fifo[keybuffer->head]) ;
103
        keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE;
115
        keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE;
104
        futex_up(&keybuffer_futex);
116
        futex_up(&keybuffer_futex);
105
        return 1;
117
        return 1;
106
    }
118
    }
107
    futex_up(&keybuffer_futex);
119
    futex_up(&keybuffer_futex);