diff --git a/Thirdparty/ZWidget/src/window/wayland/wayland_display_backend.cpp b/Thirdparty/ZWidget/src/window/wayland/wayland_display_backend.cpp index 642e7bc7..bb20aa4c 100644 --- a/Thirdparty/ZWidget/src/window/wayland/wayland_display_backend.cpp +++ b/Thirdparty/ZWidget/src/window/wayland/wayland_display_backend.cpp @@ -198,6 +198,13 @@ void WaylandDisplayBackend::ConnectDeviceEvents() m_KeyboardSerial = serial; + // Find the window to focus on by checking the surface window owns. + for (auto win: s_Windows) + { + if (win->GetWindowSurface() == surfaceEntered) + m_FocusWindow = win; + } + for (auto key: keysVec) { // keys parameter represents the keys pressed when entering the surface @@ -228,6 +235,13 @@ void WaylandDisplayBackend::ConnectDeviceEvents() }; m_waylandPointer.on_enter() = [this](uint32_t serial, wayland::surface_t surfaceEntered, double surfaceX, double surfaceY) { + // Find the window to focus on by checking the surface window owns. + for (auto win: s_Windows) + { + if (win->GetWindowSurface() == surfaceEntered) + m_FocusWindow = win; + } + OnMouseEnterEvent(serial); }; @@ -341,7 +355,8 @@ void WaylandDisplayBackend::OnMouseEnterEvent(uint32_t serial) void WaylandDisplayBackend::OnMouseLeaveEvent() { - m_FocusWindow->windowHost->OnWindowMouseLeave(); + if (m_FocusWindow) + m_FocusWindow->windowHost->OnWindowMouseLeave(); } void WaylandDisplayBackend::OnMousePressEvent(InputKey button) @@ -356,8 +371,11 @@ void WaylandDisplayBackend::OnMouseReleaseEvent(InputKey button) void WaylandDisplayBackend::OnMouseMoveEvent(Point surfacePos) { - m_FocusWindow->m_SurfaceMousePos = surfacePos / m_FocusWindow->m_ScaleFactor; - m_FocusWindow->windowHost->OnWindowMouseMove(m_FocusWindow->m_SurfaceMousePos); + if (m_FocusWindow) + { + m_FocusWindow->m_SurfaceMousePos = surfacePos / m_FocusWindow->m_ScaleFactor; + m_FocusWindow->windowHost->OnWindowMouseMove(m_FocusWindow->m_SurfaceMousePos); + } } void WaylandDisplayBackend::OnMouseWheelEvent(InputKey button) @@ -390,6 +408,7 @@ std::unique_ptr WaylandDisplayBackend::Create(DisplayWindowHost* void WaylandDisplayBackend::OnWindowCreated(WaylandDisplayWindow* window) { s_Windows.push_back(window); + m_FocusWindow = window; } void WaylandDisplayBackend::OnWindowDestroyed(WaylandDisplayWindow* window) diff --git a/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp b/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp index 2963365d..ba578a26 100644 --- a/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp +++ b/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.cpp @@ -187,7 +187,7 @@ void WaylandDisplayWindow::Activate() void WaylandDisplayWindow::ShowCursor(bool enable) { - ShowCursor(enable); + backend->ShowCursor(enable); } void WaylandDisplayWindow::LockCursor() diff --git a/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.h b/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.h index 90d185c8..4b007206 100644 --- a/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.h +++ b/Thirdparty/ZWidget/src/window/wayland/wayland_display_window.h @@ -125,6 +125,7 @@ class WaylandDisplayWindow : public DisplayWindow Point MapToGlobal(const Point& pos) const override; void* GetNativeHandle() override { return (void*)&m_XDGToplevel; } + wayland::surface_t GetWindowSurface() { return m_AppSurface; } private: // Event handlers as otherwise linking DisplayWindowHost On...() functions with Wayland events directly crashes the app