diff options
Diffstat (limited to 'src/todo.c')
-rw-r--r-- | src/todo.c | 130 |
1 files changed, 78 insertions, 52 deletions
@@ -61,29 +61,29 @@ todo_hilt_set (int highlighted) } void -todo_hilt_decrease (void) +todo_hilt_decrease (int n) { - hilt--; + hilt -= n; } void -todo_hilt_increase (void) +todo_hilt_increase (int n) { - hilt++; + hilt += n; } /* Return which todo is highlighted. */ int todo_hilt (void) { - return (hilt); + return hilt; } /* Return the number of todos. */ int todo_nb (void) { - return (todos); + return todos; } /* Set the number of todos. */ @@ -101,15 +101,15 @@ todo_set_first (int nb) } void -todo_first_increase (void) +todo_first_increase (int n) { - first++; + first += n; } void -todo_first_decrease (void) +todo_first_decrease (int n) { - first--; + first -= n; } /* @@ -119,14 +119,14 @@ todo_first_decrease (void) int todo_hilt_pos (void) { - return (hilt - first); + return hilt - first; } /* Return the last visited todo. */ char * todo_saved_mesg (void) { - return (msgsav); + return msgsav; } /* Request user to enter a new todo item. */ @@ -162,7 +162,7 @@ todo_cmp_id (struct todo *a, struct todo *b) int abs_a = abs (a->id); int abs_b = abs (b->id); - return (abs_a < abs_b ? -1 : (abs_a == abs_b ? 0 : 1)); + return abs_a < abs_b ? -1 : (abs_a == abs_b ? 0 : 1); } /* @@ -183,6 +183,15 @@ todo_add (char *mesg, int id, char *note) return todo; } +void +todo_write (struct todo *todo, FILE *f) +{ + if (todo->note) + fprintf (f, "[%d]>%s %s\n", todo->id, todo->note, todo->mesg); + else + fprintf (f, "[%d] %s\n", todo->id, todo->mesg); +} + /* Delete a note previously attached to a todo item. */ static void todo_delete_note_bynum (unsigned num) @@ -195,12 +204,12 @@ todo_delete_note_bynum (unsigned num) if (!todo->note) EXIT (_("no note attached")); - erase_note (&todo->note, ERASE_FORCE_ONLY_NOTE); + erase_note (&todo->note); } /* Delete an item from the todo linked list. */ static void -todo_delete_bynum (unsigned num, enum eraseflg flag) +todo_delete_bynum (unsigned num) { llist_item_t *i = LLIST_NTH (&todolist, num); @@ -210,7 +219,7 @@ todo_delete_bynum (unsigned num, enum eraseflg flag) LLIST_REMOVE (&todolist, i); mem_free (todo->mesg); - erase_note (&todo->note, flag); + erase_note (&todo->note); mem_free (todo); } @@ -279,7 +288,7 @@ todo_delete (struct conf *conf) switch (answer) { case 't': - todo_delete_bynum (hilt - 1, ERASE_FORCE); + todo_delete_bynum (hilt - 1); todos--; if (hilt > 1) hilt--; @@ -325,14 +334,14 @@ todo_chg_priority (int action) struct todo *backup; char backup_mesg[BUFSIZ]; int backup_id; - char backup_note[NOTESIZ + 1]; + char backup_note[MAX_NOTESIZ + 1]; int do_chg = 1; backup = todo_get_item (hilt); - (void)strncpy (backup_mesg, backup->mesg, strlen (backup->mesg) + 1); + strncpy (backup_mesg, backup->mesg, strlen (backup->mesg) + 1); backup_id = backup->id; if (backup->note) - (void)strncpy (backup_note, backup->note, NOTESIZ + 1); + strncpy (backup_note, backup->note, MAX_NOTESIZ + 1); else backup_note[0] = '\0'; switch (action) @@ -349,7 +358,7 @@ todo_chg_priority (int action) } if (do_chg) { - todo_delete_bynum (hilt - 1, ERASE_FORCE_KEEP_NOTE); + todo_delete_bynum (hilt - 1); backup = todo_add (backup_mesg, backup_id, backup_note); hilt = todo_get_position (backup); } @@ -369,28 +378,37 @@ todo_edit_item (void) /* Display todo items in the corresponding panel. */ static void -display_todo_item (int incolor, char *msg, int prio, int note, int len, int y, +display_todo_item (int incolor, char *msg, int prio, int note, int width, int y, int x) { WINDOW *w; int ch_note; - char buf[len], priostr[2]; + char buf[width * UTF8_MAXLEN], priostr[2]; + int i; w = win[TOD].p; ch_note = (note) ? '>' : '.'; if (prio > 0) snprintf (priostr, sizeof priostr, "%d", prio); else - snprintf (priostr, sizeof priostr, "X"); + strncpy (priostr, "X", sizeof priostr); if (incolor == 0) custom_apply_attr (w, ATTR_HIGHEST); - if (strlen (msg) < len) + if (utf8_strwidth (msg) < width) mvwprintw (w, y, x, "%s%c %s", priostr, ch_note, msg); else { - (void)strncpy (buf, msg, len - 1); - buf[len - 1] = '\0'; + for (i = 0; msg[i] && width > 0; i++) + { + if (!UTF8_ISCONT (msg[i])) + width -= utf8_width (&msg[i]); + buf[i] = msg[i]; + } + if (i) + buf[i - 1] = 0; + else + buf[0] = 0; mvwprintw (w, y, x, "%s%c %s...", priostr, ch_note, buf); } if (incolor == 0) @@ -419,7 +437,7 @@ todo_update_panel (int which_pan) struct todo *todo = LLIST_TS_GET_DATA (i); num_todo++; t_realpos = num_todo - first; - incolor = num_todo - hilt; + incolor = (which_pan == TOD) ? num_todo - hilt : num_todo; if (incolor == 0) msgsav = todo->mesg; if (t_realpos >= 0 && t_realpos < max_items) @@ -453,44 +471,52 @@ todo_update_panel (int which_pan) void todo_edit_note (char *editor) { - struct todo *i; - char fullname[BUFSIZ]; - char *filename; - - i = todo_get_item (hilt); - if (i->note == NULL) - { - if ((filename = new_tempfile (path_notes, NOTESIZ)) != NULL) - i->note = filename; - else - return; - } - (void)snprintf (fullname, BUFSIZ, "%s%s", path_notes, i->note); - wins_launch_external (fullname, editor); - - if (io_file_is_empty (fullname) > 0) - erase_note (&i->note, ERASE_FORCE); + struct todo *i = todo_get_item (hilt); + edit_note (&i->note, editor); } /* View a note previously attached to a todo */ void todo_view_note (char *pager) { - struct todo *i; - char fullname[BUFSIZ]; + struct todo *i = todo_get_item (hilt); + view_note (i->note, pager); +} - i = todo_get_item (hilt); - if (i->note == NULL) +/* Pipe a todo item to an external program. */ +void +todo_pipe_item (void) +{ + char cmd[BUFSIZ] = ""; + int pout; + int pid; + FILE *fpout; + struct todo *todo; + + status_mesg (_("Pipe item to external command:"), ""); + if (getstring (win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID) return; - (void)snprintf (fullname, BUFSIZ, "%s%s", path_notes, i->note); - wins_launch_external (fullname, pager); + + wins_prepare_external (); + if ((pid = shell_exec (NULL, &pout, cmd))) + { + fpout = fdopen (pout, "w"); + + todo = todo_get_item (hilt); + todo_write (todo, fpout); + + fclose (fpout); + child_wait (NULL, &pout, pid); + press_any_key (); + } + wins_unprepare_external (); } void todo_free (struct todo *todo) { mem_free (todo->mesg); - erase_note (&todo->note, ERASE_FORCE_KEEP_NOTE); + erase_note (&todo->note); mem_free (todo); } |