diff --git a/lcl/include/intfbaselcl.inc b/lcl/include/intfbaselcl.inc index c944939875..bb7455e802 100644 --- a/lcl/include/intfbaselcl.inc +++ b/lcl/include/intfbaselcl.inc @@ -26,7 +26,8 @@ } //##apiwiz##sps## // Do not remove -procedure TWidgetSet.AddEventHandler(AHandle: THandle; AFlags: dword; AEventHandler: TWaitHandleEvent); +procedure TWidgetSet.AddEventHandler(AHandle: THandle; AFlags: dword; + AEventHandler: TWaitHandleEvent; AData: PtrInt); begin end; diff --git a/lcl/include/lclintf.inc b/lcl/include/lclintf.inc index 3c14a9dcdc..e605cd7d2a 100644 --- a/lcl/include/lclintf.inc +++ b/lcl/include/lclintf.inc @@ -33,9 +33,10 @@ ******************************************************************************} //##apiwiz##sps## // Do not remove -procedure AddEventHandler(AHandle: THandle; AFlags: dword; AEventHandler: TWaitHandleEvent); +procedure AddEventHandler(AHandle: THandle; AFlags: dword; + AEventHandler: TWaitHandleEvent; AData: PtrInt = 0); begin - WidgetSet.AddEventHandler(AHandle, AFlags, AEventHandler); + WidgetSet.AddEventHandler(AHandle, AFlags, AEventHandler, AData); end; procedure AttachMenuToWindow(AMenuObject: TComponent); diff --git a/lcl/include/lclintfh.inc b/lcl/include/lclintfh.inc index 3465fb31b6..ac6fde59bf 100644 --- a/lcl/include/lclintfh.inc +++ b/lcl/include/lclintfh.inc @@ -37,7 +37,7 @@ ******************************************************************************} //##apiwiz##sps## // Do not remove -procedure AddEventHandler(AHandle: THandle; AFlags: dword; AEventHandler: TWaitHandleEvent); {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} +procedure AddEventHandler(AHandle: THandle; AFlags: dword; AEventHandler: TWaitHandleEvent; AData: PtrInt); {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} procedure AttachMenuToWindow(AMenuObject: TComponent); {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} procedure CallDefaultWndHandler(Sender: TObject; var Message); {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} diff --git a/lcl/interfacebase.pp b/lcl/interfacebase.pp index 81421a29a3..fbdfee7195 100644 --- a/lcl/interfacebase.pp +++ b/lcl/interfacebase.pp @@ -38,7 +38,7 @@ uses type TApplicationMainLoop = procedure of object; - TWaitHandleEvent = procedure(AHandle: THandle; AFlags: dword) of object; + TWaitHandleEvent = procedure(AData: PtrInt; AFlags: dword) of object; { TWidgetSet } diff --git a/lcl/interfaces/gtk/gtklclintf.inc b/lcl/interfaces/gtk/gtklclintf.inc index 177c62b182..a472ae4900 100644 --- a/lcl/interfaces/gtk/gtklclintf.inc +++ b/lcl/interfaces/gtk/gtklclintf.inc @@ -34,12 +34,12 @@ function waithandle_iocallback(source: PGIOChannel; condition: TGIOCondition; var lEventHandler: PWaitHandleEventHandler absolute data; begin - lEventHandler^.OnEvent(lEventHandler^.Handle, condition); + lEventHandler^.OnEvent(lEventHandler^.UserData, condition); result := true; end; procedure TGtkWidgetSet.AddEventHandler(AHandle: THandle; AFlags: dword; - AEventHandler: TWaitHandleEvent); + AEventHandler: TWaitHandleEvent; AData: PtrInt); var giochannel: pgiochannel; lEventHandler: PWaitHandleEventHandler; @@ -48,6 +48,7 @@ begin New(lEventHandler); giochannel := g_io_channel_unix_new(AHandle); lEventHandler^.Handle := AHandle; + lEventHandler^.UserData := AData; lEventHandler^.GIOChannel := giochannel; lEventHandler^.OnEvent := AEventHandler; lEventHandler^.GSourceID := g_io_add_watch(giochannel, diff --git a/lcl/interfaces/gtk/gtklclintfh.inc b/lcl/interfaces/gtk/gtklclintfh.inc index 448d9cb14c..36e8350cfc 100644 --- a/lcl/interfaces/gtk/gtklclintfh.inc +++ b/lcl/interfaces/gtk/gtklclintfh.inc @@ -29,7 +29,8 @@ } //##apiwiz##sps## // Do not remove -procedure AddEventHandler(AHandle: THandle; AFlags: dword; AEventHandler: TWaitHandleEvent); override; +procedure AddEventHandler(AHandle: THandle; AFlags: dword; + AEventHandler: TWaitHandleEvent; AData: PtrInt); override; function DrawSplitter(DC: HDC; const ARect: TRect; Horizontal: boolean): boolean; override; function ExtUTF8Out(DC: HDC; X, Y: Integer; Options: Longint; Rect: PRect; diff --git a/lcl/interfaces/gtk/gtkproc.pp b/lcl/interfaces/gtk/gtkproc.pp index f628d8853b..8130fc7123 100644 --- a/lcl/interfaces/gtk/gtkproc.pp +++ b/lcl/interfaces/gtk/gtkproc.pp @@ -64,6 +64,7 @@ type Handle: THandle; GIOChannel: pgiochannel; GSourceID: guint; + UserData: PtrInt; OnEvent: TWaitHandleEvent; NextHandler: PWaitHandleEventHandler; end; diff --git a/lcl/interfaces/win32/win32int.pp b/lcl/interfaces/win32/win32int.pp index c916b85608..f9e8551ab9 100644 --- a/lcl/interfaces/win32/win32int.pp +++ b/lcl/interfaces/win32/win32int.pp @@ -101,6 +101,11 @@ Type dwICC: dword; end; + TWaitHandler = record + UserData: PtrInt; + OnEvent: TWaitHandleEvent; + end; + { Win32 interface-object class } TWin32WidgetSet = Class(TWidgetSet) Private @@ -124,7 +129,7 @@ Type FWaitHandleCount: dword; FWaitHandles: array of HANDLE; - FWaitHandleCallbacks: array of TWaitHandleEvent; + FWaitHandlers: array of TWaitHandler; FThemesActive: boolean; FThemeLibrary: HMODULE; diff --git a/lcl/interfaces/win32/win32lclintf.inc b/lcl/interfaces/win32/win32lclintf.inc index d29c08f838..ec94c8bcf7 100644 --- a/lcl/interfaces/win32/win32lclintf.inc +++ b/lcl/interfaces/win32/win32lclintf.inc @@ -29,7 +29,8 @@ //##apiwiz##sps## // Do not remove -procedure TWin32WidgetSet.AddEventHandler(AHandle: THandle; AFlags: dword; AEventHandler: TWaitHandleEvent); +procedure TWin32WidgetSet.AddEventHandler(AHandle: THandle; AFlags: dword; + AEventHandler: TWaitHandleEvent; AData: PtrInt); var listlen: dword; begin @@ -38,10 +39,11 @@ begin begin inc(listlen, 16); SetLength(FWaitHandles, listlen); - SetLength(FWaitHandleCallbacks, listlen); + SetLength(FWaitHandlers, listlen); end; FWaitHandles[FWaitHandleCount] := AHandle; - FWaitHandleCallbacks[FWaitHandleCount] := AEventHandler; + FWaitHandlers[FWaitHandleCount].UserData := AData; + FWaitHandlers[FWaitHandleCount].OnEvent := AEventHandler; Inc(FWaitHandleCount); end; @@ -56,7 +58,7 @@ begin if FWaitHandleCount >= 2 then begin FWaitHandles[I] := FWaitHandles[FWaitHandleCount-1]; - FWaitHandleCallbacks[I] := FWaitHandleCallbacks[FWaitHandleCount-1]; + FWaitHandlers[I] := FWaitHandlers[FWaitHandleCount-1]; end; Dec(FWaitHandleCount); exit; diff --git a/lcl/interfaces/win32/win32lclintfh.inc b/lcl/interfaces/win32/win32lclintfh.inc index 2ac13cb042..2d8d91296a 100644 --- a/lcl/interfaces/win32/win32lclintfh.inc +++ b/lcl/interfaces/win32/win32lclintfh.inc @@ -29,7 +29,8 @@ //##apiwiz##sps## // Do not remove -procedure AddEventHandler(AHandle: THandle; AFlags: dword; AEventHandler: TWaitHandleEvent); override; +procedure AddEventHandler(AHandle: THandle; AFlags: dword; + AEventHandler: TWaitHandleEvent; AData: PtrInt); override; procedure DrawArrow(Arrow: TComponent; Canvas: TPersistent); override; diff --git a/lcl/interfaces/win32/win32object.inc b/lcl/interfaces/win32/win32object.inc index 5fae6d6cfa..9fe9fa107f 100644 --- a/lcl/interfaces/win32/win32object.inc +++ b/lcl/interfaces/win32/win32object.inc @@ -335,7 +335,7 @@ begin if (WAIT_OBJECT_0 <= retVal) and (retVal < WAIT_OBJECT_0 + FWaitHandleCount) then begin index := retVal-WAIT_OBJECT_0; - FWaitHandleCallbacks[index](FWaitHandles[index], 0); + FWaitHandlers[index].OnEvent(FWaitHandlers[index].UserData, 0); end else if retVal = WAIT_OBJECT_0 + FWaitHandleCount then done := true; until done;