mirror of
https://github.com/salvadordf/CEF4Delphi.git
synced 2024-11-16 00:05:55 +01:00
03f9e9a1b9
Fixed issue #404 : Memory leak with empty TChromiumDefaultUrl Fixed crash in RasperryPi OS 64 bits
344 lines
11 KiB
ObjectPascal
344 lines
11 KiB
ObjectPascal
// ************************************************************************
|
|
// ***************************** CEF4Delphi *******************************
|
|
// ************************************************************************
|
|
//
|
|
// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
|
|
// browser in Delphi applications.
|
|
//
|
|
// The original license of DCEF3 still applies to CEF4Delphi.
|
|
//
|
|
// For more information about CEF4Delphi visit :
|
|
// https://www.briskbard.com/index.php?lang=en&pageid=cef
|
|
//
|
|
// Copyright © 2022 Salvador Diaz Fau. All rights reserved.
|
|
//
|
|
// ************************************************************************
|
|
// ************ vvvv Original license and comments below vvvv *************
|
|
// ************************************************************************
|
|
(*
|
|
* Delphi Chromium Embedded 3
|
|
*
|
|
* Usage allowed under the restrictions of the Lesser GNU General Public License
|
|
* or alternatively the restrictions of the Mozilla Public License 1.1
|
|
*
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
|
* the specific language governing rights and limitations under the License.
|
|
*
|
|
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
|
|
* Web site : http://www.progdigy.com
|
|
* Repository : http://code.google.com/p/delphichromiumembedded/
|
|
* Group : http://groups.google.com/group/delphichromiumembedded
|
|
*
|
|
* Embarcadero Technologies, Inc is not permitted to use or redistribute
|
|
* this source code without explicit permission.
|
|
*
|
|
*)
|
|
|
|
unit uCEFWindow;
|
|
|
|
{$IFDEF FPC}
|
|
{$MODE OBJFPC}{$H+}
|
|
{$ENDIF}
|
|
|
|
{$I cef.inc}
|
|
|
|
{$IFNDEF TARGET_64BITS}{$ALIGN ON}{$ENDIF}
|
|
{$MINENUMSIZE 4}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF DELPHI16_UP}
|
|
System.Classes, System.SysUtils,
|
|
{$ELSE}
|
|
Classes, SysUtils,
|
|
{$ENDIF}
|
|
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes, uCEFPanel;
|
|
|
|
type
|
|
TCefWindowRef = class(TCefPanelRef, ICefWindow)
|
|
protected
|
|
procedure Show;
|
|
procedure Hide;
|
|
procedure CenterWindow(const size_: TCefSize);
|
|
procedure Close;
|
|
function IsClosed : boolean;
|
|
procedure Activate;
|
|
procedure Deactivate;
|
|
function IsActive : boolean;
|
|
procedure BringToTop;
|
|
procedure SetAlwaysOnTop(on_top: boolean);
|
|
function IsAlwaysOnTop : boolean;
|
|
procedure Maximize;
|
|
procedure Minimize;
|
|
procedure Restore;
|
|
procedure SetFullscreen(fullscreen: boolean);
|
|
function IsMaximized : boolean;
|
|
function IsMinimized : boolean;
|
|
function IsFullscreen : boolean;
|
|
procedure SetTitle(const title_: ustring);
|
|
function GetTitle : ustring;
|
|
procedure SetWindowIcon(const image: ICefImage);
|
|
function GetWindowIcon : ICefImage;
|
|
procedure SetWindowAppIcon(const image: ICefImage);
|
|
function GetWindowAppIcon : ICefImage;
|
|
function AddOverlayView(const view: ICefView; docking_mode: TCefDockingMode): ICefOverlayController;
|
|
procedure ShowMenu(const menu_model: ICefMenuModel; const screen_point: TCefPoint; anchor_position : TCefMenuAnchorPosition);
|
|
procedure CancelMenu;
|
|
function GetDisplay : ICefDisplay;
|
|
function GetClientAreaBoundsInScreen : TCefRect;
|
|
procedure SetDraggableRegions(regionsCount: NativeUInt; const regions: PCefDraggableRegionArray);
|
|
function GetWindowHandle : TCefWindowHandle;
|
|
procedure SendKeyPress(key_code: Integer; event_flags: cardinal);
|
|
procedure SendMouseMove(screen_x, screen_y: Integer);
|
|
procedure SendMouseEvents(button: TCefMouseButtonType; mouse_down, mouse_up: boolean);
|
|
procedure SetAccelerator(command_id, key_code : Integer; shift_pressed, ctrl_pressed, alt_pressed: boolean);
|
|
procedure RemoveAccelerator(command_id: Integer);
|
|
procedure RemoveAllAccelerators;
|
|
|
|
public
|
|
class function UnWrap(data: Pointer): ICefWindow;
|
|
class function CreateTopLevel(const delegate: ICefWindowDelegate): ICefWindow;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
uCEFLibFunctions, uCEFMiscFunctions, uCEFImage, uCEFDisplay, uCEFOverlayController;
|
|
|
|
procedure TCefWindowRef.Show;
|
|
begin
|
|
PCefWindow(FData)^.show(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.Hide;
|
|
begin
|
|
PCefWindow(FData)^.hide(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.CenterWindow(const size_: TCefSize);
|
|
begin
|
|
PCefWindow(FData)^.center_window(PCefWindow(FData), @size_);
|
|
end;
|
|
|
|
procedure TCefWindowRef.Close;
|
|
begin
|
|
PCefWindow(FData)^.close(PCefWindow(FData));
|
|
end;
|
|
|
|
function TCefWindowRef.IsClosed : boolean;
|
|
begin
|
|
Result := (PCefWindow(FData)^.is_closed(PCefWindow(FData)) <> 0);
|
|
end;
|
|
|
|
procedure TCefWindowRef.Activate;
|
|
begin
|
|
PCefWindow(FData)^.activate(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.Deactivate;
|
|
begin
|
|
PCefWindow(FData)^.deactivate(PCefWindow(FData));
|
|
end;
|
|
|
|
function TCefWindowRef.IsActive : boolean;
|
|
begin
|
|
Result := (PCefWindow(FData)^.is_active(PCefWindow(FData)) <> 0);
|
|
end;
|
|
|
|
procedure TCefWindowRef.BringToTop;
|
|
begin
|
|
PCefWindow(FData)^.bring_to_top(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.SetAlwaysOnTop(on_top: boolean);
|
|
begin
|
|
PCefWindow(FData)^.set_always_on_top(PCefWindow(FData), ord(on_top));
|
|
end;
|
|
|
|
function TCefWindowRef.IsAlwaysOnTop : boolean;
|
|
begin
|
|
Result := (PCefWindow(FData)^.is_always_on_top(PCefWindow(FData)) <> 0);
|
|
end;
|
|
|
|
procedure TCefWindowRef.Maximize;
|
|
begin
|
|
PCefWindow(FData)^.maximize(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.Minimize;
|
|
begin
|
|
PCefWindow(FData)^.minimize(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.Restore;
|
|
begin
|
|
PCefWindow(FData)^.restore(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.SetFullscreen(fullscreen: boolean);
|
|
begin
|
|
PCefWindow(FData)^.set_fullscreen(PCefWindow(FData), ord(fullscreen));
|
|
end;
|
|
|
|
function TCefWindowRef.IsMaximized : boolean;
|
|
begin
|
|
Result := (PCefWindow(FData)^.is_maximized(PCefWindow(FData)) <> 0);
|
|
end;
|
|
|
|
function TCefWindowRef.IsMinimized : boolean;
|
|
begin
|
|
Result := (PCefWindow(FData)^.is_minimized(PCefWindow(FData)) <> 0);
|
|
end;
|
|
|
|
function TCefWindowRef.IsFullscreen : boolean;
|
|
begin
|
|
Result := (PCefWindow(FData)^.is_fullscreen(PCefWindow(FData)) <> 0);
|
|
end;
|
|
|
|
procedure TCefWindowRef.SetTitle(const title_: ustring);
|
|
var
|
|
TempTitle : TCefString;
|
|
begin
|
|
TempTitle := CefString(title_);
|
|
PCefWindow(FData)^.set_title(PCefWindow(FData), @TempTitle);
|
|
end;
|
|
|
|
function TCefWindowRef.GetTitle : ustring;
|
|
begin
|
|
Result := CefStringFreeAndGet(PCefWindow(FData)^.get_title(PCefWindow(FData)));
|
|
end;
|
|
|
|
procedure TCefWindowRef.SetWindowIcon(const image: ICefImage);
|
|
begin
|
|
PCefWindow(FData)^.set_window_icon(PCefWindow(FData), CefGetData(image));
|
|
end;
|
|
|
|
function TCefWindowRef.GetWindowIcon : ICefImage;
|
|
begin
|
|
Result := TCefImageRef.UnWrap(PCefWindow(FData)^.get_window_icon(PCefWindow(FData)));
|
|
end;
|
|
|
|
procedure TCefWindowRef.SetWindowAppIcon(const image: ICefImage);
|
|
begin
|
|
PCefWindow(FData)^.set_window_app_icon(PCefWindow(FData), CefGetData(image));
|
|
end;
|
|
|
|
function TCefWindowRef.GetWindowAppIcon : ICefImage;
|
|
begin
|
|
Result := TCefImageRef.UnWrap(PCefWindow(FData)^.get_window_app_icon(PCefWindow(FData)));
|
|
end;
|
|
|
|
function TCefWindowRef.AddOverlayView(const view: ICefView; docking_mode: TCefDockingMode): ICefOverlayController;
|
|
begin
|
|
Result := TCefOverlayControllerRef.UnWrap(PCefWindow(FData)^.add_overlay_view(PCefWindow(FData),
|
|
CefGetData(view),
|
|
docking_mode));
|
|
end;
|
|
|
|
procedure TCefWindowRef.ShowMenu(const menu_model : ICefMenuModel;
|
|
const screen_point : TCefPoint;
|
|
anchor_position : TCefMenuAnchorPosition);
|
|
begin
|
|
PCefWindow(FData)^.show_menu(PCefWindow(FData),
|
|
CefGetData(menu_model),
|
|
@screen_point,
|
|
anchor_position);
|
|
end;
|
|
|
|
procedure TCefWindowRef.CancelMenu;
|
|
begin
|
|
PCefWindow(FData)^.cancel_menu(PCefWindow(FData));
|
|
end;
|
|
|
|
function TCefWindowRef.GetDisplay : ICefDisplay;
|
|
begin
|
|
Result := TCefDisplayRef.UnWrap(PCefWindow(FData)^.get_display(PCefWindow(FData)));
|
|
end;
|
|
|
|
function TCefWindowRef.GetClientAreaBoundsInScreen : TCefRect;
|
|
begin
|
|
Result := PCefWindow(FData)^.get_client_area_bounds_in_screen(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.SetDraggableRegions(regionsCount: NativeUInt; const regions: PCefDraggableRegionArray);
|
|
begin
|
|
PCefWindow(FData)^.set_draggable_regions(PCefWindow(FData), regionsCount, regions);
|
|
end;
|
|
|
|
function TCefWindowRef.GetWindowHandle : TCefWindowHandle;
|
|
begin
|
|
Result := PCefWindow(FData)^.get_window_handle(PCefWindow(FData));
|
|
end;
|
|
|
|
procedure TCefWindowRef.SendKeyPress(key_code: Integer; event_flags: cardinal);
|
|
begin
|
|
PCefWindow(FData)^.send_key_press(PCefWindow(FData), key_code, event_flags);
|
|
end;
|
|
|
|
procedure TCefWindowRef.SendMouseMove(screen_x, screen_y: Integer);
|
|
begin
|
|
PCefWindow(FData)^.send_mouse_move(PCefWindow(FData), screen_x, screen_y);
|
|
end;
|
|
|
|
procedure TCefWindowRef.SendMouseEvents(button : TCefMouseButtonType;
|
|
mouse_down : boolean;
|
|
mouse_up : boolean);
|
|
begin
|
|
PCefWindow(FData)^.send_mouse_events(PCefWindow(FData),
|
|
button,
|
|
ord(mouse_down),
|
|
ord(mouse_up));
|
|
end;
|
|
|
|
procedure TCefWindowRef.SetAccelerator(command_id : Integer;
|
|
key_code : Integer;
|
|
shift_pressed : boolean;
|
|
ctrl_pressed : boolean;
|
|
alt_pressed : boolean);
|
|
begin
|
|
PCefWindow(FData)^.set_accelerator(PCefWindow(FData),
|
|
command_id,
|
|
key_code,
|
|
ord(shift_pressed),
|
|
ord(ctrl_pressed),
|
|
ord(alt_pressed));
|
|
end;
|
|
|
|
procedure TCefWindowRef.RemoveAccelerator(command_id: Integer);
|
|
begin
|
|
PCefWindow(FData)^.remove_accelerator(PCefWindow(FData), command_id);
|
|
end;
|
|
|
|
procedure TCefWindowRef.RemoveAllAccelerators;
|
|
begin
|
|
PCefWindow(FData)^.remove_all_accelerators(PCefWindow(FData));
|
|
end;
|
|
|
|
class function TCefWindowRef.UnWrap(data: Pointer): ICefWindow;
|
|
begin
|
|
if (data <> nil) then
|
|
Result := Create(data) as ICefWindow
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
class function TCefWindowRef.CreateTopLevel(const delegate: ICefWindowDelegate): ICefWindow;
|
|
var
|
|
TempWindow : PCefWindow;
|
|
begin
|
|
Result := nil;
|
|
|
|
if (delegate <> nil) then
|
|
begin
|
|
TempWindow := cef_window_create_top_level(CefGetData(delegate));
|
|
|
|
if (TempWindow <> nil) then
|
|
Result := Create(TempWindow) as ICefWindow;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|