Commit Graph
100 Commits
Author SHA1 Message Date
Dentomologist e639d565f7 Merge pull request #14239 from JoshuaVandaele/error-warns-forkedoff4
Fix two warnings
2025-12-29 17:23:15 -08:00
Dentomologist 448d61f262 Windows/DirectIOFile: Don't request DELETE access for read-only Open
Aside from being unnecessary, on Windows the flag prevents two instances
of Dolphin (one instance from before 2509-371 when the flag was
introduced and the other after) from running the same ROM
simultaneously.

Attempting to do so generated the false error `"[Rom]" is an invalid
GCM/ISO file, or is not a GC/Wii ISO.` followed by `Failed to init core`
and emulation shutdown on the second instance to start the game. Fixing
the incorrect error message is a task I'm deferring to another PR.

The problem didn't happen when both instances were 2509-371 or later,
but I ran into it while bisecting an issue and it'd be nice to avoid
that problem in the future.
2025-11-29 14:02:24 -08:00
Dentomologist c2d277c5d1 Jit64: Avoid passing immediate to non-immediate parameter
Call `UseNoImm` instead of `Use` on parameter `a` of `MultiplyImmediate`
since `Ra` gets passed to `IMUL` which asserts that parameter is not an
immediate.
2025-11-26 16:27:26 -08:00
Dentomologist 3b97a7bded CubebStream: Use WorkQueueThread::PushBlocking instead of sync_event
Push and wait on WorkQueueThread items using PushBlocking. Previously we
created a Common::Event sync_event on the caller's stack, called Wait on
it, then had the WorkQueueThread call Set on the sync_event once the
thread was done.

In addition to being simpler the new way avoids a use-after-free that
could happen in convoluted and unlikely yet possible thread scheduling
sequences.

One such case can be triggered as follows:

* Set your audio backend to Cubeb
* In CubebStream::SetVolume set a breakpoint at the call to Wait and at
  the call to cubeb_stream_set_volume.
* Start a game.
* Continue until the Cubeb Worker thread hits the
  cubeb_stream_set_volume breakpoint and Emuthread hits the Wait
  breakpoint, freezing each thread when it hits its breakpoint.
* Unfreeze Cubeb Worker.
* In Event::Set set a breakpoint at the end of the scope containing the
  lock_guard such that the guard has been constructed but not destructed
  when the breakpoint is hit.
* Continue until that breakpoint is hit by Cubeb Worker. If other
  threads hit it first keep going.
* Freeze Cubeb Worker.
* For convenience remove the breakpoint in Event::Set so other threads
  don't trigger it.
* In CubebStream::SetRunning set a breakpoint at the call to Wait.
* Unfreeze Emuthread and continue until the breakpoint is hit.
* In Cubeb Worker go to Event::Set and examine the values of m_mutex's
  member variables. In Visual Studio Debug these are locking_thread_id
  == 0xcccccc01 and ownership_levels == 0xcccccccc. This is the result
  of Visual Studio overwriting the memory used on the stack by
  sync_event in CubebStream::SetVolume with cc bytes to represent
  uninitialized memory on the stack (since that function already
  returned), and then allocating enough memory on the stack when calling
  AudioCommon::SetSoundStreamRunning and then CubebStream::SetRunning
  that it overwrote one byte of the memory formerly occupied by
  locking_thread_id.
* If you unfreeze Cubeb Worker at this point it will trigger the lock
  guard's destructor which will then try to unlock m_mutex. Since
  m_mutex is no longer in scope this is a use-after-free, and in VS
  debug triggers a debug assert due to locking_thread_id not matching
  the current thread id.
2025-11-07 13:19:18 -08:00
Dentomologist 2836dd2b5e libmgba: Fix build when disabled 2025-10-30 12:00:13 -07:00
Dentomologist 32a8128b53 AchievementManager: Fix unused private field warnings
Remove several unused members from AchievementManager.

These became unused in https://github.com/dolphin-emu/dolphin/pull/12639
which switched from the rcheevos rc_runtime interface to rc_client.
2025-10-29 16:50:00 -07:00
Dentomologist 570ec7c322 Android: Fix unused value warning
Remove "env, " from "return env, GetControlPointer..." since the left
side of a comma operator has no effect.

This was presumably a copy/paste error from the function above it.
2025-10-29 16:19:15 -07:00
Dentomologist 70d8bc6fd7 CPU: Update PauseAndLock comment 2025-10-26 18:06:38 -07:00
Dentomologist c47db6dba7 DSPEmulator: Remove redundant parameter and code
PauseAndLock is only called with do_lock=true, so remove the parameter
and modify PauseAndLock accordingly.
2025-10-26 18:03:31 -07:00
Dentomologist d5f079d78b DSPEmulator: Extract UnpauseAndUnlock from PauseAndLock
Replace call to PauseAndLock(do_lock=false) with new function
UnpauseAndUnlock.
2025-10-26 18:03:06 -07:00
Dentomologist 933071dd57 FifoManager: Remove redundant PauseAndLock parameters
PauseAndLock was only called with do_lock=true, and the function only
used unpauseOnUnlock when do_lock was false.
2025-10-26 18:01:51 -07:00
Dentomologist f497eb519e FifoManager: Extract RestoreState from PauseAndLock
Replace calls of FifoManager::PauseAndLock(do_lock=false) with new
function RestoreState for clarity.
2025-10-26 18:01:51 -07:00
Dentomologist f628a979c4 Core: Remove pointless call to FifoManager::PauseAndLock
FifoManager::PauseAndLock doesn't do anything when doLock and
unpauseOnUnlock are both false, so remove the call.
2025-10-26 18:01:51 -07:00
Dentomologist 2d888ea4d3 Core: Remove unnecessary PauseAndLock parameters
PauseAndLock is now only called with do_lock=true, and unpause_on_unlock
only ever was used when do_lock is false (which is now handled in
RestoreStateAndUnlock instead), so both parameters are unnecessary.
2025-10-26 18:01:51 -07:00
Dentomologist c9c8461d36 Core: Extract RestoreStateAndUnlock from PauseAndLock
Replace calls of PauseAndLock(do_lock=false) with new function
RestoreStateAndUnlock for clarity.

Callers of PauseAndLock ignored the return value when do_lock is
false, so RestoreStateAndUnlock doesn't need to return anything.
2025-10-26 18:01:23 -07:00
Dentomologist 4e64d8e94f CPUManager: Remove redundant parameter from RestoreStateAndUnlock
RestoreStateAndUnlock was only called with control_adjacent=true. Remove
the parameter and unconditionally call the function that was gated
behind it being true.
2025-10-26 17:59:47 -07:00
Dentomologist 8d0dbb0ef6 CPUManager: Remove redundant parameter from PauseAndLock
PauseAndLock was only called with control_adjacent=false. Remove the
parameter and the function call that was only made when it was true.
2025-10-26 17:56:31 -07:00
Dentomologist 48d48fe1af CPUManager: Remove unnecessary PauseAndLock parameters
CPUManager::PauseAndLock is now only called with do_lock=true, and
unpause_on_unlock only ever was used when do_lock is false (which is now
handled in RestoreStateAndUnlock instead), so both parameters are
unnecessary.
2025-10-26 17:54:41 -07:00
Dentomologist 1a6e285685 CPU: Remove default arguments for PauseAndLock
For clarity in the next commit.
2025-10-26 17:54:41 -07:00
Dentomologist 691743fbc4 CPU: Extract RestoreStateAndUnlock from PauseAndLock
Replace call of CPUManager::PauseAndLock(do_lock=false) with new
function RestoreStateAndUnlock for clarity.

Callers of Core::PauseAndLock ignore the return value when do_lock is
false, so in that case was_unpaused in Core::PauseAndLock doesn't need
to be set and so RestoreStateAndUnlock doesn't need to return anything.
2025-10-26 17:54:41 -07:00
Dentomologist bebeba29c3 CPU: Convert static variable to class member
Make s_have_fake_cpu_thread a class member instead. In addition to
getting rid of a bit of static state, this simplifies refactoring in an
upcoming commit.
2025-10-26 17:53:45 -07:00
Dentomologist 5b4df5ae98 VideoBackend: Rename GetName to GetConfigName
Make the function name more explicit and a better match for
GetDisplayName.

Change NAME to CONFIG_NAME while I'm at it.
2025-10-13 17:38:20 -07:00
Dentomologist 4e359cf1c5 WindowsDevice: Silence missing property log spam
Don't log a warning in GetPropertyHelper when the property isn't
present. The function returns an optional, so any callers that want to
log a warning when nullopt is returned can do so themselves.

This prevents plugged-in devices (an Xbox One controller in my case)
from spamming the message "W[COMMON]: CM_Get_DevNode_Property returned:
37" twice per second (that value being CR_NO_SUCH_VALUE).
2025-10-13 11:55:12 -07:00
Dentomologist f64e57442c DeleteDirRecursively: Don't report error for absent directory
Check if the return value of std::filesystem::remove_all is -1 rather
than 0; the former is the specified return value if there's an error
while 0 just means the directory already didn't exist (which is the end
result we want).

Previously error messages such as the following were possible:
E[COMMON]: DeleteDirRecursively: [path]/User/RedirectSession/ failed The
operation completed successfully.

Also adds a period in the error string to make it look nicer.
2025-10-05 16:29:41 -07:00
Dentomologist ff45bfbcdc Visual Studio: Fix DolphinNoGUI build 2025-10-05 15:38:43 -07:00
Dentomologist 3235f3f58f CheatSearchWidget: Rename member variable
Rename m_session to m_last_value_session to better reflect its meaning
and distinguish it from m_current_value_session which will be introduced
in another commit.
2025-10-04 14:27:15 -07:00
Dentomologist d364a244d7 CheatSearchWidget: Add GetTableRowCount function 2025-10-04 14:27:14 -07:00
Dentomologist d311724750 Jit64: Fix dcbz regression
Fix a regression from d1ba84987 that caused freezes and/or
graphical/audio glitches in various games.
2025-09-30 22:15:36 -07:00
Dentomologist 2d48043b61 Logging: Don't overwrite LDEBUG verbosity in Release builds
Preserve the configured logging verbosity unless the user actually
changes it, rather than capping it to LINFO on release builds.

Rename LogManager::m_level to m_effective_level and distinguish between
the config and effective level in various function/variable names.

Make m_effective_level atomic to prevent data races when setting the
effective log level from the config changed callback.
2025-09-19 13:25:42 -07:00
Dentomologist 85a89eb420 RetroAchievements: Avoid uninitialized memory access
Avoid creating and then destroying a leaderboard list when game is null,
as doing so causes an access to uninitialized memory due to a bug in
rcheevos.

This can be triggered by starting a game with an invalid or expired
login token.
2025-09-05 17:23:39 -07:00
Dentomologist e44c99cb59 Settings: Open file dialogs at user path
When opening a file dialog to set the location of a custom path, use the
corresponding user path as the starting location instead of the current
custom path.

When no custom path was set the dialog would be opened with a blank path
which causes Windows (not sure about other platforms) to open the dialog
at the same location where the last dialog was closed, or at the current
working directory if no previous dialog had been opened.

If a nonempty custom path has been set then it has also set the
corresponding user path, so the behavior in that case is unchanged.
2025-09-01 14:51:29 -07:00
Dentomologist 489fd643d3 GameList: Use List View's sorting for Grid View
Since Grid View doesn't have a header for users to change sorting
options with, use List View's sorting in Grid View too.
2025-08-27 15:35:38 -07:00
Dentomologist 44f6743a5b CodeWidgets: Show code approval in Hardcore mode
When Hardcore mode is enabled, show an icon for each code in
ARCodeWidget and GeckoCodeWidget indicating whether it's an approved
code or not.
2025-08-25 12:31:38 -07:00
Dentomologist 1841c151c4 FIFOPlayerWindow: Save and restore window geometry
Aside from allowing users to persistently set the window to their
desired size, this is also necessary to allow saving of the splitter
positions in FIFOAnalyzer to work correctly.
2025-08-17 14:39:40 -07:00
Dentomologist 99be30c0e1 FIFOPlayerWindow: Trigger destructor on Dolphin shutdown
Make MainWindow::m_fifo_window a unique_ptr to ensure its destructor is
triggered when MainWindow is destroyed.

FIFOPlayerWindow doesn't set MainWindow as its parent in order to
prevent raising MainWindow when focusing FIFOPlayerWindow. This avoids
MainWindow covering up RenderWidget when, e.g., trying to use the object
range feature to pinpoint the index of a particular object.

As a consequence, unlike most QObjects FIFOPlayerWindow wasn't destroyed
when its parent widget was since it didn't have one.
2025-08-17 14:39:40 -07:00
Dentomologist 6f43f8eef5 FIFOPlayerWindow: Add stretch to Play/Record tab 2025-08-17 14:39:40 -07:00
Dentomologist 3cc00c0676 DolphinAnalytics: Use Pascal case for GameQuirk enum 2025-08-14 13:54:23 -07:00
Dentomologist bd79bc47cc BranchWatch: Extract shared function logic
IsolateWasOverwritten and IsolateNotOverwritten share the same basic
logic and have almost exactly the same code, with the only difference
being the comparison function used to keep or discard branches. To avoid
unnecessary code duplication and ensure that the functions stay in sync
after any future changes, create a helper function that takes the
comparison function as a parameter and have IsolateWasOverwritten and
IsolateNotOverwritten call that helper.
2025-08-12 12:15:22 -07:00
Dentomologist 4303e086bf EnhancementsWidget: Fix display of default post-processing effect
Show "(off)" instead of "" when the default post-processing effect is
selected. This also indirectly fixes issues with keyboard navigation of
the post-processing effect combobox when the default is selected,
resolving https://bugs.dolphin-emu.org/issues/13863.

m_post_processing_effect was previously using the ConfigStringChoice
constructor that assumes the text and data of each option are identical.
This is true for all the other effects, but since "(off)" has the config
value of "" this assumption was failing for it, causing the combobox to
be blank.
2025-08-11 18:01:14 -07:00
Dentomologist 61d9002ab4 EnhancementsWidget: Unabbreviate function and member names 2025-08-11 17:59:55 -07:00
Dentomologist 3b832e84e4 Host: Remove outdated comment
Host_RequestFullscreen and Host_UpdateMainFrame have been removed, and
Host_RequestRenderWindowSize has been used by DolphinQt since 80699096
and by Android since e8739156.
2025-08-03 13:24:50 -07:00
Dentomologist 530ea7528e Host: Remove unnecessary functions
Remove Host_RefreshDSPDebuggerWindow (which hasn't done anything since
DolphinWX was removed in 44b22c90) and DSP::Host::UpdateDebugger (which
only called Host_RefreshDSPDebuggerWindow).
2025-08-03 13:19:30 -07:00
Dentomologist d0de0a3f47 Host: Remove unnecessary function
Remove Host_UpdateMainFrame(). The only non-empty call happened in
DolphinNoGUI which called s_update_main_frame_event.Set(), but
DolphinNoGUI never waits on that event.
2025-08-03 13:12:01 -07:00
Dentomologist 38accd7fc3 GameTracker: Fix games not being displayed 2025-08-01 16:04:53 -07:00
Dentomologist c880210ec1 MemoryWidget: Fix build breakage from conflicting PRs
PRs https://github.com/dolphin-emu/dolphin/pull/13786 and
https://github.com/dolphin-emu/dolphin/pull/13797 had incompatible
changes that resulted in the build being broken when they were both
merged.
2025-08-01 15:31:38 -07:00
Dentomologist 7b52555a5f BalloonTip: Don't hide when BalloonTip blocks the cursor
Keep the BalloonTip open when the BalloonTip's arrow prevents the cursor
from being inside the spawning ToolTipWidget, which triggers the
ToolTipWidget's leaveEvent and would previously close the BalloonTip.

When that happens track the cursor until it either leaves the
ToolTipWidget's bounding box or leaves the BalloonTip and goes back to
the ToolTipWidget, and respectively close the BalloonTip or leave it
open.
2025-08-01 12:30:05 -07:00
Dentomologist e2a8e7da48 GameConfigWidget: Unify tooltips
Use ToolTipWidget::SetDescription insead of QWidget::setTooltip to put
the description in the BalloonTip with the title, instead of having the
description be in a separate standard tooltip.
2025-07-24 12:03:57 -07:00
Dentomologist c29b3e098d MemoryWidget: Fix splitter state restoration
Fix a copy-paste error causing MemoryWidget's splitter to load the wrong
state data when creating the MemoryWidget.

For me this caused the side panel to be scrunched up every time I
started Dolphin, but the exact effects probably depend on the state of
your MemoryWidget and CodeWidget.
2025-07-17 14:40:14 -07:00
Dentomologist 43ab79ae23 MemoryViewWidget: Fix updates at end of address space
Fix two bugs that occurred when viewing a memory range starting shortly
before 0xffffffff.

Bug 1: When there was at least one visible memory address at or after
0x0 none of the values would be displayed even when some of the
addresses were valid. This happened because the loop condition in
GetValues immediately returned false since m_address_range.first >
m_address_range.second, causing m_values to be empty. This in turn led
every address to be considered INVALID_MEMORY in UpdateColumns.

Bug 2: When m_address_range.second was equal to 0xffffffff GetValues
would enter an infinite loop. This happened because address would
overflow to 0 after printing the last value in the table, causing the
loop condition address <= m_address_range.second to be true forever.
2025-07-17 13:45:08 -07:00
Dentomologist 8a28b95480 IOFile: Require trivially copyable types
Require ReadArray and WriteArray to be called with a trivially copyable
type.

ReadArray and WriteArray call std::fread and std::fwrite respectively.
These functions trigger undefined behavior when the objects are not
trivially copyable, so this adds that requirement to the callers.
2025-07-14 11:55:24 -07:00
Dentomologist 30bd7e18f0 CEXIAgp: Don't create save file if path is empty
Fix creation of a ".sav" file in the current working directory on
emulation shutdown when a slot is set to "Advance Game Port" and the
"GBA Cartridge Path" is empty.

Fixes https://bugs.dolphin-emu.org/issues/12975.
2025-07-12 13:07:44 -07:00
Dentomologist 72ea7a2128 VideoBackendBase: Remove redundant unique_ptr reset
Remove redundant reset of g_presenter in ShutdownShared, which is
already reset earlier in the function.
2025-07-09 14:12:06 -07:00
Dentomologist 0093ed1ac8 MemoryWidget: Fix "Hex Byte String" validation failures
Fix the input string failing to validate when the "Hex Byte
String" input type is selected and either the user adds a 0x prefix or
the "Hex" box is checked (or both).

The latter failure was particularly troublesome because when "Hex Byte
String" is selected the "Hex" checkbox is disabled. Users would have to
switch to a data type that enabled the box, toggle it, then switch back
to "Hex Byte String" to fix it.

Fix these errors by not adding a prefix when the "Hex" box is checked,
and removing the "0x" prefix from the user's input if present.
2025-06-30 11:34:20 -07:00
Dentomologist 8f4a0b0e77 MemoryWidget: Allow 0x prefix when Hex box is checked.
Fix validation failing when the user has checked the Hex box and also
includes a "0x" or "-0x" prefix in their input.

Previously an extra "0x" would be inserted, causing the user's input of
"0x13" to become "0x0x13" which would then fail to validate.
2025-06-30 00:12:48 -07:00
Dentomologist c613d3ca10 ControllerInterface: Fix Windows deadlock
Remove the redundant s_populate_mutex and only use
ControllerInterface::m_devices_population_mutex instead to prevent a
deadlock caused by locking them in opposite orders.

The device population functions in the win32 InputBackend previously
locked s_populate_mutex first before calling various functions that
locked m_devices_population_mutex. This normally worked but
ControllerInterface::RefreshDevices locks m_devices_population_mutex
first and then calls HandleWindowChange which then locked
s_populate_mutex, potentially causing the deadlock.

Fix this by using PlatformPopulateDevices to lock
m_devices_population_mutex before running the code that was previously
protected by s_populate_mutex. The functions in question lock
m_devices_population_mutex anyway, so this shouldn't meaningfully
increase contention on the lock.

Reproduction steps:

* Let Dolphin finish startup.
* In Win32.cpp::OnDevicesChanged set a breakpoint on the call to
  PlatformPopulateDevices. When the breakpoint is triggered the function
  will have locked s_populate_mutex, but since PlatformPopulateDevices
  won't have run yet m_devices_population_mutex will still be unlocked.
* Unplug a device from your computer.
* Wait for the breakpoint to trigger. (At this point you can plug the
  device back in).
* Freeze the ntdll.dll!TppWorkerThread() that triggered the breakpoint.
* Resume Dolphin and start a game.
* Core::EmuThread will call ControllerInterface::ChangeWindow which
  calls RefreshDevices. It locks m_devices_population_mutex, then calls
  InputBackend::HandleWindowChange, which tries to lock
  s_populate_mutex.
* Unfreeze ntdll.dll!TppWorkerThread().

At this point EmuThread and TppWorkerThread are deadlocked. The UI is
still responsive since the Host thread is unaffected, but trying to stop
the game or close Dolphin normally will fail since EmuThread is unable
to stop.
2025-06-28 14:00:27 -07:00
Dentomologist e21ae90073 MainWindow: Show hardcore mode error for recording playback
Show an error message when attempting to play an input recording while
RetroAchievements hardcore mode is active, instead of silently doing
nothing.
2025-06-17 12:21:39 -07:00
Dentomologist e8c9c7a403 DolphinQt: Add DolphinQt.vcxproj ClInclude line
Add a missing ClInclude line in DolphinQt.vcxproj for
NonAutodismissibleMenu.h. Missing the ClInclude doesn't break
compilation, but prevents various IntelliSense features in Visual
Studio from working properly with the file.
2025-06-16 23:11:11 -07:00
Dentomologist c488545091 GameListModel: Update tag list and sorting immediately
Emit the dataChanged signal when adding or removing tags from a game.
This both updates the contents of the game's Tags column immediately
(instead of having to wait for the context menu to be closed), and
updates the sorting if games are being sorted by the Tags column.
2025-06-16 22:58:30 -07:00
Dentomologist 2fd74990b7 Qt: Use NonAutodismissibleMenu in more places
Use NonAutodismissibleMenu for MenuBar's Options, JIT, and
Tools->"Connect Wii Remotes" menus, as well as for the Tags menu in
GameList's context menu.

NonAutodismissibleMenu allows users to check or uncheck multiple
checkable menu items without closing the menu between selections.
2025-06-16 22:56:26 -07:00
Dentomologist ab25632992 ThreadWidget: Don't set fixed width on QLineEdits
Fix clipping of QLineEdit contents by having them take up half the grid
width instead of trying to match the contents width in an unreliable
manner.
2025-06-16 22:33:20 -07:00
Dentomologist 6a0d8ca3f8 MenuBar: Rename menu variable
The Tools menu has a number of submenus, so rename menu to
connect_wii_remotes_menu for clarity.
2025-06-16 21:06:55 -07:00
Dentomologist 3994a9446f AutoUpdateChecker: Delete old Updater.log file
Delete old Updater.log file from GetExeDirectory().

The log was moved to GetUserPath(D_LOGS_IDX) in 5.0-14529, but users
looking to make a bug report might find the old one instead so let's
delete it to prevent any confusion.
2025-06-09 13:51:52 -07:00
Dentomologist 2a7e8a4003 DolphinQt: Remove redundant window hints
Remove window hints clearing the flag Qt::WindowContextHelpButtonHint,
which is already off by default in Qt 6.

In Qt 5 this flag was set by default for QDialogs, and on Windows put a
? button in the corner of the title bar allowing users to activate Qt's
QWhatsThis help system for a given widget. Since we don't set that text
the ? button was useless and so we hid it manually.
2025-06-06 19:35:13 -07:00
Dentomologist 61ccdb0a3c WaveFile: Add m_ prefix to member variables 2025-06-01 11:41:09 -07:00
Dentomologist 3dc1605569 FilesystemWidget: Center header text
Center header text to match all the other headers.
2025-05-27 12:34:20 -07:00
Dentomologist ffd46cd10c WiimoteControllersWidget: Fix UI hang on opening
Fix the UI hanging for several seconds when opening the Controllers
window.

Move the scan for Bluetooth adapters onto a separate thread so the Host
thread doesn't have to wait for it.

Only automatically scan for adapters once, when opening the Controllers
window for the first time. Add a Refresh button to let the user refresh
the adapter list afterward.
2025-05-15 20:36:21 -07:00
Dentomologist 55cfb958c7 GeneralPane: Add Hardcore Mode tooltip clarification
When Hardcore Mode is active, clarify in the Speed Limit tooltip that
values less than 100% won't slow emulation.
2025-05-08 15:45:15 -07:00
Dentomologist 77744169be SDL: Check if touchpad exists before getting input
Verify a touchpad is present before polling it for input. Without this
check the Debug log is spammed with the message "error: Parameter
'touchpad' is invalid" if you have a controller without a touchpad.

One would think every touchpad supports at least 1 finger, but in case
there's some weird edge case check the finger count to be sure.
2025-05-02 17:21:42 -07:00
Dentomologist 3a883f28d6 Config: Add [[nodiscard]] to AddConfigChangedCallback
Require callers of Config::AddConfigChangedCallback and
CPUThreadConfigCallback::AddConfigChangedCallback to handle the returned
ConfigChangedCallbackIDs to hopefully prevent future issues with
callbacks getting called after their associated objects have been
destroyed.
2025-04-25 16:04:12 -07:00
Dentomologist 45b9def42c VideoConfig: Remove ConfigChangedCallback on shutdown 2025-04-25 16:00:43 -07:00
Dentomologist d0dc8ae5e1 FreeLook: Remove ConfigChangedCallback on shutdown 2025-04-25 16:00:43 -07:00
Dentomologist 9db4067957 UICommon: Merge ConfigChangedCallbacks
Use a single lambda as a callback which calls InitCustomPaths and
RefreshConfig instead of having separate callbacks for each of them.

This fixes the callback for InitCustomPaths not being removed on
shutdown; the callback for the lambda (previously for RefreshConfig) is
already removed in Shutdown().
2025-04-25 16:00:43 -07:00
Dentomologist 8724daf44e Settings: Remove ConfigChangedCallback on shutdown 2025-04-25 16:00:19 -07:00
Dentomologist 9c40a7976b AchievementManager: Remove ConfigChangedCallback on shutdown
Prevent SetHardcoreMode from being called after m_client is set to
nullptr. rc_client_set_hardcore_enabled() checks for nullptr so this
didn't cause any problems, but better not to rely on that.

Also prevents multiple SetHardcoreMode callbacks from piling up when
repeatedly toggling Config::RA_ENABLED.
2025-04-25 15:29:29 -07:00
Dentomologist e37a195192 MainWindow: Fix use-after-free during shutdown
Remove ConfigChangedCallback in MainWindow's destructor to prevent the
callback from accessing the destroyed MainWindow afterward.

After MainWindow is destroyed UICommon::Shutdown calls
LogManager::Shutdown which ultimately triggers any remaining callbacks.
This resulted in calling MainWindow::OnHardcoreChanged, which crashed in
debug builds and didn't have any obvious effect in release builds.
2025-04-25 15:29:29 -07:00
Dentomologist 2c20d5dcd9 GameList: Ignore non-left double-clicks
Don't start a game when a double-click is triggered by a mouse button
other than the left button.

Fixes https://bugs.dolphin-emu.org/issues/12272.
2025-04-12 16:17:04 -07:00
Dentomologist ec49ea5be3 PerformanceMetrics: Fix window arrangement
Fix overlays stacking on top of each other or not moving to the edge of
the screen when enabling or disabling overlays while emulation is
active.

This change only applies when Config::GFX_MOVABLE_PERFORMANCE_METRICS is
False.
2025-04-05 14:22:17 -07:00
Dentomologist 0b128badae DolphinQt: Fix unresponsive hotkeys during framestep overlay move
Fix the following bug:

* Have a moveable ImGui overlay enabled, such as the Statistics window.
* Pause the game.
* Click and hold on the overlay's title bar as if you were going to move
  it. Because the screen isn't updating while the game is paused, you
  won't be able to actually move the overlay.
* Press the Frame Advance hotkey several times until it stops
  responding.

At this point emulation hotkeys are no longer responsive. This can be
resolved by selecting Play from the toolbar or menu, or selecting Frame
Advance from the menu a couple times, but it's annoying and not obvious
what's gone wrong or how to fix it.

Why the bug is happening:

* Doing a framestep while clicking on the overlay title bar causes ImGui
  to set IO.WantCaptureKeyboard to true, indicating that ImGui is
  requesting Dolphin ignore any keyboard events while the overlay is
  being interacted with.
* Dolphin complies with this request, causing
  Host_UIBlocksControllerState to return true and thus setting the input
  gate to ignore input.
* IO.WantCaptureKeyboard is only updated when ImGui::NewFrame() is
  called, which only happens at the end of each present. It thus remains
  true indefinitely since the game paused after the last framestep, and
  so Dolphin ignores any hotkeys such as the framestep or play keys.

The fix:

Ignore IO.WantCaptureKeyboard when the game is paused. ImGui can't
meaningfully capture input anyway when the game is paused, so this
shouldn't cause any problems elsewhere.

Once async presentation is implemented we'll want to revert this change,
both because it'll become unnecessary and because ImGui will be able to
do stuff while paused and so suppressing emulation hotkeys will actually
be useful.
2025-03-23 14:36:58 -07:00
Dentomologist 0645a267d9 PerformanceMetrics: Add clamping, resetting on resize, and setting
Clamp overlays to the render window (with some padding), reset their
positions when the render window changes sizes, and add a setting to
enable moving the overlays (off by default, .ini only for now).
2025-02-24 13:17:57 -08:00
Dentomologist 363155b597 State: Increase Decompressing OSD message duration
Show the "Decompressing State..." message for 2 seconds, instead of the
half-second duration that caused it to be halfway faded out immediately.
2025-02-06 17:17:18 -08:00
Dentomologist 4b8e36cba9 PerformanceMetrics: Allow users to move overlays
Allow users to move the FPS, VPS, Speed, and Performance Graph overlays.
2025-02-02 19:40:01 -08:00
Dentomologist f94e6cb73e PerformanceMetrics: Call ImGui::End() unconditionally
Move ImGui::End() calls out of if(ImGui::Begin()) blocks.

Quoting from ImGui::Begin's function comment in imgui.cpp:
"You always need to call ImGui::End() even if false is returned."

In practice this didn't cause problems because the windows don't have
title bars and thus can't be collapsed, and so the block containing
::End would always run, but let's do it the right way.
2025-02-02 14:14:56 -08:00
Dentomologist fb3a727fcc WiiTASInputWindow: Update controls when attachment changes
Change the displayed controls in the TAS Input window when the
controller's extension (including MotionPlus) is changed.

This previously required restarting Dolphin after the attachment was
changed, as the controls were never updated after the WiiTASInputWindow
was created at Dolphin startup.
2025-01-18 14:15:20 -08:00
Dentomologist a9b1c1f5f8 IRWidget: Move header constants into class
This apparently didn't compile on macOS six years ago before c++20, but
it should be fine by now.

While I'm at it, make the constants upper case per convention.
2024-11-26 13:50:13 -08:00
Dentomologist 47a86d920f GeneralWidget: Recommend default video backend in tooltip
Recommend the platform's default video backend in the Backend tooltip
instead of always recommending OpenGL.
2024-11-03 12:28:30 -08:00
Dentomologist 7b8610f4ea VideoBackendBase: Clarify function name
Rename GetDefaultBackendName to GetDefaultBackendConfigName to
distinguish it from the display name.
2024-11-03 12:26:57 -08:00
Dentomologist dc1b961c09 VideoBackendBase: Only populate backend info when uninitialized
Prevent potential issues when creating the Graphics window (and thus
calling PopulateBackendInfo) while the core state is Stopping, like we
already do while it's Starting or Running.
2024-09-27 12:20:48 -07:00
Dentomologist 0a1084fad5 VideoBackendBase: Check Core state in PopulateBackendInfo
Remove the PopulateBackendInfoFromUI function, which had a single caller
(GraphicsWindow::OnBackendChanged) and checked that the core wasn't
running or starting before calling PopulateBackendInfo.

Move the core state check into PopulateBackendInfo and have
OnBackendChanged call that instead. This guarantees the check is
performed by all callers of PopulateBackendInfo, preventing
potential reintroduction of the crash fixed in 3d4ae63f if another call
to PopulateBackendInfo is added.

As of the previous commit the only other caller of PopulateBackendInfo
is Core::Init shortly before s_state is set to Starting, so it will
always pass the check and so maintain its current behavior.
2024-09-26 17:12:26 -07:00
Dentomologist 2b82c34ea8 Core: Remove redundant call to PopulateBackendInfo
Remove the second of two calls to PopulateBackendInfo during emulation
startup. This call was originally the only one, but b214e0e added an
earlier call to handle the backend being changed by the GameINI.

The PR discussion doesn't explain why the original call was left in; I
suspect it was just overlooked.

As a bonus, this removes one of the extra copies of the "Video Info" On
Screen Display message at startup when using OpenGL.
2024-09-26 17:12:26 -07:00
Dentomologist 91f7b776ca GraphicsWindow: Fix crash when opening during emulation startup
Fix a crash when opening the Graphics window for the first time during
emulation startup when the backend is Vulkan, D3D11, or D3D12.

Don't call PopulateBackendInfo() from the Host thread when the core is
starting up. First, the function has already been called in Core::Init()
so we don't need to again. More importantly, PopulateBackendInfo() calls
g_video_backend->InitBackendInfo(), and the Vulkan and D3D
implementations of those functions load and then unload libraries (and
their associated function pointers) which are potentially in use by
other threads.

This crash was reliably reproducible with the following steps:
1) Select an affected backend.
2) Enable "Compile Shaders Before Starting"
3) Delete the cached shaders (but not the .uidcache file) for the game
   you're testing.
4) Close and reopen Dolphin.
5) Start the game.
6) While the game is still booting or compiling shaders, open the
   Graphics window for the first time in that Dolphin session.

Fixes https://bugs.dolphin-emu.org/issues/13634.
2024-09-26 17:12:26 -07:00
Dentomologistandjeremyie b1d54e416b GameSettings: Disable GPU Texture Decoding when needed
Arbitrary Mipmap Detection doesn't work when GPU Texture Decoding is
enabled, so disable GPU Texture Decoding for games where the .ini
enables Arbitrary Mipmap Detection.

Co-authored-by: jeremyie <[email protected]>
2024-09-10 12:01:40 -07:00
Dentomologist 694f2ee995 Graphics: Clarify relationship between incompatible settings
Explicitly state that Manual Texture Sampling disables Anisotropic
Filtering and that GPU Texture Decoding disables Arbitrary Mipmap
Detection.
2024-09-10 11:35:15 -07:00
Dentomologist c3d6d2189a Texture Dumping: Show OSD message on startup and when toggled
If texture dumping is enabled, notify the user on emulation startup
using an On Screen Display message.

Also notify the user when texture dumping is toggled.

Addresses https://bugs.dolphin-emu.org/issues/12445.
2024-09-06 13:00:25 -07:00
Dentomologist 9bdf862460 MainWindow: Prevent Confirm On Stop dialog from being hidden
Set the Render Window as the parent of the Confirm On Stop confirmation
dialog when Keep Window On Top is enabled, ensuring it will always be
visible.

Previously, when Confirm On Stop and Keep Window On Top were both
enabled the Confirm On Stop dialog could be hidden by the render window
in the following situations:
* Clicking Stop in the Main Window
* Clicking the Main Window's close button
* Pressing the Stop hotkey while in FullScreen mode

This was particularly troublesome because the confirm dialog is modal,
preventing the user from moving the render window out of the way if it
was obscuring the dialog.

Fixes https://bugs.dolphin-emu.org/issues/13247.
2024-08-27 15:28:05 -07:00
Dentomologist 16bf5a86d3 HotkeyScheduler: Handle Wii Remote connections independently
Allow connecting or disconnecting multiple Wii Remotes simultaneously
instead of only handling the highest index whose hotkey is pressed. This
allows using a single hotkey to toggle multiple remotes.
2024-08-26 21:30:30 -07:00
Dentomologist 9e6a4e9d35 ARCodeWidget: Remove unnecessary call to OnSelectionChanged
Before the call to OnSelectionChange, m_code_edit and m_code_remove are
disabled and UpdateList calls m_code_list->clear(), thereby deselecting
any selected items.

When no items are selected, OnSelectionChange disables m_code_edit and
m_code_remove and then returns. Since that was already done, the call
doesn't change anything and can be removed.
2024-08-25 23:44:17 -07:00
Dentomologist f4db168a8e CheatsManager: Create ARCodeWidget and GeckoCodeWidget only once.
Create ARCodeWidget and GeckoCodeWidget once on startup rather than
every time a game is launched or shutdown.

In addition to losing focus on the tab (since the previous widget and
tab no longer existed), the behavior prior to this commit could cause a
crash if the user initiated a game shutdown and then opened a code edit
window since the AR/GeckoCodeWidget would get deleted in the meantime.
2024-08-25 23:44:17 -07:00
Dentomologist 232d24109d Extract ARCodeWidget/GeckoCodeWidget code loading to functions 2024-08-25 23:44:17 -07:00
Dentomologist ee35aa49a2 ARWidget: Disable Edit and Remove buttons when no code is selected
Also some minor refactoring of nearby/related code:
* Make non-obvious variable types explicit instead of auto.
* Throw some consts around.
* Use setDisabled(empty) instead of setEnabled(!empty).
2024-08-25 23:44:17 -07:00
Dentomologist 134313e313 MenuBar: Update checkmarked Select State Slot when hotkey pressed
Update the checkmarked slot in the Select State Slot menu when the
Increase Selected State Slot or Decrease Selected State Slot hotkeys are
pressed.

The actual selected save slot was being changed correctly before this
commit; this just fixes the menu checkmark.
2024-08-13 12:53:29 -07:00