diff --git a/lcl/interfaces/gtk2/gtk2callback.inc b/lcl/interfaces/gtk2/gtk2callback.inc index f1f477f28e..e57d87eec0 100644 --- a/lcl/interfaces/gtk2/gtk2callback.inc +++ b/lcl/interfaces/gtk2/gtk2callback.inc @@ -2664,18 +2664,17 @@ function Gtk2RangeScrollCB(ARange: PGtkRange; AScrollType: TGtkScrollType; var Msg: TLMVScroll; MaxValue: gdouble; - State: PByte; + Widget: PGTKWidget; begin Result := CallBackDefaultReturn; + Widget:=PGTKWidget(ARange); //DebugLn(Format('Trace:[Gtk2RangeScrollCB] Value: %d', [RoundToInt(AValue)])); if G_OBJECT_TYPE(ARange) = gtk_hscrollbar_get_type then Msg.Msg := LM_HSCROLL else Msg.Msg := LM_VSCROLL; - if (AWidgetInfo^.LCLObject is TScrollingWinControl) then - begin if ARange^.adjustment^.page_size > 0 then MaxValue := ARange^.adjustment^.upper - ARange^.adjustment^.page_size else @@ -2685,7 +2684,6 @@ begin Result := not Result; AValue := MaxValue; end; - end; with Msg do begin @@ -2698,16 +2696,11 @@ begin ScrollBar := HWND(PtrUInt(ARange)); ScrollCode := GtkScrollTypeToScrollCode(AScrollType); end; - Result := DeliverMessage(AWidgetInfo^.LCLObject, Msg) <> 0; - - if not Result or not (AWidgetInfo^.LCLObject is TScrollBar) or - not Assigned(AWidgetInfo^.UserData) then exit; - - State:=AWidgetInfo^.UserData; + DeliverMessage(AWidgetInfo^.LCLObject, Msg); if Msg.Scrollcode=SB_THUMBTRACK then begin - if State^ = 0 then + if Widget^.state = 0 then begin Msg.ScrollCode := SB_THUMBPOSITION; DeliverMessage(AWidgetInfo^.LCLObject, Msg); @@ -2715,22 +2708,14 @@ begin DeliverMessage(AWidgetInfo^.LCLObject, Msg); end; end - else State^:=1; + else Widget^.state := 1; end; function Gtk2RangeScrollPressCB(Widget: PGtkWidget; Event: PGdkEventButton; Data: gPointer): gboolean; cdecl; -var - State: PByte; - WidgetInfo: PWidgetInfo; begin - WidgetInfo:=GetWidgetInfo(Widget, false); - if Assigned(WidgetInfo^.UserData) then - begin - State:=WidgetInfo^.UserData; - State^:=2; - end; - Result:=False; + Widget^.state := 2; + Result := CallBackDefaultReturn;; end; function Gtk2RangeScrollReleaseCB(Widget: PGtkWidget; @@ -2738,17 +2723,15 @@ function Gtk2RangeScrollReleaseCB(Widget: PGtkWidget; var Avalue: gdouble; WidgetInfo: PWidgetInfo; - State: PByte; begin AValue:=PGtkRange(Widget)^.adjustment^.value; - WidgetInfo:=GetWidgetInfo(Widget, false); - If Assigned(WidgetInfo^.UserData) then - begin - State:=WidgetInfo^.UserData; - if State^=1 then Gtk2RangeScrollCB(PGtkRange(Widget), 0, AValue, WidgetInfo); - State^:=0; - end; - Result:=False; + WidgetInfo:=GetWidgetInfo(Widget, False); + if not Assigned(WidgetInfo) then + WidgetInfo:=GetWidgetInfo(Widget^.parent, False); + if Assigned(WidgetInfo) and (Widget^.state = 1) then + Gtk2RangeScrollCB(PGtkRange(Widget), 0, AValue, WidgetInfo); + Widget^.state := 0; + Result := CallBackDefaultReturn; end; function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow; AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl; diff --git a/lcl/interfaces/gtk2/gtk2wscontrols.pp b/lcl/interfaces/gtk2/gtk2wscontrols.pp index 86186836c0..c43fc1683f 100644 --- a/lcl/interfaces/gtk2/gtk2wscontrols.pp +++ b/lcl/interfaces/gtk2/gtk2wscontrols.pp @@ -190,6 +190,14 @@ begin TGCallback(@Gtk2RangeScrollCB), WidgetInfo); g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.vscrollbar, 'change-value', TGCallback(@Gtk2RangeScrollCB), WidgetInfo); + g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.hscrollbar, 'button-press-event', + TGCallback(@Gtk2RangeScrollPressCB), WidgetInfo); + g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.hscrollbar, 'button-release-event', + TGCallback(@Gtk2RangeScrollReleaseCB), WidgetInfo); + g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.vscrollbar, 'button-press-event', + TGCallback(@Gtk2RangeScrollPressCB), WidgetInfo); + g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.vscrollbar, 'button-release-event', + TGCallback(@Gtk2RangeScrollReleaseCB), WidgetInfo); g_signal_connect(Widget, 'scroll-event', TGCallback(@Gtk2ScrolledWindowScrollCB), WidgetInfo); end; diff --git a/lcl/interfaces/gtk2/gtk2wsstdctrls.pp b/lcl/interfaces/gtk2/gtk2wsstdctrls.pp index a18ee8b72a..a40cae9754 100644 --- a/lcl/interfaces/gtk2/gtk2wsstdctrls.pp +++ b/lcl/interfaces/gtk2/gtk2wsstdctrls.pp @@ -2442,7 +2442,6 @@ var Adjustment: PGtkAdjustment = nil; Widget: PGtkWidget; WidgetInfo: PWidgetInfo; - State: PByte; begin with TScrollBar(AWinControl) do begin @@ -2464,11 +2463,6 @@ begin {$ENDIF} WidgetInfo := CreateWidgetInfo(Pointer(Result), AWinControl, AParams); - WidgetInfo^.DataOwner:=True; - State:=New(PByte); - WidgetInfo^.UserData:=State; - State^:=0; - Set_RC_Name(AWinControl, Widget); SetCallbacks(Widget, WidgetInfo); end; diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index d26784ee48..d926839b87 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -6208,7 +6208,7 @@ begin LMScroll.Pos := p1; LMScroll.ScrollCode := SIF_POS; - if not InUpdate then + if not InUpdate and not getTracking then DeliverMessage(LMScroll); b := p1 = getMax;