Hopefully fixed the whole plugin mess I started
This commit is contained in:
parent
8ae15abb85
commit
dc85616549
@ -182,11 +182,16 @@ set_target_properties(imhex PROPERTIES CXX_VISIBILITY_PRESET hidden)
|
|||||||
target_link_directories(imhex PRIVATE ${CRYPTO_LIBRARY_DIRS} ${CAPSTONE_LIBRARY_DIRS} ${MAGIC_LIBRARY_DIRS})
|
target_link_directories(imhex PRIVATE ${CRYPTO_LIBRARY_DIRS} ${CAPSTONE_LIBRARY_DIRS} ${MAGIC_LIBRARY_DIRS})
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
target_link_libraries(imhex libdl.a libmagic.a libgnurx.a libtre.a libintl.a libiconv.a libshlwapi.a libcrypto.a libwinpthread.a libcapstone.a LLVMDemangle imgui libimhex ${Python_LIBRARIES})
|
target_link_libraries(imhex libdl.a libmagic.a libgnurx.a libtre.a libintl.a libiconv.a libshlwapi.a libcrypto.a libwinpthread.a libcapstone.a LLVMDemangle libimhex ${Python_LIBRARIES})
|
||||||
elseif (UNIX)
|
elseif (UNIX)
|
||||||
target_link_libraries(imhex magic crypto ${CMAKE_DL_LIBS} capstone LLVMDemangle imgui libimhex ${Python_LIBRARIES} dl)
|
target_link_libraries(imhex magic crypto ${CMAKE_DL_LIBS} capstone LLVMDemangle libimhex ${Python_LIBRARIES} dl)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
add_custom_command(TARGET imhex POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||||
|
$<TARGET_FILE:libimhex>
|
||||||
|
$<TARGET_FILE_DIR:imhex>)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
# Install binaries directly in the prefix, usually C:\Program Files\ImHex.
|
# Install binaries directly in the prefix, usually C:\Program Files\ImHex.
|
||||||
set(CMAKE_INSTALL_BINDIR ".")
|
set(CMAKE_INSTALL_BINDIR ".")
|
||||||
|
2
external/ImGui/CMakeLists.txt
vendored
2
external/ImGui/CMakeLists.txt
vendored
@ -8,6 +8,8 @@ find_package(Freetype REQUIRED)
|
|||||||
pkg_search_module(GLM REQUIRED glm)
|
pkg_search_module(GLM REQUIRED glm)
|
||||||
pkg_search_module(GLFW REQUIRED glfw3)
|
pkg_search_module(GLFW REQUIRED glfw3)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||||
|
|
||||||
add_library(imgui
|
add_library(imgui
|
||||||
source/imgui.cpp
|
source/imgui.cpp
|
||||||
source/imgui_demo.cpp
|
source/imgui_demo.cpp
|
||||||
|
4
external/glad/CMakeLists.txt
vendored
4
external/glad/CMakeLists.txt
vendored
@ -4,9 +4,11 @@ project(glad)
|
|||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc -static")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||||
|
|
||||||
add_library(glad
|
add_library(glad
|
||||||
source/glad.c
|
source/glad.c
|
||||||
)
|
)
|
||||||
|
4
external/llvm/CMakeLists.txt
vendored
4
external/llvm/CMakeLists.txt
vendored
@ -4,9 +4,11 @@ project(LLVMDemangle)
|
|||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc -static")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||||
|
|
||||||
add_library(LLVMDemangle
|
add_library(LLVMDemangle
|
||||||
Demangle/Demangle.cpp
|
Demangle/Demangle.cpp
|
||||||
Demangle/ItaniumDemangle.cpp
|
Demangle/ItaniumDemangle.cpp
|
||||||
|
@ -14,10 +14,10 @@ namespace hex {
|
|||||||
Plugin(std::string_view path);
|
Plugin(std::string_view path);
|
||||||
~Plugin();
|
~Plugin();
|
||||||
|
|
||||||
void initializePlugin(SharedData &sharedData) const;
|
void initializePlugin() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using InitializePluginFunc = void(*)(SharedData &sharedData);
|
using InitializePluginFunc = void(*)();
|
||||||
|
|
||||||
void *m_handle = nullptr;
|
void *m_handle = nullptr;
|
||||||
|
|
||||||
|
@ -8,13 +8,16 @@ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../external/nlohmann_json ${CMAK
|
|||||||
|
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc -static")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(libimhex STATIC
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
||||||
|
|
||||||
|
add_library(libimhex SHARED
|
||||||
source/helpers/event.cpp
|
source/helpers/event.cpp
|
||||||
source/helpers/utils.cpp
|
source/helpers/utils.cpp
|
||||||
source/helpers/content_registry.cpp
|
source/helpers/content_registry.cpp
|
||||||
|
source/helpers/shared_data.cpp
|
||||||
|
|
||||||
source/lang/preprocessor.cpp
|
source/lang/preprocessor.cpp
|
||||||
source/lang/lexer.cpp
|
source/lang/lexer.cpp
|
||||||
|
@ -28,106 +28,39 @@ namespace hex {
|
|||||||
SharedData(const SharedData&) = delete;
|
SharedData(const SharedData&) = delete;
|
||||||
SharedData(SharedData&&) = delete;
|
SharedData(SharedData&&) = delete;
|
||||||
|
|
||||||
static auto& get() {
|
|
||||||
static SharedData instance;
|
|
||||||
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
friend void hex::plugin::internal::initializePlugin(SharedData &sharedData);
|
|
||||||
friend class Window;
|
friend class Window;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
T& getVariable(std::string variableName) {
|
static T& getVariable(std::string variableName) {
|
||||||
return std::any_cast<T&>((*this->sharedVariables)[variableName]);
|
return std::any_cast<T&>(SharedData::sharedVariables[variableName]);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void setVariable(std::string variableName, T value) {
|
static void setVariable(std::string variableName, T value) {
|
||||||
(*this->sharedVariables)[variableName] = value;
|
SharedData::sharedVariables[variableName] = value;
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void initializeData() {
|
|
||||||
static int mainArgcStorage;
|
|
||||||
static char **mainArgvStorage;
|
|
||||||
static ImGuiContext *imGuiContextStorage;
|
|
||||||
static std::vector<EventHandler> eventHandlersStorage;
|
|
||||||
static std::vector<std::function<void()>> deferredCallsStorage;
|
|
||||||
static prv::Provider *currentProviderStorage;
|
|
||||||
static std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> settingsEntriesStorage;
|
|
||||||
static std::map<std::string, std::any> sharedVariablesStorage;
|
|
||||||
static ImVec2 windowPosStorage, windowSizeStorage;
|
|
||||||
static nlohmann::json settingsJsonStorage;
|
|
||||||
static std::map<std::string, Events> customEventsStorage;
|
|
||||||
static u32 customEventsLastIdStorage = u32(Events::Events_BuiltinEnd) + 1;
|
|
||||||
static std::vector<ContentRegistry::CommandPaletteCommands::Entry> commandPaletteCommandsStorage;
|
|
||||||
static std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function> patternLanguageFunctionsStorage;
|
|
||||||
static std::vector<View*> viewsStorage;
|
|
||||||
static std::vector<std::function<void()>> toolsStorage;
|
|
||||||
|
|
||||||
this->imguiContext = &imGuiContextStorage;
|
|
||||||
this->eventHandlers = &eventHandlersStorage;
|
|
||||||
this->deferredCalls = &deferredCallsStorage;
|
|
||||||
this->currentProvider = ¤tProviderStorage;
|
|
||||||
this->settingsEntries = &settingsEntriesStorage;
|
|
||||||
this->sharedVariables = &sharedVariablesStorage;
|
|
||||||
this->windowPos = &windowPosStorage;
|
|
||||||
this->windowSize = &windowSizeStorage;
|
|
||||||
this->settingsJson = &settingsJsonStorage;
|
|
||||||
this->customEvents = &customEventsStorage;
|
|
||||||
this->customEventsLastId = &customEventsLastIdStorage;
|
|
||||||
this->commandPaletteCommands = &commandPaletteCommandsStorage;
|
|
||||||
this->patternLanguageFunctions = &patternLanguageFunctionsStorage;
|
|
||||||
this->views = &viewsStorage;
|
|
||||||
this->tools = &toolsStorage;
|
|
||||||
this->mainArgc = &mainArgcStorage;
|
|
||||||
this->mainArgv = &mainArgvStorage;
|
|
||||||
}
|
|
||||||
|
|
||||||
void initializeData(const SharedData &other) {
|
|
||||||
this->imguiContext = other.imguiContext;
|
|
||||||
this->eventHandlers = other.eventHandlers;
|
|
||||||
this->deferredCalls = other.deferredCalls;
|
|
||||||
this->currentProvider = other.currentProvider;
|
|
||||||
this->settingsEntries = other.settingsEntries;
|
|
||||||
this->sharedVariables = other.sharedVariables;
|
|
||||||
this->windowPos = other.windowPos;
|
|
||||||
this->windowSize = other.windowSize;
|
|
||||||
this->settingsJson = other.settingsJson;
|
|
||||||
this->customEvents = other.customEvents;
|
|
||||||
this->customEventsLastId = other.customEventsLastId;
|
|
||||||
this->commandPaletteCommands = other.commandPaletteCommands;
|
|
||||||
this->patternLanguageFunctions = other.patternLanguageFunctions;
|
|
||||||
this->views = other.views;
|
|
||||||
this->tools = other.tools;
|
|
||||||
this->mainArgc = other.mainArgc;
|
|
||||||
this->mainArgv = other.mainArgv;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ImGuiContext **imguiContext;
|
static std::vector<EventHandler> eventHandlers;
|
||||||
std::vector<EventHandler> *eventHandlers;
|
static std::vector<std::function<void()>> deferredCalls;
|
||||||
std::vector<std::function<void()>> *deferredCalls;
|
static prv::Provider *currentProvider;
|
||||||
prv::Provider **currentProvider;
|
static std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> settingsEntries;
|
||||||
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> *settingsEntries;
|
static nlohmann::json settingsJson;
|
||||||
nlohmann::json *settingsJson;
|
static std::map<std::string, Events> customEvents;
|
||||||
std::map<std::string, Events> *customEvents;
|
static u32 customEventsLastId;
|
||||||
u32 *customEventsLastId;
|
static std::vector<ContentRegistry::CommandPaletteCommands::Entry> commandPaletteCommands;
|
||||||
std::vector<ContentRegistry::CommandPaletteCommands::Entry> *commandPaletteCommands;
|
static std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function> patternLanguageFunctions;
|
||||||
std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function> *patternLanguageFunctions;
|
static std::vector<View*> views;
|
||||||
std::vector<View*> *views;
|
static std::vector<std::function<void()>> tools;
|
||||||
std::vector<std::function<void()>> *tools;
|
|
||||||
|
|
||||||
int *mainArgc;
|
static int mainArgc;
|
||||||
char ***mainArgv;
|
static char **mainArgv;
|
||||||
|
|
||||||
ImVec2 *windowPos;
|
static ImVec2 windowPos;
|
||||||
ImVec2 *windowSize;
|
static ImVec2 windowSize;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<std::string, std::any> *sharedVariables;
|
static std::map<std::string, std::any> sharedVariables;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
@ -11,13 +11,8 @@
|
|||||||
|
|
||||||
#define IMHEX_PLUGIN_SETUP namespace hex::plugin { void setup(); } \
|
#define IMHEX_PLUGIN_SETUP namespace hex::plugin { void setup(); } \
|
||||||
namespace hex::plugin::internal { \
|
namespace hex::plugin::internal { \
|
||||||
void initializePlugin(SharedData &sharedData) { \
|
void initializePlugin() { \
|
||||||
if (glGetString == NULL) \
|
|
||||||
gladLoadGL(); \
|
|
||||||
SharedData::get().initializeData(sharedData); \
|
|
||||||
ImGui::SetCurrentContext(*sharedData.imguiContext); \
|
|
||||||
hex::plugin::setup(); \
|
hex::plugin::setup(); \
|
||||||
\
|
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
void hex::plugin::setup()
|
void hex::plugin::setup()
|
||||||
|
@ -10,14 +10,14 @@ namespace hex {
|
|||||||
/* Settings */
|
/* Settings */
|
||||||
|
|
||||||
void ContentRegistry::Settings::load() {
|
void ContentRegistry::Settings::load() {
|
||||||
std::ifstream settingsFile(std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path() / "settings.json");
|
std::ifstream settingsFile(std::filesystem::path((SharedData::mainArgv)[0]).parent_path() / "settings.json");
|
||||||
|
|
||||||
if (settingsFile.good())
|
if (settingsFile.good())
|
||||||
settingsFile >> getSettingsData();
|
settingsFile >> getSettingsData();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContentRegistry::Settings::store() {
|
void ContentRegistry::Settings::store() {
|
||||||
std::ofstream settingsFile(std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path() / "settings.json", std::ios::trunc);
|
std::ofstream settingsFile(std::filesystem::path((SharedData::mainArgv)[0]).parent_path() / "settings.json", std::ios::trunc);
|
||||||
settingsFile << getSettingsData();
|
settingsFile << getSettingsData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,19 +40,19 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>>& ContentRegistry::Settings::getEntries() {
|
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>>& ContentRegistry::Settings::getEntries() {
|
||||||
return *SharedData::get().settingsEntries;
|
return SharedData::settingsEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
nlohmann::json& ContentRegistry::Settings::getSettingsData() {
|
nlohmann::json& ContentRegistry::Settings::getSettingsData() {
|
||||||
return *SharedData::get().settingsJson;
|
return SharedData::settingsJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Events */
|
/* Events */
|
||||||
|
|
||||||
auto ContentRegistry::Events::get(std::string_view name) {
|
auto ContentRegistry::Events::get(std::string_view name) {
|
||||||
auto &customEvents = *SharedData::get().customEvents;
|
auto &customEvents = SharedData::customEvents;
|
||||||
auto &lastId = *SharedData::get().customEventsLastId;
|
auto &lastId = SharedData::customEventsLastId;
|
||||||
|
|
||||||
if (!customEvents.contains(name.data())) {
|
if (!customEvents.contains(name.data())) {
|
||||||
customEvents[name.data()] = static_cast<hex::Events>(lastId);
|
customEvents[name.data()] = static_cast<hex::Events>(lastId);
|
||||||
@ -70,7 +70,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ContentRegistry::CommandPaletteCommands::Entry>& ContentRegistry::CommandPaletteCommands::getEntries() {
|
std::vector<ContentRegistry::CommandPaletteCommands::Entry>& ContentRegistry::CommandPaletteCommands::getEntries() {
|
||||||
return *SharedData::get().commandPaletteCommands;
|
return SharedData::commandPaletteCommands;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function>& ContentRegistry::PatternLanguageFunctions::getEntries() {
|
std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function>& ContentRegistry::PatternLanguageFunctions::getEntries() {
|
||||||
return *SharedData::get().patternLanguageFunctions;
|
return SharedData::patternLanguageFunctions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<View*>& ContentRegistry::Views::getEntries() {
|
std::vector<View*>& ContentRegistry::Views::getEntries() {
|
||||||
return *SharedData::get().views;
|
return SharedData::views;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::function<void()>>& ContentRegistry::Tools::getEntries() {
|
std::vector<std::function<void()>>& ContentRegistry::Tools::getEntries() {
|
||||||
return *SharedData::get().tools;
|
return SharedData::tools;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -5,21 +5,21 @@
|
|||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
void EventManager::post(Events eventType, const void *userData) {
|
void EventManager::post(Events eventType, const void *userData) {
|
||||||
for (auto &handler : *SharedData::get().eventHandlers)
|
for (auto &handler : SharedData::eventHandlers)
|
||||||
if (eventType == handler.eventType)
|
if (eventType == handler.eventType)
|
||||||
handler.callback(userData);
|
handler.callback(userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventManager::subscribe(Events eventType, void *owner, std::function<void(const void*)> callback) {
|
void EventManager::subscribe(Events eventType, void *owner, std::function<void(const void*)> callback) {
|
||||||
for (auto &handler : *SharedData::get().eventHandlers)
|
for (auto &handler : SharedData::eventHandlers)
|
||||||
if (eventType == handler.eventType && owner == handler.owner)
|
if (eventType == handler.eventType && owner == handler.owner)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SharedData::get().eventHandlers->push_back(EventHandler { owner, eventType, callback });
|
SharedData::eventHandlers.push_back(EventHandler { owner, eventType, callback });
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventManager::unsubscribe(Events eventType, void *sender) {
|
void EventManager::unsubscribe(Events eventType, void *sender) {
|
||||||
std::erase_if(*SharedData::get().eventHandlers, [&eventType, &sender](EventHandler handler) {
|
std::erase_if(SharedData::eventHandlers, [&eventType, &sender](EventHandler handler) {
|
||||||
return eventType == handler.eventType && sender == handler.owner;
|
return eventType == handler.eventType && sender == handler.owner;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
24
plugins/libimhex/source/helpers/shared_data.cpp
Normal file
24
plugins/libimhex/source/helpers/shared_data.cpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include <helpers/shared_data.hpp>
|
||||||
|
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
std::vector<EventHandler> SharedData::eventHandlers;
|
||||||
|
std::vector<std::function<void()>> SharedData::deferredCalls;
|
||||||
|
prv::Provider *SharedData::currentProvider;
|
||||||
|
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> SharedData::settingsEntries;
|
||||||
|
nlohmann::json SharedData::settingsJson;
|
||||||
|
std::map<std::string, Events> SharedData::customEvents;
|
||||||
|
u32 SharedData::customEventsLastId;
|
||||||
|
std::vector<ContentRegistry::CommandPaletteCommands::Entry> SharedData::commandPaletteCommands;
|
||||||
|
std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function> SharedData::patternLanguageFunctions;
|
||||||
|
std::vector<View*> SharedData::views;
|
||||||
|
std::vector<std::function<void()>> SharedData::tools;
|
||||||
|
|
||||||
|
int SharedData::mainArgc;
|
||||||
|
char **SharedData::mainArgv;
|
||||||
|
|
||||||
|
ImVec2 SharedData::windowPos;
|
||||||
|
ImVec2 SharedData::windowSize;
|
||||||
|
|
||||||
|
std::map<std::string, std::any> SharedData::sharedVariables;
|
||||||
|
}
|
@ -17,7 +17,7 @@ namespace hex {
|
|||||||
bool View::handleShortcut(int key, int mods) { return false; }
|
bool View::handleShortcut(int key, int mods) { return false; }
|
||||||
|
|
||||||
std::vector<std::function<void()>>& View::getDeferedCalls() {
|
std::vector<std::function<void()>>& View::getDeferedCalls() {
|
||||||
return *SharedData::get().deferredCalls;
|
return SharedData::deferredCalls;
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::postEvent(Events eventType, const void *userData) {
|
void View::postEvent(Events eventType, const void *userData) {
|
||||||
@ -76,7 +76,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void View::doLater(std::function<void()> &&function) {
|
void View::doLater(std::function<void()> &&function) {
|
||||||
SharedData::get().deferredCalls->push_back(function);
|
SharedData::deferredCalls.push_back(function);
|
||||||
}
|
}
|
||||||
|
|
||||||
void View::confirmButtons(const char *textLeft, const char *textRight, std::function<void()> leftButtonFn, std::function<void()> rightButtonFn) {
|
void View::confirmButtons(const char *textLeft, const char *textRight, std::function<void()> leftButtonFn, std::function<void()> rightButtonFn) {
|
||||||
|
@ -179,10 +179,10 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool LoaderScript::processFile(std::string_view scriptPath) {
|
bool LoaderScript::processFile(std::string_view scriptPath) {
|
||||||
Py_SetProgramName(Py_DecodeLocale((*SharedData::get().mainArgv)[0], nullptr));
|
Py_SetProgramName(Py_DecodeLocale((SharedData::mainArgv)[0], nullptr));
|
||||||
|
|
||||||
if (std::filesystem::exists(std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path().string() + "/lib/python" PYTHON_VERSION_MAJOR_MINOR))
|
if (std::filesystem::exists(std::filesystem::path((SharedData::mainArgv)[0]).parent_path().string() + "/lib/python" PYTHON_VERSION_MAJOR_MINOR))
|
||||||
Py_SetPythonHome(Py_DecodeLocale(std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path().string().c_str(), nullptr));
|
Py_SetPythonHome(Py_DecodeLocale(std::filesystem::path((SharedData::mainArgv)[0]).parent_path().string().c_str(), nullptr));
|
||||||
|
|
||||||
PyImport_AppendInittab("_imhex", []() -> PyObject* {
|
PyImport_AppendInittab("_imhex", []() -> PyObject* {
|
||||||
|
|
||||||
|
@ -5,8 +5,8 @@
|
|||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
// hex::plugin::internal::initializePlugin(SharedData&)
|
// hex::plugin::internal::initializePlugin()
|
||||||
constexpr auto InitializePluginSymbol = "_ZN3hex6plugin8internal16initializePluginERNS_10SharedDataE";
|
constexpr auto InitializePluginSymbol = "_ZN3hex6plugin8internal16initializePluginEv";
|
||||||
|
|
||||||
Plugin::Plugin(std::string_view path) {
|
Plugin::Plugin(std::string_view path) {
|
||||||
this->m_handle = dlopen(path.data(), RTLD_LAZY);
|
this->m_handle = dlopen(path.data(), RTLD_LAZY);
|
||||||
@ -22,9 +22,9 @@ namespace hex {
|
|||||||
dlclose(this->m_handle);
|
dlclose(this->m_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plugin::initializePlugin(SharedData &sharedData) const {
|
void Plugin::initializePlugin() const {
|
||||||
if (this->m_initializePluginFunction != nullptr)
|
if (this->m_initializePluginFunction != nullptr)
|
||||||
this->m_initializePluginFunction(sharedData);
|
this->m_initializePluginFunction();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginHandler::load(std::string_view pluginFolder) {
|
void PluginHandler::load(std::string_view pluginFolder) {
|
||||||
|
@ -61,7 +61,7 @@ namespace hex {
|
|||||||
|
|
||||||
{
|
{
|
||||||
u8 bytes[10] = { 0 };
|
u8 bytes[10] = { 0 };
|
||||||
(*SharedData::get().currentProvider)->read(region.address, bytes, std::min(region.size, size_t(10)));
|
(SharedData::currentProvider)->read(region.address, bytes, std::min(region.size, size_t(10)));
|
||||||
|
|
||||||
std::string bytesString;
|
std::string bytesString;
|
||||||
for (u8 i = 0; i < std::min(region.size, size_t(10)); i++) {
|
for (u8 i = 0; i < std::min(region.size, size_t(10)); i++) {
|
||||||
|
@ -40,8 +40,8 @@ namespace hex {
|
|||||||
|
|
||||||
void ViewCommandPalette::drawContent() {
|
void ViewCommandPalette::drawContent() {
|
||||||
|
|
||||||
auto windowPos = *SharedData::get().windowPos;
|
auto windowPos = SharedData::windowPos;
|
||||||
auto windowSize = *SharedData::get().windowSize;
|
auto windowSize = SharedData::windowSize;
|
||||||
auto paletteSize = this->getMinSize();
|
auto paletteSize = this->getMinSize();
|
||||||
ImGui::SetNextWindowPos(ImVec2(windowPos.x + (windowSize.x - paletteSize.x) / 2.0F, windowPos.y), ImGuiCond_Always);
|
ImGui::SetNextWindowPos(ImVec2(windowPos.x + (windowSize.x - paletteSize.x) / 2.0F, windowPos.y), ImGuiCond_Always);
|
||||||
if (ImGui::BeginPopup("Command Palette")) {
|
if (ImGui::BeginPopup("Command Palette")) {
|
||||||
|
@ -13,7 +13,7 @@ namespace hex {
|
|||||||
View::subscribeEvent(Events::RegionSelected, [this](const void* userData){
|
View::subscribeEvent(Events::RegionSelected, [this](const void* userData){
|
||||||
Region region = *static_cast<const Region*>(userData);
|
Region region = *static_cast<const Region*>(userData);
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (provider == nullptr) {
|
if (provider == nullptr) {
|
||||||
this->m_validBytes = 0;
|
this->m_validBytes = 0;
|
||||||
@ -141,7 +141,7 @@ namespace hex {
|
|||||||
|
|
||||||
|
|
||||||
if (ImGui::Begin("Data Inspector", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
if (ImGui::Begin("Data Inspector", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (provider != nullptr && provider->isReadable()) {
|
if (provider != nullptr && provider->isReadable()) {
|
||||||
if (ImGui::BeginTable("##datainspector", 2,
|
if (ImGui::BeginTable("##datainspector", 2,
|
||||||
|
@ -51,7 +51,7 @@ namespace hex {
|
|||||||
|
|
||||||
if (cs_open(Disassembler::toCapstoneArchictecture(this->m_architecture), mode, &capstoneHandle) == CS_ERR_OK) {
|
if (cs_open(Disassembler::toCapstoneArchictecture(this->m_architecture), mode, &capstoneHandle) == CS_ERR_OK) {
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
std::vector<u8> buffer(2048, 0x00);
|
std::vector<u8> buffer(2048, 0x00);
|
||||||
for (u64 address = 0; address < (this->m_codeRegion[1] - this->m_codeRegion[0] + 1); address += 2048) {
|
for (u64 address = 0; address < (this->m_codeRegion[1] - this->m_codeRegion[0] + 1); address += 2048) {
|
||||||
size_t bufferSize = std::min(u64(2048), (this->m_codeRegion[1] - this->m_codeRegion[0] + 1) - address);
|
size_t bufferSize = std::min(u64(2048), (this->m_codeRegion[1] - this->m_codeRegion[0] + 1) - address);
|
||||||
@ -95,7 +95,7 @@ namespace hex {
|
|||||||
|
|
||||||
if (ImGui::Begin("Disassembler", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
if (ImGui::Begin("Disassembler", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (provider != nullptr && provider->isReadable()) {
|
if (provider != nullptr && provider->isReadable()) {
|
||||||
ImGui::TextUnformatted("Position");
|
ImGui::TextUnformatted("Position");
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
@ -41,7 +41,7 @@ namespace hex {
|
|||||||
if (ImGui::Begin("Hashing", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
if (ImGui::Begin("Hashing", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
||||||
ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
|
ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (provider != nullptr && provider->isAvailable()) {
|
if (provider != nullptr && provider->isAvailable()) {
|
||||||
|
|
||||||
ImGui::TextUnformatted("Region");
|
ImGui::TextUnformatted("Region");
|
||||||
|
@ -19,7 +19,7 @@ namespace hex {
|
|||||||
: View("Hex Editor"), m_patternData(patternData) {
|
: View("Hex Editor"), m_patternData(patternData) {
|
||||||
|
|
||||||
this->m_memoryEditor.ReadFn = [](const ImU8 *data, size_t off) -> ImU8 {
|
this->m_memoryEditor.ReadFn = [](const ImU8 *data, size_t off) -> ImU8 {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (!provider->isAvailable() || !provider->isReadable())
|
if (!provider->isAvailable() || !provider->isReadable())
|
||||||
return 0x00;
|
return 0x00;
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ namespace hex {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this->m_memoryEditor.WriteFn = [](ImU8 *data, size_t off, ImU8 d) -> void {
|
this->m_memoryEditor.WriteFn = [](ImU8 *data, size_t off, ImU8 d) -> void {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (!provider->isAvailable() || !provider->isWritable())
|
if (!provider->isAvailable() || !provider->isWritable())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ namespace hex {
|
|||||||
View::subscribeEvent(Events::SelectionChangeRequest, [this](const void *userData) {
|
View::subscribeEvent(Events::SelectionChangeRequest, [this](const void *userData) {
|
||||||
const Region ®ion = *reinterpret_cast<const Region*>(userData);
|
const Region ®ion = *reinterpret_cast<const Region*>(userData);
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
auto page = provider->getPageOfAddress(region.address);
|
auto page = provider->getPageOfAddress(region.address);
|
||||||
if (!page.has_value())
|
if (!page.has_value())
|
||||||
return;
|
return;
|
||||||
@ -110,7 +110,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViewHexEditor::drawContent() {
|
void ViewHexEditor::drawContent() {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
size_t dataSize = (provider == nullptr || !provider->isReadable()) ? 0x00 : provider->getSize();
|
size_t dataSize = (provider == nullptr || !provider->isReadable()) ? 0x00 : provider->getSize();
|
||||||
|
|
||||||
@ -300,7 +300,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViewHexEditor::drawMenu() {
|
void ViewHexEditor::drawMenu() {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (ImGui::BeginMenu("File")) {
|
if (ImGui::BeginMenu("File")) {
|
||||||
if (ImGui::MenuItem("Open File...", "CTRL + O")) {
|
if (ImGui::MenuItem("Open File...", "CTRL + O")) {
|
||||||
@ -415,7 +415,7 @@ namespace hex {
|
|||||||
|
|
||||||
bool ViewHexEditor::handleShortcut(int key, int mods) {
|
bool ViewHexEditor::handleShortcut(int key, int mods) {
|
||||||
if (mods == GLFW_MOD_CONTROL && key == GLFW_KEY_S) {
|
if (mods == GLFW_MOD_CONTROL && key == GLFW_KEY_S) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
for (const auto &[address, value] : provider->getPatches())
|
for (const auto &[address, value] : provider->getPatches())
|
||||||
provider->writeRaw(address, &value, sizeof(u8));
|
provider->writeRaw(address, &value, sizeof(u8));
|
||||||
return true;
|
return true;
|
||||||
@ -444,7 +444,7 @@ namespace hex {
|
|||||||
|
|
||||||
|
|
||||||
void ViewHexEditor::openFile(std::string path) {
|
void ViewHexEditor::openFile(std::string path) {
|
||||||
auto& provider = *SharedData::get().currentProvider;
|
auto& provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (provider != nullptr)
|
if (provider != nullptr)
|
||||||
delete provider;
|
delete provider;
|
||||||
@ -493,7 +493,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViewHexEditor::copyBytes() {
|
void ViewHexEditor::copyBytes() {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
@ -512,7 +512,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViewHexEditor::copyString() {
|
void ViewHexEditor::copyString() {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
@ -527,7 +527,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViewHexEditor::copyLanguageArray(Language language) {
|
void ViewHexEditor::copyLanguageArray(Language language) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
@ -629,7 +629,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViewHexEditor::copyHexView() {
|
void ViewHexEditor::copyHexView() {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
@ -676,7 +676,7 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViewHexEditor::copyHexViewHTML() {
|
void ViewHexEditor::copyHexViewHTML() {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
|
||||||
@ -809,7 +809,7 @@ R"(
|
|||||||
void ViewHexEditor::drawSearchPopup() {
|
void ViewHexEditor::drawSearchPopup() {
|
||||||
static auto InputCallback = [](ImGuiInputTextCallbackData* data) -> int {
|
static auto InputCallback = [](ImGuiInputTextCallbackData* data) -> int {
|
||||||
auto _this = static_cast<ViewHexEditor*>(data->UserData);
|
auto _this = static_cast<ViewHexEditor*>(data->UserData);
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
*_this->m_lastSearchBuffer = _this->m_searchFunction(provider, data->Buf);
|
*_this->m_lastSearchBuffer = _this->m_searchFunction(provider, data->Buf);
|
||||||
_this->m_lastSearchIndex = 0;
|
_this->m_lastSearchIndex = 0;
|
||||||
@ -821,7 +821,7 @@ R"(
|
|||||||
};
|
};
|
||||||
|
|
||||||
static auto Find = [this](char *buffer) {
|
static auto Find = [this](char *buffer) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
*this->m_lastSearchBuffer = this->m_searchFunction(provider, buffer);
|
*this->m_lastSearchBuffer = this->m_searchFunction(provider, buffer);
|
||||||
this->m_lastSearchIndex = 0;
|
this->m_lastSearchIndex = 0;
|
||||||
@ -899,7 +899,7 @@ R"(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ViewHexEditor::drawGotoPopup() {
|
void ViewHexEditor::drawGotoPopup() {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (ImGui::BeginPopup("Goto")) {
|
if (ImGui::BeginPopup("Goto")) {
|
||||||
ImGui::TextUnformatted("Goto");
|
ImGui::TextUnformatted("Goto");
|
||||||
@ -1003,7 +1003,7 @@ R"(
|
|||||||
View::postEvent(Events::AddBookmark, &bookmark);
|
View::postEvent(Events::AddBookmark, &bookmark);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (ImGui::MenuItem("Set base address", nullptr, false, provider != nullptr && provider->isReadable())) {
|
if (ImGui::MenuItem("Set base address", nullptr, false, provider != nullptr && provider->isReadable())) {
|
||||||
std::memset(this->m_baseAddressBuffer, sizeof(this->m_baseAddressBuffer), 0x00);
|
std::memset(this->m_baseAddressBuffer, sizeof(this->m_baseAddressBuffer), 0x00);
|
||||||
View::doLater([]{ ImGui::OpenPopup("Set base address"); });
|
View::doLater([]{ ImGui::OpenPopup("Set base address"); });
|
||||||
|
@ -49,7 +49,7 @@ namespace hex {
|
|||||||
if (ImGui::Begin("Data Information", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
if (ImGui::Begin("Data Information", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
||||||
ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
|
ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (provider != nullptr && provider->isReadable()) {
|
if (provider != nullptr && provider->isReadable()) {
|
||||||
if (this->m_shouldInvalidate) {
|
if (this->m_shouldInvalidate) {
|
||||||
@ -135,7 +135,7 @@ namespace hex {
|
|||||||
|
|
||||||
if (this->m_dataValid) {
|
if (this->m_dataValid) {
|
||||||
|
|
||||||
for (auto &[name, value] : (*SharedData::get().currentProvider)->getDataInformation()) {
|
for (auto &[name, value] : (SharedData::currentProvider)->getDataInformation()) {
|
||||||
ImGui::LabelText(name.c_str(), "%s", value.c_str());
|
ImGui::LabelText(name.c_str(), "%s", value.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,13 +13,13 @@ namespace hex {
|
|||||||
|
|
||||||
ViewPatches::ViewPatches() : View("Patches") {
|
ViewPatches::ViewPatches() : View("Patches") {
|
||||||
View::subscribeEvent(Events::ProjectFileStore, [this](const void*) {
|
View::subscribeEvent(Events::ProjectFileStore, [this](const void*) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (provider != nullptr)
|
if (provider != nullptr)
|
||||||
ProjectFile::setPatches(provider->getPatches());
|
ProjectFile::setPatches(provider->getPatches());
|
||||||
});
|
});
|
||||||
|
|
||||||
View::subscribeEvent(Events::ProjectFileLoad, [this](const void*) {
|
View::subscribeEvent(Events::ProjectFileLoad, [this](const void*) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (provider != nullptr)
|
if (provider != nullptr)
|
||||||
provider->getPatches() = ProjectFile::getPatches();
|
provider->getPatches() = ProjectFile::getPatches();
|
||||||
});
|
});
|
||||||
@ -32,7 +32,7 @@ namespace hex {
|
|||||||
|
|
||||||
void ViewPatches::drawContent() {
|
void ViewPatches::drawContent() {
|
||||||
if (ImGui::Begin("Patches", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
if (ImGui::Begin("Patches", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (provider != nullptr && provider->isReadable()) {
|
if (provider != nullptr && provider->isReadable()) {
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ namespace hex {
|
|||||||
if (error)
|
if (error)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (provider == nullptr)
|
if (provider == nullptr)
|
||||||
return;
|
return;
|
||||||
@ -224,7 +224,7 @@ namespace hex {
|
|||||||
|
|
||||||
void ViewPattern::drawContent() {
|
void ViewPattern::drawContent() {
|
||||||
if (ImGui::Begin("Pattern", &this->getWindowOpenState(), ImGuiWindowFlags_None | ImGuiWindowFlags_NoCollapse)) {
|
if (ImGui::Begin("Pattern", &this->getWindowOpenState(), ImGuiWindowFlags_None | ImGuiWindowFlags_NoCollapse)) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (provider != nullptr && provider->isAvailable()) {
|
if (provider != nullptr && provider->isAvailable()) {
|
||||||
auto textEditorSize = ImGui::GetContentRegionAvail();
|
auto textEditorSize = ImGui::GetContentRegionAvail();
|
||||||
@ -378,7 +378,7 @@ namespace hex {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
hex::lang::Evaluator evaluator(provider, defaultDataEndianess);
|
hex::lang::Evaluator evaluator(provider, defaultDataEndianess);
|
||||||
|
|
||||||
auto patternData = evaluator.evaluate(ast.value());
|
auto patternData = evaluator.evaluate(ast.value());
|
||||||
|
@ -50,7 +50,7 @@ namespace hex {
|
|||||||
|
|
||||||
void ViewPatternData::drawContent() {
|
void ViewPatternData::drawContent() {
|
||||||
if (ImGui::Begin("Pattern Data", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
if (ImGui::Begin("Pattern Data", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (provider != nullptr && provider->isReadable()) {
|
if (provider != nullptr && provider->isReadable()) {
|
||||||
|
|
||||||
if (beginPatternDataTable(provider, this->m_patternData, this->m_sortedPatternData)) {
|
if (beginPatternDataTable(provider, this->m_patternData, this->m_sortedPatternData)) {
|
||||||
|
@ -47,7 +47,7 @@ namespace hex {
|
|||||||
|
|
||||||
|
|
||||||
void ViewStrings::drawContent() {
|
void ViewStrings::drawContent() {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
|
|
||||||
if (this->m_shouldInvalidate) {
|
if (this->m_shouldInvalidate) {
|
||||||
this->m_shouldInvalidate = false;
|
this->m_shouldInvalidate = false;
|
||||||
|
@ -42,7 +42,7 @@ namespace hex {
|
|||||||
this->m_mathEvaluator.setFunction("read", [this](auto args) -> std::optional<long double> {
|
this->m_mathEvaluator.setFunction("read", [this](auto args) -> std::optional<long double> {
|
||||||
u8 value = 0;
|
u8 value = 0;
|
||||||
|
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (provider == nullptr || !provider->isReadable() || args[0] >= provider->getActualSize())
|
if (provider == nullptr || !provider->isReadable() || args[0] >= provider->getActualSize())
|
||||||
return { };
|
return { };
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ namespace hex {
|
|||||||
}, 1, 1);
|
}, 1, 1);
|
||||||
|
|
||||||
this->m_mathEvaluator.setFunction("write", [this](auto args) -> std::optional<long double> {
|
this->m_mathEvaluator.setFunction("write", [this](auto args) -> std::optional<long double> {
|
||||||
auto provider = *SharedData::get().currentProvider;
|
auto provider = SharedData::currentProvider;
|
||||||
if (provider == nullptr || !provider->isWritable() || args[0] >= provider->getActualSize())
|
if (provider == nullptr || !provider->isWritable() || args[0] >= provider->getActualSize())
|
||||||
return { };
|
return { };
|
||||||
|
|
||||||
|
@ -45,10 +45,8 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Window::Window(int &argc, char **&argv) {
|
Window::Window(int &argc, char **&argv) {
|
||||||
SharedData::get().initializeData();
|
hex::SharedData::mainArgc = argc;
|
||||||
|
hex::SharedData::mainArgv = argv;
|
||||||
hex::SharedData::get().mainArgc = &argc;
|
|
||||||
hex::SharedData::get().mainArgv = &argv;
|
|
||||||
|
|
||||||
ContentRegistry::Settings::load();
|
ContentRegistry::Settings::load();
|
||||||
View::postEvent(Events::SettingsChanged, nullptr);
|
View::postEvent(Events::SettingsChanged, nullptr);
|
||||||
@ -254,21 +252,21 @@ namespace hex {
|
|||||||
{
|
{
|
||||||
int x = 0, y = 0;
|
int x = 0, y = 0;
|
||||||
glfwGetWindowPos(this->m_window, &x, &y);
|
glfwGetWindowPos(this->m_window, &x, &y);
|
||||||
*SharedData::get().windowPos = ImVec2(x, y);
|
SharedData::windowPos = ImVec2(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
int width = 0, height = 0;
|
int width = 0, height = 0;
|
||||||
glfwGetWindowSize(this->m_window, &width, &height);
|
glfwGetWindowSize(this->m_window, &width, &height);
|
||||||
*SharedData::get().windowSize = ImVec2(width, height);
|
SharedData::windowSize = ImVec2(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwSetWindowPosCallback(this->m_window, [](GLFWwindow *window, int x, int y) {
|
glfwSetWindowPosCallback(this->m_window, [](GLFWwindow *window, int x, int y) {
|
||||||
*SharedData::get().windowPos = ImVec2(x, y);
|
SharedData::windowPos = ImVec2(x, y);
|
||||||
});
|
});
|
||||||
|
|
||||||
glfwSetWindowSizeCallback(this->m_window, [](GLFWwindow *window, int width, int height) {
|
glfwSetWindowSizeCallback(this->m_window, [](GLFWwindow *window, int width, int height) {
|
||||||
*SharedData::get().windowSize = ImVec2(width, height);
|
SharedData::windowSize = ImVec2(width, height);
|
||||||
});
|
});
|
||||||
|
|
||||||
glfwSetKeyCallback(this->m_window, [](GLFWwindow *window, int key, int scancode, int action, int mods) {
|
glfwSetKeyCallback(this->m_window, [](GLFWwindow *window, int key, int scancode, int action, int mods) {
|
||||||
@ -297,6 +295,8 @@ namespace hex {
|
|||||||
void Window::initImGui() {
|
void Window::initImGui() {
|
||||||
IMGUI_CHECKVERSION();
|
IMGUI_CHECKVERSION();
|
||||||
auto *ctx = ImGui::CreateContext();
|
auto *ctx = ImGui::CreateContext();
|
||||||
|
GImGui = ctx;
|
||||||
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
ImGuiStyle& style = ImGui::GetStyle();
|
ImGuiStyle& style = ImGui::GetStyle();
|
||||||
|
|
||||||
@ -307,7 +307,7 @@ namespace hex {
|
|||||||
style.ScaleAllSizes(this->m_globalScale);
|
style.ScaleAllSizes(this->m_globalScale);
|
||||||
|
|
||||||
#ifdef __MINGW32__
|
#ifdef __MINGW32__
|
||||||
std::filesystem::path resourcePath = std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path();
|
std::filesystem::path resourcePath = std::filesystem::path((SharedData::mainArgv)[0]).parent_path();
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
std::filesystem::path resourcePath = "/usr/share/ImHex";
|
std::filesystem::path resourcePath = "/usr/share/ImHex";
|
||||||
#else
|
#else
|
||||||
@ -346,15 +346,13 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Window::initPlugins() {
|
void Window::initPlugins() {
|
||||||
(*SharedData::get().imguiContext) = ImGui::GetCurrentContext();
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto pluginFolderPath = std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path() / "plugins";
|
auto pluginFolderPath = std::filesystem::path((SharedData::mainArgv)[0]).parent_path() / "plugins";
|
||||||
PluginHandler::load(pluginFolderPath.string());
|
PluginHandler::load(pluginFolderPath.string());
|
||||||
} catch (std::runtime_error &e) { return; }
|
} catch (std::runtime_error &e) { return; }
|
||||||
|
|
||||||
for (const auto &plugin : PluginHandler::getPlugins()) {
|
for (const auto &plugin : PluginHandler::getPlugins()) {
|
||||||
plugin.initializePlugin(SharedData::get());
|
plugin.initializePlugin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user