summaryrefslogtreecommitdiff
path: root/src/event.c
diff options
context:
space:
mode:
authorFrederic Culot <calcurse@culot.org>2009-01-01 17:50:41 +0000
committerFrederic Culot <calcurse@culot.org>2009-01-01 17:50:41 +0000
commitcac30a7e1469a8f061f64712dbea100a012dd788 (patch)
tree0e38d019b5071df73555b541ec2ce8e84fa2b9c5 /src/event.c
parent8fdd1510c68644184c3df9ba002092a41364b482 (diff)
downloadcalcurse-cac30a7e1469a8f061f64712dbea100a012dd788.zip
cut/paste feature aded
fixed a 2-years old bug that made repeated items with exceptions to load uncorrectly in some cases (thanks Jan for reporting it)
Diffstat (limited to 'src/event.c')
-rwxr-xr-xsrc/event.c82
1 files changed, 73 insertions, 9 deletions
diff --git a/src/event.c b/src/event.c
index f366b6d..7bc6aeb 100755
--- a/src/event.c
+++ b/src/event.c
@@ -1,8 +1,8 @@
-/* $calcurse: event.c,v 1.9 2008/12/28 13:13:59 culot Exp $ */
+/* $calcurse: event.c,v 1.10 2009/01/01 17:50:41 culot Exp $ */
/*
* Calcurse - text-based organizer
- * Copyright (c) 2004-2008 Frederic Culot
+ * Copyright (c) 2004-2009 Frederic Culot
*
* 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
@@ -34,7 +34,52 @@
#include "mem.h"
#include "event.h"
-struct event_s *eventlist;
+struct event_s *eventlist;
+static struct event_s bkp_cut_event;
+
+void
+event_free_bkp (void)
+{
+ if (bkp_cut_event.mesg)
+ {
+ mem_free (bkp_cut_event.mesg);
+ bkp_cut_event.mesg = 0;
+ }
+ if (bkp_cut_event.note)
+ {
+ mem_free (bkp_cut_event.note);
+ bkp_cut_event.note = 0;
+ }
+}
+
+static void
+event_dup (struct event_s *in, struct event_s *bkp)
+{
+ EXIT_IF (!in || !bkp, _("null pointer"));
+
+ bkp->id = in->id;
+ bkp->day = in->day;
+ bkp->mesg = mem_strdup (in->mesg);
+ if (in->note)
+ bkp->note = mem_strdup (in->note);
+}
+
+void
+event_llist_free (void)
+{
+ struct event_s *o, **i;
+
+ i = &eventlist;
+ for (o = eventlist; o; o = o->next)
+ {
+ *i = o->next;
+ mem_free (o->mesg);
+ if (o->note)
+ mem_free (o->note);
+ mem_free (o);
+ i = &(*i)->next;
+ }
+}
/* Create a new event */
struct event_s *
@@ -154,15 +199,25 @@ event_delete_bynum (long start, unsigned num, erase_flag_e flag)
{
if (n == num)
{
- if (flag == ERASE_FORCE_ONLY_NOTE)
- erase_note (&i->note, flag);
- else
- {
+ switch (flag)
+ {
+ case ERASE_FORCE_ONLY_NOTE:
+ erase_note (&i->note, flag);
+ break;
+ case ERASE_CUT:
+ event_free_bkp ();
+ event_dup (i, &bkp_cut_event);
+ if (i->note)
+ mem_free (i->note);
+ /* FALLTHROUGH */
+ default:
*iptr = i->next;
mem_free (i->mesg);
- erase_note (&i->note, flag);
+ if (flag != ERASE_FORCE_KEEP_NOTE && flag != ERASE_CUT)
+ erase_note (&i->note, flag);
mem_free (i);
- }
+ break;
+ }
return;
}
n++;
@@ -172,3 +227,12 @@ event_delete_bynum (long start, unsigned num, erase_flag_e flag)
EXIT (_("event not found"));
/* NOTREACHED */
}
+
+void
+event_paste_item (void)
+{
+ (void)event_new (bkp_cut_event.mesg, bkp_cut_event.note,
+ date2sec (*calendar_get_slctd_day (), 12, 0),
+ bkp_cut_event.id);
+ event_free_bkp ();
+}