Conversion routines for bind files.

All the LFUNs listed in the release notes should be properly converted.
If not, then changes should be made to the file:
	lib/scripts/prefs2prefs-lfuns.py


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@37231 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2011-01-16 19:53:36 +00:00
parent 0e2828917b
commit f05e76c330
2 changed files with 57 additions and 7 deletions

View File

@ -37,6 +37,10 @@ using namespace lyx::support;
namespace lyx {
namespace {
// current format of bind files
static unsigned int const BIND_FORMAT = 1;
}
string const KeyMap::printKeySym(KeySymbol const & key, KeyModifier mod)
{
@ -243,10 +247,32 @@ bool KeyMap::read(string const & bind_file, KeyMap * unbind_map, BindReadType rt
bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map)
{
ReturnValues retval = readWithoutConv(bind_file, unbind_map);
if (retval != FormatMismatch)
return retval == ReadOK;
LYXERR(Debug::FILES, "Converting bind file to " << BIND_FORMAT);
FileName const tempfile = FileName::tempName("convert_bind");
bool const success = prefs2prefs(bind_file, tempfile, true);
if (!success) {
LYXERR0 ("Unable to convert " << bind_file <<
" to format " << BIND_FORMAT);
return false;
}
retval = readWithoutConv(tempfile, unbind_map);
//tempfile.removeFile();
return retval == ReadOK;
return true;
}
KeyMap::ReturnValues KeyMap::readWithoutConv(FileName const & bind_file, KeyMap * unbind_map)
{
enum {
BN_BIND,
BN_BINDFILE,
BN_FORMAT,
BN_UNBIND
};
@ -254,6 +280,7 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map)
{ "\\bind", BN_BIND },
{ "\\bind_file", BN_BINDFILE },
{ "\\unbind", BN_UNBIND },
{ "format", BN_FORMAT }
};
Lexer lexrc(bindTags);
@ -263,11 +290,13 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map)
lexrc.setFile(bind_file);
if (!lexrc.isOK()) {
LYXERR0("KeyMap::read: cannot open bind file:" << bind_file.absFileName());
return false;
return FileError;
}
LYXERR(Debug::KBMAP, "Reading bind file:" << bind_file.absFileName());
// format of pre-2.0 bind files, before this tag was introduced.
unsigned int format = 0;
bool error = false;
while (lexrc.isOK()) {
switch (lexrc.lex()) {
@ -280,6 +309,11 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map)
case Lexer::LEX_FEOF:
continue;
case BN_FORMAT:
if (lexrc.next())
format = lexrc.getInteger();
break;
case BN_BIND: {
if (!lexrc.next()) {
lexrc.printError("BN_BIND: Missing key sequence");
@ -328,7 +362,7 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map)
error = true;
break;
}
if (unbind_map)
unbind_map->bind(seq, func);
else
@ -346,23 +380,31 @@ bool KeyMap::read(FileName const & bind_file, KeyMap * unbind_map)
error |= !read(tmp, unbind_map);
break;
}
// This is triggered the first time through the loop unless
// we hit a format tag.
if (format != BIND_FORMAT)
return FormatMismatch;
}
if (error)
if (error) {
LYXERR0("KeyMap::read: error while reading bind file:" << bind_file.absFileName());
return !error;
return ReadError;
}
return ReadOK;
}
void KeyMap::write(string const & bind_file, bool append, bool unbind) const
{
ofstream os(bind_file.c_str(),
ofstream os(bind_file.c_str(),
append ? (ios::app | ios::out) : ios::out);
if (!append)
os << "## This file is automatically generated by lyx\n"
<< "## All modifications will be lost\n\n";
<< "## All modifications will be lost\n\n"
<< "Format " << BIND_FORMAT << "\n\n";
string tag = unbind ? "\\unbind" : "\\bind";
BindingList const list = listBindings(false);
BindingList::const_iterator it = list.begin();

View File

@ -168,8 +168,16 @@ private:
FuncRequest func;
};
enum ReturnValues {
ReadOK,
ReadError,
FileError,
FormatMismatch
};
///
bool read(support::FileName const & bind_file, KeyMap * unbind_map = 0);
///
ReturnValues readWithoutConv(support::FileName const & bind_file, KeyMap * unbind_map = 0);
/**
* Given an action, find all keybindings