Compare commits

...

13 Commits

Author SHA1 Message Date
chaoticgd
6e4dc1e8ab FileSystem: Don't follow symlinks when recursively deleting directories 2024-12-05 11:52:40 -05:00
chaoticgd
46d17fcb20 FileSystem: Add a test for deleting directories with symlinks 2024-12-05 11:52:40 -05:00
TheLastRar
f91f39afcd DEV9: Fix race-condition while handling closed connection 2024-12-05 11:32:24 -05:00
TheLastRar
f317ba327c DEV9: Correct alignment calculation in Sockets 2024-12-05 11:32:24 -05:00
TheLastRar
00f4cd5252 DEV9: Prevent out of bounds reads in ICMP fix 2024-12-05 11:32:24 -05:00
TheLastRar
0a44e20c34 DEV9: Correct function definitions 2024-12-05 11:32:24 -05:00
TheLastRar
abeb1ca49d DEV9: Skip over invalid gateways 2024-12-05 11:32:24 -05:00
PCSX2 Bot
ee3abe745c [ci skip] Qt: Update Base Translation. 2024-12-03 19:03:20 -05:00
KamFretoZ
a024c25019 Achievements: Fix progression overlay stacking 2024-12-03 17:39:17 +01:00
KamFretoZ
5bf3166832 Qt: Fix Verbose Status Formatting 2024-12-03 17:39:17 +01:00
KamFretoZ
7ef293744a Qt: Move video capture option from Tools to System 2024-12-03 17:39:17 +01:00
TheLastRar
07df874603 DEV9: Avoid iterating over modified vector in UDP_FixedPort 2024-12-03 11:10:31 -05:00
TheLastRar
687c587d19 DEV9: Always bind UDP ports 2024-12-03 11:10:31 -05:00
21 changed files with 743 additions and 582 deletions

View File

@@ -1225,7 +1225,12 @@ bool FileSystem::RecursiveDeleteDirectory(const char* path)
{
for (const FILESYSTEM_FIND_DATA& fd : results)
{
if (fd.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY)
if (IsSymbolicLink(fd.FileName.c_str()))
{
if (!DeleteSymbolicLink(fd.FileName.c_str()))
return false;
}
else if ((fd.Attributes & FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY))
{
if (!RecursiveDeleteDirectory(fd.FileName.c_str()))
return false;
@@ -1650,21 +1655,6 @@ bool FileSystem::DirectoryExists(const char* path)
return false;
}
bool FileSystem::IsRealDirectory(const char* path)
{
// convert to wide string
const std::wstring wpath = GetWin32Path(path);
if (wpath.empty())
return false;
// determine attributes for the path. if it's a directory, things have to be handled differently..
const DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
return false;
return ((fileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT)) != FILE_ATTRIBUTE_DIRECTORY);
}
bool FileSystem::DirectoryIsEmpty(const char* path)
{
std::wstring wpath = GetWin32Path(path);
@@ -1935,6 +1925,52 @@ bool FileSystem::SetPathCompression(const char* path, bool enable)
return result;
}
bool FileSystem::IsSymbolicLink(const char* path)
{
// convert to wide string
const std::wstring wpath = GetWin32Path(path);
if (wpath.empty())
return false;
// determine attributes for the path
const DWORD fileAttributes = GetFileAttributesW(wpath.c_str());
if (fileAttributes == INVALID_FILE_ATTRIBUTES)
return false;
return fileAttributes & FILE_ATTRIBUTE_REPARSE_POINT;
}
bool FileSystem::DeleteSymbolicLink(const char* path, Error* error)
{
// convert to wide string
const std::wstring wpath = GetWin32Path(path);
if (wpath.empty())
{
Error::SetStringView(error, "Invalid path.");
return false;
}
// delete the symbolic link
if (DirectoryExists(path))
{
if (!RemoveDirectoryW(wpath.c_str()))
{
Error::SetWin32(error, "RemoveDirectoryW() failed: ", GetLastError());
return false;
}
}
else
{
if (!DeleteFileW(wpath.c_str()))
{
Error::SetWin32(error, "DeleteFileW() failed: ", GetLastError());
return false;
}
}
return true;
}
#else
// No 32-bit file offsets breaking stuff please.
@@ -2216,15 +2252,6 @@ bool FileSystem::DirectoryExists(const char* path)
return false;
}
bool FileSystem::IsRealDirectory(const char* path)
{
struct stat sysStatData;
if (lstat(path, &sysStatData) < 0)
return false;
return (S_ISDIR(sysStatData.st_mode) && !S_ISLNK(sysStatData.st_mode));
}
bool FileSystem::DirectoryIsEmpty(const char* path)
{
DIR* pDir = opendir(path);
@@ -2478,6 +2505,26 @@ bool FileSystem::SetPathCompression(const char* path, bool enable)
return false;
}
bool FileSystem::IsSymbolicLink(const char* path)
{
struct stat sysStatData;
if (lstat(path, &sysStatData) < 0)
return false;
return S_ISLNK(sysStatData.st_mode);
}
bool FileSystem::DeleteSymbolicLink(const char* path, Error* error)
{
if (unlink(path) != 0)
{
Error::SetErrno(error, "unlink() failed: ", errno);
return false;
}
return true;
}
FileSystem::POSIXLock::POSIXLock(int fd)
{
if (lockf(fd, F_LOCK, 0) == 0)

View File

@@ -84,7 +84,6 @@ namespace FileSystem
/// Directory exists?
bool DirectoryExists(const char* path);
bool IsRealDirectory(const char* path);
/// Directory does not contain any files?
bool DirectoryIsEmpty(const char* path);
@@ -170,6 +169,12 @@ namespace FileSystem
/// Does nothing and returns false on non-Windows platforms.
bool SetPathCompression(const char* path, bool enable);
/// Checks if a file or directory is a symbolic link.
bool IsSymbolicLink(const char* path);
/// Deletes a symbolic link (either a file or directory).
bool DeleteSymbolicLink(const char* path, Error* error = nullptr);
#ifdef _WIN32
// Path limit remover, but also converts to a wide string at the same time.
bool GetWin32Path(std::wstring* dest, std::string_view str);

View File

@@ -27,7 +27,7 @@
</widget>
<widget class="QToolBar" name="toolBar">
<property name="contextMenuPolicy">
<enum>Qt::PreventContextMenu</enum>
<enum>Qt::ContextMenuPolicy::PreventContextMenu</enum>
</property>
<property name="movable">
<bool>false</bool>
@@ -39,7 +39,7 @@
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
<enum>Qt::ToolButtonStyle::ToolButtonTextBesideIcon</enum>
</property>
<property name="floatable">
<bool>false</bool>
@@ -59,8 +59,7 @@
</widget>
<action name="actionRun">
<property name="icon">
<iconset theme="play-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="play-line"/>
</property>
<property name="text">
<string>Run</string>
@@ -68,8 +67,7 @@
</action>
<action name="actionStepInto">
<property name="icon">
<iconset theme="debug-step-into-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="debug-step-into-line"/>
</property>
<property name="text">
<string>Step Into</string>
@@ -80,8 +78,7 @@
</action>
<action name="actionStepOver">
<property name="icon">
<iconset theme="debug-step-over-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="debug-step-over-line"/>
</property>
<property name="text">
<string>Step Over</string>
@@ -92,8 +89,7 @@
</action>
<action name="actionStepOut">
<property name="icon">
<iconset theme="debug-step-out-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="debug-step-out-line"/>
</property>
<property name="text">
<string>Step Out</string>
@@ -107,8 +103,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="pin-filled">
<normaloff>.</normaloff>.</iconset>
<iconset theme="pin-filled"/>
</property>
<property name="text">
<string>Always On Top</string>
@@ -119,8 +114,7 @@
</action>
<action name="actionAnalyse">
<property name="icon">
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="magnifier-line"/>
</property>
<property name="text">
<string>Analyze</string>

View File

@@ -31,7 +31,7 @@
<x>0</x>
<y>0</y>
<width>1050</width>
<height>22</height>
<height>27</height>
</rect>
</property>
<widget class="QMenu" name="menuSystem">
@@ -40,11 +40,10 @@
</property>
<widget class="QMenu" name="menuChangeDisc">
<property name="title">
<string>Change Disc</string>
<string>&amp;Change Disc</string>
</property>
<property name="icon">
<iconset theme="disc-eject-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="disc-eject-line"/>
</property>
<actiongroup name="actionGroupChangeDiscSubImages"/>
<addaction name="actionChangeDiscFromFile"/>
@@ -55,20 +54,18 @@
</widget>
<widget class="QMenu" name="menuLoadState">
<property name="title">
<string>Load State</string>
<string>&amp;Load State</string>
</property>
<property name="icon">
<iconset theme="floppy-out-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="floppy-out-line"/>
</property>
</widget>
<widget class="QMenu" name="menuSaveState">
<property name="title">
<string>Save State</string>
<string>Sa&amp;ve State</string>
</property>
<property name="icon">
<iconset theme="floppy-in-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="floppy-in-line"/>
</property>
</widget>
<addaction name="actionStartFile"/>
@@ -83,6 +80,7 @@
<addaction name="menuChangeDisc"/>
<addaction name="separator"/>
<addaction name="actionScreenshot"/>
<addaction name="actionVideoCapture"/>
<addaction name="separator"/>
<addaction name="menuLoadState"/>
<addaction name="menuSaveState"/>
@@ -92,7 +90,7 @@
</widget>
<widget class="QMenu" name="menuSettings">
<property name="title">
<string>S&amp;ettings</string>
<string>Setti&amp;ngs</string>
</property>
<addaction name="actionViewGameProperties"/>
<addaction name="separator"/>
@@ -132,11 +130,10 @@
</property>
<widget class="QMenu" name="menuDebugSwitchRenderer">
<property name="title">
<string>Switch Renderer</string>
<string>&amp;Switch Renderer</string>
</property>
<property name="icon">
<iconset theme="brush-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="brush-line"/>
</property>
</widget>
<addaction name="menuDebugSwitchRenderer"/>
@@ -158,8 +155,7 @@
<string>&amp;Window Size</string>
</property>
<property name="icon">
<iconset theme="window-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="window-2-line"/>
</property>
</widget>
<addaction name="actionViewToolbar"/>
@@ -185,11 +181,10 @@
</property>
<widget class="QMenu" name="menuInputRecording">
<property name="title">
<string>Input Recording</string>
<string>&amp;Input Recording</string>
</property>
<property name="icon">
<iconset theme="keyboard-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="keyboard-line"/>
</property>
<addaction name="actionInputRecNew"/>
<addaction name="actionInputRecPlay"/>
@@ -202,14 +197,13 @@
</widget>
<addaction name="actionOpenDataDirectory"/>
<addaction name="actionCoverDownloader"/>
<addaction name="actionToggleSoftwareRendering"/>
<addaction name="separator"/>
<addaction name="actionEditCheats"/>
<addaction name="actionEditPatches"/>
<addaction name="actionReloadPatches"/>
<addaction name="separator"/>
<addaction name="actionToggleSoftwareRendering"/>
<addaction name="menuInputRecording"/>
<addaction name="actionVideoCapture"/>
<addaction name="separator"/>
<addaction name="actionEnableSystemConsole"/>
<addaction name="actionEnableDebugConsole"/>
@@ -242,7 +236,7 @@
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
<enum>Qt::ToolButtonStyle::ToolButtonTextUnderIcon</enum>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
@@ -274,8 +268,7 @@
<widget class="QStatusBar" name="statusBar"/>
<action name="actionStartFile">
<property name="icon">
<iconset theme="file-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="file-line"/>
</property>
<property name="text">
<string>Start &amp;File...</string>
@@ -283,8 +276,7 @@
</action>
<action name="actionToolbarStartFile">
<property name="icon">
<iconset theme="file-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="file-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Start File</string>
@@ -292,17 +284,15 @@
</action>
<action name="actionStartDisc">
<property name="icon">
<iconset theme="disc-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="disc-2-line"/>
</property>
<property name="text">
<string>Start &amp;Disc...</string>
<string>Start D&amp;isc...</string>
</property>
</action>
<action name="actionToolbarStartDisc">
<property name="icon">
<iconset theme="disc-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="disc-2-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Start Disc</string>
@@ -310,8 +300,7 @@
</action>
<action name="actionStartBios">
<property name="icon">
<iconset theme="chip-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="chip-line"/>
</property>
<property name="text">
<string>Start &amp;BIOS</string>
@@ -319,8 +308,7 @@
</action>
<action name="actionToolbarStartBios">
<property name="icon">
<iconset theme="chip-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="chip-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Start BIOS</string>
@@ -328,8 +316,7 @@
</action>
<action name="actionScanForNewGames">
<property name="icon">
<iconset theme="file-search-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="file-search-line"/>
</property>
<property name="text">
<string>&amp;Scan For New Games</string>
@@ -337,8 +324,7 @@
</action>
<action name="actionRescanAllGames">
<property name="icon">
<iconset theme="refresh-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="refresh-line"/>
</property>
<property name="text">
<string>&amp;Rescan All Games</string>
@@ -346,8 +332,7 @@
</action>
<action name="actionPowerOff">
<property name="icon">
<iconset theme="shut-down-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="shut-down-line"/>
</property>
<property name="text">
<string>Shut &amp;Down</string>
@@ -355,8 +340,7 @@
</action>
<action name="actionToolbarPowerOff">
<property name="icon">
<iconset theme="shut-down-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="shut-down-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Shut Down</string>
@@ -364,8 +348,7 @@
</action>
<action name="actionPowerOffWithoutSaving">
<property name="icon">
<iconset theme="close-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="close-line"/>
</property>
<property name="text">
<string>Shut Down &amp;Without Saving</string>
@@ -373,8 +356,7 @@
</action>
<action name="actionReset">
<property name="icon">
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="restart-line"/>
</property>
<property name="text">
<string>&amp;Reset</string>
@@ -382,8 +364,7 @@
</action>
<action name="actionToolbarReset">
<property name="icon">
<iconset theme="restart-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="restart-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Reset</string>
@@ -394,8 +375,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="pause-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="pause-line"/>
</property>
<property name="text">
<string>&amp;Pause</string>
@@ -406,8 +386,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="pause-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="pause-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Pause</string>
@@ -415,8 +394,7 @@
</action>
<action name="actionToolbarLoadState">
<property name="icon">
<iconset theme="floppy-out-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="floppy-out-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Load State</string>
@@ -424,8 +402,7 @@
</action>
<action name="actionToolbarSaveState">
<property name="icon">
<iconset theme="floppy-in-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="floppy-in-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Save State</string>
@@ -433,8 +410,7 @@
</action>
<action name="actionExit">
<property name="icon">
<iconset theme="door-open-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="door-open-line"/>
</property>
<property name="text">
<string>E&amp;xit</string>
@@ -442,8 +418,7 @@
</action>
<action name="actionBIOSSettings">
<property name="icon">
<iconset theme="chip-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="chip-line"/>
</property>
<property name="text">
<string>&amp;BIOS</string>
@@ -451,17 +426,15 @@
</action>
<action name="actionEmulationSettings">
<property name="icon">
<iconset theme="emulation-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="emulation-line"/>
</property>
<property name="text">
<string>Emulation</string>
<string>&amp;Emulation</string>
</property>
</action>
<action name="actionControllerSettings">
<property name="icon">
<iconset theme="controller-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="controller-line"/>
</property>
<property name="text">
<string>&amp;Controllers</string>
@@ -469,8 +442,7 @@
</action>
<action name="actionToolbarControllerSettings">
<property name="icon">
<iconset theme="controller-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="controller-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Controllers</string>
@@ -478,8 +450,7 @@
</action>
<action name="actionHotkeySettings">
<property name="icon">
<iconset theme="keyboard-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="keyboard-line"/>
</property>
<property name="text">
<string>&amp;Hotkeys</string>
@@ -487,8 +458,7 @@
</action>
<action name="actionGraphicsSettings">
<property name="icon">
<iconset theme="image-fill">
<normaloff>.</normaloff>.</iconset>
<iconset theme="image-fill"/>
</property>
<property name="text">
<string>&amp;Graphics</string>
@@ -496,11 +466,10 @@
</action>
<action name="actionAchievementSettings">
<property name="icon">
<iconset theme="trophy-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="trophy-line"/>
</property>
<property name="text">
<string>A&amp;chievements</string>
<string>Achie&amp;vements</string>
</property>
</action>
<action name="actionPostProcessingSettings">
@@ -510,17 +479,15 @@
</action>
<action name="actionFullscreen">
<property name="icon">
<iconset theme="fullscreen-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="fullscreen-line"/>
</property>
<property name="text">
<string>Fullscreen</string>
<string>&amp;Fullscreen</string>
</property>
</action>
<action name="actionToolbarFullscreen">
<property name="icon">
<iconset theme="fullscreen-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="fullscreen-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Fullscreen</string>
@@ -533,8 +500,7 @@
</action>
<action name="actionGitHubRepository">
<property name="icon">
<iconset theme="github">
<normaloff>.</normaloff>.</iconset>
<iconset theme="github"/>
</property>
<property name="text">
<string>&amp;GitHub Repository...</string>
@@ -542,8 +508,7 @@
</action>
<action name="actionSupportForums">
<property name="icon">
<iconset theme="at">
<normaloff>.</normaloff>.</iconset>
<iconset theme="at"/>
</property>
<property name="text">
<string>Support &amp;Forums...</string>
@@ -551,8 +516,7 @@
</action>
<action name="actionDiscordServer">
<property name="icon">
<iconset theme="discord">
<normaloff>.</normaloff>.</iconset>
<iconset theme="discord"/>
</property>
<property name="text">
<string>&amp;Discord Server...</string>
@@ -560,8 +524,7 @@
</action>
<action name="actionCheckForUpdates">
<property name="icon">
<iconset theme="download-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="download-2-line"/>
</property>
<property name="text">
<string>Check for &amp;Updates...</string>
@@ -587,8 +550,7 @@
</action>
<action name="actionToolbarChangeDisc">
<property name="icon">
<iconset theme="disc-eject-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="disc-eject-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Change Disc...</string>
@@ -596,8 +558,7 @@
</action>
<action name="actionAudioSettings">
<property name="icon">
<iconset theme="volume-up-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="volume-up-line"/>
</property>
<property name="text">
<string>&amp;Audio</string>
@@ -605,73 +566,68 @@
</action>
<action name="actionGameListSettings">
<property name="icon">
<iconset theme="folder-open-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="folder-open-line"/>
</property>
<property name="text">
<string>Game List</string>
<string>Game &amp;List</string>
</property>
</action>
<action name="actionInterfaceSettings">
<property name="icon">
<iconset theme="interface-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="interface-line"/>
</property>
<property name="text">
<string>Interface</string>
<string>&amp;Interface</string>
</property>
</action>
<action name="actionAddGameDirectory">
<property name="icon">
<iconset theme="folder-add-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="folder-add-line"/>
</property>
<property name="text">
<string>Add Game Directory...</string>
<string>Add Game &amp;Directory...</string>
</property>
</action>
<action name="actionSettings">
<property name="icon">
<iconset theme="settings-3-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="settings-3-line"/>
</property>
<property name="text">
<string>&amp;Settings</string>
<string>S&amp;ettings</string>
</property>
<property name="menuRole">
<enum>QAction::PreferencesRole</enum>
<enum>QAction::MenuRole::PreferencesRole</enum>
</property>
</action>
<action name="actionToolbarSettings">
<property name="icon">
<iconset theme="settings-3-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="settings-3-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Settings</string>
</property>
<property name="menuRole">
<enum>QAction::PreferencesRole</enum>
<enum>QAction::MenuRole::PreferencesRole</enum>
</property>
</action>
<action name="actionChangeDiscFromFile">
<property name="text">
<string>From File...</string>
<string>&amp;From File...</string>
</property>
</action>
<action name="actionChangeDiscFromDevice">
<property name="text">
<string>From Device...</string>
<string>From &amp;Device...</string>
</property>
</action>
<action name="actionChangeDiscFromGameList">
<property name="text">
<string>From Game List...</string>
<string>From &amp;Game List...</string>
</property>
</action>
<action name="actionRemoveDisc">
<property name="text">
<string>Remove Disc</string>
<string>&amp;Remove Disc</string>
</property>
</action>
<action name="actionGlobal_State">
@@ -681,8 +637,7 @@
</action>
<action name="actionScreenshot">
<property name="icon">
<iconset theme="screenshot-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="screenshot-2-line"/>
</property>
<property name="text">
<string>&amp;Screenshot</string>
@@ -690,8 +645,7 @@
</action>
<action name="actionToolbarScreenshot">
<property name="icon">
<iconset theme="screenshot-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="screenshot-2-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Screenshot</string>
@@ -699,8 +653,7 @@
</action>
<action name="actionMemoryCardSettings">
<property name="icon">
<iconset theme="memcard-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="memcard-line"/>
</property>
<property name="text">
<string>&amp;Memory Cards</string>
@@ -708,8 +661,7 @@
</action>
<action name="actionDEV9Settings">
<property name="icon">
<iconset theme="global-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="global-line"/>
</property>
<property name="text">
<string>&amp;Network &amp;&amp; HDD</string>
@@ -717,8 +669,7 @@
</action>
<action name="actionFolderSettings">
<property name="icon">
<iconset theme="folder-settings-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="folder-settings-line"/>
</property>
<property name="text">
<string>&amp;Folders</string>
@@ -743,7 +694,7 @@
<bool>false</bool>
</property>
<property name="text">
<string>Lock Toolbar</string>
<string>Loc&amp;k Toolbar</string>
</property>
</action>
<action name="actionViewStatusBar">
@@ -765,13 +716,12 @@
<bool>true</bool>
</property>
<property name="text">
<string>Verbose Status</string>
<string>&amp;Verbose Status</string>
</property>
</action>
<action name="actionViewGameList">
<property name="icon">
<iconset theme="list-check">
<normaloff>.</normaloff>.</iconset>
<iconset theme="list-check"/>
</property>
<property name="text">
<string>Game &amp;List</string>
@@ -782,8 +732,7 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset theme="tv-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="tv-2-line"/>
</property>
<property name="text">
<string extracomment="This grayed-out at first option will become available while there is a game emulated and the game list is displayed over the actual emulation, to let users display the system emulation once more.">System &amp;Display</string>
@@ -794,8 +743,7 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset theme="file-settings-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="file-settings-line"/>
</property>
<property name="text">
<string>Game &amp;Properties</string>
@@ -803,8 +751,7 @@
</action>
<action name="actionViewGameGrid">
<property name="icon">
<iconset theme="function-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="function-line"/>
</property>
<property name="text">
<string>Game &amp;Grid</string>
@@ -817,14 +764,16 @@
<property name="checked">
<bool>true</bool>
</property>
<property name="icon">
<iconset theme="price-tag-3-line"/>
</property>
<property name="text">
<string>Show Titles (Grid View)</string>
<string>Show Titl&amp;es (Grid View)</string>
</property>
</action>
<action name="actionGridViewZoomIn">
<property name="icon">
<iconset theme="zoom-in-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="zoom-in-line"/>
</property>
<property name="text">
<string>Zoom &amp;In (Grid View)</string>
@@ -835,8 +784,7 @@
</action>
<action name="actionGridViewZoomOut">
<property name="icon">
<iconset theme="zoom-out-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="zoom-out-line"/>
</property>
<property name="text">
<string>Zoom &amp;Out (Grid View)</string>
@@ -847,8 +795,7 @@
</action>
<action name="actionGridViewRefreshCovers">
<property name="icon">
<iconset theme="refresh-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="refresh-line"/>
</property>
<property name="text">
<string>Refresh &amp;Covers (Grid View)</string>
@@ -856,8 +803,7 @@
</action>
<action name="actionOpen_Memory_Card_Directory">
<property name="icon">
<iconset theme="memcard-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="memcard-line"/>
</property>
<property name="text">
<string>Open Memory Card Directory...</string>
@@ -865,38 +811,34 @@
</action>
<action name="actionOpenDataDirectory">
<property name="icon">
<iconset theme="folder-open-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="folder-open-line"/>
</property>
<property name="text">
<string>Open Data Directory...</string>
<string>&amp;Open Data Directory...</string>
</property>
</action>
<action name="actionToggleSoftwareRendering">
<property name="icon">
<iconset theme="brush-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="brush-line"/>
</property>
<property name="text">
<string>Toggle Software Rendering</string>
<string>&amp;Toggle Software Rendering</string>
</property>
</action>
<action name="actionDebugger">
<property name="icon">
<iconset theme="heart-circle-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="heart-circle-line"/>
</property>
<property name="text">
<string>Open Debugger</string>
<string>&amp;Open Debugger</string>
</property>
</action>
<action name="actionReloadPatches">
<property name="icon">
<iconset theme="refresh-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="refresh-line"/>
</property>
<property name="text">
<string>Reload Cheats/Patches</string>
<string>&amp;Reload Cheats/Patches</string>
</property>
</action>
<action name="actionEnableSystemConsole">
@@ -904,7 +846,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable System Console</string>
<string>E&amp;nable System Console</string>
</property>
</action>
<action name="actionEnableDebugConsole">
@@ -912,7 +854,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable Debug Console</string>
<string>Enable &amp;Debug Console</string>
</property>
</action>
<action name="actionEnableLogWindow">
@@ -920,7 +862,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable Log Window</string>
<string>Enable &amp;Log Window</string>
</property>
</action>
<action name="actionEnableVerboseLogging">
@@ -928,7 +870,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable Verbose Logging</string>
<string>Enable &amp;Verbose Logging</string>
</property>
</action>
<action name="actionEnableEEConsoleLogging">
@@ -936,7 +878,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable EE Console Logging</string>
<string>Enable EE Console &amp;Logging</string>
</property>
</action>
<action name="actionEnableIOPConsoleLogging">
@@ -944,16 +886,15 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable IOP Console Logging</string>
<string>Enable &amp;IOP Console Logging</string>
</property>
</action>
<action name="actionSaveGSDump">
<property name="icon">
<iconset theme="save-3-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="save-3-line"/>
</property>
<property name="text">
<string>Save Single Frame GS Dump</string>
<string>Save Single Frame &amp;GS Dump</string>
</property>
</action>
<action name="actionInputRecNew">
@@ -961,7 +902,7 @@
<bool>false</bool>
</property>
<property name="text">
<string extracomment="This section refers to the Input Recording submenu.">New</string>
<string extracomment="This section refers to the Input Recording submenu.">&amp;New</string>
</property>
</action>
<action name="actionInputRecPlay">
@@ -969,7 +910,7 @@
<bool>false</bool>
</property>
<property name="text">
<string extracomment="This section refers to the Input Recording submenu.">Play</string>
<string extracomment="This section refers to the Input Recording submenu.">&amp;Play</string>
</property>
</action>
<action name="actionInputRecStop">
@@ -977,7 +918,7 @@
<bool>false</bool>
</property>
<property name="text">
<string extracomment="This section refers to the Input Recording submenu.">Stop</string>
<string extracomment="This section refers to the Input Recording submenu.">&amp;Stop</string>
</property>
</action>
<action name="actionRecording_Console_Logs">
@@ -990,7 +931,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Controller Logs</string>
<string>&amp;Controller Logs</string>
</property>
</action>
<action name="actionInputRecConsoleLogs">
@@ -998,7 +939,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Input Recording Logs</string>
<string>&amp;Input Recording Logs</string>
</property>
</action>
<action name="actionEnableFileLogging">
@@ -1014,7 +955,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable CDVD Read Logging</string>
<string>Enable &amp;CDVD Read Logging</string>
</property>
</action>
<action name="actionSaveBlockDump">
@@ -1022,7 +963,7 @@
<bool>true</bool>
</property>
<property name="text">
<string>Save CDVD Block Dump</string>
<string>Save CDVD &amp;Block Dump</string>
</property>
</action>
<action name="actionEnableLogTimestamps">
@@ -1030,22 +971,20 @@
<bool>true</bool>
</property>
<property name="text">
<string>Enable Log Timestamps</string>
<string>&amp;Enable Log Timestamps</string>
</property>
</action>
<action name="actionStartFullscreenUI">
<property name="icon">
<iconset theme="tv-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="tv-2-line"/>
</property>
<property name="text">
<string>Start Big Picture Mode</string>
<string>Start Big Picture &amp;Mode</string>
</property>
</action>
<action name="actionToolbarStartFullscreenUI">
<property name="icon">
<iconset theme="tv-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="tv-2-line"/>
</property>
<property name="text">
<string comment="In Toolbar">Big Picture</string>
@@ -1053,11 +992,10 @@
</action>
<action name="actionCoverDownloader">
<property name="icon">
<iconset theme="artboard-2-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="artboard-2-line"/>
</property>
<property name="text">
<string>Cover Downloader...</string>
<string>&amp;Cover Downloader...</string>
</property>
</action>
<action name="actionShowAdvancedSettings">
@@ -1065,42 +1003,39 @@
<bool>true</bool>
</property>
<property name="text">
<string>Show Advanced Settings</string>
<string>&amp;Show Advanced Settings</string>
</property>
</action>
<action name="actionInputRecOpenViewer">
<property name="text">
<string>Recording Viewer</string>
<string>&amp;Recording Viewer</string>
</property>
</action>
<action name="actionVideoCapture">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Video Capture</string>
</property>
<property name="icon">
<iconset theme="camera-video">
<normaloff>.</normaloff>.</iconset>
<iconset theme="camera-video"/>
</property>
<property name="text">
<string>&amp;Video Capture</string>
</property>
</action>
<action name="actionEditCheats">
<property name="text">
<string>Edit Cheats...</string>
</property>
<property name="icon">
<iconset theme="pencil-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="pencil-line"/>
</property>
<property name="text">
<string>&amp;Edit Cheats...</string>
</property>
</action>
<action name="actionEditPatches">
<property name="text">
<string>Edit Patches...</string>
</property>
<property name="icon">
<iconset theme="pencil-line">
<normaloff>.</normaloff>.</iconset>
<iconset theme="pencil-line"/>
</property>
<property name="text">
<string>Edit &amp;Patches...</string>
</property>
</action>
</widget>

View File

@@ -998,7 +998,7 @@ void EmuThread::updatePerformanceMetrics(bool force)
QString gs_stat;
if (THREAD_VU1)
{
gs_stat = tr("Slot: %1 | Volume: %2% | %3 |EE: %4% | VU: %5% | GS: %6%")
gs_stat = tr("Slot: %1 | Volume: %2% | %3 | EE: %4% | VU: %5% | GS: %6%")
.arg(SaveStateSelectorUI::GetCurrentSlot())
.arg(SPU2::GetOutputVolume())
.arg(gs_stat_str.c_str())

View File

@@ -4792,53 +4792,53 @@ Do you want to overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="66"/>
<location filename="../Debugger/DebuggerWindow.ui" line="65"/>
<location filename="../Debugger/DebuggerWindow.cpp" line="76"/>
<source>Run</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="75"/>
<location filename="../Debugger/DebuggerWindow.ui" line="73"/>
<source>Step Into</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="78"/>
<location filename="../Debugger/DebuggerWindow.ui" line="76"/>
<source>F11</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="87"/>
<location filename="../Debugger/DebuggerWindow.ui" line="84"/>
<source>Step Over</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="90"/>
<location filename="../Debugger/DebuggerWindow.ui" line="87"/>
<source>F10</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="99"/>
<location filename="../Debugger/DebuggerWindow.ui" line="95"/>
<source>Step Out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="102"/>
<location filename="../Debugger/DebuggerWindow.ui" line="98"/>
<source>Shift+F11</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="114"/>
<location filename="../Debugger/DebuggerWindow.ui" line="109"/>
<source>Always On Top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="117"/>
<location filename="../Debugger/DebuggerWindow.ui" line="112"/>
<source>Show this window on top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="126"/>
<location filename="../Debugger/DebuggerWindow.ui" line="120"/>
<source>Analyze</source>
<translation type="unfinished"></translation>
</message>
@@ -5036,7 +5036,7 @@ Do you want to overwrite?</source>
<name>EmuThread</name>
<message>
<location filename="../QtHost.cpp" line="1001"/>
<source>Slot: %1 | Volume: %2% | %3 |EE: %4% | VU: %5% | GS: %6%</source>
<source>Slot: %1 | Volume: %2% | %3 | EE: %4% | VU: %5% | GS: %6%</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -15422,566 +15422,586 @@ Right click to clear binding</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="43"/>
<location filename="../MainWindow.cpp" line="1406"/>
<location filename="../MainWindow.cpp" line="1467"/>
<source>Change Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="58"/>
<location filename="../MainWindow.cpp" line="2785"/>
<source>Load State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="67"/>
<source>Save State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="95"/>
<location filename="../MainWindow.ui" line="596"/>
<source>S&amp;ettings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="118"/>
<location filename="../MainWindow.ui" line="116"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="131"/>
<location filename="../MainWindow.ui" line="129"/>
<source>&amp;Debug</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="135"/>
<source>Switch Renderer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="154"/>
<location filename="../MainWindow.ui" line="151"/>
<source>&amp;View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="158"/>
<location filename="../MainWindow.ui" line="155"/>
<source>&amp;Window Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="184"/>
<location filename="../MainWindow.ui" line="180"/>
<source>&amp;Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="188"/>
<source>Input Recording</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="236"/>
<location filename="../MainWindow.ui" line="230"/>
<source>Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="281"/>
<location filename="../MainWindow.ui" line="274"/>
<source>Start &amp;File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="299"/>
<source>Start &amp;Disc...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="317"/>
<location filename="../MainWindow.ui" line="306"/>
<source>Start &amp;BIOS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="335"/>
<location filename="../MainWindow.ui" line="322"/>
<source>&amp;Scan For New Games</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="344"/>
<location filename="../MainWindow.ui" line="330"/>
<source>&amp;Rescan All Games</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="353"/>
<location filename="../MainWindow.ui" line="338"/>
<source>Shut &amp;Down</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="371"/>
<location filename="../MainWindow.ui" line="354"/>
<source>Shut Down &amp;Without Saving</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="380"/>
<location filename="../MainWindow.ui" line="362"/>
<source>&amp;Reset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="401"/>
<location filename="../MainWindow.ui" line="381"/>
<source>&amp;Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="440"/>
<location filename="../MainWindow.ui" line="416"/>
<source>E&amp;xit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="449"/>
<location filename="../MainWindow.ui" line="424"/>
<source>&amp;BIOS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="458"/>
<source>Emulation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="467"/>
<location filename="../MainWindow.ui" line="440"/>
<source>&amp;Controllers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="485"/>
<location filename="../MainWindow.ui" line="456"/>
<source>&amp;Hotkeys</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="494"/>
<location filename="../MainWindow.ui" line="464"/>
<source>&amp;Graphics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="503"/>
<source>A&amp;chievements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="508"/>
<location filename="../MainWindow.ui" line="477"/>
<source>&amp;Post-Processing Settings...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="517"/>
<source>Fullscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="531"/>
<location filename="../MainWindow.ui" line="498"/>
<source>Resolution Scale</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="540"/>
<location filename="../MainWindow.ui" line="506"/>
<source>&amp;GitHub Repository...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="549"/>
<location filename="../MainWindow.ui" line="514"/>
<source>Support &amp;Forums...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="558"/>
<location filename="../MainWindow.ui" line="522"/>
<source>&amp;Discord Server...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="567"/>
<location filename="../MainWindow.ui" line="530"/>
<source>Check for &amp;Updates...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="576"/>
<location filename="../MainWindow.ui" line="539"/>
<source>About &amp;Qt...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="585"/>
<location filename="../MainWindow.ui" line="548"/>
<source>&amp;About PCSX2...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="526"/>
<location filename="../MainWindow.ui" line="493"/>
<source>Fullscreen</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="594"/>
<location filename="../MainWindow.ui" line="556"/>
<source>Change Disc...</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="603"/>
<location filename="../MainWindow.ui" line="564"/>
<source>&amp;Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="612"/>
<source>Game List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="621"/>
<source>Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="630"/>
<source>Add Game Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="639"/>
<source>&amp;Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="659"/>
<source>From File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="664"/>
<source>From Device...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="669"/>
<source>From Game List...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="674"/>
<source>Remove Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="679"/>
<location filename="../MainWindow.ui" line="635"/>
<source>Global State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="688"/>
<location filename="../MainWindow.ui" line="643"/>
<source>&amp;Screenshot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="290"/>
<location filename="../MainWindow.ui" line="282"/>
<source>Start File</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="308"/>
<location filename="../MainWindow.ui" line="43"/>
<source>&amp;Change Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="57"/>
<source>&amp;Load State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="65"/>
<source>Sa&amp;ve State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="93"/>
<source>Setti&amp;ngs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="133"/>
<source>&amp;Switch Renderer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="184"/>
<source>&amp;Input Recording</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="290"/>
<source>Start D&amp;isc...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="298"/>
<source>Start Disc</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="326"/>
<location filename="../MainWindow.ui" line="314"/>
<source>Start BIOS</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="362"/>
<location filename="../MainWindow.ui" line="346"/>
<source>Shut Down</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="389"/>
<location filename="../MainWindow.ui" line="370"/>
<source>Reset</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="413"/>
<location filename="../MainWindow.ui" line="392"/>
<source>Pause</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="422"/>
<location filename="../MainWindow.ui" line="400"/>
<source>Load State</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="431"/>
<location filename="../MainWindow.ui" line="408"/>
<source>Save State</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="476"/>
<location filename="../MainWindow.ui" line="432"/>
<source>&amp;Emulation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="448"/>
<source>Controllers</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="651"/>
<location filename="../MainWindow.ui" line="472"/>
<source>Achie&amp;vements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="485"/>
<source>&amp;Fullscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="580"/>
<source>&amp;Interface</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="588"/>
<source>Add Game &amp;Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="607"/>
<source>Settings</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="697"/>
<location filename="../MainWindow.ui" line="615"/>
<source>&amp;From File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="620"/>
<source>From &amp;Device...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="625"/>
<source>From &amp;Game List...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="630"/>
<source>&amp;Remove Disc</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="651"/>
<source>Screenshot</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="706"/>
<location filename="../MainWindow.ui" line="659"/>
<source>&amp;Memory Cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="715"/>
<location filename="../MainWindow.ui" line="667"/>
<source>&amp;Network &amp;&amp; HDD</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="724"/>
<location filename="../MainWindow.ui" line="675"/>
<source>&amp;Folders</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="735"/>
<location filename="../MainWindow.ui" line="686"/>
<source>&amp;Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="746"/>
<source>Lock Toolbar</source>
<location filename="../MainWindow.ui" line="771"/>
<source>Show Titl&amp;es (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="757"/>
<location filename="../MainWindow.ui" line="817"/>
<source>&amp;Open Data Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="825"/>
<source>&amp;Toggle Software Rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="833"/>
<source>&amp;Open Debugger</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="841"/>
<source>&amp;Reload Cheats/Patches</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="849"/>
<source>E&amp;nable System Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="857"/>
<source>Enable &amp;Debug Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="865"/>
<source>Enable &amp;Log Window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="873"/>
<source>Enable &amp;Verbose Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="881"/>
<source>Enable EE Console &amp;Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="889"/>
<source>Enable &amp;IOP Console Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="897"/>
<source>Save Single Frame &amp;GS Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="905"/>
<source>&amp;New</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="913"/>
<source>&amp;Play</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="921"/>
<source>&amp;Stop</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="934"/>
<source>&amp;Controller Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="942"/>
<source>&amp;Input Recording Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="958"/>
<source>Enable &amp;CDVD Read Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="966"/>
<source>Save CDVD &amp;Block Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="974"/>
<source>&amp;Enable Log Timestamps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="982"/>
<source>Start Big Picture &amp;Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="998"/>
<source>&amp;Cover Downloader...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1006"/>
<source>&amp;Show Advanced Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1011"/>
<source>&amp;Recording Viewer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1022"/>
<source>&amp;Video Capture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1030"/>
<source>&amp;Edit Cheats...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1038"/>
<source>Edit &amp;Patches...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="708"/>
<source>&amp;Status Bar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="768"/>
<source>Verbose Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="777"/>
<location filename="../MainWindow.ui" line="572"/>
<location filename="../MainWindow.ui" line="727"/>
<source>Game &amp;List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="789"/>
<location filename="../MainWindow.ui" line="697"/>
<source>Loc&amp;k Toolbar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="719"/>
<source>&amp;Verbose Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="738"/>
<source>System &amp;Display</source>
<extracomment>This grayed-out at first option will become available while there is a game emulated and the game list is displayed over the actual emulation, to let users display the system emulation once more.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="801"/>
<location filename="../MainWindow.ui" line="749"/>
<source>Game &amp;Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="810"/>
<location filename="../MainWindow.ui" line="757"/>
<source>Game &amp;Grid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="821"/>
<source>Show Titles (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="830"/>
<location filename="../MainWindow.ui" line="779"/>
<source>Zoom &amp;In (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="833"/>
<location filename="../MainWindow.ui" line="782"/>
<source>Ctrl++</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="842"/>
<location filename="../MainWindow.ui" line="790"/>
<source>Zoom &amp;Out (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="845"/>
<location filename="../MainWindow.ui" line="793"/>
<source>Ctrl+-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="854"/>
<location filename="../MainWindow.ui" line="801"/>
<source>Refresh &amp;Covers (Grid View)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="863"/>
<location filename="../MainWindow.ui" line="809"/>
<source>Open Memory Card Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="872"/>
<source>Open Data Directory...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="881"/>
<source>Toggle Software Rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="890"/>
<source>Open Debugger</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="899"/>
<source>Reload Cheats/Patches</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="907"/>
<source>Enable System Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="915"/>
<source>Enable Debug Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="923"/>
<source>Enable Log Window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="931"/>
<source>Enable Verbose Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="939"/>
<source>Enable EE Console Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="947"/>
<source>Enable IOP Console Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="956"/>
<source>Save Single Frame GS Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="964"/>
<source>New</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="972"/>
<source>Play</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="980"/>
<source>Stop</source>
<extracomment>This section refers to the Input Recording submenu.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="985"/>
<location filename="../MainWindow.ui" line="1001"/>
<location filename="../MainWindow.ui" line="926"/>
<source>Input Recording Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="993"/>
<source>Controller Logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1009"/>
<location filename="../MainWindow.ui" line="950"/>
<source>Enable &amp;File Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1017"/>
<source>Enable CDVD Read Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1025"/>
<source>Save CDVD Block Dump</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1033"/>
<source>Enable Log Timestamps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1042"/>
<location filename="../MainWindow.cpp" line="1510"/>
<source>Start Big Picture Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1051"/>
<location filename="../MainWindow.ui" line="990"/>
<location filename="../MainWindow.cpp" line="1511"/>
<source>Big Picture</source>
<comment>In Toolbar</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1060"/>
<source>Cover Downloader...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1068"/>
<location filename="../MainWindow.cpp" line="673"/>
<source>Show Advanced Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1073"/>
<source>Recording Viewer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1081"/>
<location filename="../MainWindow.cpp" line="742"/>
<source>Video Capture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1090"/>
<source>Edit Cheats...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.ui" line="1099"/>
<source>Edit Patches...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="251"/>
<source>Internal Resolution</source>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#FFFFFF"
width="800px"
height="800px"
viewBox="0 0 512 512"
version="1.1"
id="svg1"
sodipodi:docname="magnifier-line.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.005"
inkscape:cx="250.24876"
inkscape:cy="399.50249"
inkscape:window-width="1920"
inkscape:window-height="1008"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
id="path1"
style="fill:#000000" />
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg
fill="#FFFFFF"
width="800px"
height="800px"
viewBox="0 0 512 512"
version="1.1"
id="svg1"
sodipodi:docname="search2.svg"
inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="1.005"
inkscape:cx="250.24876"
inkscape:cy="399.50249"
inkscape:window-width="1920"
inkscape:window-height="1008"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
id="path1" />
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -63,6 +63,7 @@
<file>icons/black/svg/lightbulb-line.svg</file>
<file>icons/black/svg/list-check.svg</file>
<file>icons/black/svg/login-box-line.svg</file>
<file>icons/black/svg/magnifier-line.svg</file>
<file>icons/black/svg/memcard-line.svg</file>
<file>icons/black/svg/mic-line.svg</file>
<file>icons/black/svg/minus-line.svg</file>
@@ -166,6 +167,7 @@
<file>icons/white/svg/lightbulb-line.svg</file>
<file>icons/white/svg/list-check.svg</file>
<file>icons/white/svg/login-box-line.svg</file>
<file>icons/white/svg/magnifier-line.svg</file>
<file>icons/white/svg/memcard-line.svg</file>
<file>icons/white/svg/mic-line.svg</file>
<file>icons/white/svg/minus-line.svg</file>

View File

@@ -2008,7 +2008,7 @@ void Achievements::DrawGameOverlays()
s_active_progress_indicator.reset();
}
position.y -= image_size.y - padding * 3.0f;
position.y -= image_size.y + padding * 3.0f;
}
if (!s_active_leaderboard_trackers.empty())
@@ -2058,7 +2058,7 @@ void Achievements::DrawGameOverlays()
}
// Uncomment if there are any other overlays above this one.
//position.y -= image_size.y - padding * 3.0f;
//position.y -= image_size.y + padding * 3.0f;
}
}

View File

@@ -384,7 +384,8 @@ std::vector<IP_Address> AdapterUtils::GetGateways(const Adapter* adapter)
if (ReadAddressFamily(address->Address.lpSockaddr) == AF_INET)
{
const sockaddr_in* sockaddr = reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr);
collection.push_back(std::bit_cast<IP_Address>(sockaddr->sin_addr));
if (sockaddr->sin_addr.S_un.S_addr != 0)
collection.push_back(std::bit_cast<IP_Address>(sockaddr->sin_addr));
}
address = address->Next;
}

View File

@@ -4,6 +4,7 @@
#include "IP_Packet.h"
#include "DEV9/PacketReader/NetLib.h"
#include "common/BitUtils.h"
#include "common/Console.h"
namespace PacketReader::IP
@@ -17,7 +18,7 @@ namespace PacketReader::IP
{
return (dscp >> 2) & 0x3F;
}
void IP_Packet::GetDscpValue(u8 value)
void IP_Packet::SetDscpValue(u8 value)
{
dscp = (dscp & ~(0x3F << 2)) | ((value & 0x3F) << 2);
}
@@ -209,8 +210,8 @@ namespace PacketReader::IP
for (size_t i = 0; i < options.size(); i++)
opOffset += options[i]->GetLength();
opOffset += opOffset % 4; //needs to be a whole number of 32bits
headerLength = opOffset;
//needs to be a whole number of 32bits
headerLength = Common::AlignUpPow2(opOffset, 4);
}
void IP_Packet::CalculateChecksum()

View File

@@ -86,7 +86,7 @@ namespace PacketReader::IP
* bit0: Set to zero
*/
u8 GetDscpValue();
void GetDscpValue(u8 value);
void SetDscpValue(u8 value);
/* 2 bits
* In TOS, defined as follows

View File

@@ -4,6 +4,7 @@
#include "TCP_Packet.h"
#include "DEV9/PacketReader/NetLib.h"
#include "common/BitUtils.h"
#include "common/Console.h"
namespace PacketReader::IP::TCP
@@ -232,8 +233,8 @@ namespace PacketReader::IP::TCP
for (size_t i = 0; i < options.size(); i++)
opOffset += options[i]->GetLength();
opOffset += opOffset % 4; //needs to be a whole number of 32bits
headerLength = opOffset;
//needs to be a whole number of 32bits
headerLength = Common::AlignUpPow2(opOffset, 4);
//Also write into dataOffsetAndNS_Flag
u8 ns = dataOffsetAndNS_Flag & 1;

View File

@@ -43,9 +43,5 @@ namespace PacketReader::IP::UDP::DNS
virtual void WriteBytes(u8* buffer, int* offset);
virtual ~DNS_ResponseEntry(){};
private:
void ReadDNSString(u8* buffer, int* offset, std::string* value);
void WriteDNSString(u8* buffer, int* offset, std::string value);
};
} // namespace PacketReader::IP::UDP::DNS

View File

@@ -785,11 +785,28 @@ namespace Sessions
Console.Error("DEV9: ICMP: Malformed ICMP Packet");
int off = 1;
while ((icmpPayload->data[off] & 0xF0) != (4 << 4))
{
off += 1;
// Require space for the IP Header and source/dest port of a UDP/TCP packet
// We don't generate packets with IP options, so IP header is always 20 bytes
if (icmpPayload->GetLength() - off - 24 < 0)
{
off = -1;
break;
}
}
if (off == -1)
{
Console.Error("DEV9: ICMP: Unable To Recover Data");
Console.Error("DEV9: ICMP: Failed To Reset Rejected Connection");
break;
}
Console.Error("DEV9: ICMP: Payload delayed %d bytes", off);
retPkt = std::make_unique<IP_Packet>(&icmpPayload->data[off], icmpPayload->GetLength(), true);
retPkt = std::make_unique<IP_Packet>(&icmpPayload->data[off], icmpPayload->GetLength() - off, true);
}
const IP_Address srvIP = retPkt->sourceIP;

View File

@@ -225,10 +225,18 @@ namespace Sessions
void UDP_FixedPort::Reset()
{
std::lock_guard numberlock(connectionSentry);
// Reseting a session may cause that session to close itself,
// when that happens, the connections vector gets modified via our close handler.
// Duplicate the vector to avoid iterating over a modified collection,
// this also avoids the issue of recursive locking when our close handler takes a lock.
std::vector<UDP_BaseSession*> connectionsCopy;
{
std::lock_guard numberlock(connectionSentry);
connectionsCopy = connections;
}
for (size_t i = 0; i < connections.size(); i++)
connections[i]->Reset();
for (size_t i = 0; i < connectionsCopy.size(); i++)
connectionsCopy[i]->Reset();
}
UDP_Session* UDP_FixedPort::NewClientSession(ConnectionKey parNewKey, bool parIsBrodcast, bool parIsMulticast)

View File

@@ -37,10 +37,10 @@ public:
map[key] = value;
}
void Remove(Key key)
bool Remove(Key key)
{
std::unique_lock modifyLock(accessMutex);
map.erase(key);
return map.erase(key) == 1;
}
void Clear()

View File

@@ -464,55 +464,45 @@ bool SocketAdapter::SendUDP(ConnectionKey Key, IP_Packet* ipPkt)
return false;
else
{
UDP_Session* s = nullptr;
if (abs(udp.sourcePort - udp.destinationPort) <= 10 || //Used for games that assume the destination/source port
ipPkt->destinationIP == dhcpServer.broadcastIP || //Broadcast packets
ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}} || //Limited Broadcast packets
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0) //Multicast address start with 0b1110
// Always bind the UDP source port
// PS2 software can run into issues if the source port is not preserved
UDP_FixedPort* fPort = nullptr;
BaseSession* fSession;
if (fixedUDPPorts.TryGetValue(udp.sourcePort, &fSession))
{
UDP_FixedPort* fPort = nullptr;
BaseSession* fSession;
if (fixedUDPPorts.TryGetValue(udp.sourcePort, &fSession))
{
//DevCon.WriteLn("DEV9: Socket: Using Existing UDPFixedPort");
fPort = static_cast<UDP_FixedPort*>(fSession);
}
else
{
ConnectionKey fKey{};
fKey.protocol = (u8)IP_Type::UDP;
fKey.ps2Port = udp.sourcePort;
fKey.srvPort = 0;
Console.WriteLn("DEV9: Socket: Creating New UDPFixedPort with port %d", udp.sourcePort);
fPort = new UDP_FixedPort(fKey, adapterIP, udp.sourcePort);
fPort->AddConnectionClosedHandler([&](BaseSession* session) { HandleFixedPortClosed(session); });
fPort->destIP = {};
fPort->sourceIP = dhcpServer.ps2IP;
connections.Add(fKey, fPort);
fixedUDPPorts.Add(udp.sourcePort, fPort);
fPort->Init();
}
Console.WriteLn("DEV9: Socket: Creating New UDP Connection from FixedPort %d to %d", udp.sourcePort, udp.destinationPort);
s = fPort->NewClientSession(Key,
ipPkt->destinationIP == dhcpServer.broadcastIP || ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}},
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0);
if (s == nullptr)
{
Console.Error("DEV9: Socket: Failed to Create New UDP Connection from FixedPort");
return false;
}
fPort = static_cast<UDP_FixedPort*>(fSession);
}
else
{
Console.WriteLn("DEV9: Socket: Creating New UDP Connection to %d", udp.destinationPort);
ConnectionKey fKey{};
fKey.protocol = static_cast<u8>(IP_Type::UDP);
fKey.ps2Port = udp.sourcePort;
fKey.srvPort = 0;
Console.WriteLn("DEV9: Socket: Binding UDP fixed port %d", udp.sourcePort);
fPort = new UDP_FixedPort(fKey, adapterIP, udp.sourcePort);
fPort->AddConnectionClosedHandler([&](BaseSession* session) { HandleFixedPortClosed(session); });
fPort->destIP = {};
fPort->sourceIP = dhcpServer.ps2IP;
connections.Add(fKey, fPort);
fixedUDPPorts.Add(udp.sourcePort, fPort);
fPort->Init();
}
Console.WriteLn("DEV9: Socket: Creating New UDP Connection from fixed port %d to %d", udp.sourcePort, udp.destinationPort);
UDP_Session* s = fPort->NewClientSession(Key,
ipPkt->destinationIP == dhcpServer.broadcastIP || ipPkt->destinationIP == IP_Address{{{255, 255, 255, 255}}},
(ipPkt->destinationIP.bytes[0] & 0xF0) == 0xE0);
// If we are unable to bind to the port, fall back to a dynamic port
if (s == nullptr)
{
Console.Error("DEV9: Socket: Failed to Create New UDP Connection from fixed port");
Console.WriteLn("DEV9: Socket: Retrying with dynamic port to %d", udp.destinationPort);
s = new UDP_Session(Key, adapterIP);
}
@@ -537,7 +527,8 @@ int SocketAdapter::SendFromConnection(ConnectionKey Key, IP_Packet* ipPkt)
void SocketAdapter::HandleConnectionClosed(BaseSession* sender)
{
const ConnectionKey key = sender->key;
connections.Remove(key);
if (!connections.Remove(key))
return;
// Defer deleting the connection untill we have left the calling session's callstack
if (std::this_thread::get_id() == sendThreadId)
@@ -568,7 +559,8 @@ void SocketAdapter::HandleConnectionClosed(BaseSession* sender)
void SocketAdapter::HandleFixedPortClosed(BaseSession* sender)
{
const ConnectionKey key = sender->key;
connections.Remove(key);
if (!connections.Remove(key))
return;
fixedUDPPorts.Remove(key.ps2Port);
// Defer deleting the connection untill we have left the calling session's callstack
@@ -577,7 +569,7 @@ void SocketAdapter::HandleFixedPortClosed(BaseSession* sender)
else
deleteQueueRecvThread.push_back(sender);
Console.WriteLn("DEV9: Socket: Closed Dead UDP Fixed Port to %d", key.ps2Port);
Console.WriteLn("DEV9: Socket: Unbound fixed port %d", key.ps2Port);
}
void SocketAdapter::close()

View File

@@ -1,5 +1,6 @@
add_pcsx2_test(common_test
byteswap_tests.cpp
filesystem_tests.cpp
path_tests.cpp
string_util_tests.cpp
)

View File

@@ -0,0 +1,60 @@
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#include "common/FileSystem.h"
#include "common/Path.h"
#include <gtest/gtest.h>
#ifdef __linux__
#include <unistd.h>
static std::optional<std::string> create_test_directory()
{
for (u16 i = 0; i < UINT16_MAX; i++)
{
std::string path = std::string("/tmp/pcsx2_filesystem_test_") + std::to_string(i);
if (!FileSystem::DirectoryExists(path.c_str()))
{
if (!FileSystem::CreateDirectoryPath(path.c_str(), false))
break;
return path;
}
}
return std::nullopt;
}
TEST(FileSystem, RecursiveDeleteDirectoryDontFollowSymbolicLinks)
{
// Find a suitable location to write some test files.
std::optional<std::string> test_dir = create_test_directory();
ASSERT_TRUE(test_dir.has_value());
// Create a target directory containing a file that shouldn't be deleted.
std::string target_dir = Path::Combine(*test_dir, "target_dir");
ASSERT_TRUE(FileSystem::CreateDirectoryPath(target_dir.c_str(), false));
std::string file_path = Path::Combine(target_dir, "file.txt");
ASSERT_TRUE(FileSystem::WriteStringToFile(file_path.c_str(), "Lorem ipsum!"));
// Create a directory containing a symlink to the target directory.
std::string dir_to_delete = Path::Combine(*test_dir, "dir_to_delete");
ASSERT_TRUE(FileSystem::CreateDirectoryPath(dir_to_delete.c_str(), false));
std::string symlink_path = Path::Combine(dir_to_delete, "link");
ASSERT_EQ(symlink(target_dir.c_str(), symlink_path.c_str()), 0);
// Delete the directory containing the symlink.
ASSERT_TRUE(dir_to_delete.starts_with("/tmp/"));
ASSERT_TRUE(FileSystem::RecursiveDeleteDirectory(dir_to_delete.c_str()));
// Make sure the target file didn't get deleted.
ASSERT_TRUE(FileSystem::FileExists(file_path.c_str()));
// Clean up.
ASSERT_TRUE(FileSystem::DeleteFilePath(file_path.c_str()));
ASSERT_TRUE(FileSystem::DeleteDirectory(target_dir.c_str()));
ASSERT_TRUE(FileSystem::DeleteDirectory(test_dir->c_str()));
}
#endif