mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 04:39:22 +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;
|
Result:=True;
|
||||||
end;
|
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;
|
function Gtk2RangeScrollPressCB(Widget: PGtkWidget;
|
||||||
Event: PGdkEventButton; Data: gPointer): gboolean; cdecl;
|
Event: PGdkEventButton; Data: gPointer): gboolean; cdecl;
|
||||||
begin
|
begin
|
||||||
|
@ -7475,6 +7475,10 @@ begin
|
|||||||
TGCallback(@Gtk2RangeScrollCB), AWidgetInfo);
|
TGCallback(@Gtk2RangeScrollCB), AWidgetInfo);
|
||||||
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.vscrollbar, 'change-value',
|
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.vscrollbar, 'change-value',
|
||||||
TGCallback(@Gtk2RangeScrollCB), AWidgetInfo);
|
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',
|
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.hscrollbar, 'button-press-event',
|
||||||
TGCallback(@Gtk2RangeScrollPressCB), AWidgetInfo);
|
TGCallback(@Gtk2RangeScrollPressCB), AWidgetInfo);
|
||||||
g_signal_connect(PGTKScrolledWindow(ScrolledWidget)^.hscrollbar, 'button-release-event',
|
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;
|
{%H-}Event: PGdkEventButton; {%H-}Data: gPointer): gboolean; cdecl;
|
||||||
function Gtk2RangeUbuntuScrollCB(Adjustment: PGTKAdjustment; data: GPointer): GBoolean; cdecl;
|
function Gtk2RangeUbuntuScrollCB(Adjustment: PGTKAdjustment; data: GPointer): GBoolean; cdecl;
|
||||||
|
|
||||||
|
procedure Gtk2RangeValueChanged(ARange: PGTKRange; data: GPointer); cdecl;
|
||||||
|
|
||||||
function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow;
|
function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow;
|
||||||
AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
||||||
function GTKCheckMenuToggeledCB(AMenuItem: PGTKCheckMenuItem;
|
function GTKCheckMenuToggeledCB(AMenuItem: PGTKCheckMenuItem;
|
||||||
|
Loading…
Reference in New Issue
Block a user