1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-11-23 21:34:53 +02:00

Improved functions to get the screen scale and DPI values in all platforms

This commit is contained in:
Salvador Díaz Fau
2021-06-24 17:47:22 +02:00
parent b0259524c5
commit e72bbfd46e
6 changed files with 91 additions and 30 deletions

View File

@@ -37,15 +37,18 @@
unit uCEFMiscFunctions;
{$I cef.inc}
{$IFDEF FPC}
{$MODE OBJFPC}{$H+}
{$IFDEF MACOSX}
{$ModeSwitch objectivec1}
{$ENDIF}
{$ENDIF}
{$IFNDEF CPUX64}{$ALIGN ON}{$ENDIF}
{$MINENUMSIZE 4}
{$I cef.inc}
{$IFNDEF FPC}{$IFNDEF DELPHI12_UP}
// Workaround for "Internal error" in old Delphi versions caused by uint64 handling
{$R-}
@@ -58,10 +61,10 @@ uses
{$IFDEF MSWINDOWS}
WinApi.Windows, WinApi.ActiveX,
{$ELSE}
{$IFDEF MACOSX}Macapi.Foundation, FMX.Helpers.Mac,{$ENDIF}
{$IFDEF MACOSX}Macapi.Foundation, FMX.Helpers.Mac, Macapi.AppKit,{$ENDIF}
{$ENDIF}
{$IFDEF FMX}FMX.Types,{$ENDIF} System.Types, System.IOUtils, System.Classes,
System.SysUtils, System.UITypes, System.Math,
{$IFDEF FMX}FMX.Types, FMX.Platform,{$ENDIF} System.Types, System.IOUtils,
System.Classes, System.SysUtils, System.UITypes, System.Math,
{$ELSE}
{$IFDEF MSWINDOWS}Windows, ActiveX,{$ENDIF}
{$IFDEF DELPHI14_UP}Types, IOUtils,{$ENDIF} Classes, SysUtils, Math,
@@ -293,7 +296,7 @@ function GetCommandLineSwitchValue(const aKey : string; var aValue : ustring) :
implementation
uses
{$IFDEF LINUX}{$IFDEF FMX}Posix.Unistd, Posix.Stdio,{$ENDIF}{$ENDIF}
{$IFDEF LINUX}{$IFDEF FMX}uCEFLinuxFunctions, Posix.Unistd, Posix.Stdio,{$ENDIF}{$ENDIF}
{$IFDEF MACOS}Posix.Unistd, Posix.Stdio,{$ENDIF}
uCEFApplicationCore, uCEFSchemeHandlerFactory, uCEFValue,
uCEFBinaryValue, uCEFStringList;
@@ -2218,6 +2221,11 @@ function GetScreenDPI : integer;
{$IFDEF MSWINDOWS}
var
TempDC : HDC;
{$ELSE}
{$IFDEF FMX}
var
TempService: IFMXScreenService;
{$ENDIF}
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
@@ -2243,26 +2251,44 @@ begin
else
Result := USER_DEFAULT_SCREEN_DPI;
{$ELSE}
// TODO: Find a way to get the screen scale in Delphi FMX for Linux
Result := USER_DEFAULT_SCREEN_DPI;
if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, TempService) then
Result := round(TempService.GetScreenScale * USER_DEFAULT_SCREEN_DPI)
else
begin
Result := round(gdk_screen_get_resolution(gdk_screen_get_default));
if (Result < 0) then
Result := round(gdk_screen_width / (gdk_screen_width_mm / 25.4));
end;
{$ENDIF}
{$ENDIF}
{$IFDEF MACOSX}
{$IFDEF FPC}
// TODO: Find a way to get the screen scale in Lazarus/FPC for MacOS
Result := USER_DEFAULT_SCREEN_DPI;
Result := round(NSScreen.mainScreen.backingScaleFactor * USER_DEFAULT_SCREEN_DPI);
{$ELSE}
// TODO: Find a way to get the screen scale in Delphi FMX for MacOS
Result := USER_DEFAULT_SCREEN_DPI;
if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, TempService) then
Result := round(TempService.GetScreenScale * USER_DEFAULT_SCREEN_DPI)
else
Result := round(TNSScreen.Wrap(TNSScreen.OCClass.mainScreen).backingScaleFactor * USER_DEFAULT_SCREEN_DPI);
{$ENDIF}
{$ENDIF}
end;
function GetDeviceScaleFactor : single;
{$IFDEF MACOSX}{$IFDEF FMX}
var
TempService: IFMXScreenService;
{$ENDIF}{$ENDIF}
begin
{$IFDEF MACOS}
Result := MainScreen.backingScaleFactor;
{$IFDEF MACOSX}
{$IFDEF FPC}
Result := NSScreen.mainScreen.backingScaleFactor;
{$ELSE}
if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, TempService) then
Result := TempService.GetScreenScale
else
Result := TNSScreen.Wrap(TNSScreen.OCClass.mainScreen).backingScaleFactor;
{$ENDIF}
{$ELSE}
Result := GetScreenDPI / USER_DEFAULT_SCREEN_DPI;
{$ENDIF}