]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
Fix loop when opening TOC widget in an empty document, basically by Richard Heck.
[lyx.git] / src / lyxfunc.C
index 90d8c847e944de7e7dde1eecaf0eb67bed25c8a6..c61681ed4aaba67be61bca1ac284c82652fd8d21 100644 (file)
@@ -144,10 +144,6 @@ namespace Alert = frontend::Alert;
 namespace fs = boost::filesystem;
 
 
-// (alkis)
-extern tex_accent_struct get_accent(kb_action action);
-
-
 namespace {
 
 bool getLocalStatus(LCursor cursor,
@@ -268,29 +264,30 @@ void LyXFunc::gotoBookmark(unsigned int idx, bool openFile, bool switchToBuffer)
                }
                // moveToPosition use par_id, and par_pit and return new par_id.
                pit_type new_pit;
+               pos_type new_pos;
                int new_id;
-               boost::tie(new_pit, new_id) = view()->moveToPosition(bm.par_pit, bm.par_id, bm.par_pos);
-               // if par_id or pit has been changed, reset par_pit and par_id
+               boost::tie(new_pit, new_pos, new_id) = view()->moveToPosition(bm.bottom_pit, bm.bottom_pos, bm.top_id, bm.top_pos);
+               // if bottom_pit, bottom_pos or top_id has been changed, update bookmark
                // see http://bugzilla.lyx.org/show_bug.cgi?id=3092
-               if (bm.par_pit != new_pit || bm.par_id != new_id)
-                       const_cast<BookmarksSection::Bookmark &>(bm).setPos(new_pit, new_id);
+               if (bm.bottom_pit != new_pit || bm.bottom_pos != new_pos || bm.top_id != new_id )
+                       const_cast<BookmarksSection::Bookmark &>(bm).updatePos(new_pit, new_pos, new_id);
        } 
 }
 
 
 void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
 {
-       lyxerr[Debug::KEY] << "KeySym is " << keysym->getSymbolName() << endl;
+       LYXERR(Debug::KEY) << "KeySym is " << keysym->getSymbolName() << endl;
 
        // Do nothing if we have nothing (JMarc)
        if (!keysym->isOK()) {
-               lyxerr[Debug::KEY] << "Empty kbd action (probably composing)"
+               LYXERR(Debug::KEY) << "Empty kbd action (probably composing)"
                                   << endl;
                return;
        }
 
        if (keysym->isModifier()) {
-               lyxerr[Debug::KEY] << "isModifier true" << endl;
+               LYXERR(Debug::KEY) << "isModifier true" << endl;
                return;
        }
 
@@ -305,7 +302,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
        cancel_meta_seq->reset();
 
        FuncRequest func = cancel_meta_seq->addkey(keysym, state);
-       lyxerr[Debug::KEY] << BOOST_CURRENT_FUNCTION
+       LYXERR(Debug::KEY) << BOOST_CURRENT_FUNCTION
                           << " action first set to [" << func.action << ']'
                           << endl;
 
@@ -315,7 +312,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
        if ((func.action != LFUN_CANCEL) && (func.action != LFUN_META_PREFIX)) {
                // remove Caps Lock and Mod2 as a modifiers
                func = keyseq->addkey(keysym, (state | meta_fake_bit));
-               lyxerr[Debug::KEY] << BOOST_CURRENT_FUNCTION
+               LYXERR(Debug::KEY) << BOOST_CURRENT_FUNCTION
                                   << "action now set to ["
                                   << func.action << ']' << endl;
        }
@@ -328,13 +325,11 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
                func = FuncRequest(LFUN_COMMAND_PREFIX);
        }
 
-       if (lyxerr.debugging(Debug::KEY)) {
-               lyxerr << BOOST_CURRENT_FUNCTION
-                      << " Key [action="
-                      << func.action << "]["
-                      << to_utf8(keyseq->print(false)) << ']'
-                      << endl;
-       }
+       LYXERR(Debug::KEY) << BOOST_CURRENT_FUNCTION
+              << " Key [action="
+              << func.action << "]["
+              << to_utf8(keyseq->print(false)) << ']'
+              << endl;
 
        // already here we know if it any point in going further
        // why not return already here if action == -1 and
@@ -349,9 +344,9 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
        // Let's see. But only if shift is the only modifier
        if (func.action == LFUN_UNKNOWN_ACTION &&
            state == key_modifier::shift) {
-               lyxerr[Debug::KEY] << "Trying without shift" << endl;
+               LYXERR(Debug::KEY) << "Trying without shift" << endl;
                func = keyseq->addkey(keysym, key_modifier::none);
-               lyxerr[Debug::KEY] << "Action now " << func.action << endl;
+               LYXERR(Debug::KEY) << "Action now " << func.action << endl;
        }
 
        if (func.action == LFUN_UNKNOWN_ACTION) {
@@ -359,11 +354,11 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
                // if it's normal insertable text not already covered
                // by a binding
                if (keysym->isText() && keyseq->length() == 1) {
-                       lyxerr[Debug::KEY] << "isText() is true, inserting." << endl;
+                       LYXERR(Debug::KEY) << "isText() is true, inserting." << endl;
                        func = FuncRequest(LFUN_SELF_INSERT,
                                           FuncRequest::KEYBOARD);
                } else {
-                       lyxerr[Debug::KEY] << "Unknown, !isText() - giving up" << endl;
+                       LYXERR(Debug::KEY) << "Unknown, !isText() - giving up" << endl;
                        lyx_view_->message(_("Unknown function."));
                        return;
                }
@@ -374,7 +369,7 @@ void LyXFunc::processKeySym(LyXKeySymPtr keysym, key_modifier::state state)
                        docstring const arg(1, encoded_last_key);
                        dispatch(FuncRequest(LFUN_SELF_INSERT, arg,
                                             FuncRequest::KEYBOARD));
-                       lyxerr[Debug::KEY]
+                       LYXERR(Debug::KEY)
                                << "SelfInsert arg[`" << to_utf8(arg) << "']" << endl;
                }
        } else {
@@ -783,7 +778,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
        string const argument = to_utf8(cmd.argument());
        kb_action const action = cmd.action;
 
-       lyxerr[Debug::ACTION] << endl << "LyXFunc::dispatch: cmd: " << cmd << endl;
+       LYXERR(Debug::ACTION) << endl << "LyXFunc::dispatch: cmd: " << cmd << endl;
        //lyxerr << "LyXFunc::dispatch: cmd: " << cmd << endl;
 
        // we have not done anything wrong yet.
@@ -797,7 +792,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
        FuncStatus const flag = getStatus(cmd);
        if (!flag.enabled()) {
                // We cannot use this function here
-               lyxerr[Debug::ACTION] << "LyXFunc::dispatch: "
+               LYXERR(Debug::ACTION) << "LyXFunc::dispatch: "
                       << lyxaction.getActionName(action)
                       << " [" << action << "] is disabled at this location"
                       << endl;
@@ -1010,8 +1005,10 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        }
 
                        // Push directory path.
-                       string const path = buffer->temppath();
-                       support::Path p(path);
+                       string const path(buffer->temppath());
+                       // Prevent the compiler from optimizing away p
+                       FileName pp(path);
+                       support::Path p(pp);
 
                        // there are three cases here:
                        // 1. we print to a file
@@ -1217,7 +1214,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                case LFUN_SERVER_GET_NAME:
                        BOOST_ASSERT(lyx_view_ && lyx_view_->buffer());
                        setMessage(from_utf8(lyx_view_->buffer()->fileName()));
-                       lyxerr[Debug::INFO] << "FNAME["
+                       LYXERR(Debug::INFO) << "FNAME["
                                                         << lyx_view_->buffer()->fileName()
                                                         << "] " << endl;
                        break;
@@ -1233,7 +1230,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        int row;
                        istringstream is(argument);
                        is >> file_name >> row;
-                       if (prefixIs(file_name, package().temp_dir())) {
+                       if (prefixIs(file_name, package().temp_dir().absFilename())) {
                                // Needed by inverse dvi search. If it is a file
                                // in tmpdir, call the apropriated function
                                lyx_view_->setBuffer(theBufferList().getBufferFromTmp(file_name));
@@ -1382,16 +1379,17 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                                string opt1;
                                if (contains(argument, "|")) {
                                        arg = token(argument, '|', 0);
-                                       opt1 = '[' + token(argument, '|', 1) + ']';
+                                       opt1 = token(argument, '|', 1);
                                }
-                               std::ostringstream os;
-                               os << "citation LatexCommand\n"
-                                  << "\\cite" << opt1 << "{" << arg << "}\n"
-                                  << "\\end_inset";
-                               FuncRequest fr(LFUN_INSET_INSERT, os.str());
+                               InsetCommandParams icp("cite");
+                               icp["key"] = from_utf8(arg);
+                               if (!opt1.empty())
+                                       icp["before"] = from_utf8(opt1);
+                               string icstr = InsetCommandMailer::params2string("citation", icp);
+                               FuncRequest fr(LFUN_INSET_INSERT, icstr);
                                dispatch(fr);
                        } else
-                               dispatch(FuncRequest(LFUN_DIALOG_SHOW, "citation"));
+                               dispatch(FuncRequest(LFUN_DIALOG_SHOW_NEW_INSET, "citation"));
                        break;
                }
 
@@ -1467,7 +1465,7 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                case LFUN_PREFERENCES_SAVE: {
                        lyxrc.write(makeAbsPath("preferences",
-                                               package().user_support()),
+                                               package().user_support().absFilename()),
                                    false);
                        break;
                }
@@ -1566,8 +1564,9 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        InsetIterator it  = inset_iterator_begin(inset);
                        InsetIterator const end = inset_iterator_end(inset);
                        for (; it != end; ++it) {
-                               if (inset_code == InsetBase::NO_CODE
-                                   || inset_code == it->lyxCode()) {
+                               if (!it->asInsetMath()
+                                   && (inset_code == InsetBase::NO_CODE
+                                   || inset_code == it->lyxCode())) {
                                        LCursor tmpcur = cur;
                                        tmpcur.pushLeft(*it);
                                        it->dispatch(tmpcur, fr);
@@ -1588,14 +1587,12 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
                        if (oldL->rightToLeft() == newL->rightToLeft()
                            && !buffer.isMultiLingual())
                                buffer.changeLanguage(oldL, newL);
-                       else
-                               buffer.updateDocLang(newL);
                        break;
                }
 
                case LFUN_BUFFER_SAVE_AS_DEFAULT: {
                        string const fname =
-                               addName(addPath(package().user_support(), "templates/"),
+                               addName(addPath(package().user_support().absFilename(), "templates/"),
                                        "defaults.lyx");
                        Buffer defaults(fname);
 
@@ -1795,7 +1792,7 @@ void LyXFunc::sendDispatchMessage(docstring const & msg, FuncRequest const & cmd
                              || cmd.origin == FuncRequest::COMMANDBUFFER);
 
        if (cmd.action == LFUN_SELF_INSERT || !verbose) {
-               lyxerr[Debug::ACTION] << "dispatch msg is " << to_utf8(msg) << endl;
+               LYXERR(Debug::ACTION) << "dispatch msg is " << to_utf8(msg) << endl;
                if (!msg.empty())
                        lyx_view_->message(msg);
                return;
@@ -1828,7 +1825,7 @@ void LyXFunc::sendDispatchMessage(docstring const & msg, FuncRequest const & cmd
                dispatch_msg += '(' + rtrim(comname) + ')';
        }
 
-       lyxerr[Debug::ACTION] << "verbose dispatch msg "
+       LYXERR(Debug::ACTION) << "verbose dispatch msg "
                << to_utf8(dispatch_msg) << endl;
        if (!dispatch_msg.empty())
                lyx_view_->message(dispatch_msg);
@@ -1907,7 +1904,7 @@ void LyXFunc::open(string const & fname)
                FileDialog fileDlg(_("Select document to open"),
                        LFUN_FILE_OPEN,
                        make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)),
-                       make_pair(_("Examples|#E#e"), from_utf8(addPath(package().system_support(), "examples"))));
+                       make_pair(_("Examples|#E#e"), from_utf8(addPath(package().system_support().absFilename(), "examples"))));
 
                FileDialog::Result result =
                        fileDlg.open(from_utf8(initpath),
@@ -1960,7 +1957,7 @@ void LyXFunc::doImport(string const & argument)
        string format;
        string filename = split(argument, format, ' ');
 
-       lyxerr[Debug::INFO] << "LyXFunc::doImport: " << format
+       LYXERR(Debug::INFO) << "LyXFunc::doImport: " << format
                            << " file: " << filename << endl;
 
        // need user interaction
@@ -1981,7 +1978,7 @@ void LyXFunc::doImport(string const & argument)
                        LFUN_BUFFER_IMPORT,
                        make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)),
                        make_pair(_("Examples|#E#e"),
-                                 from_utf8(addPath(package().system_support(), "examples"))));
+                                 from_utf8(addPath(package().system_support().absFilename(), "examples"))));
 
                docstring filter = formats.prettyName(format);
                filter += " (*.";
@@ -2044,9 +2041,6 @@ void LyXFunc::doImport(string const & argument)
 
 void LyXFunc::closeBuffer()
 {
-       // save current cursor position
-       LyX::ref().session().lastFilePos().save(FileName(lyx_view_->buffer()->fileName()),
-               boost::tie(view()->cursor().pit(), view()->cursor().pos()) );
        // goto bookmark to update bookmark pit.
        for (size_t i = 0; i < LyX::ref().session().bookmarks().size(); ++i)
                gotoBookmark(i+1, false, false);
@@ -2162,7 +2156,7 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
                        string const encoded = FileName(
                                lyxrc_new.document_path).toFilesystemEncoding();
                        if (fs::exists(encoded) && fs::is_directory(encoded))
-                               support::package().document_dir() = lyxrc.document_path;
+                               support::package().document_dir() = FileName(lyxrc.document_path);
                }
        case LyXRC::RC_ESC_CHARS:
        case LyXRC::RC_FONT_ENCODING:
@@ -2212,7 +2206,6 @@ void actOnUpdatedPrefs(LyXRC const & lyxrc_orig, LyXRC const & lyxrc_new)
        case LyXRC::RC_PRINT_COMMAND:
        case LyXRC::RC_RTL_SUPPORT:
        case LyXRC::RC_SCREEN_DPI:
-       case LyXRC::RC_SCREEN_FONT_ENCODING:
        case LyXRC::RC_SCREEN_FONT_ROMAN:
        case LyXRC::RC_SCREEN_FONT_ROMAN_FOUNDRY:
        case LyXRC::RC_SCREEN_FONT_SANS: