Tweak format of command help files and do some further command cleanup
[lsnes.git] / src / core / keymapper.cpp
blob7e6c8b6a48eaa49730b45a60e5a69cd8a538cbd0
1 #include "cmdhelp/keymapper.hpp"
2 #include "core/command.hpp"
3 #include "core/instance.hpp"
4 #include "core/joystickapi.hpp"
5 #include "core/keymapper.hpp"
6 #include "core/memorymanip.hpp"
7 #include "core/messages.hpp"
8 #include "core/queue.hpp"
9 #include "library/globalwrap.hpp"
10 #include "library/string.hpp"
11 #include "library/zip.hpp"
12 #include "lua/lua.hpp"
14 #include <stdexcept>
15 #include <stdexcept>
16 #include <iostream>
17 #include <list>
18 #include <map>
19 #include <sstream>
20 #include <set>
22 keyboard::invbind_set lsnes_invbinds;
23 gamepad::set lsnes_gamepads;
25 namespace
27 globalwrap<std::map<std::pair<unsigned, unsigned>, keyboard::key*>> buttons;
28 globalwrap<std::map<std::pair<unsigned, unsigned>, keyboard::key*>> axes;
29 globalwrap<std::map<std::pair<unsigned, unsigned>, keyboard::key*>> hats;
32 void lsnes_gamepads_init()
34 lsnes_gamepads.set_button_cb([](unsigned jnum, unsigned num, bool val) {
35 if(!buttons().count(std::make_pair(jnum, num)))
36 return;
37 lsnes_instance.iqueue->queue(keypress_info(keyboard::modifier_set(), *buttons()[std::make_pair(jnum,
38 num)], val));
39 });
40 lsnes_gamepads.set_hat_cb([](unsigned jnum, unsigned num, unsigned val) {
41 if(!hats().count(std::make_pair(jnum, num)))
42 return;
43 lsnes_instance.iqueue->queue(keypress_info(keyboard::modifier_set(), *hats()[std::make_pair(
44 jnum, num)], val));
45 });
46 lsnes_gamepads.set_axis_cb([](unsigned jnum, unsigned num, int16_t val) {
47 if(!axes().count(std::make_pair(jnum, num)))
48 return;
49 lsnes_instance.iqueue->queue(keypress_info(keyboard::modifier_set(), *axes()[std::make_pair(jnum,
50 num)], val));
51 });
52 lsnes_gamepads.set_axismode_cb([](unsigned jnum, unsigned num, int mode, double tolerance) {
53 if(!axes().count(std::make_pair(jnum, num)))
54 return;
55 axes()[std::make_pair(jnum, num)]->cast_axis()->set_mode(mode, tolerance);
56 });
57 lsnes_gamepads.set_newitem_cb([](unsigned jnum, unsigned num, int type) {
58 if(type == 0) {
59 std::string name = (stringfmt() << "joystick" << jnum << "axis" << num).str();
60 int mode = lsnes_gamepads[jnum].get_mode(num);
61 axes()[std::make_pair(jnum, num)] = new keyboard::key_axis(*lsnes_instance.keyboard, name,
62 "joystick", mode);
63 //Axis.
64 } else if(type == 1) {
65 std::string name = (stringfmt() << "joystick" << jnum << "button" << num).str();
66 buttons()[std::make_pair(jnum, num)] = new keyboard::key_key(*lsnes_instance.keyboard, name,
67 "joystick");
68 //Button.
69 } else if(type == 2) {
70 std::string name = (stringfmt() << "joystick" << jnum << "hat" << num).str();
71 hats()[std::make_pair(jnum, num)] = new keyboard::key_hat(*lsnes_instance.keyboard, name,
72 "joystick");
73 //Hat.
75 });
76 try {
77 auto cfg = zip::readrel(get_config_path() + "/gamepads.json", "");
78 std::string _cfg(cfg.begin(), cfg.end());
79 JSON::node config(_cfg);
80 lsnes_gamepads.load(config);
81 } catch(...) {
85 void lsnes_gamepads_deinit()
87 std::ofstream cfg(get_config_path() + "/gamepads.json");
88 JSON::printer_indenting printer;
89 if(cfg)
90 cfg << lsnes_gamepads.save().serialize(&printer);
93 void cleanup_keymapper()
95 for(auto i : buttons()) delete i.second;
96 for(auto i : axes()) delete i.second;
97 for(auto i : hats()) delete i.second;
100 namespace
102 command::fnptr<> CMD_show_joysticks(lsnes_cmds, CKEYMAPPER::show,
103 []() throw(std::bad_alloc, std::runtime_error) {
104 messages << "--------------------------------------------" << std::endl;
105 messages << lsnes_gamepads.get_summary() << std::endl;
106 messages << "--------------------------------------------" << std::endl;
109 command::fnptr<> reset_joysticks(lsnes_cmds, CKEYMAPPER::reset,
110 []() throw(std::bad_alloc, std::runtime_error) {
111 joystick_driver_quit();
112 lsnes_gamepads.offline_all(); //Not supposed to have online gamepads.
113 joystick_driver_init();
114 messages << "Reset gamepads" << std::endl;