Angus Leeming wrote:

> On Thursday 30 October 2003 2:00 pm, Ronald Florence wrote:
>> Angus Leeming <[EMAIL PROTECTED]> writes:
>> > The fix is trivial (for Qt too) and requires that
>> > LyX responds only to a subset of mouse events from the underlying
>> > X11, MacOS or Win32 graphics libraries. In the xforms frontend we
>> > use a timer, so:
>> >         // The timer runs for 200ms
>> >         static Timer timer(200);
>> >         if (timer.running())
>> >                 return;
>> >         timer.start();
>> >         dispatch(mouse_event_to_the_lyx_core);
>> >
>> > This could go in, almost as is, to the mouseEventHandler in
>> > QContentPane.C. Feel free to try ;-)
>>
>> Is this fix going into LyX-1.3.4?
> 
> In order for any fix to go in, I'd need to know the Qt equivalent of
> XEvent::xmotion.[x,y].

Well, I had a go. See below. Unfortunately, it doesn't work as I'd 
like. Qt emits a mouseMoveEvent signal only when --- you've guessed 
it --- the mouse is moved. No signal is emitted when the mouse is 
just pressed but otherwise doing nothing. This differs from xforms 
that emits event calls when this happens (using a timer to 
artificially generate events).

So, shold we do what xforms does and start a timer on a mouse press 
event so that we can generate 'pseudo' mouse events every 'interval' 
msecs?

Angus


void QContentPane::mouseMoveEvent(QMouseEvent * e)
{
        // Check if the mouse is above or below the workarea
        if (e->y() <= y() || e->y() >= y() + height()) {
                // The mouse button is depressed and we are outside the
                // workarea. That means we are simultaneously selecting
                // text and scrolling the view.
                // Use a Timeout to react to a drag events only every
                // 200ms. All intervening events are discarded,
                // allowing the user to control position easily.
                static int const discard_interval = 200;
                static Timeout timeout(discard_interval);

                if (timeout.running())
                        return;

                // The timeout is not running, so process the
                // event, first starting the timeout to discard future
                // events.
                timeout.start();
        }

        FuncRequest cmd(LFUN_MOUSE_MOTION, e->x(), e->y(),
                        q_motion_state(e->state()));
        wa_->dispatch(cmd);
}


Reply via email to