1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-04-07 06:50:04 +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

@ -916,20 +916,22 @@ begin
end;
function TBufferPanel.GetRealScreenScale(var aResultScale : single) : boolean;
{$IFDEF MSWINDOWS}
{$IFDEF MSWINDOWS}
var
TempHandle : TCefWindowHandle;
TempDC : HDC;
TempDPI : UINT;
{$ELSE}
{$IFDEF LINUX}
{$IFDEF FPC}
{$ENDIF}
{$IFDEF LINUX}{$IFDEF FPC}
var
TempForm : TCustomForm;
TempMonitor : TMonitor;
{$ENDIF}
{$ENDIF}
{$ENDIF}
TempForm : TCustomForm;
TempMonitor : TMonitor;
{$ENDIF}{$ENDIF}
{$IFDEF MACOSX}{$IFDEF FPC}
var
TempForm : TCustomForm;
TempMonitor : TMonitor;
{$ENDIF}{$ENDIF}
begin
Result := False;
aResultScale := 1;
@ -967,15 +969,27 @@ begin
end;
end;
{$ELSE}
// TODO: Get the screen scale in FMXLinux
// TODO: Get the scale of the screen where the parent form is located in FMXLinux
{$ENDIF}
{$ENDIF}
{$IFDEF MACOSX}
{$IFDEF FPC}
// TODO: Get the screen scale in Lazarus/FPC
TempForm := GetParentForm(self, True);
if (TempForm <> nil) then
begin
TempMonitor := TempForm.Monitor;
if (TempMonitor <> nil) and (TempMonitor.PixelsPerInch > 0) then
begin
aResultScale := TempMonitor.PixelsPerInch / USER_DEFAULT_SCREEN_DPI;
Result := True;
end;
end;
{$ELSE}
// TODO: Get the screen scale in FMX
Result := True;
aResultScale := TMacWindowHandle(GetParentForm.Handle).Wnd.backingScaleFactor;
{$ENDIF}
{$ENDIF}
end;

View File

@ -163,7 +163,8 @@ implementation
uses
System.SysUtils, System.Math,
{$IFDEF MSWINDOWS}FMX.Helpers.Win,{$ENDIF}
FMX.Platform, uCEFMiscFunctions, uCEFApplicationCore;
FMX.Platform, {$IFDEF MACOS}FMX.Platform.Mac,{$ENDIF}
uCEFMiscFunctions, uCEFApplicationCore;
constructor TFMXBufferPanel.Create(AOwner: TComponent);
begin
@ -394,7 +395,8 @@ begin
Result := False;
aResultScale := 1;
{$IFDEF DELPHI24_UP}{$IFDEF MSWINDOWS}
{$IFDEF MSWINDOWS}
{$IFDEF DELPHI24_UP}
TempHandle := GetParentFormHandle;
if (TempHandle <> 0) then
@ -402,7 +404,17 @@ begin
Result := True;
aResultScale := GetWndScale(TempHandle);
end;
{$ENDIF}{$ENDIF}
{$ENDIF}
{$ENDIF}
{$IFDEF LINUX}
// TODO: Get the scale of the screen where the parent form is located in FMXLinux
{$ENDIF}
{$IFDEF MACOS}
Result := True;
aResultScale := TMacWindowHandle(GetParentForm.Handle).Wnd.backingScaleFactor;
{$ENDIF}
end;
function TFMXBufferPanel.GetScreenScale : single;

View File

@ -76,6 +76,10 @@ function gdk_keyval_to_unicode(keyval: guint): guint32; cdecl; external 'libgdk-
function g_signal_connect_data(instance: gpointer; detailed_signal: Pgchar; c_handler: TGCallback; data: gpointer; destroy_data: TGClosureNotify; connect_flags: TGConnectFlags): gulong; cdecl; external 'libgobject-2.0.so';
function g_signal_connect(instance: gpointer; detailed_signal: Pgchar; c_handler: TGCallback; data: gpointer): gulong; overload;
function g_signal_connect(instance: gpointer; const detailed_signal: AnsiString; c_handler: TGCallback; data: gpointer): gulong; overload;
function gdk_screen_width:gint; cdecl; external 'libgdk-3.so';
function gdk_screen_width_mm:gint; cdecl; external 'libgdk-3.so';
function gdk_screen_get_default:PGdkScreen; cdecl; external 'libgdk-3.so';
function gdk_screen_get_resolution(screen:PGdkScreen):gdouble; cdecl; external 'libgdk-3.so';
{$ENDIF}
{$IFDEF FPC}
procedure ShowX11Message(const aMessage : string);

View File

@ -137,6 +137,11 @@ type
rgbRed : Byte;
rgbReserved : Byte;
end;
PGdkScreen = ^TGdkScreen;
TGdkScreen = record
parent_instance : TGObject;
end;
{$ENDIF}
{$ENDIF}

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}

View File

@ -2,7 +2,7 @@
"UpdateLazPackages" : [
{
"ForceNotify" : true,
"InternalVersion" : 306,
"InternalVersion" : 307,
"Name" : "cef4delphi_lazarus.lpk",
"Version" : "91.1.21.0"
}