#ifndef __libgtkmm2ext_bindings_h__ #define __libgtkmm2ext_bindings_h__ #include #include #include #include #include #include #include #include #include "gtkmm2ext/visibility.h" class XMLNode; namespace Gtkmm2ext { class LIBGTKMM2EXT_API KeyboardKey { public: KeyboardKey () { _val = GDK_VoidSymbol; } KeyboardKey (uint32_t state, uint32_t keycode); static KeyboardKey null_key() { return KeyboardKey (0, 0); } uint32_t state() const { return _val >> 32; } uint32_t key() const { return _val & 0xffff; } bool operator<(const KeyboardKey& other) const { return _val < other._val; } bool operator==(const KeyboardKey& other) const { return _val == other._val; } std::string name() const; static bool make_key (const std::string&, KeyboardKey&); private: uint64_t _val; }; class LIBGTKMM2EXT_API MouseButton { public: MouseButton () { _val = ~0ULL; } MouseButton (uint32_t state, uint32_t button_number); uint32_t state() const { return _val >> 32; } uint32_t button() const { return _val & 0xffff; } bool operator<(const MouseButton& other) const { return _val < other._val; } bool operator==(const MouseButton& other) const { return _val == other._val; } std::string name() const; static bool make_button (const std::string&, MouseButton&); private: uint64_t _val; }; class LIBGTKMM2EXT_API ActionMap { public: ActionMap() {} ~ActionMap() {} Glib::RefPtr create_action_group (const std::string& group_name); Glib::RefPtr register_action (Glib::RefPtr group, const char* name, const char* label); Glib::RefPtr register_action (Glib::RefPtr group, const char* name, const char* label, sigc::slot sl); Glib::RefPtr register_radio_action (Glib::RefPtr group, Gtk::RadioAction::Group&, const char* name, const char* label, sigc::slot sl, int value); Glib::RefPtr register_radio_action (Glib::RefPtr group, Gtk::RadioAction::Group&, const char* name, const char* label, sigc::slot sl); Glib::RefPtr register_toggle_action (Glib::RefPtr group, const char* name, const char* label, sigc::slot sl); Glib::RefPtr find_action (const std::string& name); typedef std::vector > Actions; void get_actions (Actions&); private: <<<<<<< HEAD typedef std::map > _ActionMap; _ActionMap actions; }; ======= /* hash for faster lookup of actions by name */ typedef std::map > _ActionMap; _ActionMap _actions; }; >>>>>>> radically change Keyboard/Binding API design to disconnect Gtk::Action lookup from binding definition /* single global action map for entire application. * * Actions are name-spaced by group, and it makes things * much easier if there is a single place to look up * any action. */ LIBGTKMM2EXT_API extern ActionMap Actions; class LIBGTKMM2EXT_API Bindings { public: enum Operation { Press, Release }; <<<<<<< HEAD Bindings(); ======= struct ActionInfo { ActionInfo (std::string const& name) : action_name (name) {} std::string action_name; Glib::RefPtr action; }; Bindings (std::string const& name); >>>>>>> radically change Keyboard/Binding API design to disconnect Gtk::Action lookup from binding definition ~Bindings (); std::string const& name() const { return _name; } void associate (); void dissociate (); bool empty() const; bool empty_keys () const; bool empty_mouse () const; void add (KeyboardKey, Operation, std::string const&, bool can_save = false); bool replace (KeyboardKey, Operation, std::string const& action_name, bool can_save = true); void remove (KeyboardKey, Operation, bool can_save = false); void remove (Glib::RefPtr, Operation, bool can_save = false); bool activate (KeyboardKey, Operation); void add (MouseButton, Operation, std::string const&); void remove (MouseButton, Operation); bool activate (MouseButton, Operation); bool load (XMLNode const& node); void load_operation (XMLNode const& node); void save (XMLNode& root); <<<<<<< HEAD void set_action_map (ActionMap&); ======= >>>>>>> radically change Keyboard/Binding API design to disconnect Gtk::Action lookup from binding definition static void set_ignored_state (int mask) { _ignored_state = mask; } static uint32_t ignored_state() { return _ignored_state; } void set_action_map (ActionMap&); /* used to list all actions */ void get_all_actions (std::vector& names, std::vector& paths, std::vector& keys); /* used for editing bindings */ void get_all_actions (std::vector& paths, std::vector& labels, std::vector& tooltips, std::vector& keys, std::vector >& actions); /* all bindings currently in existence, as grouped into Bindings */ static std::list bindings; static Bindings* get_bindings (std::string const& name); static void associate_all (); private: typedef std::map KeybindingMap; std::string _name; ActionMap& _action_map; KeybindingMap press_bindings; KeybindingMap release_bindings; typedef std::map MouseButtonBindingMap; MouseButtonBindingMap button_press_bindings; MouseButtonBindingMap button_release_bindings; static uint32_t _ignored_state; void push_to_gtk (KeyboardKey, Glib::RefPtr); }; } // namespace std::ostream& operator<<(std::ostream& out, Gtkmm2ext::KeyboardKey const & k); #endif /* __libgtkmm2ext_bindings_h__ */