aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/interface-gtk/interface.c
diff options
context:
space:
mode:
authorRobin Haberkorn <rhaberkorn@fmsbw.de>2025-12-17 01:17:11 +0100
committerRobin Haberkorn <rhaberkorn@fmsbw.de>2025-12-17 01:17:11 +0100
commitdeed71ac895451041359d7b18e58eca0a0972bc3 (patch)
tree2cce2c266b2f92fca45335c95f0a4b8f4945d31e /src/interface-gtk/interface.c
parentad0780c7163c9673f89dc584d2a6096f317bec2b (diff)
implemented backup file mechanism
* The backup mechanism is supposed to guard against crashes of SciTECO and unexpected program terminations (e.g. power cycling, etc.) * In a given interval (no matter whether busy or idlying on the prompt) SciTECO saves all modified buffers with the filename~ (like most other editors). As an optimization files are not backed up if they have been backed up previously to avoid pointless and possibly slow file system writes. * While the backup mechanism exists outside of the usual undo-paradigm - backup file creating is not bound to character input and it makes no sense to restore the exact state of backup files - there are some interesting interactions: * When a buffer is dirtyfied or saved that was previously backed up, it must always be reset to the DIRTY state on rubout, so backups are eventually recreated. * When a buffer is dirtyfied first (was clean), the backup file must be removed on rubout as well - we don't expect backup files for clean buffers. * There is currently no automatic way to restore backup files. This could potentially be done by opener.tes and session.tes in the future, although you couldn't currently always get meaningful user feedback (whether he wants to restore the file). Perhaps we should at least log a message when detecting backup files that are newer than the file that is being opened.
Diffstat (limited to 'src/interface-gtk/interface.c')
-rw-r--r--src/interface-gtk/interface.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/interface-gtk/interface.c b/src/interface-gtk/interface.c
index 7aa9797..0eec55e 100644
--- a/src/interface-gtk/interface.c
+++ b/src/interface-gtk/interface.c
@@ -60,6 +60,7 @@
//#define DEBUG
static gboolean teco_interface_busy_timeout_cb(gpointer user_data);
+static gboolean teco_interface_backup_cb(gpointer user_data);
static void teco_interface_event_box_realized_cb(GtkWidget *widget, gpointer user_data);
static void teco_interface_cmdline_size_allocate_cb(GtkWidget *widget,
GdkRectangle *allocation,
@@ -573,8 +574,8 @@ teco_interface_info_update_buffer(const teco_buffer_t *buffer)
teco_string_clear(&teco_interface.info_current);
teco_string_init(&teco_interface.info_current, filename, strlen(filename));
- teco_interface.info_type = buffer->dirty ? TECO_INFO_TYPE_BUFFER_DIRTY
- : TECO_INFO_TYPE_BUFFER;
+ teco_interface.info_type = buffer->state > TECO_BUFFER_CLEAN
+ ? TECO_INFO_TYPE_BUFFER_DIRTY : TECO_INFO_TYPE_BUFFER;
}
static GdkAtom
@@ -1220,6 +1221,10 @@ teco_interface_event_loop(GError **error)
g_unix_signal_add(SIGTERM, teco_interface_sigterm_handler, NULL);
#endif
+ /* the interval might have been changed in the profile */
+ g_timeout_add_seconds(teco_ring_backup_interval,
+ teco_interface_backup_cb, NULL);
+
/* don't limit while waiting for input as this might be a busy operation */
teco_memory_stop_limiting();
@@ -1278,6 +1283,20 @@ teco_interface_busy_timeout_cb(gpointer user_data)
return G_SOURCE_REMOVE;
}
+static gboolean
+teco_interface_backup_cb(gpointer user_data)
+{
+ teco_ring_backup();
+
+ /*
+ * The backup interval could have changed (6EJ).
+ * New intervals will not be effective immediately, though.
+ */
+ g_timeout_add_seconds(teco_ring_backup_interval,
+ teco_interface_backup_cb, NULL);
+ return G_SOURCE_REMOVE;
+}
+
static void
teco_interface_event_box_realized_cb(GtkWidget *widget, gpointer user_data)
{