Mercurial > molko
annotate libmlk-core/mlk/core/gamepad.c @ 564:e91f37da2992
core: doxygenize window
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 08 Mar 2023 20:09:21 +0100 |
parents | 773a082f0b91 |
children | f2737a931658 |
rev | line source |
---|---|
443
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * gamepad.c -- game controller support |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
445
773a082f0b91
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
443
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
443
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <string.h> |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <SDL.h> |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include "err.h" |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include "gamepad.h" |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 int |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 mlk_gamepad_open(struct mlk_gamepad *pad, int idx) |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 { |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 assert(pad); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 memset(pad, 0, sizeof (*pad)); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 if (!(pad->handle = SDL_GameControllerOpen(idx))) |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 return MLK_ERR_SDL; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 return 0; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 } |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 void |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 mlk_gamepad_finish(struct mlk_gamepad *pad) |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 { |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 assert(pad); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 if (pad->handle) |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 SDL_GameControllerClose(pad->handle); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 memset(pad, 0, sizeof (*pad)); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 } |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 int |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 mlk_gamepad_iter_begin(struct mlk_gamepad_iter *it) |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 { |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 assert(it); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 memset(it, 0, sizeof (*it)); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 it->idx = -1; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 if ((it->end = SDL_NumJoysticks()) < 0) { |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 it->end = 0; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 return MLK_ERR_SDL; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 } |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 return 0; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 } |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 int |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 mlk_gamepad_iter_next(struct mlk_gamepad_iter *it) |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 { |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 /* |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 * Go to the next gamepad, we need to iterate because SDL can combines |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 * joystick and game controllers with the same API. |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 */ |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 for (++it->idx; it->idx < it->end && !SDL_IsGameController(it->idx); ++it->idx) |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 continue; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 /* End of iteration. */ |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 if (it->idx >= it->end) { |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 memset(it, 0, sizeof (*it)); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 return 0; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 } |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 it->name = SDL_GameControllerNameForIndex(it->idx); |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 return 1; |
dfc65293d984
core: initial gamepad support
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 } |