mirror of
https://github.com/vcmi/vcmi.git
synced 2025-07-15 01:24:45 +02:00
change hardware cursor to software cursor when joystick available
This commit is contained in:
@ -200,13 +200,19 @@ void InputSourceGameController::doCursorMove(int deltaX, int deltaY)
|
|||||||
if(deltaX == 0 && deltaY == 0)
|
if(deltaX == 0 && deltaY == 0)
|
||||||
return;
|
return;
|
||||||
const Point & screenSize = GH.screenDimensions();
|
const Point & screenSize = GH.screenDimensions();
|
||||||
const Point &cursorPosition = GH.getCursorPosition();
|
|
||||||
|
// if joystick is connected when intro video plays, using hardware position will move cursor to the right position.
|
||||||
|
bool isHardwareCursor = CCS && CCS->curh && CCS->curh->getShowType() == Cursor::ShowType::HARDWARE;
|
||||||
|
const Point & cursorPosition = isHardwareCursor ? CCS->curh->getCursorPosition() : GH.getCursorPosition();
|
||||||
int newX = std::min(std::max(cursorPosition.x + deltaX, 0), screenSize.x);
|
int newX = std::min(std::max(cursorPosition.x + deltaX, 0), screenSize.x);
|
||||||
int newY = std::min(std::max(cursorPosition.y + deltaY, 0), screenSize.y);
|
int newY = std::min(std::max(cursorPosition.y + deltaY, 0), screenSize.y);
|
||||||
Point targetPosition{newX, newY};
|
Point targetPosition{newX, newY};
|
||||||
GH.input().setCursorPosition(targetPosition);
|
GH.input().setCursorPosition(targetPosition);
|
||||||
if(CCS && CCS->curh)
|
if(CCS && CCS->curh) {
|
||||||
|
if(CCS->curh->getShowType() == Cursor::ShowType::HARDWARE)
|
||||||
|
CCS->curh->ChangeCursor(Cursor::ShowType::SOFTWARE);
|
||||||
CCS->curh->cursorMove(GH.getCursorPosition().x, GH.getCursorPosition().y);
|
CCS->curh->cursorMove(GH.getCursorPosition().x, GH.getCursorPosition().y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int InputSourceGameController::getMoveDis(float planDis)
|
int InputSourceGameController::getMoveDis(float planDis)
|
||||||
|
@ -57,6 +57,7 @@ CursorHandler::CursorHandler()
|
|||||||
cursor->preload();
|
cursor->preload();
|
||||||
|
|
||||||
set(Cursor::Map::POINTER);
|
set(Cursor::Map::POINTER);
|
||||||
|
showType = dynamic_cast<CursorSoftware *>(cursor.get()) ? Cursor::ShowType::SOFTWARE : Cursor::ShowType::HARDWARE;
|
||||||
}
|
}
|
||||||
|
|
||||||
CursorHandler::~CursorHandler() = default;
|
CursorHandler::~CursorHandler() = default;
|
||||||
@ -290,3 +291,32 @@ void CursorHandler::show()
|
|||||||
cursor->setVisible(true);
|
cursor->setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Cursor::ShowType CursorHandler::getShowType()
|
||||||
|
{
|
||||||
|
return showType;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CursorHandler::ChangeCursor(Cursor::ShowType showType)
|
||||||
|
{
|
||||||
|
if(this->showType == showType)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch(showType)
|
||||||
|
{
|
||||||
|
case Cursor::ShowType::SOFTWARE:
|
||||||
|
cursor.reset(new CursorSoftware());
|
||||||
|
showType = Cursor::ShowType::SOFTWARE;
|
||||||
|
cursor->setImage(getCurrentImage(), getPivotOffset());
|
||||||
|
break;
|
||||||
|
case Cursor::ShowType::HARDWARE:
|
||||||
|
cursor.reset(new CursorHardware());
|
||||||
|
showType = Cursor::ShowType::HARDWARE;
|
||||||
|
cursor->setImage(getCurrentImage(), getPivotOffset());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const Point & CursorHandler::getCursorPosition()
|
||||||
|
{
|
||||||
|
return cursor->getCursorPosition();
|
||||||
|
}
|
||||||
|
@ -25,6 +25,11 @@ namespace Cursor
|
|||||||
SPELLBOOK // animated cursor for spellcasting
|
SPELLBOOK // animated cursor for spellcasting
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class ShowType {
|
||||||
|
SOFTWARE,
|
||||||
|
HARDWARE
|
||||||
|
};
|
||||||
|
|
||||||
enum class Default {
|
enum class Default {
|
||||||
POINTER = 0,
|
POINTER = 0,
|
||||||
//ARROW_COPY = 1, // probably unused
|
//ARROW_COPY = 1, // probably unused
|
||||||
@ -120,6 +125,7 @@ class CursorHandler final
|
|||||||
|
|
||||||
/// Current cursor
|
/// Current cursor
|
||||||
Cursor::Type type;
|
Cursor::Type type;
|
||||||
|
Cursor::ShowType showType;
|
||||||
size_t frame;
|
size_t frame;
|
||||||
float frameTime;
|
float frameTime;
|
||||||
Point pos;
|
Point pos;
|
||||||
@ -179,4 +185,8 @@ public:
|
|||||||
|
|
||||||
/// change cursor's positions to (x, y)
|
/// change cursor's positions to (x, y)
|
||||||
void cursorMove(const int & x, const int & y);
|
void cursorMove(const int & x, const int & y);
|
||||||
|
|
||||||
|
Cursor::ShowType getShowType();
|
||||||
|
void ChangeCursor(Cursor::ShowType showType);
|
||||||
|
const Point & getCursorPosition();
|
||||||
};
|
};
|
||||||
|
@ -24,5 +24,6 @@ public:
|
|||||||
virtual void setCursorPosition( const Point & newPos ) = 0;
|
virtual void setCursorPosition( const Point & newPos ) = 0;
|
||||||
virtual void render() = 0;
|
virtual void render() = 0;
|
||||||
virtual void setVisible( bool on) = 0;
|
virtual void setVisible( bool on) = 0;
|
||||||
|
virtual const Point & getCursorPosition() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -43,4 +43,7 @@ public:
|
|||||||
|
|
||||||
/// Window has focus
|
/// Window has focus
|
||||||
virtual bool hasFocus() = 0;
|
virtual bool hasFocus() = 0;
|
||||||
|
|
||||||
|
/// Get the scale value of screen
|
||||||
|
virtual void getRenderScale(float & scaleX, float & scaleY) = 0;
|
||||||
};
|
};
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "CursorHardware.h"
|
#include "CursorHardware.h"
|
||||||
|
|
||||||
#include "../gui/CGuiHandler.h"
|
#include "../gui/CGuiHandler.h"
|
||||||
|
#include "../renderSDL/ScreenHandler.h"
|
||||||
#include "../render/Colors.h"
|
#include "../render/Colors.h"
|
||||||
#include "../render/IImage.h"
|
#include "../render/IImage.h"
|
||||||
#include "SDL_Extensions.h"
|
#include "SDL_Extensions.h"
|
||||||
@ -66,6 +67,17 @@ void CursorHardware::setImage(std::shared_ptr<IImage> image, const Point & pivot
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Point & CursorHardware::getCursorPosition()
|
||||||
|
{
|
||||||
|
int mouseX, mouseY;
|
||||||
|
SDL_GetMouseState(&mouseX, &mouseY);
|
||||||
|
float scaleX, scaleY;
|
||||||
|
GH.screenHandler().getRenderScale(scaleX, scaleY);
|
||||||
|
pos.x = int(mouseX / scaleX);
|
||||||
|
pos.y = int(mouseY / scaleY);
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
void CursorHardware::setCursorPosition( const Point & newPos )
|
void CursorHardware::setCursorPosition( const Point & newPos )
|
||||||
{
|
{
|
||||||
//no-op
|
//no-op
|
||||||
|
@ -23,6 +23,7 @@ class CursorHardware : public ICursor
|
|||||||
std::shared_ptr<IImage> cursorImage;
|
std::shared_ptr<IImage> cursorImage;
|
||||||
|
|
||||||
SDL_Cursor * cursor;
|
SDL_Cursor * cursor;
|
||||||
|
Point pos;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CursorHardware();
|
CursorHardware();
|
||||||
@ -32,5 +33,6 @@ public:
|
|||||||
void setCursorPosition( const Point & newPos ) override;
|
void setCursorPosition( const Point & newPos ) override;
|
||||||
void render() override;
|
void render() override;
|
||||||
void setVisible( bool on) override;
|
void setVisible( bool on) override;
|
||||||
|
const Point & getCursorPosition() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -81,6 +81,11 @@ void CursorSoftware::setVisible(bool on)
|
|||||||
visible = on;
|
visible = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Point & CursorSoftware::getCursorPosition()
|
||||||
|
{
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
CursorSoftware::CursorSoftware():
|
CursorSoftware::CursorSoftware():
|
||||||
cursorTexture(nullptr),
|
cursorTexture(nullptr),
|
||||||
cursorSurface(nullptr),
|
cursorSurface(nullptr),
|
||||||
|
@ -40,5 +40,6 @@ public:
|
|||||||
void setCursorPosition( const Point & newPos ) override;
|
void setCursorPosition( const Point & newPos ) override;
|
||||||
void render() override;
|
void render() override;
|
||||||
void setVisible( bool on) override;
|
void setVisible( bool on) override;
|
||||||
|
const Point & getCursorPosition() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -583,3 +583,8 @@ bool ScreenHandler::hasFocus()
|
|||||||
ui32 flags = SDL_GetWindowFlags(mainWindow);
|
ui32 flags = SDL_GetWindowFlags(mainWindow);
|
||||||
return flags & SDL_WINDOW_INPUT_FOCUS;
|
return flags & SDL_WINDOW_INPUT_FOCUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScreenHandler::getRenderScale(float & scaleX, float & scaleY)
|
||||||
|
{
|
||||||
|
SDL_RenderGetScale(mainRenderer, &scaleX, &scaleY);
|
||||||
|
}
|
@ -89,6 +89,9 @@ public:
|
|||||||
/// Window has focus
|
/// Window has focus
|
||||||
bool hasFocus() final;
|
bool hasFocus() final;
|
||||||
|
|
||||||
|
/// Get the scale value of screen
|
||||||
|
void getRenderScale(float & scaleX, float & scaleY);
|
||||||
|
|
||||||
std::vector<Point> getSupportedResolutions() const final;
|
std::vector<Point> getSupportedResolutions() const final;
|
||||||
std::vector<Point> getSupportedResolutions(int displayIndex) const;
|
std::vector<Point> getSupportedResolutions(int displayIndex) const;
|
||||||
std::tuple<int, int> getSupportedScalingRange() const final;
|
std::tuple<int, int> getSupportedScalingRange() const final;
|
||||||
|
Reference in New Issue
Block a user