GCC Code Coverage Report


Directory: src/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 79 / 0 / 79
Functions: 100.0% 9 / 0 / 9
Branches: 100.0% 25 / 0 / 25

keyboard/src/keyboard.c
Line Branch Exec Source
1 /*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright (c) 2026 Manuel Hernández Méndez
5 *
6 * Authors:
7 * Manuel Hernández Méndez <maherme.dev@gmail.com>
8 */
9
10 #include "keyboard.h"
11 #include <GL/glut.h>
12 #include <stdbool.h>
13
14 static bool key_state[MAX_NUM_KEYS];
15 static actions_cb key_down_actions[MAX_NUM_KEYS];
16 static actions_cb key_up_actions[MAX_NUM_KEYS];
17 static bool special_key_state[MAX_NUM_KEYS];
18 static actions_cb special_key_down_actions[MAX_NUM_KEYS];
19 static actions_cb special_key_up_actions[MAX_NUM_KEYS];
20
21 static void
22 5 keyboardDown(unsigned char key, int x, int y)
23 {
24 (void)x, (void)y;
25 5 key_state[key] = true;
26
2/2
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 4 taken 4 times.
5 if (key_down_actions[key])
27 {
28 1 key_down_actions[key]();
29 }
30 5 }
31
32 static void
33 2 keyboardUp(unsigned char key, int x, int y)
34 {
35 (void)x, (void)y;
36 2 key_state[key] = false;
37
2/2
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 4 taken 1 time.
2 if (key_up_actions[key])
38 {
39 1 key_up_actions[key]();
40 }
41 2 }
42
43 static void
44 6 keyboardSpecialDown(int key, int x, int y)
45 {
46 (void)x, (void)y;
47 6 int _key = MAX_SPECIAL_KEYS;
48
49
3/3
✓ Branch 2 → 3 taken 2 times.
✓ Branch 2 → 4 taken 2 times.
✓ Branch 2 → 5 taken 2 times.
6 switch (key)
50 {
51 2 case GLUT_KEY_LEFT:
52 2 special_key_state[SPECIAL_KEY_LEFT] = true;
53 2 _key = SPECIAL_KEY_LEFT;
54 2 break;
55 2 case GLUT_KEY_RIGHT:
56 2 special_key_state[SPECIAL_KEY_RIGHT] = true;
57 2 _key = SPECIAL_KEY_RIGHT;
58 2 break;
59 2 default:
60 2 break;
61 }
62
63
2/2
✓ Branch 6 → 7 taken 2 times.
✓ Branch 6 → 8 taken 4 times.
6 if (special_key_down_actions[_key])
64 {
65 2 special_key_down_actions[_key]();
66 }
67 6 }
68
69 static void
70 6 keyboardSpecialUp(int key, int x, int y)
71 {
72 (void)x, (void)y;
73 6 int _key = MAX_SPECIAL_KEYS;
74
75
3/3
✓ Branch 2 → 3 taken 2 times.
✓ Branch 2 → 4 taken 2 times.
✓ Branch 2 → 5 taken 2 times.
6 switch (key)
76 {
77 2 case GLUT_KEY_LEFT:
78 2 special_key_state[SPECIAL_KEY_LEFT] = false;
79 2 _key = SPECIAL_KEY_LEFT;
80 2 break;
81 2 case GLUT_KEY_RIGHT:
82 2 special_key_state[SPECIAL_KEY_RIGHT] = false;
83 2 _key = SPECIAL_KEY_RIGHT;
84 2 break;
85 2 default:
86 2 break;
87 }
88
89
2/2
✓ Branch 6 → 7 taken 2 times.
✓ Branch 6 → 8 taken 4 times.
6 if (special_key_up_actions[_key])
90 {
91 2 special_key_up_actions[_key]();
92 }
93 6 }
94
95 int
96 9 keyboardRegisterAction(actions_cb action, key_action_t type, int key)
97 {
98
4/4
✓ Branch 2 → 3 taken 8 times.
✓ Branch 2 → 4 taken 1 time.
✓ Branch 3 → 4 taken 1 time.
✓ Branch 3 → 5 taken 7 times.
9 if (!action || key > MAX_NUM_KEYS)
99 {
100 2 return -1;
101 }
102
103
5/5
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 7 taken 1 time.
✓ Branch 5 → 8 taken 2 times.
✓ Branch 5 → 9 taken 2 times.
✓ Branch 5 → 10 taken 1 time.
7 switch (type)
104 {
105 1 case ACTION_KEY_UP:
106 1 key_up_actions[key] = action;
107 1 break;
108 1 case ACTION_KEY_DOWN:
109 1 key_down_actions[key] = action;
110 1 break;
111 2 case ACTION_SPECIAL_KEY_UP:
112 2 special_key_up_actions[key] = action;
113 2 break;
114 2 case ACTION_SPECIAL_KEY_DOWN:
115 2 special_key_down_actions[key] = action;
116 2 break;
117 1 case MAX_KEY_ACTIONS:
118 default:
119 1 return -1;
120 break;
121 }
122
123 6 return 0;
124 }
125
126 bool
127 7 keyboardGetKeyState(unsigned char key)
128 {
129 7 return key_state[key];
130 }
131
132 bool
133 8 keyboardGetSpecialKeyState(special_key_t key)
134 {
135 8 return special_key_state[key];
136 }
137
138 void
139 1 keyboardInit(void)
140 {
141 1 glutIgnoreKeyRepeat(1);
142 1 glutKeyboardFunc(keyboardDown);
143 1 glutKeyboardUpFunc(keyboardUp);
144 1 glutSpecialFunc(keyboardSpecialDown);
145 1 glutSpecialUpFunc(keyboardSpecialUp);
146 1 }
147
148 #ifdef UNIT_TESTING
149 void
150 10 helperUT_keyboardResetRegisteredCallbacks(void)
151 {
152
2/2
✓ Branch 4 → 3 taken 2560 times.
✓ Branch 4 → 5 taken 10 times.
2570 for (int i = 0; i < MAX_NUM_KEYS; i++)
153 {
154 2560 key_down_actions[i] = NULL;
155 2560 key_up_actions[i] = NULL;
156 2560 special_key_down_actions[i] = NULL;
157 2560 special_key_up_actions[i] = NULL;
158 }
159 10 }
160 #endif
161