Compare commits

...

4 Commits

Author SHA1 Message Date
Gonzalosilvalde 07fed96c04
Merge 15ffee7d8d into bf8693a7e8 2025-01-29 20:58:37 -05:00
PCSX2 Bot bf8693a7e8 [ci skip] Qt: Update Base Translation. 2025-01-29 19:07:07 -05:00
Gonzalosilvalde 15ffee7d8d Apply clang-format to MainWindow 2025-01-26 18:10:12 +01:00
Gonzalosilvalde 47ba8a159b Add mouse grab/lock feature when PCSX2 is in focus 2025-01-26 17:20:59 +01:00
5 changed files with 281 additions and 209 deletions

View File

@ -107,6 +107,7 @@ MainWindow::MainWindow()
#if !defined(_WIN32) && !defined(__APPLE__) #if !defined(_WIN32) && !defined(__APPLE__)
s_use_central_widget = DisplayContainer::isRunningOnWayland(); s_use_central_widget = DisplayContainer::isRunningOnWayland();
#endif #endif
createCheckMousePositionTimer();
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -1071,6 +1072,21 @@ bool MainWindow::shouldHideMainWindow() const
QtHost::InNoGUIMode(); 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) bool MainWindow::shouldAbortForMemcardBusy(const VMLock& lock)
{ {
if (MemcardBusy::IsBusy() && !GSDumpReplayer::IsReplayingDump()) if (MemcardBusy::IsBusy() && !GSDumpReplayer::IsReplayingDump())
@ -2541,6 +2557,35 @@ QWidget* MainWindow::getDisplayContainer() const
return (m_display_container ? static_cast<QWidget*>(m_display_container) : static_cast<QWidget*>(m_display_widget)); 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() void MainWindow::saveDisplayWindowGeometryToConfig()
{ {
QWidget* container = getDisplayContainer(); QWidget* container = getDisplayContainer();

View File

@ -128,7 +128,7 @@ private Q_SLOTS:
void mouseModeRequested(bool relative_mode, bool hide_cursor); void mouseModeRequested(bool relative_mode, bool hide_cursor);
void releaseRenderWindow(); void releaseRenderWindow();
void focusDisplayWidget(); void focusDisplayWidget();
void createCheckMousePositionTimer();
void onGameListRefreshComplete(); void onGameListRefreshComplete();
void onGameListRefreshProgress(const QString& status, int current, int total); void onGameListRefreshProgress(const QString& status, int current, int total);
void onGameListSelectionChanged(); void onGameListSelectionChanged();
@ -182,13 +182,14 @@ private Q_SLOTS:
void onInputRecPlayActionTriggered(); void onInputRecPlayActionTriggered();
void onInputRecStopActionTriggered(); void onInputRecStopActionTriggered();
void onInputRecOpenViewer(); void onInputRecOpenViewer();
void onVMStarting(); void onVMStarting();
void onVMStarted(); void onVMStarted();
void onVMPaused(); void onVMPaused();
void onVMResumed(); void onVMResumed();
void onVMStopped(); void onVMStopped();
void checkMousePosition();
void onGameChanged(const QString& title, const QString& elf_override, const QString& disc_path, void onGameChanged(const QString& title, const QString& elf_override, const QString& disc_path,
const QString& serial, quint32 disc_crc, quint32 crc); const QString& serial, quint32 disc_crc, quint32 crc);
@ -206,6 +207,7 @@ protected:
void dropEvent(QDropEvent* event) override; void dropEvent(QDropEvent* event) override;
void moveEvent(QMoveEvent* event) override; void moveEvent(QMoveEvent* event) override;
void resizeEvent(QResizeEvent* event) override; void resizeEvent(QResizeEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
#ifdef _WIN32 #ifdef _WIN32
bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result) override; bool nativeEvent(const QByteArray& eventType, void* message, qintptr* result) override;
@ -240,6 +242,7 @@ private:
bool isRenderingToMain() const; bool isRenderingToMain() const;
bool shouldHideMouseCursor() const; bool shouldHideMouseCursor() const;
bool shouldHideMainWindow() const; bool shouldHideMainWindow() const;
bool shouldMouseGrab() const;
void switchToGameListView(); void switchToGameListView();
void switchToEmulationView(); void switchToEmulationView();
@ -312,6 +315,8 @@ private:
QString m_last_fps_status; QString m_last_fps_status;
QTimer* m_mouse_check_timer = nullptr;
#ifdef _WIN32 #ifdef _WIN32
void* m_device_notification_handle = nullptr; void* m_device_notification_handle = nullptr;
#endif #endif

View File

@ -80,6 +80,8 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsWindow* dialog, QWidget
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.pauseOnControllerDisconnection, "UI", "PauseOnControllerDisconnection", false); SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.pauseOnControllerDisconnection, "UI", "PauseOnControllerDisconnection", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.discordPresence, "EmuCore", "EnableDiscordPresence", 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.startFullscreen, "UI", "StartFullscreen", false);
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.doubleClickTogglesFullscreen, "UI", "DoubleClickTogglesFullscreen", SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.doubleClickTogglesFullscreen, "UI", "DoubleClickTogglesFullscreen",
true); true);
@ -161,6 +163,9 @@ InterfaceSettingsWidget::InterfaceSettingsWidget(SettingsWindow* dialog, QWidget
dialog->registerWidgetHelp( dialog->registerWidgetHelp(
m_ui.discordPresence, tr("Enable Discord Presence"), tr("Unchecked"), m_ui.discordPresence, tr("Enable Discord Presence"), tr("Unchecked"),
tr("Shows the game you are currently playing as part of your profile in Discord.")); 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( dialog->registerWidgetHelp(
m_ui.doubleClickTogglesFullscreen, tr("Double-Click Toggles Fullscreen"), tr("Checked"), 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.")); tr("Allows switching in and out of fullscreen mode by double-clicking the game window."));

View File

@ -50,6 +50,13 @@
</property> </property>
</widget> </widget>
</item> </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"> <item row="1" column="1">
<widget class="QCheckBox" name="pauseOnStart"> <widget class="QCheckBox" name="pauseOnStart">
<property name="text"> <property name="text">

File diff suppressed because it is too large Load Diff