diff --git a/lib/libimhex/include/hex/api/event.hpp b/lib/libimhex/include/hex/api/event.hpp index 77503aefc..e5b5d5601 100644 --- a/lib/libimhex/include/hex/api/event.hpp +++ b/lib/libimhex/include/hex/api/event.hpp @@ -102,7 +102,6 @@ namespace hex { /* Default Events */ EVENT_DEF(EventFileLoaded, std::fs::path); - EVENT_DEF(EventFileUnloaded); EVENT_DEF(EventDataChanged); EVENT_DEF(EventHighlightingChanged); EVENT_DEF(EventWindowClosing, GLFWwindow *); @@ -114,6 +113,7 @@ namespace hex { EVENT_DEF(EventOSThemeChanged); EVENT_DEF(EventProviderCreated, prv::Provider *); EVENT_DEF(EventProviderChanged, prv::Provider *, prv::Provider *); + EVENT_DEF(EventProviderDeleted, prv::Provider *); EVENT_DEF(EventFrameBegin); EVENT_DEF(EventFrameEnd); EVENT_DEF(EventWindowInitialized); diff --git a/lib/libimhex/include/hex/api/keybinding.hpp b/lib/libimhex/include/hex/api/keybinding.hpp index 359c53642..449ecfde6 100644 --- a/lib/libimhex/include/hex/api/keybinding.hpp +++ b/lib/libimhex/include/hex/api/keybinding.hpp @@ -188,7 +188,9 @@ namespace hex { public: static void addGlobalShortcut(const Shortcut &shortcut, const std::function &callback); static void addShortcut(View *view, const Shortcut &shortcut, const std::function &callback); + static void process(View *currentView, bool ctrl, bool alt, bool shift, bool super, bool focused, u32 keyCode); + static void processGlobals(bool ctrl, bool alt, bool shift, bool super, u32 keyCode); static void clearShortcuts(); diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index c292ab11f..0431d6e65 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -251,10 +251,17 @@ namespace hex { } void remove(prv::Provider *provider) { + if (provider == nullptr) + return; + if (Task::getRunningTaskCount() > 0) return; - + auto it = std::find(s_providers.begin(), s_providers.end(), provider); + if (it == s_providers.end()) + return; + + EventManager::post(provider); s_providers.erase(it); diff --git a/lib/libimhex/source/api/keybinding.cpp b/lib/libimhex/source/api/keybinding.cpp index 6a3ee5813..e101d2f73 100644 --- a/lib/libimhex/source/api/keybinding.cpp +++ b/lib/libimhex/source/api/keybinding.cpp @@ -15,7 +15,7 @@ namespace hex { view->m_shortcuts.insert({ shortcut, callback }); } - void ShortcutManager::process(View *currentView, bool ctrl, bool alt, bool shift, bool super, bool focused, u32 keyCode) { + static Shortcut getShortcut(bool ctrl, bool alt, bool shift, bool super, u32 keyCode) { Shortcut pressedShortcut; if (ctrl) @@ -29,9 +29,20 @@ namespace hex { pressedShortcut += static_cast(keyCode); + return pressedShortcut; + } + + void ShortcutManager::process(View *currentView, bool ctrl, bool alt, bool shift, bool super, bool focused, u32 keyCode) { + Shortcut pressedShortcut = getShortcut(ctrl, alt, shift, super, keyCode); + if (focused && currentView->m_shortcuts.contains(pressedShortcut)) currentView->m_shortcuts[pressedShortcut](); - else if (ShortcutManager::s_globalShortcuts.contains(pressedShortcut)) + } + + void ShortcutManager::processGlobals(bool ctrl, bool alt, bool shift, bool super, u32 keyCode) { + Shortcut pressedShortcut = getShortcut(ctrl, alt, shift, super, keyCode); + + if (ShortcutManager::s_globalShortcuts.contains(pressedShortcut)) ShortcutManager::s_globalShortcuts[pressedShortcut](); } diff --git a/main/source/window/window.cpp b/main/source/window/window.cpp index 6293b74cf..8f9d8960e 100644 --- a/main/source/window/window.cpp +++ b/main/source/window/window.cpp @@ -87,7 +87,7 @@ namespace hex { EventManager::post(this->m_window); }); - EventManager::subscribe(this, [] { + EventManager::subscribe(this, [](const auto*) { EventManager::post(""); }); @@ -163,7 +163,7 @@ namespace hex { this->exitImGui(); this->exitGLFW(); - EventManager::unsubscribe(this); + EventManager::unsubscribe(this); EventManager::unsubscribe(this); EventManager::unsubscribe(this); EventManager::unsubscribe(this); @@ -416,6 +416,7 @@ namespace hex { calls.clear(); } + auto &io = ImGui::GetIO(); for (auto &[name, view] : ContentRegistry::Views::getEntries()) { ImGui::GetCurrentContext()->NextWindowData.ClearFlags(); @@ -442,13 +443,16 @@ namespace hex { ImGui::End(); } - auto &io = ImGui::GetIO(); for (const auto &key : this->m_pressedKeys) { ShortcutManager::process(view, io.KeyCtrl, io.KeyAlt, io.KeyShift, io.KeySuper, focused, key); } } } + for (const auto &key : this->m_pressedKeys) { + ShortcutManager::processGlobals(io.KeyCtrl, io.KeyAlt, io.KeyShift, io.KeySuper, key); + } + this->m_pressedKeys.clear(); } diff --git a/plugins/builtin/CMakeLists.txt b/plugins/builtin/CMakeLists.txt index 8b382fed8..604459634 100644 --- a/plugins/builtin/CMakeLists.txt +++ b/plugins/builtin/CMakeLists.txt @@ -23,6 +23,7 @@ add_library(${PROJECT_NAME} SHARED source/content/data_visualizers.cpp source/content/events.cpp source/content/hashes.cpp + source/content/shortcuts.cpp source/content/providers/file_provider.cpp source/content/providers/gdb_provider.cpp diff --git a/plugins/builtin/source/content/main_menu_items.cpp b/plugins/builtin/source/content/main_menu_items.cpp index aa527e328..84914d8c7 100644 --- a/plugins/builtin/source/content/main_menu_items.cpp +++ b/plugins/builtin/source/content/main_menu_items.cpp @@ -46,7 +46,6 @@ namespace hex::plugin::builtin { bool taskRunning = Task::getRunningTaskCount() > 0; if (ImGui::MenuItem("hex.builtin.menu.file.close"_lang, "CTRL + W", false, providerValid && !taskRunning)) { - EventManager::post(); ImHexApi::Provider::remove(ImHexApi::Provider::get()); } diff --git a/plugins/builtin/source/content/shortcuts.cpp b/plugins/builtin/source/content/shortcuts.cpp new file mode 100644 index 000000000..8a7124489 --- /dev/null +++ b/plugins/builtin/source/content/shortcuts.cpp @@ -0,0 +1,20 @@ +#include +#include + +namespace hex::plugin::builtin { + + void registerShortcuts() { + // Open file + ShortcutManager::addGlobalShortcut(CTRL + Keys::O, [] { + fs::openFileBrowser(fs::DialogMode::Open, {}, [](const auto &path) { + EventManager::post(path); + }); + }); + + // Close file + ShortcutManager::addGlobalShortcut(CTRL + Keys::W, [] { + ImHexApi::Provider::remove(ImHexApi::Provider::get()); + }); + } + +} \ No newline at end of file diff --git a/plugins/builtin/source/content/views/view_bookmarks.cpp b/plugins/builtin/source/content/views/view_bookmarks.cpp index 8b5d9e97d..c23ca457d 100644 --- a/plugins/builtin/source/content/views/view_bookmarks.cpp +++ b/plugins/builtin/source/content/views/view_bookmarks.cpp @@ -37,7 +37,7 @@ namespace hex::plugin::builtin { ProjectFile::setBookmarks(this->m_bookmarks); }); - EventManager::subscribe(this, [this] { + EventManager::subscribe(this, [this](const auto*) { this->m_bookmarks.clear(); }); @@ -115,7 +115,7 @@ namespace hex::plugin::builtin { EventManager::unsubscribe(this); EventManager::unsubscribe(this); EventManager::unsubscribe(this); - EventManager::unsubscribe(this); + EventManager::unsubscribe(this); this->m_bookmarks.clear(); } diff --git a/plugins/builtin/source/content/views/view_disassembler.cpp b/plugins/builtin/source/content/views/view_disassembler.cpp index b6902b6fd..071f00cc8 100644 --- a/plugins/builtin/source/content/views/view_disassembler.cpp +++ b/plugins/builtin/source/content/views/view_disassembler.cpp @@ -22,7 +22,7 @@ namespace hex::plugin::builtin { } }); - EventManager::subscribe(this, [this] { + EventManager::subscribe(this, [this](const auto*) { this->m_disassembly.clear(); }); } @@ -30,7 +30,7 @@ namespace hex::plugin::builtin { ViewDisassembler::~ViewDisassembler() { EventManager::unsubscribe(this); EventManager::unsubscribe(this); - EventManager::unsubscribe(this); + EventManager::unsubscribe(this); } void ViewDisassembler::disassemble() { diff --git a/plugins/builtin/source/content/views/view_hex_editor.cpp b/plugins/builtin/source/content/views/view_hex_editor.cpp index 1a1c18910..db15c6872 100644 --- a/plugins/builtin/source/content/views/view_hex_editor.cpp +++ b/plugins/builtin/source/content/views/view_hex_editor.cpp @@ -1243,19 +1243,6 @@ namespace hex::plugin::builtin { pasteBytes(selection); }); - // Open file - ShortcutManager::addGlobalShortcut(CTRL + Keys::O, [] { - fs::openFileBrowser(fs::DialogMode::Open, {}, [](const auto &path) { - EventManager::post(path); - }); - }); - - // Close file - ShortcutManager::addGlobalShortcut(CTRL + Keys::W, [] { - EventManager::post(); - ImHexApi::Provider::remove(ImHexApi::Provider::get()); - }); - // Undo / Redo ShortcutManager::addShortcut(this, CTRL + Keys::Z, [] { if (ImHexApi::Provider::isValid()) diff --git a/plugins/builtin/source/content/views/view_information.cpp b/plugins/builtin/source/content/views/view_information.cpp index 3f0b0c22f..2654a6a3b 100644 --- a/plugins/builtin/source/content/views/view_information.cpp +++ b/plugins/builtin/source/content/views/view_information.cpp @@ -42,7 +42,7 @@ namespace hex::plugin::builtin { this->m_entropyHandlePosition = region.address / this->m_blockSize; }); - EventManager::subscribe(this, [this] { + EventManager::subscribe(this, [this](const auto*) { this->m_dataValid = false; }); @@ -61,7 +61,7 @@ namespace hex::plugin::builtin { ViewInformation::~ViewInformation() { EventManager::unsubscribe(this); EventManager::unsubscribe(this); - EventManager::unsubscribe(this); + EventManager::unsubscribe(this); } static float calculateEntropy(std::array &valueCounts, size_t blockSize) { diff --git a/plugins/builtin/source/content/views/view_pattern_editor.cpp b/plugins/builtin/source/content/views/view_pattern_editor.cpp index cd1b7a5ba..eab4fc949 100644 --- a/plugins/builtin/source/content/views/view_pattern_editor.cpp +++ b/plugins/builtin/source/content/views/view_pattern_editor.cpp @@ -150,8 +150,8 @@ namespace hex::plugin::builtin { } }); - EventManager::subscribe(this, [] { - ImHexApi::Provider::get()->getPatternLanguageRuntime().abort(); + EventManager::subscribe(this, [](auto *provider) { + provider->getPatternLanguageRuntime().abort(); }); EventManager::subscribe(this, [this](prv::Provider *oldProvider, prv::Provider *newProvider) { @@ -283,7 +283,7 @@ namespace hex::plugin::builtin { EventManager::unsubscribe(this); EventManager::unsubscribe(this); EventManager::unsubscribe(this); - EventManager::unsubscribe(this); + EventManager::unsubscribe(this); EventManager::unsubscribe(this); EventManager::unsubscribe(this); } diff --git a/plugins/builtin/source/plugin_builtin.cpp b/plugins/builtin/source/plugin_builtin.cpp index b20def4a7..30261d7c2 100644 --- a/plugins/builtin/source/plugin_builtin.cpp +++ b/plugins/builtin/source/plugin_builtin.cpp @@ -19,6 +19,7 @@ namespace hex::plugin::builtin { void registerMainMenuEntries(); void createWelcomeScreen(); void registerViews(); + void registerShortcuts(); void addFooterItems(); void addToolbarItems(); @@ -62,6 +63,7 @@ IMHEX_PLUGIN_SETUP("Built-in", "WerWolv", "Default ImHex functionality") { registerDataFormatters(); createWelcomeScreen(); registerViews(); + registerShortcuts(); addFooterItems(); addToolbarItems();