1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-06-22 22:17:48 +02:00

Improved keyboard and mouse support in FMXExternalPumpBrowser for MacOS

Added X11 error handling functions to FMXExternalPumpBrowser2 demo for Linux.
Deleted FMXExternalPumpBrowser demo for Linux.
Added uCEFMacOSConstants and uCEFMacOSFunctions units for MacOS.
Replaced TThread.Queue for TThread.ForceQueue to avoid executing that method immediately in some cases.
This commit is contained in:
Salvador Díaz Fau
2021-05-26 19:32:10 +02:00
parent a22e1a07b1
commit 44896524e8
26 changed files with 726 additions and 3319 deletions

View File

@ -46,13 +46,6 @@ unit uCEFWorkScheduler;
{$I cef.inc}
// Define this conditional to use TCEFWorkSchedulerQueueThread instead of using
// PostMessage, Application.QueueAsyncCall or TThread.Queue inside
// TCEFWorkScheduler.ScheduleMessagePumpWork
// TCEFWorkSchedulerQueueThread is just a new experimental way to handle the
// external message pump events for all platforms.
{.$DEFINE USEQUEUETHREAD}
interface
uses
@ -66,7 +59,7 @@ uses
Messages,
{$ENDIF}
{$ENDIF}
uCEFConstants, {$IFDEF USEQUEUETHREAD}uCEFWorkSchedulerQueueThread,{$ENDIF} uCEFWorkSchedulerThread;
uCEFConstants, uCEFWorkSchedulerQueueThread, uCEFWorkSchedulerThread;
type
@ -74,13 +67,12 @@ type
TCEFWorkScheduler = class(TComponent)
protected
FThread : TCEFWorkSchedulerThread;
{$IFDEF USEQUEUETHREAD}
FQueueThread : TCEFWorkSchedulerQueueThread;
{$ENDIF}
FDepleteWorkCycles : cardinal;
FDepleteWorkDelay : cardinal;
FDefaultInterval : integer;
FStopped : boolean;
FUseQueueThread : boolean;
{$IFDEF MSWINDOWS}
{$WARN SYMBOL_PLATFORM OFF}
FCompHandle : HWND;
@ -88,11 +80,9 @@ type
{$WARN SYMBOL_PLATFORM ON}
{$ENDIF}
{$IFDEF USEQUEUETHREAD}
procedure CreateQueueThread;
procedure DestroyQueueThread;
procedure QueueThread_OnPulse(Sender : TObject; aDelay : integer);
{$ENDIF}
procedure DestroyThread;
procedure DepleteWork;
@ -136,6 +126,7 @@ type
property DefaultInterval : integer read FDefaultInterval write SetDefaultInterval default CEF_TIMER_MAXDELAY;
property DepleteWorkCycles : cardinal read FDepleteWorkCycles write FDepleteWorkCycles default CEF_TIMER_DEPLETEWORK_CYCLES;
property DepleteWorkDelay : cardinal read FDepleteWorkDelay write FDepleteWorkDelay default CEF_TIMER_DEPLETEWORK_DELAY;
property UseQueueThread : boolean read FUseQueueThread write FUseQueueThread default False;
end;
var
@ -199,9 +190,7 @@ end;
destructor TCEFWorkScheduler.Destroy;
begin
DestroyThread;
{$IFDEF USEQUEUETHREAD}
DestroyQueueThread;
{$ENDIF}
{$IFDEF MSWINDOWS}
DeallocateWindowHandle;
{$ENDIF}
@ -210,10 +199,9 @@ end;
procedure TCEFWorkScheduler.Initialize;
begin
FUseQueueThread := False;
FThread := nil;
{$IFDEF USEQUEUETHREAD}
FQueueThread := nil;
{$ENDIF}
FStopped := False;
{$IFDEF MSWINDOWS}
{$WARN SYMBOL_PLATFORM OFF}
@ -246,12 +234,10 @@ begin
{$ENDIF}
{$ENDIF}
{$IFDEF USEQUEUETHREAD}
CreateQueueThread;
{$ENDIF}
end;
if FUseQueueThread then
CreateQueueThread;
end;
{$IFDEF USEQUEUETHREAD}
procedure TCEFWorkScheduler.CreateQueueThread;
begin
FQueueThread := TCEFWorkSchedulerQueueThread.Create;
@ -287,7 +273,6 @@ procedure TCEFWorkScheduler.QueueThread_OnPulse(Sender : TObject; aDelay : integ
begin
ScheduleWork(aDelay);
end;
{$ENDIF}
procedure TCEFWorkScheduler.DestroyThread;
begin
@ -322,6 +307,14 @@ begin
FCompHandle := 0;
end;
end;
{$WARN SYMBOL_PLATFORM OFF}
procedure TCEFWorkScheduler.SetPriority(aValue : TThreadPriority);
begin
FPriority := aValue;
if (FThread <> nil) then FThread.Priority := aValue;
end;
{$WARN SYMBOL_PLATFORM ON}
{$ENDIF}
procedure TCEFWorkScheduler.DoMessageLoopWork;
@ -335,16 +328,6 @@ begin
if (FThread <> nil) then FThread.DefaultInterval := aValue;
end;
{$IFDEF MSWINDOWS}
{$WARN SYMBOL_PLATFORM OFF}
procedure TCEFWorkScheduler.SetPriority(aValue : TThreadPriority);
begin
FPriority := aValue;
if (FThread <> nil) then FThread.Priority := aValue;
end;
{$WARN SYMBOL_PLATFORM ON}
{$ENDIF}
procedure TCEFWorkScheduler.DepleteWork;
var
i : cardinal;
@ -363,27 +346,24 @@ procedure TCEFWorkScheduler.ScheduleMessagePumpWork(const delay_ms : int64);
begin
if FStopped then exit;
{$IFDEF USEQUEUETHREAD}
if (FQueueThread <> nil) and FQueueThread.Ready then
begin
FQueueThread.EnqueueValue(integer(delay_ms));
exit;
end;
{$ENDIF}
{$IFDEF MSWINDOWS}
if (FCompHandle <> 0) then
PostMessage(FCompHandle, CEF_PUMPHAVEWORK, 0, LPARAM(delay_ms));
{$ELSE}
{$IFDEF FPC}
Application.QueueAsyncCall(@ScheduleWorkAsync, integer(delay_ms));
{$ELSE}
TThread.Queue(nil, procedure
begin
ScheduleWork(delay_ms);
end);
{$ENDIF}
{$ENDIF}
if FUseQueueThread and (FQueueThread <> nil) and FQueueThread.Ready then
FQueueThread.EnqueueValue(integer(delay_ms))
else
begin
{$IFDEF MSWINDOWS}
if (FCompHandle <> 0) then
PostMessage(FCompHandle, CEF_PUMPHAVEWORK, 0, LPARAM(delay_ms));
{$ELSE}
{$IFDEF FPC}
Application.QueueAsyncCall(@ScheduleWorkAsync, integer(delay_ms));
{$ELSE}
TThread.ForceQueue(nil, procedure
begin
ScheduleWork(delay_ms);
end);
{$ENDIF}
{$ENDIF}
end;
end;
{$IFNDEF MSWINDOWS}{$IFDEF FPC}