From 7dbec45e6d6a9ff6163ae50fe382f411b37052c0 Mon Sep 17 00:00:00 2001 From: mattias Date: Thu, 13 Aug 2009 06:53:35 +0000 Subject: [PATCH] gtk2 intf: fixed slow down when mouse outside bug #11740, fixed crash when WindowFromPoint widget destroyed git-svn-id: trunk@21213 - --- lcl/forms/calendarpopup.lfm | 12 ++++++------ lcl/forms/calendarpopup.lrs | 10 +++++----- lcl/interfaces/gtk/gtkcallback.inc | 11 ++++++++++- lcl/interfaces/gtk/gtkglobals.pp | 4 ++++ lcl/interfaces/gtk/gtkint.pp | 4 ---- lcl/interfaces/gtk/gtkproc.pp | 1 + lcl/interfaces/gtk/gtkwidgetset.inc | 2 +- lcl/interfaces/gtk/gtkwinapi.inc | 18 ++++++++++++------ 8 files changed, 39 insertions(+), 23 deletions(-) diff --git a/lcl/forms/calendarpopup.lfm b/lcl/forms/calendarpopup.lfm index 68f8023c59..76a25aee32 100644 --- a/lcl/forms/calendarpopup.lfm +++ b/lcl/forms/calendarpopup.lfm @@ -1,23 +1,23 @@ object CalendarPopupForm: TCalendarPopupForm Left = 635 - Height = 155 + Height = 192 Top = 259 - Width = 164 + Width = 233 ActiveControl = Calendar AutoSize = True BorderIcons = [biMinimize, biMaximize] BorderStyle = bsNone Caption = 'CalendarPopupForm' - ClientHeight = 155 - ClientWidth = 164 + ClientHeight = 192 + ClientWidth = 233 OnClose = FormClose OnDeactivate = FormDeactivate LCLVersion = '0.9.27' object Calendar: TCalendar Left = 1 - Height = 153 + Height = 190 Top = 1 - Width = 162 + Width = 231 AutoSize = True BorderSpacing.Around = 1 DateTime = 38823 diff --git a/lcl/forms/calendarpopup.lrs b/lcl/forms/calendarpopup.lrs index bc087793f2..88b12d504e 100644 --- a/lcl/forms/calendarpopup.lrs +++ b/lcl/forms/calendarpopup.lrs @@ -1,13 +1,13 @@ -{ This is an automatically generated lazarus resource file } +{ Das ist eine automatisch erzeugte Lazarus-Ressourcendatei } LazarusResources.Add('TCalendarPopupForm','FORMDATA',[ 'TPF0'#18'TCalendarPopupForm'#17'CalendarPopupForm'#4'Left'#3'{'#2#6'Height'#3 - +#155#0#3'Top'#3#3#1#5'Width'#3#164#0#13'ActiveControl'#7#8'Calendar'#8'AutoS' + +#192#0#3'Top'#3#3#1#5'Width'#3#233#0#13'ActiveControl'#7#8'Calendar'#8'AutoS' +'ize'#9#11'BorderIcons'#11#10'biMinimize'#10'biMaximize'#0#11'BorderStyle'#7 - +#6'bsNone'#7'Caption'#6#17'CalendarPopupForm'#12'ClientHeight'#3#155#0#11'Cl' - +'ientWidth'#3#164#0#7'OnClose'#7#9'FormClose'#12'OnDeactivate'#7#14'FormDeac' + +#6'bsNone'#7'Caption'#6#17'CalendarPopupForm'#12'ClientHeight'#3#192#0#11'Cl' + +'ientWidth'#3#233#0#7'OnClose'#7#9'FormClose'#12'OnDeactivate'#7#14'FormDeac' +'tivate'#10'LCLVersion'#6#6'0.9.27'#0#9'TCalendar'#8'Calendar'#4'Left'#2#1#6 - +'Height'#3#153#0#3'Top'#2#1#5'Width'#3#162#0#8'AutoSize'#9#20'BorderSpacing.' + +'Height'#3#190#0#3'Top'#2#1#5'Width'#3#231#0#8'AutoSize'#9#20'BorderSpacing.' +'Around'#2#1#8'DateTime'#5#0#0#0#0#0#0#167#151#14'@'#10'OnDblClick'#7#16'Cal' +'endarDblClick'#9'OnKeyDown'#7#15'CalendarKeyDown'#7'TabStop'#9#0#0#0 ]); diff --git a/lcl/interfaces/gtk/gtkcallback.inc b/lcl/interfaces/gtk/gtkcallback.inc index bbdf14d079..5005db834e 100644 --- a/lcl/interfaces/gtk/gtkcallback.inc +++ b/lcl/interfaces/gtk/gtkcallback.inc @@ -1057,6 +1057,15 @@ begin FreeWidgetInfo(Widget); end; +function DestroyWindowFromPointCB(Widget: PGtkWidget; data: gPointer + ): GBoolean; cdecl; +begin + Result:=CallBackDefaultReturn; + if PGtkWidget(LastWFPResult)<>Widget then exit; + LastWFPResult:=0; + LastWFPMousePos:=Point(High(Integer),High(Integer)); +end; + function gtkdeleteCB( widget : PGtkWidget; event : PGdkEvent; data : gPointer) : GBoolean; cdecl; var Mess : TLMessage; @@ -1542,7 +1551,7 @@ begin DebugLn(''); DesignOnlySignal:=GetDesignOnlySignalFlag(Widget,dstMousePress); DebugLn('[gtkMouseBtnPress] ', - DbgSName(AWinControl, + DbgSName(AWinControl), ' Widget=',DbgS(Widget), ' ControlWidget=',DbgS(AWinControl.Handle), ' DSO='+dbgs(DesignOnlySignal), diff --git a/lcl/interfaces/gtk/gtkglobals.pp b/lcl/interfaces/gtk/gtkglobals.pp index ce960739f7..f9accc5bc6 100644 --- a/lcl/interfaces/gtk/gtkglobals.pp +++ b/lcl/interfaces/gtk/gtkglobals.pp @@ -69,6 +69,10 @@ var MousePosition: TPoint; MousePositionTime: TDateTime; + // cache for WindowFromPoint + LastWFPMousePos: TPoint; + LastWFPResult: HWND; + const DblClickTime = 250;// 250 miliseconds or less between clicks is a double click DblClickThreshold = 3;// max Movement between two clicks of a DblClick diff --git a/lcl/interfaces/gtk/gtkint.pp b/lcl/interfaces/gtk/gtkint.pp index e2f24a900f..26603914b5 100644 --- a/lcl/interfaces/gtk/gtkint.pp +++ b/lcl/interfaces/gtk/gtkint.pp @@ -131,10 +131,6 @@ type FDragImageListIcon: PGtkWidget; FDragHotStop: TPoint; - // cache for WindowFromPoint - FLastWFPMousePos: TPoint; - FLastWFPResult: HWND; - function CreateThemeServices: TThemeServices; override; function GetDeviceContextClass: TGtkDeviceContextClass; virtual; abstract; public diff --git a/lcl/interfaces/gtk/gtkproc.pp b/lcl/interfaces/gtk/gtkproc.pp index 2b9a2889c4..7fd7b9bcdd 100644 --- a/lcl/interfaces/gtk/gtkproc.pp +++ b/lcl/interfaces/gtk/gtkproc.pp @@ -140,6 +140,7 @@ function GTKKillFocusCB(widget: PGtkWidget; event:PGdkEventFocus; function GTKKillFocusCBAfter(widget: PGtkWidget; event:PGdkEventFocus; data: gPointer): GBoolean; cdecl; function gtkdestroyCB(widget: PGtkWidget; data: gPointer): GBoolean; cdecl; +function DestroyWindowFromPointCB(Widget: PGtkWidget; data: gPointer): GBoolean; cdecl; function gtkdeleteCB(widget: PGtkWidget; event: PGdkEvent; data: gPointer): GBoolean; cdecl; function gtkresizeCB(widget: PGtkWidget; data: gPointer): GBoolean; cdecl; diff --git a/lcl/interfaces/gtk/gtkwidgetset.inc b/lcl/interfaces/gtk/gtkwidgetset.inc index 32e9592f5f..122a5e2f4f 100644 --- a/lcl/interfaces/gtk/gtkwidgetset.inc +++ b/lcl/interfaces/gtk/gtkwidgetset.inc @@ -181,7 +181,7 @@ begin inherited Create; - FLastWFPMousePos := Point(MaxInt, MaxInt); + LastWFPMousePos := Point(MaxInt, MaxInt); {$IFDEF EnabledGtkThreading} {$IFNDEF Win32} diff --git a/lcl/interfaces/gtk/gtkwinapi.inc b/lcl/interfaces/gtk/gtkwinapi.inc index 2e1582effc..451ed935c5 100644 --- a/lcl/interfaces/gtk/gtkwinapi.inc +++ b/lcl/interfaces/gtk/gtkwinapi.inc @@ -9695,10 +9695,8 @@ var p: TPoint; begin // return cached value to prevent heavy gdk_window_at_pointer call - if (APoint = FLastWFPMousePos) and GTK_IS_WIDGET(Pointer(FLastWFPResult)) then - Exit(FLastWFPResult); - //DebugLn('WindowFromPoint: ', dbgs(APoint)); - //DumpStack; + if (APoint = LastWFPMousePos) then + Exit(LastWFPResult); Result := 0; // !!!gdk_window_at_pointer changes the coordinates!!! @@ -9712,8 +9710,16 @@ begin Widget := gtk_get_event_widget(@ev); Result := PtrUInt(Widget); end; - FLastWFPMousePos := APoint; - FLastWFPResult := Result; + // disconnect old handler + if LastWFPResult<>0 then + g_signal_handlers_disconnect_by_func(GPointer(LastWFPResult), + TGTKSignalFunc(@DestroyWindowFromPointCB), nil); + LastWFPMousePos := APoint; + LastWFPResult := Result; + // connect handler + if LastWFPResult<>0 then + g_signal_connect(GPointer(LastWFPResult), 'destroy', + TGTKSignalFunc(@DestroyWindowFromPointCB), nil); end; //##apiwiz##eps## // Do not remove