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; end;
function TBufferPanel.GetRealScreenScale(var aResultScale : single) : boolean; function TBufferPanel.GetRealScreenScale(var aResultScale : single) : boolean;
{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
var var
TempHandle : TCefWindowHandle; TempHandle : TCefWindowHandle;
TempDC : HDC; TempDC : HDC;
TempDPI : UINT; TempDPI : UINT;
{$ELSE} {$ENDIF}
{$IFDEF LINUX} {$IFDEF LINUX}{$IFDEF FPC}
{$IFDEF FPC}
var var
TempForm : TCustomForm; TempForm : TCustomForm;
TempMonitor : TMonitor; TempMonitor : TMonitor;
{$ENDIF} {$ENDIF}{$ENDIF}
{$ENDIF} {$IFDEF MACOSX}{$IFDEF FPC}
{$ENDIF} var
TempForm : TCustomForm;
TempMonitor : TMonitor;
{$ENDIF}{$ENDIF}
begin begin
Result := False; Result := False;
aResultScale := 1; aResultScale := 1;
@ -967,15 +969,27 @@ begin
end; end;
end; end;
{$ELSE} {$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}
{$ENDIF} {$ENDIF}
{$IFDEF MACOSX} {$IFDEF MACOSX}
{$IFDEF FPC} {$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} {$ELSE}
// TODO: Get the screen scale in FMX Result := True;
aResultScale := TMacWindowHandle(GetParentForm.Handle).Wnd.backingScaleFactor;
{$ENDIF} {$ENDIF}
{$ENDIF} {$ENDIF}
end; end;

View File

@ -163,7 +163,8 @@ implementation
uses uses
System.SysUtils, System.Math, System.SysUtils, System.Math,
{$IFDEF MSWINDOWS}FMX.Helpers.Win,{$ENDIF} {$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); constructor TFMXBufferPanel.Create(AOwner: TComponent);
begin begin
@ -394,7 +395,8 @@ begin
Result := False; Result := False;
aResultScale := 1; aResultScale := 1;
{$IFDEF DELPHI24_UP}{$IFDEF MSWINDOWS} {$IFDEF MSWINDOWS}
{$IFDEF DELPHI24_UP}
TempHandle := GetParentFormHandle; TempHandle := GetParentFormHandle;
if (TempHandle <> 0) then if (TempHandle <> 0) then
@ -402,7 +404,17 @@ begin
Result := True; Result := True;
aResultScale := GetWndScale(TempHandle); aResultScale := GetWndScale(TempHandle);
end; 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; end;
function TFMXBufferPanel.GetScreenScale : single; 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_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; 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 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} {$ENDIF}
{$IFDEF FPC} {$IFDEF FPC}
procedure ShowX11Message(const aMessage : string); procedure ShowX11Message(const aMessage : string);

View File

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

View File

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

View File

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