1 #include "core/command.hpp"
2 #include "core/dispatch.hpp"
3 #include "core/instance.hpp"
4 #include "library/globalwrap.hpp"
5 #include "core/keymapper.hpp"
6 #include "core/memorymanip.hpp"
7 #include "core/misc.hpp"
8 #include "core/window.hpp"
10 #include "library/string.hpp"
11 #include "library/zip.hpp"
21 keyboard::invbind_set lsnes_invbinds
;
22 gamepad::set lsnes_gamepads
;
26 std::map
<std::pair
<unsigned, unsigned>, keyboard::key
*> buttons
;
27 std::map
<std::pair
<unsigned, unsigned>, keyboard::key
*> axes
;
28 std::map
<std::pair
<unsigned, unsigned>, keyboard::key
*> hats
;
31 void lsnes_gamepads_init()
33 lsnes_gamepads
.set_button_cb([](unsigned jnum
, unsigned num
, bool val
) {
34 if(!buttons
.count(std::make_pair(jnum
, num
)))
36 lsnes_instance
.iqueue
.queue(keypress_info(keyboard::modifier_set(), *buttons
[std::make_pair(jnum
,
39 lsnes_gamepads
.set_hat_cb([](unsigned jnum
, unsigned num
, unsigned val
) {
40 if(!hats
.count(std::make_pair(jnum
, num
)))
42 lsnes_instance
.iqueue
.queue(keypress_info(keyboard::modifier_set(), *hats
[std::make_pair(jnum
, num
)],
45 lsnes_gamepads
.set_axis_cb([](unsigned jnum
, unsigned num
, int16_t val
) {
46 if(!axes
.count(std::make_pair(jnum
, num
)))
48 lsnes_instance
.iqueue
.queue(keypress_info(keyboard::modifier_set(), *axes
[std::make_pair(jnum
, num
)],
51 lsnes_gamepads
.set_axismode_cb([](unsigned jnum
, unsigned num
, int mode
, double tolerance
) {
52 if(!axes
.count(std::make_pair(jnum
, num
)))
54 axes
[std::make_pair(jnum
, num
)]->cast_axis()->set_mode(mode
, tolerance
);
56 lsnes_gamepads
.set_newitem_cb([](unsigned jnum
, unsigned num
, int type
) {
58 std::string name
= (stringfmt() << "joystick" << jnum
<< "axis" << num
).str();
59 int mode
= lsnes_gamepads
[jnum
].get_mode(num
);
60 axes
[std::make_pair(jnum
, num
)] = new keyboard::key_axis(lsnes_instance
.keyboard
, name
,
63 } else if(type
== 1) {
64 std::string name
= (stringfmt() << "joystick" << jnum
<< "button" << num
).str();
65 buttons
[std::make_pair(jnum
, num
)] = new keyboard::key_key(lsnes_instance
.keyboard
, name
,
68 } else if(type
== 2) {
69 std::string name
= (stringfmt() << "joystick" << jnum
<< "hat" << num
).str();
70 hats
[std::make_pair(jnum
, num
)] = new keyboard::key_hat(lsnes_instance
.keyboard
, name
,
76 auto cfg
= zip::readrel(get_config_path() + "/gamepads.json", "");
77 std::string
_cfg(cfg
.begin(), cfg
.end());
78 JSON::node
config(_cfg
);
79 lsnes_gamepads
.load(config
);
84 void lsnes_gamepads_deinit()
86 std::ofstream
cfg(get_config_path() + "/gamepads.json");
87 JSON::printer_indenting printer
;
89 cfg
<< lsnes_gamepads
.save().serialize(&printer
);
92 void cleanup_keymapper()
94 for(auto i
: buttons
) delete i
.second
;
95 for(auto i
: axes
) delete i
.second
;
96 for(auto i
: hats
) delete i
.second
;
101 command::fnptr
<> show_joysticks(lsnes_cmds
, "show-joysticks", "Show joystick info",
102 "Syntax: show-joysticks\nShow joystick info.\n",
103 []() throw(std::bad_alloc
, std::runtime_error
) {
104 messages
<< "--------------------------------------------" << std::endl
;
105 messages
<< lsnes_gamepads
.get_summary() << std::endl
;
106 messages
<< "--------------------------------------------" << std::endl
;