In testing future versions of Qt I forgot to compile with `YUZU_USE_QT_WEB_ENGINE`, so with that flag enabled there are two issues that cropped up.
1. yuzu currently uses setRequestInterceptor, added in Qt 5.6, deprecated in 5.13 with this explaination at https://doc.qt.io/qt-5/qwebengineprofile-obsolete.html
Interceptors installed with this method will call QWebEngineUrlRequestInterceptor::interceptRequest on the I/O thread. Therefore the user has to provide thread-safe interaction with the other user classes. For a duration of this call ui thread is blocked. Use setUrlRequestInterceptor instead.
2. QWebEngineSettings::globalSettings() pointer no longer exists in later versions of Qt
From what I can tell, QtNXWebEngineView doesn't need to set these globally,
when we make changes to settings(), QtWebEngineView::page() creates the page
object if it doesn't exist yet. I don't see the page object being destroyed
or otherwise replaced, except via destroying the QtNXWebEngineView object.
The globalSettings() make sense if Pages or Views objects are being
created outside of yuzu's control.
To test this I've compared what BrowseNX and Odyssey's Action guide do in mainline 1049 and this PR.
For now we're going to go up the chain to QWebEngineProfile::defaultProfile()->settings()
Because logging infrastructure initializes before the loading of the
config, it reads the default setting for log_filter and ignores the one
set in config. To change log_filter after logging initialization some
additional calls need to be made.
Currently this just stops all the emulation
This works under assumption that only application will try to use
ExitProcess, with services not touching it
If application exits - it quite makes sense to end the emulation
While this is the primary change, we also:
- Remove the mpsc namespace and rename Queue to MPSCQueue
- Make Slot a private struct within MPSCQueue
- Remove the AlignedAllocator template argument, as we use std::allocator
- Replace instances of mask + 1 with capacity, and mask + 2 with capacity + 1
According to the standard, a narrowing conversion is an implicit conversion from an integer or unscoped enumeration type to an integer type that cannot represent all the values of the original type, except when the value is a literal or constant expression.
MSVC, unlike GCC or Clang, determines this to be a narrowing conversion despite the enumeration exclusively containing values that fit within the range of a 32 bit integer, emitting a warning since designated initializers prohibit narrowing conversions.
To solve this, explicitly cast to the type we are initializing.
This seems to be unsupported in newer libstdc++ versions due to
Flow::Block's base class being a non-literal type. It's not clear to me
why this was permitted in earlier versions.
Removing this as we don't enforce unused parameter warnings elsewhere in the project, and explicitly specify -Wno-unused-parameter in the main CMakeLists.
Now that the entire project is free of variable shadowing, we can enforce this as a compile time error to prevent any further introduction of this logic bug.
GCC/Clang treats variables within lambdas as potentially shadowing those outside the lambda, despite them not being captured inside the lambda's capture list.
This is the "Double-click to add a new folder to the game list" message
that shows up when users first launch yuzu and is most likely never seen
again. Previously this message was not re-translated.
Idea works as follows, while going fullscreen we compare the current window geometry with
available screens and ask for an intersection rectangle, we go fullscreen where most of
the window is located
GuessCurrentScreen could also potentially be used to see which screen
the window is on for dynamic DPI handling
For people not used to the Yuzu UI it's not always clear if the emulated
console is docked or not. The other items update their text when clicked,
this PR brings the DOCK button in line with this.
DOCK -> DOCKED or HANDHELD
Sometimes when yuzu crashes, it restarts with the games list in fullscreen,
which would be fine, except there isn't an easy way to exit this.
It also doesn't occur often enough for qt-config.ini files to be in good supply.
UILayout\geometry value in qt-config.ini is the culprit,
at least for the one provided.
Proposed fix is to simply check isFullScreen when yuzu is starting up,
and take it out of full screen immediately
This does a few things in order to make the default setting Vulkan
workable.
- When yuzu boots, it just opens the Vulkan library.
- If it works, all good and we continue with Vulkan as the default.
- If something breaks, a new file in the config directory will be left
behind (this is deleted normally).
- If Vulkan is not working, has_broken_vulkan is set to true.
- The first time this happens, a warning is displayed to notify the
user.
- This forces use of OpenGL, and Vulkan cannot be selected.
- The Shader Backend selector is made accessible for use in custom
configurations.
- To disable has_broken_vulkan, the user needs to press a button in
Graphics Configuration to manually run the Vulkan device
enumeration.
Two reasons for this:
1. Out of 7 connections, 6 are in ConfigureMotionTouch::ConnectEvents,
this is the outlier.
2. Qt6 doesn't moc the connection properly
There was some discussion about updating to Qt6 and I figured I would
work on some smaller parts. For Windows platform the WinMain function has moved
from the Qt5::WinMain to a new one called Qt6::EntryPointPrivate
Also Qt5 supports versionless CMake targets
https://www.qt.io/blog/versionless-cmake-targets-qt-5.15
These other changes in this commit are to support Qt6, but in ways that don't mess with Qt5.
src/yuzu/bootmanager.cpp: Qt6 complains about not being able to know to use QPoint or QPointF, picking QPoint
src/yuzu/bootmanager.h: Qt6 prefers that QStringList.h be included rather than an empty class definition
src/yuzu/configuration/configure_system.cpp: toULongLong intends to return unsigned 64 bit integer, but
Settings::values.rng_seed is only 32 bits wide
src/yuzu/game_list.cpp: Qt6 returns a different datatype for QStringList.length than Qt5,
it used to be int, but in Qt6 its now qsizetype
src/yuzu/loading_screen.cpp: Qt5's for QStyleOption.init say to switch to initFrom.
The QStyleOption.init doesn't exist in Qt6
src/yuzu/main.cpp: Another QPointer and QStringList.size, lets standardize on size()
Qt5 and Qt6 don't really do a good job of reporting Windows versions past the 2004 version.
Current: Windows 10 Version 2009
This Patch: Windows 10 Version 21H1 (Build 19043.1706)
Also: Windows 11 Version 21H2 (Build 22000.675)
Fixes: #8362
-mwindows doesn't work with Clang. tpoechtrager/wclang resolves this by
just using MinGW-GCC to link the executable, however this prevents us
from using LLVM-exclusive tools when building yuzu.
Solution is to send the linker argument we need from -mwindows directly
to the linker.
From https://gcc-help.gcc.gnu.narkive.com/FogklN5J/gcc-wl-subsystem-windows-mwindows-options
Clang (rightfully) warns that we are checking for the existence of
pointer to something just allocated on the stack, which is always true.
Instead, check whether GetModuleFileNameW failed.
Co-authored-by: Mai M <mathew1800@gmail.com>
A bug occurs in yuzu when VK_KHR_workgroup_memory_explicit_layout is
available but 16-bit integers are not supported in the host driver.
Disable usage of the extension when this case arises.
Recent AMD Vulkan drivers (22.5.2 or 2.0.226 for specifically Vulkan)
have a broken VK_KHR_push_descriptor implementation that causes a crash
in yuzu. Disable it for the time being.
Another request from GillianMC.
The translated strings have been placed in a separate "Hotkeys" context as an alternative
to having to add the tr function to the Config class, or adding them to ConfigureHotkeys
context which is quite long. The English strings get attached to the items in the Action
column as "data", and are used for RetranslateUI and saving the hotkey configuration.
Use auto and a more descriptive variable name.
Secondly, fix some C++ misconceptions or constructing too many objects.
Co-authored-by: Morph <39850852+Morph1984@users.noreply.github.com>
Co-authored-by: Lioncash <mathew1800@gmail.com>
The Icon was renamed in #8283 for Linux builds, and the fix proposed in #8312 would in turn break
the icon for Windows users.
I've decided to fix the aboutdialog.ui file via qtcreator.
I'm not sure its important to have the yuzu icon inside the About dialog grabbed from the local Qt theme,
but I've reword how the code works for that, and we can just delete those lines.
I've also thrown the yuzu.png through pngcrush to remove this warning
libpng warning: iCCP: known incorrect sRGB profile
Credit to abouvier for bringing bug up.
Qt's QString::toStdU16String doesn't work when compiling against the
latest libstdc++, at least when using Clang. This function effectively
does the same thing as the aforementioned one.
Ensures that we're using the fmt version of format_to.
These are also the only three outliers. All of the other formatters we
have are properly qualified.
A ResultRange defines an inclusive range of error descriptions within an error module.
This can be used to check whether the description of a given ResultCode falls within the range.
The conversion function returns a ResultCode with its description set to description_start.
Looks like it was just missed when it was added, as currently the Network Tab only has one item
RetranslateUI is used more commonly throughout the project
The Custom RTC widget is under the influence of the computers System Locale.
The format strings are not necessarily related. As a small example, setting the Windows Language to Dansk, and then trying to use yuzu in English the requested AM/PM indicator is simply not shown
The display format for the Custom RTC field needs to be removed from src/yuzu/configuration/configure_system.ui
modifying the display format needs to be moved to src/yuzu/configuration/configure_system.cpp
This formats all copyright comments according to SPDX formatting guidelines.
Additionally, this resolves the remaining GPLv2 only licensed files by relicensing them to GPLv2.0-or-later.
QObject ends up being its own translation context. But this works in our
favor. GetButtonName and GetDirectionName will share one translation the
directions such as "Left" "Right" and the ConfigureInputPlayer context
will contain translations that show up in the form, in places that aren't
those buttons.
Reported by GillianMC on Discord. Looks to be a small quirk in the QT API.
setText(QObject::tr(status.text));
bringing up QObject breaks the link with the GameListItemCompat
src/core/hle/service/sockets/sfdnsres.cpp: In function 'Service::Sockets::NetDbError Service::Sockets::AddrInfoErrorToNetDbError(s32)':
src/core/hle/service/sockets/sfdnsres.cpp:66:10: error: 'EAI_NODATA' was not declared in this scope; did you mean 'EAI_NONAME'?
66 | case EAI_NODATA:
| ^~~~~~~~~~
| EAI_NONAME
src/core/hle/service/sockets/sfdnsres.cpp: In function 'std::vector<unsigned char> Service::Sockets::SerializeAddrInfo(const addrinfo*, s32, std::string_view)':
src/core/hle/service/sockets/sfdnsres.cpp:127:53: error: 'sockaddr_in' does not name a type; did you mean 'SockAddrIn'?
127 | const auto addr = *reinterpret_cast<sockaddr_in*>(current->ai_addr);
| ^~~~~~~~~~~
| SockAddrIn
src/core/hle/service/sockets/sfdnsres.cpp:127:64: error: expected '>' before '*' token
127 | const auto addr = *reinterpret_cast<sockaddr_in*>(current->ai_addr);
| ^
src/core/hle/service/sockets/sfdnsres.cpp:127:64: error: expected '(' before '*' token
127 | const auto addr = *reinterpret_cast<sockaddr_in*>(current->ai_addr);
| ^
| (
src/core/hle/service/sockets/sfdnsres.cpp:127:65: error: expected primary-expression before '>' token
127 | const auto addr = *reinterpret_cast<sockaddr_in*>(current->ai_addr);
| ^
src/core/hle/service/sockets/sfdnsres.cpp:127:84: error: expected ')' before ';' token
127 | const auto addr = *reinterpret_cast<sockaddr_in*>(current->ai_addr);
| ^
| )
src/core/hle/service/sockets/sfdnsres.cpp:148:53: error: 'sockaddr_in6' does not name a type; did you mean 'SockAddrIn6'?
148 | const auto addr = *reinterpret_cast<sockaddr_in6*>(current->ai_addr);
| ^~~~~~~~~~~~
| SockAddrIn6
src/core/hle/service/sockets/sfdnsres.cpp:148:65: error: expected '>' before '*' token
148 | const auto addr = *reinterpret_cast<sockaddr_in6*>(current->ai_addr);
| ^
src/core/hle/service/sockets/sfdnsres.cpp:148:65: error: expected '(' before '*' token
148 | const auto addr = *reinterpret_cast<sockaddr_in6*>(current->ai_addr);
| ^
| (
src/core/hle/service/sockets/sfdnsres.cpp:148:66: error: expected primary-expression before '>' token
148 | const auto addr = *reinterpret_cast<sockaddr_in6*>(current->ai_addr);
| ^
src/core/hle/service/sockets/sfdnsres.cpp:148:85: error: expected ')' before ';' token
148 | const auto addr = *reinterpret_cast<sockaddr_in6*>(current->ai_addr);
| ^
| )
Long story short, QT doesn't allow the link colors to be set via their stylesheets.
There are two ways to work with this, specify the color manually for every link (See the About dialog) The other way is to change the default palette.
IsDarkTheme is copy/pasted from src/yuzu/debugger/wait_tree.cpp
`return distribution(gen)` is a data race between a read and a write in
two threads, reported by TSan. Remove static random number generators so
they aren't using the same generator.
TSan reported a race between thread 36 and thread 34, a read at :225 and
a write at :225 respectively. Make total_proces_running_time_ticks
atomic to avoid this race.
TSan reports a race between the main thread and T37 during
IsLockedByCurrentThread and when it's set at the end of Lock(),
respectively. Set owner_thread to an atomic pointer to fix it.
Co-authored-by: bunnei <bunneidev@gmail.com>