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;  };  | 
