From 8e06e4c5c25644f5899e5c504f4435769704d170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 13 Feb 2026 17:50:46 +0100 Subject: [PATCH] iOS: Delete untested multi-screen-management code that uses deprecated APIs --- CMakeLists.txt | 3 - Windows/PPSSPP.vcxproj | 18 +--- Windows/PPSSPP.vcxproj.filters | 8 +- ios/DisplayManager.h | 24 ----- ios/DisplayManager.mm | 167 --------------------------------- ios/ViewController.mm | 7 +- ios/ViewControllerCommon.h | 1 + ios/ViewControllerCommon.mm | 22 +++++ ios/ViewControllerMetal.mm | 9 +- 9 files changed, 30 insertions(+), 229 deletions(-) delete mode 100644 ios/DisplayManager.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 094e03d9de..5c5228f9d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1371,8 +1371,6 @@ elseif(IOS AND NOT LIBRETRO) ios/AppDelegate.h ios/SceneDelegate.mm ios/SceneDelegate.h - ios/DisplayManager.h - ios/DisplayManager.mm ios/Controls.h ios/Controls.mm ios/ViewControllerCommon.h @@ -1421,7 +1419,6 @@ elseif(IOS AND NOT LIBRETRO) ios/CameraHelper.mm ios/AudioEngine.mm ios/LocationHelper.mm - ios/DisplayManager.mm ios/Controls.mm UI/DarwinFileSystemServices.mm Common/Battery/AppleBatteryClient.m diff --git a/Windows/PPSSPP.vcxproj b/Windows/PPSSPP.vcxproj index 4d0ffa6c42..ce02ea5f10 100644 --- a/Windows/PPSSPP.vcxproj +++ b/Windows/PPSSPP.vcxproj @@ -804,14 +804,6 @@ true true - - true - true - true - true - true - true - true true @@ -1241,14 +1233,6 @@ true true - - true - true - true - true - true - true - true true @@ -1442,4 +1426,4 @@ - \ No newline at end of file + diff --git a/Windows/PPSSPP.vcxproj.filters b/Windows/PPSSPP.vcxproj.filters index 1a9b175941..0c700e2048 100644 --- a/Windows/PPSSPP.vcxproj.filters +++ b/Windows/PPSSPP.vcxproj.filters @@ -433,9 +433,6 @@ Other Platforms\iOS - - Other Platforms\iOS - Other Platforms\iOS @@ -689,9 +686,6 @@ Other Platforms\iOS - - Other Platforms\iOS - Other Platforms\iOS @@ -871,4 +865,4 @@ Other Platforms\SDL - \ No newline at end of file + diff --git a/ios/DisplayManager.h b/ios/DisplayManager.h deleted file mode 100644 index fb46707a19..0000000000 --- a/ios/DisplayManager.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// DisplayManager.h -// native -// -// Created by xieyi on 2019/6/9. -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface DisplayManager : NSObject - -- (void)setupDisplayListener; -- (void)updateResolution:(UIScreen *)screen; - -@property (nonatomic, strong) UIScreen *mainScreen; - -@property (class, readonly, strong) DisplayManager *shared; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ios/DisplayManager.mm b/ios/DisplayManager.mm index a8b72cb912..e69de29bb2 100644 --- a/ios/DisplayManager.mm +++ b/ios/DisplayManager.mm @@ -1,167 +0,0 @@ -// -// DisplayManager.m -// native -// -// Created by xieyi on 2019/6/9. -// - -#import "DisplayManager.h" -#import "iOSCoreAudio.h" -#import "ViewController.h" -#import "AppDelegate.h" -#include "Common/System/Display.h" -#include "Common/System/System.h" -#include "Common/System/NativeApp.h" -#include "Core/System.h" -#include "Core/Config.h" -#include "Core/ConfigValues.h" - -#import - -#define IS_IPAD() ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) - -@interface DisplayManager () - -@property BOOL listenerActive; -@property (atomic, retain) NSMutableArray *extDisplays; -@property CGRect originalFrame; -@property CGRect originalBounds; -@property CGAffineTransform originalTransform; - -- (void)updateScreen:(UIScreen *)screen; - -@end - -@implementation DisplayManager - -- (instancetype)init -{ - self = [super init]; - if (self) { - [self setListenerActive:NO]; - [self setExtDisplays:[[NSMutableArray alloc] init]]; - } - return self; -} - -+ (DisplayManager *)shared { - static DisplayManager *sharedInstance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - sharedInstance = [[DisplayManager alloc] init]; - }); - return sharedInstance; -} - -- (void)setupDisplayListener { - // Disable external display by default - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enable_external_display"] == NO) { - return; - } - if ([self listenerActive]) { - NSLog(@"setupDisplayListener already called"); - return; - } - NSLog(@"Setting up display manager"); - [self setMainScreen:[UIScreen mainScreen]]; - UIWindow *gameWindow = [(AppDelegate *)[[UIApplication sharedApplication] delegate] window]; - [self setOriginalFrame: [gameWindow frame]]; - [self setOriginalBounds:[gameWindow bounds]]; - [self setOriginalTransform:[gameWindow transform]]; - - // TODO: From iOS 13, should use UIScreenDidConnectNotification instead of the below. - - // Display connected - [[NSNotificationCenter defaultCenter] addObserverForName:UIScreenDidConnectNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull notification) { - UIScreen *screen = (UIScreen *) notification.object; - NSLog(@"New display connected: %@", [screen debugDescription]); - [[self extDisplays] addObject:screen]; - // Do not switch to second connected display - if ([self mainScreen] != [UIScreen mainScreen]) { - return; - } - // Ignore mute switch when connected to external display - iOSCoreAudioSetDisplayConnected(true); - [self updateScreen:screen]; - }]; - // Display disconnected - [[NSNotificationCenter defaultCenter] addObserverForName:UIScreenDidDisconnectNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull notification) { - UIScreen *screen = (UIScreen *) notification.object; - NSLog(@"Display disconnected: %@", [screen debugDescription]); - if ([[self extDisplays] containsObject:screen]) { - [[self extDisplays] removeObject:screen]; - } - if ([[self extDisplays] count] > 0) { - UIScreen *newScreen = [[self extDisplays] lastObject]; - [self updateScreen:newScreen]; - } else { - iOSCoreAudioSetDisplayConnected(false); - [self updateScreen:[UIScreen mainScreen]]; - } - }]; - [self setListenerActive:YES]; -} - -- (void)updateScreen:(UIScreen *)screen { - [self setMainScreen:screen]; - UIWindow *gameWindow = [(AppDelegate *)[[UIApplication sharedApplication] delegate] window]; - // Hide before moving window to external display, otherwise iPhone won't switch to it - [gameWindow setHidden:YES]; - [gameWindow setScreen:screen]; - // Set optimal resolution - // Dispatch later to prevent "no window is preset" error - dispatch_async(dispatch_get_main_queue(), ^{ - if (screen != [UIScreen mainScreen]) { - NSUInteger count = [[screen availableModes] count]; - UIScreenMode* mode = [screen availableModes][count - 1]; - [screen setCurrentMode:mode]; - mode = [screen currentMode]; - // Fix overscan - // TODO: Hacky solution. Screen is still scaled even if UIScreenOverscanCompensationNone is set. - [screen setOverscanCompensation:UIScreenOverscanCompensationNone]; - CGSize fullSize = mode.size; - UIEdgeInsets insets = [screen overscanCompensationInsets]; - fullSize.width -= insets.left + insets.right; - fullSize.height -= insets.top + insets.bottom; - [gameWindow setFrame:CGRectMake(insets.left, insets.top, fullSize.width, fullSize.height)]; - [gameWindow setBounds:CGRectMake(0, 0, fullSize.width, fullSize.height)]; - [self updateResolution:screen]; - [gameWindow setTransform:CGAffineTransformMakeScale(mode.size.width / fullSize.width, mode.size.height / fullSize.height)]; - } else { - [gameWindow setTransform:[self originalTransform]]; - [gameWindow setFrame:[self originalFrame]]; - [gameWindow setBounds:[self originalBounds]]; - [self updateResolution:screen]; - } - [gameWindow setHidden:NO]; - }); -} - -- (void)updateResolution:(UIScreen *)screen { - float scale = screen.nativeScale; - CGSize size = screen.bounds.size; - - float dpi; - if (screen == [UIScreen mainScreen]) { - dpi = (IS_IPAD() ? 200.0f : 150.0f) * scale; - } else { - float diagonal = sqrt(size.height * size.height + size.width * size.width); - dpi = diagonal * scale * 0.1f; - } - - const float dpi_scale_x = 240.0f / dpi; - const float dpi_scale_y = 240.0f / dpi; - g_display.Recalculate(size.width * scale, size.height * scale, dpi_scale_x, dpi_scale_y, UIScaleFactorToMultiplier(g_Config.iUIScaleFactor)); - - [[sharedViewController getView] setContentScaleFactor:scale]; - - // PSP native resize - PSP_CoreParameter().pixelWidth = g_display.pixel_xres; - PSP_CoreParameter().pixelHeight = g_display.pixel_yres; - - NativeResized(); - - NSLog(@"Updated display resolution: (%d, %d) @%.1fx", g_display.pixel_xres, g_display.pixel_yres, scale); -} - -@end diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 3cd171d3f2..f555f5f435 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -7,7 +7,6 @@ #import "AppDelegate.h" #import "ViewController.h" -#import "DisplayManager.h" #import "iOSCoreAudio.h" #import @@ -216,8 +215,6 @@ void GLRenderLoop(IOSGLESContext *graphicsContext) { self.lastTimestamp = 0; - [[DisplayManager shared] setupDisplayListener]; - UIScreen* screen = [(AppDelegate*)[UIApplication sharedApplication].delegate screen]; self.view.frame = [screen bounds]; self.view.multipleTouchEnabled = YES; @@ -317,7 +314,7 @@ void GLRenderLoop(IOSGLESContext *graphicsContext) { INFO_LOG(Log::System, "didBecomeActive begin"); [self runGLRenderLoop]; - [[DisplayManager shared] updateResolution:[UIScreen mainScreen]]; + [self updateResolution:[UIScreen mainScreen]]; INFO_LOG(Log::System, "didBecomeActive end"); @@ -387,7 +384,7 @@ void GLRenderLoop(IOSGLESContext *graphicsContext) { // Reinitialize graphics context to match new size [self requestExitGLRenderLoop]; [self runGLRenderLoop]; - [[DisplayManager shared] updateResolution:[UIScreen mainScreen]]; + [self updateResolution:[UIScreen mainScreen]]; }]; } diff --git a/ios/ViewControllerCommon.h b/ios/ViewControllerCommon.h index 6307ea0244..76e4e93b78 100644 --- a/ios/ViewControllerCommon.h +++ b/ios/ViewControllerCommon.h @@ -32,6 +32,7 @@ - (void)uiStateChanged; - (void)pickPhoto:(NSString *)saveFilename requestId:(int)requestId; +- (void)updateResolution:(UIScreen *)screen; @end diff --git a/ios/ViewControllerCommon.mm b/ios/ViewControllerCommon.mm index 8019daa8cc..05cb249cf3 100644 --- a/ios/ViewControllerCommon.mm +++ b/ios/ViewControllerCommon.mm @@ -5,6 +5,7 @@ #include "Common/System/Request.h" #include "Common/Input/InputState.h" #include "Common/System/NativeApp.h" +#include "Common/System/Display.h" #include "Common/Log.h" #include "Core/HLE/sceUsbCam.h" #include "Core/HLE/sceUsbGps.h" @@ -441,4 +442,25 @@ extern float g_safeInsetBottom; [self setNeedsStatusBarAppearanceUpdate]; } +- (void)updateResolution:(UIScreen *)screen { + float scale = screen.nativeScale; + CGSize size = screen.bounds.size; + + float dpi = (IS_IPAD() ? 200.0f : 150.0f) * scale; + + const float dpi_scale_x = 240.0f / dpi; + const float dpi_scale_y = 240.0f / dpi; + g_display.Recalculate(size.width * scale, size.height * scale, dpi_scale_x, dpi_scale_y, UIScaleFactorToMultiplier(g_Config.iUIScaleFactor)); + + [[sharedViewController getView] setContentScaleFactor:scale]; + + // PSP native resize + PSP_CoreParameter().pixelWidth = g_display.pixel_xres; + PSP_CoreParameter().pixelHeight = g_display.pixel_yres; + + NativeResized(); + + NSLog(@"Updated display resolution: (%d, %d) @%.1fx", g_display.pixel_xres, g_display.pixel_yres, scale); +} + @end diff --git a/ios/ViewControllerMetal.mm b/ios/ViewControllerMetal.mm index da01243c39..e3f71d5a59 100644 --- a/ios/ViewControllerMetal.mm +++ b/ios/ViewControllerMetal.mm @@ -1,6 +1,5 @@ #import "AppDelegate.h" #import "ViewControllerMetal.h" -#import "DisplayManager.h" #import "iOSCoreAudio.h" #include "Common/Log.h" @@ -296,7 +295,7 @@ void VulkanRenderLoop(IOSVulkanContext *graphicsContext, CAMetalLayer *metalLaye // Spin up the emu thread. It will in turn spin up the Vulkan render thread // on its own. [self runVulkanRenderLoop]; - [[DisplayManager shared] updateResolution:[UIScreen mainScreen]]; + [self updateResolution:[UIScreen mainScreen]]; } - (void)willResignActive { @@ -340,8 +339,6 @@ void VulkanRenderLoop(IOSVulkanContext *graphicsContext, CAMetalLayer *metalLaye [super viewDidLoad]; [self hideKeyboard]; - [[DisplayManager shared] setupDisplayListener]; - INFO_LOG(Log::System, "Metal viewDidLoad"); UIScreen* screen = [(AppDelegate*)[UIApplication sharedApplication].delegate screen]; @@ -352,7 +349,7 @@ void VulkanRenderLoop(IOSVulkanContext *graphicsContext, CAMetalLayer *metalLaye graphicsContext = new IOSVulkanContext(); - [[DisplayManager shared] updateResolution:[UIScreen mainScreen]]; + [self updateResolution:[UIScreen mainScreen]]; if (!graphicsContext->InitAPI()) { _assert_msg_(false, "Failed to init Vulkan"); @@ -403,7 +400,7 @@ void VulkanRenderLoop(IOSVulkanContext *graphicsContext, CAMetalLayer *metalLaye // Reinitialize graphics context to match new size [self requestExitVulkanRenderLoop]; [self runVulkanRenderLoop]; - [[DisplayManager shared] updateResolution:[UIScreen mainScreen]]; + [self updateResolution:[UIScreen mainScreen]]; }]; }