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]. (Ie, the current position of the mouse cursor). Thereafter, I'd anticipate that QContentPane::mouseMoveEvent woudl be modified so that it looks something like the equivalent code in XWorkArea::work_area_handler. Maybe this information is e->x(), e->y(), but I'm not sure of the difference anymore between X11's ev->xmotion.[x,y] and ev->xbutton.[x,y]. So, Qt gurus... Angus void QContentPane::mouseMoveEvent(QMouseEvent * e) { FuncRequest cmd (LFUN_MOUSE_MOTION, e->x(), e->y(), q_motion_state(e->state())); wa_->dispatch(cmd); } int XWorkArea::work_area_handler(FL_OBJECT * ob, int event, FL_Coord, FL_Coord, int key, void * xev) { XEvent * ev = static_cast<XEvent*>(xev); XWorkArea * area = static_cast<XWorkArea*>(ob->u_vdata); if (!area) return 1; switch (event) { case FL_DRAG: { if (!ev || !area->scrollbar) break; int const drag_x = ev->xmotion.x; int const drag_y = ev->xmotion.y; int const area_y = ob->y; int const area_h = ob->h; // Check if the mouse is above or below the workarea if (drag_y <= area_y || drag_y >= area_y + area_h) { // 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()) break; // The timeout is not running, so process the // event, first starting the timeout to discard future // events. timeout.start(); } static int x_old = -1; static int y_old = -1; static double scrollbar_value_old = -1.0; double const scrollbar_value = fl_get_scrollbar_value(area->scrollbar); if (drag_x != x_old || drag_y != y_old || scrollbar_value != scrollbar_value_old) { x_old = drag_x; y_old = drag_y; scrollbar_value_old = scrollbar_value; lyxerr[Debug::WORKAREA] << "Workarea event: DRAG" << endl; // It transpires that ev->xbutton.button == 0 when // the mouse is dragged, so it cannot be used to // initialise x_button_state and hence FuncRequest. // The 'key' that is passed into the function does // contain the necessary info, however. // It is for this reason that x_button_state has // been modified to work with key // rather than ev->xbutton.button. // Angus 15 Oct 2002. FuncRequest cmd(LFUN_MOUSE_MOTION, ev->xbutton.x - ob->x, ev->xbutton.y - ob->y, x_button_state(key)); area->dispatch(cmd); } break; }