Author: vfr
Date: Sat Mar 19 14:14:13 2011
New Revision: 37961
URL: http://www.lyx.org/trac/changeset/37961

Log:
Fix bug #7345: Crash when right clicking on displayed math with selection

Two things have been fixed here:
1) the selection should not be cleared when the user right clicks a math inset 
that is part of the selection,
2) the type of context menu should be determined at mouse-press, because that 
is the moment when the cursor is set. However, we should do it after setting 
the cursor, because setting the cursor might change the selection status and 
this influences the choice for the type of context menu.

Modified:
   lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.cpp
   lyx-devel/trunk/src/mathed/InsetMathNest.cpp

Modified: lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.cpp
==============================================================================
--- lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.cpp   Sat Mar 19 11:37:24 
2011        (r37960)
+++ lyx-devel/trunk/src/frontends/qt4/GuiWorkArea.cpp   Sat Mar 19 14:14:13 
2011        (r37961)
@@ -772,18 +772,20 @@
                return;
        }
 
+       inputContext()->reset();
+
+       FuncRequest const cmd(LFUN_MOUSE_PRESS, e->x(), e->y(),
+               q_button_state(e->button()));
+       dispatch(cmd, q_key_state(e->modifiers()));
+
        // Save the context menu on mouse press, because also the mouse
        // cursor is set on mouse press. Afterwards, we can either release
        // the mousebutton somewhere else, or the cursor might have moved
-       // due to the DEPM.
+       // due to the DEPM. We need to do this after the mouse has been
+       // set in dispatch(), because the selection state might change.
        if (e->button() == Qt::RightButton)
                context_menu_name_ = buffer_view_->contextMenu(e->x(), e->y());
 
-       inputContext()->reset();
-
-       FuncRequest const cmd(LFUN_MOUSE_PRESS, e->x(), e->y(),
-               q_button_state(e->button()));
-       dispatch(cmd, q_key_state(e->modifiers()));
        e->accept();
 }
 

Modified: lyx-devel/trunk/src/mathed/InsetMathNest.cpp
==============================================================================
--- lyx-devel/trunk/src/mathed/InsetMathNest.cpp        Sat Mar 19 11:37:24 
2011        (r37960)
+++ lyx-devel/trunk/src/mathed/InsetMathNest.cpp        Sat Mar 19 14:14:13 
2011        (r37961)
@@ -1464,6 +1464,15 @@
 {
        //lyxerr << "## lfunMousePress: buttons: " << cmd.button() << endl;
        BufferView & bv = cur.bv();
+       if (cmd.button() == mouse_button::button3) {
+               // Don't do anything if we right-click a
+               // selection, a context menu will popup.
+               if (bv.cursor().selection() && cur >= 
bv.cursor().selectionBegin()
+                     && cur < bv.cursor().selectionEnd()) {
+                       cur.noScreenUpdate();
+                       return;
+               }
+       }
        bool do_selection = cmd.button() == mouse_button::button1
                && cmd.argument() == "region-select";
        bv.mouseSetCursor(cur, do_selection);

Reply via email to