[Linux] Unify Editor and Game raw mouse event handling
Signed-off-by: Chris Burel <burelc@amazon.com>
This commit is contained in:
@@ -10,6 +10,8 @@
|
||||
|
||||
#ifdef PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
|
||||
#include <AzFramework/XcbEventHandler.h>
|
||||
#include <AzFramework/XcbConnectionManager.h>
|
||||
#include <qpa/qplatformnativeinterface.h>
|
||||
#endif
|
||||
|
||||
namespace Editor
|
||||
@@ -23,16 +25,34 @@ namespace Editor
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
xcb_connection_t* EditorQtApplicationXcb::GetXcbConnectionFromQt()
|
||||
{
|
||||
QPlatformNativeInterface* native = platformNativeInterface();
|
||||
AZ_Warning("EditorQtApplicationXcb", native, "Unable to retrieve the native platform interface");
|
||||
if (!native)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
return reinterpret_cast<xcb_connection_t*>(native->nativeResourceForIntegration(QByteArray("connection")));
|
||||
}
|
||||
|
||||
void EditorQtApplicationXcb::OnStartPlayInEditor()
|
||||
{
|
||||
auto* interface = AzFramework::XcbConnectionManagerInterface::Get();
|
||||
interface->SetEnableXInput(GetXcbConnectionFromQt(), true);
|
||||
}
|
||||
|
||||
void EditorQtApplicationXcb::OnStopPlayInEditor()
|
||||
{
|
||||
auto* interface = AzFramework::XcbConnectionManagerInterface::Get();
|
||||
interface->SetEnableXInput(GetXcbConnectionFromQt(), false);
|
||||
}
|
||||
|
||||
bool EditorQtApplicationXcb::nativeEventFilter([[maybe_unused]] const QByteArray& eventType, void* message, long*)
|
||||
{
|
||||
if (GetIEditor()->IsInGameMode())
|
||||
{
|
||||
#ifdef PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB
|
||||
// We need to handle RAW Input events in a separate loop. This is a workaround to enable XInput2 RAW Inputs using Editor mode.
|
||||
// TODO To have this call here might be not be perfect.
|
||||
AzFramework::XcbEventHandlerBus::Broadcast(&AzFramework::XcbEventHandler::PollSpecialEvents);
|
||||
|
||||
// Now handle the rest of the events.
|
||||
AzFramework::XcbEventHandlerBus::Broadcast(
|
||||
&AzFramework::XcbEventHandler::HandleXcbEvent, static_cast<xcb_generic_event_t*>(message));
|
||||
#endif
|
||||
|
||||
@@ -6,19 +6,35 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <Editor/Core/QtEditorApplication.h>
|
||||
#include <AzToolsFramework/Entity/EditorEntityContextBus.h>
|
||||
#endif
|
||||
|
||||
using xcb_connection_t = struct xcb_connection_t;
|
||||
|
||||
namespace Editor
|
||||
{
|
||||
class EditorQtApplicationXcb : public EditorQtApplication
|
||||
class EditorQtApplicationXcb
|
||||
: public EditorQtApplication
|
||||
, public AzToolsFramework::EditorEntityContextNotificationBus::Handler
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
EditorQtApplicationXcb(int& argc, char** argv)
|
||||
: EditorQtApplication(argc, argv)
|
||||
{
|
||||
// Connect bus to listen for OnStart/StopPlayInEditor events
|
||||
AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
xcb_connection_t* GetXcbConnectionFromQt();
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
// AzToolsFramework::EditorEntityContextNotificationBus overrides
|
||||
void OnStartPlayInEditor() override;
|
||||
void OnStopPlayInEditor() override;
|
||||
|
||||
// QAbstractNativeEventFilter:
|
||||
bool nativeEventFilter(const QByteArray& eventType, void* message, long* result) override;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user