]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
fix typo that put too many include paths for most people
[lyx.git] / src / lyxfunc.C
index 3691d747cd729edd10e4c39a7bf59ee5b025ac8d..af1d9f9571da9494c84adde14f1591293fe653c2 100644 (file)
@@ -1,8 +1,8 @@
 /* This file is part of
- * ====================================================== 
- * 
+ * ======================================================
+ *
  *           LyX, The Document Processor
- *      
+ *
  *         Copyright 1995 Matthias Ettrich
  *          Copyright 1995-2001 The LyX Team.
  *
 #include "Lsstream.h"
 #include "trans_mgr.h"
 #include "layout.h"
-#include "WorkArea.h"
 #include "bufferview_funcs.h"
 #include "minibuffer.h"
 #include "vspace.h"
 #include "LyXView.h"
-#include "lyx_gui_misc.h"
 #include "FloatList.h"
 #include "converter.h"
 #include "exporter.h"
@@ -48,7 +46,6 @@
 #include "lyxfind.h"
 #include "undo_funcs.h"
 #include "ParagraphParameters.h"
-#include "figureForm.h"
 
 #include "insets/inseturl.h"
 #include "insets/insetlatexaccent.h"
 #include "frontends/Menubar.h"
 #include "frontends/Alert.h"
 
+#include "graphics/GraphicsCache.h"
+
 #include "support/lyxalgo.h"
 #include "support/LAssert.h"
 #include "support/filetools.h"
 #include "support/FileInfo.h"
-#include "support/syscall.h"
+#include "support/forkedcontr.h"
 #include "support/lstrings.h"
 #include "support/path.h"
 #include "support/lyxfunctional.h"
 #include <cstdlib>
 #include <cctype>
 
-#include <utility> 
-#include <algorithm> 
+#include <utility>
+#include <algorithm>
 
 
 using std::pair;
-using std::make_pair; 
+using std::make_pair;
 using std::endl;
 using std::find_if;
 using std::vector;
@@ -113,7 +112,6 @@ using std::back_inserter;
 extern BufferList bufferlist;
 extern LyXServer * lyxserver;
 extern bool selection_possible;
-extern void MenuSendto();
 
 extern boost::scoped_ptr<kb_keymap> toplevel_keymap;
 
@@ -146,8 +144,8 @@ public:
        void receiveCmd(string const & cmd) {}
        ///
        void receiveArg(string const & arg) {}
-       
-       
+
+
 private:
 };
 
@@ -197,7 +195,7 @@ void LyXFunc::moveCursorUpdate(bool flag, bool selecting)
        }
        owner->view()->update(TEXT(flag), BufferView::SELECT|BufferView::FITCUR);
        owner->view()->showCursor();
-       
+
        /* ---> Everytime the cursor is moved, show the current font state. */
        // should this too me moved out of this func?
        owner->view()->setState();
@@ -211,7 +209,7 @@ void LyXFunc::handleKeyFunc(kb_action action)
        if (keyseq.length() > 1) {
                c = 0;
        }
-       
+
        owner->getIntl()->getTrans()
                .deadkey(c, get_accent(action).accent, TEXT(false));
        // Need to clear, in case the minibuffer calls these
@@ -224,10 +222,10 @@ void LyXFunc::handleKeyFunc(kb_action action)
 }
 
 
-void LyXFunc::processKeySym(KeySym keysym, unsigned int state) 
+void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
 {
        string argument;
-       
+
        if (lyxerr.debugging(Debug::KEY)) {
                char const * tmp = XKeysymToString(keysym);
                string const stm = (tmp ? tmp : "");
@@ -253,19 +251,19 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
            || keysym == XK_Mode_switch || keysym == 0x0) {
                return;
        }
-       
+
        // Do a one-deep top-level lookup for
        // cancel and meta-fake keys. RVDK_PATCH_5
        cancel_meta_seq.reset();
 
        int action = cancel_meta_seq.addkey(keysym, state
                                            &(ShiftMask|ControlMask
-                                             |Mod1Mask)); 
+                                             |Mod1Mask));
        if (lyxerr.debugging(Debug::KEY)) {
                lyxerr << "action first set to [" << action << "]" << endl;
        }
-       
-       // When not cancel or meta-fake, do the normal lookup. 
+
+       // When not cancel or meta-fake, do the normal lookup.
        // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards.
        // Mostly, meta_fake_bit = 0. RVDK_PATCH_5.
        if ((action != LFUN_CANCEL) && (action != LFUN_META_FAKE)) {
@@ -285,8 +283,8 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
        }
        // Dont remove this unless you know what you are doing.
        meta_fake_bit = 0;
-               
-       // can this happen now ? 
+
+       // can this happen now ?
        if (action == LFUN_NOACTION) {
                action = LFUN_PREFIX;
        }
@@ -302,7 +300,7 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
        // why not return already here if action == -1 and
        // num_bytes == 0? (Lgb)
 
-       if (keyseq.length() > 1 && !keyseq.deleted()) {
+       if (keyseq.length() > 1) {
                owner->message(keyseq.print());
        }
 
@@ -326,19 +324,19 @@ void LyXFunc::processKeySym(KeySym keysym, unsigned int state)
                // This is very X dependent.
                unsigned int c = keysym;
                string argument;
-               
+
                c = kb_keymap::getiso(c);
 
                if (c > 0)
                        argument = static_cast<char>(c);
-               
+
                dispatch(LFUN_SELFINSERT, argument);
                lyxerr[Debug::KEY] << "SelfInsert arg[`"
                                   << argument << "']" << endl;
        }
        else
                verboseDispatch(action, false);
-} 
+}
 
 
 FuncStatus LyXFunc::getStatus(int ac) const
@@ -355,7 +353,12 @@ FuncStatus LyXFunc::getStatus(kb_action action,
 {
        FuncStatus flag;
        Buffer * buf = owner->buffer();
-       
+
+       if (action == LFUN_NOACTION) {
+               setStatusMessage(N_("Nothing to do"));
+               return flag.disabled(true);
+       }
+
        if (action == LFUN_UNKNOWN_ACTION) {
                setStatusMessage(N_("Unknown action"));
                return flag.unknown(true);
@@ -363,14 +366,14 @@ FuncStatus LyXFunc::getStatus(kb_action action,
 
        // the default error message if we disable the command
        setStatusMessage(N_("Command disabled"));
-       
+
        // Check whether we need a buffer
        if (!lyxaction.funcHasFlag(action, LyXAction::NoBuffer)) {
                // Yes we need a buffer, do we have one?
                if (buf) {
                        // yes
                        // Can we use a readonly buffer?
-                       if (buf->isReadonly() && 
+                       if (buf->isReadonly() &&
                            !lyxaction.funcHasFlag(action,
                                                   LyXAction::ReadOnly)) {
                                // no
@@ -386,11 +389,11 @@ FuncStatus LyXFunc::getStatus(kb_action action,
        }
 
        UpdatableInset * tli = owner->view()->theLockingInset();
-       
+
        // I would really like to avoid having this switch and rather try to
        // encode this in the function itself.
-        bool disable = false;
-        switch (action) {
+       bool disable = false;
+       switch (action) {
        case LFUN_MENUPRINT:
                disable = !Exporter::IsExportable(buf, "dvi")
                        || lyxrc.print_command == "none";
@@ -481,13 +484,13 @@ FuncStatus LyXFunc::getStatus(kb_action action,
 
        case LFUN_INSET_TOGGLE: {
                LyXText * lt = owner->view()->getLyXText();
-               disable = !(isEditableInset(lt->getInset())
-                           || (lt->inset_owner
+               disable = !(isEditableInset(lt->getInset())
+                           || (lt->inset_owner
                                && lt->inset_owner->owner()
-                               && lt->inset_owner->owner()->isOpen()));
+                               && lt->inset_owner->owner()->isOpen()));
                break;
        }
-       case LFUN_MATH_VALIGN: 
+       case LFUN_MATH_VALIGN:
                if (mathcursor) {
                        char align = mathcursor->valign();
                        if (align == '\0') {
@@ -507,7 +510,7 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                        disable = true;
                break;
 
-       case LFUN_MATH_HALIGN: 
+       case LFUN_MATH_HALIGN:
                if (mathcursor) {
                        char align = mathcursor->halign();
                        if (align == '\0') {
@@ -527,7 +530,7 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                        disable = true;
                break;
 
-       case LFUN_MATH_MUTATE: 
+       case LFUN_MATH_MUTATE:
                if (tli && (tli->lyxCode() == Inset::MATH_CODE)) {
                        MathInsetTypes type = mathcursor->formula()->getType();
                        if (argument == "inline") {
@@ -546,20 +549,20 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                break;
 
        // we just need to be in math mode to enable that
-       case LFUN_MATH_SIZE: 
+       case LFUN_MATH_SIZE:
        case LFUN_MATH_SPACE:
-       case LFUN_MATH_LIMITS: 
-       case LFUN_MATH_NONUMBER: 
+       case LFUN_MATH_LIMITS:
+       case LFUN_MATH_NONUMBER:
        case LFUN_MATH_NUMBER:
                disable = !mathcursor;
                break;
 
        // we need to be math mode and a math array for that
        // Hack: halign produces non-zero result iff we are in a math array
-       case LFUN_MATH_ROW_INSERT: 
-       case LFUN_MATH_ROW_DELETE: 
-       case LFUN_MATH_COLUMN_INSERT: 
-       case LFUN_MATH_COLUMN_DELETE: 
+       case LFUN_MATH_ROW_INSERT:
+       case LFUN_MATH_ROW_DELETE:
+       case LFUN_MATH_COLUMN_INSERT:
+       case LFUN_MATH_COLUMN_DELETE:
                disable = !mathcursor || !mathcursor->halign();
                break;
 
@@ -570,13 +573,9 @@ FuncStatus LyXFunc::getStatus(kb_action action,
        // the functions which insert insets
        Inset::Code code = Inset::NO_CODE;
        switch (action) {
-       case LFUN_INSET_TEXT:
-               code = Inset::TEXT_CODE;
-               break;
        case LFUN_INSET_ERT:
-               code = Inset::ERT_CODE;         
+               code = Inset::ERT_CODE;
                break;
-       case LFUN_FIGURE:
        case LFUN_INSET_GRAPHICS:
                code = Inset::GRAPHICS_CODE;
                break;
@@ -674,9 +673,13 @@ FuncStatus LyXFunc::getStatus(kb_action action,
 
        if (disable)
                        flag.disabled(true);
-       
+
        // A few general toggles
        switch (action) {
+       case LFUN_TOOLTIPS_TOGGLE:
+               flag.setOnOff(owner->getDialogs()->tooltipsEnabled());
+               break;
+
        case LFUN_READ_ONLY_TOGGLE:
                flag.setOnOff(buf->isReadonly());
                break;
@@ -685,7 +688,7 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                break;
        case LFUN_SWITCHBUFFER:
                // toggle on the current buffer, but do not toggle off
-               // the other ones (is that a good idea?) 
+               // the other ones (is that a good idea?)
                if (argument == buf->fileName())
                        flag.setOnOff(true);
                break;
@@ -747,41 +750,41 @@ FuncStatus LyXFunc::getStatus(kb_action action,
                        break;
                }
        }
-       
+
        return flag;
 }
 
 
 // temporary dispatch method
-void LyXFunc::miniDispatch(string const & s) 
+void LyXFunc::miniDispatch(string const & s)
 {
-       string s2(frontStrip(strip(s))); 
+       string s2(frontStrip(strip(s)));
+
        if (!s2.empty()) {
                verboseDispatch(s2, true);
        }
 }
 
 
-void LyXFunc::verboseDispatch(string const & s, bool show_sc) 
+void LyXFunc::verboseDispatch(string const & s, bool show_sc)
 {
        int action = lyxaction.LookupFunc(frontStrip(s));
+
        if (action == LFUN_UNKNOWN_ACTION) {
                string const msg = string(_("Unknown function ("))
                        + s + ")";
                owner->message(msg);
        } else {
                verboseDispatch(action, show_sc);
-       } 
+       }
 }
 
 
-void LyXFunc::verboseDispatch(int ac, bool show_sc) 
+void LyXFunc::verboseDispatch(int ac, bool show_sc)
 {
        string argument;
        kb_action action;
-        
+
        // get the real action and argument
        action = lyxaction.retrieveActionArg(ac, argument);
 
@@ -796,21 +799,21 @@ void LyXFunc::verboseDispatch(kb_action action,
        string res = dispatch(action, argument);
 
        commandshortcut.erase();
-       
+
        if (lyxrc.display_shortcuts && show_sc) {
                if (action != LFUN_SELFINSERT) {
                        // Put name of command and list of shortcuts
                        // for it in minibuffer
                        string comname = lyxaction.getActionName(action);
-                       
+
                        int pseudoaction = action;
                        bool argsadded = false;
-                       
+
                        if (!argument.empty()) {
                                // the pseudoaction is useful for the bindings
-                               pseudoaction = 
+                               pseudoaction =
                                        lyxaction.searchActionArg(action,
-                                                                 argument);
+                                                                 argument);
 
                                if (pseudoaction == LFUN_UNKNOWN_ACTION) {
                                        pseudoaction = action;
@@ -834,7 +837,7 @@ void LyXFunc::verboseDispatch(kb_action action,
                                commandshortcut = "(" + comname + ')';
                        }
                }
-        }
+       }
 
        if (res.empty()) {
                if (!commandshortcut.empty()) {
@@ -851,8 +854,8 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        lyxerr[Debug::ACTION] << "LyXFunc::Dispatch: action[" << action
                              <<"] arg[" << argument << "]" << endl;
 
-        // we have not done anything wrong yet.
-        errorstat = false;
+       // we have not done anything wrong yet.
+       errorstat = false;
        dispatch_buffer.erase();
 
 #ifdef NEW_DISPATCHER
@@ -895,9 +898,9 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                                goto exit_with_message;
                        } else if (((result=owner->view()->theLockingInset()->
                                     // Hand-over to inset's own dispatch:
-                                    localDispatch(owner->view(), action, argument)) ==
-                                   UpdatableInset::DISPATCHED) ||
-                                  (result == UpdatableInset::DISPATCHED_NOUPDATE))
+                                    localDispatch(owner->view(), action, argument)) ==
+                                   UpdatableInset::DISPATCHED) ||
+                                  (result == UpdatableInset::DISPATCHED_NOUPDATE))
                                goto exit_with_message;
                                        // If UNDISPATCHED, just soldier on
                        else if (result == UpdatableInset::FINISHED) {
@@ -919,6 +922,8 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                                        TEXT()->cursorUp(owner->view());
                                        moveCursorUpdate(true, false);
                                        owner->showState();
+                               } else {
+                                       owner->view()->update(TEXT(), BufferView::SELECT|BufferView::FITCUR);
                                }
                                goto exit_with_message;
                        } else if (result == UpdatableInset::FINISHED_DOWN) {
@@ -946,7 +951,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                                                owner->showState();
                                        }
                                        goto exit_with_message;
-                               case LFUN_LEFT: 
+                               case LFUN_LEFT:
                                        if (TEXT()->cursor.par()->isRightToLeftPar(owner->buffer()->params)) {
                                                TEXT()->cursorRight(owner->view());
                                                moveCursorUpdate(true, false);
@@ -969,7 +974,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        }
 
        switch (action) {
-               
+
        case LFUN_ESCAPE:
        {
                if (!owner->view()->available()) break;
@@ -978,7 +983,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        owner->view()->theLockingInset();
                if (tli) {
                        UpdatableInset * lock = tli->getLockingInset();
-                       
+
                        if (tli == lock) {
                                owner->view()->unlockInset(tli);
                                TEXT()->cursorRight(owner->view());
@@ -993,13 +998,13 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                }
        }
        break;
-                       
+
                // --- Misc -------------------------------------------
-       case LFUN_WORDFINDFORWARD  : 
+       case LFUN_WORDFINDFORWARD  :
        case LFUN_WORDFINDBACKWARD : {
                static string last_search;
                string searched_string;
-           
+
                if (!argument.empty()) {
                        last_search = argument;
                        searched_string = argument;
@@ -1013,14 +1018,14 @@ string const LyXFunc::dispatch(kb_action action, string argument)
 //             owner->view()->showCursor();
        }
        break;
-               
+
        case LFUN_PREFIX:
        {
                if (owner->view()->available() && !owner->view()->theLockingInset()) {
                        owner->view()->update(TEXT(),
                                              BufferView::SELECT|BufferView::FITCUR);
                }
-               owner->message(keyseq.print());
+               owner->message(keyseq.printOptions());
        }
        break;
 
@@ -1035,7 +1040,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                                                  allCmds, hist);
        }
        break;
-               
+
        case LFUN_CANCEL:                   // RVDK_PATCH_5
                keyseq.reset();
                meta_fake_bit = 0;
@@ -1050,7 +1055,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                meta_fake_bit = Mod1Mask;
                setMessage(keyseq.print());
        }
-       break;  
+       break;
 
        case LFUN_READ_ONLY_TOGGLE:
                if (owner->buffer()->lyxvc.inUse()) {
@@ -1060,24 +1065,24 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                                !owner->buffer()->isReadonly());
                }
                break;
-               
+
        case LFUN_CENTER: // this is center and redraw.
                owner->view()->center();
                break;
-               
+
                // --- Menus -----------------------------------------------
        case LFUN_MENUNEW:
                menuNew(false);
                break;
-               
+
        case LFUN_MENUNEWTMPLT:
                menuNew(true);
                break;
-               
+
        case LFUN_CLOSEBUFFER:
                closeBuffer();
                break;
-               
+
        case LFUN_MENUWRITE:
                if (!owner->buffer()->isUnnamed()) {
                        ostringstream s1;
@@ -1088,15 +1093,15 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                } else
                        WriteAs(owner->view(), owner->buffer());
                break;
-               
+
        case LFUN_WRITEAS:
                WriteAs(owner->view(), owner->buffer(), argument);
                break;
-               
+
        case LFUN_MENURELOAD:
                reloadBuffer();
                break;
-               
+
        case LFUN_UPDATE:
                Exporter::Export(owner->buffer(), argument, true);
                break;
@@ -1104,22 +1109,22 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_PREVIEW:
                Exporter::Preview(owner->buffer(), argument);
                break;
-               
-        case LFUN_BUILDPROG:
+
+       case LFUN_BUILDPROG:
                Exporter::Export(owner->buffer(), "program", true);
-                break;
-                
-       case LFUN_RUNCHKTEX:
+               break;
+
+       case LFUN_RUNCHKTEX:
                MenuRunChktex(owner->buffer());
                break;
-                               
+
        case LFUN_MENUPRINT:
                owner->getDialogs()->showPrint();
                break;
 
        case LFUN_EXPORT:
                if (argument == "custom")
-                       MenuSendto();
+                       owner->getDialogs()->showSendto();
                else
                        Exporter::Export(owner->buffer(), argument, false);
                break;
@@ -1127,11 +1132,11 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_IMPORT:
                doImport(argument);
                break;
-               
+
        case LFUN_QUIT:
                QuitLyX();
                break;
-               
+
        case LFUN_TOCVIEW:
 #if 0
        case LFUN_LOFVIEW:
@@ -1155,32 +1160,28 @@ string const LyXFunc::dispatch(kb_action action, string argument)
 #endif
                owner->getDialogs()->createTOC(p.getAsString());
                break;
-       }       
+       }
 
        case LFUN_DIALOG_TABULAR_INSERT:
                owner->getDialogs()->showTabularCreate();
                break;
-               
-       case LFUN_FIGURE:
-               Figure();
-               break;
 
        case LFUN_AUTOSAVE:
                AutoSave(owner->view());
                break;
-               
+
        case LFUN_UNDO:
                owner->view()->menuUndo();
                break;
-               
+
        case LFUN_REDO:
                owner->view()->menuRedo();
                break;
-               
+
        case LFUN_MENUSEARCH:
                owner->getDialogs()->showSearch();
                break;
-               
+
        case LFUN_REMOVEERRORS:
                if (owner->view()->removeAutoInsets()) {
                        owner->view()->redraw();
@@ -1188,18 +1189,14 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                }
                break;
 
-       case LFUN_DEPTH:
-               changeDepth(owner->view(), TEXT(false), 0);
-               break;
-               
        case LFUN_DEPTH_MIN:
                changeDepth(owner->view(), TEXT(false), -1);
                break;
-               
+
        case LFUN_DEPTH_PLUS:
                changeDepth(owner->view(), TEXT(false), 1);
                break;
-               
+
        case LFUN_FREE:
                owner->getDialogs()->setUserFreeFont();
                break;
@@ -1232,7 +1229,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                owner->getDialogs()->showTexinfo();
                break;
 
-        case LFUN_HELP_OPEN:
+       case LFUN_HELP_OPEN:
        {
                string const arg = argument;
                if (arg.empty()) {
@@ -1254,7 +1251,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                owner->view()->buffer(bufferlist.loadLyXFile(fname, false));
                owner->allowInput();
                break;
-        }
+       }
 
                // --- version control -------------------------------
        case LFUN_VC_REGISTER:
@@ -1263,7 +1260,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        owner->buffer()->lyxvc.registrer();
        }
        break;
-               
+
        case LFUN_VC_CHECKIN:
        {
                if (owner->buffer()->lyxvc.inUse()
@@ -1271,7 +1268,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        owner->buffer()->lyxvc.checkIn();
        }
        break;
-               
+
        case LFUN_VC_CHECKOUT:
        {
                if (owner->buffer()->lyxvc.inUse()
@@ -1279,29 +1276,29 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        owner->buffer()->lyxvc.checkOut();
        }
        break;
-       
+
        case LFUN_VC_REVERT:
        {
                owner->buffer()->lyxvc.revert();
        }
        break;
-               
+
        case LFUN_VC_UNDO:
        {
                owner->buffer()->lyxvc.undoLast();
        }
        break;
-               
+
        case LFUN_VC_HISTORY:
        {
                owner->getDialogs()->showVCLogFile();
                break;
        }
-       
+
        // --- buffers ----------------------------------------
 
-        case LFUN_SWITCHBUFFER:
-                owner->view()->buffer(bufferlist.getBuffer(argument));
+       case LFUN_SWITCHBUFFER:
+               owner->view()->buffer(bufferlist.getBuffer(argument));
                break;
 
        case LFUN_FILE_NEW:
@@ -1312,7 +1309,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        owner->view()->buffer(tmpbuf);
        }
        break;
-                       
+
        case LFUN_FILE_OPEN:
                open(argument);
                break;
@@ -1320,15 +1317,15 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_LATEX_LOG:
                owner->getDialogs()->showLogFile();
                break;
-               
+
        case LFUN_LAYOUT_DOCUMENT:
                owner->getDialogs()->showDocument();
                break;
-               
+
        case LFUN_LAYOUT_PARAGRAPH:
                owner->getDialogs()->showParagraph();
                break;
-               
+
        case LFUN_LAYOUT_CHARACTER:
                owner->getDialogs()->showCharacter();
                break;
@@ -1351,7 +1348,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_LAYOUT_PREAMBLE:
                owner->getDialogs()->showPreamble();
                break;
-               
+
        case LFUN_DROP_LAYOUTS_CHOICE:
                owner->getToolbar()->openLayoutList();
                break;
@@ -1359,12 +1356,12 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_MENU_OPEN_BY_NAME:
                owner->getMenubar()->openByName(argument);
                break; // RVDK_PATCH_5
-               
+
        case LFUN_SPELLCHECK:
                if (lyxrc.isp_command != "none")
                        owner->getDialogs()->showSpellchecker();
                break;
-               
+
        // --- lyxserver commands ----------------------------
 
 
@@ -1374,7 +1371,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                               << owner->buffer()->fileName()
                               << "] " << endl;
                break;
-               
+
        case LFUN_NOTIFY:
        {
                dispatch_buffer = keyseq.print();
@@ -1393,12 +1390,12 @@ string const LyXFunc::dispatch(kb_action action, string argument)
 
                // Either change buffer or load the file
                if (bufferlist.exists(s)) {
-                       owner->view()->buffer(bufferlist.getBuffer(s));
+                       owner->view()->buffer(bufferlist.getBuffer(s));
                } else {
-                       owner->view()->buffer(bufferlist.loadLyXFile(s));
+                       owner->view()->buffer(bufferlist.loadLyXFile(s));
                }
-               
-               // Set the cursor  
+
+               // Set the cursor
                owner->view()->setCursorFromRow(row);
 
                // Recenter screen
@@ -1418,8 +1415,8 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                                            << id << "]" << endl;
                        break;
                } else {
-                       lyxerr << "Paragraph " << par->id()
-                              << " found." << endl;
+                       lyxerr[Debug::INFO] << "Paragraph " << par->id()
+                                           << " found." << endl;
                }
 
                if (owner->view()->theLockingInset())
@@ -1456,7 +1453,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                }
        }
        break;
-       
+
        case LFUN_ADD_TO_TOOLBAR:
        {
                if (lyxerr.debugging(Debug::GUI)) {
@@ -1474,7 +1471,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                }
        }
        break;
-       
+
        // --- insert characters ----------------------------------------
 
        // ---  Mathed stuff. If we are here, there is no locked inset yet.
@@ -1498,11 +1495,11 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_MATH_PANEL:
                owner->getDialogs()->showMathPanel();
                break;
-       
+
        case LFUN_CITATION_CREATE:
        {
                InsetCommandParams p("cite");
-               
+
                if (!argument.empty()) {
                        // This should be set at source, ie when typing
                        // "citation-insert foo" in the minibuffer.
@@ -1519,11 +1516,11 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        owner->getDialogs()->createCitation(p.getAsString());
        }
        break;
-                   
+
        case LFUN_CHILDOPEN:
        {
                string const filename =
-                       MakeAbsPath(argument, 
+                       MakeAbsPath(argument,
                                    owner->buffer()->filePath());
                setMessage(N_("Opening child document ") +
                           MakeDisplayPath(filename) + "...");
@@ -1538,24 +1535,24 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_TOGGLECURSORFOLLOW:
                lyxrc.cursor_follows_scrollbar = !lyxrc.cursor_follows_scrollbar;
                break;
-               
+
        case LFUN_KMAP_OFF:             // keymap off
                owner->getIntl()->KeyMapOn(false);
                break;
-               
+
        case LFUN_KMAP_PRIM:    // primary keymap
                owner->getIntl()->KeyMapPrim();
                break;
-               
+
        case LFUN_KMAP_SEC:             // secondary keymap
                owner->getIntl()->KeyMapSec();
                break;
-               
+
        case LFUN_KMAP_TOGGLE:  // toggle keymap
                owner->getIntl()->ToggleKeyMap();
                break;
 
-       case LFUN_SEQUENCE: 
+       case LFUN_SEQUENCE:
        {
                // argument contains ';'-terminated commands
                while (argument.find(';') != string::npos) {
@@ -1569,7 +1566,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_DIALOG_PREFERENCES:
                owner->getDialogs()->showPreferences();
                break;
-               
+
        case LFUN_SAVEPREFERENCES:
        {
                Path p(user_lyxdir);
@@ -1580,7 +1577,7 @@ string const LyXFunc::dispatch(kb_action action, string argument)
        case LFUN_SCREEN_FONT_UPDATE:
        {
                // handle the screen font changes.
-               // 
+               //
                lyxrc.set_font_norm_type();
                fontloader.update();
                // Of course we should only do the resize and the textcache.clear
@@ -1604,6 +1601,10 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        break;
                        }
 
+               bool const graphicsbg_changed =
+                       (lyx_name == lcolor.getLyXName(LColor::graphicsbg) &&
+                        x11_name != lcolor.getX11Name(LColor::graphicsbg));
+
                if (!lcolor.setColor(lyx_name, x11_name)) {
                        static string const err1 (N_("Set-color \""));
                        static string const err2 (
@@ -1612,7 +1613,14 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                        setErrorMessage(_(err1) + lyx_name + _(err2));
                        break;
                }
+
                lyxColorHandler->updateColor(lcolor.getFromLyXName(lyx_name));
+
+               if (graphicsbg_changed) {
+                       grfx::GCache & gc = grfx::GCache::get();
+                       gc.changeDisplay(true);
+               }
+
                owner->view()->redraw();
                break;
        }
@@ -1629,6 +1637,25 @@ string const LyXFunc::dispatch(kb_action action, string argument)
                owner->messagePop();
                break;
 
+       case LFUN_FORKS_SHOW:
+               owner->getDialogs()->showForks();
+               break;
+
+       case LFUN_FORKS_KILL:
+       {
+               if (!isStrInt(argument))
+                       break;
+
+               pid_t const pid = strToInt(argument);
+               ForkedcallsController & fcc = ForkedcallsController::get();
+               fcc.kill(pid);
+               break;
+       }
+
+       case LFUN_TOOLTIPS_TOGGLE:
+               owner->getDialogs()->toggleTooltips();
+               break;
+
        default:
                // Then if it was none of the above
                // Trying the BufferView::pimpl dispatch:
@@ -1647,7 +1674,7 @@ exit_with_message:
                owner->message(_(res));
        owner->updateMenubar();
        owner->updateToolbar();
-       
+
        return res;
 }
 
@@ -1672,7 +1699,7 @@ void LyXFunc::menuNew(bool fromTemplate)
 
        static int newfile_number;
        string s;
-       
+
        if (lyxrc.new_ask_filename) {
                FileDialog fileDlg(owner, _("Enter filename for new document"),
                                   LFUN_SELECT_FILE_SYNC,
@@ -1685,13 +1712,13 @@ void LyXFunc::menuNew(bool fromTemplate)
                        fileDlg.Select(initpath,
                                       _("*.lyx|LyX Documents (*.lyx)"),
                                       _("newfile"));
-       
+
                if (result.second.empty()) {
                        owner->message(_("Canceled."));
                        lyxerr[Debug::INFO] << "New Document Cancelled." << endl;
                        return;
                }
-       
+
                // get absolute path of file and make sure the filename ends
                // with .lyx
                s = MakeAbsPath(result.second);
@@ -1721,25 +1748,25 @@ void LyXFunc::menuNew(bool fromTemplate)
                // Check whether the file already exists
                FileInfo fi(s);
                if (fi.readable() &&
-                   Alert::askQuestion(_("File already exists:"), 
+                   Alert::askQuestion(_("File already exists:"),
                                MakeDisplayPath(s, 50),
                                _("Do you want to open the document?"))) {
                                // loads document
                        string const disp_fn(MakeDisplayPath(s));
-                       
+
                        ostringstream str;
                        str << _("Opening  document") << ' '
                            << disp_fn << "...";
-                       
+
                        owner->message(str.str().c_str());
                        //XFlush(fl_get_display());
                        owner->view()->buffer(bufferlist.loadLyXFile(s));
                        ostringstream str2;
                        str2 << _("Document") << ' '
                             << disp_fn << ' ' << _("opened.");
-                       
+
                        owner->message(str2.str().c_str());
-                       
+
                        return;
                }
        } else {
@@ -1768,17 +1795,17 @@ void LyXFunc::menuNew(bool fromTemplate)
                FileDialog::Result result =
                        fileDlg.Select(lyxrc.template_path,
                                       _("*.lyx|LyX Documents (*.lyx)"));
-       
+
                if (result.first == FileDialog::Later)
                        return;
 
                string const fname = result.second;
 
-               if (fname.empty()) 
+               if (fname.empty())
                        return;
-                templname = fname;
+               templname = fname;
        }
-  
+
        // find a free buffer
        lyxerr[Debug::INFO] << "Find a free buffer." << endl;
        owner->view()->buffer(bufferlist.newFile(s, templname));
@@ -1788,7 +1815,7 @@ void LyXFunc::menuNew(bool fromTemplate)
 void LyXFunc::open(string const & fname)
 {
        string initpath = lyxrc.document_path;
-  
+
        if (owner->view()->available()) {
                string const trypath = owner->buffer()->filePath();
                // If directory is writeable, use this as default.
@@ -1797,7 +1824,7 @@ void LyXFunc::open(string const & fname)
        }
 
        string filename;
+
        if (fname.empty()) {
                FileDialog fileDlg(owner, _("Select document to open"),
                        LFUN_FILE_OPEN,
@@ -1809,12 +1836,12 @@ void LyXFunc::open(string const & fname)
                FileDialog::Result result =
                        fileDlg.Select(initpath,
                                       "*.lyx|LyX Documents (*.lyx)");
-       
+
                if (result.first == FileDialog::Later)
                        return;
 
                filename = result.second;
+
                // check selected filename
                if (filename.empty()) {
                        owner->message(_("Canceled."));
@@ -1832,13 +1859,13 @@ void LyXFunc::open(string const & fname)
        }
 
        filename = fullpath;
+
        // loads document
        string const disp_fn(MakeDisplayPath(filename));
 
        ostringstream str;
        str << _("Opening document") << ' ' << disp_fn << "...";
-       
+
        owner->message(str.str().c_str());
 
        Buffer * openbuf = bufferlist.loadLyXFile(filename);
@@ -1860,12 +1887,12 @@ 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;
 
        if (filename.empty()) { // need user interaction
                string initpath = lyxrc.document_path;
-               
+
                if (owner->view()->available()) {
                        string const trypath = owner->buffer()->filePath();
                        // If directory is writeable, use this as default.
@@ -1876,13 +1903,13 @@ void LyXFunc::doImport(string const & argument)
                string const text = _("Select ") + formats.prettyName(format)
                        + _(" file to import");
 
-               FileDialog fileDlg(owner, text, 
+               FileDialog fileDlg(owner, text,
                        LFUN_IMPORT,
                        make_pair(string(_("Documents|#o#O")),
                                  string(lyxrc.document_path)),
                        make_pair(string(_("Examples|#E#e")),
                                  string(AddPath(system_lyxdir, "examples"))));
-                       
+
                string const extension = "*." + formats.extension(format)
                        + "| " + formats.prettyName(format)
                        + " (*." + formats.extension(format) + ")";
@@ -1894,14 +1921,14 @@ void LyXFunc::doImport(string const & argument)
                        return;
 
                filename = result.second;
+
                // check selected filename
                if (filename.empty())
                        owner->message(_("Canceled."));
        }
 
        // still no filename? abort
-       if (filename.empty()) 
+       if (filename.empty())
                return;
 
        // get absolute path of file
@@ -1911,7 +1938,7 @@ void LyXFunc::doImport(string const & argument)
 
        // Check if the document already is open
        if (bufferlist.exists(lyxfile)) {
-               switch (Alert::askConfirmation(_("Document is already open:"), 
+               switch (Alert::askConfirmation(_("Document is already open:"),
                                        MakeDisplayPath(lyxfile, 50),
                                        _("Do you want to close that document now?\n"
                                          "('No' will just switch to the open version)")))
@@ -1932,14 +1959,14 @@ void LyXFunc::doImport(string const & argument)
 
        // Check if a LyX document by the same root exists in filesystem
        FileInfo const f(lyxfile, true);
-       if (f.exist() && !Alert::askQuestion(_("A document by the name"), 
+       if (f.exist() && !Alert::askQuestion(_("A document by the name"),
                                      MakeDisplayPath(lyxfile),
                                      _("already exists. Overwrite?"))) {
                owner->message(_("Canceled"));
                return;
        }
        // filename should be valid now
-       
+
        Importer::Import(owner, filename, format);
 }
 
@@ -1980,7 +2007,7 @@ void LyXFunc::setErrorMessage(string const & m) const
 }
 
 
-void LyXFunc::setMessage(string const & m) const 
+void LyXFunc::setMessage(string const & m) const
 {
        dispatch_buffer = m;
 }
@@ -1992,10 +2019,10 @@ void LyXFunc::setStatusMessage(string const & m) const
 }
 
 
-void LyXFunc::initMiniBuffer() 
+void LyXFunc::initMiniBuffer()
 {
        string text = _("Welcome to LyX!");
-       
+
        // When meta-fake key is pressed, show the key sequence so far + "M-".
        if (wasMetaKey()) {
                text = keyseq.print();
@@ -2007,12 +2034,12 @@ void LyXFunc::initMiniBuffer()
        if (keyseq.length() > 0 && !keyseq.deleted()) {
                text = keyseq.printOptions();
        }
-   
+
        // Else, show the buffer state.
        else if (owner->view()->available()) {
                Buffer * tmpbuf = owner->buffer();
-               
-               string const nicename = 
+
+               string const nicename =
                        MakeDisplayPath(tmpbuf->fileName());
                // Should we do this instead? (kindo like emacs)
                // leaves more room for other information
@@ -2034,7 +2061,6 @@ void LyXFunc::initMiniBuffer()
                if (text != _("Welcome to LyX!")) // this is a hack
                        text = _("* No document open *");
        }
-       
+
        owner->message(text);
 }
-