From 8f2243819a97d50ef71cf79f3717de02f214a1b0 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Thu, 4 Jan 2007 12:05:24 +0000 Subject: [PATCH] Let LFUN_PASTE always paste the most recent clipboard (internal or system) * src/insets/insettabular.C (InsetTabular::doDispatch): Only paste the tabular clipboard if the system clipboard is not newer, else let the current cell paste the system clipboard (InsetTabular::getStatus): Only decide whether to enable LFUN_PASTE if the tabular clipboard is not empty and the system clipboard is not newer, else let the current cell decide. * src/mathed/InsetMathGrid.C (InsetMathGrid::doDispatch): Use the system clipboard for LFUN_PASTE if it is newer. * src/mathed/InsetMathNest.C (InsetMathNest::doDispatch): Use the system clipboard for LFUN_PASTE if it is newer. * src/text3.C (doInsertInset): Add a "0" argument to LFUN_PASTE, because we always want to use the internal clipboard here (LyXText::dispatch): ditto (when handling mouse button 2 press) (LyXText::dispatch): Use the system clipboard for LFUN_PASTE if it is newer. (LyXText::getStatus): Also enable LFUN_PASTE if the system clipboard is owned by another application git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@16498 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/insets/insettabular.C | 4 ++-- src/mathed/InsetMathGrid.C | 17 +++++++++++++---- src/mathed/InsetMathNest.C | 16 +++++++++++----- src/text3.C | 37 ++++++++++++++++++++++++++++--------- 4 files changed, 54 insertions(+), 20 deletions(-) diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 43f3c4ff07..9f9ef92e30 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -723,7 +723,7 @@ void InsetTabular::doDispatch(LCursor & cur, FuncRequest & cmd) } case LFUN_PASTE: - if (tabularStackDirty()) { + if (tabularStackDirty() && theClipboard().isInternal()) { recordUndoInset(cur, Undo::INSERT); pasteSelection(cur); break; @@ -1033,7 +1033,7 @@ bool InsetTabular::getStatus(LCursor & cur, FuncRequest const & cmd, } case LFUN_PASTE: - if (tabularStackDirty()) { + if (tabularStackDirty() && theClipboard().isInternal()) { status.enabled(true); return true; } else diff --git a/src/mathed/InsetMathGrid.C b/src/mathed/InsetMathGrid.C index bf987daf33..86ba646d8a 100644 --- a/src/mathed/InsetMathGrid.C +++ b/src/mathed/InsetMathGrid.C @@ -25,6 +25,7 @@ #include "gettext.h" #include "undo.h" +#include "frontends/Clipboard.h" #include "frontends/Painter.h" #include "insets/mailinset.h" @@ -1210,11 +1211,19 @@ void InsetMathGrid::doDispatch(LCursor & cur, FuncRequest & cmd) case LFUN_PASTE: { cur.message(_("Paste")); cap::replaceSelection(cur); - istringstream is(to_utf8(cmd.argument())); - int n = 0; - is >> n; + docstring topaste; + if (cmd.argument().empty() && !theClipboard().isInternal()) + topaste = theClipboard().get(); + else { + idocstringstream is(cmd.argument()); + int n = 0; + is >> n; + topaste = cap::getSelection(cur.buffer(), n); + } InsetMathGrid grid(1, 1); - mathed_parse_normal(grid, cap::getSelection(cur.buffer(), n)); + if (!topaste.empty()) + mathed_parse_normal(grid, topaste); + if (grid.nargs() == 1) { // single cell/part of cell recordUndo(cur); diff --git a/src/mathed/InsetMathNest.C b/src/mathed/InsetMathNest.C index 8ba3489474..90f8fffe20 100644 --- a/src/mathed/InsetMathNest.C +++ b/src/mathed/InsetMathNest.C @@ -50,6 +50,7 @@ #include "support/lstrings.h" +#include "frontends/Clipboard.h" #include "frontends/Painter.h" #include "frontends/Selection.h" @@ -437,11 +438,16 @@ void InsetMathNest::doDispatch(LCursor & cur, FuncRequest & cmd) recordUndo(cur); cur.message(_("Paste")); replaceSelection(cur); - size_t n = 0; - istringstream is(to_utf8(cmd.argument())); - is >> n; - docstring const selection = cap::getSelection(cur.buffer(), n); - cur.niceInsert(selection); + docstring topaste; + if (cmd.argument().empty() && !theClipboard().isInternal()) + topaste = theClipboard().get(); + else { + size_t n = 0; + idocstringstream is(cmd.argument()); + is >> n; + topaste = cap::getSelection(cur.buffer(), n); + } + cur.niceInsert(topaste); cur.clearSelection(); // bug 393 cur.bv().switchKeyMap(); finishUndo(); diff --git a/src/text3.C b/src/text3.C index f8d42d02d1..3afcfbfd30 100644 --- a/src/text3.C +++ b/src/text3.C @@ -267,7 +267,7 @@ bool doInsertInset(LCursor & cur, LyXText * text, inset->edit(cur, true); if (gotsel && pastesel) { - lyx::dispatch(FuncRequest(LFUN_PASTE)); + lyx::dispatch(FuncRequest(LFUN_PASTE, "0")); // reset first par to default if (cur.lastpit() != 0 || cur.lastpos() != 0) { LyXLayout_ptr const layout = @@ -756,13 +756,16 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) case LFUN_PASTE: cur.message(_("Paste")); cap::replaceSelection(cur); - if (isStrUnsignedInt(to_utf8(cmd.argument()))) - pasteSelection(cur, bv->buffer()->errorList("Paste"), - convert(to_utf8(cmd.argument()))); - else + if (cmd.argument().empty() && !theClipboard().isInternal()) + pasteString(cur, theClipboard().get(), docstring()); + else { + string const arg(to_utf8(cmd.argument())); pasteSelection(cur, bv->buffer()->errorList("Paste"), - 0); - bv->buffer()->errors("Paste"); + isStrUnsignedInt(arg) ? + convert(arg) : + 0); + bv->buffer()->errors("Paste"); + } cur.clearSelection(); // bug 393 bv->switchKeyMap(); finishUndo(); @@ -968,7 +971,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) // insert this if (cmd.button() == mouse_button::button2) { if (paste_internally) - lyx::dispatch(FuncRequest(LFUN_PASTE)); + lyx::dispatch(FuncRequest(LFUN_PASTE, "0")); else lyx::dispatch(FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph")); } @@ -1721,7 +1724,23 @@ bool LyXText::getStatus(LCursor & cur, FuncRequest const & cmd, break; case LFUN_PASTE: - enable = cap::numberOfSelections() > 0; + // FIXME: This is not correct, but the correct code below is + // expensive + enable = cap::numberOfSelections() > 0 || + !theClipboard().isInternal(); +#if 0 + if (cmd.argument().empty()) { + if (theClipboard().isInternal()) + enable = cap::numberOfSelections() > 0; + else + enable = !theClipboard().get().empty(); + } else if (isStrUnsignedInt(to_utf8(cmd.argument()))) { + int n = convert(to_utf8(cmd.argument())); + enable = cap::numberOfSelections() > n; + } else + // unknown argument + enable = false; +#endif break; case LFUN_PARAGRAPH_MOVE_UP: -- 2.39.5