diff --git a/osu.Framework/Graphics/UserInterface/BasicDirectorySelector.cs b/osu.Framework/Graphics/UserInterface/BasicDirectorySelector.cs index d0843a243..33d11129e 100644 --- a/osu.Framework/Graphics/UserInterface/BasicDirectorySelector.cs +++ b/osu.Framework/Graphics/UserInterface/BasicDirectorySelector.cs @@ -5,6 +5,7 @@ using System.IO; using osu.Framework.Graphics.Containers; +using osu.Framework.Localisation; using osuTK; namespace osu.Framework.Graphics.UserInterface @@ -20,7 +21,7 @@ namespace osu.Framework.Graphics.UserInterface Action = ShowHiddenItems.Toggle, }; - protected override DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, string displayName = null) => new BasicDirectorySelectorDirectory(directory, displayName); + protected override DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, LocalisableString? displayName = null) => new BasicDirectorySelectorDirectory(directory, displayName); protected override DirectorySelectorDirectory CreateParentDirectoryItem(DirectoryInfo directory) => new BasicDirectorySelectorParentDirectory(directory); diff --git a/osu.Framework/Graphics/UserInterface/BasicDirectorySelectorBreadcrumbDisplay.cs b/osu.Framework/Graphics/UserInterface/BasicDirectorySelectorBreadcrumbDisplay.cs index b98baacbf..ee3a8beaa 100644 --- a/osu.Framework/Graphics/UserInterface/BasicDirectorySelectorBreadcrumbDisplay.cs +++ b/osu.Framework/Graphics/UserInterface/BasicDirectorySelectorBreadcrumbDisplay.cs @@ -6,6 +6,7 @@ using System.IO; using osu.Framework.Allocation; using osu.Framework.Graphics.Sprites; +using osu.Framework.Localisation; using osuTK; namespace osu.Framework.Graphics.UserInterface @@ -20,7 +21,7 @@ namespace osu.Framework.Graphics.UserInterface protected override DirectorySelectorDirectory CreateRootDirectoryItem() => new BreadcrumbDisplayComputer(); - protected override DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, string displayName = null) => new BreadcrumbDisplayDirectory(directory, displayName); + protected override DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, LocalisableString? displayName = null) => new BreadcrumbDisplayDirectory(directory, displayName); protected partial class BreadcrumbDisplayComputer : BreadcrumbDisplayDirectory { @@ -36,7 +37,7 @@ namespace osu.Framework.Graphics.UserInterface { protected override IconUsage? Icon => Directory.Name.Contains(Path.DirectorySeparatorChar) ? base.Icon : null; - public BreadcrumbDisplayDirectory(DirectoryInfo directory, string displayName = null) + public BreadcrumbDisplayDirectory(DirectoryInfo directory, LocalisableString? displayName = null) : base(directory, displayName) { } diff --git a/osu.Framework/Graphics/UserInterface/BasicDirectorySelectorDirectory.cs b/osu.Framework/Graphics/UserInterface/BasicDirectorySelectorDirectory.cs index 7ab9c2e53..6ad055db7 100644 --- a/osu.Framework/Graphics/UserInterface/BasicDirectorySelectorDirectory.cs +++ b/osu.Framework/Graphics/UserInterface/BasicDirectorySelectorDirectory.cs @@ -5,6 +5,7 @@ using System.IO; using osu.Framework.Graphics.Sprites; +using osu.Framework.Localisation; namespace osu.Framework.Graphics.UserInterface { @@ -19,7 +20,7 @@ namespace osu.Framework.Graphics.UserInterface Font = FrameworkFont.Regular.With(size: FONT_SIZE) }; - public BasicDirectorySelectorDirectory(DirectoryInfo directory, string displayName = null) + public BasicDirectorySelectorDirectory(DirectoryInfo directory, LocalisableString? displayName = null) : base(directory, displayName) { } diff --git a/osu.Framework/Graphics/UserInterface/BasicFileSelector.cs b/osu.Framework/Graphics/UserInterface/BasicFileSelector.cs index 35622d9f6..4d2cd5073 100644 --- a/osu.Framework/Graphics/UserInterface/BasicFileSelector.cs +++ b/osu.Framework/Graphics/UserInterface/BasicFileSelector.cs @@ -6,6 +6,7 @@ using System.IO; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; +using osu.Framework.Localisation; using osuTK; namespace osu.Framework.Graphics.UserInterface @@ -26,7 +27,7 @@ namespace osu.Framework.Graphics.UserInterface Action = ShowHiddenItems.Toggle, }; - protected override DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, string displayName = null) => new BasicDirectorySelectorDirectory(directory, displayName); + protected override DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, LocalisableString? displayName = null) => new BasicDirectorySelectorDirectory(directory, displayName); protected override DirectorySelectorDirectory CreateParentDirectoryItem(DirectoryInfo directory) => new BasicDirectorySelectorParentDirectory(directory); diff --git a/osu.Framework/Graphics/UserInterface/DirectorySelector.cs b/osu.Framework/Graphics/UserInterface/DirectorySelector.cs index 69979ca10..d2ef6bfcc 100644 --- a/osu.Framework/Graphics/UserInterface/DirectorySelector.cs +++ b/osu.Framework/Graphics/UserInterface/DirectorySelector.cs @@ -11,6 +11,7 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.EnumExtensions; using osu.Framework.Graphics.Containers; +using osu.Framework.Localisation; using osu.Framework.Platform; using osuTK; @@ -42,7 +43,7 @@ namespace osu.Framework.Graphics.UserInterface /// protected virtual Drawable CreateHiddenToggleButton() => Empty(); - protected abstract DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, string displayName = null); + protected abstract DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, LocalisableString? displayName = null); /// /// Create the directory item that resolves the parent directory. diff --git a/osu.Framework/Graphics/UserInterface/DirectorySelectorBreadcrumbDisplay.cs b/osu.Framework/Graphics/UserInterface/DirectorySelectorBreadcrumbDisplay.cs index 59f182853..fb8d045ae 100644 --- a/osu.Framework/Graphics/UserInterface/DirectorySelectorBreadcrumbDisplay.cs +++ b/osu.Framework/Graphics/UserInterface/DirectorySelectorBreadcrumbDisplay.cs @@ -10,6 +10,7 @@ using JetBrains.Annotations; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics.Containers; +using osu.Framework.Localisation; using osuTK; namespace osu.Framework.Graphics.UserInterface @@ -25,7 +26,7 @@ namespace osu.Framework.Graphics.UserInterface /// /// Create a directory item in the breadcrumb trail. /// - protected abstract DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, string displayName = null); + protected abstract DirectorySelectorDirectory CreateDirectoryItem(DirectoryInfo directory, LocalisableString? displayName = null); /// /// Create the root directory item in the breadcrumb trail. diff --git a/osu.Framework/Graphics/UserInterface/DirectorySelectorDirectory.cs b/osu.Framework/Graphics/UserInterface/DirectorySelectorDirectory.cs index 2fd30a135..4fe303ac5 100644 --- a/osu.Framework/Graphics/UserInterface/DirectorySelectorDirectory.cs +++ b/osu.Framework/Graphics/UserInterface/DirectorySelectorDirectory.cs @@ -9,6 +9,7 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Input.Events; using osu.Framework.Extensions.EnumExtensions; +using osu.Framework.Localisation; namespace osu.Framework.Graphics.UserInterface { @@ -20,7 +21,7 @@ namespace osu.Framework.Graphics.UserInterface [Resolved] private Bindable currentDirectory { get; set; } - protected DirectorySelectorDirectory(DirectoryInfo directory, string displayName = null) + protected DirectorySelectorDirectory(DirectoryInfo directory, LocalisableString? displayName = null) : base(displayName) { Directory = directory; diff --git a/osu.Framework/Graphics/UserInterface/DirectorySelectorItem.cs b/osu.Framework/Graphics/UserInterface/DirectorySelectorItem.cs index 53553b6f5..9af9913f4 100644 --- a/osu.Framework/Graphics/UserInterface/DirectorySelectorItem.cs +++ b/osu.Framework/Graphics/UserInterface/DirectorySelectorItem.cs @@ -6,13 +6,14 @@ using osu.Framework.Allocation; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; +using osu.Framework.Localisation; using osuTK; namespace osu.Framework.Graphics.UserInterface { public abstract partial class DirectorySelectorItem : CompositeDrawable { - private readonly string displayName; + private readonly LocalisableString? displayName; /// /// Gets or sets the font size of this 's icon and text. @@ -31,7 +32,7 @@ namespace osu.Framework.Graphics.UserInterface protected FillFlowContainer Flow; - protected DirectorySelectorItem(string displayName = null) + protected DirectorySelectorItem(LocalisableString? displayName = null) { this.displayName = displayName; } diff --git a/osu.Framework/Platform/SDL3/SDL3Window_Input.cs b/osu.Framework/Platform/SDL3/SDL3Window_Input.cs index 73cb15526..4f10522e6 100644 --- a/osu.Framework/Platform/SDL3/SDL3Window_Input.cs +++ b/osu.Framework/Platform/SDL3/SDL3Window_Input.cs @@ -533,11 +533,36 @@ namespace osu.Framework.Platform.SDL3 private void handleKeymapChangedEvent() => KeymapChanged?.Invoke(); + private readonly bool penProximityWorkaround = RuntimeInfo.OS == RuntimeInfo.Platform.Android; + + private bool tryGetPenDeviceType(SDL_PenID penID, out TabletPenDeviceType deviceType) + { + if (penDeviceTypes.TryGetValue(penID, out deviceType)) + return true; + + // Workaround for Android: after clicking with a pen, it can send motion and touch events even though we've received SDL_EVENT_PEN_PROXIMITY_OUT. + // It's either a bug in Android or SDL. + // Instead of ignoring those events, fetch the type and store it. + if (penProximityWorkaround) + { + var sdlType = SDL_GetPenDeviceType(penID); + + if (sdlType == SDL_PenDeviceType.SDL_PEN_DEVICE_TYPE_INVALID) + return false; + + deviceType = sdlType.ToTabletPenDeviceType(); + penDeviceTypes[penID] = deviceType; + return true; + } + + return false; + } + private void handlePenProximityEvent(SDL_PenProximityEvent evtPenProximity) { if (evtPenProximity.type == SDL_EventType.SDL_EVENT_PEN_PROXIMITY_IN) { - if (penDeviceTypes.ContainsKey(evtPenProximity.which)) + if (!penProximityWorkaround && penDeviceTypes.ContainsKey(evtPenProximity.which)) Logger.Log($"Unexpected SDL_EVENT_PEN_PROXIMITY_IN for pen id={evtPenProximity.which}. Pen already in proximity.", level: LogLevel.Important); penDeviceTypes[evtPenProximity.which] = SDL_GetPenDeviceType(evtPenProximity.which).ThrowIfFailed().ToTabletPenDeviceType(); @@ -551,7 +576,7 @@ namespace osu.Framework.Platform.SDL3 private void handlePenMotionEvent(SDL_PenMotionEvent evtPenMotion) { - if (penDeviceTypes.TryGetValue(evtPenMotion.which, out var type)) + if (tryGetPenDeviceType(evtPenMotion.which, out var type)) PenMove?.Invoke(type, new Vector2(evtPenMotion.x, evtPenMotion.y) * Scale, evtPenMotion.pen_state.HasFlagFast(SDL_PenInputFlags.SDL_PEN_INPUT_DOWN)); else Logger.Log($"Unexpected SDL_EVENT_PEN_MOTION for pen id={evtPenMotion.which}. Pen not in proximity.", level: LogLevel.Important); @@ -559,7 +584,7 @@ namespace osu.Framework.Platform.SDL3 private void handlePenTouchEvent(SDL_PenTouchEvent evtPenTouch) { - if (penDeviceTypes.TryGetValue(evtPenTouch.which, out var type)) + if (tryGetPenDeviceType(evtPenTouch.which, out var type)) PenTouch?.Invoke(type, evtPenTouch.down, new Vector2(evtPenTouch.x, evtPenTouch.y) * Scale); else Logger.Log($"Unexpected {evtPenTouch.type} for pen id={evtPenTouch.which}. Pen not in proximity.", level: LogLevel.Important);