mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-16 12:09:32 +02:00
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:
parent
499bcaf7b1
commit
25f463a798
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user