summaryrefslogtreecommitdiff
path: root/src/keyboard.h
blob: 167a9016c15a890326c59781bb030aad050c241a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#ifndef KEYBOARD_H
#define KEYBOARD_H

#include <stdbool.h>

#include "string.h"

#include "interrupts.h"
#include "port.h"
	
typedef enum {
	KEYBOARD_EVENT_TYPE_KEY_PRESSED,
	KEYBOARD_EVENT_TYPE_KEY_RELEASED
} keyboard_event_type_t;

typedef enum {
	KEYBOARD_MODIFIER_SHIFT = 0x01,
	KEYBOARD_MODIFIER_CTRL = 0x02,
	KEYBOARD_MODIFIER_ALT = 0x04
} keyboard_modifier_mask_t;

typedef enum {
	KEYBOARD_KEY_UNKNOWN,
	KEYBOARD_KEY_ASCII,
	KEYBOARD_KEY_ESC,
	KEYBOARD_KEY_TAB,
	KEYBOARD_KEY_INS,
	KEYBAORD_KEY_DEL,
	KEYBAORD_KEY_BACKSPACE,
	KEYBAORD_CURSOR_LEFT,
	KEYBOARD_CURSOR_RIGHT,
	KEYBOARD_CURSOR_UP,
	KEYBOARD_CURSOR_DOWN
} keyboard_key_t;

typedef struct {
	keyboard_event_type_t type;
	keyboard_modifier_mask_t modifiers;
	keyboard_key_t key;
	char ascii_key;
} keyboard_event_t;

typedef void (*keyboard_event_handler_t)( keyboard_event_t *event, void *context );

typedef struct {
	interrupt_t *interrupts;
	port8_t command_port;
	port8_t data_port;
	bool shift;
	keyboard_event_handler_t handler;
	void *context;
} keyboard_t;

void keyboard_init( keyboard_t *keyboard, keyboard_event_handler_t handler, void *context );
void keyboard_deinit( keyboard_t *keyboard );

uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp );

#endif // KEYBOARD_H