mirror of
https://gitlab.com/suyu-emu/suyu.git
synced 2024-03-15 23:15:44 +00:00
Qt: enable recent Linux features on more Unices
- Prevent sleep via xdg-desktop-portal afterfa7abafa5f
- Pause on suspend afterb7642cff36
- Exit on SIGINT/SIGTERM after9479940a1f
- Improve dark themes afterb51db12567
This commit is contained in:
parent
9fc1bcc7b2
commit
d7d7ae8219
|
@ -218,11 +218,11 @@ if(ENABLE_QT)
|
||||||
set(QT_VERSION 5.15)
|
set(QT_VERSION 5.15)
|
||||||
|
|
||||||
# Check for system Qt on Linux, fallback to bundled Qt
|
# Check for system Qt on Linux, fallback to bundled Qt
|
||||||
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
if (UNIX AND NOT APPLE)
|
||||||
if (NOT YUZU_USE_BUNDLED_QT)
|
if (NOT YUZU_USE_BUNDLED_QT)
|
||||||
find_package(Qt5 ${QT_VERSION} COMPONENTS Widgets DBus Multimedia)
|
find_package(Qt5 ${QT_VERSION} COMPONENTS Widgets DBus Multimedia)
|
||||||
endif()
|
endif()
|
||||||
if (NOT Qt5_FOUND OR YUZU_USE_BUNDLED_QT)
|
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND (NOT Qt5_FOUND OR YUZU_USE_BUNDLED_QT))
|
||||||
# Check for dependencies, then enable bundled Qt download
|
# Check for dependencies, then enable bundled Qt download
|
||||||
|
|
||||||
# Check that the system GLIBCXX version is compatible
|
# Check that the system GLIBCXX version is compatible
|
||||||
|
@ -323,7 +323,7 @@ if(ENABLE_QT)
|
||||||
|
|
||||||
set(YUZU_QT_NO_CMAKE_SYSTEM_PATH "NO_CMAKE_SYSTEM_PATH")
|
set(YUZU_QT_NO_CMAKE_SYSTEM_PATH "NO_CMAKE_SYSTEM_PATH")
|
||||||
endif()
|
endif()
|
||||||
if ((${CMAKE_SYSTEM_NAME} STREQUAL "Linux") AND YUZU_USE_BUNDLED_QT)
|
if (UNIX AND NOT APPLE AND YUZU_USE_BUNDLED_QT)
|
||||||
find_package(Qt5 ${QT_VERSION} REQUIRED COMPONENTS Widgets Concurrent Multimedia DBus ${QT_PREFIX_HINT} ${YUZU_QT_NO_CMAKE_SYSTEM_PATH})
|
find_package(Qt5 ${QT_VERSION} REQUIRED COMPONENTS Widgets Concurrent Multimedia DBus ${QT_PREFIX_HINT} ${YUZU_QT_NO_CMAKE_SYSTEM_PATH})
|
||||||
else()
|
else()
|
||||||
find_package(Qt5 ${QT_VERSION} REQUIRED COMPONENTS Widgets Concurrent Multimedia ${QT_PREFIX_HINT} ${YUZU_QT_NO_CMAKE_SYSTEM_PATH})
|
find_package(Qt5 ${QT_VERSION} REQUIRED COMPONENTS Widgets Concurrent Multimedia ${QT_PREFIX_HINT} ${YUZU_QT_NO_CMAKE_SYSTEM_PATH})
|
||||||
|
|
|
@ -315,7 +315,7 @@ target_include_directories(yuzu PRIVATE ../../externals/Vulkan-Headers/include)
|
||||||
if (NOT WIN32)
|
if (NOT WIN32)
|
||||||
target_include_directories(yuzu PRIVATE ${Qt5Gui_PRIVATE_INCLUDE_DIRS})
|
target_include_directories(yuzu PRIVATE ${Qt5Gui_PRIVATE_INCLUDE_DIRS})
|
||||||
endif()
|
endif()
|
||||||
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
if (UNIX AND NOT APPLE)
|
||||||
target_link_libraries(yuzu PRIVATE Qt::DBus)
|
target_link_libraries(yuzu PRIVATE Qt::DBus)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#include <unistd.h> // for chdir
|
#include <unistd.h> // for chdir
|
||||||
#endif
|
#endif
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -275,7 +275,7 @@ static void OverrideWindowsFont() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool GMainWindow::CheckDarkMode() {
|
bool GMainWindow::CheckDarkMode() {
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
const QPalette test_palette(qApp->palette());
|
const QPalette test_palette(qApp->palette());
|
||||||
const QColor text_color = test_palette.color(QPalette::Active, QPalette::Text);
|
const QColor text_color = test_palette.color(QPalette::Active, QPalette::Text);
|
||||||
const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window);
|
const QColor window_color = test_palette.color(QPalette::Active, QPalette::Window);
|
||||||
|
@ -283,7 +283,7 @@ bool GMainWindow::CheckDarkMode() {
|
||||||
#else
|
#else
|
||||||
// TODO: Windows
|
// TODO: Windows
|
||||||
return false;
|
return false;
|
||||||
#endif // __linux__
|
#endif // __unix__
|
||||||
}
|
}
|
||||||
|
|
||||||
GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan)
|
GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan)
|
||||||
|
@ -291,7 +291,7 @@ GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan
|
||||||
input_subsystem{std::make_shared<InputCommon::InputSubsystem>()}, config{std::move(config_)},
|
input_subsystem{std::make_shared<InputCommon::InputSubsystem>()}, config{std::move(config_)},
|
||||||
vfs{std::make_shared<FileSys::RealVfsFilesystem>()},
|
vfs{std::make_shared<FileSys::RealVfsFilesystem>()},
|
||||||
provider{std::make_unique<FileSys::ManualContentProvider>()} {
|
provider{std::make_unique<FileSys::ManualContentProvider>()} {
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
SetupSigInterrupts();
|
SetupSigInterrupts();
|
||||||
#endif
|
#endif
|
||||||
system->Initialize();
|
system->Initialize();
|
||||||
|
@ -509,7 +509,7 @@ GMainWindow::~GMainWindow() {
|
||||||
delete render_window;
|
delete render_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
::close(sig_interrupt_fds[0]);
|
::close(sig_interrupt_fds[0]);
|
||||||
::close(sig_interrupt_fds[1]);
|
::close(sig_interrupt_fds[1]);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1379,7 +1379,7 @@ void GMainWindow::OnDisplayTitleBars(bool show) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::SetupPrepareForSleep() {
|
void GMainWindow::SetupPrepareForSleep() {
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
auto bus = QDBusConnection::systemBus();
|
auto bus = QDBusConnection::systemBus();
|
||||||
if (bus.isConnected()) {
|
if (bus.isConnected()) {
|
||||||
const bool success = bus.connect(
|
const bool success = bus.connect(
|
||||||
|
@ -1393,7 +1393,7 @@ void GMainWindow::SetupPrepareForSleep() {
|
||||||
} else {
|
} else {
|
||||||
LOG_WARNING(Frontend, "QDBusConnection system bus is not connected");
|
LOG_WARNING(Frontend, "QDBusConnection system bus is not connected");
|
||||||
}
|
}
|
||||||
#endif // __linux__
|
#endif // __unix__
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::OnPrepareForSleep(bool prepare_sleep) {
|
void GMainWindow::OnPrepareForSleep(bool prepare_sleep) {
|
||||||
|
@ -1415,7 +1415,7 @@ void GMainWindow::OnPrepareForSleep(bool prepare_sleep) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
static std::optional<QDBusObjectPath> HoldWakeLockLinux(u32 window_id = 0) {
|
static std::optional<QDBusObjectPath> HoldWakeLockLinux(u32 window_id = 0) {
|
||||||
if (!QDBusConnection::sessionBus().isConnected()) {
|
if (!QDBusConnection::sessionBus().isConnected()) {
|
||||||
return {};
|
return {};
|
||||||
|
@ -1500,14 +1500,14 @@ void GMainWindow::OnSigInterruptNotifierActivated() {
|
||||||
|
|
||||||
emit SigInterrupt();
|
emit SigInterrupt();
|
||||||
}
|
}
|
||||||
#endif // __linux__
|
#endif // __unix__
|
||||||
|
|
||||||
void GMainWindow::PreventOSSleep() {
|
void GMainWindow::PreventOSSleep() {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
|
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED);
|
||||||
#elif defined(HAVE_SDL2)
|
#elif defined(HAVE_SDL2)
|
||||||
SDL_DisableScreenSaver();
|
SDL_DisableScreenSaver();
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
auto reply = HoldWakeLockLinux(winId());
|
auto reply = HoldWakeLockLinux(winId());
|
||||||
if (reply) {
|
if (reply) {
|
||||||
wake_lock = std::move(reply.value());
|
wake_lock = std::move(reply.value());
|
||||||
|
@ -1521,7 +1521,7 @@ void GMainWindow::AllowOSSleep() {
|
||||||
SetThreadExecutionState(ES_CONTINUOUS);
|
SetThreadExecutionState(ES_CONTINUOUS);
|
||||||
#elif defined(HAVE_SDL2)
|
#elif defined(HAVE_SDL2)
|
||||||
SDL_EnableScreenSaver();
|
SDL_EnableScreenSaver();
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
if (!wake_lock.path().isEmpty()) {
|
if (!wake_lock.path().isEmpty()) {
|
||||||
ReleaseWakeLockLinux(wake_lock);
|
ReleaseWakeLockLinux(wake_lock);
|
||||||
}
|
}
|
||||||
|
@ -4070,7 +4070,7 @@ void GMainWindow::SetDiscordEnabled([[maybe_unused]] bool state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GMainWindow::changeEvent(QEvent* event) {
|
void GMainWindow::changeEvent(QEvent* event) {
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
// PaletteChange event appears to only reach so far into the GUI, explicitly asking to
|
// PaletteChange event appears to only reach so far into the GUI, explicitly asking to
|
||||||
// UpdateUITheme is a decent work around
|
// UpdateUITheme is a decent work around
|
||||||
if (event->type() == QEvent::PaletteChange) {
|
if (event->type() == QEvent::PaletteChange) {
|
||||||
|
@ -4085,7 +4085,7 @@ void GMainWindow::changeEvent(QEvent* event) {
|
||||||
}
|
}
|
||||||
last_window_color = window_color;
|
last_window_color = window_color;
|
||||||
}
|
}
|
||||||
#endif // __linux__
|
#endif // __unix__
|
||||||
QWidget::changeEvent(event);
|
QWidget::changeEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "yuzu/compatibility_list.h"
|
#include "yuzu/compatibility_list.h"
|
||||||
#include "yuzu/hotkeys.h"
|
#include "yuzu/hotkeys.h"
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
#include <QVariant>
|
#include <QVariant>
|
||||||
#include <QtDBus/QDBusInterface>
|
#include <QtDBus/QDBusInterface>
|
||||||
#include <QtDBus/QtDBus>
|
#include <QtDBus/QtDBus>
|
||||||
|
@ -255,7 +255,7 @@ private:
|
||||||
void changeEvent(QEvent* event) override;
|
void changeEvent(QEvent* event) override;
|
||||||
void closeEvent(QCloseEvent* event) override;
|
void closeEvent(QCloseEvent* event) override;
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
void SetupSigInterrupts();
|
void SetupSigInterrupts();
|
||||||
static void HandleSigInterrupt(int);
|
static void HandleSigInterrupt(int);
|
||||||
void OnSigInterruptNotifierActivated();
|
void OnSigInterruptNotifierActivated();
|
||||||
|
@ -435,7 +435,7 @@ private:
|
||||||
// True if TAS recording dialog is visible
|
// True if TAS recording dialog is visible
|
||||||
bool is_tas_recording_dialog_active{};
|
bool is_tas_recording_dialog_active{};
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __unix__
|
||||||
QSocketNotifier* sig_interrupt_notifier;
|
QSocketNotifier* sig_interrupt_notifier;
|
||||||
static std::array<int, 3> sig_interrupt_fds;
|
static std::array<int, 3> sig_interrupt_fds;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue