Back

input.c coverage

overall coverage: 40.8%

line# code(run#)
1 #include "input.h"
2 #include "tiles.h"
3 #include "coordinates.h"
4
5 #include <SDL.h>
6 #include <SDL_image.h>
7 #include <SDL_ttf.h>
8 #include <stdbool.h>
9
10 // Current state of input
11 typedef struct InputState
12 {
13 char *promptText;
14 char *enteredText;
15 int maxLength;
16 bool upperCase;
17 int result;
18 SDL_Renderer *renderer;
19 SDL_Texture *tiles;
20 TTF_Font *font;
21 } InputState;
22
23 // Render input to renderer based on menu state
24 // Menu state must include proper renderer, tiles and font
25 static void renderInput(InputState *state)(21)
26 {
27 SDL_Renderer *renderer = state->renderer;(21)
28 SDL_Texture *tiles = state->tiles;(21)
29 TTF_Font *font = state->font;(21)
30
31 SDL_RenderClear(renderer);(21)
32
33 // brown-ish color for texts
34 SDL_Color color = {205, 140, 74};(21)
35 SDL_Color white = {255, 255, 255};(21)
36
37 // background floor
38 renderTiles(renderer, tiles, greenFloor, 0, 0, 19, 11);(21)
39
40 // key layout for on-screen keyboard
41 char *keysLC = "0123456789öüqwertzuiopőúasdfghjkléáűíyxcvbnm,.-ó"; // lowercase(21)
42 char *keysUC = "§'\"+!%/=()ÖÜQWERTZUIOPŐÚASDFGHJKLÉÁŰÍYXCVBNM?:_Ó"; // uppercase(21)
43 int keyIndex = 0; // current index of key string(21)
44
45 // render keyboard
46 for (int i = 0; i < 4; i++)(105)
47 {
48 for (int j = 0; j < 12; j++)(1092)
49 {
50 char key[3]; // current key text, characters with accent require 2 chars + \0 at the end
51 key[0] = state->upperCase ? keysUC[keyIndex] : keysLC[keyIndex]; // get first char of key based on keyboard case(1008)
52 keyIndex++; // next char in key string(1008)
53 if ((key[0] < 32 || key[0] > 127) && key[0] != 0) // if current key has an invalid code <==> accent character ==> next character is needed(1008)
54 {
55 key[1] = state->upperCase ? keysUC[keyIndex] : keysLC[keyIndex]; // get next character of key string (to complete accent character)(191)
56 keyIndex++; // next char in key string(191)
57 key[2] = '\0'; // terminate string(191)
58 }
59 else
60 key[1] = '\0'; // terminate string(817)
61
62 // renter font and key to correct coordinates
63 Coordinates pos = {j + 4, i + 6};(1008)
64 renderTileC(renderer, tiles, blank, pos);(1008)
65 renderFontC(renderer, font, color, key, pos, true, true);(1008)
66 }
67 }
68
69 // space bar
70 renderTile(renderer, tiles, blankR, 6, 10);(21)
71 renderTiles(renderer, tiles, blankLR, 7, 10, 12, 10);(21)
72 renderTile(renderer, tiles, blankL, 13, 10);(21)
73
74 // shift keys
75 renderTile(renderer, tiles, blank, 3, 9);(21)
76 renderFont(renderer, font, color, "^", 3, 9, true, true);(21)
77 renderTile(renderer, tiles, blank, 16, 9);(21)
78 renderFont(renderer, font, color, "^", 16, 9, true, true);(21)
79
80 // backspace
81 renderTile(renderer, tiles, blankR, 16, 6);(21)
82 renderTile(renderer, tiles, blankL, 17, 6);(21)
83 renderFont(renderer, font, color, "<-", 16, 6, false, true);(21)
84
85 // OK button
86 renderTile(renderer, tiles, blankR, 17, 1);(21)
87 renderTile(renderer, tiles, blankL, 18, 1);(21)
88 renderFont(renderer, font, color, "OK", 17, 1, false, true);(21)
89
90 // back button
91 renderTile(renderer, tiles, blankR, 17, 3);(21)
92 renderTile(renderer, tiles, blankL, 18, 3);(21)
93 renderFont(renderer, font, color, "<-", 17, 3, false, true);(21)
94
95 // render current text with border and prompt
96 renderFont(renderer, font, white, state->promptText, 1, 1, false, true);(21)
97 renderTiles(renderer, tiles, greyFloor, 1, 2, 15, 4);(21)
98 renderTiles(renderer, tiles, wall, 1, 2, 15, 2);(21)
99 renderTiles(renderer, tiles, wall, 1, 4, 15, 4);(21)
100 renderTile(renderer, tiles, wall, 1, 3);(21)
101 renderTile(renderer, tiles, wall, 15, 3);(21)
102 renderFont(renderer, font, white, state->enteredText, 2, 3, false, true);(21)
103
104 SDL_RenderPresent(renderer);(21)
105 }(21)
106
107 // Delete last character of current text
108 static void deleteChar(InputState *state)(4)
109 {
110 char *text = state->enteredText; // for simpler code(4)
111 int length = strlen(text); // get current length(4)
112
113 if (length >= 1) // if there are characters in string(4)
114 {
115 if ((text[length - 2] < 32 || text[length - 2] > 127) && text[length - 2] != 0 && // last 2 characters are invalid <==> make an accent character together(4)
116 (text[length - 1] < 32 || text[length - 1] > 127) && text[length - 1] != 0 &&(0)
117 length >= 2) // and length is correct for accent character
118 {
119 text[length - 2] = 0; // set string end(0)
120 }
121 else
122 {
123 text[length - 1] = 0; // set string end(4)
124 }
125 }
126 }(4)
127
128 // Handle SDL key down event
129 // Returns true if erernder is needed
130 static bool handleKeydown(InputState *state, SDL_Keycode key)(20)
131 {
132 bool shift = !state->upperCase;(20)
133 switch (key)(20)
134 {
135 case 0xe5: // right shift(1)
136 case 0xe1: // left shift
137 state->upperCase = true;(1)
138 return true;(1)
139 case 0x28: // enter(1)
140 state->result = 1;(1)
141 return false;(1)
142 case 0x29: // esc(0)
143 state->result = 2;(0)
144 return false;(0)
145 case 0x2a: // backspace(4)
146 deleteChar(state);(4)
147 break;(4)
148 case 0x2c: // space(0)
149 strcat(state->enteredText, " ");(0)
150 break;(0)
151 case 0x35: // 0 / §(0)
152 strcat(state->enteredText, shift ? "0" : "§");(0)
153 break;(0)
154 case 0x1e: // 1 / '(0)
155 strcat(state->enteredText, shift ? "1" : "'");(0)
156 break;(0)
157 case 0x1f: // 2 / "(0)
158 strcat(state->enteredText, shift ? "2" : "\"");(0)
159 break;(0)
160 case 0x20: // 3 / +(0)
161 strcat(state->enteredText, shift ? "3" : "+");(0)
162 break;(0)
163 case 0x21: // 4 / !(0)
164 strcat(state->enteredText, shift ? "4" : "!");(0)
165 break;(0)
166 case 0x22: // 5 / %(0)
167 strcat(state->enteredText, shift ? "5" : "%");(0)
168 break;(0)
169 case 0x23: // 6 / /(0)
170 strcat(state->enteredText, shift ? "6" : "/");(0)
171 break;(0)
172 case 0x24: // 7 / =(0)
173 strcat(state->enteredText, shift ? "7" : "=");(0)
174 break;(0)
175 case 0x25: // 8 / ((0)
176 strcat(state->enteredText, shift ? "8" : "(");(0)
177 break;(0)
178 case 0x26: // 9 / )(0)
179 strcat(state->enteredText, shift ? "9" : ")");(0)
180 break;(0)
181 case 0x27: // ö / Ö(0)
182 strcat(state->enteredText, shift ? "ö" : "Ö");(0)
183 break;(0)
184 case 0x2d: // ü / Ü(0)
185 strcat(state->enteredText, shift ? "ü" : "Ü");(0)
186 break;(0)
187 case 0x14: // q / Q(0)
188 strcat(state->enteredText, shift ? "q" : "Q");(0)
189 break;(0)
190 case 0x1a: // w / W(0)
191 strcat(state->enteredText, shift ? "w" : "W");(0)
192 break;(0)
193 case 0x08: // e / E(3)
194 strcat(state->enteredText, shift ? "e" : "E");(3)
195 break;(3)
196 case 0x15: // r / R(0)
197 strcat(state->enteredText, shift ? "r" : "R");(0)
198 break;(0)
199 case 0x17: // t / T(0)
200 strcat(state->enteredText, shift ? "t" : "T");(0)
201 break;(0)
202 case 0x1c: // z / Z(0)
203 strcat(state->enteredText, shift ? "z" : "Z");(0)
204 break;(0)
205 case 0x18: // u / U(0)
206 strcat(state->enteredText, shift ? "u" : "U");(0)
207 break;(0)
208 case 0x0c: // i / I(0)
209 strcat(state->enteredText, shift ? "i" : "I");(0)
210 break;(0)
211 case 0x12: // o / O(0)
212 strcat(state->enteredText, shift ? "o" : "O");(0)
213 break;(0)
214 case 0x13: // p / P(1)
215 strcat(state->enteredText, shift ? "p" : "P");(1)
216 break;(1)
217 case 0x2f: // ő / Ő(0)
218 strcat(state->enteredText, shift ? "ő" : "Ő");(0)
219 break;(0)
220 case 0x30: // ú / Ú(0)
221 strcat(state->enteredText, shift ? "ú" : "Ú");(0)
222 break;(0)
223 case 0x04: // a / A(1)
224 strcat(state->enteredText, shift ? "a" : "A");(1)
225 break;(1)
226 case 0x16: // s / S(2)
227 strcat(state->enteredText, shift ? "s" : "S");(2)
228 break;(2)
229 case 0x07: // d / D(0)
230 strcat(state->enteredText, shift ? "d" : "D");(0)
231 break;(0)
232 case 0x09: // f / F(0)
233 strcat(state->enteredText, shift ? "f" : "F");(0)
234 break;(0)
235 case 0x0a: // g / G(0)
236 strcat(state->enteredText, shift ? "g" : "G");(0)
237 break;(0)
238 case 0x0b: // h / H(0)
239 strcat(state->enteredText, shift ? "h" : "H");(0)
240 break;(0)
241 case 0x0d: // j / J(0)
242 strcat(state->enteredText, shift ? "j" : "J");(0)
243 break;(0)
244 case 0x0e: // k / K(0)
245 strcat(state->enteredText, shift ? "k" : "K");(0)
246 break;(0)
247 case 0x0f: // l / L(0)
248 strcat(state->enteredText, shift ? "l" : "L");(0)
249 break;(0)
250 case 0x33: // é / É(0)
251 strcat(state->enteredText, shift ? "é" : "É");(0)
252 break;(0)
253 case 0x34: // á / Á(0)
254 strcat(state->enteredText, shift ? "á" : "Á");(0)
255 break;(0)
256 case 0x31: // ű / Ű(0)
257 strcat(state->enteredText, shift ? "ű" : "Ű");(0)
258 break;(0)
259 case 0x64: // í / Í(0)
260 strcat(state->enteredText, shift ? "í" : "Í");(0)
261 break;(0)
262 case 0x1d: // y / Y(1)
263 strcat(state->enteredText, shift ? "y" : "Y");(1)
264 break;(1)
265 case 0x1b: // x / X(1)
266 strcat(state->enteredText, shift ? "x" : "X");(1)
267 break;(1)
268 case 0x06: // c / C(1)
269 strcat(state->enteredText, shift ? "c" : "C");(1)
270 break;(1)
271 case 0x19: // v / V(0)
272 strcat(state->enteredText, shift ? "v" : "V");(0)
273 break;(0)
274 case 0x05: // b / B(2)
275 strcat(state->enteredText, shift ? "b" : "B");(2)
276 break;(2)
277 case 0x11: // n / N(0)
278 strcat(state->enteredText, shift ? "n" : "N");(0)
279 break;(0)
280 case 0x10: // m / M(0)
281 strcat(state->enteredText, shift ? "m" : "M");(0)
282 break;(0)
283 case 0x36: // , / ?(0)
284 strcat(state->enteredText, shift ? "," : "?");(0)
285 break;(0)
286 case 0x37: // . / :(1)
287 strcat(state->enteredText, shift ? "." : ":");(1)
288 break;(1)
289 case 0x38: // - / _(1)
290 strcat(state->enteredText, shift ? "-" : "_");(1)
291 break;(1)
292 case 0x2e: // ó / Ó(0)
293 strcat(state->enteredText, shift ? "ó" : "Ó");(0)
294 break;(0)
295 default:(0)
296 return false;(0)
297 break;
298 }
299 return true;(18)
300 }
301
302 // Handle SDL key up event
303 // Returns true if erernder is needed
304 static bool handleKeyup(InputState *state, SDL_Keycode key)(20)
305 {
306 switch (key)(20)
307 {
308 case 0xe5: // right shift(1)
309 case 0xe1: // left shift
310 state->upperCase = false;(1)
311 break;(1)
312 default:(19)
313 return false;(19)
314 break;
315 }
316 return true;(1)
317 }
318
319 // Handle SDL mouse click
320 // Returns true if rerender is needed
321 static bool handleClick(InputState *state, int x, int y)(0)
322 {
323 bool shift = !state->upperCase;(0)
324 if (clickTile(3, 9, x, y)) // left shift(0)
325 state->upperCase = !state->upperCase;(0)
326 if (clickTile(16, 9, x, y)) // right shift(0)
327 state->upperCase = !state->upperCase;(0)
328 if (clickTiles(6, 10, 13, 10, x, y)) // space(0)
329 strcat(state->enteredText, " ");(0)
330 if (clickTiles(16, 6, 17, 6, x, y)) // backspace(0)
331 deleteChar(state);(0)
332 if (clickTiles(17, 1, 18, 1, x, y)) // ok button(0)
333 state->result = 1;(0)
334 if (clickTiles(17, 3, 18, 3, x, y)) // back button(0)
335 state->result = 2;(0)
336
337 if (clickTile(4, 6, x, y))(0)
338 strcat(state->enteredText, shift ? "0" : "§");(0)
339 if (clickTile(5, 6, x, y))(0)
340 strcat(state->enteredText, shift ? "1" : "'");(0)
341 if (clickTile(6, 6, x, y))(0)
342 strcat(state->enteredText, shift ? "2" : "\"");(0)
343 if (clickTile(7, 6, x, y))(0)
344 strcat(state->enteredText, shift ? "3" : "+");(0)
345 if (clickTile(8, 6, x, y))(0)
346 strcat(state->enteredText, shift ? "4" : "!");(0)
347 if (clickTile(9, 6, x, y))(0)
348 strcat(state->enteredText, shift ? "5" : "%");(0)
349 if (clickTile(10, 6, x, y))(0)
350 strcat(state->enteredText, shift ? "6" : "/");(0)
351 if (clickTile(11, 6, x, y))(0)
352 strcat(state->enteredText, shift ? "7" : "=");(0)
353 if (clickTile(12, 6, x, y))(0)
354 strcat(state->enteredText, shift ? "8" : "(");(0)
355 if (clickTile(13, 6, x, y))(0)
356 strcat(state->enteredText, shift ? "9" : ")");(0)
357 if (clickTile(14, 6, x, y))(0)
358 strcat(state->enteredText, shift ? "ö" : "Ö");(0)
359 if (clickTile(15, 6, x, y))(0)
360 strcat(state->enteredText, shift ? "ü" : "Ü");(0)
361 if (clickTile(4, 7, x, y))(0)
362 strcat(state->enteredText, shift ? "q" : "Q");(0)
363 if (clickTile(5, 7, x, y))(0)
364 strcat(state->enteredText, shift ? "w" : "W");(0)
365 if (clickTile(6, 7, x, y))(0)
366 strcat(state->enteredText, shift ? "e" : "E");(0)
367 if (clickTile(7, 7, x, y))(0)
368 strcat(state->enteredText, shift ? "r" : "R");(0)
369 if (clickTile(8, 7, x, y))(0)
370 strcat(state->enteredText, shift ? "t" : "T");(0)
371 if (clickTile(9, 7, x, y))(0)
372 strcat(state->enteredText, shift ? "z" : "Z");(0)
373 if (clickTile(10, 7, x, y))(0)
374 strcat(state->enteredText, shift ? "u" : "U");(0)
375 if (clickTile(11, 7, x, y))(0)
376 strcat(state->enteredText, shift ? "i" : "I");(0)
377 if (clickTile(12, 7, x, y))(0)
378 strcat(state->enteredText, shift ? "o" : "O");(0)
379 if (clickTile(13, 7, x, y))(0)
380 strcat(state->enteredText, shift ? "p" : "P");(0)
381 if (clickTile(14, 7, x, y))(0)
382 strcat(state->enteredText, shift ? "ő" : "Ő");(0)
383 if (clickTile(15, 7, x, y))(0)
384 strcat(state->enteredText, shift ? "ú" : "Ú");(0)
385 if (clickTile(4, 8, x, y))(0)
386 strcat(state->enteredText, shift ? "a" : "A");(0)
387 if (clickTile(5, 8, x, y))(0)
388 strcat(state->enteredText, shift ? "s" : "S");(0)
389 if (clickTile(6, 8, x, y))(0)
390 strcat(state->enteredText, shift ? "d" : "D");(0)
391 if (clickTile(7, 8, x, y))(0)
392 strcat(state->enteredText, shift ? "f" : "F");(0)
393 if (clickTile(8, 8, x, y))(0)
394 strcat(state->enteredText, shift ? "g" : "G");(0)
395 if (clickTile(9, 8, x, y))(0)
396 strcat(state->enteredText, shift ? "h" : "H");(0)
397 if (clickTile(10, 8, x, y))(0)
398 strcat(state->enteredText, shift ? "j" : "J");(0)
399 if (clickTile(11, 8, x, y))(0)
400 strcat(state->enteredText, shift ? "k" : "K");(0)
401 if (clickTile(12, 8, x, y))(0)
402 strcat(state->enteredText, shift ? "l" : "L");(0)
403 if (clickTile(13, 8, x, y))(0)
404 strcat(state->enteredText, shift ? "é" : "É");(0)
405 if (clickTile(14, 8, x, y))(0)
406 strcat(state->enteredText, shift ? "á" : "Á");(0)
407 if (clickTile(15, 8, x, y))(0)
408 strcat(state->enteredText, shift ? "ű" : "Ű");(0)
409 if (clickTile(4, 9, x, y))(0)
410 strcat(state->enteredText, shift ? "í" : "Í");(0)
411 if (clickTile(5, 9, x, y))(0)
412 strcat(state->enteredText, shift ? "y" : "Y");(0)
413 if (clickTile(6, 9, x, y))(0)
414 strcat(state->enteredText, shift ? "x" : "X");(0)
415 if (clickTile(7, 9, x, y))(0)
416 strcat(state->enteredText, shift ? "c" : "C");(0)
417 if (clickTile(8, 9, x, y))(0)
418 strcat(state->enteredText, shift ? "v" : "V");(0)
419 if (clickTile(9, 9, x, y))(0)
420 strcat(state->enteredText, shift ? "b" : "B");(0)
421 if (clickTile(10, 9, x, y))(0)
422 strcat(state->enteredText, shift ? "n" : "N");(0)
423 if (clickTile(11, 9, x, y))(0)
424 strcat(state->enteredText, shift ? "m" : "M");(0)
425 if (clickTile(12, 9, x, y))(0)
426 strcat(state->enteredText, shift ? "," : "?");(0)
427 if (clickTile(13, 9, x, y))(0)
428 strcat(state->enteredText, shift ? "." : ":");(0)
429 if (clickTile(14, 9, x, y))(0)
430 strcat(state->enteredText, shift ? "-" : "_");(0)
431 if (clickTile(15, 9, x, y))(0)
432 strcat(state->enteredText, shift ? "ó" : "Ó");(0)
433 return true;(0)
434 }
435
436 // Handle input event
437 // Returns true if rerender is needed
438 static bool handleEvent(SDL_Event event, InputState *state)(54)
439 {
440 switch (event.type)(54)
441 {
442 case SDL_KEYDOWN:(20)
443 return handleKeydown(state, event.key.keysym.scancode);(20)
444 case SDL_KEYUP:(20)
445 return handleKeyup(state, event.key.keysym.scancode);(20)
446 case SDL_MOUSEBUTTONDOWN:(0)
447 return handleClick(state, event.button.x, event.button.y);(0)
448 case SDL_QUIT: // return on quit signal(0)
449 state->result = 0;(0)
450 return false;(0)
451 default:(14)
452 return false;(14)
453 break;
454 }
455 }
456
457 // Input text from user
458 // Prompt text is displayed to user, input is written to enteredText
459 // Returns 0 on exit, 1 on success and 2 on user cancel
460 int textInput(SDL_Renderer *renderer, SDL_Texture *tiles, TTF_Font *font, char *promptText, char *enteredText, int maxLength)(1)
461 {
462 InputState state;
463
464 // set renderer, tiles and font to state for easier function calls
465 state.renderer = renderer;(1)
466 state.tiles = tiles;(1)
467 state.font = font;(1)
468
469 // initialize state variables
470 state.promptText = promptText;(1)
471 state.enteredText = enteredText;(1)
472 state.maxLength = maxLength;(1)
473 state.upperCase = false;(1)
474 state.result = -1;(1)
475
476 // render initialized state
477 renderInput(&state);(1)
478
479 SDL_Event ev;
480 while (SDL_WaitEvent(&ev))(54)
481 {
482 bool rerender = handleEvent(ev, &state);(54)
483 if (state.result != -1) // if result was set(54)
484 {
485 return state.result; // return with result(1)
486 }
487 if (rerender)(53)
488 renderInput(&state);(20)
489 }
490 }(0)
491
492 // Display alert to user
493 // Returns 0 on exit and 1 on user dismiss
494 int alertBox(SDL_Renderer *renderer, SDL_Texture *tiles, TTF_Font *font, char *promptText)(1)
495 {
496 SDL_RenderClear(renderer);(1)
497
498 // brown-ish color for texts
499 SDL_Color color = {205, 140, 74};(1)
500 SDL_Color white = {255, 255, 255};(1)
501
502 // background floor
503 renderTiles(renderer, tiles, greenFloor, 0, 0, 19, 11);(1)
504
505 // render prompt text with border
506 renderTiles(renderer, tiles, greyFloor, 1, 1, 18, 3);(1)
507 renderTiles(renderer, tiles, wall, 1, 1, 18, 1);(1)
508 renderTiles(renderer, tiles, wall, 1, 3, 18, 3);(1)
509 renderTile(renderer, tiles, wall, 1, 2);(1)
510 renderTile(renderer, tiles, wall, 18, 2);(1)
511 renderFont(renderer, font, white, promptText, 2, 2, false, true);(1)
512
513 // OK button
514 renderTile(renderer, tiles, blankR, 8, 5);(1)
515 renderTiles(renderer, tiles, blankLR, 9, 5, 10, 5);(1)
516 renderTile(renderer, tiles, blankL, 11, 5);(1)
517 renderFont(renderer, font, color, "OK", 9, 5, false, true);(1)
518
519 SDL_RenderPresent(renderer);(1)
520
521 SDL_Event ev;
522 while (SDL_WaitEvent(&ev))(2)
523 {
524 switch (ev.type)(2)
525 {
526 case SDL_KEYDOWN:(1)
527 if (ev.key.keysym.scancode == 0x28) // enter(1)
528 return 1;(1)
529 break;(0)
530 case SDL_MOUSEBUTTONDOWN:(0)
531 if (clickTiles(8, 5, 11, 5, ev.button.x, ev.button.y)) // ok button(0)
532 return 1;(0)
533 break;(0)
534 case SDL_QUIT: // return on quit signal(0)
535 return 0;(0)
536 default:(1)
537 break;(1)
538 }
539 }
540 }(0)
541
542 // Display yes/no dialog to user
543 // Returns 0 on exit and 1 on yes and 2 on no
544 int dialogBox(SDL_Renderer *renderer, SDL_Texture *tiles, TTF_Font *font, char *promptText)(1)
545 {
546 SDL_RenderClear(renderer);(1)
547
548 // brown-ish color for texts
549 SDL_Color color = {205, 140, 74};(1)
550 SDL_Color white = {255, 255, 255};(1)
551
552 // background floor
553 renderTiles(renderer, tiles, greenFloor, 0, 0, 19, 11);(1)
554
555 // render prompt text with border
556 renderTiles(renderer, tiles, greyFloor, 1, 1, 18, 3);(1)
557 renderTiles(renderer, tiles, wall, 1, 1, 18, 1);(1)
558 renderTiles(renderer, tiles, wall, 1, 3, 18, 3);(1)
559 renderTile(renderer, tiles, wall, 1, 2);(1)
560 renderTile(renderer, tiles, wall, 18, 2);(1)
561 renderFont(renderer, font, white, promptText, 2, 2, false, true);(1)
562
563 // OK button
564 renderTile(renderer, tiles, blankR, 5, 5);(1)
565 renderTiles(renderer, tiles, blankLR, 6, 5, 7, 5);(1)
566 renderTile(renderer, tiles, blankL, 8, 5);(1)
567 renderFont(renderer, font, color, "OK", 6, 5, false, true);(1)
568
569 // OK button
570 renderTile(renderer, tiles, blankR, 11, 5);(1)
571 renderTiles(renderer, tiles, blankLR, 12, 5, 13, 5);(1)
572 renderTile(renderer, tiles, blankL, 14, 5);(1)
573 renderFont(renderer, font, color, "Mégse", 11, 5, false, true);(1)
574
575 SDL_RenderPresent(renderer);(1)
576
577 SDL_Event ev;
578 while (SDL_WaitEvent(&ev))(2)
579 {
580 switch (ev.type)(2)
581 {
582 case SDL_KEYDOWN:(1)
583 if (ev.key.keysym.scancode == 0x28) // enter(1)
584 return 1;(1)
585 if (ev.key.keysym.scancode == 0x29) // esc(0)
586 return 2;(0)
587 break;(0)
588 case SDL_MOUSEBUTTONDOWN:(0)
589 if (clickTiles(5, 5, 8, 5, ev.button.x, ev.button.y)) // ok button(0)
590 return 1;(0)
591 if (clickTiles(11, 5, 14, 5, ev.button.x, ev.button.y)) // cancel button(0)
592 return 2;(0)
593 break;(0)
594 case SDL_QUIT: // return on quit signal(0)
595 return 0;(0)
596 default:(1)
597 break;(1)
598 }
599 }
600 }(0)