Package: tk8.4
Version: 8.4.9-1
Severity: normal

The bug is in /usr/lib/tk8.4/spinbox.tcl.  It's possible for a spinbox
button to get effectively "stuck down" so that its action gets invoked
repeatedly until the application is killed.

The <B1-Leave> event is used to start a repeating chain of AutoScan
invocations, each of which schedules the next one, continuing until
some other event (like a <ButtonRelease-1> or a <B1-Enter>) cancels the
next scheduled invocation, whose ID is stored in Priv(afterId).  The
assumption is that a <B1-Leave> event means the user dragged from inside
the widget to outside widget, which means the user must be trying to
select a bunch of text, which ought to continue scrolling as long as the
button is held down outside the widget.

But some window managers can cause a <B1-Leave> event without any
dragging and without any corresponding button release.  In my case,
olvwm allows me to select a window (to give it the focus) by clicking
on it while holding down the WMGrab modifier (which I have configured
to be Control, but I don't think that's relevant).  As a side effect,
this causes a <B1-Leave> event (I don't know why), but no button
release.  Therefore, a never-ending chain of AutoScan invocations is
launched, with no immediate possibility of a <ButtonRelease-1> or
a <B1-Enter> because the button is not even down.  This background
activity is invisible to the user because it has no effect on the
display.  However...

If the user then clicks on one of the spinbox buttons, the background
chain of AutoScan calls can collide with the chain of Invoke calls,
because both use Priv(afterId) to store the ID of the next scheduled
call.  The button is supposed to trigger its -command action repeatedly
as long as it is held down, and the button release triggers the
cancelation of the next call.  But because the ID is shared, the button
release can instead end up terminating the background chain of AutoScan
calls, leaving the chain of Invoke calls going forever.

To reproduce this effect, run olvwm (or olwm) and the following script:

#!/usr/bin/wish
proc foo {} { puts stderr "DEBUG foo" }
spinbox .foo -command foo
pack .foo

Click on the spinbox text area while holding down the WMGrab modifier
(which I think is Alt by default), then click on one of the buttons
once or twice.  You should see an endless stream of "DEBUG foo" on
stderr.  More clues can be gathered by adding debug statements in
/usr/lib/tk8.4/spinbox.tcl.

I think perhaps AutoScan needs to check whether a text selection is
actually in progress (initiated by a button press) rather than assume
that a <B1-Leave> implies that the button is currently down.  It
would probably also be a good idea to use separate variables to store
AutoScan's after ID and Invoke's after ID.

-- System Information:
Debian Release: 3.1
  APT prefers testing
  APT policy: (900, 'testing'), (700, 'unstable')
Architecture: i386 (i686)
Kernel: Linux 2.6.9-2-686
Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1)

Versions of packages tk8.4 depends on:
ii  libc6                    2.3.2.ds1-20    GNU C Library: Shared libraries an
ii  libx11-6                 4.3.0.dfsg.1-10 X Window System protocol client li
ii  tcl8.4                   8.4.9-1         Tcl (the Tool Command Language) v8
ii  xlibs                    4.3.0.dfsg.1-10 X Keyboard Extension (XKB) configu

-- no debconf information


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to