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
This commit is contained in:
Richard Heck 2009-07-16 23:12:45 +00:00
parent 091e3908b0
commit 375d1526bb
3 changed files with 57 additions and 10 deletions

View File

@ -23,6 +23,10 @@
#include "support/docstream.h" #include "support/docstream.h"
#include "support/FileName.h" #include "support/FileName.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/gettext.h"
#include "support/lstrings.h"
#include "frontends/alert.h"
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
@ -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 { enum {
BN_BIND, BN_BIND,
@ -223,14 +256,13 @@ bool KeyMap::read(string const & bind_file, KeyMap * unbind_map)
if (lyxerr.debugging(Debug::PARSER)) if (lyxerr.debugging(Debug::PARSER))
lexrc.printTable(lyxerr); lexrc.printTable(lyxerr);
FileName const tmp = i18nLibFileSearch("bind", bind_file, "bind"); lexrc.setFile(bind_file);
lexrc.setFile(tmp);
if (!lexrc.isOK()) { if (!lexrc.isOK()) {
LYXERR0("KeyMap::read: cannot open bind file:" << tmp); LYXERR0("KeyMap::read: cannot open bind file:" << bind_file.absFilename());
return false; return false;
} }
LYXERR(Debug::KBMAP, "Reading bind file:" << tmp); LYXERR(Debug::KBMAP, "Reading bind file:" << bind_file.absFilename());
bool error = false; bool error = false;
while (lexrc.isOK()) { while (lexrc.isOK()) {
@ -313,7 +345,7 @@ bool KeyMap::read(string const & bind_file, KeyMap * unbind_map)
} }
if (error) if (error)
LYXERR0("KeyMap::read: error while reading bind file:" << tmp); LYXERR0("KeyMap::read: error while reading bind file:" << bind_file.absFilename());
return !error; return !error;
} }

View File

@ -26,6 +26,10 @@
namespace lyx { namespace lyx {
namespace support {
class FileName;
}
/// Defines key maps and actions for key sequences /// Defines key maps and actions for key sequences
class KeyMap { class KeyMap {
public: public:
@ -37,6 +41,12 @@ public:
UserExtraUnbind //< \unbind loaded from user.bind, without UserExtraUnbind //< \unbind loaded from user.bind, without
//< corresponding entry in system bind file. //< 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. * Bind/Unbind a key sequence to an action.
* @return 0 on success, or position in string seq where error * @return 0 on success, or position in string seq where error
@ -72,8 +82,10 @@ public:
* *
* @param bind_file bind file * @param bind_file bind file
* @param unbind_map pointer to a KeyMap that holds \unbind bindings * @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. /** write to a bind file.
* @param append append to the bind_file instead of overwrite it * @param append append to the bind_file instead of overwrite it
@ -156,6 +168,9 @@ private:
FuncRequest func; FuncRequest func;
}; };
///
bool read(support::FileName const & bind_file, KeyMap * unbind_map = 0);
/** /**
* Given an action, find all keybindings * Given an action, find all keybindings
* @param func the action * @param func the action

View File

@ -2264,8 +2264,8 @@ void PrefShortcuts::apply(LyXRC & rc) const
// The good thing is that the menus are updated automatically. // The good thing is that the menus are updated automatically.
theTopLevelKeymap().clear(); theTopLevelKeymap().clear();
theTopLevelKeymap().read("site"); theTopLevelKeymap().read("site");
theTopLevelKeymap().read(rc.bind_file); theTopLevelKeymap().read(rc.bind_file, 0, KeyMap::Fallback);
theTopLevelKeymap().read("user"); theTopLevelKeymap().read("user", 0, KeyMap::MissingOK);
} }
@ -2279,7 +2279,7 @@ void PrefShortcuts::update(LyXRC const & rc)
system_bind_.read("site"); system_bind_.read("site");
system_bind_.read(rc.bind_file); system_bind_.read(rc.bind_file);
// \unbind in user.bind is added to user_unbind_ // \unbind in user.bind is added to user_unbind_
user_bind_.read("user", &user_unbind_); user_bind_.read("user", &user_unbind_, KeyMap::MissingOK);
updateShortcutsTW(); updateShortcutsTW();
} }