mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 18:54:14 +01:00 
			
		
		
		
	Merge pull request #10679 from zeltermann/wakelock-reason
Only use SDL wakelock on Linux
This commit is contained in:
		
						commit
						f254ce2c60
					
				| @ -487,6 +487,10 @@ void SDLDriver::CloseJoysticks() { | ||||
| } | ||||
| 
 | ||||
| SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_engine_)) { | ||||
|     // Set our application name. Currently passed to DBus by SDL and visible to the user through
 | ||||
|     // their desktop environment.
 | ||||
|     SDL_SetHint(SDL_HINT_APP_NAME, "yuzu"); | ||||
| 
 | ||||
|     if (!Settings::values.enable_raw_input) { | ||||
|         // Disable raw input. When enabled this setting causes SDL to die when a web applet opens
 | ||||
|         SDL_SetHint(SDL_HINT_JOYSTICK_RAWINPUT, "0"); | ||||
|  | ||||
| @ -447,6 +447,14 @@ GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan | ||||
| 
 | ||||
| #if defined(HAVE_SDL2) && !defined(_WIN32) | ||||
|     SDL_InitSubSystem(SDL_INIT_VIDEO); | ||||
| 
 | ||||
|     // Set a screensaver inhibition reason string. Currently passed to DBus by SDL and visible to
 | ||||
|     // the user through their desktop environment.
 | ||||
|     //: TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the
 | ||||
|     //: computer from sleeping
 | ||||
|     QByteArray wakelock_reason = tr("Running a game").toLatin1(); | ||||
|     SDL_SetHint(SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME, wakelock_reason.data()); | ||||
| 
 | ||||
|     // SDL disables the screen saver by default, and setting the hint
 | ||||
|     // SDL_HINT_VIDEO_ALLOW_SCREENSAVER doesn't seem to work, so we just enable the screen saver
 | ||||
|     // for now.
 | ||||
| @ -1623,45 +1631,6 @@ void GMainWindow::OnPrepareForSleep(bool prepare_sleep) { | ||||
| } | ||||
| 
 | ||||
| #ifdef __unix__ | ||||
| static std::optional<QDBusObjectPath> HoldWakeLockLinux(u32 window_id = 0) { | ||||
|     if (!QDBusConnection::sessionBus().isConnected()) { | ||||
|         return {}; | ||||
|     } | ||||
|     // reference: https://flatpak.github.io/xdg-desktop-portal/#gdbus-org.freedesktop.portal.Inhibit
 | ||||
|     QDBusInterface xdp(QString::fromLatin1("org.freedesktop.portal.Desktop"), | ||||
|                        QString::fromLatin1("/org/freedesktop/portal/desktop"), | ||||
|                        QString::fromLatin1("org.freedesktop.portal.Inhibit")); | ||||
|     if (!xdp.isValid()) { | ||||
|         LOG_WARNING(Frontend, "Couldn't connect to XDP D-Bus endpoint"); | ||||
|         return {}; | ||||
|     } | ||||
|     QVariantMap options = {}; | ||||
|     //: TRANSLATORS: This string is shown to the user to explain why yuzu needs to prevent the
 | ||||
|     //: computer from sleeping
 | ||||
|     options.insert(QString::fromLatin1("reason"), | ||||
|                    QCoreApplication::translate("GMainWindow", "yuzu is running a game")); | ||||
|     // 0x4: Suspend lock; 0x8: Idle lock
 | ||||
|     QDBusReply<QDBusObjectPath> reply = | ||||
|         xdp.call(QString::fromLatin1("Inhibit"), | ||||
|                  QString::fromLatin1("x11:") + QString::number(window_id, 16), 12U, options); | ||||
| 
 | ||||
|     if (reply.isValid()) { | ||||
|         return reply.value(); | ||||
|     } | ||||
|     LOG_WARNING(Frontend, "Couldn't read Inhibit reply from XDP: {}", | ||||
|                 reply.error().message().toStdString()); | ||||
|     return {}; | ||||
| } | ||||
| 
 | ||||
| static void ReleaseWakeLockLinux(QDBusObjectPath lock) { | ||||
|     if (!QDBusConnection::sessionBus().isConnected()) { | ||||
|         return; | ||||
|     } | ||||
|     QDBusInterface unlocker(QString::fromLatin1("org.freedesktop.portal.Desktop"), lock.path(), | ||||
|                             QString::fromLatin1("org.freedesktop.portal.Request")); | ||||
|     unlocker.call(QString::fromLatin1("Close")); | ||||
| } | ||||
| 
 | ||||
| std::array<int, 3> GMainWindow::sig_interrupt_fds{0, 0, 0}; | ||||
| 
 | ||||
| void GMainWindow::SetupSigInterrupts() { | ||||
| @ -1714,12 +1683,6 @@ void GMainWindow::PreventOSSleep() { | ||||
|     SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); | ||||
| #elif defined(HAVE_SDL2) | ||||
|     SDL_DisableScreenSaver(); | ||||
| #ifdef __unix__ | ||||
|     auto reply = HoldWakeLockLinux(winId()); | ||||
|     if (reply) { | ||||
|         wake_lock = std::move(reply.value()); | ||||
|     } | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| @ -1728,11 +1691,6 @@ void GMainWindow::AllowOSSleep() { | ||||
|     SetThreadExecutionState(ES_CONTINUOUS); | ||||
| #elif defined(HAVE_SDL2) | ||||
|     SDL_EnableScreenSaver(); | ||||
| #ifdef __unix__ | ||||
|     if (!wake_lock.path().isEmpty()) { | ||||
|         ReleaseWakeLockLinux(wake_lock); | ||||
|     } | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -504,8 +504,6 @@ private: | ||||
| #ifdef __unix__ | ||||
|     QSocketNotifier* sig_interrupt_notifier; | ||||
|     static std::array<int, 3> sig_interrupt_fds; | ||||
| 
 | ||||
|     QDBusObjectPath wake_lock{}; | ||||
| #endif | ||||
| 
 | ||||
| protected: | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user