#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 <fstream>
#include <sstream>
}
-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,
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()) {
}
if (error)
- LYXERR0("KeyMap::read: error while reading bind file:" << tmp);
+ LYXERR0("KeyMap::read: error while reading bind file:" << bind_file.absFilename());
return !error;
}
namespace lyx {
+namespace support {
+ class FileName;
+}
+
/// Defines key maps and actions for key sequences
class KeyMap {
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
*
* @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
FuncRequest func;
};
+ ///
+ bool read(support::FileName const & bind_file, KeyMap * unbind_map = 0);
+
/**
* Given an action, find all keybindings
* @param func the action
// 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);
}
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();
}