mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-18 23:03:08 +02:00
226 lines
6.9 KiB
ObjectPascal
226 lines
6.9 KiB
ObjectPascal
{
|
|
*****************************************************************************
|
|
* gtk3int.pas *
|
|
* ------------- *
|
|
* *
|
|
* *
|
|
*****************************************************************************
|
|
|
|
*****************************************************************************
|
|
This file is part of the Lazarus Component Library (LCL)
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
}
|
|
unit gtk3int;
|
|
{$i gtk3defines.inc}
|
|
{$mode objfpc}
|
|
{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF UNIX}
|
|
BaseUnix, Unix,
|
|
{$ENDIF}
|
|
SysUtils, Classes, types,
|
|
// LazUtils
|
|
LazUTF8, Translations, IntegerList,
|
|
// LCL
|
|
LCLPlatformDef, InterfaceBase, LCLProc, LCLStrConsts, LCLType, LMessages,
|
|
Controls, Forms, FPImage, Graphics, GraphUtil, GraphType, IntfGraphics,
|
|
LazGtk3, LazGdk3, LazGlib2, LazGObject2, LazCairo1, LazPango1, LazPangoCairo1, LazGio2,
|
|
LazGdkPixbuf2, gtk3widgets, gtk3objects, gtk3procs;
|
|
|
|
type
|
|
|
|
{ lazarus GtkInterface definition for additional timer data, not in gtk }
|
|
PGtkITimerInfo = ^TGtkITimerinfo;
|
|
TGtkITimerInfo = record
|
|
TimerHandle: guint; // the gtk handle for this timer
|
|
TimerFunc : TWSTimerProc; // owner function to handle timer
|
|
end;
|
|
|
|
{ TGtk3WidgetSet }
|
|
|
|
TGtk3WidgetSet = class(TWidgetSet)
|
|
private
|
|
FMainPoll: PGPollFD;
|
|
FGtk3Application: PGtkApplication;
|
|
FDefaultAppFontName: String;
|
|
{$IFDEF UNIX}
|
|
FChildSignalHandlers: PChildSignalEventHandler;
|
|
{$ELSE}
|
|
{$IFDEF VerboseGtkToDos}{$warning no declaration of FChildSignalHandlers for this OS}{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
procedure Gtk3Create;
|
|
procedure Gtk3Destroy;
|
|
{$IFNDEF UNIX}
|
|
procedure DoWakeMainThread(Sender: TObject);
|
|
{$ENDIF}
|
|
procedure SetDefaultAppFontName;
|
|
procedure InitSysColorBrushes;
|
|
procedure FreeSysColorBrushes;
|
|
protected
|
|
{shared stuff}
|
|
FAppIcon: PGdkPixbuf;
|
|
FStockNullBrush: HBRUSH;
|
|
FStockBlackBrush: HBRUSH;
|
|
FStockLtGrayBrush: HBRUSH;
|
|
FStockGrayBrush: HBRUSH;
|
|
FStockDkGrayBrush: HBRUSH;
|
|
FStockWhiteBrush: HBRUSH;
|
|
|
|
FStockNullPen: HPEN;
|
|
FStockBlackPen: HPEN;
|
|
FStockWhitePen: HPEN;
|
|
FStockSystemFont: HFONT;
|
|
FStockDefaultDC: HDC;
|
|
FSysColorBrushes: array[0..MAX_SYS_COLORS] of HBRUSH;
|
|
FGlobalCursor: HCursor;
|
|
FThemeName: string;
|
|
FCSSTheme: TStringList;
|
|
public
|
|
function CreateDCForWidget(AWidget: PGtkWidget; AWindow: PGdkWindow; cr: Pcairo_t): HDC;
|
|
procedure AddWindow(AWindow: PGtkWindow);
|
|
{$IFDEF UNIX}
|
|
procedure InitSynchronizeSupport;
|
|
procedure ProcessChildSignal;
|
|
procedure PrepareSynchronize({%H-}AObject: TObject);
|
|
{$ENDIF}
|
|
procedure LoadCSSTheme;
|
|
procedure ClearCSSTheme;
|
|
function GetCSSTheme(AList: TStrings): boolean;
|
|
function GetThemeName: string;
|
|
procedure InitStockItems;
|
|
procedure FreeStockItems;
|
|
function CreateDefaultFont: HFONT;
|
|
|
|
public
|
|
constructor Create; override;
|
|
destructor Destroy; override;
|
|
|
|
function LCLPlatform: TLCLPlatform; override;
|
|
procedure AppInit(var ScreenInfo: TScreenInfo); override;
|
|
procedure AppRun(const ALoop: TApplicationMainLoop); override;
|
|
procedure AppWaitMessage; override;
|
|
procedure AppProcessMessages; override;
|
|
procedure AppTerminate; override;
|
|
|
|
procedure AppMinimize; override;
|
|
procedure AppRestore; override;
|
|
procedure AppBringToFront; override;
|
|
procedure AppSetIcon(const Small, Big: HICON); override;
|
|
procedure AppSetTitle(const ATitle: string); override;
|
|
function AppRemoveStayOnTopFlags(const ASystemTopAlso: Boolean = False): Boolean; override;
|
|
function AppRestoreStayOnTopFlags(const ASystemTopAlso: Boolean = False): Boolean; override;
|
|
|
|
function CreateStandardCursor(ACursor: SmallInt): HCURSOR; override;
|
|
|
|
function DCGetPixel(CanvasHandle: HDC; X, Y: integer): TGraphicsColor; override;
|
|
procedure DCSetPixel(CanvasHandle: HDC; X, Y: integer; AColor: TGraphicsColor); override;
|
|
procedure DCRedraw(CanvasHandle: HDC); override;
|
|
procedure DCSetAntialiasing(CanvasHandle: HDC; AEnabled: Boolean); override;
|
|
procedure SetDesigning(AComponent: TComponent); override;
|
|
|
|
function CreateTimer(Interval: integer; TimerFunc: TWSTimerProc): THandle; override;
|
|
function DestroyTimer(TimerHandle: THandle): boolean; override;
|
|
|
|
function IsValidDC(const DC: HDC): Boolean;
|
|
function IsValidGDIObject(const AGdiObject: HGDIOBJ): Boolean;
|
|
function IsValidHandle(const AHandle: HWND): Boolean;
|
|
|
|
property AppIcon: PGdkPixbuf read FAppIcon;
|
|
property DefaultAppFontName: String read FDefaultAppFontName;
|
|
property Gtk3Application: PGtkApplication read FGtk3Application;
|
|
|
|
{$i gtk3winapih.inc}
|
|
{$i gtk3lclintfh.inc}
|
|
end;
|
|
|
|
var
|
|
GTK3WidgetSet: TGTK3WidgetSet;
|
|
// FTimerData contains the currently running timers
|
|
FTimerData: TFPList; // list of PGtkITimerinfo
|
|
|
|
|
|
function Gtk3WidgetFromGtkWidget(const AWidget: PGtkWidget): TGtk3Widget;
|
|
function HwndFromGtkWidget(AWidget: PGtkWidget): HWND;
|
|
|
|
implementation
|
|
uses
|
|
Math, LCLMessageGlue,
|
|
{%H-}Gtk3WSFactory{%H-};
|
|
|
|
const
|
|
GTK_RESPONSE_LCL_ALL = -10;
|
|
GTK_RESPONSE_LCL_YESTOALL = -3; // GTK_RESPONSE_ACCEPT;
|
|
GTK_RESPONSE_LCL_RETRY = -12;
|
|
GTK_RESPONSE_LCL_IGNORE = -13;
|
|
GTK_RESPONSE_LCL_NOTOALL = -14;
|
|
|
|
{------------------------------------------------------------------------------
|
|
Function: FillStandardDescription
|
|
Params:
|
|
Returns:
|
|
------------------------------------------------------------------------------}
|
|
procedure FillStandardDescription(var Desc: TRawImageDescription);
|
|
begin
|
|
Desc.Init;
|
|
|
|
Desc.Format := ricfRGBA;
|
|
// Desc.Width := 0
|
|
// Desc.Height := 0
|
|
// Desc.PaletteColorCount := 0;
|
|
|
|
Desc.BitOrder := riboReversedBits;
|
|
Desc.ByteOrder := riboLSBFirst;
|
|
Desc.LineOrder := riloTopToBottom;
|
|
|
|
Desc.BitsPerPixel := 32;
|
|
Desc.Depth := 32;
|
|
// Qt wants dword-aligned data
|
|
Desc.LineEnd := rileDWordBoundary;
|
|
|
|
// 8-8-8-8 mode, high byte is Alpha
|
|
Desc.AlphaPrec := 8;
|
|
Desc.RedPrec := 8;
|
|
Desc.GreenPrec := 8;
|
|
Desc.BluePrec := 8;
|
|
|
|
Desc.AlphaShift := 24;
|
|
Desc.RedShift := 16;
|
|
Desc.GreenShift := 8;
|
|
// Desc.BlueShift := 0;
|
|
|
|
// Qt wants dword-aligned data
|
|
Desc.MaskLineEnd := rileDWordBoundary;
|
|
Desc.MaskBitOrder := riboReversedBits;
|
|
Desc.MaskBitsPerPixel := 1;
|
|
// Desc.MaskShift := 0;
|
|
end;
|
|
|
|
|
|
function Gtk3WidgetFromGtkWidget(const AWidget: PGtkWidget): TGtk3Widget;
|
|
begin
|
|
Result := nil;
|
|
|
|
if AWidget = nil then
|
|
exit;
|
|
|
|
Result := TGtk3Widget(g_object_get_data(AWidget, 'lclwidget'));
|
|
end;
|
|
|
|
function HwndFromGtkWidget(AWidget: PGtkWidget): HWND;
|
|
begin
|
|
Result := HWND(Gtk3WidgetFromGtkWidget(AWidget));
|
|
end;
|
|
|
|
{$i gtk3object.inc}
|
|
{$i gtk3winapi.inc}
|
|
{$i gtk3lclintf.inc}
|
|
|
|
end.
|