Gtk2: sync scrollbars positions of form when using mouse wheel.issue #25479

git-svn-id: trunk@44204 -
This commit is contained in:
zeljko 2014-02-22 21:43:58 +00:00
parent e9d4aa718b
commit a41090acd9
3 changed files with 68 additions and 0 deletions

View File

@ -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

View File

@ -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',

View File

@ -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;