# HG changeset patch # User unc0rr # Date 1515624587 -3600 # Node ID 9c259fb4d40501bae4d533608628b22f2e56547f # Parent 66171ce586cccdcae203c1338097cd886700f597 Pass mouse movements to engine, warp cursor in frontend diff -r 66171ce586cc -r 9c259fb4d405 hedgewars/hwLibrary.pas --- a/hedgewars/hwLibrary.pas Sun Jan 07 09:48:26 2018 +0100 +++ b/hedgewars/hwLibrary.pas Wed Jan 10 23:49:47 2018 +0100 @@ -39,6 +39,7 @@ , uFLIPC , uPhysFSLayer , uFLUICallback + , uCursor ; {$INCLUDE "config.inc"} @@ -64,7 +65,8 @@ ipcRemoveBarrierFromEngineQueue, RunEngine, GameTick, - ResizeWindow + ResizeWindow, + updateMousePosition ; begin diff -r 66171ce586cc -r 9c259fb4d405 hedgewars/uCursor.pas --- a/hedgewars/uCursor.pas Sun Jan 07 09:48:26 2018 +0100 +++ b/hedgewars/uCursor.pas Wed Jan 10 23:49:47 2018 +0100 @@ -4,16 +4,17 @@ procedure init; procedure resetPosition; -procedure updatePosition; procedure handlePositionUpdate(x, y: LongInt); +function updateMousePosition(cx, cy, x, y: LongInt): boolean; cdecl; export; + implementation -uses SDLh, uVariables; +uses SDLh, uVariables, uTypes; procedure init; begin - resetPosition(); + //resetPosition(); end; procedure resetPosition; @@ -24,22 +25,26 @@ // This fixes it, but we might have overlooked a related // bug somewhere else. // No big deal since this function is (so far) only called once. - SDL_WarpMouse((cScreenWidth div 2) + 1, cScreenHeight div 2); - SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2); + //SDL_WarpMouse((cScreenWidth div 2) + 1, cScreenHeight div 2); + //SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2); end; -procedure updatePosition; -var x, y: LongInt; +function updateMousePosition(cx, cy, x, y: LongInt): boolean; cdecl; export; begin - SDL_GetMouseState(@x, @y); + if (GameState <> gsConfirm) + and (GameState <> gsSuspend) + and (GameState <> gsExit) + and (GameState <> gsLandgen) + and (GameState <> gsStart) + and cHasFocus + and (not (CurrentTeam^.ExtDriven and isCursorVisible and (not bShowAmmoMenu) and autoCameraOn)) + and ((x <> cx) or (y <> cy)) then + begin + handlePositionUpdate(x - cx, y - cy); - if(x <> cScreenWidth div 2) or (y <> cScreenHeight div 2) then - begin - handlePositionUpdate(x - cScreenWidth div 2, y - cScreenHeight div 2); - - if cHasFocus then - SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2); - end + updateMousePosition:= true + end else + updateMousePosition:= false end; procedure handlePositionUpdate(x, y: LongInt); diff -r 66171ce586cc -r 9c259fb4d405 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Sun Jan 07 09:48:26 2018 +0100 +++ b/hedgewars/uWorld.pas Wed Jan 10 23:49:47 2018 +0100 @@ -1776,10 +1776,6 @@ var EdgesDist, wdy, shs,z, amNumOffsetX, amNumOffsetY, dstX: LongInt; inbtwnTrgtAttks: Boolean; begin -{$IFNDEF MOBILE} -if (not (CurrentTeam^.ExtDriven and isCursorVisible and (not bShowAmmoMenu) and autoCameraOn)) and cHasFocus and (GameState <> gsConfirm) then - uCursor.updatePosition(); -{$ENDIF} z:= round(200/zoom); inbtwnTrgtAttks := ((GameFlags and gfInfAttack) <> 0) and (CurrentHedgehog <> nil) and ((CurrentHedgehog^.Gear = nil) or (CurrentHedgehog^.Gear <> FollowGear)) and ((Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NeedTarget) <> 0); if autoCameraOn and (not PlacingHogs) and (FollowGear <> nil) and (not isCursorVisible) and (not bShowAmmoMenu) and (not fastUntilLag) and (not inbtwnTrgtAttks) then diff -r 66171ce586cc -r 9c259fb4d405 qmlfrontend/flib.h --- a/qmlfrontend/flib.h Sun Jan 07 09:48:26 2018 +0100 +++ b/qmlfrontend/flib.h Wed Jan 10 23:49:47 2018 +0100 @@ -30,6 +30,7 @@ typedef void ipcToEngineRaw_t(const char* msg, uint32_t len); typedef void ipcSetEngineBarrier_t(); typedef void ipcRemoveBarrierFromEngineQueue_t(); +typedef bool updateMousePosition_t(int32_t centerX, int32_t centerY, int32_t x, int32_t y); typedef void registerUIMessagesCallback_t(void* context, void (*)(void* context, MessageType mt, const char* msg, uint32_t len)); typedef void flibInit_t(const char* localPrefix, const char* userPrefix); diff -r 66171ce586cc -r 9c259fb4d405 qmlfrontend/gameview.cpp --- a/qmlfrontend/gameview.cpp Sun Jan 07 09:48:26 2018 +0100 +++ b/qmlfrontend/gameview.cpp Wed Jan 10 23:49:47 2018 +0100 @@ -1,5 +1,7 @@ #include "gameview.h" +#include +#include #include #include #include @@ -9,6 +11,7 @@ extern "C" { extern GameTick_t* flibGameTick; extern ResizeWindow_t* flibResizeWindow; +extern updateMousePosition_t* flibUpdateMousePosition; } GameView::GameView() @@ -22,8 +25,14 @@ void GameView::tick(quint32 delta) { m_delta = delta; - if (window()) - window()->update(); + + if (window()) { + QTimer* timer = new QTimer(this); + connect(timer, &QTimer::timeout, window(), &QQuickWindow::update); + timer->start(100); + + //window()->update(); + } } void GameView::handleWindowChanged(QQuickWindow* win) @@ -53,8 +62,16 @@ connect(window(), &QQuickWindow::beforeRendering, m_renderer, &GameViewRenderer::paint, Qt::DirectConnection); } - if (m_windowChanged) - m_renderer->setViewportSize(window()->size() * window()->devicePixelRatio()); + if (m_windowChanged) { + QSize windowSize = window()->size(); + m_renderer->setViewportSize(windowSize * window()->devicePixelRatio()); + m_centerX = windowSize.width() / 2; + m_centerY = windowSize.height() / 2; + } + + QPoint mousePos = mapFromGlobal(QCursor::pos()).toPoint(); + if (flibUpdateMousePosition(m_centerX, m_centerY, mousePos.x(), mousePos.y())) + QCursor::setPos(mapToGlobal(QPointF(m_centerX, m_centerY)).toPoint()); m_renderer->tick(m_delta); } diff -r 66171ce586cc -r 9c259fb4d405 qmlfrontend/gameview.h --- a/qmlfrontend/gameview.h Sun Jan 07 09:48:26 2018 +0100 +++ b/qmlfrontend/gameview.h Wed Jan 10 23:49:47 2018 +0100 @@ -47,6 +47,8 @@ quint32 m_delta; GameViewRenderer* m_renderer; bool m_windowChanged; + qint32 m_centerX; + qint32 m_centerY; }; #endif // GAMEVIEW_H diff -r 66171ce586cc -r 9c259fb4d405 qmlfrontend/hwengine.cpp --- a/qmlfrontend/hwengine.cpp Sun Jan 07 09:48:26 2018 +0100 +++ b/qmlfrontend/hwengine.cpp Wed Jan 10 23:49:47 2018 +0100 @@ -13,6 +13,7 @@ RunEngine_t* flibRunEngine; GameTick_t* flibGameTick; ResizeWindow_t* flibResizeWindow; +updateMousePosition_t* flibUpdateMousePosition; ipcToEngineRaw_t* flibIpcToEngineRaw; ipcSetEngineBarrier_t* flibIpcSetEngineBarrier; ipcRemoveBarrierFromEngineQueue_t* flibIpcRemoveBarrierFromEngineQueue; @@ -42,6 +43,7 @@ flibRunEngine = (RunEngine_t*)hwlib.resolve("RunEngine"); flibGameTick = (GameTick_t*)hwlib.resolve("GameTick"); flibResizeWindow = (ResizeWindow_t*)hwlib.resolve("ResizeWindow"); + flibUpdateMousePosition = (updateMousePosition_t*)hwlib.resolve("updateMousePosition"); flibIpcToEngineRaw = (ipcToEngineRaw_t*)hwlib.resolve("ipcToEngineRaw"); flibIpcSetEngineBarrier = (ipcSetEngineBarrier_t*)hwlib.resolve("ipcSetEngineBarrier"); flibIpcRemoveBarrierFromEngineQueue = (ipcRemoveBarrierFromEngineQueue_t*)hwlib.resolve("ipcRemoveBarrierFromEngineQueue");