mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-19 05:30:59 +02:00
Gtk2: sync scrollbars positions of form when using mouse wheel.issue #25479
git-svn-id: trunk@44204 -
This commit is contained in:
parent
e9d4aa718b
commit
a41090acd9
@ -3146,6 +3146,68 @@ begin
|
||||
Result:=True;
|
||||
end;
|
||||
|
||||
procedure Gtk2RangeValueChanged(ARange: PGTKRange; data: GPointer); cdecl;
|
||||
var
|
||||
Msg: TLMVScroll;
|
||||
MaxValue: gdouble;
|
||||
Widget: PGTKWidget;
|
||||
AValue: gDouble;
|
||||
begin
|
||||
// used only by TCustomForm ! #issue #25479
|
||||
Widget := PGTKWidget(ARange);
|
||||
if G_OBJECT_TYPE(ARange) = gtk_hscrollbar_get_type then
|
||||
Msg.Msg := LM_HSCROLL
|
||||
else
|
||||
Msg.Msg := LM_VSCROLL;
|
||||
|
||||
AValue := gtk_range_get_value(ARange);
|
||||
|
||||
if ARange^.adjustment^.page_size > 0 then
|
||||
MaxValue := ARange^.adjustment^.upper - ARange^.adjustment^.page_size
|
||||
else
|
||||
MaxValue := ARange^.adjustment^.upper;
|
||||
|
||||
if (AValue > MaxValue) then
|
||||
AValue := MaxValue
|
||||
else if (AValue < ARange^.adjustment^.lower) then
|
||||
AValue := ARange^.adjustment^.lower;
|
||||
|
||||
with Msg do
|
||||
begin
|
||||
Pos := Round(AValue);
|
||||
if Pos < High(SmallPos) then
|
||||
SmallPos := Pos
|
||||
else
|
||||
SmallPos := High(SmallPos);
|
||||
|
||||
ScrollBar := HWND({%H-}PtrUInt(ARange));
|
||||
ScrollCode := SB_THUMBTRACK;
|
||||
end;
|
||||
|
||||
// do not send messages to LCL if we are already synced.
|
||||
if (Msg.Msg = LM_VSCROLL) and
|
||||
(TCustomForm(PWidgetInfo(Data)^.LCLObject).VertScrollBar.Position = Msg.Pos) then
|
||||
exit
|
||||
else
|
||||
if (Msg.Msg = LM_HSCROLL) and
|
||||
(TCustomForm(PWidgetInfo(Data)^.LCLObject).HorzScrollBar.Position = Msg.Pos) then
|
||||
exit;
|
||||
|
||||
DeliverMessage(PWidgetInfo(Data)^.LCLObject, Msg);
|
||||
|
||||
if Msg.Scrollcode=SB_THUMBTRACK then
|
||||
begin
|
||||
if Widget^.state = 0 then
|
||||
begin
|
||||
Msg.ScrollCode := SB_THUMBPOSITION;
|
||||
DeliverMessage(PWidgetInfo(Data)^.LCLObject, Msg);
|
||||
Msg.ScrollCode:=SB_ENDSCROLL;
|
||||
DeliverMessage(PWidgetInfo(Data)^.LCLObject, Msg);
|
||||
end;
|
||||
end
|
||||
else Widget^.state := 1;
|
||||
end;
|
||||
|
||||
function Gtk2RangeScrollPressCB(Widget: PGtkWidget;
|
||||
Event: PGdkEventButton; Data: gPointer): gboolean; cdecl;
|
||||
begin
|
||||
|
@ -7475,6 +7475,10 @@ begin
|
||||
TGCallback(@Gtk2RangeScrollCB), AWidgetInfo);
|
||||
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.vscrollbar, 'change-value',
|
||||
TGCallback(@Gtk2RangeScrollCB), AWidgetInfo);
|
||||
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.hscrollbar, 'value-changed',
|
||||
TGCallback(@Gtk2RangeValueChanged), AWidgetInfo);
|
||||
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.vscrollbar, 'value-changed',
|
||||
TGCallback(@Gtk2RangeValueChanged), AWidgetInfo);
|
||||
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.hscrollbar, 'button-press-event',
|
||||
TGCallback(@Gtk2RangeScrollPressCB), AWidgetInfo);
|
||||
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.hscrollbar, 'button-release-event',
|
||||
|
@ -206,6 +206,8 @@ function Gtk2RangeScrollReleaseCB(Widget: PGtkWidget;
|
||||
{%H-}Event: PGdkEventButton; {%H-}Data: gPointer): gboolean; cdecl;
|
||||
function Gtk2RangeUbuntuScrollCB(Adjustment: PGTKAdjustment; data: GPointer): GBoolean; cdecl;
|
||||
|
||||
procedure Gtk2RangeValueChanged(ARange: PGTKRange; data: GPointer); cdecl;
|
||||
|
||||
function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow;
|
||||
AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
||||
function GTKCheckMenuToggeledCB(AMenuItem: PGTKCheckMenuItem;
|
||||
|
Loading…
Reference in New Issue
Block a user