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