Hans Joachim Desserud has proposed merging lp:~widelands-dev/widelands/remove-record into lp:widelands.
Requested reviews: Widelands Developers (widelands-dev) For more details, see: https://code.launchpad.net/~widelands-dev/widelands/remove-record/+merge/210496 Like we talked about back when updating/tweaking the readme, I've removed the --record and --playback options since they weren't in use. I started out following the methods called by the option when running Widelands, but ended up removing all of journal and journal_exception when I discovered it wasn't used for anything else. I was also able to remove a helper function which wasn't used elsewhere. A couple of places has been marked FIXME to get some feedback on them. -- https://code.launchpad.net/~widelands-dev/widelands/remove-record/+merge/210496 Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/remove-record into lp:widelands.
=== modified file 'src/helper.h' --- src/helper.h 2013-07-26 19:16:51 +0000 +++ src/helper.h 2014-03-11 20:33:30 +0000 @@ -135,22 +135,6 @@ return x; } -/* Convert any sstream-compatible type to std::string - * - * \note In a just world, this would be implemented with gnu::autosprintf. But - * many distributions don't carry that lib despite the fact that it is part of - * glibc. - * - * \see http://www.experts-exchange.com/Programming/ - * Programming_Languages/Cplusplus/Q_20670737.html - * \author AssafLavie on http://www.experts-exchange.com - */ -template<typename T> std::string toString(const T & x) { - std::ostringstream oss; - oss << x; - return oss.str(); -} - std::vector<std::string> split_string (const std::string &, char const * separators); void remove_spaces(std::string &); === removed file 'src/journal.cc' --- src/journal.cc 2013-07-26 19:16:51 +0000 +++ src/journal.cc 1970-01-01 00:00:00 +0000 @@ -1,484 +0,0 @@ -/* - * Copyright (C) 2006-2009 by the Widelands Development Team - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "journal.h" - -#include <cassert> - -#include "io/filesystem/filesystem.h" -#include "log.h" -#include "machdep.h" - -/** - * Write a signed 8bit value to the recording file. - * \param v The character to be written - */ -void Journal::write(int8_t const v) { - m_recordstream.write(reinterpret_cast<const char *>(&v), sizeof(v)); -} - -/// \overload -void Journal::write(uint8_t const v) { - m_recordstream.write(reinterpret_cast<const char *>(&v), sizeof(v)); -} - -/// \overload -void Journal::write(int16_t v) { - v = Little16(v); - m_recordstream.write(reinterpret_cast<const char *>(&v), sizeof(v)); -} -/// \overload -void Journal::write(uint16_t v) { - v = Little16(v); - m_recordstream.write(reinterpret_cast<const char *>(&v), sizeof(v)); -} - -/// \overload -void Journal::write(int32_t v) { - v = Little32(v); - m_recordstream.write(reinterpret_cast<const char *>(&v), sizeof(v)); -} - -/// \overload -void Journal::write(uint32_t v) { - v = Little32(v); - m_recordstream.write(reinterpret_cast<const char *>(&v), sizeof(v)); -} - -/// \overload -/// SDLKey is an enum, and enums are implemented as int32_t. Consequently, -/// SDLKey changes size on 64bit machines :-( -/// So we force it to be 32bit, discarding the higher 32 bits (hopefully no-one -/// will have so many keys). -/// -/// On 32bit systems, it does not matter whether this method or -/// \ref write(Uint32 v) actually gets used. -/// -/// \sa write(SDLMod v) -/// \sa read(SDLMod &v) -void Journal::write(SDLKey v) -{ - write(static_cast<uint32_t>(v)); -} - -/** - * \overload - * \sa write(SDLKey v) - */ -void Journal::write(SDLMod v) -{ - write(static_cast<uint32_t>(v)); -} - -/** - * Write a signed char value to the recording file. - * \param v Reference where the read character will be stored. - */ -void Journal::read (int8_t & v) -{ - m_playbackstream.read(reinterpret_cast<char *>(&v), sizeof(uint8_t)); -} - -/** - * \overload - */ -void Journal::read(uint8_t & v) -{ - m_playbackstream.read(reinterpret_cast<char *>(&v), sizeof(uint8_t)); -} - -/** - * \overload - */ -void Journal::read (int16_t & v) { - m_playbackstream.read(reinterpret_cast<char *>(&v), sizeof(int16_t)); - v = Little16(v); -} - -/** - * \overload - */ -void Journal::read(uint16_t & v) { - m_playbackstream.read(reinterpret_cast<char *>(&v), sizeof(uint16_t)); - v = Little16(v); -} - -/** - * \overload - */ -void Journal::read (int32_t & v) { - m_playbackstream.read(reinterpret_cast<char *>(&v), sizeof(int32_t)); - v = Little32(v); -} - -/** - * \overload - */ -void Journal::read(uint32_t & v) { - m_playbackstream.read(reinterpret_cast<char *>(&v), sizeof(uint32_t)); - v = Little32(v); -} - -/** - * \overload - * \sa read(SDLKey v) - */ -void Journal::read(SDLKey & v) -{ - uint32_t x; - read(x); - v = static_cast<SDLKey>(x); -} - -/** - * \overload - * \sa read(SDLKey v) - */ -void Journal::read(SDLMod & v) -{ - uint32_t x; - read(x); - v = static_cast<SDLMod>(x); -} - -/** - * \todo Document me - */ -void Journal::ensure_code(uint8_t code) -{ - uint8_t filecode; - - read(filecode); - if (filecode != code) { - throw BadRecord_error(m_playbackname, filecode, code); - } -} - -/** - * Standard ctor - */ -Journal::Journal() -: -m_recordname(""), m_playbackname(""), -m_record(false), m_playback(false) -{ - m_recordstream.exceptions - (std::ifstream::eofbit | std::ifstream::failbit | std::ifstream::badbit); - - m_playbackstream.exceptions - (std::ifstream::eofbit | std::ifstream::failbit | std::ifstream::badbit); -} - -/** - * Close any open journal files - */ -Journal::~Journal() -{ - stop_recording(); - stop_playback(); -} - -/** - * Start recording events handed to us - * \param filename File the events should be written to - * \todo set the filename somewhere else - */ -void Journal::start_recording(const std::string & filename) -{ - assert(!m_recordstream.is_open()); - - //TODO: m_recordname = FileSystem::FS_CanonicalizeName(filename); - m_recordname = filename; - if (m_recordname.empty()) - assert(false); //TODO: barf in a controlled way - - try { - m_recordstream.open - (m_recordname.c_str(), std::ios::binary|std::ios::trunc); - write(RFC_MAGIC); - m_recordstream << std::flush; - m_record = true; - log("Recording into %s\n", m_recordname.c_str()); - } - catch (std::ofstream::failure &) { - //TODO: use exception mask to find out what happened - //TODO: there should be a messagebox to tell the user. - log - ("Problem while opening record file %s for writing.\n", - m_recordname.c_str()); - stop_recording(); - throw Journalfile_error(m_recordname); - } -} - -/** - * Stop recording events. - * It's safe to call this even if recording has not been - * started yet. - */ -void Journal::stop_recording() -{ - m_record = false; - - if (m_recordstream.is_open()) { - m_recordstream<<std::flush; - m_recordstream.close(); - } -} - -/** - * Start playing back events - * \param filename File to get events from - * \todo set the filename somewhere else - */ -void Journal::start_playback(const std::string & filename) -{ - assert(!m_playbackstream.is_open()); - - //TODO: m_playbackname = FileSystem::FS_CanonicalizeName(filename); - m_playbackname = filename; - if (m_playbackname.empty()) - assert(false); //TODO: barf in a controlled way - - try { - uint32_t magic; - - m_playbackstream.open(m_playbackname.c_str(), std::ios::binary); - read(magic); - if (magic != RFC_MAGIC) - throw BadMagic_error(m_playbackname); - m_playback = true; - log("Playing back from %s\n", m_playbackname.c_str()); - } - catch (std::ifstream::failure &) { - //TODO: use exception mask to find out what happened - //TODO: there should be a messagebox to tell the user. - log - ("ERROR: problem while opening playback file for reading. Playback " - "deactivated.\n"); - stop_playback(); - throw Journalfile_error(m_recordname); - } -} - -/** - * Stop playing back events. - * It's safe to call this even if playback has not been - * started yet. - */ -void Journal::stop_playback() -{ - m_playback = false; - - if (m_playbackstream.is_open()) { - m_playbackstream.close(); - } -} - -/** - * Record an event into the playback file. This entails serializing the - * event and writing it out. - * - * \param e The event to be recorded - */ -void Journal::record_event(const SDL_Event & e) -{ - if (!m_record) - return; - - try { - //Note: the following lines are *inside* the switch on purpose: - // write(RFC_EVENT); - // m_recordstream<<std::flush; - //If they were outside, they'd get executed on every mainloop - //iteration, which would yield a) huge files and b) lots of - //completely unnecessary overhad. - switch (e.type) { - case SDL_KEYDOWN: - write(static_cast<uint8_t>(RFC_EVENT)); - write(static_cast<uint8_t>(RFC_KEYDOWN)); - write(e.key.keysym.mod); - write(e.key.keysym.sym); - write(e.key.keysym.unicode); - m_recordstream << std::flush; - break; - case SDL_KEYUP: - write(static_cast<uint8_t>(RFC_EVENT)); - write(static_cast<uint8_t>(RFC_KEYUP)); - write(e.key.keysym.mod); - write(e.key.keysym.sym); - write(e.key.keysym.unicode); - m_recordstream << std::flush; - break; - case SDL_MOUSEBUTTONDOWN: - write(static_cast<uint8_t>(RFC_EVENT)); - write(static_cast<uint8_t>(RFC_MOUSEBUTTONDOWN)); - write(e.button.button); - write(e.button.x); - write(e.button.y); - write(e.button.state); - m_recordstream << std::flush; - break; - case SDL_MOUSEBUTTONUP: - write(static_cast<uint8_t>(RFC_EVENT)); - write(static_cast<uint8_t>(RFC_MOUSEBUTTONUP)); - write(e.button.button); - write(e.button.x); - write(e.button.y); - write(e.button.state); - m_recordstream << std::flush; - break; - case SDL_MOUSEMOTION: - write(static_cast<uint8_t>(RFC_EVENT)); - write(static_cast<uint8_t>(RFC_MOUSEMOTION)); - write(e.motion.state); - write(e.motion.x); - write(e.motion.y); - write(e.motion.xrel); - write(e.motion.yrel); - m_recordstream << std::flush; - break; - case SDL_QUIT: - write(static_cast<uint8_t>(RFC_EVENT)); - write(static_cast<uint8_t>(RFC_QUIT)); - m_recordstream << std::flush; - break; - default: - // can't really do anything useful with this event - break; - } - } - catch (const std::ofstream::failure &) { - //TODO: use exception mask to find out what happened - //TODO: there should be a messagebox to tell the user. - log("Failed to write to record file. Recording deactivated.\n"); - stop_recording(); - throw Journalfile_error(m_recordname); - } -} - -/** - * Get an event from the playback file. This entails creating an empty - * event with sensible default values (not all parameters get recorded) - * and deserializing the event record. - * - * \param e The event being returned - */ -bool Journal::read_event(SDL_Event & e) -{ - if (!m_playback) - return false; - - bool haveevent = false; - - try { - uint8_t recordtype; - read(recordtype); - switch (recordtype) { - case RFC_EVENT: - uint8_t eventtype; - read(eventtype); - switch (eventtype) { - case RFC_KEYDOWN: - e.type = SDL_KEYDOWN; - read(e.key.keysym.mod); - read(e.key.keysym.sym); - read(e.key.keysym.unicode); - break; - case RFC_KEYUP: - e.type = SDL_KEYUP; - read(e.key.keysym.mod); - read(e.key.keysym.sym); - read(e.key.keysym.unicode); - break; - case RFC_MOUSEBUTTONDOWN: - e.type = SDL_MOUSEBUTTONDOWN; - read(e.button.button); - read(e.button.x); - read(e.button.y); - read(e.button.state); - break; - case RFC_MOUSEBUTTONUP: - e.type = SDL_MOUSEBUTTONUP; - read(e.button.button); - read(e.button.x); - read(e.button.y); - read(e.button.state); - break; - case RFC_MOUSEMOTION: - e.type = SDL_MOUSEMOTION; - read(e.motion.state); - read(e.motion.x); - read(e.motion.y); - read(e.motion.xrel); - read(e.motion.yrel); - break; - case RFC_QUIT: - e.type = SDL_QUIT; - break; - default: - throw BadEvent_error(m_playbackname, eventtype); - } - - haveevent = true; - break; - case RFC_ENDEVENTS: - //Do nothing - break; - default: - throw BadRecord_error(m_playbackname, recordtype, RFC_INVALID); - break; - } - } catch (const std::ifstream::failure &) { - //TODO: use exception mask to find out what happened - //TODO: there should be a messagebox to tell the user. - log("Failed to read from journal file. Playback deactivated.\n"); - stop_playback(); - throw Journalfile_error(m_playbackname); - } - - return haveevent; -} - -/** - * Do the right thing with timestamps. - * All timestamps handled with \ref WLApplication::get_time() pass through here. - * If necessary, they will be recorded. On playback, they will be modified to - * show the recorded time instead of the current time. - */ -void Journal::timestamp_handler(uint32_t & stamp) -{ - if (m_record) { - write(static_cast<uint8_t>(RFC_GETTIME)); - write(stamp); - } - - if (m_playback) { - ensure_code(static_cast<uint8_t>(RFC_GETTIME)); - read(stamp); - } -} - -/** - * \todo document me - */ -void Journal::set_idle_mark() -{ - write(static_cast<uint8_t>(RFC_ENDEVENTS)); -} === removed file 'src/journal.h' --- src/journal.h 2013-07-26 19:16:51 +0000 +++ src/journal.h 1970-01-01 00:00:00 +0000 @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2006-2009 by the Widelands Development Team - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef JOURNAL_H -#define JOURNAL_H - -#include <cstring> -#include <fstream> -#include <string> - -#include <SDL_events.h> - -#include "journal_exceptions.h" - -/** - * Journal encapsulates all operations that are necessary for recording and - * playing back a session. On it's interface, it deals with SDL_Events that - * might (or might not) be recorded/played back. Whether a recording / playback - * is actually being performed is internal to Journal. - * - * \note If you are hacking this class, throw a Journalfile_exception only - * and always if there is a nonrecoverable error and you have already dealt with - * it. - * - * \todo The idea of writing enums into a file is bad: enums are int32_t and - * int32_t varies in size (typ. 32/64bit). Our own codes only need 8bit, so we - * force IO down to this value. The same happens with keyboard events at - * 32 bits. Cutting off bits is not a good solution, but in this case it'll do - * until a better way comes along. - */ -struct Journal { - /// change this and I will ensure your death will be a most unpleasant one - static uint32_t const RFC_MAGIC = 0x0ACAD100; - - /** - * Record file codes - * It should be possible to use record files across different platforms. - * However, 64 bit platforms are currently not supported. - */ - enum rfccode { - RFC_GETTIME = 0x01, - RFC_EVENT = 0x02, - RFC_ENDEVENTS = 0x03, - - RFC_KEYDOWN = 0x10, - RFC_KEYUP = 0x11, - RFC_MOUSEBUTTONDOWN = 0x12, - RFC_MOUSEBUTTONUP = 0x13, - RFC_MOUSEMOTION = 0x14, - RFC_QUIT = 0x15, - RFC_INVALID = 0xff - }; - -public: - Journal(); - ~Journal(); - - void start_recording(const std::string & filename = "widelands.jnl"); - void stop_recording(); - ///True if events are being recorded - bool is_recording() const {return m_record;} - - void start_playback (const std::string & filename = "widelands.jnl"); - void stop_playback(); - ///True if events are being played back - bool is_playingback() const {return m_playback;} - - void record_event(const SDL_Event &); - bool read_event(SDL_Event &); - - void timestamp_handler(uint32_t & stamp); - void set_idle_mark(); - -protected: - /** - * Returns the position in the playback file - * \return byte offset into the playback file, used with file reading - */ - int32_t get_playback_offset() {return m_playbackstream.tellg();} - - void write(int8_t); - void write(uint8_t); - void write(int16_t); - void write(uint16_t); - void write(int32_t); - void write(uint32_t); - void write(SDLKey); - void write(SDLMod); - - void read(int8_t &); - void read(uint8_t &); - void read(int16_t &); - void read(uint16_t &); - void read(int32_t &); - void read(uint32_t &); - void read(SDLKey &); - void read(SDLMod &); - void ensure_code(uint8_t code); - - ///The recording file's name. - ///\note This does \e not go through the layered filesystem on purpose! - std::string m_recordname; - - ///The playback file's name. - ///\note This does \e not go through the layered filesystem on purpose! - std::string m_playbackname; - - ///The file events are being recorded to - std::ofstream m_recordstream; - - ///The file events are being played back from - std::ifstream m_playbackstream; - - ///True if events are being recorded - bool m_record; - - ///True if events are being played back - bool m_playback; -}; - -#endif === removed file 'src/journal_exceptions.cc' --- src/journal_exceptions.cc 2013-09-23 18:47:02 +0000 +++ src/journal_exceptions.cc 1970-01-01 00:00:00 +0000 @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2006, 2008 by the Widelands Development Team - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "journal_exceptions.h" - -#include "helper.h" - -Journalfile_error::Journalfile_error(const std::string & _filename) -: std::runtime_error("Problem with journal file."), filename(_filename) -{ - text = "Problem with journal file " + _filename; -} - -///\todo Say _which_ magic number was found and which was expected -BadMagic_error::BadMagic_error(const std::string & _filename) -: Journalfile_error(_filename) -{ - text = "Journal file " + _filename + " starts with bad magic number"; -} - -BadRecord_error::BadRecord_error - (const std::string & _filename, - uint8_t const _code, - uint8_t const _expectedcode) -: Journalfile_error(_filename), offset(0), code(_code), expectedcode(_expectedcode) -{ - text = "Journal file "; - text += _filename; - text += " contains record with type "; - text += toString(static_cast<int>(_code)); - text += " instead of the expected type "; - text += toString(static_cast<int>(_expectedcode)); -} - -BadEvent_error::BadEvent_error - (const std::string & _filename, uint8_t const _type) -: Journalfile_error(_filename), offset(0), type(_type) -{ - text = "Journal file '"; - text += _filename; - text += "' contains record with unknown event type "; - text += toString(_type); -} === removed file 'src/journal_exceptions.h' --- src/journal_exceptions.h 2014-02-22 18:04:02 +0000 +++ src/journal_exceptions.h 1970-01-01 00:00:00 +0000 @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2006, 2008-2009 by the Widelands Development Team - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef JOURNAL_EXCEPTIONS_H -#define JOURNAL_EXCEPTIONS_H - -#include <stdexcept> -#include <string> - -#include <stdint.h> - -/// -/// Thrown for IO-errors occurring with a journal file (unable to open file -/// for any reason, out of space, etc.) that a) are unrecoverable and b) -/// have already been dealt with. -/// -/// This is a purely informational exception. Do not throw it unless it can -/// safely be ignored. -/// -/// \todo add offset into journal file if applicable -/// \todo Rework as proposed by Erik, see filesystem_exceptions.h. Before that: -/// Replace with File*_error where appropriate, migrate from runtime_error to -/// logic_error (?) -struct Journalfile_error : public std::runtime_error { - explicit Journalfile_error(const std::string & filename); - virtual ~Journalfile_error() throw () {} - - virtual char const * what() const throw () override {return text.c_str();} - - std::string text; - std::string filename; -}; - -/** - * Thrown if the journal file contains a bad magic number - * \todo add offset into journal file - */ -struct BadMagic_error : public Journalfile_error { - explicit BadMagic_error(const std::string & filename); - virtual ~BadMagic_error() throw () {} -}; - -/** - * Thrown if the journal file contains a record with an unknown type number - * \todo add offset into journal file - */ -struct BadRecord_error : public Journalfile_error { - explicit BadRecord_error - (const std::string & filename, - const uint8_t code, - const uint8_t expectedcode) - ; - virtual ~BadRecord_error() throw () {} - - std::streamoff offset; - uint8_t code; - uint8_t expectedcode; -}; - -/** - * Thrown if the journal file contains an event record with an unknown - * event type - * \todo add offset into journal file - */ -struct BadEvent_error : public Journalfile_error { - explicit BadEvent_error(const std::string & filename, uint8_t const type) - ; - virtual ~BadEvent_error() throw () {} - - std::streamoff offset; - uint8_t type; -}; - -#endif === modified file 'src/wlapplication.cc' --- src/wlapplication.cc 2014-03-09 10:28:39 +0000 +++ src/wlapplication.cc 2014-03-11 20:33:30 +0000 @@ -48,7 +48,6 @@ #include "io/dedicated_log.h" #include "io/filesystem/disk_filesystem.h" #include "io/filesystem/layered_filesystem.h" -#include "journal.h" #include "log.h" #include "logic/game.h" #include "logic/game_data_error.h" @@ -248,7 +247,6 @@ WLApplication::WLApplication(int const argc, char const * const * const argv) : m_commandline (std::map<std::string, std::string>()), m_game_type (NONE), -journal (nullptr), m_mouse_swapped (false), m_faking_middle_mouse_button(false), m_mouse_position (0, 0), @@ -480,89 +478,54 @@ /** * Get an event from the SDL queue, just like SDL_PollEvent. - * Perform the meat of playback/record stuff when needed. - * - * Throttle is a hack to stop record files from getting extremely huge. - * If it is set to true, we will idle loop if we can't get an SDL_Event - * returned immediately if we're recording. If there is no user input, - * the actual mainloop will be throttled to 100fps. * * \param ev the retrieved event will be put here - * \param throttle Limit recording to 100fps max (not the event loop itself!) * * \return true if an event was returned inside ev, false otherwise - * - * \todo Catch Journalfile_error */ -bool WLApplication::poll_event(SDL_Event & ev, bool const throttle) { +bool WLApplication::poll_event(SDL_Event & ev) { bool haveevent = false; + +//FIXME (REVIEW): Can this be removed now? There was a line saying goto restart +//around the part with lastthrottle. (Though I don't see how it would be called +//when the lastthrottle variable would always be reinitialized there...?) restart: - //inject synthesized events into the event queue when playing back - if (journal->is_playingback()) { - try { - haveevent = journal->read_event(ev); - } catch (const Journalfile_error & e) { - // An error might occur here when playing back a file that - // was not finalized due to a crash etc. - // Since playbacks are intended precisely for debugging such - // crashes, we must ignore the error and continue. - log("JOURNAL: read error, continue without playback: %s\n", e.what()); - journal->stop_playback(); + + haveevent = SDL_PollEvent(&ev); + + if (haveevent) { + // We edit mouse motion events in here, so that + // differences caused by GrabInput or mouse speed + // settings are invisible to the rest of the code + switch (ev.type) { + case SDL_MOUSEMOTION: + ev.motion.xrel += m_mouse_compensate_warp.x; + ev.motion.yrel += m_mouse_compensate_warp.y; + m_mouse_compensate_warp = Point(0, 0); + + if (m_mouse_locked) { + warp_mouse(m_mouse_position); + + ev.motion.x = m_mouse_position.x; + ev.motion.y = m_mouse_position.y; } - } else { - haveevent = SDL_PollEvent(&ev); - - if (haveevent) { - // We edit mouse motion events in here, so that - // differences caused by GrabInput or mouse speed - // settings are invisible to the rest of the code - switch (ev.type) { - case SDL_MOUSEMOTION: - ev.motion.xrel += m_mouse_compensate_warp.x; - ev.motion.yrel += m_mouse_compensate_warp.y; - m_mouse_compensate_warp = Point(0, 0); - - if (m_mouse_locked) { - warp_mouse(m_mouse_position); - - ev.motion.x = m_mouse_position.x; - ev.motion.y = m_mouse_position.y; - } - - break; - case SDL_USEREVENT: - if (ev.user.code == CHANGE_MUSIC) - g_sound_handler.change_music(); - - break; - case SDL_VIDEOEXPOSE: - //log ("SDL Video Window expose event: %i\n", ev.expose.type); - g_gr->update_fullscreen(); - break; - default:; - } + + break; + case SDL_USEREVENT: + if (ev.user.code == CHANGE_MUSIC) + g_sound_handler.change_music(); + + break; + case SDL_VIDEOEXPOSE: + //log ("SDL Video Window expose event: %i\n", ev.expose.type); + g_gr->update_fullscreen(); + break; + default:; } } - // log all events into the journal file - if (journal->is_recording()) { - if (haveevent) - journal->record_event(ev); - else if (throttle && journal->is_playingback()) { - // Implement the throttle to avoid very quick inner mainloops when - // recoding a session - static int32_t lastthrottle = 0; - int32_t const time = SDL_GetTicks(); - - if (time - lastthrottle < 10) - goto restart; - - lastthrottle = time; - } - - journal->set_idle_mark(); - } else if (haveevent) { + if (haveevent) { // Eliminate any unhandled events to make sure that record and playback // are _really_ the same. Yes I know, it's overly paranoid but hey... switch (ev.type) { @@ -587,7 +550,6 @@ */ void WLApplication::handle_input(InputCallback const * cb) { - bool gotevents = false; SDL_Event ev; // Valgrind says: // Conditional jump or move depends on uninitialised value(s) // at 0x407EEDA: (within /usr/lib/libSDL-1.2.so.0.11.0) @@ -602,36 +564,11 @@ // by 0x81427A6: main (main.cc:39) // We need to empty the SDL message queue always, even in playback mode - // In playback mode, only F10 for premature exiting works - if (journal->is_playingback()) { - while (SDL_PollEvent(&ev)) { - switch (ev.type) { - case SDL_KEYDOWN: - // get out of here quickly, overriding playback; - // since this is the only key event that works, we don't guard - // it by requiring Ctrl to be pressed. - if (ev.key.keysym.sym == SDLK_F10) - m_should_die = true; - break; - case SDL_QUIT: - m_should_die = true; - break; - default:; - } - } - } + // FIXME (REVIEW): Note the even in playback mode part. Is this still needed? + // And what about the stacktrace above? // Usual event queue - while (poll_event(ev, !gotevents)) { - - gotevents = true; - - // CAREFUL: Record files do not save the entire SDL_Event structure. - // Therefore, playbacks are incomplete. When you change the following - // code so that it uses previously unused fields in SDL_Event, - // please also take a look at Journal::read_event and - // Journal::record_event - + while (poll_event(ev)) { switch (ev.type) { case SDL_KEYDOWN: case SDL_KEYUP: @@ -747,9 +684,6 @@ int32_t WLApplication::get_time() { uint32_t time = SDL_GetTicks(); - // might change the time when playing back! - journal->timestamp_handler(time); - return time; } @@ -758,20 +692,18 @@ /// SDL_WarpMouse() *will* create a mousemotion event, which we do not want. As /// a workaround, we store the delta in m_mouse_compensate_warp and use that to /// eliminate the motion event in poll_event() -/// \todo Should this method have to care about playback at all??? +//FIXME (REVIEW): should more of this docstring be updated? /// /// \param position The new mouse position void WLApplication::warp_mouse(const Point position) { m_mouse_position = position; - if (not journal->is_playingback()) { // don't warp anything during playback - Point cur_position; - SDL_GetMouseState(&cur_position.x, &cur_position.y); - if (cur_position != position) { - m_mouse_compensate_warp += cur_position - position; - SDL_WarpMouse(position.x, position.y); - } + Point cur_position; + SDL_GetMouseState(&cur_position.x, &cur_position.y); + if (cur_position != position) { + m_mouse_compensate_warp += cur_position - position; + SDL_WarpMouse(position.x, position.y); } } @@ -786,9 +718,6 @@ */ void WLApplication::set_input_grab(bool grab) { - if (journal->is_playingback()) - return; // ignore in playback mode - if (grab) { SDL_WM_GrabInput(SDL_GRAB_ON); } else { @@ -842,10 +771,6 @@ */ bool WLApplication::init_settings() { - //create a journal so that handle_commandline_parameters can open the - //journal files - journal = new Journal(); - //read in the configuration file g_options.read("config", "global"); Section & s = g_options.pull_section("global"); @@ -927,10 +852,6 @@ } catch (...) { log("WARNING: could not save configuration"); } - - assert(journal); - delete journal; - journal = nullptr; } /** @@ -1280,34 +1201,6 @@ m_commandline.erase("script"); } - // TODO(sirver): this framework has not been useful in a long time. Kill it. - if (m_commandline.count("record")) { - if (m_commandline["record"].empty()) - throw Parameter_error("ERROR: --record needs a filename!"); - - try { - journal->start_recording(m_commandline["record"]); - } catch (Journalfile_error & e) { - wout << "Journal file error: " << e.what() << endl; - } - - m_commandline.erase("record"); - } - - if (m_commandline.count("playback")) { - if (m_commandline["playback"].empty()) - throw Parameter_error("ERROR: --playback needs a filename!"); - - try { - journal->start_playback(m_commandline["playback"]); - } - catch (Journalfile_error & e) { - wout << "Journal file error: " << e.what() << endl; - } - - m_commandline.erase("playback"); - } - //If it hasn't been handled yet it's probably an attempt to //override a conffile setting //With typos, this will create invalid config settings. They @@ -1351,9 +1244,7 @@ #ifdef __linux__ << _(" Default is ~/.widelands") << "\n" #endif - << _(" --record=FILENAME Record all events to the given filename for\n" - " later playback") << "\n" - << _(" --playback=FILENAME Playback given filename (see --record)") << "\n\n" + << "\n" << _(" --coredump=[yes|no] Generates a core dump on segfaults instead\n" " of using the SDL") << "\n" << _(" --language=[de_DE|sv_SE|...]\n" === modified file 'src/wlapplication.h' --- src/wlapplication.h 2014-02-22 18:04:02 +0000 +++ src/wlapplication.h 2014-03-11 20:33:30 +0000 @@ -38,7 +38,6 @@ namespace Widelands {class Game;} -struct Journal; ///Thrown if a commandline parameter is faulty struct Parameter_error : public std::runtime_error { @@ -233,7 +232,7 @@ protected: WLApplication(int argc, char const * const * argv); - bool poll_event(SDL_Event &, bool throttle); + bool poll_event(SDL_Event &); bool init_settings(); void init_language(); @@ -271,8 +270,6 @@ std::string m_logfile; GameType m_game_type; - ///the event recorder object - Journal * journal; ///True if left and right mouse button should be swapped bool m_mouse_swapped;
_______________________________________________ Mailing list: https://launchpad.net/~widelands-dev Post to : [email protected] Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp

