mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-21 09:49:01 +00:00
Qt: Better wayland detection to enforce xcb
In certain cases, the platform can be "wayland-egl", "wayland-xcomposite", and other values for which I haven't found a full list yet. Instead of matching only "wayland", we now look for "wayland" anywhere in the `QT_QPA_PLATFORM` string in a case-insensitive manner. Acknowledgements: `CaseInsensitiveContains`' implementation was heavily inspired by GNU's non-standard glibc `strcasestr` function, which can be found here licensed under GPLv2 or later: https://ftp.gnu.org/gnu/libc/
This commit is contained in:
parent
6ca486ffb2
commit
f8b85edd0c
4 changed files with 51 additions and 2 deletions
|
@ -669,6 +669,22 @@ bool CaseInsensitiveEquals(std::string_view a, std::string_view b)
|
||||||
a, b, [](char ca, char cb) { return Common::ToLower(ca) == Common::ToLower(cb); });
|
a, b, [](char ca, char cb) { return Common::ToLower(ca) == Common::ToLower(cb); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CaseInsensitiveContains(std::string_view haystack, std::string_view needle)
|
||||||
|
{
|
||||||
|
if (needle.empty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (size_t i = 0; i + needle.size() <= haystack.size(); ++i)
|
||||||
|
{
|
||||||
|
if (std::ranges::equal(needle, haystack.substr(i, needle.size()),
|
||||||
|
[](char a, char b) { return Common::ToLower(a) == Common::ToLower(b); }))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool CaseInsensitiveLess::operator()(std::string_view a, std::string_view b) const
|
bool CaseInsensitiveLess::operator()(std::string_view a, std::string_view b) const
|
||||||
{
|
{
|
||||||
return std::ranges::lexicographical_compare(
|
return std::ranges::lexicographical_compare(
|
||||||
|
|
|
@ -311,6 +311,7 @@ std::string GetEscapedHtml(std::string html);
|
||||||
void ToLower(std::string* str);
|
void ToLower(std::string* str);
|
||||||
void ToUpper(std::string* str);
|
void ToUpper(std::string* str);
|
||||||
bool CaseInsensitiveEquals(std::string_view a, std::string_view b);
|
bool CaseInsensitiveEquals(std::string_view a, std::string_view b);
|
||||||
|
bool CaseInsensitiveContains(std::string_view a, std::string_view b);
|
||||||
|
|
||||||
// 'std::less'-like comparison function object type for case-insensitive strings.
|
// 'std::less'-like comparison function object type for case-insensitive strings.
|
||||||
struct CaseInsensitiveLess
|
struct CaseInsensitiveLess
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "Common/Config/Config.h"
|
#include "Common/Config/Config.h"
|
||||||
#include "Common/MsgHandler.h"
|
#include "Common/MsgHandler.h"
|
||||||
#include "Common/ScopeGuard.h"
|
#include "Common/ScopeGuard.h"
|
||||||
|
#include "Common/StringUtil.h"
|
||||||
|
|
||||||
#include "Core/Boot/Boot.h"
|
#include "Core/Boot/Boot.h"
|
||||||
#include "Core/Config/MainSettings.h"
|
#include "Core/Config/MainSettings.h"
|
||||||
|
@ -152,8 +153,8 @@ int main(int argc, char* argv[])
|
||||||
// from happening.
|
// from happening.
|
||||||
// For more information: https://bugs.dolphin-emu.org/issues/11807
|
// For more information: https://bugs.dolphin-emu.org/issues/11807
|
||||||
const char* current_qt_platform = getenv("QT_QPA_PLATFORM");
|
const char* current_qt_platform = getenv("QT_QPA_PLATFORM");
|
||||||
const bool replace_qt_platform =
|
const bool replace_qt_platform = current_qt_platform != nullptr &&
|
||||||
(current_qt_platform && strcasecmp(current_qt_platform, "wayland") == 0);
|
Common::CaseInsensitiveContains(current_qt_platform, "wayland");
|
||||||
setenv("QT_QPA_PLATFORM", "xcb", replace_qt_platform);
|
setenv("QT_QPA_PLATFORM", "xcb", replace_qt_platform);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -225,3 +225,34 @@ TEST(StringUtil, SplitPathWindowsPathWithDriveLetter)
|
||||||
EXPECT_EQ(extension, "");
|
EXPECT_EQ(extension, "");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
TEST(StringUtil, CaseInsensitiveContains_BasicMatches)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("hello world", "hello"));
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("hello world", "world"));
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("HELLO WORLD", "hello"));
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("HeLLo WoRLd", "WORLD"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(StringUtil, CaseInsensitiveContains_SubstringNotFound)
|
||||||
|
{
|
||||||
|
EXPECT_FALSE(Common::CaseInsensitiveContains("hello world", "hey"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(StringUtil, CaseInsensitiveContains_EmptyStrings)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("", ""));
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("hello", ""));
|
||||||
|
EXPECT_FALSE(Common::CaseInsensitiveContains("", "world"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(StringUtil, CaseInsensitiveContains_EntireStringMatch)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("Test", "TEST"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(StringUtil, CaseInsensitiveContains_OverlappingMatches)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("aaaaaa", "aa"));
|
||||||
|
EXPECT_TRUE(Common::CaseInsensitiveContains("ababababa", "bABa"));
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue