diff --git a/lcl/interfaces/gtk3/gtk3object.inc b/lcl/interfaces/gtk3/gtk3object.inc index 1b905cfc44..64fe5c6fb7 100644 --- a/lcl/interfaces/gtk3/gtk3object.inc +++ b/lcl/interfaces/gtk3/gtk3object.inc @@ -95,7 +95,7 @@ begin g_type_init; gtk_init(@argc, @argv); AGtkThread := g_thread_self(); - AId := 'lcl.' + dbgHex(PtrUInt(AGtkThread)); + AId := 'org.lcl.thread_' + dbgHex(PtrUInt(AGtkThread)); FGtk3Application := TGtkApplication.new(PgChar(AId), G_APPLICATION_NON_UNIQUE); // FGtk3Application^.set_application_id(PgChar(AId)); FGtk3Application^.register(nil, nil); diff --git a/lcl/interfaces/gtk3/gtk3objects.pas b/lcl/interfaces/gtk3/gtk3objects.pas index 7cfe89e43d..b17d242fe0 100644 --- a/lcl/interfaces/gtk3/gtk3objects.pas +++ b/lcl/interfaces/gtk3/gtk3objects.pas @@ -966,7 +966,7 @@ begin if FBkMode = TRANSPARENT then begin DebugLn('TGtk3DeviceContext.ApplyBrush setting transparent source'); - cairo_set_source_surface(Widget, CairoSurface, 0 , 0); + //cairo_set_source_surface(Widget, CairoSurface, 0 , 0); end else SetSourceColor(FCurrentBrush.Color); end; @@ -1552,13 +1552,14 @@ begin if ABrush <> 0 then begin ATempBrush := FCurrentBrush; + fBkMode:=OPAQUE; SetCurrentBrush(TGtk3Brush(ABrush)); end; applyBrush; cairo_rectangle(Widget, x, y, w, h); + cairo_stroke_preserve(Widget); cairo_fill(Widget); - cairo_stroke(Widget); // cairo_clip(Widget); // cairo_fill_preserve(Widget); diff --git a/lcl/interfaces/gtk3/gtk3widgets.pas b/lcl/interfaces/gtk3/gtk3widgets.pas index 46ebe1365c..3f52c610f8 100644 --- a/lcl/interfaces/gtk3/gtk3widgets.pas +++ b/lcl/interfaces/gtk3/gtk3widgets.pas @@ -1665,9 +1665,10 @@ function TGtk3Widget.GtkEventPaint(Sender: PGtkWidget; AContext: Pcairo_t ): Boolean; cdecl; var Msg: TLMPaint; - AStruct: PPaintStruct; + AStruct: TPaintStruct; P: TPoint; AClipRect: TGdkRectangle; + localClip:TRect; begin Result := False; @@ -1677,9 +1678,9 @@ begin FillChar(Msg, SizeOf(Msg), #0); Msg.Msg := LM_PAINT; - New(AStruct); - FillChar(AStruct^, SizeOf(TPaintStruct), 0); - Msg.PaintStruct := AStruct; + //New(AStruct); + FillChar(AStruct, SizeOf(TPaintStruct), 0); + Msg.PaintStruct := @AStruct; with PaintData do begin @@ -1690,14 +1691,15 @@ begin ClipRegion := nil; // gdk_cairo_region(AContext, ClipRegion); // Event^.expose.region; - if ClipRect = nil then - New(ClipRect); + //if ClipRect = nil then + // New(ClipRect); gdk_cairo_get_clip_rectangle(AContext, @AClipRect); - ClipRect^ := RectFromGdkRect(AClipRect); + localClip:=RectFromGdkRect(AClipRect); + ClipRect := @localClip; end; FCairoContext := AContext; - Msg.DC := BeginPaint(THandle(Self), AStruct^); + Msg.DC := BeginPaint(THandle(Self), AStruct); FContext := Msg.DC; Msg.PaintStruct^.rcPaint := PaintData.ClipRect^; @@ -1743,11 +1745,11 @@ begin LCLObject.WindowProc(TLMessage(Msg)); finally FCairoContext := nil; - Dispose(PaintData.ClipRect); + //Dispose(PaintData.ClipRect); Fillchar(FPaintData, SizeOf(FPaintData), 0); FContext := 0; - EndPaint(THandle(Self), AStruct^); - Dispose(AStruct); + EndPaint(THandle(Self), AStruct); + //Dispose(AStruct); end; except Application.HandleException(nil); diff --git a/lcl/interfaces/gtk3/gtk3winapi.inc b/lcl/interfaces/gtk3/gtk3winapi.inc index 6c742dca16..393aadd1bd 100644 --- a/lcl/interfaces/gtk3/gtk3winapi.inc +++ b/lcl/interfaces/gtk3/gtk3winapi.inc @@ -210,7 +210,7 @@ begin cairo_region_get_extents(RSrc1, @ACairoRect); TGtk3Region(Dest).Handle := cairo_region_create_rectangle(@ACairoRect); RDest := TGtk3Region(Dest).Handle; - cairo_region_translate(RDest, -ACairoRect.x, -ACairoRect.y); + //cairo_region_translate(RDest, -ACairoRect.x, -ACairoRect.y); end else AStatus := cairo_region_intersect(RDest, RSrc1); end; @@ -1361,6 +1361,29 @@ begin Result := cairo_region_equal(TGtk3Region(Rgn1).Handle,TGtk3Region(Rgn2).Handle); end; +function TGtk3WidgetSet.IntersectClipRect(dc: hdc; Left, Top, Right,Bottom: Integer): Integer; +var + ncorg,dcOrigin:TPoint; + rgn,clip:HRGN; +begin + {$IFDEF GTK3DEBUGNOTIMPLEMENTED} + DebugLn('WARNING: TGtk3WidgetSet.ExcludeClipRect not implemented ...'); + {$ENDIF} + rgn:=Self.CreateRectRgn(Left,Top,Right,Bottom); + //Self.SelectClipRGN(dc,rgn); + clip:=Self.CreateEmptyRegion; + Self.GetClipRGN(dc,clip); + Self.CombineRgn(clip,rgn,clip,RGN_AND); + Self.SelectClipRGN(dc,clip); + DeleteObject(clip); + DeleteObject(rgn); + // fail Self.ExtSelectClipRGN(dc,rgn,RGN_AND); + { ncorg:=Tgtk3DeviceContext(dc).fncOrigin; + GetWindowOrgEx(DC, @DCOrigin); + Result:=inherited IntersectClipRect(dc, Left, Top, Right, Bottom);} +end; + + function TGtk3WidgetSet.ExcludeClipRect(dc: hdc; Left, Top, Right, Bottom: Integer): Integer; begin diff --git a/lcl/interfaces/gtk3/gtk3winapih.inc b/lcl/interfaces/gtk3/gtk3winapih.inc index 0ec3895559..80d1e6f999 100644 --- a/lcl/interfaces/gtk3/gtk3winapih.inc +++ b/lcl/interfaces/gtk3/gtk3winapih.inc @@ -87,6 +87,7 @@ function EnumFontFamilies(DC: HDC; Family: Pchar; EnumFontFamProc: FontEnumProc; {$ENDIF} function EnumFontFamiliesEx({%H-}DC: HDC; lpLogFont: PLogFont; Callback: FontEnumExProc; Lparam: LParam; {%H-}Flags: dword): longint; override; function EqualRgn(Rgn1: HRGN; Rgn2: HRGN): Boolean; override; +function IntersectClipRect(dc: hdc; Left, Top, Right,Bottom: Integer): Integer; override; function ExcludeClipRect(dc: hdc; Left, Top, Right, Bottom : Integer) : Integer; override; function ExtCreatePen(dwPenStyle, dwWidth: DWord; const lplb: TLogBrush; dwStyleCount: DWord; lpStyle: PDWord): HPEN; override; function ExtSelectClipRGN(dc: hdc; rgn : hrgn; Mode : Longint) : Integer; override;