aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am1
-rw-r--r--src/calcurse.c14
-rw-r--r--src/calcurse.h7
-rw-r--r--src/queue.c90
4 files changed, 112 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index df6a1ae..9f42ad9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -29,6 +29,7 @@ calcurse_SOURCES = \
note.c \
notify.c \
pcal.c \
+ queue.c \
recur.c \
sha1.c \
sigs.c \
diff --git a/src/calcurse.c b/src/calcurse.c
index 0f6b69a..1b46577 100644
--- a/src/calcurse.c
+++ b/src/calcurse.c
@@ -619,6 +619,9 @@ int main(int argc, char **argv)
io_set_lock();
}
+ /* System message queue. */
+ que_init();
+
/* Begin of interactive mode with ncurses interface. */
sigs_init(); /* signal handling init */
initscr(); /* start the curses mode */
@@ -702,6 +705,14 @@ int main(int argc, char **argv)
for (;;) {
int key;
+ while (que_ued()) {
+ que_show();
+ que_save();
+ do_storage(0);
+ wins_update(FLAG_ALL);
+ que_rem();
+ }
+
if (resize) {
resize = 0;
wins_reset();
@@ -712,7 +723,10 @@ int main(int argc, char **argv)
key_generic_reload();
}
+ /* Check input loop once every minute. */
+ wtimeout(win[KEY].p, 60000);
key = keys_get(win[KEY].p, &count, &reg);
+ wtimeout(win[KEY].p, -1);
switch (key) {
HANDLE_KEY(KEY_GENERIC_CHANGE_VIEW, key_generic_change_view);
HANDLE_KEY(KEY_GENERIC_OTHER_CMD, key_generic_other_cmd);
diff --git a/src/calcurse.h b/src/calcurse.h
index 27337fd..be2199a 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -1287,4 +1287,11 @@ void wins_erase_status_bar(void);
void wins_other_status_page();
void wins_reset_status_page(void);
+/* queue.c */
+void que_init(void);
+int que_ued(void);
+struct event *que_ins(char *, time_t, int);
+void que_rem(void);
+void que_show(void);
+void que_save(void);
#endif /* CALCURSE_H */
diff --git a/src/queue.c b/src/queue.c
new file mode 100644
index 0000000..939b502
--- /dev/null
+++ b/src/queue.c
@@ -0,0 +1,90 @@
+#include "calcurse.h"
+
+/*
+ * A queue for calcurse system messages.
+ */
+llist_t sysqueue;
+
+void que_init(void)
+{
+ LLIST_INIT(&sysqueue);
+}
+
+/*
+ * Test for queued system events.
+ */
+int que_ued(void)
+{
+ return sysqueue.head ? 1 : 0;
+}
+
+/*
+ * Insert a system event at the tail of the queue.
+ */
+struct event *que_ins(char *mesg, time_t time, int id)
+{
+ struct event *ev;
+
+ ev = mem_malloc(sizeof(struct event));
+ ev->mesg = mem_strdup(mesg);
+ ev->day = time;
+ ev->id = id;
+ ev->note = NULL;
+ LLIST_ADD(&sysqueue, ev);
+
+ return ev;
+}
+
+/*
+ * Get the system event at the head of the queue.
+ */
+struct event *que_get(void)
+{
+ return sysqueue.head ? sysqueue.head->data : NULL;
+}
+
+/*
+ * Remove the system event at the head of the queue.
+ */
+void que_rem(void)
+{
+ struct event *ev;
+
+ if (!sysqueue.head)
+ return;
+ else
+ ev = sysqueue.head->data;
+ mem_free(ev->mesg);
+ mem_free(ev);
+ LLIST_REMOVE(&sysqueue, sysqueue.head);
+}
+
+/*
+ * Display the system event at the head of the queue in a popup window.
+ */
+void que_show(void)
+{
+ struct event *ev;
+ char *date;
+
+ if (!que_ued())
+ return;
+ ev = que_get();
+ date = date_sec2date_str(ev->day, "%F %T");
+ item_in_popup(date, "", ev->mesg, _("System event"));
+ mem_free(date);
+}
+
+/*
+ * Save the system event at the head of the queue as an appointment.
+ */
+void que_save(void)
+{
+ struct event *ev;
+
+ if (!que_ued())
+ return;
+ ev = que_get();
+ apoint_new(ev->mesg, NULL, ev->day, 0, APOINT_NULL);
+ io_set_modified();
+}