diff options
Diffstat (limited to 'src/yuzu')
-rw-r--r-- | src/yuzu/aboutdialog.ui | 2 | ||||
-rw-r--r-- | src/yuzu/bootmanager.cpp | 6 | ||||
-rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 20 | ||||
-rw-r--r-- | src/yuzu/main.cpp | 40 | ||||
-rw-r--r-- | src/yuzu/main.h | 3 |
5 files changed, 67 insertions, 4 deletions
diff --git a/src/yuzu/aboutdialog.ui b/src/yuzu/aboutdialog.ui index 27d81cd13..2f7ddc7f3 100644 --- a/src/yuzu/aboutdialog.ui +++ b/src/yuzu/aboutdialog.ui @@ -87,7 +87,7 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">yuzu is an experimental open-source emulator for the Nintendo Switch licensed under GPLv2.0.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">yuzu is an experimental open-source emulator for the Nintendo Switch licensed under GPLv3.0+.</span></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'MS Shell Dlg 2'; font-size:8pt;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:12pt;">This software should not be used to play games you have not legally obtained.</span></p></body></html></string> </property> diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 27b0300d2..a1b819ae0 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -933,6 +933,12 @@ void GRenderWindow::CaptureScreenshot(const QString& screenshot_path) { auto& renderer = system.Renderer(); const f32 res_scale = Settings::values.resolution_info.up_factor; + if (renderer.IsScreenshotPending()) { + LOG_WARNING(Render, + "A screenshot is already requested or in progress, ignoring the request"); + return; + } + const Layout::FramebufferLayout layout{Layout::FrameLayoutFromResolutionScale(res_scale)}; screenshot_image = QImage(QSize(layout.width, layout.height), QImage::Format_RGB32); renderer.RequestScreenshot( diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 291e37acf..a0f29d147 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -10,6 +10,7 @@ #include <QMenu> #include <QMessageBox> #include <QTimer> +#include "common/assert.h" #include "common/param_package.h" #include "core/hid/emulated_controller.h" #include "core/hid/hid_core.h" @@ -119,6 +120,23 @@ QString GetButtonName(Common::Input::ButtonNames button_name) { } } +QString GetDirectionName(const std::string& direction) { + if (direction == "left") { + return QObject::tr("Left"); + } + if (direction == "right") { + return QObject::tr("Right"); + } + if (direction == "up") { + return QObject::tr("Up"); + } + if (direction == "down") { + return QObject::tr("Down"); + } + UNIMPLEMENTED_MSG("Unimplemented direction name={}", direction); + return QString::fromStdString(direction); +} + void SetAnalogParam(const Common::ParamPackage& input_param, Common::ParamPackage& analog_param, const std::string& button_name) { // The poller returned a complete axis, so set all the buttons @@ -162,7 +180,7 @@ QString ConfigureInputPlayer::ButtonToText(const Common::ParamPackage& param) { if (common_button_name == Common::Input::ButtonNames::Value) { if (param.Has("hat")) { - const QString hat = QString::fromStdString(param.Get("direction", "")); + const QString hat = GetDirectionName(param.Get("direction", "")); return QObject::tr("%1%2Hat %3").arg(toggle, inverted, hat); } if (param.Has("axis")) { diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 52879a989..5e26aad29 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -152,7 +152,8 @@ __declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1; } #endif -constexpr int default_mouse_timeout = 2500; +constexpr int default_mouse_hide_timeout = 2500; +constexpr int default_mouse_center_timeout = 10; /** * "Callouts" are one-time instructional messages shown to the user. In the config settings, there @@ -287,10 +288,13 @@ GMainWindow::GMainWindow() ui->menubar->setCursor(QCursor()); statusBar()->setCursor(QCursor()); - mouse_hide_timer.setInterval(default_mouse_timeout); + mouse_hide_timer.setInterval(default_mouse_hide_timeout); connect(&mouse_hide_timer, &QTimer::timeout, this, &GMainWindow::HideMouseCursor); connect(ui->menubar, &QMenuBar::hovered, this, &GMainWindow::ShowMouseCursor); + mouse_center_timer.setInterval(default_mouse_center_timeout); + connect(&mouse_center_timer, &QTimer::timeout, this, &GMainWindow::CenterMouseCursor); + MigrateConfigFiles(); #if defined(HAVE_SDL2) && !defined(_WIN32) @@ -3301,10 +3305,26 @@ void GMainWindow::ShowMouseCursor() { } } +void GMainWindow::CenterMouseCursor() { + if (emu_thread == nullptr || !Settings::values.mouse_panning) { + mouse_center_timer.stop(); + return; + } + if (!this->isActiveWindow()) { + mouse_center_timer.stop(); + return; + } + const int center_x = render_window->width() / 2; + const int center_y = render_window->height() / 2; + + QCursor::setPos(mapToGlobal({center_x, center_y})); +} + void GMainWindow::OnMouseActivity() { if (!Settings::values.mouse_panning) { ShowMouseCursor(); } + mouse_center_timer.stop(); } void GMainWindow::OnCoreError(Core::SystemResultStatus result, std::string details) { @@ -3577,6 +3597,22 @@ void GMainWindow::dragMoveEvent(QDragMoveEvent* event) { AcceptDropEvent(event); } +void GMainWindow::leaveEvent(QEvent* event) { + if (Settings::values.mouse_panning) { + const QRect& rect = geometry(); + QPoint position = QCursor::pos(); + + qint32 x = qBound(rect.left(), position.x(), rect.right()); + qint32 y = qBound(rect.top(), position.y(), rect.bottom()); + // Only start the timer if the mouse has left the window bound. + // The leave event is also triggered when the window looses focus. + if (x != position.x() || y != position.y()) { + mouse_center_timer.start(); + } + event->accept(); + } +} + bool GMainWindow::ConfirmChangeGame() { if (emu_thread == nullptr) return true; diff --git a/src/yuzu/main.h b/src/yuzu/main.h index ab95a7518..b399e9b01 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -328,6 +328,7 @@ private: void UpdateUISettings(); void HideMouseCursor(); void ShowMouseCursor(); + void CenterMouseCursor(); void OpenURL(const QUrl& url); void LoadTranslation(); void OpenPerGameConfiguration(u64 title_id, const std::string& file_name); @@ -372,6 +373,7 @@ private: bool auto_paused = false; bool auto_muted = false; QTimer mouse_hide_timer; + QTimer mouse_center_timer; // FS std::shared_ptr<FileSys::VfsFilesystem> vfs; @@ -418,4 +420,5 @@ protected: void dropEvent(QDropEvent* event) override; void dragEnterEvent(QDragEnterEvent* event) override; void dragMoveEvent(QDragMoveEvent* event) override; + void leaveEvent(QEvent* event) override; }; |