From ea76b6988ccafaa6a4d4ed90f2489d0e49e1f180 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Sat, 5 Sep 2015 09:32:30 -0400 Subject: Imported Upstream version 0.40.24 --- g_src/enabler_input.h | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100755 g_src/enabler_input.h (limited to 'g_src/enabler_input.h') diff --git a/g_src/enabler_input.h b/g_src/enabler_input.h new file mode 100755 index 0000000..be5f94b --- /dev/null +++ b/g_src/enabler_input.h @@ -0,0 +1,137 @@ +#ifndef ENABLER_INPUT_H +#define ENABLER_INPUT_H + +#ifdef __APPLE__ +#define _XOPEN_SOURCE_EXTENDED +#endif + +#include +#include +#include +#include + +#include "ViewBase.h" +#include "keybindings.h" +#include "curses.h" + +typedef Uint32 Time; + +enum Repeat { + REPEAT_NOT, // Don't repeat at all. Furthermore, cancel other repeats. + REPEAT_SLOW, // Repeat normally. + REPEAT_FAST // Repeat instantly, without waiting for the first-repeat interval. +}; + +enum MatchType { type_unicode, type_key, type_button }; + +Uint8 getModState(); +std::string translate_mod(Uint8 mod); +int decode_utf8(const std::string &s); +int decode_utf8_predict_length(char byte); +std::string encode_utf8(int unicode); + +#define DFMOD_SHIFT 1 +#define DFMOD_CTRL 2 +#define DFMOD_ALT 4 + +struct EventMatch { + MatchType type; + Uint8 mod; // not defined for type=unicode. 1: shift, 2: ctrl, 4:alt + Uint8 scancode; // not defined for type=button + union { + Uint16 unicode; + SDLKey key; + Uint8 button; + }; + + bool operator== (const EventMatch &other) const { + if (mod != other.mod) return false; + if (type != other.type) return false; + switch (type) { + case type_unicode: return unicode == other.unicode; + case type_key: return key == other.key; + case type_button: return button == other.button; + default: return false; + } + } + + bool operator< (const EventMatch &other) const { + if (mod != other.mod) return mod < other.mod; + if (type != other.type) return type < other.type; + switch (type) { + case type_unicode: return unicode < other.unicode; + case type_key: return key < other.key; + case type_button: return button < other.button; + default: return false; + } + } +}; + +struct KeyEvent { + bool release; + EventMatch match; +}; + +typedef std::list > macro; + +struct RegisteredKey { + MatchType type; + string display; +}; + +class enabler_inputst { + std::set key_translation(EventMatch &match); + public: + Repeat key_repeat(InterfaceKey); + void key_repeat(InterfaceKey, Repeat); + void load_macro_from_file(const std::string &file); + void save_macro_to_file(const std::string &file, const std::string &name, const macro &); + + // In practice.. do not use this one. + void add_input(SDL_Event &e, Time now); + // Use this one. It's much nicer. + void add_input_refined(KeyEvent &e, Time now, int serial); + // Made specifically for curses. <0 = unicode, >0 = ncurses symbols. +#ifdef CURSES + void add_input_ncurses(int key, Time now, bool esc); +#endif + std::set get_input(Time now); + void clear_input(); + + void load_keybindings(const std::string &file); + void save_keybindings(const std::string &file); + void save_keybindings(); + std::string GetKeyDisplay(int binding); + std::string GetBindingDisplay(int binding); + std::string GetBindingTextDisplay(int binding); + + // Macros + void record_input(); // Records input until such a time as you say stop + void record_stop(); // Stops recording, saving it as the active macro + bool is_recording(); + void play_macro(); // Runs the active macro, if any + bool is_macro_playing(); + std::list list_macros(); + void load_macro(string name); // Loads some macro as the active one + void save_macro(string name); // Saves the active macro under some name + void delete_macro(string name); + + // Prefix commands + bool prefix_building(); + void prefix_toggle(); + void prefix_add_digit(char digit); + int prefix_end(); + string prefix(); + + // Updating the key-bindings + void register_key(); // Sets the next key-press to be stored instead of executed. + list getRegisteredKey(); // Returns a description of stored keys. Max one of each type. + void bindRegisteredKey(MatchType type, InterfaceKey key); // Binds one of the stored keys to key + bool is_registering(); // Returns true if we're still waiting for a key-hit + + std::list list_keys(InterfaceKey key); // Returns a list of events matching this interfacekey + void remove_key(InterfaceKey key, EventMatch ev); // Removes a particular matcher from the keymap. +}; + + +#endif -- cgit v1.2.3