LCL-GTK3: Make drawtext use proper default color etc. Issue #38335, patch from Anton Kavalenka.

git-svn-id: trunk@64368 -
This commit is contained in:
juha 2021-01-09 20:41:22 +00:00
parent 499bcaf7b1
commit 25f463a798
5 changed files with 112 additions and 63 deletions

View File

@ -1159,21 +1159,24 @@ const
GTK_RECENT_MANAGER_ERROR_WRITE: TGtkRecentManagerError = 5;
GTK_RECENT_MANAGER_ERROR_UNKNOWN: TGtkRecentManagerError = 6;
type
TGtkResponseType = Integer;
//type ???
// TGtkResponseType = integer;
//PPGtkResponseType = ^PGtkResponseType;
//PGtkResponseType = ^TGtkResponseType;
const
{ GtkResponseType }
GTK_RESPONSE_NONE: TGtkResponseType = -1;
GTK_RESPONSE_REJECT: TGtkResponseType = -2;
GTK_RESPONSE_ACCEPT: TGtkResponseType = -3;
GTK_RESPONSE_DELETE_EVENT: TGtkResponseType = -4;
GTK_RESPONSE_OK: TGtkResponseType = -5;
GTK_RESPONSE_CANCEL: TGtkResponseType = -6;
GTK_RESPONSE_CLOSE: TGtkResponseType = -7;
GTK_RESPONSE_YES: TGtkResponseType = -8;
GTK_RESPONSE_NO: TGtkResponseType = -9;
GTK_RESPONSE_APPLY: TGtkResponseType = -10;
GTK_RESPONSE_HELP: TGtkResponseType = -11;
GTK_RESPONSE_NONE = -1;
GTK_RESPONSE_REJECT = -2;
GTK_RESPONSE_ACCEPT = -3;
GTK_RESPONSE_DELETE_EVENT = -4;
GTK_RESPONSE_OK = -5;
GTK_RESPONSE_CANCEL = -6;
GTK_RESPONSE_CLOSE = -7;
GTK_RESPONSE_YES = -8;
GTK_RESPONSE_NO = -9;
GTK_RESPONSE_APPLY = -10;
GTK_RESPONSE_HELP = -11;
type
TGtkScrollStep = Integer;
@ -8960,16 +8963,9 @@ type
natural_size: gint;
end;
PPGtkResponseType = ^PGtkResponseType;
PGtkResponseType = ^TGtkResponseType;
TGtkScalePrivate = record
end;
PPGtkScaleButton = ^PGtkScaleButton;
PGtkScaleButton = ^TGtkScaleButton;

View File

@ -115,15 +115,15 @@ end;
class function TGtk3DialogFactory.gtk_resp_to_lcl(const gtk_resp:integer):integer;
begin
case gtk_resp of
-5{GTK_RESPONSE_OK}: Result:= ID_OK;
-6{GTK_RESPONSE_CANCEL}: Result := id_Cancel;
-7{GTK_RESPONSE_CLOSE}: Result:=id_Close;
-8{GTK_RESPONSE_YES}: Result:=id_Yes;
-9{GTK_RESPONSE_NO}: Result:=id_No;
GTK_RESPONSE_OK: Result:=ID_OK;
GTK_RESPONSE_CANCEL: Result:=id_Cancel;
GTK_RESPONSE_CLOSE: Result:=id_Close;
GTK_RESPONSE_YES: Result:=id_Yes;
GTK_RESPONSE_NO: Result:=id_No;
-1{GTK_RESPONSE_NONE}: Result:=0;
-2{GTK_RESPONSE_REJECT}: Result:=id_abort;
-3{GTK_RESPONSE_ACCEPT}: Result:=id_Yes;
GTK_RESPONSE_NONE: Result:=0;
GTK_RESPONSE_REJECT: Result:=id_abort;
GTK_RESPONSE_ACCEPT: Result:=id_Yes;
GTK_RESPONSE_LCL_RETRY: Result:=id_Retry;
GTK_RESPONSE_LCL_IGNORE: Result:=id_Ignore;

View File

@ -183,8 +183,15 @@ type
{ TGtk3Cursor }
TGtk3Cursor = class(TGtk3ContextObject)
// TODO
TGtk3Cursor = class(TGtk3Object)
private
fHandle:PGdkCursor;
public
constructor Create(ACur:integer);overload;
constructor Create(pixbuf:PGdkPixbuf;x,y:gint);overload;
constructor Create(img:TGtk3Image);overload;
destructor Destroy;override;
property Handle:PGdkCursor read fHandle;
end;
{ TGtk3DeviceContext }
@ -257,7 +264,7 @@ type
procedure fillRect(x, y, w, h: Integer; ABrush: HBRUSH); overload;
procedure fillRect(x, y, w, h: Integer); overload;
function RoundRect(X1, Y1, X2, Y2: Integer; RX, RY: Integer): Boolean;
function drawFocusRect(const aRect: TRect): boolean;
function getBpp: integer;
function getDepth: integer;
function getDeviceSize: TPoint;
@ -299,7 +306,7 @@ function ReplaceAmpersandsWithUnderscores(const S: string): string; inline;
implementation
uses gtk3int;
uses gtk3int,controls;
const
PixelOffset = 0.5; // Cairo API needs 0.5 pixel offset to not make blurry lines
@ -452,6 +459,40 @@ begin
B := ((AColor shr 16) and $FF) / 255;
end;
{ TGtk3Cursor }
constructor TGtk3Cursor.Create(ACur:integer);
var gdk_cur:integer;
begin
case ACur of
crArrow: gdk_cur:=GDK_ARROW;
else
gdk_cur:=GDK_ARROW;
end;
Fhandle:=TGdkCursor.new(gdk_cur);
end;
constructor TGtk3Cursor.Create(pixbuf: PGdkPixbuf;x,y:gint);
begin
fHandle:=TGdkCursor.new_from_pixbuf(TGdkDisplay.get_default(),pixbuf,x,y);
end;
constructor TGtk3Cursor.Create(img: TGtk3Image);
var w,h:gint;
begin
inherited Create;
w:=img.width;
h:=img.height;
Create(img.Handle,w,h);
end;
destructor TGtk3Cursor.Destroy;
begin
PGdkCursor(fHandle)^.unref();
inherited Destroy;
end;
{ TGtk3ContextObject }
constructor TGtk3ContextObject.Create;
@ -1670,7 +1711,7 @@ begin
ornt := Self.FCurrentFont.FLogFont.lfOrientation;
if ornt<>0 then
cairo_rotate(pcr, - pi * (ornt / 10)/180);
ColorToCairoRGB(TColor(CurrentTextColor), R, G, B);
ColorToCairoRGB(ColorToRgb(TColor(CurrentTextColor)), R, G, B);
cairo_set_source_rgb(pcr, R, G, B);
FCurrentFont.Layout^.set_text(AText, ALen);
@ -2062,6 +2103,42 @@ begin
end;
end;
function TGtk3DeviceContext.drawFocusRect(const aRect: TRect): boolean;
var
Context: PGtkStyleContext;
AValue: TGValue;
begin
Result := False;
if Parent <> nil then
Context := Parent^.get_style_context
else
begin
Context:=TGtkStyleContext.new();
Context^.add_class('button');
//gtk_style_context_get(Context,GTK_STATE_NORMAL,[]);
{ if gtk_widget_get_default_style^.has_context then
begin
// Context := gtk_widget_get_default_style^.has_context
AValue.g_type := G_TYPE_POINTER;
AValue.set_pointer(nil);
g_object_get_property(gtk_widget_get_default_style,'context',@AValue);
Context := AValue.get_pointer;
AValue.unset;
end else
Context := nil;}
end;
if Context = nil then
begin
DebugLn('WARNING: TGtk3WidgetSet.DrawFocusRect drawing focus on non widget context isn''t implemented.');
exit;
end;
with aRect do
gtk_render_focus(Context ,pcr, Left, Top, Right - Left, Bottom - Top);
Result := True;
end;
function TGtk3DeviceContext.getBpp: integer;
var
AVisual: PGdkVisual;

View File

@ -1164,7 +1164,7 @@ begin
end;
GDK_BUTTON_RELEASE:
begin
if not (csClickEvents in TGtk3Widget(Data).LCLObject.ControlStyle) then
//if not (csClickEvents in TGtk3Widget(Data).LCLObject.ControlStyle) then
Result := TGtk3Widget(Data).GtkEventMouse(Widget , Event);
end;
GDK_KEY_PRESS:

View File

@ -452,15 +452,17 @@ begin
Result := HICON(TGtk3Image.Create(TGtk3Image(IconInfo^.hbmColor).Handle));
end else
begin
Result := HCURSOR({%H-}PtrUInt(gdk_cursor_new_from_pixbuf(gdk_display_get_default,
TGtk3Image(IconInfo^.hbmColor).Handle, IconInfo^.xHotSpot, IconInfo^.yHotSpot)));
// create cursor from pixbuf
W := gdk_pixbuf_get_width(TGtk3Image(IconInfo^.hbmColor).Handle);
{ W := gdk_pixbuf_get_width(TGtk3Image(IconInfo^.hbmColor).Handle);
H := gdk_pixbuf_get_height(TGtk3Image(IconInfo^.hbmColor).Handle);
DebugLn('TGtk3WidgetSet.CreateIconIndirect W=',dbgs(W),' H=',dbgs(H));
PixBuf := gdk_pixbuf_new_subpixbuf(TGtk3Image(IconInfo^.hbmColor).Handle, 0, 0, W, H);
Result := HCURSOR({%H-}PtrUInt(gdk_cursor_new_from_pixbuf(gdk_display_get_default,
pixbuf, IconInfo^.xHotSpot, IconInfo^.yHotSpot)));
if pixbuf <> nil then
g_object_unref(PixBuf);
g_object_unref(PixBuf); }
end;
end;
end;
@ -606,36 +608,10 @@ begin
end;
function TGtk3WidgetSet.DrawFocusRect(DC: HDC; const aRect: TRect): boolean;
var
Context: PGtkStyleContext;
AValue: TGValue;
begin
Result := False;
if IsValidDC(DC) then
begin
if TGtk3DeviceContext(DC).Parent <> nil then
Context := TGtk3DeviceContext(DC).Parent^.get_style_context
else
if gtk_widget_get_default_style^.has_context then
begin
// Context := gtk_widget_get_default_style^.has_context
AValue.g_type := G_TYPE_POINTER;
AValue.set_pointer(nil);
g_object_get_property(gtk_widget_get_default_style,'context',@AValue);
Context := AValue.get_pointer;
AValue.unset;
end else
Context := nil;
if Context = nil then
begin
DebugLn('WARNING: TGtk3WidgetSet.DrawFocusRect drawing focus on non widget context isn''t implemented.');
exit;
end;
with aRect do
gtk_render_focus(Context ,TGtk3DeviceContext(DC).pcr, Left, Top, Right - Left, Bottom - Top);
Result := True;
end;
Result:=TGtk3DeviceContext(DC).drawFocusRect(aRect);
end;
function TGtk3WidgetSet.DrawEdge(DC: HDC; var ARect: TRect; Edge: Cardinal;