From: Richard Heck Date: Thu, 16 Jul 2009 23:12:45 +0000 (+0000) Subject: React better if we can't find bind files. Related to bug 6076. X-Git-Tag: 2.0.0~5984 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=375d1526bb07bfcd21dd5bb11f39a60a00119d57;p=features.git React better if we can't find bind files. Related to bug 6076. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@30639 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/KeyMap.cpp b/src/KeyMap.cpp index a45bfc6998..c8f15d1cf9 100644 --- a/src/KeyMap.cpp +++ b/src/KeyMap.cpp @@ -23,6 +23,10 @@ #include "support/docstream.h" #include "support/FileName.h" #include "support/filetools.h" +#include "support/gettext.h" +#include "support/lstrings.h" + +#include "frontends/alert.h" #include #include @@ -205,7 +209,36 @@ void KeyMap::clear() } -bool KeyMap::read(string const & bind_file, KeyMap * unbind_map) +bool KeyMap::read(string const & bind_file, KeyMap * unbind_map, BindReadType rt) +{ + FileName bf = i18nLibFileSearch("bind", bind_file, "bind"); + if (bf.empty()) { + if (rt == MissingOK) + return true; + lyxerr << "Could not find bind file: " << bind_file; + if (rt == Default) { + frontend::Alert::warning(_("Could not find bind file"), + bformat(_("Unable to find the bind file\n%1$s.\n" + "Please check your installation."), from_utf8(bind_file))); + return false; + } + frontend::Alert::warning(_("Could not find bind file"), + bformat(_("Unable to find the bind file\n%1$s.\n" + "Falling back to default."), from_utf8(bind_file))); + // So try it with the default file. + if (read("cua", unbind_map)) + return true; + lyxerr << "Could not find cua bind file!"; + frontend::Alert::warning(_("Could not find cua bind file"), + _("Unable to find the default bind file `cua'.\n" + "Please check your installation.")); + return false; + } + return read(bf, unbind_map); +} + + +bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map) { enum { BN_BIND, @@ -223,14 +256,13 @@ bool KeyMap::read(string const & bind_file, KeyMap * unbind_map) if (lyxerr.debugging(Debug::PARSER)) lexrc.printTable(lyxerr); - FileName const tmp = i18nLibFileSearch("bind", bind_file, "bind"); - lexrc.setFile(tmp); + lexrc.setFile(bind_file); if (!lexrc.isOK()) { - LYXERR0("KeyMap::read: cannot open bind file:" << tmp); + LYXERR0("KeyMap::read: cannot open bind file:" << bind_file.absFilename()); return false; } - LYXERR(Debug::KBMAP, "Reading bind file:" << tmp); + LYXERR(Debug::KBMAP, "Reading bind file:" << bind_file.absFilename()); bool error = false; while (lexrc.isOK()) { @@ -313,7 +345,7 @@ bool KeyMap::read(string const & bind_file, KeyMap * unbind_map) } if (error) - LYXERR0("KeyMap::read: error while reading bind file:" << tmp); + LYXERR0("KeyMap::read: error while reading bind file:" << bind_file.absFilename()); return !error; } diff --git a/src/KeyMap.h b/src/KeyMap.h index 81c7b82ebf..1a37a1fc99 100644 --- a/src/KeyMap.h +++ b/src/KeyMap.h @@ -26,6 +26,10 @@ namespace lyx { +namespace support { + class FileName; +} + /// Defines key maps and actions for key sequences class KeyMap { public: @@ -37,6 +41,12 @@ public: UserExtraUnbind //< \unbind loaded from user.bind, without //< corresponding entry in system bind file. }; + enum BindReadType { + MissingOK, //< It's OK if this file is missing. + Fallback, //< If missing, fallback to default "cua". This should only + //< be used when attempting to read the user-secified bind file. + Default //< Report error and return. + }; /** * Bind/Unbind a key sequence to an action. * @return 0 on success, or position in string seq where error @@ -72,8 +82,10 @@ public: * * @param bind_file bind file * @param unbind_map pointer to a KeyMap that holds \unbind bindings + * @param rt how to respond if the file can't be found */ - bool read(std::string const & bind_file, KeyMap * unbind_map = 0); + bool read(std::string const & bind_file, KeyMap * unbind_map = 0, + BindReadType rt = Default); /** write to a bind file. * @param append append to the bind_file instead of overwrite it @@ -156,6 +168,9 @@ private: FuncRequest func; }; + /// + bool read(support::FileName const & bind_file, KeyMap * unbind_map = 0); + /** * Given an action, find all keybindings * @param func the action diff --git a/src/frontends/qt4/GuiPrefs.cpp b/src/frontends/qt4/GuiPrefs.cpp index 027d1dc4d3..0789a964d1 100644 --- a/src/frontends/qt4/GuiPrefs.cpp +++ b/src/frontends/qt4/GuiPrefs.cpp @@ -2264,8 +2264,8 @@ void PrefShortcuts::apply(LyXRC & rc) const // The good thing is that the menus are updated automatically. theTopLevelKeymap().clear(); theTopLevelKeymap().read("site"); - theTopLevelKeymap().read(rc.bind_file); - theTopLevelKeymap().read("user"); + theTopLevelKeymap().read(rc.bind_file, 0, KeyMap::Fallback); + theTopLevelKeymap().read("user", 0, KeyMap::MissingOK); } @@ -2279,7 +2279,7 @@ void PrefShortcuts::update(LyXRC const & rc) system_bind_.read("site"); system_bind_.read(rc.bind_file); // \unbind in user.bind is added to user_unbind_ - user_bind_.read("user", &user_unbind_); + user_bind_.read("user", &user_unbind_, KeyMap::MissingOK); updateShortcutsTW(); }