lazarus/lcl/interfaces/gtk3/gtk3int.pas
2017-11-13 23:20:44 +00:00

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.