diff options
Diffstat (limited to 'src/emu/natkeyboard.h')
-rw-r--r-- | src/emu/natkeyboard.h | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/src/emu/natkeyboard.h b/src/emu/natkeyboard.h index d411eb74173..c3454ee8dd4 100644 --- a/src/emu/natkeyboard.h +++ b/src/emu/natkeyboard.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Aaron Giles +// copyright-holders:Aaron Giles,Vas Crabb /*************************************************************************** natkeyboard.h @@ -12,8 +12,12 @@ #pragma once +#include <array> +#include <functional> #include <iosfwd> +#include <string> #include <unordered_map> +#include <vector> //************************************************************************** @@ -21,9 +25,9 @@ //************************************************************************** // keyboard helper function delegates -typedef delegate<int (const char32_t *, size_t)> ioport_queue_chars_delegate; -typedef delegate<bool (char32_t)> ioport_accept_char_delegate; -typedef delegate<bool ()> ioport_charqueue_empty_delegate; +using ioport_queue_chars_delegate = delegate<int (const char32_t *, size_t)>; +using ioport_accept_char_delegate = delegate<bool (char32_t)>; +using ioport_charqueue_empty_delegate = delegate<bool ()>; // ======================> natural_keyboard @@ -41,13 +45,19 @@ public: running_machine &machine() const { return m_machine; } bool empty() const { return (m_bufbegin == m_bufend); } bool full() const { return ((m_bufend + 1) % m_buffer.size()) == m_bufbegin; } - bool can_post() const { return (!m_queue_chars.isnull() || !m_keycode_map.empty()); } + bool can_post() const { return m_have_charkeys || !m_queue_chars.isnull(); } bool is_posting() const { return (!empty() || (!m_charqueue_empty.isnull() && !m_charqueue_empty())); } bool in_use() const { return m_in_use; } // configuration void configure(ioport_queue_chars_delegate queue_chars, ioport_accept_char_delegate accept_char, ioport_charqueue_empty_delegate charqueue_empty); void set_in_use(bool usage); + size_t keyboard_count() const { return m_keyboards.size(); } + device_t &keyboard_device(size_t n) const { return m_keyboards[n].device; } + bool keyboard_is_keypad(size_t n) const { return !m_keyboards[n].keyboard; } + bool keyboard_enabled(size_t n) const { return m_keyboards[n].enabled; } + void enable_keyboard(size_t n) { set_keyboard_enabled(n, true); } + void disable_keyboard(size_t n) { set_keyboard_enabled(n, false); } // posting void post_char(char32_t ch, bool normalize_crlf = false); @@ -74,13 +84,27 @@ private: { std::array<ioport_field *, SHIFT_COUNT + 1> field; unsigned shift; - ioport_condition condition; + ioport_condition condition; }; typedef std::vector<keycode_map_entry> keycode_map_entries; typedef std::unordered_map<char32_t, keycode_map_entries> keycode_map; + // per-device character-to-key mapping + struct kbd_dev_info + { + kbd_dev_info(device_t &dev) : device(dev) { } + + std::reference_wrapper<device_t> device; + std::vector<std::reference_wrapper<ioport_field> > keyfields; + keycode_map codemap; + bool keyboard = false; + bool keypad = false; + bool enabled = false; + }; + // internal helpers - void build_codes(ioport_manager &manager); + void build_codes(); + void set_keyboard_enabled(size_t n, bool enable); bool can_post_directly(char32_t ch); bool can_post_alternate(char32_t ch); attotime choose_delay(char32_t ch); @@ -90,11 +114,14 @@ private: const keycode_map_entry *find_code(char32_t ch) const; // internal state + std::vector<kbd_dev_info> m_keyboards; // info on keyboard devices in system running_machine & m_machine; // reference to our machine + bool m_have_charkeys; // are there keys with character? bool m_in_use; // is natural keyboard in use? u32 m_bufbegin; // index of starting character u32 m_bufend; // index of ending character std::vector<char32_t> m_buffer; // actual buffer + keycode_map_entry const * m_current_code; // current code being typed unsigned m_fieldnum; // current step in multi-key sequence bool m_status_keydown; // current keydown status bool m_last_cr; // was the last char a CR? @@ -103,7 +130,6 @@ private: ioport_queue_chars_delegate m_queue_chars; // queue characters callback ioport_accept_char_delegate m_accept_char; // accept character callback ioport_charqueue_empty_delegate m_charqueue_empty; // character queue empty callback - keycode_map m_keycode_map; // keycode map }; |