1 /*
2  * Calcurse - text-based organizer
3  *
4  * Copyright (c) 2004-2020 calcurse Development Team <misc@calcurse.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  *      - Redistributions of source code must retain the above
12  *        copyright notice, this list of conditions and the
13  *        following disclaimer.
14  *
15  *      - Redistributions in binary form must reproduce the above
16  *        copyright notice, this list of conditions and the
17  *        following disclaimer in the documentation and/or other
18  *        materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * Send your feedback or comments to : misc@calcurse.org
33  * Calcurse home page : http://calcurse.org
34  *
35  */
36 
37 #ifndef CALCURSE_H
38 #define CALCURSE_H
39 
40 #include "config.h"
41 
42 #ifdef HAVE_NCURSES_H
43 #include <ncurses.h>
44 #elif defined HAVE_NCURSES_NCURSES_H
45 #include <ncurses/ncurses.h>
46 #elif defined HAVE_NCURSESW_NCURSES_H
47 #include <ncursesw/ncurses.h>
48 #else
49 #error "Missing ncurses header. Aborting..."
50 #endif
51 
52 #include <pthread.h>
53 #include <time.h>
54 #include <stdlib.h>
55 #include <stdio.h>
56 #include <regex.h>
57 
58 #include "llist.h"
59 #include "vector.h"
60 #include "htable.h"
61 #include "llist_ts.h"
62 
63 /* Internationalization. */
64 #if ENABLE_NLS
65 #include <locale.h>
66 #include <libintl.h>
67 #undef _
68 #define _(String) gettext(String)
69 #ifdef gettext_noop
70 #define N_(String) gettext_noop(String)
71 #else
72 #define N_(String) (String)
73 #endif
74 #else /* NLS disabled */
75 #define _(String) (String)
76 #define N_(String) (String)
77 #define textdomain(String) (String)
78 #define gettext(String) (String)
79 #define dgettext(String) (String)
80 #define dcgettext(String) (String)
81 #define ngettext(String1,String2,n) ((n) == 1 ? (String1) : (String2))
82 #define bindtextdomain(String) (String)
83 #define bind_textdomain_codeset(Domain,Codeset) (Codeset)
84 #endif /* ENABLE_NLS */
85 
86 /* Paths configuration. */
87 #define DIR_NAME         "calcurse/"
88 #define DIR_NAME_LEGACY  ".calcurse/"
89 #define TODO_PATH_NAME   "todo"
90 #define APTS_PATH_NAME   "apts"
91 #define CONF_PATH_NAME   "conf"
92 #define KEYS_PATH_NAME   "keys"
93 #define CPID_PATH_NAME   ".calcurse.pid"
94 #define DPID_PATH_NAME   ".daemon.pid"
95 #define DLOG_PATH_NAME   "daemon.log"
96 #define NOTES_DIR_NAME   "notes/"
97 #define HOOKS_DIR_NAME   "hooks/"
98 
99 #define DEFAULT_EDITOR     "vi"
100 #define DEFAULT_PAGER      "less"
101 #define DEFAULT_MERGETOOL  "vimdiff"
102 
103 #define ATTR_FALSE    0
104 #define ATTR_TRUE     1
105 #define ATTR_LOWEST   2
106 #define ATTR_LOW      3
107 #define ATTR_MIDDLE   4
108 #define ATTR_HIGH     5
109 #define ATTR_HIGHEST  6
110 
111 #define STATUSHEIGHT  2
112 #define MAX_NOTESIZ   40
113 
114 /* Format for appointment hours is: HH:MM */
115 #define HRMIN_SIZE 6
116 
117 /* Maximum number of colors available. */
118 #define NBUSERCOLORS  6
119 
120 /* Side bar width acceptable boundaries. */
121 #define SBARMINWIDTH     34
122 #define SBARMAXWIDTHPERC 50
123 
124 /* Related to date manipulation. */
125 #define YEARINMONTHS    12
126 #define YEARINDAYS      365
127 #define TM_YEAR_BASE    1900
128 
129 #define WEEKINDAYS      7
130 #define DAYINHOURS      24
131 #define HOURINMIN       60
132 #define MININSEC        60
133 
134 #define WEEKINHOURS     (WEEKINDAYS * DAYINHOURS)
135 #define WEEKINMIN       (WEEKINHOURS * HOURINMIN)
136 #define WEEKINSEC       (WEEKINMIN * MININSEC)
137 #define DAYINMIN        (DAYINHOURS * HOURINMIN)
138 /*
139  * Note the difference between the number of seconds in a day and daylength
140  * in seconds. The two may differ when DST is in effect (daylength is either
141  * 23, 24 or 25 hours. The argument "date" is assumed to be of type time_t.
142  */
143 #define DAYINSEC        (DAYINMIN * MININSEC)
144 #define NEXTDAY(date)	date_sec_change((date), 0, 1)
145 #define PREVDAY(date)	date_sec_change((date), 0, -1)
146 #define DAYLEN(date)	(NEXTDAY(date) - (date))
147 #define ENDOFDAY(date)	(NEXTDAY(date) - 1)
148 #define HOURINSEC       (HOURINMIN * MININSEC)
149 #define DAY(date)	(update_time_in_date(date, 0, 0))
150 
151 /* Calendar window. */
152 #define CALHEIGHT       8
153 /*
154  * Week day numbering (0, 1,..., 6) which depends on the first day of the week.
155  * The argument (d) is the "Sunday"-numbering of member tm_wday in struct tm.
156  */
157 #define WDAY(d) \
158     (ui_calendar_week_begins_on_monday() ? ((d ? d : WEEKINDAYS) - 1) : d)
159 
160 /* Key definitions. */
161 #define CTRLVAL         0x1F
162 #define CTRL(x)         ((x) & CTRLVAL)
163 #define ESCAPE          27
164 #define TAB             9
165 #define RETURN          10
166 #define SPACE           32
167 
168 #define KEYS_KEYLEN         3	/* length of each keybinding */
169 #define KEYS_LABELEN        8	/* length of command description */
170 #define KEYS_CMDS_PER_LINE  6	/* max number of commands per line */
171 
172 /*
173  * Register definitions, see ui_day.c.
174  * Index 0-35 is used for '0'-'9' and 'a'-'z', see keys_get().
175  */
176 #define REG_BLACK_HOLE 36
177 
178 /* Size of the hash table the note garbage collector uses. */
179 #define NOTE_GC_HSIZE 1024
180 
181 /* Mnemonics */
182 #define NOHILT		0 	/* 'No highlight' argument */
183 #define NOFORCE		0
184 #define FORCE		1
185 #define DUMMY		-1	/* The dummy event */
186 
187 #define ERROR_MSG(...) do {                                                   \
188   char msg[BUFSIZ];                                                           \
189   int len;                                                                    \
190                                                                               \
191   len = snprintf (msg, BUFSIZ, "%s: %d: ", __FILE__, __LINE__);               \
192   snprintf (msg + len, BUFSIZ - len, __VA_ARGS__);                            \
193   if (ui_mode == UI_CURSES)                                                   \
194     fatalbox (msg);                                                           \
195   else                                                                        \
196     fprintf (stderr, "%s\n", msg);                                            \
197 } while (0)
198 
199 #define WARN_MSG(...) do {                                                    \
200   char msg[BUFSIZ];                                                           \
201                                                                               \
202   snprintf (msg, BUFSIZ, __VA_ARGS__);                                        \
203   if (ui_mode == UI_CURSES)                                                   \
204     warnbox (msg);                                                            \
205   else                                                                        \
206     fprintf (stderr, "%s\n", msg);                                            \
207 } while (0)
208 
209 #define EXIT(...) do {                                                        \
210   ERROR_MSG(__VA_ARGS__);                                                     \
211   if (ui_mode == UI_CURSES)                                                   \
212     exit_calcurse (EXIT_FAILURE);                                             \
213   else                                                                        \
214     exit (EXIT_FAILURE);                                                      \
215 } while (0)
216 
217 #define EXIT_IF(cond, ...) do {                                               \
218   if ((cond))                                                                 \
219     EXIT(__VA_ARGS__);                                                        \
220 } while (0)
221 
222 #define RETURN_IF(cond, ...) do {                                             \
223   if ((cond))                                                                 \
224     {                                                                         \
225       ERROR_MSG(__VA_ARGS__);                                                 \
226       return;                                                                 \
227     }                                                                         \
228 } while (0)
229 
230 #define RETVAL_IF(cond, val, ...) do {                                        \
231   if ((cond))                                                                 \
232     {                                                                         \
233       ERROR_MSG(__VA_ARGS__);                                                 \
234       return (val);                                                           \
235     }                                                                         \
236 } while (0)
237 
238 #define STRINGIFY(x)  #x
239 #define TOSTRING(x)   STRINGIFY(x)
240 #define __FILE_POS__   __FILE__ ":" TOSTRING(__LINE__)
241 
242 #define UTF8_MAXLEN 4
243 #define UTF8_LENGTH(ch) ((unsigned char)ch >= 0xF0 ? 4 : \
244     ((unsigned char)ch >= 0xE0 ? 3 : \
245     ((unsigned char)ch >= 0xC0 ? 2 : 1)))
246 #define UTF8_ISCONT(ch) ((unsigned char)ch >= 0x80 && \
247     (unsigned char)ch <= 0xBF)
248 
249 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
250 
251 #define MAX(x,y) ((x)>(y)?(x):(y))
252 #define MIN(x,y) ((x)<(y)?(x):(y))
253 
254 enum win {
255 	CAL,
256 	APP,
257 	TOD,
258 	NOT,
259 	STA,
260 	KEY,
261 	NBWINS
262 };
263 
264 enum pos {
265 	LEFT,
266 	CENTER,
267 	RIGHT
268 };
269 
270 /* Available views for the calendar panel. */
271 enum cal_view {
272 	CAL_MONTH_VIEW,
273 	CAL_WEEK_VIEW,
274 	CAL_VIEWS
275 };
276 
277 /* Available views for the todo panel. */
278 enum todo_view {
279 	TODO_SHOW_COMPLETED_VIEW,
280 	TODO_HIDE_COMPLETED_VIEW,
281 	TODO_VIEWS
282 };
283 
284 /* General configuration variables. */
285 struct conf {
286 	enum cal_view cal_view;
287 	enum todo_view todo_view;
288 	unsigned auto_save;
289 	unsigned auto_gc;
290 	unsigned periodic_save;
291 	unsigned systemevents;
292 	unsigned confirm_quit;
293 	unsigned confirm_delete;
294 	enum win default_panel;
295 	unsigned compact_panels;
296 	unsigned multiple_days;
297 	unsigned header_line;
298 	unsigned event_separator;
299 	unsigned day_separator;
300 	unsigned empty_appt_line;
301 	char empty_day[BUFSIZ];
302 	const char *editor;
303 	const char *pager;
304 	const char *mergetool;
305 	char output_datefmt[BUFSIZ];	/* format for displaying date */
306 	int input_datefmt;	/* format for reading date */
307 	enum pos heading_pos; /* left/center/right for heading in appts panel */
308 	char day_heading[BUFSIZ];	/* format for displaying heading in appts panel */
309 };
310 
311 #define EMPTY_DAY_DEFAULT "--"
312 
313 /* Daemon-related configuration. */
314 struct dmon_conf {
315 	unsigned enable;	/* launch daemon automatically when exiting */
316 	unsigned log;		/* log daemon activity */
317 };
318 
319 /* Input date formats. */
320 enum datefmt {
321 	DATEFMT_MMDDYYYY = 1,
322 	DATEFMT_DDMMYYYY,
323 	DATEFMT_YYYYMMDD,
324 	DATEFMT_ISO,
325 	DATEFMT_MAX
326 };
327 
328 #define DATE_FORMATS (DATEFMT_MAX - 1)
329 
330 #define DATEFMT(datefmt) (datefmt == DATEFMT_MMDDYYYY ? "%m/%d/%Y" :          \
331     (datefmt == DATEFMT_DDMMYYYY ? "%d/%m/%Y" :                               \
332     (datefmt == DATEFMT_YYYYMMDD ? "%Y/%m/%d" : "%Y-%m-%d")))
333 
334 #define DATEFMT_DESC(datefmt) (datefmt == DATEFMT_MMDDYYYY ?                  \
335     _("mm/dd/yyyy") : (datefmt == DATEFMT_DDMMYYYY ? _("dd/mm/yyyy") :        \
336     (datefmt == DATEFMT_YYYYMMDD ? _("yyyy/mm/dd") : _("yyyy-mm-dd"))))
337 
338 /* Day heading default format. */
339 #define DAY_HEADING_DEFAULT "%B %e, %Y"
340 
341 /*
342  * Calcurse representation of the date of a day in the calendar.
343  * When time_t is a 32-bit signed integer, the year range is 1902 - 2037.
344  */
345 #define YEAR1902_2037 (sizeof(time_t) == 4)
346 struct date {
347 	unsigned dd;		/* day: 1 - 31 */
348 	unsigned mm;		/* month: 1 - 12 */
349 	unsigned yyyy;		/* year AD */
350 };
351 
352 #define ISLEAP(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
353 
354 /* Appointment definition. */
355 struct apoint {
356 	time_t start;		/* seconds since 1 jan 1970 */
357 	long dur;		/* duration of the appointment in seconds */
358 
359 #define APOINT_NULL      0x0
360 #define APOINT_NOTIFY    0x1	/* Item needs to be notified */
361 #define APOINT_NOTIFIED  0x2	/* Item was already notified */
362 	int state;
363 
364 	char *mesg;
365 	char *note;
366 };
367 
368 /* Event definition. */
369 struct event {
370 	int id;			/* event identifier */
371 	time_t day;		/* seconds since 1 jan 1970 */
372 	char *mesg;
373 	char *note;
374 };
375 
376 /* Todo item definition. */
377 struct todo {
378 	char *mesg;
379 	int id;
380 	int completed;
381 	char *note;
382 };
383 
384 struct excp {
385 	time_t st;		/* beggining of the considered day, in seconds */
386 };
387 
388 enum recur_type {
389 	RECUR_DAILY,
390 	RECUR_WEEKLY,
391 	RECUR_MONTHLY,
392 	RECUR_YEARLY,
393 	NBRECUR
394 };
395 
396 /*
397  * Recurrence rule according to RFC5545; used
398  * - in each recurrent appointment/event instance
399  * - in passing parameters as a single function argument
400  */
401 struct rpt {
402 	enum recur_type type;	/* FREQ */
403 	int freq;		/* INTERVAL */
404 	time_t until;		/* UNTIL */
405 	llist_t bymonth;	/* BYMONTH list */
406 	llist_t bywday;		/* BY(WEEK)DAY list */
407 	llist_t bymonthday;	/* BYMONTHDAY list */
408 	llist_t exc;		/* EXDATE's */
409 };
410 
411 /* Types of integers in rrule lists. */
412 typedef enum {
413 	BYMONTH,
414 	BYDAY_W,
415 	BYDAY_M,
416 	BYDAY_Y,
417 	BYMONTHDAY,
418 	NOLL
419 } int_list_t;
420 
421 /* Recurrent appointment definition. */
422 struct recur_apoint {
423 	struct rpt *rpt;	/* recurrence rule */
424 	llist_t exc;		/* recurrence exceptions (NOT rpt->exc) */
425 	time_t start;		/* start time */
426 	long dur;		/* duration */
427 	char state;		/* item state */
428 	char *mesg;		/* description */
429 	char *note;		/* attached note */
430 };
431 
432 /* Recurrent event definition. */
433 struct recur_event {
434 	struct rpt *rpt;	/* recurrence rule */
435 	llist_t exc;		/* recurrence exceptions (NOT rpt->exc) */
436 	int id;			/* event type */
437 	time_t day;		/* day of the event */
438 	char *mesg;		/* description */
439 	char *note;		/* attached note */
440 };
441 
442 /* Generic pointer data type for appointments and events. */
443 union aptev_ptr {
444 	struct apoint *apt;
445 	struct event *ev;
446 	struct recur_apoint *rapt;
447 	struct recur_event *rev;
448 };
449 
450 /* Available item types in the calendar view. */
451 enum day_item_type {
452 	DAY_HEADING = 1,
453 	RECUR_EVNT,
454 	EVNT,
455 	EVNT_SEPARATOR,
456 	RECUR_APPT,
457 	APPT,
458 	EMPTY_SEPARATOR,
459 	END_SEPARATOR
460 };
461 
462 /* Available item types. */
463 enum item_type {
464 	TYPE_EVNT,
465 	TYPE_APPT,
466 	TYPE_RECUR_EVNT,
467 	TYPE_RECUR_APPT,
468 	TYPE_TODO
469 };
470 
471 /* Available item type masks. */
472 #define TYPE_MASK_EVNT (1 << TYPE_EVNT)
473 #define TYPE_MASK_APPT (1 << TYPE_APPT)
474 #define TYPE_MASK_RECUR_EVNT (1 << TYPE_RECUR_EVNT)
475 #define TYPE_MASK_RECUR_APPT (1 << TYPE_RECUR_APPT)
476 #define TYPE_MASK_RECUR (TYPE_MASK_RECUR_EVNT | TYPE_MASK_RECUR_APPT)
477 #define TYPE_MASK_CAL (TYPE_MASK_EVNT | TYPE_MASK_APPT | TYPE_MASK_RECUR)
478 #define TYPE_MASK_TODO (1 << TYPE_TODO)
479 #define TYPE_MASK_ALL (TYPE_MASK_CAL | TYPE_MASK_TODO)
480 
481 /* Filter settings. */
482 struct item_filter {
483 	int invert;
484 	int type_mask;
485 	char *hash;
486 	regex_t *regex;
487 	time_t start_from;
488 	time_t start_to;
489 	time_t end_from;
490 	time_t end_to;
491 	int priority;
492 	int completed;
493 	int uncompleted;
494 };
495 
496 /* Generic item description (to hold appointments, events...). */
497 struct day_item {
498 	enum day_item_type type;
499 	time_t start;
500 	time_t order;
501 	union aptev_ptr item;
502 };
503 
504 /* Shared variables for the notification threads. */
505 struct notify_app {
506 	time_t time;
507 	int got_app;
508 	char *txt;
509 	char state;
510 	pthread_mutex_t mutex;
511 };
512 
513 struct io_file {
514 	FILE *fd;
515 	char *name;
516 };
517 
518 /* Available keys. */
519 enum key {
520 	KEY_GENERIC_CANCEL,
521 	KEY_GENERIC_SELECT,
522 	KEY_GENERIC_CREDITS,
523 	KEY_GENERIC_HELP,
524 	KEY_GENERIC_QUIT,
525 	KEY_GENERIC_SAVE,
526 	KEY_GENERIC_RELOAD,
527 	KEY_GENERIC_COPY,
528 	KEY_GENERIC_PASTE,
529 	KEY_GENERIC_CHANGE_VIEW,
530 	KEY_GENERIC_IMPORT,
531 	KEY_GENERIC_EXPORT,
532 	KEY_GENERIC_GOTO,
533 	KEY_GENERIC_OTHER_CMD,
534 	KEY_GENERIC_CONFIG_MENU,
535 	KEY_GENERIC_REDRAW,
536 	KEY_GENERIC_ADD_APPT,
537 	KEY_GENERIC_ADD_TODO,
538 	KEY_GENERIC_PREV_DAY,
539 	KEY_GENERIC_NEXT_DAY,
540 	KEY_GENERIC_PREV_WEEK,
541 	KEY_GENERIC_NEXT_WEEK,
542 	KEY_GENERIC_PREV_MONTH,
543 	KEY_GENERIC_NEXT_MONTH,
544 	KEY_GENERIC_PREV_YEAR,
545 	KEY_GENERIC_NEXT_YEAR,
546 	KEY_GENERIC_SCROLL_DOWN,
547 	KEY_GENERIC_SCROLL_UP,
548 	KEY_GENERIC_GOTO_TODAY,
549 	KEY_GENERIC_CMD,
550 
551 	KEY_MOVE_RIGHT,
552 	KEY_MOVE_LEFT,
553 	KEY_MOVE_DOWN,
554 	KEY_MOVE_UP,
555 	KEY_START_OF_WEEK,
556 	KEY_END_OF_WEEK,
557 	KEY_ADD_ITEM,
558 	KEY_DEL_ITEM,
559 	KEY_EDIT_ITEM,
560 	KEY_VIEW_ITEM,
561 	KEY_PIPE_ITEM,
562 	KEY_FLAG_ITEM,
563 	KEY_REPEAT_ITEM,
564 	KEY_EDIT_NOTE,
565 	KEY_VIEW_NOTE,
566 	KEY_RAISE_PRIORITY,
567 	KEY_LOWER_PRIORITY,
568 
569 	NBKEYS,
570 	KEY_UNDEF,
571 
572 	/* Non-configurable, context sensitive key bindings. */
573 	KEY_CONFIGMENU_GENERAL,
574 	KEY_CONFIGMENU_LAYOUT,
575 	KEY_CONFIGMENU_SIDEBAR,
576 	KEY_CONFIGMENU_COLOR,
577 	KEY_CONFIGMENU_NOTIFY,
578 	KEY_CONFIGMENU_KEYS
579 };
580 
581 #define FLAG_CAL (1 << CAL)
582 #define FLAG_APP (1 << APP)
583 #define FLAG_TOD (1 << TOD)
584 #define FLAG_NOT (1 << NOT)
585 #define FLAG_STA (1 << STA)
586 #define FLAG_ALL ((1 << NBWINS) - 1)
587 
588 #define WINS_NBAR_LOCK \
589   pthread_cleanup_push(wins_nbar_cleanup, NULL); \
590   wins_nbar_lock();
591 
592 #define WINS_NBAR_UNLOCK \
593   wins_nbar_unlock(); \
594   pthread_cleanup_pop(0);
595 
596 #define WINS_CALENDAR_LOCK \
597   pthread_cleanup_push(wins_calendar_cleanup, NULL); \
598   wins_calendar_lock();
599 
600 #define WINS_CALENDAR_UNLOCK \
601   wins_calendar_unlock(); \
602   pthread_cleanup_pop(0);
603 
604 enum ui_mode {
605 	UI_CURSES,
606 	UI_CMDLINE,
607 	UI_MODES
608 };
609 
610 /* Generic window structure. */
611 struct window {
612 	WINDOW *p;		/* pointer to window */
613 	unsigned w;		/* width */
614 	unsigned h;		/* height */
615 	int x;			/* x position */
616 	int y;			/* y position */
617 };
618 
619 /* Generic scrolling window structure. */
620 struct scrollwin {
621 	WINDOW *win;		/* viewport */
622 	WINDOW *inner;		/* pad */
623 	int y;
624 	int x;
625 	int h;
626 	int w;
627 	unsigned line_off;
628 	unsigned line_num;
629 	const char *label;
630 };
631 
632 /* Generic list box structure. */
633 enum listbox_row_type {
634 	LISTBOX_ROW_TEXT,
635 	LISTBOX_ROW_CAPTION
636 };
637 
638 typedef enum listbox_row_type (*listbox_fn_item_type_t) (int, void *);
639 typedef int (*listbox_fn_item_height_t) (int, void *);
640 typedef void (*listbox_fn_draw_item_t) (int, WINDOW *, int, int, void *);
641 
642 struct listbox {
643 	struct scrollwin sw;
644 	unsigned item_count;
645 	int item_sel;
646 	listbox_fn_item_type_t fn_type;
647 	enum listbox_row_type *type;
648 	listbox_fn_item_height_t fn_height;
649 	unsigned *ch;
650 	listbox_fn_draw_item_t fn_draw;
651 	void *cb_data;
652 };
653 
654 /* Pad structure to handle scrolling. */
655 struct pad {
656 	int width;
657 	int length;
658 	int first_onscreen;	/* first line to be displayed inside window */
659 	WINDOW *ptrwin;		/* pointer to the pad window */
660 };
661 
662 /* Notification bar definition. */
663 #define NOTIFY_FLAGGED_ONLY    0
664 #define NOTIFY_UNFLAGGED_ONLY  1
665 #define NOTIFY_ALL             2
666 
667 struct nbar {
668 	unsigned show;		/* display or hide the notify-bar */
669 	int cntdwn;		/* warn when time left before next app
670 				   becomes lesser than cntdwn */
671 	char datefmt[BUFSIZ];	/* format for displaying date */
672 	char timefmt[BUFSIZ];	/* format for displaying time */
673 	char cmd[BUFSIZ];	/* notification command */
674 	unsigned notify_all;	/* notify all appointments */
675 	pthread_mutex_t mutex;
676 };
677 
678 /* Dynamic strings. */
679 struct string {
680 	char *buf;
681 	int bufsize;
682 	int len;
683 };
684 
685 /* Return codes for the getstring() function. */
686 enum getstr {
687 	GETSTRING_VALID,
688 	GETSTRING_ESC,		/* user pressed escape to cancel editing. */
689 	GETSTRING_RET		/* return was pressed without entering any text. */
690 };
691 
692 /* Return codes for parse_datetime(). */
693 #define PARSE_DATETIME_HAS_DATE (1 << 0)
694 #define PARSE_DATETIME_HAS_TIME (1 << 1)
695 
696 /* Save types and return codes for the io_save_cal() function. */
697 enum save_type {
698 	interactive,
699 	periodic
700 };
701 enum {
702 	IO_SAVE_CTINUE,
703 	IO_SAVE_RELOAD,
704 	IO_SAVE_CANCEL,
705 	IO_SAVE_NOOP,
706 	IO_SAVE_ERROR
707 };
708 
709 /* Return codes for the io_reload_data() function. */
710 enum {
711 	IO_RELOAD_LOAD,
712 	IO_RELOAD_CTINUE,
713 	IO_RELOAD_MERGE,
714 	IO_RELOAD_CANCEL,
715 	IO_RELOAD_NOOP,
716 	IO_RELOAD_ERROR
717 };
718 
719 /* Week days. */
720 enum wday {
721 	SUNDAY,
722 	MONDAY,
723 	TUESDAY,
724 	WEDNESDAY,
725 	THURSDAY,
726 	FRIDAY,
727 	SATURDAY,
728 	WDAYS
729 };
730 
731 /* Possible movements inside calendar. */
732 enum move {
733 	DAY_PREV,
734 	DAY_NEXT,
735 	WEEK_PREV,
736 	WEEK_NEXT,
737 	WEEK_START,
738 	WEEK_END,
739 	MONTH_PREV,
740 	MONTH_NEXT,
741 	YEAR_PREV,
742 	YEAR_NEXT
743 };
744 
745 /*
746  * Available color pairs.
747  * The numbering must agree with
748  * the colour numbers 1-6, see custom.c.
749  */
750 enum {
751 	COLR_RED = 1,
752 	COLR_GREEN,
753 	COLR_YELLOW,
754 	COLR_BLUE,
755 	COLR_MAGENTA,
756 	COLR_CYAN,
757 	COLR_DEFAULT,
758 	COLR_HIGH,
759 	COLR_CUSTOM
760 };
761 
762 /* Available import types. */
763 enum import_type {
764 	IO_IMPORT_ICAL,
765 	IO_IMPORT_NBTYPES
766 };
767 
768 /* Available export types. */
769 enum export_type {
770 	IO_EXPORT_ICAL,
771 	IO_EXPORT_PCAL,
772 	IO_EXPORT_NBTYPES
773 };
774 
775 /* apoint.c */
776 extern llist_ts_t alist_p;
777 void apoint_free_bkp(void);
778 struct apoint *apoint_dup(struct apoint *);
779 void apoint_free(struct apoint *);
780 void apoint_llist_init(void);
781 void apoint_llist_free(void);
782 struct apoint *apoint_new(char *, char *, time_t, long, char);
783 unsigned apoint_inday(struct apoint *, time_t *);
784 void apoint_sec2str(struct apoint *, time_t, char *, char *);
785 char *apoint_tostr(struct apoint *);
786 char *apoint_hash(struct apoint *);
787 void apoint_write(struct apoint *, FILE *);
788 char *apoint_scan(FILE *, struct tm, struct tm, char, char *,
789 			   struct item_filter *);
790 void apoint_delete(struct apoint *);
791 struct notify_app *apoint_check_next(struct notify_app *, time_t);
792 void apoint_switch_notify(struct apoint *);
793 void apoint_paste_item(struct apoint *, time_t);
794 
795 /* args.c */
796 int parse_args(int, char **);
797 
798 /* calendar.c */
799 extern struct day_item empty_day;
800 
801 /* ui-calendar.c */
802 void ui_calendar_view_next(void);
803 void ui_calendar_view_prev(void);
804 void ui_calendar_set_view(int);
805 int ui_calendar_get_view(void);
806 void ui_calendar_start_date_thread(void);
807 void ui_calendar_stop_date_thread(void);
808 void ui_calendar_set_current_date(void);
809 struct date *ui_calendar_get_today(void);
810 void ui_calendar_set_first_day_of_week(enum wday);
811 void ui_calendar_change_first_day_of_week(void);
812 unsigned ui_calendar_week_begins_on_monday(void);
813 void ui_calendar_store_current_date(struct date *);
814 void ui_calendar_init_slctd_day(void);
815 struct date *ui_calendar_get_slctd_day(void);
816 void ui_calendar_set_slctd_day(struct date);
817 void ui_calendar_monthly_view_cache_set_invalid(void);
818 void ui_calendar_update_panel(void);
819 void ui_calendar_goto_today(void);
820 void ui_calendar_change_day(int);
821 void ui_calendar_move(enum move, int);
822 time_t ui_calendar_start_of_year(void);
823 time_t ui_calendar_end_of_year(void);
824 
825 /* config.c */
826 void config_load(void);
827 unsigned config_save(void);
828 
829 /* custom.c */
830 void custom_init_attr(void);
831 void custom_apply_attr(WINDOW *, int);
832 void custom_remove_attr(WINDOW *, int);
833 void custom_layout_config(void);
834 void custom_sidebar_config(void);
835 void custom_color_config(void);
836 void custom_general_config(void);
837 void custom_keys_config(void);
838 void custom_config_main(void);
839 
840 /* day.c */
841 int day_set_sel_data(struct day_item *);
842 int day_check_sel_data(void);
843 int day_sel_index(void);
844 int day_get_days(void);
845 void day_free_vector(void);
846 char *day_item_get_mesg(struct day_item *);
847 char *day_item_get_note(struct day_item *);
848 void day_item_erase_note(struct day_item *);
849 long day_item_get_duration(struct day_item *);
850 int day_item_get_state(struct day_item *);
851 void day_item_add_exc(struct day_item *, time_t);
852 void day_item_fork(struct day_item *, struct day_item *);
853 void day_store_items(time_t, int, int);
854 void day_display_item_date(struct day_item *, WINDOW *, int, time_t, int, int);
855 void day_display_item(struct day_item *, WINDOW *, int, int, int, int);
856 void day_write_stdout(time_t, const char *, const char *, const char *,
857 		      const char *, int *);
858 void day_popup_item(struct day_item *);
859 int day_check_if_item(struct date);
860 unsigned day_chk_busy_slices(struct date, int, int *);
861 struct day_item *day_cut_item(int);
862 int day_paste_item(struct day_item *, time_t);
863 struct day_item *day_get_item(int);
864 unsigned day_item_count(int);
865 void day_edit_note(struct day_item *, const char *);
866 void day_view_note(struct day_item *, const char *);
867 void day_item_switch_notify(struct day_item *);
868 
869 /* dmon.c */
870 void dmon_start(int);
871 void dmon_stop(void);
872 
873 /* event.c */
874 extern llist_t eventlist;
875 extern struct event dummy;
876 void event_free_bkp(void);
877 struct event *event_dup(struct event *);
878 void event_free(struct event *);
879 void event_llist_init(void);
880 void event_llist_free(void);
881 struct event *event_new(char *, char *, time_t, int);
882 unsigned event_inday(struct event *, time_t *);
883 char *event_tostr(struct event *);
884 char *event_hash(struct event *);
885 void event_write(struct event *, FILE *);
886 char *event_scan(FILE *, struct tm, int, char *, struct item_filter *);
887 void event_delete(struct event *);
888 void event_paste_item(struct event *, time_t);
889 int event_dummy(struct day_item *);
890 
891 /* getstring.c */
892 enum getstr getstring(WINDOW *, char *, int, int, int);
893 int updatestring(WINDOW *, char **, int, int);
894 
895 /* help.c */
896 int display_help(const char *);
897 
898 /* hooks.c */
899 int run_hook(const char *);
900 
901 /* ical.c */
902 void ical_import_data(const char *, FILE *, FILE *, unsigned *, unsigned *,
903 		      unsigned *, unsigned *, unsigned *, const char *,
904 		      const char *, const char *, const char *, const char *);
905 void ical_export_data(FILE *, int);
906 
907 /* io.c */
908 unsigned io_fprintln(const char *, const char *, ...);
909 void io_init(const char *, const char *, const char *);
910 void io_extract_data(char *, const char *, int);
911 void io_dump_apts(const char *, const char *, const char *, const char *);
912 unsigned io_save_apts(const char *);
913 void io_dump_todo(const char *);
914 unsigned io_save_todo(const char *);
915 unsigned io_save_keys(void);
916 int io_save_cal(enum save_type);
917 void io_load_app(struct item_filter *);
918 void io_load_todo(struct item_filter *);
919 int io_load_data(struct item_filter *, int);
920 int io_reload_data(void);
921 void io_load_keys(const char *);
922 int io_check_dir(const char *);
923 unsigned io_dir_exists(const char *);
924 unsigned io_file_exists(const char *);
925 int io_check_file(const char *);
926 int io_check_data_files(void);
927 void io_export_data(enum export_type, int);
928 int io_import_data(enum import_type, char *, const char *, const char *,
929 		    const char *, const char *, const char *);
930 struct io_file *io_log_init(void);
931 void io_log_print(struct io_file *, int, const char *);
932 void io_log_display(struct io_file *, const char *, const char *);
933 void io_log_free(struct io_file *);
934 void io_start_psave_thread(void);
935 void io_stop_psave_thread(void);
936 void io_set_lock(void);
937 unsigned io_dump_pid(char *);
938 unsigned io_get_pid(char *);
939 int io_files_equal(const char *, const char *);
940 int io_file_cp(const char *, const char *);
941 void io_unset_modified(void);
942 void io_set_modified(void);
943 int io_get_modified(void);
944 
945 /* keys.c */
946 void keys_init(void);
947 void keys_free(void);
948 void keys_dump_defaults(char *);
949 const char *keys_get_label(enum key);
950 enum key keys_get_action(int);
951 int keys_wgetch(WINDOW *);
952 void keys_wait_for_any_key(WINDOW *);
953 enum key keys_get(WINDOW *, int *, int *);
954 int keys_assign_binding(int, enum key);
955 void keys_remove_binding(int, enum key);
956 int keys_str2int(const char *);
957 char *keys_int2str(int);
958 int keys_action_count_keys(enum key);
959 const char *keys_action_firstkey(enum key);
960 const char *keys_action_nkey(enum key, int);
961 char *keys_action_allkeys(enum key);
962 void keys_display_bindings_bar(WINDOW *, int *, int, int, int);
963 void keys_popup_info(enum key);
964 void keys_save_bindings(FILE *);
965 int keys_check_missing_bindings(void);
966 void keys_fill_missing(void);
967 
968 /* listbox.c */
969 void listbox_init(struct listbox *, int, int, int, int, const char *,
970 		  listbox_fn_item_type_t, listbox_fn_item_height_t,
971 		  listbox_fn_draw_item_t);
972 void listbox_delete(struct listbox *);
973 void listbox_resize(struct listbox *, int, int, int, int);
974 void listbox_set_cb_data(struct listbox *, void *);
975 void listbox_load_items(struct listbox *, int);
976 void listbox_draw_deco(struct listbox *, int);
977 void listbox_display(struct listbox *, int);
978 int listbox_get_sel(struct listbox *);
979 void listbox_set_sel(struct listbox *, unsigned);
980 void listbox_item_in_view(struct listbox *, int);
981 int listbox_sel_move(struct listbox *, int);
982 
983 /* mem.c */
984 void *xmalloc(size_t);
985 void *xcalloc(size_t, size_t);
986 void *xrealloc(void *, size_t, size_t);
987 char *xstrdup(const char *);
988 void xfree(void *);
989 
990 #ifdef CALCURSE_MEMORY_DEBUG
991 
992 #define mem_malloc(s)         dbg_malloc ((s), __FILE_POS__)
993 #define mem_calloc(n, s)      dbg_calloc ((n), (s), __FILE_POS__)
994 #define mem_realloc(p, n, s)  dbg_realloc ((p), (n), (s), __FILE_POS__)
995 #define mem_strdup(s)         dbg_strdup ((s), __FILE_POS__)
996 #define mem_free(p)           dbg_free ((p), __FILE_POS__)
997 
998 void *dbg_malloc(size_t, const char *);
999 void *dbg_calloc(size_t, size_t, const char *);
1000 void *dbg_realloc(void *, size_t, size_t, const char *);
1001 char *dbg_strdup(const char *, const char *);
1002 void dbg_free(void *, const char *);
1003 void mem_stats(void);
1004 
1005 #else /* MEMORY DEBUG disabled */
1006 
1007 #define mem_malloc(s)         xmalloc ((s))
1008 #define mem_calloc(n, s)      xcalloc ((n), (s))
1009 #define mem_realloc(p, n, s)  xrealloc ((p), (n), (s))
1010 #define mem_strdup(s)         xstrdup ((s))
1011 #define mem_free(p)           xfree ((p))
1012 #define mem_stats()
1013 
1014 #endif /* CALCURSE_MEMORY_DEBUG */
1015 
1016 /* note.c */
1017 char *generate_note(const char *);
1018 void edit_note(char **, const char *);
1019 void view_note(const char *, const char *);
1020 void erase_note(char **);
1021 void note_read(char *, FILE *);
1022 void note_read_contents(char *, size_t, FILE *);
1023 void note_gc(void);
1024 
1025 /* notify.c */
1026 int notify_time_left(void);
1027 unsigned notify_needs_reminder(void);
1028 void notify_update_app(time_t, char, char *);
1029 int notify_bar(void);
1030 void notify_init_vars(void);
1031 void notify_init_bar(void);
1032 void notify_free_app(void);
1033 void notify_start_main_thread(void);
1034 void notify_stop_main_thread(void);
1035 void notify_reinit_bar(void);
1036 unsigned notify_launch_cmd(void);
1037 void notify_update_bar(void);
1038 unsigned notify_get_next(struct notify_app *);
1039 unsigned notify_get_next_bkgd(void);
1040 char *notify_app_txt(void);
1041 void notify_check_next_app(int);
1042 void notify_check_added(char *, time_t, char);
1043 void notify_check_repeated(struct recur_apoint *);
1044 int notify_same_item(time_t);
1045 int notify_same_recur_item(struct recur_apoint *);
1046 void notify_config_bar(void);
1047 
1048 /* pcal.c */
1049 void pcal_export_data(FILE *);
1050 
1051 /* recur.c */
1052 extern llist_ts_t recur_alist_p;
1053 extern llist_t recur_elist;
1054 void recur_free_int_list(llist_t *);
1055 void recur_int_list_dup(llist_t *, llist_t *);
1056 void recur_free_exc_list(llist_t *);
1057 void recur_exc_dup(llist_t *, llist_t *);
1058 int recur_str2exc(llist_t *, char *);
1059 char *recur_exc2str(llist_t *);
1060 struct recur_event *recur_event_dup(struct recur_event *);
1061 struct recur_apoint *recur_apoint_dup(struct recur_apoint *);
1062 void recur_event_free_bkp(void);
1063 void recur_apoint_free_bkp(void);
1064 void recur_event_free(struct recur_event *);
1065 void recur_apoint_free(struct recur_apoint *);
1066 void recur_apoint_llist_init(void);
1067 void recur_event_llist_init(void);
1068 void recur_apoint_llist_free(void);
1069 void recur_event_llist_free(void);
1070 struct recur_apoint *recur_apoint_new(char *, char *, time_t, long, char,
1071 				      struct rpt *);
1072 struct recur_event *recur_event_new(char *, char *, time_t, int,
1073 				     struct rpt *);
1074 char recur_def2char(enum recur_type);
1075 int recur_char2def(char);
1076 char *recur_apoint_scan(FILE *, struct tm, struct tm, char,
1077 				       char *, struct item_filter *,
1078 				       struct rpt *);
1079 char *recur_event_scan(FILE *, struct tm, int, char *,
1080 				     struct item_filter *, struct rpt *);
1081 char *recur_apoint_tostr(struct recur_apoint *);
1082 char *recur_apoint_hash(struct recur_apoint *);
1083 void recur_apoint_write(struct recur_apoint *, FILE *);
1084 char *recur_event_tostr(struct recur_event *);
1085 char *recur_event_hash(struct recur_event *);
1086 void recur_event_write(struct recur_event *, FILE *);
1087 void recur_save_data(FILE *);
1088 unsigned recur_item_find_occurrence(time_t, long, struct rpt *, llist_t *,
1089 				    time_t, time_t *);
1090 unsigned recur_apoint_find_occurrence(struct recur_apoint *, time_t, time_t *);
1091 unsigned recur_event_find_occurrence(struct recur_event *, time_t, time_t *);
1092 unsigned recur_item_inday(time_t, long, struct rpt *, llist_t *, time_t);
1093 unsigned recur_apoint_inday(struct recur_apoint *, time_t *);
1094 unsigned recur_event_inday(struct recur_event *, time_t *);
1095 void recur_event_add_exc(struct recur_event *, time_t);
1096 void recur_apoint_add_exc(struct recur_apoint *, time_t);
1097 void recur_event_erase(struct recur_event *);
1098 void recur_apoint_erase(struct recur_apoint *);
1099 void recur_bymonth(llist_t *, FILE *);
1100 void recur_bywday(enum recur_type, llist_t *, FILE *);
1101 void recur_bymonthday(llist_t *, FILE *);
1102 void recur_exc_scan(llist_t *, FILE *);
1103 void recur_apoint_check_next(struct notify_app *, time_t, time_t);
1104 void recur_apoint_switch_notify(struct recur_apoint *);
1105 void recur_event_paste_item(struct recur_event *, time_t);
1106 void recur_apoint_paste_item(struct recur_apoint *, time_t);
1107 int recur_next_occurrence(time_t, long, struct rpt *, llist_t *, time_t, time_t *);
1108 int recur_nth_occurrence(time_t, long, struct rpt *, llist_t *, int, time_t *);
1109 int recur_prev_occurrence(time_t, long, struct rpt *, llist_t *, time_t, time_t *);
1110 
1111 
1112 /* sigs.c */
1113 void sigs_init(void);
1114 unsigned sigs_set_hdlr(int, void (*)(int));
1115 void sigs_ignore(void);
1116 void sigs_unignore(void);
1117 
1118 /* strings.c */
1119 void string_init(struct string *);
1120 void string_reset(struct string *);
1121 int string_grow(struct string *, int);
1122 char *string_buf(struct string *);
1123 int string_catf(struct string *, const char *, ...);
1124 int string_vcatf(struct string *, const char *, va_list);
1125 int string_printf(struct string *, const char *, ...);
1126 int string_catftime(struct string *, const char *, const struct tm *);
1127 int string_strftime(struct string *, const char *, const struct tm *);
1128 
1129 /* todo.c */
1130 extern llist_t todolist;
1131 struct todo *todo_get_item(int, int);
1132 struct todo *todo_add(char *, int, int, char *);
1133 char *todo_tostr(struct todo *);
1134 char *todo_hash(struct todo *);
1135 void todo_write(struct todo *, FILE *);
1136 void todo_delete_note(struct todo *);
1137 void todo_delete(struct todo *);
1138 void todo_resort(struct todo *);
1139 void todo_flag(struct todo *);
1140 int todo_get_position(struct todo *, int);
1141 void todo_edit_note(struct todo *, const char *);
1142 void todo_view_note(struct todo *, const char *);
1143 void todo_free(struct todo *);
1144 void todo_init_list(void);
1145 void todo_free_list(void);
1146 
1147 /* ui-day.c */
1148 void ui_day_item_add(void);
1149 void ui_day_item_delete(unsigned);
1150 void ui_day_item_edit(void);
1151 void ui_day_item_pipe(void);
1152 void ui_day_item_repeat(void);
1153 void ui_day_item_cut(unsigned);
1154 void ui_day_item_cut_free(unsigned);
1155 void ui_day_item_copy(unsigned);
1156 void ui_day_item_paste(unsigned);
1157 void ui_day_load_items(void);
1158 void ui_day_find_sel(void);
1159 struct day_item *ui_day_get_sel(void);
1160 time_t ui_day_sel_date(void);
1161 void ui_day_sel_reset(void);
1162 void ui_day_set_sel(struct day_item *);
1163 int ui_day_sel_move(int);
1164 void ui_day_sel_daybegin(int);
1165 void ui_day_sel_dayend(void);
1166 void ui_day_draw(int, WINDOW *, int, int, void *);
1167 enum listbox_row_type ui_day_row_type(int, void *);
1168 int ui_day_height(int, void *);
1169 void ui_day_update_panel(int);
1170 void ui_day_popup_item(void);
1171 void ui_day_flag(void);
1172 void ui_day_view_note(void);
1173 void ui_day_edit_note(void);
1174 
1175 /* ui-todo.c */
1176 void ui_todo_add(void);
1177 void ui_todo_delete(void);
1178 void ui_todo_edit(void);
1179 void ui_todo_pipe(void);
1180 void ui_todo_draw(int, WINDOW *, int, int, void *);
1181 enum listbox_row_type ui_todo_row_type(int, void *);
1182 int ui_todo_height(int, void *);
1183 void ui_todo_load_items(void);
1184 void ui_todo_sel_reset(void);
1185 void ui_todo_sel_move(int);
1186 void ui_todo_update_panel(int);
1187 void ui_todo_chg_priority(int);
1188 void ui_todo_popup_item(void);
1189 void ui_todo_flag(void);
1190 void ui_todo_view_note(void);
1191 void ui_todo_edit_note(void);
1192 void ui_todo_view_prev(void);
1193 void ui_todo_view_next(void);
1194 int ui_todo_get_view(void);
1195 void ui_todo_set_view(int);
1196 
1197 /* utf8.c */
1198 int utf8_decode(const char *);
1199 int utf8_width(char *);
1200 int utf8_strwidth(char *);
1201 int utf8_chop(char *, int);
1202 char *utf8_encode(int);
1203 
1204 /* utils.c */
1205 void exit_calcurse(int) __attribute__ ((__noreturn__));
1206 void free_user_data(void);
1207 void fatalbox(const char *);
1208 void warnbox(const char *);
1209 void status_mesg(const char *, const char *);
1210 int status_ask_choice(const char *, const char[], int);
1211 int status_ask_bool(const char *);
1212 int status_ask_simplechoice(const char *, const char *[], int);
1213 void erase_window_part(WINDOW *, int, int, int, int);
1214 WINDOW *popup(int, int, int, int, const char *, const char *, int);
1215 void print_in_middle(WINDOW *, int, int, int, const char *);
1216 int is_all_digit(const char *);
1217 long get_item_time(time_t);
1218 int get_item_hour(time_t);
1219 int get_item_min(time_t);
1220 struct tm date2tm(struct date, unsigned, unsigned);
1221 time_t date2sec(struct date, unsigned, unsigned);
1222 struct date sec2date(time_t);
1223 time_t tzdate2sec(struct date, unsigned, unsigned, char *);
1224 int date_cmp(struct date *, struct date *);
1225 int date_cmp_day(time_t, time_t);
1226 char *date_sec2date_str(time_t, const char *);
1227 void date_sec2date_fmt(time_t, const char *, char *);
1228 int date_change(struct tm *, int, int);
1229 time_t date_sec_change(time_t, int, int);
1230 time_t update_time_in_date(time_t, unsigned, unsigned);
1231 time_t get_sec_date(struct date);
1232 long min2sec(unsigned);
1233 void draw_scrollbar(struct scrollwin *, int);
1234 void item_in_popup(const char *, const char *, const char *, const char *);
1235 time_t get_today(void);
1236 time_t get_slctd_day(void);
1237 time_t now(void);
1238 char *nowstr(void);
1239 void print_bool_option_incolor(WINDOW *, unsigned, int, int);
1240 const char *get_tempdir(void);
1241 char *new_tempfile(const char *);
1242 int check_date(unsigned, unsigned, unsigned);
1243 int parse_date(const char *, enum datefmt, int *, int *, int *, struct date *);
1244 int parse_date_interactive(const char *, int *, int *, int *);
1245 int check_sec(time_t *);
1246 int check_time(unsigned, unsigned);
1247 int parse_time(const char *, unsigned *, unsigned *);
1248 int parse_duration(const char *, unsigned *, time_t);
1249 int parse_date_increment(const char *, unsigned *, time_t);
1250 int parse_datetime(const char *, time_t *, time_t);
1251 void file_close(FILE *, const char *);
1252 void psleep(unsigned);
1253 int fork_exec(int *, int *, int *, int, const char *, const char *const *);
1254 int shell_exec(int *, int *, int *, int, const char *, const char *const *);
1255 int child_wait(int *, int *, int *, int);
1256 void press_any_key(void);
1257 void print_apoint(const char *, time_t, struct apoint *);
1258 void print_event(const char *, time_t, struct event *);
1259 void print_recur_apoint(const char *, time_t, time_t, struct recur_apoint *);
1260 void print_recur_event(const char *, time_t, struct recur_event *);
1261 void print_todo(const char *, struct todo *);
1262 int vasprintf(char **, const char *, va_list);
1263 int asprintf(char **, const char *, ...);
1264 int starts_with(const char *, const char *);
1265 int starts_with_ci(const char *, const char *);
1266 int hash_matches(const char *, const char *);
1267 long overflow_add(long, long, long *);
1268 long overflow_mul(long, long, long *);
1269 time_t next_wday(time_t, int);
1270 int wday_per_year(int, int);
1271 int wday_per_month(int, int, int);
1272 char *day_ins(char **, time_t);
1273 
1274 /* vars.c */
1275 extern int col, row;
1276 extern int resize;
1277 extern unsigned colorize;
1278 extern int foreground, background;
1279 extern enum ui_mode ui_mode;
1280 extern int read_only;
1281 extern int quiet;
1282 extern int want_reload;
1283 extern const char *datefmt_str[];
1284 extern int days[];
1285 extern char *path_ddir;
1286 extern char *path_cdir;
1287 extern char *path_todo;
1288 extern char *path_apts;
1289 extern char *path_conf;
1290 extern char *path_keys;
1291 extern char *path_notes;
1292 extern char *path_cpid;
1293 extern char *path_dpid;
1294 extern char *path_dmon_log;
1295 extern char *path_hooks;
1296 extern struct conf conf;
1297 extern struct pad apad;
1298 extern struct nbar nbar;
1299 extern struct dmon_conf dmon;
1300 void vars_init(void);
1301 extern pthread_t notify_t_main, io_t_psave, ui_calendar_t_date;
1302 
1303 /* wins.c */
1304 extern struct window win[NBWINS];
1305 extern struct scrollwin sw_cal;
1306 extern struct listbox lb_apt;
1307 extern struct listbox lb_todo;
1308 unsigned wins_nbar_lock(void);
1309 void wins_nbar_unlock(void);
1310 void wins_nbar_cleanup(void *);
1311 unsigned wins_calendar_lock(void);
1312 void wins_calendar_unlock(void);
1313 void wins_calendar_cleanup(void *);
1314 int wins_refresh(void);
1315 int wins_wrefresh(WINDOW *);
1316 int wins_doupdate(void);
1317 int wins_redrawwin(WINDOW *);
1318 int wins_layout(void);
1319 void wins_set_layout(int);
1320 unsigned wins_sbar_width(void);
1321 unsigned wins_sbar_wperc(void);
1322 void wins_set_sbar_width(unsigned);
1323 void wins_sbar_winc(void);
1324 void wins_sbar_wdec(void);
1325 enum win wins_slctd(void);
1326 void wins_slctd_set(enum win);
1327 void wins_slctd_next(void);
1328 void wins_init(void);
1329 void wins_scrollwin_init(struct scrollwin *, int, int, int, int, const char *);
1330 void wins_scrollwin_resize(struct scrollwin *, int, int, int, int);
1331 void wins_scrollwin_set_pad(struct scrollwin *, unsigned);
1332 void wins_scrollwin_delete(struct scrollwin *);
1333 void wins_scrollwin_draw_deco(struct scrollwin *, int);
1334 void wins_scrollwin_display(struct scrollwin *, int);
1335 void wins_scrollwin_up(struct scrollwin *, int);
1336 void wins_scrollwin_down(struct scrollwin *, int);
1337 void wins_scrollwin_in_view(struct scrollwin *, unsigned);
1338 void wins_resize(void);
1339 void wins_resize_panels(void);
1340 void wins_show(WINDOW *, const char *);
1341 void wins_get_config(void);
1342 void wins_update_border(int);
1343 void wins_update_panels(int);
1344 void wins_update(int);
1345 void wins_reset_noupdate(void);
1346 void wins_reset(void);
1347 void wins_prepare_external(void);
1348 void wins_unprepare_external(void);
1349 void wins_launch_external(const char *[]);
1350 void wins_set_bindings(int *, int);
1351 void wins_update_bindings(void);
1352 void wins_status_bar(void);
1353 void wins_erase_status_bar(void);
1354 void wins_other_status_page();
1355 void wins_reset_status_page(void);
1356 
1357 /* queue.c */
1358 void que_init(void);
1359 int que_ued(void);
1360 struct event *que_ins(char *, time_t, int);
1361 void que_rem(void);
1362 void que_show(void);
1363 void que_save(void);
1364 #endif /* CALCURSE_H */
1365