2021-01-20 20:16:24 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <hex.hpp>
|
2023-12-19 12:22:28 +01:00
|
|
|
#include <hex/api/localization_manager.hpp>
|
2021-01-20 20:16:24 +01:00
|
|
|
|
2024-05-08 21:44:30 +02:00
|
|
|
#include <functional>
|
2022-02-16 14:57:13 +01:00
|
|
|
#include <optional>
|
2023-11-28 01:55:41 +01:00
|
|
|
#include <span>
|
2021-09-08 15:18:24 +02:00
|
|
|
#include <string>
|
2022-02-16 14:57:13 +01:00
|
|
|
#include <vector>
|
2022-05-27 20:42:07 +02:00
|
|
|
#include <map>
|
2024-05-17 21:56:43 +02:00
|
|
|
#include <set>
|
2021-01-20 20:16:24 +01:00
|
|
|
|
2023-03-17 17:07:39 +01:00
|
|
|
#include <wolv/io/fs.hpp>
|
|
|
|
|
2022-02-17 11:42:56 +01:00
|
|
|
using ImGuiID = unsigned int;
|
|
|
|
struct ImVec2;
|
2023-11-21 13:47:50 +01:00
|
|
|
struct ImFontAtlas;
|
2023-11-29 23:47:37 +01:00
|
|
|
struct ImFont;
|
2024-01-15 20:52:08 +01:00
|
|
|
struct GLFWwindow;
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2021-01-20 20:16:24 +01:00
|
|
|
namespace hex {
|
|
|
|
|
2024-02-21 00:06:52 +01:00
|
|
|
namespace impl {
|
|
|
|
class AutoResetBase;
|
|
|
|
}
|
2024-02-19 22:06:46 +01:00
|
|
|
|
2022-01-24 20:53:17 +01:00
|
|
|
namespace prv {
|
|
|
|
class Provider;
|
|
|
|
}
|
2021-09-21 02:29:54 +02:00
|
|
|
|
2021-10-16 11:37:29 +02:00
|
|
|
namespace ImHexApi {
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/* Functions to query information from the Hex Editor and interact with it */
|
2022-02-01 18:09:40 +01:00
|
|
|
namespace HexEditor {
|
|
|
|
|
2022-05-27 20:42:07 +02:00
|
|
|
using TooltipFunction = std::function<void(u64, const u8*, size_t)>;
|
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
class Highlighting {
|
|
|
|
public:
|
|
|
|
Highlighting() = default;
|
2022-05-27 20:42:07 +02:00
|
|
|
Highlighting(Region region, color_t color);
|
|
|
|
|
2024-02-10 23:31:05 +01:00
|
|
|
[[nodiscard]] const Region& getRegion() const { return m_region; }
|
|
|
|
[[nodiscard]] const color_t& getColor() const { return m_color; }
|
2022-05-27 20:42:07 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
Region m_region = {};
|
|
|
|
color_t m_color = 0x00;
|
|
|
|
};
|
|
|
|
|
|
|
|
class Tooltip {
|
|
|
|
public:
|
|
|
|
Tooltip() = default;
|
|
|
|
Tooltip(Region region, std::string value, color_t color);
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2024-02-10 23:31:05 +01:00
|
|
|
[[nodiscard]] const Region& getRegion() const { return m_region; }
|
|
|
|
[[nodiscard]] const color_t& getColor() const { return m_color; }
|
|
|
|
[[nodiscard]] const std::string& getValue() const { return m_value; }
|
2022-02-01 18:09:40 +01:00
|
|
|
|
|
|
|
private:
|
2022-02-16 14:57:13 +01:00
|
|
|
Region m_region = {};
|
2022-05-27 20:42:07 +02:00
|
|
|
std::string m_value;
|
2022-02-16 14:57:13 +01:00
|
|
|
color_t m_color = 0x00;
|
2022-02-01 18:09:40 +01:00
|
|
|
};
|
|
|
|
|
2023-11-10 20:47:08 +01:00
|
|
|
struct ProviderRegion : Region {
|
2022-11-08 21:43:22 +01:00
|
|
|
prv::Provider *provider;
|
|
|
|
|
|
|
|
[[nodiscard]] prv::Provider *getProvider() const { return this->provider; }
|
|
|
|
|
|
|
|
[[nodiscard]] Region getRegion() const { return { this->address, this->size }; }
|
|
|
|
};
|
|
|
|
|
2022-02-16 14:57:13 +01:00
|
|
|
namespace impl {
|
|
|
|
|
2022-09-28 15:01:43 +02:00
|
|
|
using HighlightingFunction = std::function<std::optional<color_t>(u64, const u8*, size_t, bool)>;
|
2024-02-25 14:30:56 +01:00
|
|
|
using HoveringFunction = std::function<bool(const prv::Provider *, u64, const u8*, size_t)>;
|
2022-02-16 14:57:13 +01:00
|
|
|
|
2024-02-10 23:31:05 +01:00
|
|
|
const std::map<u32, Highlighting>& getBackgroundHighlights();
|
|
|
|
const std::map<u32, HighlightingFunction>& getBackgroundHighlightingFunctions();
|
|
|
|
const std::map<u32, Highlighting>& getForegroundHighlights();
|
|
|
|
const std::map<u32, HighlightingFunction>& getForegroundHighlightingFunctions();
|
2024-02-25 14:30:56 +01:00
|
|
|
const std::map<u32, HoveringFunction>& getHoveringFunctions();
|
2024-02-10 23:31:05 +01:00
|
|
|
const std::map<u32, Tooltip>& getTooltips();
|
|
|
|
const std::map<u32, TooltipFunction>& getTooltipFunctions();
|
2022-02-16 14:57:13 +01:00
|
|
|
|
2023-11-10 21:03:31 +01:00
|
|
|
void setCurrentSelection(const std::optional<ProviderRegion> ®ion);
|
2024-02-25 14:30:56 +01:00
|
|
|
void setHoveredRegion(const prv::Provider *provider, const Region ®ion);
|
2022-02-16 14:57:13 +01:00
|
|
|
}
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Adds a background color highlighting to the Hex Editor
|
|
|
|
* @param region The region to highlight
|
|
|
|
* @param color The color to use for the highlighting
|
|
|
|
* @return Unique ID used to remove the highlighting again later
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
u32 addBackgroundHighlight(const Region ®ion, color_t color);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Removes a background color highlighting from the Hex Editor
|
|
|
|
* @param id The ID of the highlighting to remove
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
void removeBackgroundHighlight(u32 id);
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Adds a foreground color highlighting to the Hex Editor
|
|
|
|
* @param region The region to highlight
|
|
|
|
* @param color The color to use for the highlighting
|
|
|
|
* @return Unique ID used to remove the highlighting again later
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
u32 addForegroundHighlight(const Region ®ion, color_t color);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Removes a foreground color highlighting from the Hex Editor
|
|
|
|
* @param id The ID of the highlighting to remove
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
void removeForegroundHighlight(u32 id);
|
2022-02-16 14:57:13 +01:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Adds a hover tooltip to the Hex Editor
|
|
|
|
* @param region The region to add the tooltip to
|
|
|
|
* @param value Text to display in the tooltip
|
|
|
|
* @param color The color of the tooltip
|
|
|
|
* @return Unique ID used to remove the tooltip again later
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
u32 addTooltip(Region region, std::string value, color_t color);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Removes a hover tooltip from the Hex Editor
|
|
|
|
* @param id The ID of the tooltip to remove
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
void removeTooltip(u32 id);
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Adds a background color highlighting to the Hex Editor using a callback function
|
|
|
|
* @param function Function that draws the highlighting based on the hovered region
|
|
|
|
* @return Unique ID used to remove the highlighting again later
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
u32 addTooltipProvider(TooltipFunction function);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Removes a background color highlighting from the Hex Editor
|
|
|
|
* @param id The ID of the highlighting to remove
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
void removeTooltipProvider(u32 id);
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Adds a background color highlighting to the Hex Editor using a callback function
|
|
|
|
* @param function Function that draws the highlighting based on the hovered region
|
|
|
|
* @return Unique ID used to remove the highlighting again later
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
u32 addBackgroundHighlightingProvider(const impl::HighlightingFunction &function);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Removes a background color highlighting from the Hex Editor
|
|
|
|
* @param id The ID of the highlighting to remove
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
void removeBackgroundHighlightingProvider(u32 id);
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Adds a foreground color highlighting to the Hex Editor using a callback function
|
|
|
|
* @param function Function that draws the highlighting based on the hovered region
|
|
|
|
* @return Unique ID used to remove the highlighting again later
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
u32 addForegroundHighlightingProvider(const impl::HighlightingFunction &function);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Removes a foreground color highlighting from the Hex Editor
|
|
|
|
* @param id The ID of the highlighting to remove
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
void removeForegroundHighlightingProvider(u32 id);
|
|
|
|
|
2024-02-25 14:30:56 +01:00
|
|
|
/**
|
|
|
|
* @brief Adds a hovering provider to the Hex Editor using a callback function
|
|
|
|
* @param function Function that draws the highlighting based on the hovered region
|
|
|
|
* @return Unique ID used to remove the highlighting again later
|
|
|
|
*/
|
|
|
|
u32 addHoverHighlightProvider(const impl::HoveringFunction &function);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Removes a hovering color highlighting from the Hex Editor
|
|
|
|
* @param id The ID of the highlighting to remove
|
|
|
|
*/
|
|
|
|
void removeHoverHighlightProvider(u32 id);
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Checks if there's a valid selection in the Hex Editor right now
|
|
|
|
*/
|
2022-05-27 20:42:07 +02:00
|
|
|
bool isSelectionValid();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
2023-05-12 08:38:07 +02:00
|
|
|
/**
|
|
|
|
* @brief Clears the current selection in the Hex Editor
|
|
|
|
*/
|
|
|
|
void clearSelection();
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Gets the current selection in the Hex Editor
|
|
|
|
* @return The current selection
|
|
|
|
*/
|
2022-11-08 21:43:22 +01:00
|
|
|
std::optional<ProviderRegion> getSelection();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Sets the current selection in the Hex Editor
|
|
|
|
* @param region The region to select
|
|
|
|
* @param provider The provider to select the region in
|
|
|
|
*/
|
2022-11-08 21:43:22 +01:00
|
|
|
void setSelection(const Region ®ion, prv::Provider *provider = nullptr);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Sets the current selection in the Hex Editor
|
|
|
|
* @param region The region to select
|
|
|
|
*/
|
2022-11-08 21:43:22 +01:00
|
|
|
void setSelection(const ProviderRegion ®ion);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Sets the current selection in the Hex Editor
|
|
|
|
* @param address The address to select
|
|
|
|
* @param size The size of the selection
|
|
|
|
* @param provider The provider to select the region in
|
|
|
|
*/
|
2022-11-08 21:43:22 +01:00
|
|
|
void setSelection(u64 address, size_t size, prv::Provider *provider = nullptr);
|
2022-02-08 18:38:54 +01:00
|
|
|
|
2024-01-11 20:11:22 +01:00
|
|
|
/**
|
|
|
|
* @brief Adds a virtual file to the list in the Hex Editor
|
|
|
|
* @param path The path of the file
|
|
|
|
* @param data The data of the file
|
|
|
|
* @param region The location of the file in the Hex Editor if available
|
|
|
|
*/
|
|
|
|
void addVirtualFile(const std::fs::path &path, std::vector<u8> data, Region region = Region::Invalid());
|
|
|
|
|
2024-02-25 14:30:56 +01:00
|
|
|
/**
|
|
|
|
* @brief Gets the currently hovered cell region in the Hex Editor
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
const std::optional<Region>& getHoveredRegion(const prv::Provider *provider);
|
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
}
|
2021-08-21 13:55:21 +02:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/* Functions to interact with Bookmarks */
|
2021-10-16 11:37:29 +02:00
|
|
|
namespace Bookmarks {
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2021-01-20 20:16:24 +01:00
|
|
|
struct Entry {
|
|
|
|
Region region;
|
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
std::string name;
|
|
|
|
std::string comment;
|
2021-01-20 20:16:24 +01:00
|
|
|
u32 color;
|
2021-02-24 21:42:18 +01:00
|
|
|
bool locked;
|
2023-11-25 12:43:48 +01:00
|
|
|
u64 id;
|
2021-01-20 20:16:24 +01:00
|
|
|
};
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Adds a new bookmark
|
|
|
|
* @param address The address of the bookmark
|
|
|
|
* @param size The size of the bookmark
|
|
|
|
* @param name The name of the bookmark
|
|
|
|
* @param comment The comment of the bookmark
|
|
|
|
* @param color The color of the bookmark or 0x00 for the default color
|
2023-11-25 12:43:48 +01:00
|
|
|
* @return Bookmark ID
|
2023-03-21 15:33:43 +01:00
|
|
|
*/
|
2023-11-25 12:43:48 +01:00
|
|
|
u64 add(u64 address, size_t size, const std::string &name, const std::string &comment, color_t color = 0x00000000);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Adds a new bookmark
|
|
|
|
* @param region The region of the bookmark
|
|
|
|
* @param name The name of the bookmark
|
|
|
|
* @param comment The comment of the bookmark
|
|
|
|
* @param color The color of the bookmark or 0x00 for the default color
|
|
|
|
* @return Bookmark ID
|
|
|
|
*/
|
|
|
|
u64 add(Region region, const std::string &name, const std::string &comment, color_t color = 0x00000000);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Removes a bookmark
|
|
|
|
* @param id The ID of the bookmark to remove
|
|
|
|
*/
|
|
|
|
void remove(u64 id);
|
2021-01-20 20:16:24 +01:00
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
}
|
2021-08-21 13:55:21 +02:00
|
|
|
|
2023-05-05 22:02:18 +02:00
|
|
|
/**
|
|
|
|
* Helper methods about the providers
|
|
|
|
* @note the "current provider" or "currently selected provider" refers to the currently selected provider in the UI;
|
|
|
|
* the provider the user is actually editing.
|
|
|
|
*/
|
2021-10-16 11:37:29 +02:00
|
|
|
namespace Provider {
|
|
|
|
|
2022-08-08 21:23:52 +02:00
|
|
|
namespace impl {
|
|
|
|
|
|
|
|
void resetClosingProvider();
|
2024-06-16 14:48:31 +02:00
|
|
|
std::set<prv::Provider*> getClosingProviders();
|
2022-08-08 21:23:52 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Gets the currently selected data provider
|
2023-05-05 22:02:18 +02:00
|
|
|
* @return The currently selected data provider, or nullptr is there is none
|
2023-03-21 15:33:43 +01:00
|
|
|
*/
|
2022-01-24 20:53:17 +01:00
|
|
|
prv::Provider *get();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets a list of all currently loaded data providers
|
|
|
|
* @return The currently loaded data providers
|
|
|
|
*/
|
2024-02-10 23:31:05 +01:00
|
|
|
std::vector<prv::Provider*> getProviders();
|
2021-09-21 02:29:54 +02:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Sets the currently selected data provider
|
|
|
|
* @param index Index of the provider to select
|
|
|
|
*/
|
2024-02-24 12:06:06 +01:00
|
|
|
void setCurrentProvider(i64 index);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Sets the currently selected data provider
|
|
|
|
* @param provider The provider to select
|
|
|
|
*/
|
|
|
|
void setCurrentProvider(NonNull<prv::Provider*> provider);
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2023-09-24 18:04:14 +02:00
|
|
|
/**
|
|
|
|
* @brief Gets the index of the currently selected data provider
|
|
|
|
* @return Index of the selected provider
|
|
|
|
*/
|
|
|
|
i64 getCurrentProviderIndex();
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Checks whether the currently selected data provider is valid
|
|
|
|
* @return Whether the currently selected data provider is valid
|
|
|
|
*/
|
2021-10-16 11:37:29 +02:00
|
|
|
bool isValid();
|
2021-09-21 02:29:54 +02:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
2023-05-05 22:02:18 +02:00
|
|
|
* @brief Marks the **currently selected** data provider as dirty
|
2023-03-21 15:33:43 +01:00
|
|
|
*/
|
2022-08-08 21:23:52 +02:00
|
|
|
void markDirty();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
2023-05-05 22:02:18 +02:00
|
|
|
* @brief Marks **all data providers** as clean
|
2023-03-21 15:33:43 +01:00
|
|
|
*/
|
2022-08-08 21:23:52 +02:00
|
|
|
void resetDirty();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
2023-05-05 22:02:18 +02:00
|
|
|
* @brief Checks whether **any of the data providers** is dirty
|
|
|
|
* @return Whether any data provider is dirty
|
2023-03-21 15:33:43 +01:00
|
|
|
*/
|
2022-08-08 21:23:52 +02:00
|
|
|
bool isDirty();
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
2023-05-05 22:02:18 +02:00
|
|
|
* @brief Adds a newly created provider to the list of providers, and mark it as the selected one.
|
2023-03-21 15:33:43 +01:00
|
|
|
* @param provider The provider to add
|
2023-05-05 22:02:18 +02:00
|
|
|
* @param skipLoadInterface Whether to skip the provider's loading interface (see property documentation)
|
2023-06-08 17:02:16 +02:00
|
|
|
* @param select Whether to select the provider after adding it
|
2023-03-21 15:33:43 +01:00
|
|
|
*/
|
2024-02-10 23:31:05 +01:00
|
|
|
void add(std::unique_ptr<prv::Provider> &&provider, bool skipLoadInterface = false, bool select = true);
|
2021-09-21 02:29:54 +02:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Creates a new provider and adds it to the list of providers
|
|
|
|
* @tparam T The type of the provider to create
|
|
|
|
* @param args Arguments to pass to the provider's constructor
|
|
|
|
*/
|
2022-06-25 12:19:59 +02:00
|
|
|
template<std::derived_from<prv::Provider> T>
|
2022-01-24 20:53:17 +01:00
|
|
|
void add(auto &&...args) {
|
2024-02-10 23:31:05 +01:00
|
|
|
add(std::make_unique<T>(std::forward<decltype(args)>(args)...));
|
2021-09-21 02:29:54 +02:00
|
|
|
}
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Removes a provider from the list of providers
|
|
|
|
* @param provider The provider to remove
|
|
|
|
* @param noQuestions Whether to skip asking the user for confirmation
|
|
|
|
*/
|
2022-08-08 21:23:52 +02:00
|
|
|
void remove(prv::Provider *provider, bool noQuestions = false);
|
2021-09-21 02:29:54 +02:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
2023-05-05 22:02:18 +02:00
|
|
|
* @brief Creates a new provider using its unlocalized name and add it to the list of providers
|
2023-03-21 15:33:43 +01:00
|
|
|
* @param unlocalizedName The unlocalized name of the provider to create
|
2023-05-05 22:02:18 +02:00
|
|
|
* @param skipLoadInterface Whether to skip the provider's loading interface (see property documentation)
|
2023-11-10 20:47:08 +01:00
|
|
|
* @param select Whether to select the provider after adding it
|
2023-03-21 15:33:43 +01:00
|
|
|
*/
|
2024-01-15 20:52:08 +01:00
|
|
|
prv::Provider* createProvider(
|
|
|
|
const UnlocalizedString &unlocalizedName,
|
|
|
|
bool skipLoadInterface = false,
|
|
|
|
bool select = true
|
|
|
|
);
|
2022-08-06 22:29:59 +02:00
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
}
|
2021-12-16 23:48:52 +01:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/* Functions to interact with various ImHex system settings */
|
2022-02-01 18:09:40 +01:00
|
|
|
namespace System {
|
|
|
|
|
2024-01-28 22:14:59 +01:00
|
|
|
struct ProgramArguments {
|
|
|
|
int argc;
|
|
|
|
char **argv;
|
|
|
|
char **envp;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct InitialWindowProperties {
|
|
|
|
i32 x, y;
|
|
|
|
u32 width, height;
|
|
|
|
bool maximized;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class TaskProgressState {
|
|
|
|
Reset,
|
|
|
|
Progress,
|
|
|
|
Flash
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class TaskProgressType {
|
|
|
|
Normal,
|
|
|
|
Warning,
|
|
|
|
Error
|
|
|
|
};
|
2023-07-13 14:08:23 +02:00
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
namespace impl {
|
2024-01-28 22:14:59 +01:00
|
|
|
|
2023-07-13 14:08:23 +02:00
|
|
|
void setMainInstanceStatus(bool status);
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2023-06-10 15:15:38 +02:00
|
|
|
void setMainWindowPosition(i32 x, i32 y);
|
2022-02-01 18:09:40 +01:00
|
|
|
void setMainWindowSize(u32 width, u32 height);
|
|
|
|
void setMainDockSpaceId(ImGuiID id);
|
2024-01-15 20:52:08 +01:00
|
|
|
void setMainWindowHandle(GLFWwindow *window);
|
2022-02-01 18:09:40 +01:00
|
|
|
|
|
|
|
void setGlobalScale(float scale);
|
2022-07-29 17:37:30 +02:00
|
|
|
void setNativeScale(float scale);
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2022-02-15 23:07:48 +01:00
|
|
|
void setBorderlessWindowMode(bool enabled);
|
2024-01-28 22:14:59 +01:00
|
|
|
void setMultiWindowMode(bool enabled);
|
|
|
|
void setInitialWindowProperties(InitialWindowProperties properties);
|
2022-07-02 16:22:38 +02:00
|
|
|
|
2022-07-02 17:53:13 +02:00
|
|
|
void setGPUVendor(const std::string &vendor);
|
2024-06-22 22:58:45 +02:00
|
|
|
void setGLRenderer(const std::string &renderer);
|
2022-08-01 14:51:08 +02:00
|
|
|
|
2022-09-19 16:54:19 +02:00
|
|
|
void addInitArgument(const std::string &key, const std::string &value = { });
|
2023-11-21 13:47:50 +01:00
|
|
|
|
2023-12-20 13:42:42 +01:00
|
|
|
void setLastFrameTime(double time);
|
2024-01-21 18:39:51 +01:00
|
|
|
|
|
|
|
bool isWindowResizable();
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2024-02-21 00:06:52 +01:00
|
|
|
void addAutoResetObject(hex::impl::AutoResetBase *object);
|
2024-02-19 22:06:46 +01:00
|
|
|
void cleanup();
|
|
|
|
|
2024-01-28 22:14:59 +01:00
|
|
|
}
|
2023-01-14 14:21:16 +01:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Closes ImHex
|
|
|
|
* @param noQuestions Whether to skip asking the user for confirmation
|
|
|
|
*/
|
|
|
|
void closeImHex(bool noQuestions = false);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Restarts ImHex
|
|
|
|
*/
|
|
|
|
void restartImHex();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Sets the progress bar in the task bar
|
|
|
|
* @param state The state of the progress bar
|
|
|
|
* @param type The type of the progress bar progress
|
|
|
|
* @param progress The progress of the progress bar
|
|
|
|
*/
|
2023-01-14 14:21:16 +01:00
|
|
|
void setTaskBarProgress(TaskProgressState state, TaskProgressType type, u32 progress);
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current target FPS
|
|
|
|
* @return The current target FPS
|
|
|
|
*/
|
2022-02-01 18:09:40 +01:00
|
|
|
float getTargetFPS();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Sets the target FPS
|
|
|
|
* @param fps The target FPS
|
|
|
|
*/
|
2022-02-01 18:09:40 +01:00
|
|
|
void setTargetFPS(float fps);
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current global scale
|
|
|
|
* @return The current global scale
|
|
|
|
*/
|
2022-02-01 18:09:40 +01:00
|
|
|
float getGlobalScale();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current native scale
|
|
|
|
* @return The current native scale
|
|
|
|
*/
|
2022-07-29 17:37:30 +02:00
|
|
|
float getNativeScale();
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current main window position
|
|
|
|
* @return Position of the main window
|
|
|
|
*/
|
2022-02-01 18:09:40 +01:00
|
|
|
ImVec2 getMainWindowPosition();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current main window size
|
|
|
|
* @return Size of the main window
|
|
|
|
*/
|
2022-02-01 18:09:40 +01:00
|
|
|
ImVec2 getMainWindowSize();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current main dock space ID
|
|
|
|
* @return ID of the main dock space
|
|
|
|
*/
|
2022-02-01 18:09:40 +01:00
|
|
|
ImGuiID getMainDockSpaceId();
|
|
|
|
|
2024-01-15 20:52:08 +01:00
|
|
|
/**
|
|
|
|
* @brief Gets the main window's GLFW window handle
|
|
|
|
* @return GLFW window handle
|
|
|
|
*/
|
|
|
|
GLFWwindow* getMainWindowHandle();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Checks if borderless window mode is enabled currently
|
|
|
|
* @return Whether borderless window mode is enabled
|
|
|
|
*/
|
2022-02-15 23:07:48 +01:00
|
|
|
bool isBorderlessWindowModeEnabled();
|
|
|
|
|
2024-01-28 22:14:59 +01:00
|
|
|
/**
|
|
|
|
* @brief Checks if multi-window mode is enabled currently
|
|
|
|
* @return Whether multi-window mode is enabled
|
|
|
|
*/
|
|
|
|
bool isMutliWindowModeEnabled();
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Gets the init arguments passed to ImHex from the splash screen
|
|
|
|
* @return Init arguments
|
|
|
|
*/
|
2024-02-10 23:31:05 +01:00
|
|
|
const std::map<std::string, std::string>& getInitArguments();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets a init arguments passed to ImHex from the splash screen
|
|
|
|
* @param key The key of the init argument
|
|
|
|
* @return Init argument
|
|
|
|
*/
|
|
|
|
std::string getInitArgument(const std::string &key);
|
2022-02-01 18:09:40 +01:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Sets if ImHex should follow the system theme
|
|
|
|
* @param enabled Whether to follow the system theme
|
|
|
|
*/
|
2022-07-02 16:22:38 +02:00
|
|
|
void enableSystemThemeDetection(bool enabled);
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Checks if ImHex follows the system theme
|
|
|
|
* @return Whether ImHex follows the system theme
|
|
|
|
*/
|
2022-07-02 16:22:38 +02:00
|
|
|
bool usesSystemThemeDetection();
|
2022-07-02 17:53:13 +02:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the currently set additional folder paths
|
|
|
|
* @return The currently set additional folder paths
|
|
|
|
*/
|
2024-02-10 23:31:05 +01:00
|
|
|
const std::vector<std::filesystem::path>& getAdditionalFolderPaths();
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Sets the additional folder paths
|
|
|
|
* @param paths The additional folder paths
|
|
|
|
*/
|
2022-10-21 14:55:01 +02:00
|
|
|
void setAdditionalFolderPaths(const std::vector<std::filesystem::path> &paths);
|
2022-07-02 17:53:13 +02:00
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current GPU vendor
|
|
|
|
* @return The current GPU vendor
|
|
|
|
*/
|
2024-02-10 23:31:05 +01:00
|
|
|
const std::string& getGPUVendor();
|
2022-08-01 14:51:08 +02:00
|
|
|
|
2024-06-22 22:58:45 +02:00
|
|
|
/**
|
|
|
|
* @brief Gets the current GPU vendor
|
|
|
|
* @return The current GPU vendor
|
|
|
|
*/
|
|
|
|
const std::string& getGLRenderer();
|
|
|
|
|
2023-03-21 15:33:43 +01:00
|
|
|
/**
|
|
|
|
* @brief Checks if ImHex is running in portable mode
|
|
|
|
* @return Whether ImHex is running in portable mode
|
|
|
|
*/
|
2022-08-01 14:51:08 +02:00
|
|
|
bool isPortableVersion();
|
2023-06-20 11:55:56 +02:00
|
|
|
|
2023-06-26 14:01:45 +02:00
|
|
|
/**
|
|
|
|
* @brief Gets the current Operating System name
|
|
|
|
* @return Operating System name
|
|
|
|
*/
|
2023-06-20 11:55:56 +02:00
|
|
|
std::string getOSName();
|
|
|
|
|
2023-06-26 14:01:45 +02:00
|
|
|
/**
|
|
|
|
* @brief Gets the current Operating System version
|
|
|
|
* @return Operating System version
|
|
|
|
*/
|
2023-06-20 11:55:56 +02:00
|
|
|
std::string getOSVersion();
|
|
|
|
|
2023-06-26 14:01:45 +02:00
|
|
|
/**
|
|
|
|
* @brief Gets the current CPU architecture
|
|
|
|
* @return CPU architecture
|
|
|
|
*/
|
2023-06-20 11:55:56 +02:00
|
|
|
std::string getArchitecture();
|
2023-06-26 14:01:45 +02:00
|
|
|
|
2024-06-03 10:02:29 +02:00
|
|
|
|
|
|
|
struct LinuxDistro {
|
|
|
|
std::string name;
|
|
|
|
std::string version;
|
|
|
|
};
|
|
|
|
/**
|
|
|
|
* @brief Gets information related to the Linux distribution, if running on Linux
|
|
|
|
*/
|
|
|
|
std::optional<LinuxDistro> getLinuxDistro();
|
|
|
|
|
2023-06-26 14:01:45 +02:00
|
|
|
/**
|
|
|
|
* @brief Gets the current ImHex version
|
|
|
|
* @return ImHex version
|
|
|
|
*/
|
2023-11-05 19:57:29 +01:00
|
|
|
std::string getImHexVersion(bool withBuildType = true);
|
2023-06-26 14:01:45 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current git commit hash
|
|
|
|
* @param longHash Whether to return the full hash or the shortened version
|
|
|
|
* @return Git commit hash
|
|
|
|
*/
|
|
|
|
std::string getCommitHash(bool longHash = false);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current git commit branch
|
|
|
|
* @return Git commit branch
|
|
|
|
*/
|
|
|
|
std::string getCommitBranch();
|
2023-10-21 20:40:24 +02:00
|
|
|
|
2023-10-22 23:39:14 +02:00
|
|
|
/**
|
|
|
|
* @brief Checks if ImHex was built in debug mode
|
|
|
|
* @return True if ImHex was built in debug mode, false otherwise
|
|
|
|
*/
|
|
|
|
bool isDebugBuild();
|
|
|
|
|
2024-06-05 20:59:48 +02:00
|
|
|
/**
|
|
|
|
* @brief Checks if this version of ImHex is a nightly build
|
|
|
|
* @return True if this version is a nightly, false if it's a release
|
|
|
|
*/
|
|
|
|
bool isNightlyBuild();
|
|
|
|
|
2023-10-21 20:40:24 +02:00
|
|
|
enum class UpdateType {
|
|
|
|
Stable,
|
|
|
|
Nightly
|
|
|
|
};
|
|
|
|
|
2023-11-28 00:19:42 +01:00
|
|
|
/**
|
|
|
|
* @brief Triggers the update process
|
|
|
|
* @param updateType The update channel
|
|
|
|
* @return If the update process was successfully started
|
|
|
|
*/
|
2023-10-21 20:40:24 +02:00
|
|
|
bool updateImHex(UpdateType updateType);
|
2023-11-28 00:19:42 +01:00
|
|
|
|
2024-01-28 22:14:59 +01:00
|
|
|
/**
|
|
|
|
* @brief Add a new startup task that will be run while ImHex's splash screen is shown
|
|
|
|
* @param name Name to be shown in the UI
|
|
|
|
* @param async Whether to run the task asynchronously
|
|
|
|
* @param function The function to run
|
|
|
|
*/
|
2023-11-28 00:19:42 +01:00
|
|
|
void addStartupTask(const std::string &name, bool async, const std::function<bool()> &function);
|
2023-12-20 13:42:42 +01:00
|
|
|
|
2024-01-28 22:14:59 +01:00
|
|
|
/**
|
|
|
|
* @brief Gets the time the previous frame took
|
|
|
|
* @return Previous frame time
|
|
|
|
*/
|
2023-12-20 13:42:42 +01:00
|
|
|
double getLastFrameTime();
|
2024-01-21 18:39:51 +01:00
|
|
|
|
2024-01-28 22:14:59 +01:00
|
|
|
/**
|
|
|
|
* @brief Sets the window resizable
|
|
|
|
* @param resizable Whether the window should be resizable
|
|
|
|
*/
|
2024-01-21 18:39:51 +01:00
|
|
|
void setWindowResizable(bool resizable);
|
2024-01-28 22:14:59 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Checks if this window is the main instance of ImHex
|
|
|
|
* @return True if this is the main instance, false if another instance is already running
|
|
|
|
*/
|
|
|
|
bool isMainInstance();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the initial window properties
|
|
|
|
* @return Initial window properties
|
|
|
|
*/
|
|
|
|
std::optional<InitialWindowProperties> getInitialWindowProperties();
|
|
|
|
|
2024-03-12 23:17:49 +01:00
|
|
|
/**
|
|
|
|
* @brief Gets the module handle of libimhex
|
|
|
|
* @return Module handle
|
|
|
|
*/
|
|
|
|
void* getLibImHexModuleHandle();
|
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
}
|
|
|
|
|
2023-07-13 14:08:23 +02:00
|
|
|
/**
|
|
|
|
* @brief Cross-instance messaging system
|
|
|
|
* This allows you to send messages to the "main" instance of ImHex running, from any other instance
|
|
|
|
*/
|
|
|
|
namespace Messaging {
|
|
|
|
|
|
|
|
namespace impl {
|
|
|
|
|
2024-02-10 23:31:05 +01:00
|
|
|
using MessagingHandler = std::function<void(const std::vector<u8> &)>;
|
2023-07-13 14:08:23 +02:00
|
|
|
|
2024-02-10 23:31:05 +01:00
|
|
|
const std::map<std::string, MessagingHandler>& getHandlers();
|
2023-07-13 14:08:23 +02:00
|
|
|
void runHandler(const std::string &eventName, const std::vector<u8> &args);
|
2024-02-10 23:31:05 +01:00
|
|
|
|
2023-07-13 14:08:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Register the handler for this specific event name
|
|
|
|
*/
|
|
|
|
void registerHandler(const std::string &eventName, const impl::MessagingHandler &handler);
|
|
|
|
}
|
|
|
|
|
2023-11-28 01:55:41 +01:00
|
|
|
namespace Fonts {
|
|
|
|
|
|
|
|
struct GlyphRange { u16 begin, end; };
|
|
|
|
struct Offset { float x, y; };
|
|
|
|
|
|
|
|
struct Font {
|
|
|
|
std::string name;
|
|
|
|
std::vector<u8> fontData;
|
|
|
|
std::vector<GlyphRange> glyphRanges;
|
|
|
|
Offset offset;
|
2023-11-28 13:52:26 +01:00
|
|
|
u32 flags;
|
2024-03-21 21:27:50 +01:00
|
|
|
std::optional<u32> defaultSize;
|
2023-11-28 01:55:41 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
namespace impl {
|
|
|
|
|
2024-02-10 23:31:05 +01:00
|
|
|
const std::vector<Font>& getFonts();
|
2023-11-28 01:55:41 +01:00
|
|
|
|
2023-11-29 23:47:37 +01:00
|
|
|
void setCustomFontPath(const std::fs::path &path);
|
|
|
|
void setFontSize(float size);
|
|
|
|
void setFontAtlas(ImFontAtlas *fontAtlas);
|
|
|
|
|
|
|
|
void setFonts(ImFont *bold, ImFont *italic);
|
2023-11-28 01:55:41 +01:00
|
|
|
}
|
|
|
|
|
2023-11-28 13:52:26 +01:00
|
|
|
GlyphRange glyph(const char *glyph);
|
|
|
|
GlyphRange glyph(u32 codepoint);
|
|
|
|
GlyphRange range(const char *glyphBegin, const char *glyphEnd);
|
|
|
|
GlyphRange range(u32 codepointBegin, u32 codepointEnd);
|
|
|
|
|
2024-03-21 21:27:50 +01:00
|
|
|
void loadFont(const std::fs::path &path, const std::vector<GlyphRange> &glyphRanges = {}, Offset offset = {}, u32 flags = 0, std::optional<u32> defaultSize = std::nullopt);
|
|
|
|
void loadFont(const std::string &name, const std::span<const u8> &data, const std::vector<GlyphRange> &glyphRanges = {}, Offset offset = {}, u32 flags = 0, std::optional<u32> defaultSize = std::nullopt);
|
2023-11-28 01:55:41 +01:00
|
|
|
|
2023-11-29 23:47:37 +01:00
|
|
|
constexpr static float DefaultFontSize = 13.0;
|
|
|
|
|
|
|
|
ImFont* Bold();
|
|
|
|
ImFont* Italic();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current custom font path
|
|
|
|
* @return The current custom font path
|
|
|
|
*/
|
2024-02-10 23:31:05 +01:00
|
|
|
const std::filesystem::path& getCustomFontPath();
|
2023-11-29 23:47:37 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current font size
|
|
|
|
* @return The current font size
|
|
|
|
*/
|
|
|
|
float getFontSize();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Gets the current font atlas
|
|
|
|
* @return Current font atlas
|
|
|
|
*/
|
|
|
|
ImFontAtlas* getFontAtlas();
|
|
|
|
|
2023-11-28 01:55:41 +01:00
|
|
|
}
|
|
|
|
|
2022-02-01 18:09:40 +01:00
|
|
|
}
|
2021-01-20 20:16:24 +01:00
|
|
|
|
|
|
|
}
|