Fix several middle-click pasting problems

* src/BufferView.cpp (workAreaDispatch): be sure to call haveSelection()
	as we do in LyXFunc::dispatch. 

	* src/Text3.cpp (doDispatch): refactor the handling of LFUN_MOUSE_PRESS.
	In particular, make sure that the cursor is alsways set through
	BufferView::mouseSetCursor, so that the selection is correctly saved.

	* src/CutAndPaste.cpp (pasteSelection): do not set the selection, since 
	paste methods do not do it.


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_5_X@19292 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jean-Marc Lasgouttes 2007-08-03 16:02:25 +00:00
parent 3c78a6d2a7
commit eac423830d
4 changed files with 20 additions and 21 deletions

View File

@ -63,6 +63,7 @@
#include "frontends/alert.h" #include "frontends/alert.h"
#include "frontends/FileDialog.h" #include "frontends/FileDialog.h"
#include "frontends/FontMetrics.h" #include "frontends/FontMetrics.h"
#include "frontends/Selection.h"
#include "graphics/Previews.h" #include "graphics/Previews.h"
@ -1225,6 +1226,9 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
if (!cur.result().dispatched()) if (!cur.result().dispatched())
cur.dispatch(cmd); cur.dispatch(cmd);
//Do we have a selection?
theSelection().haveSelection(cursor().selection());
// Redraw if requested and necessary. // Redraw if requested and necessary.
if (cur.result().dispatched() && cur.result().update()) if (cur.result().dispatched() && cur.result().update())
return update(cur.result().update()); return update(cur.result().update());

View File

@ -791,7 +791,6 @@ void pasteSelection(Cursor & cur, ErrorList & errorList)
recordUndo(cur); recordUndo(cur);
pasteParagraphList(cur, selectionBuffer[0].first, pasteParagraphList(cur, selectionBuffer[0].first,
selectionBuffer[0].second, errorList); selectionBuffer[0].second, errorList);
cur.setSelection();
} }

View File

@ -1015,43 +1015,34 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
// Single-click on work area // Single-click on work area
case LFUN_MOUSE_PRESS: { case LFUN_MOUSE_PRESS: {
cap::saveSelection(bv->cursor());
// Right click on a footnote flag opens float menu // Right click on a footnote flag opens float menu
if (cmd.button() == mouse_button::button3) if (cmd.button() == mouse_button::button3)
cur.clearSelection(); cur.clearSelection();
// Middle button press pastes if we have a selection // Set the cursor
// We do this here as if the selection was inside an inset bool update = bv->mouseSetCursor(cur);
// it could get cleared on the unlocking of the inset so
// we have to check this first
bool paste_internally = false;
if (cmd.button() == mouse_button::button2 && cap::selection()) {
// Copy the selection buffer to the clipboard
// stack, because we want it to appear in the
// "Edit->Paste recent" menu.
cap::copySelectionToStack();
paste_internally = true;
}
// Insert primary selection with middle mouse // Insert primary selection with middle mouse
// if there is a local selection in the current buffer, // if there is a local selection in the current buffer,
// insert this // insert this
if (cmd.button() == mouse_button::button2) { if (cmd.button() == mouse_button::button2) {
if (paste_internally) { if (cap::selection()) {
cap::pasteSelection(cur, bv->buffer()->errorList("Paste")); // Copy the selection buffer to the clipboard
// stack, because we want it to appear in the
// "Edit->Paste recent" menu.
cap::copySelectionToStack();
cap::pasteSelection(bv->cursor(),
bv->buffer()->errorList("Paste"));
bv->buffer()->errors("Paste"); bv->buffer()->errors("Paste");
cur.clearSelection(); // bug 393
bv->buffer()->markDirty(); bv->buffer()->markDirty();
finishUndo(); finishUndo();
} else { } else {
bv->mouseSetCursor(cur);
lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph")); lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph"));
} }
} }
// we have to update after dePM triggered // we have to update after dEPM triggered
bool update = bv->mouseSetCursor(cur);
if (!update && cmd.button() == mouse_button::button1) { if (!update && cmd.button() == mouse_button::button1) {
needsUpdate = false; needsUpdate = false;
cur.noUpdate(); cur.noUpdate();

View File

@ -43,6 +43,11 @@ What's new
- Fix bug where using pdfsync marks the document 'changed' (bug 4023). - Fix bug where using pdfsync marks the document 'changed' (bug 4023).
- Fix pasting a selection from the same LyX document with middle mouse
button.
- Fix pasting of a selection from other applications (X11 only).
- Coherent behaviour when inserting over a selection: now the selection - Coherent behaviour when inserting over a selection: now the selection
is always replaced by the insertion (bug 672). is always replaced by the insertion (bug 672).