source: buchla-emu/emu/sdl.c@ 7cc6ac0

Last change on this file since 7cc6ac0 was 7cc6ac0, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Successfully attached GDB.

  • Property mode set to 100644
File size: 2.4 KB
Line 
1/*
2 * Copyright (C) 2017 The Contributors
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or (at
7 * your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * A copy of the GNU General Public License can be found in the file
15 * "gpl.txt" in the top directory of this repository.
16 */
17
18#include <all.h>
19
20int32_t sdl_verbose = 0;
21
22#define ver(...) _ver(sdl_verbose, 0, __VA_ARGS__)
23#define ver2(...) _ver(sdl_verbose, 1, __VA_ARGS__)
24#define ver3(...) _ver(sdl_verbose, 2, __VA_ARGS__)
25
26typedef void (*sdl_func_t)(void);
27
28static sdl_func_t sdl_funcs[] = {
29 ser_sdl
30};
31
32void sdl_init(void)
33{
34 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_TIMER) < 0) {
35 fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
36 exit(1);
37 }
38
39 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_VERBOSE);
40
41 if (SDLNet_Init() < 0) {
42 fail("SDLNet_Init() failed: %s", SDLNet_GetError());
43 }
44
45 if (TTF_Init() < 0) {
46 fail("TTF_Init() failed: %s", TTF_GetError());
47 }
48
49 SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");
50 SDL_StartTextInput();
51}
52
53void sdl_quit(void)
54{
55 TTF_Quit();
56 SDLNet_Quit();
57 SDL_Quit();
58}
59
60void sdl_loop(void)
61{
62 inf("entering SDL loop");
63
64#if defined EMU_LINUX
65 SDL_Scancode down = SDL_SCANCODE_UNKNOWN;
66#endif
67
68 while (SDL_AtomicGet(&run) != 0) {
69 for (int32_t i = 0; i < ARRAY_COUNT(sdl_funcs); ++i) {
70 sdl_funcs[i]();
71 }
72
73 SDL_Event ev;
74
75 while (SDL_PollEvent(&ev) > 0) {
76#if defined EMU_LINUX
77 // Work around duplicate key-down events on Linux.
78
79 if (ev.type == SDL_KEYDOWN) {
80 if (down == ev.key.keysym.scancode) {
81 continue;
82 }
83
84 down = ev.key.keysym.scancode;
85 }
86 else if (ev.type == SDL_KEYUP) {
87 down = SDL_SCANCODE_UNKNOWN;
88 }
89#endif
90
91 if (ev.type == SDL_QUIT ||
92 (ev.type == SDL_KEYDOWN && ev.key.keysym.sym == SDLK_ESCAPE)) {
93 ver("quit");
94 SDL_AtomicSet(&run, 0);
95 continue;
96 }
97
98 if (ev.type == SDL_TEXTINPUT) {
99 ser_text(&ev.text);
100 continue;
101 }
102
103 if (ev.type == SDL_KEYDOWN) {
104 ser_key(&ev.key);
105 continue;
106 }
107
108 SDL_Delay(50);
109 }
110 }
111
112 inf("leaving SDL loop");
113}
Note: See TracBrowser for help on using the repository browser.