mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 20:39:09 +02:00
LCL, GTK2: Update ScrollBox.VertScrollBar.Position when scrolling with mouse wheel. Patch from August Klein, issue #19428
git-svn-id: trunk@30967 -
This commit is contained in:
parent
cd184e930b
commit
550b1d3a3a
@ -2700,6 +2700,50 @@ begin
|
||||
Result := DeliverMessage(AWidgetInfo^.LCLObject, Msg) <> 0;
|
||||
end;
|
||||
|
||||
function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow; AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
||||
var
|
||||
Msg: TLMVScroll;
|
||||
AValue: Double;
|
||||
Range: PGtkRange;
|
||||
begin
|
||||
case AEvent^.direction of
|
||||
GDK_SCROLL_UP,
|
||||
GDK_SCROLL_DOWN: Msg.Msg := LM_VSCROLL;
|
||||
GDK_SCROLL_LEFT,
|
||||
GDK_SCROLL_RIGHT: Msg.Msg := LM_HSCROLL;
|
||||
end;
|
||||
|
||||
case Msg.Msg of
|
||||
LM_VSCROLL: Range := GTK_RANGE(AScrollWindow^.vscrollbar);
|
||||
LM_HSCROLL: Range := GTK_RANGE(AScrollWindow^.hscrollbar);
|
||||
end;
|
||||
|
||||
AValue := power(Range^.adjustment^.page_size, 2 / 3);
|
||||
|
||||
if (AEvent^.direction = GDK_SCROLL_UP) or
|
||||
(AEvent^.direction = GDK_SCROLL_LEFT)
|
||||
then
|
||||
AValue := -AValue;
|
||||
|
||||
AValue := gtk_range_get_value(Range) + AValue;
|
||||
|
||||
AValue := Max(AValue, Range^.adjustment^.lower);
|
||||
AValue := Min(AValue, Range^.adjustment^.upper - Range^.adjustment^.page_size);
|
||||
|
||||
with Msg do
|
||||
begin
|
||||
Pos := Round(AValue);
|
||||
if Pos < High(SmallPos) then
|
||||
SmallPos := Pos
|
||||
else
|
||||
SmallPos := High(SmallPos);
|
||||
|
||||
ScrollBar := HWND(PtrUInt(Range));
|
||||
ScrollCode := SB_THUMBPOSITION;
|
||||
end;
|
||||
Result := DeliverMessage(AWidgetInfo^.LCLObject, Msg) <> 0;
|
||||
end;
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
Function: GTKKeySnooper
|
||||
Params: Widget: The widget for which this event is fired
|
||||
|
@ -206,7 +206,8 @@ function GTKVScrollCB(Adjustment: PGTKAdjustment;
|
||||
// PGtkRange cb
|
||||
function Gtk2RangeScrollCB(ARange: PGtkRange; AScrollType: TGtkScrollType;
|
||||
AValue: gdouble; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
||||
|
||||
function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow;
|
||||
AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
||||
function GTKCheckMenuToggeledCB(AMenuItem: PGTKCheckMenuItem;
|
||||
AData: gPointer): GBoolean; cdecl;
|
||||
function GTKKeySnooper(Widget: PGtkWidget; Event: PGdkEventKey;
|
||||
|
@ -154,50 +154,6 @@ uses
|
||||
|
||||
{ TGtk2WSWinControl }
|
||||
|
||||
function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow; AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
||||
var
|
||||
Msg: TLMVScroll;
|
||||
AValue: Double;
|
||||
Range: PGtkRange;
|
||||
begin
|
||||
case AEvent^.direction of
|
||||
GDK_SCROLL_UP,
|
||||
GDK_SCROLL_DOWN: Msg.Msg := LM_VSCROLL;
|
||||
GDK_SCROLL_LEFT,
|
||||
GDK_SCROLL_RIGHT: Msg.Msg := LM_HSCROLL;
|
||||
end;
|
||||
|
||||
case Msg.Msg of
|
||||
LM_VSCROLL: Range := GTK_RANGE(AScrollWindow^.vscrollbar);
|
||||
LM_HSCROLL: Range := GTK_RANGE(AScrollWindow^.hscrollbar);
|
||||
end;
|
||||
|
||||
AValue := power(Range^.adjustment^.page_size, 2 / 3);
|
||||
|
||||
if (AEvent^.direction = GDK_SCROLL_UP) or
|
||||
(AEvent^.direction = GDK_SCROLL_LEFT)
|
||||
then
|
||||
AValue := -AValue;
|
||||
|
||||
AValue := gtk_range_get_value(Range) + AValue;
|
||||
|
||||
AValue := Max(AValue, Range^.adjustment^.lower);
|
||||
AValue := Min(AValue, Range^.adjustment^.upper - Range^.adjustment^.page_size);
|
||||
|
||||
with Msg do
|
||||
begin
|
||||
Pos := Round(AValue);
|
||||
if Pos < High(SmallPos) then
|
||||
SmallPos := Pos
|
||||
else
|
||||
SmallPos := High(SmallPos);
|
||||
|
||||
ScrollBar := HWND(PtrUInt(Range));
|
||||
ScrollCode := SB_THUMBPOSITION;
|
||||
end;
|
||||
Result := DeliverMessage(AWidgetInfo^.LCLObject, Msg) <> 0;
|
||||
end;
|
||||
|
||||
|
||||
class function TGtk2WSWinControl.CreateHandle(const AWinControl: TWinControl;
|
||||
const AParams: TCreateParams): HWND;
|
||||
|
@ -735,6 +735,8 @@ begin
|
||||
TGCallback(@Gtk2RangeScrollCB), WidgetInfo);
|
||||
g_signal_connect(Scrolled^.vscrollbar, 'change-value',
|
||||
TGCallback(@Gtk2RangeScrollCB), WidgetInfo);
|
||||
g_signal_connect(Scrolled, 'scroll-event',
|
||||
TGCallback(@Gtk2ScrolledWindowScrollCB), WidgetInfo);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user