feat: 输入隔离——ImGui WantCapture 在 Window 层门控事件与轮询

This commit is contained in:
2026-09-22 19:18:51 +08:00
parent 952ba8135d
commit 601fd8997c
3 changed files with 37 additions and 0 deletions
+15
View File
@@ -33,6 +33,17 @@ namespace Engine {
using EventCallbackFn = std::function<void(const Event&)>;
void SetEventCallback(EventCallbackFn callback) { m_EventCallback = std::move(callback); }
// 输入捕获:返回 true = 该类输入被 UI 占用(如 ImGui 窗口交互)。
// 生效范围:类型化事件回调(Key/Mouse*)+ 轮询接口
//(IsKeyPressed/GetMouseDelta)。窗口类事件(Resize/Close/Focus)不受影响。
// 未设置时全部放行(行为与无 UI 时一致)。
using CaptureFn = std::function<bool()>;
void SetInputCapture(CaptureFn keyboard, CaptureFn mouse)
{
m_KeyboardCapture = std::move(keyboard);
m_MouseCapture = std::move(mouse);
}
vk::SurfaceKHR CreateSurface(vk::Instance instance);
void DestroySurface(vk::Instance instance, vk::SurfaceKHR surface);
@@ -65,6 +76,10 @@ namespace Engine {
bool m_FramebufferResized = false;
EventCallbackFn m_EventCallback;
// UI 输入捕获(ImGui 接管时置位)
CaptureFn m_KeyboardCapture;
CaptureFn m_MouseCapture;
// GLFW 静态回调(通过 window user pointer 找回 this)
static void FramebufferResizeCallback(GLFWwindow* window, int width, int height);
static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);