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:
parent
b0259524c5
commit
e72bbfd46e
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -137,6 +137,11 @@ type
|
||||
rgbRed : Byte;
|
||||
rgbReserved : Byte;
|
||||
end;
|
||||
|
||||
PGdkScreen = ^TGdkScreen;
|
||||
TGdkScreen = record
|
||||
parent_instance : TGObject;
|
||||
end;
|
||||
{$ENDIF}
|
||||
{$ENDIF}
|
||||
|
||||
|
@ -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}
|
||||
|
@ -2,7 +2,7 @@
|
||||
"UpdateLazPackages" : [
|
||||
{
|
||||
"ForceNotify" : true,
|
||||
"InternalVersion" : 306,
|
||||
"InternalVersion" : 307,
|
||||
"Name" : "cef4delphi_lazarus.lpk",
|
||||
"Version" : "91.1.21.0"
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user