@@ -566,6 +566,14 @@ Mixer::command_new ( const char *path, const char *display_name ) | |||||
void | void | ||||
Mixer::command_quit ( void ) | Mixer::command_quit ( void ) | ||||
{ | { | ||||
if ( Loggable::dirty() ) | |||||
{ | |||||
int i = fl_choice( "There have been changes since the last save. Quitting now will discard them", "Discard", "Cancel", NULL ); | |||||
if ( i != 0 ) | |||||
return; | |||||
} | |||||
quit(); | quit(); | ||||
} | } | ||||
@@ -172,8 +172,11 @@ Project::save ( void ) | |||||
// tle->save_timeline_settings(); | // tle->save_timeline_settings(); | ||||
return mixer->save(); | |||||
int r = mixer->save(); | |||||
Loggable::clear_dirty(); | |||||
return r; | |||||
// return Loggable::save_unjournaled_state(); | // return Loggable::save_unjournaled_state(); | ||||
} | } | ||||
@@ -279,7 +282,7 @@ Project::open ( const char *name ) | |||||
// timeline->zoom_fit(); | // timeline->zoom_fit(); | ||||
Loggable::clear_dirty(); | |||||
MESSAGE( "Loaded project \"%s\"", name ); | MESSAGE( "Loaded project \"%s\"", name ); | ||||
@@ -45,7 +45,7 @@ using std::max; | |||||
FILE *Loggable::_fp; | FILE *Loggable::_fp; | ||||
unsigned int Loggable::_log_id = 0; | unsigned int Loggable::_log_id = 0; | ||||
int Loggable::_level = 0; | int Loggable::_level = 0; | ||||
int Loggable::_dirty = 0; | |||||
off_t Loggable::_undo_offset = 0; | off_t Loggable::_undo_offset = 0; | ||||
std::map <unsigned int, Loggable::log_pair > Loggable::_loggables; | std::map <unsigned int, Loggable::log_pair > Loggable::_loggables; | ||||
@@ -686,6 +686,8 @@ Loggable::log_end ( void ) | |||||
log( "%s 0x%X set ", class_name(), _id ); | log( "%s 0x%X set ", class_name(), _id ); | ||||
log_print( _old_state, new_state ); | log_print( _old_state, new_state ); | ||||
++_dirty; | |||||
} | } | ||||
delete new_state; | delete new_state; | ||||
@@ -703,6 +705,8 @@ Loggable::log_end ( void ) | |||||
void | void | ||||
Loggable::log_create ( void ) const | Loggable::log_create ( void ) const | ||||
{ | { | ||||
++_dirty; | |||||
if ( ! _fp ) | if ( ! _fp ) | ||||
/* replaying, don't bother */ | /* replaying, don't bother */ | ||||
return; | return; | ||||
@@ -753,6 +757,8 @@ Loggable::log_destroy ( void ) const | |||||
/* the unjournaled state may have changed: make a note of it. */ | /* the unjournaled state may have changed: make a note of it. */ | ||||
record_unjournaled(); | record_unjournaled(); | ||||
++_dirty; | |||||
if ( ! _fp ) | if ( ! _fp ) | ||||
/* tearing down... don't bother */ | /* tearing down... don't bother */ | ||||
return; | return; | ||||
@@ -95,6 +95,8 @@ private: | |||||
int _nest; | int _nest; | ||||
static int _dirty; /* count of changes */ | |||||
static void ensure_size ( size_t n ); | static void ensure_size ( size_t n ); | ||||
void log_print ( const Log_Entry *o, const Log_Entry *n ) const; | void log_print ( const Log_Entry *o, const Log_Entry *n ) const; | ||||
@@ -183,6 +185,9 @@ public: | |||||
static bool do_this ( const char *s, bool reverse ); | static bool do_this ( const char *s, bool reverse ); | ||||
static int dirty ( void ) { return _dirty; } | |||||
static void clear_dirty ( void ) { _dirty = 0; } | |||||
void log_create ( void ) const; | void log_create ( void ) const; | ||||
protected: | protected: | ||||