[simgui] Add GUI context getter hooks (#8127)

This enables GUI libraries to be linked statically with shared context.
This commit is contained in:
Peter Johnson
2025-07-30 21:29:24 -07:00
committed by GitHub
parent e678a338b4
commit 0478176e47
4 changed files with 52 additions and 0 deletions

View File

@@ -65,6 +65,12 @@ __declspec(dllexport)
reinterpret_cast<void*>((AddGuiEarlyExecuteFn)&AddGuiEarlyExecute));
HAL_RegisterExtension(HALSIMGUI_EXT_GUIEXIT,
reinterpret_cast<void*>((GuiExitFn)&GuiExit));
HAL_RegisterExtension(
HALSIMGUI_EXT_GETGUICONTEXT,
reinterpret_cast<void*>((GetGuiContextFn)&gui::GetCurrentContext));
HAL_RegisterExtension(
HALSIMGUI_EXT_GETGLASSCONTEXT,
reinterpret_cast<void*>((GetGlassContextFn)&glass::GetCurrentContext));
HALSimGui::GlobalInit();
DriverStationGui::GlobalInit();
@@ -158,6 +164,9 @@ __declspec(dllexport)
ImGuiConfigFlags_DockingEnable)) {
return 0;
}
HAL_RegisterExtension(
HALSIMGUI_EXT_GETIMGUICONTEXT,
reinterpret_cast<void*>((GetImguiContextFn)&ImGui::GetCurrentContext));
HAL_RegisterExtensionListener(
nullptr, [](void*, const char* name, void* data) {
if (std::string_view{name} == "ds_socket") {

View File

@@ -6,6 +6,16 @@
#include <functional>
struct ImGuiContext;
namespace glass {
class Context;
} // namespace glass
namespace wpi::gui {
struct Context;
} // namespace wpi::gui
namespace halsimgui {
// These functions can be used to hook into the GUI, and can be accessed
@@ -23,4 +33,13 @@ using AddGuiEarlyExecuteFn = void (*)(std::function<void()> execute);
#define HALSIMGUI_EXT_GUIEXIT "halsimgui::GuiExit"
using GuiExitFn = void (*)();
#define HALSIMGUI_EXT_GETIMGUICONTEXT "halsimgui::GetImguiContext"
using GetImguiContextFn = ImGuiContext* (*)();
#define HALSIMGUI_EXT_GETGUICONTEXT "halsimgui::GetGuiContext"
using GetGuiContextFn = wpi::gui::Context* (*)();
#define HALSIMGUI_EXT_GETGLASSCONTEXT "halsimgui::GetGlassContext"
using GetGlassContextFn = glass::Context* (*)();
} // namespace halsimgui

View File

@@ -169,6 +169,14 @@ void gui::DestroyContext() {
gContext = nullptr;
}
Context* gui::GetCurrentContext() {
return gContext;
}
void gui::SetCurrentContext(Context* context) {
gContext = context;
}
static void UpdateFontScale() {
// Scale based on OS window content scaling
float windowScale = 1.0;

View File

@@ -14,6 +14,8 @@ extern "C" struct GLFWwindow;
namespace wpi::gui {
struct Context;
/**
* Creates GUI context. Must be called prior to calling any other functions.
*/
@@ -24,6 +26,20 @@ void CreateContext();
*/
void DestroyContext();
/**
* Gets GUI context.
*
* @return context
*/
Context* GetCurrentContext();
/**
* Sets GUI context.
*
* @param context context
*/
void SetCurrentContext(Context* context);
/**
* Initializes the GUI.
*