Sorry for not providing enough information, i thought this would be a general problem with the gtk2 interface, this is not the case.

i have tried to track it down with a small test program that invalidates a square of 11 pixels and this worked. I compared the test program with the real one and the real one has a TScrollBar created in the TCustomControl. Without that scroll bar is works fine with gtk2, when i call InvalidateRect, paint will get called only with that rect (of cause, the first time will be the full control):
  FormCreate
  Paint ClipRect: Top:0 Right: 500 Bottom: 500 Left:0
  Paint ClipRect: Top:0 Right: 10 Bottom: 10 Left:0
  ...

now i add the ScrollBar in TPaintTest.Create:

  FormCreate
  Paint ClipRect: Top:0 Right: 481 Bottom: 500 Left:0
  Paint ClipRect: Top:0 Right: 481 Bottom: 500 Left:0
  Paint ClipRect: Top:0 Right: 481 Bottom: 500 Left:0
  ...

now we always get the full area to be updated with gtk2. With gtk1 and windows i also get 0,10,10,0 as expected.

Test program (complete project @ http://www.ardiehl.de/temp/painttest.zip)

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, LCLintf,
  StdCtrls, ExtCtrls, ComCtrls;

type
  TPaintTest = class (TCustomControl)
  protected
    procedure paint; override;
  private
    t : TTimer;
    ScrollBar : TScrollBar;
  public
    constructor Create(AOwner: TComponent); override;
    procedure invalidateTest(Sender:TObject);
  end;

  { TForm1 }

  TForm1 = class(TForm)
    Panel1: TPanel;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var t : TPaintTest;
begin
  writeln('FormCreate');
  width := 600; height := 600;
  t := TPaintTest.Create(self);
  t.Parent := panel1;
end;

constructor TPaintTest.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  // with this scroll bar, Canvas.ClipRect always returns full area
  ScrollBar:= TScrollBar.Create(Self);
  ScrollBar.Kind := sbVertical;  ScrollBar.Align := alRight;
  ScrollBar.LargeChange := 100;  ScrollBar.Max := 1000;
  ScrollBar.Parent := Self;

  self.width := 500; self.height := 500;
  t := TTimer.create(self);  t.interval := 1000;
  t.onTimer := @invalidateTest;  t.enabled := true;
end;

procedure TPaintTest.paint;
var r : TRect;
begin
  r := Canvas.ClipRect;
writeln ('Paint ClipRect: Top:',r.top,' Right: ',r.right,' Bottom: ',R.Bottom,' Left:',r.Left);
end;

procedure TPaintTest.invalidateTest(Sender:TObject);
var r : TRect;
begin
  r.top := 0; r.Left:=0; r.Right:=10; r.Bottom:=10;
  if assigned(Parent) then
    InvalidateRect(Handle, @r, FALSE);
end;



{$R *.lfm}

end.




Any idea what i can do ?


How to get an idea with such informations ? What's wrong
a) TGtk2WidgetSet.InvalidateRect
b) Canvas.ClipRect
?
A little bit more information would be indeed helpfull.

One thing I noticed on ubuntu gnome is that Canvas.ClipRect is always the
full region even when the region was only partially masked by another
window. On solaris 10 with Java Desktop System, also gtk2, Canvas.ClipRect
returns the area masked by the other window. So, this could even be a window
manager "thing".

Ludo



--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus


--

----------------
GrĂ¼sse
Armin Diehl
[email protected]


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to