all repos — fluxbox @ a3c0b049bf4fabee1b7b4ab3a5513dc11c5e9dd4

custom fork of the fluxbox windowmanager

Fix corruption of fbrun-history

This commit fixes issues #72 (brought up + different solution by Mattias
Guns; I received a similar patch by 'Nable 80' via ML and discussed the
issue in #fluxbox with 'Nable 80'), patch #73 (Mattias Guns) and finally
patch #162 (Ulrich Eckhardt; this commit is heavily based upon Ulrich's
work).

The original code was overly complex. It tried to avoid writing
bytes to the disk at the expense of comprehensibility and as a result it
was buggy. I looked at both patches from Mattias and 'Nable 80' which address
the bug with skipping entries in the history-file (my fault: incorrect use
of outfile.ignore(1, '\n')): They provided a proper fix for the problem
but I decided to use Ulrich's code since it improves the whole code by making
it a lot simpler.

So, kudos to all of you.
Mathias Gumz akira@fluxbox.org
commit

a3c0b049bf4fabee1b7b4ab3a5513dc11c5e9dd4

parent

0e8a27e931e66a4823b761983dca38a59fa6f37f

1 files changed, 20 insertions(+), 42 deletions(-)

jump to
M util/fbrun/FbRun.ccutil/fbrun/FbRun.cc

@@ -110,12 +110,18 @@ hide();

} void FbRun::run(const std::string &command) { + FbTk::App::instance()->end(); // end application m_end = true; // mark end of processing + hide(); // hide gui + if (m_print) { std::cout << command; - hide(); + return; + } + + if (command.empty()) { return; }

@@ -152,51 +158,23 @@ #else

#error "Can't build FbRun - don't know how to launch without fork on your platform" #endif - hide(); // hide gui - - // save command history to file - if (text().size() != 0) { // no need to save empty command - - // don't allow duplicates into the history file, first - // look for a duplicate - if (m_current_history_item < m_history.size() - && text() == m_history[m_current_history_item]) { - // m_current_history_item is the duplicate - } else { - m_current_history_item = 0; - for (; m_current_history_item < m_history.size(); - ++m_current_history_item) { - if (m_history[m_current_history_item] == text()) - break; - } - } - - fstream inoutfile(m_history_file.c_str(), ios::in|ios::out); - if (inoutfile) { - // now m_current_history_item points at the duplicate, or - // at m_history.size() if no duplicate - if (m_current_history_item != m_history.size()) { - unsigned int i = 0; - // read past history items before current - for (; inoutfile.good() && i < m_current_history_item; i++) - inoutfile.ignore(1, '\n'); + ofstream outfile(m_history_file.c_str()); + if (!outfile) { + cerr<<"FbRun Warning: Can't write command history to file: "<<m_history_file<<endl; + return; + } - // write the history items that come after current - for (i++; i < m_history.size(); i++) - inoutfile<<m_history[i]<<endl; + for (unsigned i = 0; i != m_history.size(); ++i) { + // don't allow duplicates into the history file + if (m_history[i] == command) + continue; - } else { - // set put-pointer at end of file - inoutfile.seekp(0, ios::end); - } - // append current command to the file - inoutfile<<command<<endl; - - } else - cerr<<"FbRun Warning: Can't write command history to file: "<<m_history_file<<endl; + outfile<<m_history[i]<<endl; } + outfile<<command<<endl; + outfile.close(); +} -} bool FbRun::loadHistory(const char *filename) { if (filename == 0)