mirror of https://github.com/PCSX2/pcsx2.git
Add mouse grab/lock feature when PCSX2 is in focus
This commit is contained in:
parent
741046079c
commit
47ba8a159b
|
@ -107,6 +107,7 @@ MainWindow::MainWindow()
|
|||
#if !defined(_WIN32) && !defined(__APPLE__)
|
||||
s_use_central_widget = DisplayContainer::isRunningOnWayland();
|
||||
#endif
|
||||
createCheckMousePositionTimer();
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
|
@ -1069,6 +1070,19 @@ bool MainWindow::shouldHideMainWindow() const
|
|||
QtHost::InNoGUIMode();
|
||||
}
|
||||
|
||||
bool MainWindow::shouldMouseGrab() const
|
||||
{
|
||||
if (!s_vm_valid || s_vm_paused) return false;
|
||||
|
||||
if (!Host::GetBoolSettingValue("EmuCore", "EnableMouseGrab", false)) return false;
|
||||
|
||||
bool windowsHidden = (!m_debugger_window || m_debugger_window->isHidden()) &&
|
||||
(!m_controller_settings_window || m_controller_settings_window->isHidden()) &&
|
||||
(!m_settings_window || m_settings_window->isHidden());
|
||||
|
||||
return windowsHidden && (isActiveWindow() || isRenderingFullscreen());
|
||||
}
|
||||
|
||||
bool MainWindow::shouldAbortForMemcardBusy(const VMLock& lock)
|
||||
{
|
||||
if (MemcardBusy::IsBusy() && !GSDumpReplayer::IsReplayingDump())
|
||||
|
@ -2529,6 +2543,32 @@ QWidget* MainWindow::getDisplayContainer() const
|
|||
return (m_display_container ? static_cast<QWidget*>(m_display_container) : static_cast<QWidget*>(m_display_widget));
|
||||
}
|
||||
|
||||
void MainWindow::createCheckMousePositionTimer(){
|
||||
m_mouse_check_timer = new QTimer(this);
|
||||
connect(m_mouse_check_timer, &QTimer::timeout, this, &MainWindow::checkMousePosition);
|
||||
m_mouse_check_timer->start(16);
|
||||
}
|
||||
|
||||
void MainWindow::checkMousePosition() {
|
||||
if (!shouldMouseGrab()) return;
|
||||
|
||||
QPoint globalCursorPos = QCursor::pos();
|
||||
const QRect& windowBounds = isRenderingFullscreen() ? screen()->geometry() : geometry();
|
||||
|
||||
if (windowBounds.contains(globalCursorPos)) return;
|
||||
|
||||
QCursor::setPos(
|
||||
std::clamp(globalCursorPos.x(), windowBounds.left(), windowBounds.right()),
|
||||
std::clamp(globalCursorPos.y(), windowBounds.top(), windowBounds.bottom())
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::mouseMoveEvent(QMouseEvent *event){
|
||||
QWidget::mouseMoveEvent(event);
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::saveDisplayWindowGeometryToConfig()
|
||||
{
|
||||
QWidget* container = getDisplayContainer();
|
||||
|
|
|
@ -60,8 +60,8 @@ public:
|
|||
/// Returns the parent widget, which can be used for any popup dialogs.
|
||||
__fi QWidget* getDialogParent() const { return m_dialog_parent; }
|
||||
|
||||
/// Cancels any pending unpause/fullscreen transition.
|
||||
/// Call when you're going to destroy the VM anyway.
|
||||
/// Cancels any pending unpause/fullscreen transition.
|
||||
/// Call when you're going to destroy the VM anyway.
|
||||
void cancelResume();
|
||||
|
||||
private:
|
||||
|
@ -128,7 +128,7 @@ private Q_SLOTS:
|
|||
void mouseModeRequested(bool relative_mode, bool hide_cursor);
|
||||
void releaseRenderWindow();
|
||||
void focusDisplayWidget();
|
||||
|
||||
void createCheckMousePositionTimer();
|
||||
void onGameListRefreshComplete();
|
||||
void onGameListRefreshProgress(const QString& status, int current, int total);
|
||||
void onGameListSelectionChanged();
|
||||
|
@ -180,13 +180,14 @@ private Q_SLOTS:
|
|||
void onInputRecPlayActionTriggered();
|
||||
void onInputRecStopActionTriggered();
|
||||
void onInputRecOpenViewer();
|
||||
|
||||
void onVMStarting();
|
||||
void onVMStarted();
|
||||
void onVMPaused();
|
||||
void onVMResumed();
|
||||
void onVMStopped();
|
||||
|
||||
void checkMousePosition();
|
||||
|
||||
void onGameChanged(const QString& title, const QString& elf_override, const QString& disc_path,
|
||||
const QString& serial, quint32 disc_crc, quint32 crc);
|
||||
|
||||
|
@ -204,6 +205,7 @@ protected:
|
|||
void dropEvent(QDropEvent* event) override;
|
||||
void moveEvent(QMoveEvent* event) override;
|
||||
void resizeEvent(QResizeEvent* event) override;
|
||||
void mouseMoveEvent(QMouseEvent* event) override;
|
||||
|
||||
#ifdef _WIN32
|
||||
bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result) override;
|
||||
|
@ -238,6 +240,7 @@ private:
|
|||
bool isRenderingToMain() const;
|
||||
bool shouldHideMouseCursor() const;
|
||||
bool shouldHideMainWindow() const;
|
||||
bool shouldMouseGrab() const;
|
||||
void switchToGameListView();
|
||||
void switchToEmulationView();
|
||||
|
||||
|
@ -307,9 +310,11 @@ private:
|
|||
bool m_was_disc_change_request = false;
|
||||
bool m_is_closing = false;
|
||||
bool m_is_temporarily_windowed = false;
|
||||
|
||||
|
||||
QString m_last_fps_status;
|
||||
|
||||
QTimer* m_mouse_check_timer = nullptr;
|
||||
|
||||
#ifdef _WIN32
|
||||
void* m_device_notification_handle = nullptr;
|
||||
#endif
|
||||
|
|
|
@ -80,6 +80,8 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsWindow* dialog, QWidget
|
|||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.pauseOnControllerDisconnection, "UI", "PauseOnControllerDisconnection", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.discordPresence, "EmuCore", "EnableDiscordPresence", false);
|
||||
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.mouseGrab, "EmuCore", "EnableMouseGrab", false);
|
||||
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.startFullscreen, "UI", "StartFullscreen", false);
|
||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.doubleClickTogglesFullscreen, "UI", "DoubleClickTogglesFullscreen",
|
||||
true);
|
||||
|
@ -161,6 +163,9 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsWindow* dialog, QWidget
|
|||
dialog->registerWidgetHelp(
|
||||
m_ui.discordPresence, tr("Enable Discord Presence"), tr("Unchecked"),
|
||||
tr("Shows the game you are currently playing as part of your profile in Discord."));
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.mouseGrab, tr("Enable Mouse Grab"), tr("Unchecked"),
|
||||
tr("Locks the mouse cursor to the windows when PCSX2 is in focus."));
|
||||
dialog->registerWidgetHelp(
|
||||
m_ui.doubleClickTogglesFullscreen, tr("Double-Click Toggles Fullscreen"), tr("Checked"),
|
||||
tr("Allows switching in and out of fullscreen mode by double-clicking the game window."));
|
||||
|
|
|
@ -50,6 +50,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="mouseGrab">
|
||||
<property name="text">
|
||||
<string>Enable Mouse Grab</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="pauseOnStart">
|
||||
<property name="text">
|
||||
|
|
Loading…
Reference in New Issue