1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-06 09:58:21 +08:00

Schedule adding transforms on tablet changes

Fixes `InvalidThreadForMutationException`s that pop up when
disconnecting/reconnecting tablets during the game's operation. In those
cases the value change callback executes from  an OpenTabletDriver
thread.
This commit is contained in:
Bartłomiej Dach 2021-03-20 12:29:24 +01:00
parent b9b351311a
commit d28bed6ed2
2 changed files with 26 additions and 14 deletions

View File

@ -125,17 +125,20 @@ namespace osu.Game.Overlays.Settings.Sections.Input
}, true); }, true);
tablet.BindTo(handler.Tablet); tablet.BindTo(handler.Tablet);
tablet.BindValueChanged(val => tablet.BindValueChanged(_ => Scheduler.AddOnce(updateTabletDetails));
{
tabletContainer.Size = val.NewValue?.Size ?? Vector2.Zero;
tabletName.Text = val.NewValue?.Name ?? string.Empty;
checkBounds();
}, true);
updateTabletDetails();
// initial animation should be instant. // initial animation should be instant.
FinishTransforms(true); FinishTransforms(true);
} }
private void updateTabletDetails()
{
tabletContainer.Size = tablet.Value?.Size ?? Vector2.Zero;
tabletName.Text = tablet.Value?.Name ?? string.Empty;
checkBounds();
}
private static int greatestCommonDivider(int a, int b) private static int greatestCommonDivider(int a, int b)
{ {
while (b != 0) while (b != 0)

View File

@ -196,19 +196,13 @@ namespace osu.Game.Overlays.Settings.Sections.Input
tablet.BindTo(tabletHandler.Tablet); tablet.BindTo(tabletHandler.Tablet);
tablet.BindValueChanged(val => tablet.BindValueChanged(val =>
{ {
Scheduler.AddOnce(toggleVisibility);
var tab = val.NewValue; var tab = val.NewValue;
bool tabletFound = tab != null; bool tabletFound = tab != null;
if (!tabletFound) if (!tabletFound)
{
mainSettings.Hide();
noTabletMessage.Show();
return; return;
}
mainSettings.Show();
noTabletMessage.Hide();
offsetX.MaxValue = tab.Size.X; offsetX.MaxValue = tab.Size.X;
offsetX.Default = tab.Size.X / 2; offsetX.Default = tab.Size.X / 2;
@ -222,6 +216,21 @@ namespace osu.Game.Overlays.Settings.Sections.Input
}, true); }, true);
} }
private void toggleVisibility()
{
bool tabletFound = tablet.Value != null;
if (!tabletFound)
{
mainSettings.Hide();
noTabletMessage.Show();
return;
}
mainSettings.Show();
noTabletMessage.Hide();
}
private void applyAspectRatio(BindableNumber<float> sizeChanged) private void applyAspectRatio(BindableNumber<float> sizeChanged)
{ {
try try