device.py (24329B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\services\device.py 2 import sys 3 import time 4 import blue 5 import eveformat 6 import uthread 7 import trinity 8 import log 9 import localization 10 import monolithsentry 11 import sentry_sdk 12 import evegraphics.settings as gfxsettings 13 from carbonui import uiconst 14 from carbonui.services import deviceSignals 15 from carbonui.uicore import uicore, GetWindowName 16 from carbon.common.script.sys import service 17 from carbon.common.script.sys.serviceManager import ServiceManager 18 from carbonui.window.layout import apply_desktop_window_layout, capture_desktop_window_layout 19 MINIMUM_WINDOW_SIZE = (1024, 700) 20 SCALE_VALUES = (0.9, 1.0, 1.1, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 4.0) 21 22 def _GetClientSettings(): 23 return settings 24 25 26 def _GetWindowModeSettingsKey(windowMode): 27 if windowMode == trinity.Tr2WindowMode.FULL_SCREEN: 28 return gfxsettings.GFX_FULL_SCREEN_MODE_SETTINGS 29 if windowMode == trinity.Tr2WindowMode.WINDOWED: 30 return gfxsettings.GFX_WINDOWED_MODE_SETTINGS 31 if windowMode == trinity.Tr2WindowMode.FIXED_WINDOW: 32 return gfxsettings.GFX_FIXED_WINDOW_MODE_SETTINGS 33 raise ValueError() 34 35 36 def _SaveStateSettings(state): 37 key = _GetWindowModeSettingsKey(state.windowMode) 38 settings = {'adapter': state.adapter, 39 'width': state.width, 40 'height': state.height, 41 'presentInterval': state.presentInterval} 42 if state.windowMode == trinity.Tr2WindowMode.WINDOWED: 43 settings['left'] = state.left 44 settings['top'] = state.top 45 settings['showState'] = state.showState 46 gfxsettings.Set(key, settings, pending=False) 47 48 49 def _ConstraintResolution(state, maxResolution): 50 if maxResolution is None: 51 return False 52 r = min(state.width, state.height) 53 if r > maxResolution: 54 if r == state.height: 55 state.width = 0 56 state.height = maxResolution 57 else: 58 state.height = 0 59 state.width = maxResolution 60 return True 61 return False 62 63 64 def _LoadStateSettings(windowMode): 65 key = _GetWindowModeSettingsKey(windowMode) 66 state = trinity.mainWindow.GetDefaultState(windowMode) 67 settings = gfxsettings.Get(key, None) 68 if settings is None: 69 if windowMode == trinity.Tr2WindowMode.FULL_SCREEN: 70 res = gfxsettings.GetMaximumDefaultResolution() 71 if _ConstraintResolution(state, res): 72 trinity.mainWindow.SanitizeState(state) 73 log.LogNotice('Constraining default fullscreen resolution to %sx%s' % (state.width, state.height)) 74 return state 75 try: 76 _LoadStateSettingsFromDict(state, settings) 77 except: 78 log.LogException() 79 sys.exc_clear() 80 return trinity.mainWindow.GetDefaultState(windowMode) 81 82 return state 83 84 85 def _LoadStateSettingsFromDict(state, settings): 86 state.adapter = int(settings.get('adapter', 0)) 87 state.presentInterval = int(settings.get('presentInterval', trinity.PRESENT_INTERVAL.ONE)) 88 state.width = int(settings.get('width', 0)) 89 state.height = int(settings.get('height', 0)) 90 if state.windowMode == trinity.Tr2WindowMode.WINDOWED: 91 if 'left' in settings and 'top' in settings: 92 state.left = int(settings['left']) 93 state.top = int(settings['top']) 94 else: 95 cm = trinity.adapters.GetCurrentDisplayMode(state.adapter) 96 state.left = (cm.width - state.width) / 2 97 state.top = (cm.height - state.height) / 2 98 state.showState = settings.get('showState', trinity.Tr2WindowShowState.NORMAL) 99 100 101 def _ConvertOldStateSettings(settings): 102 return {'adapter': settings.get('Adapter', 0), 103 'width': settings.get('BackBufferWidth', 0), 104 'height': settings.get('BackBufferHeight', 0), 105 'presentInterval': settings.get('PresentationInterval', trinity.PRESENT_INTERVAL.ONE)} 106 107 108 def _HasNewStateSettings(): 109 if gfxsettings.Get(gfxsettings.GFX_FULL_SCREEN_MODE_SETTINGS, None): 110 return True 111 if gfxsettings.Get(gfxsettings.GFX_WINDOWED_MODE_SETTINGS, None): 112 return True 113 if gfxsettings.Get(gfxsettings.GFX_FIXED_WINDOW_MODE_SETTINGS, None): 114 return True 115 return False 116 117 118 def HasOldUpscaling(): 119 return gfxsettings.Get(gfxsettings.GFX_FSR_MODE, 0) != 0 120 121 122 class DeviceMgr(service.Service): 123 __guid__ = 'svc.device' 124 __servicename__ = 'device' 125 __displayname__ = 'Device Service' 126 __startupdependencies__ = ['settings'] 127 __exportedcalls__ = {'SetDevice': [], 128 'GetSettings': [], 129 'ResetMonitor': [], 130 'ToggleWindowed': [], 131 'CreateDevice': [], 132 'GetResolutionOptions': [], 133 'GetPresentationIntervalOptions': []} 134 135 def __init__(self): 136 super(DeviceMgr, self).__init__() 137 self._aaTypes = [] 138 self._settings = {} 139 140 def _MigrateSettings(self): 141 personal = gfxsettings.Get(gfxsettings.GFX_DEVICE_SETTINGS).copy() 142 if 'PresentationInterval' in personal and personal['PresentationInterval'] & 16 == 0: 143 self.LogInfo('Upgrading PresentationInterval setting') 144 if personal['PresentationInterval'] == -2147483648: 145 personal['PresentationInterval'] = trinity.PRESENT_INTERVAL.IMMEDIATE 146 elif personal['PresentationInterval'] == 0: 147 personal['PresentationInterval'] = trinity.PRESENT_INTERVAL.ONE 148 else: 149 personal['PresentationInterval'] = trinity.PRESENT_INTERVAL.ONE + personal['PresentationInterval'] - 1 150 if gfxsettings.Get(gfxsettings.GFX_WINDOW_BORDER_FIXED, False): 151 _LoadStateSettingsFromDict(self._settings[trinity.Tr2WindowMode.FIXED_WINDOW], _ConvertOldStateSettings(personal)) 152 gfxsettings.Set(gfxsettings.GFX_WINDOW_MODE, 2, False) 153 elif personal.get('Windowed', False): 154 _LoadStateSettingsFromDict(self._settings[trinity.Tr2WindowMode.WINDOWED], _ConvertOldStateSettings(personal)) 155 gfxsettings.Set(gfxsettings.GFX_WINDOW_MODE, 1, False) 156 else: 157 _LoadStateSettingsFromDict(self._settings[trinity.Tr2WindowMode.FULL_SCREEN], _ConvertOldStateSettings(personal)) 158 gfxsettings.Set(gfxsettings.GFX_WINDOW_MODE, 0, False) 159 resolution = gfxsettings.Get(gfxsettings.GFX_RESOLUTION_WINDOWED) 160 if resolution: 161 self._settings[trinity.Tr2WindowMode.WINDOWED].width = resolution[0] 162 self._settings[trinity.Tr2WindowMode.WINDOWED].height = resolution[1] 163 resolution = gfxsettings.Get(gfxsettings.GFX_RESOLUTION_FULLSCREEN) 164 if resolution: 165 self._settings[trinity.Tr2WindowMode.FULL_SCREEN].width = resolution[0] 166 self._settings[trinity.Tr2WindowMode.FULL_SCREEN].height = resolution[1] 167 168 def Run(self, memStream = None): 169 self.LogInfo('Starting DeviceMgr') 170 gfx = gfxsettings.GraphicsSettings.GetGlobal() 171 gfx.InitializeSettingsGroup(gfxsettings.SETTINGS_GROUP_DEVICE, _GetClientSettings().public.device) 172 self._ApplyDeviceIndependentSettings() 173 monolithsentry.set_sentry_crash_key() 174 175 def _ApplyDeviceIndependentSettings(self): 176 if not _GetClientSettings().public.generic.Get('resourceUnloading', 1): 177 trinity.SetEveSpaceObjectResourceUnloadingEnabled(0) 178 blue.classes.maxPendingDeletes = 20000 179 blue.classes.maxTimeForPendingDeletes = 4.0 180 blue.classes.pendingDeletesEnabled = True 181 trinity.device.disableAsyncLoad = not bool(_GetClientSettings().public.generic.Get('asyncLoad', 1)) 182 gfxsettings.ValidateSettings() 183 aaQuality = gfxsettings.Get(gfxsettings.GFX_ANTI_ALIASING) 184 brightness = gfxsettings.Get(gfxsettings.GFX_BRIGHTNESS) 185 trinity.settings.SetValue('eveSpaceSceneGammaBrightness', brightness) 186 trinity.device.mipLevelSkipCount = gfxsettings.Get(gfxsettings.GFX_TEXTURE_QUALITY) 187 self.SetResourceCacheSize() 188 trinity.SetShaderModel(self._GetAppShaderModel()) 189 for k, v in self._GetAppSettings().iteritems(): 190 trinity.settings.SetValue(k, v) 191 192 for path in self._GetAppMipLevelSkipExclusionDirectories(): 193 trinity.AddMipLevelSkipExclusionDirectory(path) 194 195 try: 196 trinity.settings.SetValue('fixFullscreenBehaviorForOldWindows', blue.sysinfo.os.majorVersion < 10) 197 except LookupError: 198 pass 199 200 def Initialize(self): 201 trinity.adapters.Refresh() 202 adapters = list(range(trinity.adapters.GetAdapterCount())) 203 if not adapters: 204 self.LogError('No valid display adapter found') 205 blue.os.Terminate(12) 206 self.LogInfo('Found valid display adapters: %s' % adapters) 207 self._settings = {i:_LoadStateSettings(i) for i in (trinity.Tr2WindowMode.FULL_SCREEN, trinity.Tr2WindowMode.WINDOWED, trinity.Tr2WindowMode.FIXED_WINDOW)} 208 if not _HasNewStateSettings(): 209 if gfxsettings.Get(gfxsettings.GFX_DEVICE_SETTINGS): 210 self.LogInfo('No new-style settings found, reading old settings') 211 self._MigrateSettings() 212 else: 213 self.LogInfo('No stored settings found') 214 fullscreen = self._settings[trinity.Tr2WindowMode.FULL_SCREEN] 215 aa = gfxsettings.GetDefaultAntiAliasingQuality(fullscreen.width, fullscreen.height) 216 gfxsettings.Set(gfxsettings.GFX_ANTI_ALIASING, min(gfxsettings.Get(gfxsettings.GFX_ANTI_ALIASING), aa), pending=False) 217 if HasOldUpscaling(): 218 hasNewSettings = gfxsettings.Get(gfxsettings.GFX_UPSCALING_TECHNIQUE, gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE) != gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE 219 oldSetting = gfxsettings.Get(gfxsettings.GFX_FSR_MODE, 0) 220 if not hasNewSettings and oldSetting != 0: 221 gfxsettings.Set(gfxsettings.GFX_UPSCALING_TECHNIQUE, gfxsettings.GFX_UPSCALING_TECHNIQUE_FSR1, False) 222 gfxsettings.Set(gfxsettings.GFX_UPSCALING_SETTING, 2 ** oldSetting, False) 223 if oldSetting != 0: 224 gfxsettings.Set(gfxsettings.GFX_FSR_MODE, 0, False) 225 if not trinity.settings.GetValue('newUpscalersEnabled') and gfxsettings.Get(gfxsettings.GFX_UPSCALING_TECHNIQUE, gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE) not in (gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE, gfxsettings.GFX_UPSCALING_TECHNIQUE_FSR1): 226 gfxsettings.Set(gfxsettings.GFX_UPSCALING_TECHNIQUE, gfxsettings.GFX_UPSCALING_TECHNIQUE_NONE, False) 227 for each in self._settings.values(): 228 trinity.mainWindow.StoreStateSettings(each) 229 230 self.LogInfo('Using settings: ', ' / '.join((str(x) for x in self._settings.values()))) 231 232 def Stop(self, memStream = None): 233 self.LogInfo('Stopping DeviceMgr') 234 service.Service.Stop(self) 235 236 def GetShaderModelForShaderQuality(self, val): 237 if val == 3: 238 return 'SM_3_0_DEPTH' 239 if val == 2: 240 return 'SM_3_0_HI' 241 return 'SM_3_0_LO' 242 243 def _SaveSettings(self, window): 244 mode = window.GetWindowState() 245 windowMode = mode.windowMode 246 if windowMode != trinity.Tr2WindowMode.WINDOWED or mode.showState != trinity.Tr2WindowShowState.MINIMIZED: 247 self.LogInfo('Saving device settings: ', mode) 248 self._settings[windowMode] = mode 249 _SaveStateSettings(self._settings[windowMode]) 250 gfxsettings.Set(gfxsettings.GFX_WINDOW_MODE, windowMode, False) 251 self.settings.SaveSettings() 252 for each in self._settings.values(): 253 trinity.mainWindow.StoreStateSettings(each) 254 255 def _OnBeforeSwapChainChange(self, *args): 256 ServiceManager.Instance().GetService('window').ProcessDeviceChange() 257 258 def _OnWindowStateChange(self, *args): 259 self._SaveSettings(trinity.mainWindow) 260 with sentry_sdk.configure_scope() as scope: 261 scope.set_tag('window_mode', 'fullscreen' if trinity.mainWindow.GetWindowState().windowMode == trinity.Tr2WindowMode.FULL_SCREEN else 'windowed') 262 monolithsentry.set_sentry_crash_key() 263 264 def _OnSwapChainChange(self, *args): 265 ServiceManager.Instance().ScatterEvent('OnSetDevice') 266 deviceSignals.on_set_device() 267 if uicore.uilib: 268 uicore.uilib.UpdateRootObjectSizes() 269 ServiceManager.Instance().ScatterEvent('OnEndChangeDevice') 270 deviceSignals.on_end_change_device() 271 272 def ForceSize(self, width = 512, height = 512): 273 trinity.mainWindow.SetMinimumSize(width, height) 274 state = trinity.Tr2MainWindowState() 275 state.windowMode = trinity.Tr2WindowMode.WINDOWED 276 state.width = width 277 state.height = height 278 uthread.new(self._SetDevice, state) 279 280 def CreateDevice(self): 281 self.LogInfo('CreateDevice') 282 if '/safemode' in blue.pyos.GetArg(): 283 self.SetToSafeMode() 284 trinity.mainWindow.SetWindowTitle(GetWindowName()) 285 trinity.mainWindow.SetMinimumSize(*MINIMUM_WINDOW_SIZE) 286 trinity.mainWindow.onBeforeSwapChainChange = self._OnBeforeSwapChainChange 287 trinity.mainWindow.onWindowStateChange = self._OnWindowStateChange 288 trinity.mainWindow.onSwapChainChange = self._OnSwapChainChange 289 trinity.device.UpdateAvailableUpscalingTechniques() 290 dev = trinity.device 291 while not dev.DoesD3DDeviceExist(): 292 try: 293 self.Initialize() 294 dev.SetUpscaling(gfxsettings.Get(gfxsettings.GFX_UPSCALING_TECHNIQUE), gfxsettings.Get(gfxsettings.GFX_UPSCALING_SETTING), gfxsettings.Get(gfxsettings.GFX_FRAMEGENERATION_ENABLED)) 295 self._SetDevice(self._settings[gfxsettings.Get(gfxsettings.GFX_WINDOW_MODE, 0)]) 296 if not dev.DoesD3DDeviceExist(): 297 blue.os.Pump() 298 time.sleep(0.5) 299 except trinity.ALDeviceNotAvailable as e: 300 sys.exc_clear() 301 trinity.adapters.Refresh() 302 303 gfxsettings.Set(gfxsettings.GFX_UPSCALING_TECHNIQUE, dev.upscalingTechnique) 304 gfxsettings.Set(gfxsettings.GFX_UPSCALING_SETTING, dev.upscalingSetting) 305 gfxsettings.Set(gfxsettings.GFX_FRAMEGENERATION_ENABLED, dev.frameGeneration) 306 307 def ResetMonitor(self): 308 self._SetDevice(trinity.Tr2MainWindowState()) 309 310 def IsWindowed(self): 311 return trinity.mainWindow.GetWindowState().windowMode != trinity.Tr2WindowMode.FULL_SCREEN 312 313 def GetDefaultResolution(self, windowState): 314 if windowState.windowMode != trinity.Tr2WindowMode.FULL_SCREEN or self._settings[windowState.windowMode].adapter == windowState.adapter: 315 state = self._settings[windowState.windowMode].CopyTo() 316 else: 317 state = trinity.Tr2MainWindowState() 318 state.windowMode = windowState.windowMode 319 state.adapter = windowState.adapter 320 trinity.mainWindow.SanitizeState(state) 321 return (state.width, state.height) 322 323 def GetPreferedResolution(self, windowed): 324 if windowed: 325 state = self._settings[trinity.Tr2WindowMode.WINDOWED].CopyTo() 326 else: 327 state = self._settings[trinity.Tr2WindowMode.FULL_SCREEN].CopyTo() 328 trinity.mainWindow.SanitizeState(state) 329 return (state.width, state.height) 330 331 def ToggleWindowed(self): 332 if trinity.mainWindow.GetWindowState().windowMode != trinity.Tr2WindowMode.WINDOWED: 333 windowMode = trinity.Tr2WindowMode.WINDOWED 334 else: 335 windowMode = trinity.Tr2WindowMode.FULL_SCREEN 336 self._SetDevice(self._settings[windowMode]) 337 ServiceManager.Instance().ScatterEvent('OnToggleWindowed', isWindowed=windowMode != 0) 338 deviceSignals.on_toggle_windowed(windowMode != 0) 339 340 def _SetDevice(self, state): 341 dev = trinity.device 342 dev.viewport.width = state.width 343 dev.viewport.height = state.height 344 while True: 345 try: 346 trinity.mainWindow.SetWindowState(state) 347 break 348 except trinity.ALDeviceLostError: 349 blue.pyos.synchro.SleepWallclock(1000) 350 351 return True 352 353 def SetDevice(self, windowState): 354 backup = trinity.mainWindow.GetWindowState().CopyTo() 355 try: 356 self._SetDevice(windowState) 357 except: 358 self._SetDevice(backup) 359 return False 360 361 newState = trinity.mainWindow.GetWindowState() 362 if newState.windowMode == trinity.Tr2WindowMode.FULL_SCREEN and (newState.width != backup.width or newState.height != backup.height): 363 self._AskForConfirmation(backup) 364 365 def _AskForConfirmation(self, backup): 366 loadingSvc = ServiceManager.Instance().GetService('loading') 367 if hasattr(loadingSvc, 'CountDownWindow'): 368 loadingSvc.CountDownWindow(localization.GetByLabel('/Carbon/UI/Service/Device/KeepDisplayChanges'), 15000, lambda *args: None, lambda *args: self._SetDevice(backup), inModalLayer=1) 369 370 def GetSettings(self): 371 return trinity.mainWindow.GetWindowState() 372 373 def GetAdaptersEnumerated(self): 374 options = [] 375 for i in range(trinity.adapters.GetAdapterCount()): 376 identifier = trinity.adapters.GetAdapterInfo(i) 377 identifierDesc = identifier.description.encode('ascii', 'ignore') 378 identifierDesc += ' ' + str(i + 1) 379 options.append((identifierDesc, i)) 380 381 return options 382 383 def GetResolutionOptions(self, windowState): 384 options = [] 385 for resolution in trinity.mainWindow.GetWindowSizeOptions(windowState.adapter, windowState.windowMode): 386 options.append((localization.GetByLabel('/Carbon/UI/Service/Device/ScreenSize', width=resolution[0], height=resolution[1]), resolution)) 387 388 return options 389 390 def GetPresentationIntervalOptions(self, windowMode): 391 options = [(localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/Off'), trinity.PRESENT_INTERVAL.IMMEDIATE), (localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/On'), trinity.PRESENT_INTERVAL.ONE)] 392 return options 393 394 def SetResourceCacheSize(self): 395 cacheSize = 128 396 self.LogInfo('Setting resource cache size to', cacheSize, 'MB') 397 MEG = 1048576 398 finalSize = cacheSize * MEG 399 blue.motherLode.maxMemUsage = finalSize 400 return finalSize 401 402 def SetToSafeMode(self): 403 gfxsettings.Set(gfxsettings.GFX_TEXTURE_QUALITY, 2, pending=False) 404 gfxsettings.Set(gfxsettings.GFX_SHADER_QUALITY, 1, pending=False) 405 gfxsettings.Set(gfxsettings.GFX_POST_PROCESSING_QUALITY, 0, pending=False) 406 gfxsettings.Set(gfxsettings.GFX_SHADOW_QUALITY, 0, pending=False) 407 408 def _GetAppShaderModel(self): 409 shaderQuality = gfxsettings.Get(gfxsettings.GFX_SHADER_QUALITY) 410 return self.GetShaderModelForShaderQuality(shaderQuality) 411 412 def _GetAppSettings(self): 413 return gfxsettings.GetLodSettings() 414 415 def _GetAppMipLevelSkipExclusionDirectories(self): 416 return ['res:/UI/Texture'] 417 418 def RefreshSupportedAATypes(self, deviceSettings, formats, shaderModel = None): 419 self._aaTypes = [gfxsettings.AA_QUALITY_DISABLED] 420 self._aaTypes.append(gfxsettings.AA_QUALITY_TAA_LOW) 421 self._aaTypes.append(gfxsettings.AA_QUALITY_TAA_MEDIUM) 422 self._aaTypes.append(gfxsettings.AA_QUALITY_TAA_HIGH) 423 424 def GetAntiAliasingLabel(self, aaQuality): 425 aaLabels = {gfxsettings.AA_QUALITY_DISABLED: localization.GetByLabel('/Carbon/UI/Common/Disabled'), 426 gfxsettings.AA_QUALITY_TAA_LOW: localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/LowQuality'), 427 gfxsettings.AA_QUALITY_TAA_MEDIUM: localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/MediumQuality'), 428 gfxsettings.AA_QUALITY_TAA_HIGH: localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/Common/HighQuality')} 429 return aaLabels[aaQuality] 430 431 def _GetCommonFormats(self, adapter): 432 allFormats = (trinity.PIXEL_FORMAT.R16G16B16A16_FLOAT, trinity.PIXEL_FORMAT.B8G8R8X8_UNORM, trinity.PIXEL_FORMAT.B8G8R8A8_UNORM) 433 return [ f for f in allFormats if trinity.adapters.SupportsRenderTargetFormat(adapter, f) ] 434 435 def GetAntiAliasingOptions(self, deviceSettings, shaderModel = None): 436 formats = self._GetCommonFormats(deviceSettings.adapter) 437 self.RefreshSupportedAATypes(deviceSettings, formats, shaderModel) 438 aaOptions = [] 439 for each in self._aaTypes: 440 aaOptions.append((self.GetAntiAliasingLabel(each), each)) 441 442 return aaOptions 443 444 def GetUIScalingOptions(self, windowed, height = None): 445 if height is None: 446 height = uicore.desktop.height 447 options = [ (eveformat.percent(scale), scale) for scale in self.GetAllowedScaleValues(height) ] 448 auto_scale_value = self.CapUIScaleValue(self._GetFallbackUIScale(windowed)) 449 auto_option = (localization.GetByLabel('UI/SystemMenu/DisplayAndGraphics/DisplaySetup/AutoUIScaleOption', scale=eveformat.percent(auto_scale_value)), uiconst.AUTO_UI_SCALE_OPTION_ID) 450 options.insert(0, auto_option) 451 return options 452 453 def GetAllowedScaleValues(self, height = None): 454 if height is None: 455 height = uicore.desktop.height 456 maxValue = max(height / float(MINIMUM_WINDOW_SIZE[1]), 1.0) 457 allowed_values = [ value for value in SCALE_VALUES if value <= maxValue ] 458 return allowed_values 459 460 def CapUIScaleValue(self, checkValue): 461 values = self.GetAllowedScaleValues(trinity.device.height) 462 minScale = min(values) 463 maxScale = max(values) 464 return max(minScale, min(maxScale, checkValue)) 465 466 def SetupUIScaling(self): 467 if not uicore.desktop: 468 return 469 windowed = self.IsWindowed() 470 self.SetUIScaleValue(self.GetUIScaleValue(windowed), windowed) 471 472 def SetUIScaleValue(self, scaleValue, windowed): 473 self.LogInfo('SetUIScaleValue', scaleValue, 'windowed', windowed) 474 capValue = self.CapUIScaleValue(scaleValue) 475 self._SetUIScaleValue(capValue, windowed) 476 if capValue != uicore.desktop.dpiScaling: 477 PreUIScaleChange_DesktopLayout = capture_desktop_window_layout() 478 oldValue = uicore.dpiScaling 479 uicore.desktop.UpdateUIScaling(capValue, oldValue) 480 self.LogInfo('SetUIScaleValue capValue', capValue) 481 ServiceManager.Instance().ScatterEvent('OnUIScalingChange', (oldValue, capValue)) 482 apply_desktop_window_layout(PreUIScaleChange_DesktopLayout) 483 else: 484 self.LogInfo('SetUIScaleValue No Change') 485 486 def _SetUIScaleValue(self, value, windowed): 487 if windowed: 488 gfxsettings.Set(gfxsettings.GFX_UI_SCALE_WINDOWED, value, pending=False) 489 else: 490 gfxsettings.Set(gfxsettings.GFX_UI_SCALE_FULLSCREEN, value, pending=False) 491 492 def _GetFallbackUIScale(self, windowed): 493 if trinity.mainWindow: 494 state = trinity.mainWindow.GetWindowState() 495 if windowed: 496 try: 497 cm = trinity.adapters.GetCurrentDisplayMode(state.adapter) 498 except trinity.ALError: 499 return 1.0 500 501 height = cm.height 502 else: 503 height = state.height 504 if height > 2160: 505 return 2.0 506 if height > 1800: 507 return 1.5 508 if height > 1440: 509 return 1.25 510 if height < 900: 511 return 0.9 512 return 1.0 513 514 def GetUIScaleValue(self, windowed): 515 fallback = self._GetFallbackUIScale(windowed) 516 auto_ui_scale_setting_key = gfxsettings.GFX_UI_SCALE_WINDOWED_SET_AUTOMATICALLY if windowed else gfxsettings.GFX_UI_SCALE_FULLSCREEN_SET_AUTOMATICALLY 517 auto = gfxsettings.Get(auto_ui_scale_setting_key) 518 if auto: 519 return fallback 520 else: 521 ui_scale_setting_key = gfxsettings.GFX_UI_SCALE_WINDOWED if windowed else gfxsettings.GFX_UI_SCALE_FULLSCREEN 522 return gfxsettings.Get(ui_scale_setting_key, fallback) 523 524 def ApplyTrinityUserSettings(self): 525 effectsEnabled = gfxsettings.Get(gfxsettings.UI_EFFECTS_ENABLED) 526 trailsEnabled = effectsEnabled and gfxsettings.Get(gfxsettings.UI_TRAILS_ENABLED) 527 trinity.settings.SetValue('eveSpaceObjectTrailsEnabled', trailsEnabled)