scrollutil::addMouseWheelSupport
Commandscrollutil::createWheelEventBindings
Commandscrollutil::enableScrollingByWheel
Commandscrollutil::adaptWheelEventHandling
Commandscrollutil::setFocusCheckWindow
Commandscrollutil::focusCheckWindow
Commandscrollutil::addMouseWheelSupport
Commandscrollutil::addMouseWheelSupport
– Add mouse wheel
supportscrollutil::addMouseWheelSupport tag ?axes?
axes
argument, which must be
xy
(the default, meaning both the x and y axis),
x
(meaning the x axis only), or y
(meaning the y
axis only). The binding scripts created by this command will scroll
the window given by the %W
event field with the aid of
the xview scroll number units
and yview scroll number units
subcommands of the associated Tcl command.tag
is the
path name of a window then the binding scripts created by this command are
terminated by an invocation of the break
command, in
order to prevent the processing of the mouse wheel events by further
binding scripts. For example, if tag
is the path
name of a text widget then the terminating break
command makes sure that the mouse wheel events will not additionally
be processed by the class bindings (associated with the binding tag
Text
), which in Tk 8.5 and later trigger a scrolling by
pixels, unlike the bindings created by this command, which scroll
the widget by units (i.e., lines and characters).Canvas
or individual canvas widgets.<MouseWheel>
on Windows,
<MouseWheel>
and
<Option-MouseWheel>
on Mac OS X, and
<MouseWheel>
,
<Button-4>
and
<Button-5>
on X11 (where
<MouseWheel>
is not triggered by the X server,
but can be produced using event generate
).
The mouse wheel events along the horizontal axis are
<Shift-MouseWheel>
on Windows,
<Shift-MouseWheel>
and
<Shift-Option-MouseWheel>
on Mac OS X, and
<Shift-MouseWheel>
,
<Shift-Button-4>
and
<Shift-Button-5>
on X11 (where
<Shift-MouseWheel>
is not triggered by the X
server, but can be produced using event
generate
). On X11, when using Tk 8.7a3 or later, there are
two more mouse wheel events along the horizontal axis:
<Button-6>
and
<Button-7>
, which are handled just like
<Shift-Button-4>
and
<Shift-Button-5>
, respectively. These
events are commonly triggered by left/right tilting the scroll wheel of a
mouse having one or two additional (thumb) buttons. (In Tk versions
8.6.x, with x >= 10, left/right tilting the scroll wheel of such a mouse
gives rise to <Shift-MouseWheel>
events on
Windows and Mac OS X Aqua, and to
<Shift-Button-4>
and
<Shift-Button-5>
events on X11.)scrollutil::createWheelEventBindings
Commandscrollutil::createWheelEventBindings
– Create mouse
wheel event bindingsscrollutil::createWheelEventBindings ?tag tag ...?
scrollutil::enableScrollingByWheel
then these
events will trigger a scrolling of that widget container. In case of
several nested registered scrollable widget containers fulfilling these
conditions the innermost one will be scrolled. Each
tag
argument must be all
or the
path name of an existing toplevel widget (including
.
).tag
arguments to all
and path names
of existing toplevel widgets rather than supporting also tags like
"Scrollableframe"
(for scrollutil::scrollableframe),
"BwScrollableFrame"
(for BWidget ScrollableFrame) or
"Scrolledframe"
(for iwidgets::scrolledframe) is that the
mouse wheel events should trigger a scrolling of the widget container under
the pointer not only if the widget under the pointer is the widget
container itself but also if it is a descendant of the latter (recall that
for each window, the path name of its nearest toplevel ancestor and the tag
all
are contained in the window's default list of
binding tags).scrollutil::enableScrollingByWheel
Commandscrollutil::enableScrollingByWheel
– Register
scrollable widget containers for scrolling by the mouse wheelscrollutil::enableScrollingByWheel ?scrollableWidgetContainer scrollableWidgetContainer ...?
scrollutil::createWheelEventBindings
command.scrollutil::adaptWheelEventHandling
Commandscrollutil::adaptWheelEventHandling
– Adapt mouse
wheel event handlingscrollutil::adaptWheelEventHandling ?widget widget ...?
widget
argument, the command performs the
following actions:widget
is the path name of a tablelist widget then it sets
the latter's -xmousewheelwindow
and
-ymousewheelwindow
options to the path name of
the containing toplevel window, provided that the Tablelist version
is 6.4 or later (for earlier Tablelist versions the command silently
ignores any tablelist widget passed to it as argument). As a
result, a mouse wheel event over the tablelist's body or edit window
(more precisely, a mouse wheel event sent to any component of the
tablelist having the binding tag TablelistBody
or
TablelistEdit
) will be handled as follows:
event generate
. This in
turn will trigger a scrolling of the (innermost) widget container
that is an ancestor of widget
and has the same
toplevel (if there is such a scrollable widget container), provided
that the path name of the containing toplevel widget or the binding
tag all
was passed to the scrollutil::createWheelEventBindings
command and this widget container was registered for scrolling via
scrollutil::enableScrollingByWheel
.all
. If the
search for this tag was successful then the command modifies the
widget's list of binding tags by prepending the tag
WheeleventRedir
and appending the tag
WheeleventBreak
to this binding tag. As a
result, a mouse wheel event sent to this widget will be handled as
follows:
[focusCheckWindow
widget]
then the event will be handled by the
binding script associated with this tag and no further processing
of the event will take place.[focusCheckWindow widget]
then the
event will be redirected to the containing toplevel window
via event generate
rather than
being handled by the binding script associated with the
above-mentioned tag. This in turn will trigger a scrolling of
the (innermost) widget container that is an ancestor of
widget
and has the same toplevel (if there is
such a scrollable widget container), provided that the path name of
the containing toplevel widget or the binding tag
all
was passed to the scrollutil::createWheelEventBindings
command and this widget container was registered for scrolling via
scrollutil::enableScrollingByWheel
."Date"
, "Time"
, "DateTime"
,
"IPAddr"
, and "IPv6Addr"
(for Mentry versions 3.2
and above).classic
and aqua
on the
Macintosh. Scrollutil eliminates this discrepancy by automatically
creating the Scrollbar
class bindings for mouse wheel
events on Windows and X11. Note also that the ttk::scrollbar widget
has no built-in class bindings for mouse wheel events, but
Scrollutil automatically creates the missing bindings by copying the mouse
wheel event bindings of the widget class Scrollbar
to
the binding tag TScrollbar
.setwidget
subcommand, then this
command will automatically be invoked for the scrollbars of that
scrollarea, too.scrollutil::setFocusCheckWindow
Commandscrollutil::setFocusCheckWindow
– Set the "focus
check window"scrollutil::setFocusCheckWindow widget ?widget ...? otherWidget
widget
argument, the command sets the
associated "focus check window" to otherWidget
.
This is the window to be used in the binding scripts for the tag
WheeleventRedir
instead of the
widget when checking whether the focus is on/inside or outside that
window. For each widget
argument,
otherWidget
must be an ancestor of or identical to
widget
.widget
arguments
gets destroyed, the association between the widget and its "focus check
window" is automatically removed.WheeleventRedir
less restrictive. For
example, if the widget under the pointer is an entry component of a
mentry me
of type "Date"
, "Time"
, "DateTime"
,
"IPAddr"
, or "IPv6Addr"
and the focus is on any
of its siblings, then the mouse wheel events sent to this entry should be
handled by the entry widget itself rather than scrolling the widget
container that is an ascendant of the mentry. You can achieve this by
invoking
set entryList [$me entries]
eval scrollutil::adaptWheelEventHandling $entryList
eval scrollutil::setFocusCheckWindow $entryList [list $me]
set entryList [$me entries]
scrollutil::adaptWheelEventHandling {*}$entryList
scrollutil::setFocusCheckWindow {*}$entryList $me
ss
is a scrollsync
widget that was populated via its setwidgets
subcommand with
child widgets. Then, if the widget under the pointer is one of these
children and the focus is on any of the other children passed to that
subcommand, then the mouse wheel events sent to the child under the pointer
should be handled by that child widget itself rather than scrolling the
widget container that is an ascendant of the scrollsync. You can
achieve this with the following code:
set widgetList [$ss widgets]
eval scrollutil::adaptWheelEventHandling $widgetList
eval scrollutil::setFocusCheckWindow $widgetList [list $ss]
set widgetList [$ss widgets]
scrollutil::adaptWheelEventHandling {*}$widgetList
scrollutil::setFocusCheckWindow {*}$widgetList $ss
scrollutil::focusCheckWindow
Commandscrollutil::focusCheckWindow
– Query the "focus
check window"scrollutil::focusCheckWindow widget
widget
argument. This is the window that is used
in the binding scripts for the tag WheeleventRedir
instead of the widget when checking
whether the focus is on/inside or outside that window. If the command
scrollutil::setFocusCheckWindow
was not
invoked for widget
then the return value is
widget
itself.