1 program stutter;
2 
3 {$mode objfpc}{$H+}
4 
5 uses
6   Classes, SysUtils, gtk2, gdk2, gdk2pixbuf, glib2;
7 
8 var
9   LastCall: TDateTime;
10   FrameCount: Integer;
11 
gtkExposeEventAfternull12 function gtkExposeEventAfter(Widget: PGtkWidget; Event : PGDKEventExpose;
13   Data: gPointer): GBoolean; cdecl;
14 var
15   children: PGList;
16   n: TDateTime;
17 begin
18   Result:=false;
19   inc(FrameCount);
20   n:=Now;
21   if (n-LastCall)*86400>1 then begin
22     writeln('gtkExposeEventAfter ',FrameCount);
23     FrameCount:=0;
24     LastCall:=LastCall+(1/86400);
25   end;
26 end;
27 
28 var
29   GtkWindow: PGtkWidget;
30   GtkFixed: PGtkWidget;
31   GtkCheckButton: PGtkWidget;
32   FixedName: String;
33   CheckButtonName: String;
34 begin
35   FrameCount:=0;
36   LastCall:=Now;
37 
38   gtk_init(@ARGC,@ARGV);
39   GtkWindow:=gtk_window_new(GTK_WINDOW_TOPLEVEL);
40 
41   GtkFixed := gtk_fixed_new ();
42   gtk_fixed_set_has_window(PGtkFixed(GtkFixed), True);
43   FixedName:='GtkFixed';
44   g_signal_connect_after(PGtkObject(GtkFixed), 'expose-event',
45                          TGTKSignalFunc(@gtkExposeEventAfter), PChar(FixedName));
46 
47   gtk_container_add (PGtkContainer(GtkWindow), GtkFixed);
48 
49   GtkCheckButton:=gtk_check_button_new_with_label('Second');
50   CheckButtonName:='GtkCheckButton';
51   g_signal_connect_after(PGtkObject(GtkCheckButton), 'expose-event',
52                          TGTKSignalFunc(@gtkExposeEventAfter), PChar(CheckButtonName));
53   gtk_fixed_put(PGtkFixed(GtkFixed),GtkCheckButton,300,300);
54 
55 
56   gtk_widget_show_all(GtkWindow);
57 
58   repeat
59     // process all gtk messages
60     gtk_main_iteration_do(True);
61     // idle
62     // invalidate
63     gtk_widget_queue_clear_area(GtkFixed,0,0,1000,1000);
64     gtk_widget_queue_draw_area(GtkFixed,0,0,1000,1000);
65   until false;
66   //gtk_main;
67 end.
68 
69