diff options
author | Lukas Fleischer <calcurse@cryptocrack.de> | 2013-04-13 23:31:06 +0200 |
---|---|---|
committer | Lukas Fleischer <calcurse@cryptocrack.de> | 2013-04-14 00:19:01 +0200 |
commit | 694d28eb78dfad98e2e7ea670d93a153d8efd368 (patch) | |
tree | 485dc11d3644d9dadb5fd4d67c5ef8103be79623 /src/ui-day.c | |
parent | 9907069f442c56c90b67accb2d8fbd046dfce6db (diff) | |
download | calcurse-694d28eb78dfad98e2e7ea670d93a153d8efd368.zip |
Use tabs instead of spaces for indentation
This completes our switch to the Linux kernel coding style. Note that we
still use deeply nested constructs at some places which need to be fixed
up later.
Converted using the `Lindent` script from the Linux kernel code base,
along with some manual fixes.
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
Diffstat (limited to 'src/ui-day.c')
-rw-r--r-- | src/ui-day.c | 1503 |
1 files changed, 780 insertions, 723 deletions
diff --git a/src/ui-day.c b/src/ui-day.c index 3638c6e..647d038 100644 --- a/src/ui-day.c +++ b/src/ui-day.c @@ -37,366 +37,389 @@ #include "calcurse.h" static int hilt; -struct day_item day_cut[38] = { { 0, 0, { NULL } } }; +struct day_item day_cut[38] = { {0, 0, {NULL}} }; /* Request the user to enter a new time. */ -static int day_edit_time(int time, unsigned *new_hour, unsigned *new_minute) +static int day_edit_time(int time, unsigned *new_hour, + unsigned *new_minute) { - char *timestr = date_sec2date_str(time, "%H:%M"); - const char *msg_time = _("Enter the new time ([hh:mm] or [hhmm]) : "); - const char *enter_str = _("Press [Enter] to continue"); - const char *fmt_msg = _("You entered an invalid time, should be [hh:mm] or [hhmm]"); - - for (;;) { - status_mesg(msg_time, ""); - if (updatestring(win[STA].p, ×tr, 0, 1) != GETSTRING_VALID) - return 0; - if (parse_time(timestr, new_hour, new_minute) == 1) { - mem_free(timestr); - return 1; - } else { - status_mesg(fmt_msg, enter_str); - wgetch(win[KEY].p); - } - } + char *timestr = date_sec2date_str(time, "%H:%M"); + const char *msg_time = + _("Enter the new time ([hh:mm] or [hhmm]) : "); + const char *enter_str = _("Press [Enter] to continue"); + const char *fmt_msg = + _("You entered an invalid time, should be [hh:mm] or [hhmm]"); + + for (;;) { + status_mesg(msg_time, ""); + if (updatestring(win[STA].p, ×tr, 0, 1) != + GETSTRING_VALID) + return 0; + if (parse_time(timestr, new_hour, new_minute) == 1) { + mem_free(timestr); + return 1; + } else { + status_mesg(fmt_msg, enter_str); + wgetch(win[KEY].p); + } + } } /* Request the user to enter a new time or duration. */ static int day_edit_duration(int start, int dur, unsigned *new_duration) { - char *timestr = date_sec2date_str(start + dur, "%H:%M"); - const char *msg_time = - _ - ("Enter new end time ([hh:mm], [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : "); - const char *enter_str = _("Press [Enter] to continue"); - const char *fmt_msg = _("You entered an invalid time, should be [hh:mm] or [hhmm]"); - long newtime; - unsigned hr, mn; - - for (;;) { - status_mesg(msg_time, ""); - if (updatestring(win[STA].p, ×tr, 0, 1) != GETSTRING_VALID) - return 0; - if (*timestr == '+' && parse_duration(timestr + 1, new_duration) == 1) { - *new_duration *= MININSEC; - break; - } else if (parse_time(timestr, &hr, &mn) == 1) { - newtime = update_time_in_date(start + dur, hr, mn); - *new_duration = (newtime > start) ? newtime - start : - DAYINSEC + newtime - start; - break; - } else { - status_mesg(fmt_msg, enter_str); - wgetch(win[KEY].p); - } - } - - mem_free(timestr); - return 1; + char *timestr = date_sec2date_str(start + dur, "%H:%M"); + const char *msg_time = + _("Enter new end time ([hh:mm], [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : "); + const char *enter_str = _("Press [Enter] to continue"); + const char *fmt_msg = + _("You entered an invalid time, should be [hh:mm] or [hhmm]"); + long newtime; + unsigned hr, mn; + + for (;;) { + status_mesg(msg_time, ""); + if (updatestring(win[STA].p, ×tr, 0, 1) != + GETSTRING_VALID) + return 0; + if (*timestr == '+' + && parse_duration(timestr + 1, new_duration) == 1) { + *new_duration *= MININSEC; + break; + } else if (parse_time(timestr, &hr, &mn) == 1) { + newtime = update_time_in_date(start + dur, hr, mn); + *new_duration = + (newtime > + start) ? newtime - start : DAYINSEC + + newtime - start; + break; + } else { + status_mesg(fmt_msg, enter_str); + wgetch(win[KEY].p); + } + } + + mem_free(timestr); + return 1; } /* Request the user to enter a new end time or duration. */ static void update_start_time(long *start, long *dur) { - long newtime; - unsigned hr, mn; - int valid_date; - const char *msg_wrong_time = - _("Invalid time: start time must be before end time!"); - const char *msg_enter = _("Press [Enter] to continue"); - - do { - if (!day_edit_time(*start, &hr, &mn)) - break; - newtime = update_time_in_date(*start, hr, mn); - if (newtime < *start + *dur) { - *dur -= (newtime - *start); - *start = newtime; - valid_date = 1; - } else { - status_mesg(msg_wrong_time, msg_enter); - wgetch(win[KEY].p); - valid_date = 0; - } - } - while (valid_date == 0); + long newtime; + unsigned hr, mn; + int valid_date; + const char *msg_wrong_time = + _("Invalid time: start time must be before end time!"); + const char *msg_enter = _("Press [Enter] to continue"); + + do { + if (!day_edit_time(*start, &hr, &mn)) + break; + newtime = update_time_in_date(*start, hr, mn); + if (newtime < *start + *dur) { + *dur -= (newtime - *start); + *start = newtime; + valid_date = 1; + } else { + status_mesg(msg_wrong_time, msg_enter); + wgetch(win[KEY].p); + valid_date = 0; + } + } + while (valid_date == 0); } static void update_duration(long *start, long *dur) { - unsigned newdur; + unsigned newdur; - if (day_edit_duration(*start, *dur, &newdur)) - *dur = newdur; + if (day_edit_duration(*start, *dur, &newdur)) + *dur = newdur; } static void update_desc(char **desc) { - status_mesg(_("Enter the new item description:"), ""); - updatestring(win[STA].p, desc, 0, 1); + status_mesg(_("Enter the new item description:"), ""); + updatestring(win[STA].p, desc, 0, 1); } static void update_rept(struct rpt **rpt, const long start) { - int newtype, newfreq; - long newuntil; - char outstr[BUFSIZ]; - char *freqstr, *timstr; - const char *msg_rpt_prefix = _("Enter the new repetition type:"); - const char *msg_rpt_daily = _("(d)aily"); - const char *msg_rpt_weekly = _("(w)eekly"); - const char *msg_rpt_monthly = _("(m)onthly"); - const char *msg_rpt_yearly = _("(y)early"); - - /* Find the current repetition type. */ - const char *rpt_current; - char msg_rpt_current[BUFSIZ]; - switch (recur_def2char((*rpt)->type)) { - case 'D': - rpt_current = msg_rpt_daily; - break; - case 'W': - rpt_current = msg_rpt_weekly; - break; - case 'M': - rpt_current = msg_rpt_monthly; - break; - case 'Y': - rpt_current = msg_rpt_yearly; - break; - default: - /* NOTREACHED, but makes the compiler happier. */ - rpt_current = msg_rpt_daily; - } - - snprintf(msg_rpt_current, BUFSIZ, _("(currently using %s)"), rpt_current); - - char msg_rpt_asktype[BUFSIZ]; - snprintf(msg_rpt_asktype, BUFSIZ, "%s %s, %s, %s, %s ? %s", - msg_rpt_prefix, - msg_rpt_daily, - msg_rpt_weekly, msg_rpt_monthly, msg_rpt_yearly, msg_rpt_current); - - const char *msg_rpt_choice = _("[dwmy]"); - const char *msg_wrong_freq = _("The frequence you entered is not valid."); - const char *msg_wrong_time = - _("Invalid time: start time must be before end time!"); - const char *msg_wrong_date = _("The entered date is not valid."); - const char *msg_fmts = - _("Possible formats are [%s] or '0' for an endless repetition."); - const char *msg_enter = _("Press [Enter] to continue"); - - switch (status_ask_choice(msg_rpt_asktype, msg_rpt_choice, 4)) { - case 1: - newtype = 'D'; - break; - case 2: - newtype = 'W'; - break; - case 3: - newtype = 'M'; - break; - case 4: - newtype = 'Y'; - break; - default: - return; - } - - do { - status_mesg(_("Enter the new repetition frequence:"), ""); - freqstr = mem_malloc(BUFSIZ); - snprintf(freqstr, BUFSIZ, "%d", (*rpt)->freq); - if (updatestring(win[STA].p, &freqstr, 0, 1) != GETSTRING_VALID) { - mem_free(freqstr); - return; - } - newfreq = atoi(freqstr); - mem_free(freqstr); - if (newfreq == 0) { - status_mesg(msg_wrong_freq, msg_enter); - wgetch(win[KEY].p); - } - } - while (newfreq == 0); - - for (;;) { - struct tm lt; - time_t t; - struct date new_date; - int newmonth, newday, newyear; - - snprintf(outstr, BUFSIZ, _("Enter the new ending date: [%s] or '0'"), - DATEFMT_DESC(conf.input_datefmt)); - status_mesg(outstr, ""); - timstr = date_sec2date_str((*rpt)->until, DATEFMT(conf.input_datefmt)); - if (updatestring(win[STA].p, &timstr, 0, 1) != GETSTRING_VALID) { - mem_free(timstr); - return; - } - if (strcmp(timstr, "0") == 0) { - newuntil = 0; - break; - } - if (!parse_date(timstr, conf.input_datefmt, &newyear, &newmonth, - &newday, ui_calendar_get_slctd_day())) { - snprintf(outstr, BUFSIZ, msg_fmts, DATEFMT_DESC(conf.input_datefmt)); - status_mesg(msg_wrong_date, outstr); - wgetch(win[KEY].p); - continue; - } - t = start; - localtime_r(&t, <); - new_date.dd = newday; - new_date.mm = newmonth; - new_date.yyyy = newyear; - newuntil = date2sec(new_date, lt.tm_hour, lt.tm_min); - if (newuntil >= start) - break; - status_mesg(msg_wrong_time, msg_enter); - wgetch(win[KEY].p); - } - - mem_free(timstr); - (*rpt)->type = recur_char2def(newtype); - (*rpt)->freq = newfreq; - (*rpt)->until = newuntil; + int newtype, newfreq; + long newuntil; + char outstr[BUFSIZ]; + char *freqstr, *timstr; + const char *msg_rpt_prefix = _("Enter the new repetition type:"); + const char *msg_rpt_daily = _("(d)aily"); + const char *msg_rpt_weekly = _("(w)eekly"); + const char *msg_rpt_monthly = _("(m)onthly"); + const char *msg_rpt_yearly = _("(y)early"); + + /* Find the current repetition type. */ + const char *rpt_current; + char msg_rpt_current[BUFSIZ]; + switch (recur_def2char((*rpt)->type)) { + case 'D': + rpt_current = msg_rpt_daily; + break; + case 'W': + rpt_current = msg_rpt_weekly; + break; + case 'M': + rpt_current = msg_rpt_monthly; + break; + case 'Y': + rpt_current = msg_rpt_yearly; + break; + default: + /* NOTREACHED, but makes the compiler happier. */ + rpt_current = msg_rpt_daily; + } + + snprintf(msg_rpt_current, BUFSIZ, _("(currently using %s)"), + rpt_current); + + char msg_rpt_asktype[BUFSIZ]; + snprintf(msg_rpt_asktype, BUFSIZ, "%s %s, %s, %s, %s ? %s", + msg_rpt_prefix, + msg_rpt_daily, + msg_rpt_weekly, msg_rpt_monthly, msg_rpt_yearly, + msg_rpt_current); + + const char *msg_rpt_choice = _("[dwmy]"); + const char *msg_wrong_freq = + _("The frequence you entered is not valid."); + const char *msg_wrong_time = + _("Invalid time: start time must be before end time!"); + const char *msg_wrong_date = _("The entered date is not valid."); + const char *msg_fmts = + _("Possible formats are [%s] or '0' for an endless repetition."); + const char *msg_enter = _("Press [Enter] to continue"); + + switch (status_ask_choice(msg_rpt_asktype, msg_rpt_choice, 4)) { + case 1: + newtype = 'D'; + break; + case 2: + newtype = 'W'; + break; + case 3: + newtype = 'M'; + break; + case 4: + newtype = 'Y'; + break; + default: + return; + } + + do { + status_mesg(_("Enter the new repetition frequence:"), ""); + freqstr = mem_malloc(BUFSIZ); + snprintf(freqstr, BUFSIZ, "%d", (*rpt)->freq); + if (updatestring(win[STA].p, &freqstr, 0, 1) != + GETSTRING_VALID) { + mem_free(freqstr); + return; + } + newfreq = atoi(freqstr); + mem_free(freqstr); + if (newfreq == 0) { + status_mesg(msg_wrong_freq, msg_enter); + wgetch(win[KEY].p); + } + } + while (newfreq == 0); + + for (;;) { + struct tm lt; + time_t t; + struct date new_date; + int newmonth, newday, newyear; + + snprintf(outstr, BUFSIZ, + _("Enter the new ending date: [%s] or '0'"), + DATEFMT_DESC(conf.input_datefmt)); + status_mesg(outstr, ""); + timstr = + date_sec2date_str((*rpt)->until, + DATEFMT(conf.input_datefmt)); + if (updatestring(win[STA].p, &timstr, 0, 1) != + GETSTRING_VALID) { + mem_free(timstr); + return; + } + if (strcmp(timstr, "0") == 0) { + newuntil = 0; + break; + } + if (!parse_date + (timstr, conf.input_datefmt, &newyear, &newmonth, + &newday, ui_calendar_get_slctd_day())) { + snprintf(outstr, BUFSIZ, msg_fmts, + DATEFMT_DESC(conf.input_datefmt)); + status_mesg(msg_wrong_date, outstr); + wgetch(win[KEY].p); + continue; + } + t = start; + localtime_r(&t, <); + new_date.dd = newday; + new_date.mm = newmonth; + new_date.yyyy = newyear; + newuntil = date2sec(new_date, lt.tm_hour, lt.tm_min); + if (newuntil >= start) + break; + status_mesg(msg_wrong_time, msg_enter); + wgetch(win[KEY].p); + } + + mem_free(timstr); + (*rpt)->type = recur_char2def(newtype); + (*rpt)->freq = newfreq; + (*rpt)->until = newuntil; } /* Edit an already existing item. */ void ui_day_item_edit(void) { - struct day_item *p; - struct recur_event *re; - struct event *e; - struct recur_apoint *ra; - struct apoint *a; - int need_check_notify = 0; - - p = day_get_item(ui_day_hilt()); - - switch (p->type) { - case RECUR_EVNT: - re = p->item.rev; - const char *choice_recur_evnt[2] = { - _("Description"), - _("Repetition"), - }; - switch (status_ask_simplechoice(_("Edit: "), choice_recur_evnt, 2)) { - case 1: - update_desc(&re->mesg); - break; - case 2: - update_rept(&re->rpt, re->day); - break; - default: - return; - } - break; - case EVNT: - e = p->item.ev; - update_desc(&e->mesg); - break; - case RECUR_APPT: - ra = p->item.rapt; - const char *choice_recur_appt[4] = { - _("Start time"), - _("End time"), - _("Description"), - _("Repetition"), - }; - switch (status_ask_simplechoice(_("Edit: "), choice_recur_appt, 4)) { - case 1: - need_check_notify = 1; - update_start_time(&ra->start, &ra->dur); - break; - case 2: - update_duration(&ra->start, &ra->dur); - break; - case 3: - if (notify_bar()) - need_check_notify = notify_same_recur_item(ra); - update_desc(&ra->mesg); - break; - case 4: - need_check_notify = 1; - update_rept(&ra->rpt, ra->start); - break; - default: - return; - } - break; - case APPT: - a = p->item.apt; - const char *choice_appt[3] = { - _("Start time"), - _("End time"), - _("Description"), - }; - switch (status_ask_simplechoice(_("Edit: "), choice_appt, 3)) { - case 1: - need_check_notify = 1; - update_start_time(&a->start, &a->dur); - break; - case 2: - update_duration(&a->start, &a->dur); - break; - case 3: - if (notify_bar()) - need_check_notify = notify_same_item(a->start); - update_desc(&a->mesg); - break; - default: - return; - } - break; - } - - ui_calendar_monthly_view_cache_set_invalid(); - - if (need_check_notify) - notify_check_next_app(1); + struct day_item *p; + struct recur_event *re; + struct event *e; + struct recur_apoint *ra; + struct apoint *a; + int need_check_notify = 0; + + p = day_get_item(ui_day_hilt()); + + switch (p->type) { + case RECUR_EVNT: + re = p->item.rev; + const char *choice_recur_evnt[2] = { + _("Description"), + _("Repetition"), + }; + switch (status_ask_simplechoice + (_("Edit: "), choice_recur_evnt, 2)) { + case 1: + update_desc(&re->mesg); + break; + case 2: + update_rept(&re->rpt, re->day); + break; + default: + return; + } + break; + case EVNT: + e = p->item.ev; + update_desc(&e->mesg); + break; + case RECUR_APPT: + ra = p->item.rapt; + const char *choice_recur_appt[4] = { + _("Start time"), + _("End time"), + _("Description"), + _("Repetition"), + }; + switch (status_ask_simplechoice + (_("Edit: "), choice_recur_appt, 4)) { + case 1: + need_check_notify = 1; + update_start_time(&ra->start, &ra->dur); + break; + case 2: + update_duration(&ra->start, &ra->dur); + break; + case 3: + if (notify_bar()) + need_check_notify = + notify_same_recur_item(ra); + update_desc(&ra->mesg); + break; + case 4: + need_check_notify = 1; + update_rept(&ra->rpt, ra->start); + break; + default: + return; + } + break; + case APPT: + a = p->item.apt; + const char *choice_appt[3] = { + _("Start time"), + _("End time"), + _("Description"), + }; + switch (status_ask_simplechoice + (_("Edit: "), choice_appt, 3)) { + case 1: + need_check_notify = 1; + update_start_time(&a->start, &a->dur); + break; + case 2: + update_duration(&a->start, &a->dur); + break; + case 3: + if (notify_bar()) + need_check_notify = + notify_same_item(a->start); + update_desc(&a->mesg); + break; + default: + return; + } + break; + } + + ui_calendar_monthly_view_cache_set_invalid(); + + if (need_check_notify) + notify_check_next_app(1); } /* Pipe an appointment or event to an external program. */ void ui_day_item_pipe(void) { - char cmd[BUFSIZ] = ""; - char const *arg[] = { cmd, NULL }; - int pout; - int pid; - FILE *fpout; - struct day_item *p; - - status_mesg(_("Pipe item to external command:"), ""); - if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID) - return; - - wins_prepare_external(); - if ((pid = shell_exec(NULL, &pout, *arg, arg))) { - fpout = fdopen(pout, "w"); - - p = day_get_item(ui_day_hilt()); - switch (p->type) { - case RECUR_EVNT: - recur_event_write(p->item.rev, fpout); - break; - case EVNT: - event_write(p->item.ev, fpout); - break; - case RECUR_APPT: - recur_apoint_write(p->item.rapt, fpout); - break; - case APPT: - apoint_write(p->item.apt, fpout); - break; - } - - fclose(fpout); - child_wait(NULL, &pout, pid); - press_any_key(); - } - wins_unprepare_external(); + char cmd[BUFSIZ] = ""; + char const *arg[] = { cmd, NULL }; + int pout; + int pid; + FILE *fpout; + struct day_item *p; + + status_mesg(_("Pipe item to external command:"), ""); + if (getstring(win[STA].p, cmd, BUFSIZ, 0, 1) != GETSTRING_VALID) + return; + + wins_prepare_external(); + if ((pid = shell_exec(NULL, &pout, *arg, arg))) { + fpout = fdopen(pout, "w"); + + p = day_get_item(ui_day_hilt()); + switch (p->type) { + case RECUR_EVNT: + recur_event_write(p->item.rev, fpout); + break; + case EVNT: + event_write(p->item.ev, fpout); + break; + case RECUR_APPT: + recur_apoint_write(p->item.rapt, fpout); + break; + case APPT: + apoint_write(p->item.apt, fpout); + break; + } + + fclose(fpout); + child_wait(NULL, &pout, pid); + press_any_key(); + } + wins_unprepare_external(); } /* @@ -407,177 +430,194 @@ void ui_day_item_add(void) { #define LTIME 6 #define LDUR 12 - const char *mesg_1 = - _("Enter start time ([hh:mm] or [hhmm]), leave blank for an all-day event : "); - const char *mesg_2 = - _ - ("Enter end time ([hh:mm] or [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : "); - const char *mesg_3 = _("Enter description :"); - const char *format_message_1 = - _("You entered an invalid start time, should be [hh:mm] or [hhmm]"); - const char *format_message_2 = - _ - ("Invalid end time/duration, should be [hh:mm], [hhmm], [+hh:mm], [+xxxdxxhxxm] or [+mm]"); - const char *enter_str = _("Press [Enter] to continue"); - char item_time[LDUR] = ""; - char item_mesg[BUFSIZ] = ""; - long apoint_start; - unsigned heures, minutes; - unsigned apoint_duration; - unsigned end_h, end_m; - int is_appointment = 1; - - /* Get the starting time */ - for (;;) { - status_mesg(mesg_1, ""); - if (getstring(win[STA].p, item_time, LTIME, 0, 1) == GETSTRING_ESC) - return; - if (strlen(item_time) == 0) { - is_appointment = 0; - break; - } - if (parse_time(item_time, &heures, &minutes) == 1) - break; - status_mesg(format_message_1, enter_str); - wgetch(win[KEY].p); - } - - /* - * Check if an event or appointment is entered, - * depending on the starting time, and record the - * corresponding item. - */ - if (is_appointment) { /* Get the appointment duration */ - item_time[0] = '\0'; - for (;;) { - status_mesg(mesg_2, ""); - if (getstring(win[STA].p, item_time, LDUR, 0, 1) == GETSTRING_ESC) - return; - if (*item_time == '+' && parse_duration(item_time + 1, - &apoint_duration) == 1) - break; - if (parse_time(item_time, &end_h, &end_m) == 1) { - if (end_h < heures || ((end_h == heures) && (end_m < minutes))) { - apoint_duration = MININSEC - minutes + end_m - + (24 + end_h - (heures + 1)) * MININSEC; - } else { - apoint_duration = MININSEC - minutes - + end_m + (end_h - (heures + 1)) * MININSEC; - } - break; - } - status_mesg(format_message_2, enter_str); - wgetch(win[KEY].p); - } - } - - status_mesg(mesg_3, ""); - if (getstring(win[STA].p, item_mesg, BUFSIZ, 0, 1) == GETSTRING_VALID) { - if (is_appointment) { - apoint_start = date2sec(*ui_calendar_get_slctd_day(), heures, minutes); - apoint_new(item_mesg, 0L, apoint_start, min2sec(apoint_duration), 0L); - if (notify_bar()) - notify_check_added(item_mesg, apoint_start, 0L); - } else { - event_new(item_mesg, 0L, date2sec(*ui_calendar_get_slctd_day(), 0, 0), 1); - } - - if (ui_day_hilt() == 0) - ui_day_hilt_increase(1); - } - - ui_calendar_monthly_view_cache_set_invalid(); - - wins_erase_status_bar(); + const char *mesg_1 = + _("Enter start time ([hh:mm] or [hhmm]), leave blank for an all-day event : "); + const char *mesg_2 = + _("Enter end time ([hh:mm] or [hhmm]) or duration ([+hh:mm], [+xxxdxxhxxm] or [+mm]) : "); + const char *mesg_3 = _("Enter description :"); + const char *format_message_1 = + _("You entered an invalid start time, should be [hh:mm] or [hhmm]"); + const char *format_message_2 = + _("Invalid end time/duration, should be [hh:mm], [hhmm], [+hh:mm], [+xxxdxxhxxm] or [+mm]"); + const char *enter_str = _("Press [Enter] to continue"); + char item_time[LDUR] = ""; + char item_mesg[BUFSIZ] = ""; + long apoint_start; + unsigned heures, minutes; + unsigned apoint_duration; + unsigned end_h, end_m; + int is_appointment = 1; + + /* Get the starting time */ + for (;;) { + status_mesg(mesg_1, ""); + if (getstring(win[STA].p, item_time, LTIME, 0, 1) == + GETSTRING_ESC) + return; + if (strlen(item_time) == 0) { + is_appointment = 0; + break; + } + if (parse_time(item_time, &heures, &minutes) == 1) + break; + status_mesg(format_message_1, enter_str); + wgetch(win[KEY].p); + } + + /* + * Check if an event or appointment is entered, + * depending on the starting time, and record the + * corresponding item. + */ + if (is_appointment) { /* Get the appointment duration */ + item_time[0] = '\0'; + for (;;) { + status_mesg(mesg_2, ""); + if (getstring(win[STA].p, item_time, LDUR, 0, 1) == + GETSTRING_ESC) + return; + if (*item_time == '+' + && parse_duration(item_time + 1, + &apoint_duration) == 1) + break; + if (parse_time(item_time, &end_h, &end_m) == 1) { + if (end_h < heures + || ((end_h == heures) + && (end_m < minutes))) { + apoint_duration = + MININSEC - minutes + end_m + + (24 + end_h - + (heures + 1)) * MININSEC; + } else { + apoint_duration = + MININSEC - minutes + end_m + + (end_h - + (heures + 1)) * MININSEC; + } + break; + } + status_mesg(format_message_2, enter_str); + wgetch(win[KEY].p); + } + } + + status_mesg(mesg_3, ""); + if (getstring(win[STA].p, item_mesg, BUFSIZ, 0, 1) == + GETSTRING_VALID) { + if (is_appointment) { + apoint_start = + date2sec(*ui_calendar_get_slctd_day(), heures, + minutes); + apoint_new(item_mesg, 0L, apoint_start, + min2sec(apoint_duration), 0L); + if (notify_bar()) + notify_check_added(item_mesg, apoint_start, + 0L); + } else { + event_new(item_mesg, 0L, + date2sec(*ui_calendar_get_slctd_day(), 0, + 0), 1); + } + + if (ui_day_hilt() == 0) + ui_day_hilt_increase(1); + } + + ui_calendar_monthly_view_cache_set_invalid(); + + wins_erase_status_bar(); } /* Delete an item from the appointment list. */ void ui_day_item_delete(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) + unsigned reg) { - const char *del_app_str = _("Do you really want to delete this item ?"); - - const char *erase_warning = - _("This item is recurrent. " - "Delete (a)ll occurences or just this (o)ne ?"); - const char *erase_choices = _("[ao]"); - const int nb_erase_choices = 2; - - const char *note_warning = - _("This item has a note attached to it. " - "Delete (i)tem or just its (n)ote ?"); - const char *note_choices = _("[in]"); - const int nb_note_choices = 2; - - long date = ui_calendar_get_slctd_day_sec(); - int nb_items = *nb_apoints + *nb_events; - int to_be_removed = 0; - - if (nb_items == 0) - return; - - struct day_item *p = day_get_item(ui_day_hilt()); - - if (conf.confirm_delete) { - if (status_ask_bool(del_app_str) != 1) { - wins_erase_status_bar(); - return; - } - } - - if (day_item_get_note(p)) { - switch (status_ask_choice(note_warning, note_choices, nb_note_choices)) { - case 1: - break; - case 2: - day_item_erase_note(p); - return; - default: /* User escaped */ - return; - } - } - - if (p->type == RECUR_EVNT || p->type == RECUR_APPT) { - switch (status_ask_choice(erase_warning, erase_choices, nb_erase_choices)) { - case 1: - break; - case 2: - day_item_add_exc(p, date); - return; - default: - return; - } - } - - ui_day_item_cut_free(reg); - p = day_cut_item(date, ui_day_hilt()); - day_cut[reg].type = p->type; - day_cut[reg].item = p->item; - - switch (p->type) { - case EVNT: - case RECUR_EVNT: - (*nb_events)--; - to_be_removed = 1; - break; - case APPT: - case RECUR_APPT: - (*nb_apoints)--; - to_be_removed = 3; - break; - default: - EXIT(_("no such type")); - /* NOTREACHED */ - } - - ui_calendar_monthly_view_cache_set_invalid(); - - if (ui_day_hilt() > 1) - ui_day_hilt_decrease(1); - if (apad.first_onscreen >= to_be_removed) - apad.first_onscreen = apad.first_onscreen - to_be_removed; - if (nb_items == 1) - ui_day_hilt_set(0); + const char *del_app_str = + _("Do you really want to delete this item ?"); + + const char *erase_warning = + _("This item is recurrent. " + "Delete (a)ll occurences or just this (o)ne ?"); + const char *erase_choices = _("[ao]"); + const int nb_erase_choices = 2; + + const char *note_warning = + _("This item has a note attached to it. " + "Delete (i)tem or just its (n)ote ?"); + const char *note_choices = _("[in]"); + const int nb_note_choices = 2; + + long date = ui_calendar_get_slctd_day_sec(); + int nb_items = *nb_apoints + *nb_events; + int to_be_removed = 0; + + if (nb_items == 0) + return; + + struct day_item *p = day_get_item(ui_day_hilt()); + + if (conf.confirm_delete) { + if (status_ask_bool(del_app_str) != 1) { + wins_erase_status_bar(); + return; + } + } + + if (day_item_get_note(p)) { + switch (status_ask_choice + (note_warning, note_choices, nb_note_choices)) { + case 1: + break; + case 2: + day_item_erase_note(p); + return; + default: /* User escaped */ + return; + } + } + + if (p->type == RECUR_EVNT || p->type == RECUR_APPT) { + switch (status_ask_choice + (erase_warning, erase_choices, nb_erase_choices)) { + case 1: + break; + case 2: + day_item_add_exc(p, date); + return; + default: + return; + } + } + + ui_day_item_cut_free(reg); + p = day_cut_item(date, ui_day_hilt()); + day_cut[reg].type = p->type; + day_cut[reg].item = p->item; + + switch (p->type) { + case EVNT: + case RECUR_EVNT: + (*nb_events)--; + to_be_removed = 1; + break; + case APPT: + case RECUR_APPT: + (*nb_apoints)--; + to_be_removed = 3; + break; + default: + EXIT(_("no such type")); + /* NOTREACHED */ + } + + ui_calendar_monthly_view_cache_set_invalid(); + + if (ui_day_hilt() > 1) + ui_day_hilt_decrease(1); + if (apad.first_onscreen >= to_be_removed) + apad.first_onscreen = apad.first_onscreen - to_be_removed; + if (nb_items == 1) + ui_day_hilt_set(0); } /* @@ -589,211 +629,222 @@ void ui_day_item_delete(unsigned *nb_events, unsigned *nb_apoints, */ void ui_day_item_repeat(void) { - struct tm lt; - time_t t; - int year = 0, month = 0, day = 0; - struct date until_date; - char outstr[BUFSIZ]; - char user_input[BUFSIZ] = ""; - const char *msg_rpt_prefix = _("Enter the repetition type:"); - const char *msg_rpt_daily = _("(d)aily"); - const char *msg_rpt_weekly = _("(w)eekly"); - const char *msg_rpt_monthly = _("(m)onthly"); - const char *msg_rpt_yearly = _("(y)early"); - const char *msg_type_choice = _("[dwmy]"); - const char *mesg_freq_1 = _("Enter the repetition frequence:"); - const char *mesg_wrong_freq = _("The frequence you entered is not valid."); - const char *mesg_until_1 = - _("Enter the ending date: [%s] or '0' for an endless repetition"); - const char *mesg_wrong_1 = _("The entered date is not valid."); - const char *mesg_wrong_2 = - _("Possible formats are [%s] or '0' for an endless repetition"); - const char *wrong_type_1 = _("This item is already a repeated one."); - const char *wrong_type_2 = _("Press [ENTER] to continue."); - const char *mesg_older = - _("Sorry, the date you entered is older than the item start time."); - - char msg_asktype[BUFSIZ]; - snprintf(msg_asktype, BUFSIZ, "%s %s, %s, %s, %s", - msg_rpt_prefix, - msg_rpt_daily, msg_rpt_weekly, msg_rpt_monthly, msg_rpt_yearly); - - int type = 0, freq = 0; - int item_nb; - struct day_item *p; - struct recur_apoint *ra; - long until, date; - - item_nb = ui_day_hilt(); - p = day_get_item(item_nb); - if (p->type != APPT && p->type != EVNT) { - status_mesg(wrong_type_1, wrong_type_2); - wgetch(win[KEY].p); - return; - } - - switch (status_ask_choice(msg_asktype, msg_type_choice, 4)) { - case 1: - type = RECUR_DAILY; - break; - case 2: - type = RECUR_WEEKLY; - break; - case 3: - type = RECUR_MONTHLY; - break; - case 4: - type = RECUR_YEARLY; - break; - default: - return; - } - - while (freq == 0) { - status_mesg(mesg_freq_1, ""); - if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) != GETSTRING_VALID) - return; - freq = atoi(user_input); - if (freq == 0) { - status_mesg(mesg_wrong_freq, wrong_type_2); - wgetch(win[KEY].p); - } - user_input[0] = '\0'; - } - - for (;;) { - snprintf(outstr, BUFSIZ, mesg_until_1, DATEFMT_DESC(conf.input_datefmt)); - status_mesg(outstr, ""); - if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) != GETSTRING_VALID) - return; - if (strlen(user_input) == 1 && strcmp(user_input, "0") == 0) { - until = 0; - break; - } - if (parse_date(user_input, conf.input_datefmt, - &year, &month, &day, ui_calendar_get_slctd_day())) { - t = p->start; - localtime_r(&t, <); - until_date.dd = day; - until_date.mm = month; - until_date.yyyy = year; - until = date2sec(until_date, lt.tm_hour, lt.tm_min); - if (until >= p->start) - break; - status_mesg(mesg_older, wrong_type_2); - wgetch(win[KEY].p); - } else { - snprintf(outstr, BUFSIZ, mesg_wrong_2, DATEFMT_DESC(conf.input_datefmt)); - status_mesg(mesg_wrong_1, outstr); - wgetch(win[KEY].p); - } - } - - date = ui_calendar_get_slctd_day_sec(); - if (p->type == EVNT) { - struct event *ev = p->item.ev; - recur_event_new(ev->mesg, ev->note, ev->day, ev->id, type, freq, until, - NULL); - } else if (p->type == APPT) { - struct apoint *apt = p->item.apt; - ra = recur_apoint_new(apt->mesg, apt->note, apt->start, apt->dur, - apt->state, type, freq, until, NULL); - if (notify_bar()) - notify_check_repeated(ra); - } else { - EXIT(_("wrong item type")); - /* NOTREACHED */ - } - - ui_day_item_cut_free(REG_BLACK_HOLE); - p = day_cut_item(date, item_nb); - day_cut[REG_BLACK_HOLE].type = p->type; - day_cut[REG_BLACK_HOLE].item = p->item; - - ui_calendar_monthly_view_cache_set_invalid(); + struct tm lt; + time_t t; + int year = 0, month = 0, day = 0; + struct date until_date; + char outstr[BUFSIZ]; + char user_input[BUFSIZ] = ""; + const char *msg_rpt_prefix = _("Enter the repetition type:"); + const char *msg_rpt_daily = _("(d)aily"); + const char *msg_rpt_weekly = _("(w)eekly"); + const char *msg_rpt_monthly = _("(m)onthly"); + const char *msg_rpt_yearly = _("(y)early"); + const char *msg_type_choice = _("[dwmy]"); + const char *mesg_freq_1 = _("Enter the repetition frequence:"); + const char *mesg_wrong_freq = + _("The frequence you entered is not valid."); + const char *mesg_until_1 = + _("Enter the ending date: [%s] or '0' for an endless repetition"); + const char *mesg_wrong_1 = _("The entered date is not valid."); + const char *mesg_wrong_2 = + _("Possible formats are [%s] or '0' for an endless repetition"); + const char *wrong_type_1 = + _("This item is already a repeated one."); + const char *wrong_type_2 = _("Press [ENTER] to continue."); + const char *mesg_older = + _("Sorry, the date you entered is older than the item start time."); + + char msg_asktype[BUFSIZ]; + snprintf(msg_asktype, BUFSIZ, "%s %s, %s, %s, %s", + msg_rpt_prefix, + msg_rpt_daily, msg_rpt_weekly, msg_rpt_monthly, + msg_rpt_yearly); + + int type = 0, freq = 0; + int item_nb; + struct day_item *p; + struct recur_apoint *ra; + long until, date; + + item_nb = ui_day_hilt(); + p = day_get_item(item_nb); + if (p->type != APPT && p->type != EVNT) { + status_mesg(wrong_type_1, wrong_type_2); + wgetch(win[KEY].p); + return; + } + + switch (status_ask_choice(msg_asktype, msg_type_choice, 4)) { + case 1: + type = RECUR_DAILY; + break; + case 2: + type = RECUR_WEEKLY; + break; + case 3: + type = RECUR_MONTHLY; + break; + case 4: + type = RECUR_YEARLY; + break; + default: + return; + } + + while (freq == 0) { + status_mesg(mesg_freq_1, ""); + if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) != + GETSTRING_VALID) + return; + freq = atoi(user_input); + if (freq == 0) { + status_mesg(mesg_wrong_freq, wrong_type_2); + wgetch(win[KEY].p); + } + user_input[0] = '\0'; + } + + for (;;) { + snprintf(outstr, BUFSIZ, mesg_until_1, + DATEFMT_DESC(conf.input_datefmt)); + status_mesg(outstr, ""); + if (getstring(win[STA].p, user_input, BUFSIZ, 0, 1) != + GETSTRING_VALID) + return; + if (strlen(user_input) == 1 + && strcmp(user_input, "0") == 0) { + until = 0; + break; + } + if (parse_date(user_input, conf.input_datefmt, + &year, &month, &day, + ui_calendar_get_slctd_day())) { + t = p->start; + localtime_r(&t, <); + until_date.dd = day; + until_date.mm = month; + until_date.yyyy = year; + until = + date2sec(until_date, lt.tm_hour, lt.tm_min); + if (until >= p->start) + break; + status_mesg(mesg_older, wrong_type_2); + wgetch(win[KEY].p); + } else { + snprintf(outstr, BUFSIZ, mesg_wrong_2, + DATEFMT_DESC(conf.input_datefmt)); + status_mesg(mesg_wrong_1, outstr); + wgetch(win[KEY].p); + } + } + + date = ui_calendar_get_slctd_day_sec(); + if (p->type == EVNT) { + struct event *ev = p->item.ev; + recur_event_new(ev->mesg, ev->note, ev->day, ev->id, type, + freq, until, NULL); + } else if (p->type == APPT) { + struct apoint *apt = p->item.apt; + ra = recur_apoint_new(apt->mesg, apt->note, apt->start, + apt->dur, apt->state, type, freq, + until, NULL); + if (notify_bar()) + notify_check_repeated(ra); + } else { + EXIT(_("wrong item type")); + /* NOTREACHED */ + } + + ui_day_item_cut_free(REG_BLACK_HOLE); + p = day_cut_item(date, item_nb); + day_cut[REG_BLACK_HOLE].type = p->type; + day_cut[REG_BLACK_HOLE].item = p->item; + + ui_calendar_monthly_view_cache_set_invalid(); } /* Free the current cut item, if any. */ void ui_day_item_cut_free(unsigned reg) { - switch (day_cut[reg].type) { - case 0: - /* No previous item, don't free anything. */ - break; - case APPT: - apoint_free(day_cut[reg].item.apt); - break; - case EVNT: - event_free(day_cut[reg].item.ev); - break; - case RECUR_APPT: - recur_apoint_free(day_cut[reg].item.rapt); - break; - case RECUR_EVNT: - recur_event_free(day_cut[reg].item.rev); - break; - } + switch (day_cut[reg].type) { + case 0: + /* No previous item, don't free anything. */ + break; + case APPT: + apoint_free(day_cut[reg].item.apt); + break; + case EVNT: + event_free(day_cut[reg].item.ev); + break; + case RECUR_APPT: + recur_apoint_free(day_cut[reg].item.rapt); + break; + case RECUR_EVNT: + recur_event_free(day_cut[reg].item.rev); + break; + } } /* Copy an item, so that it can be pasted somewhere else later. */ void ui_day_item_copy(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) + unsigned reg) { - const int NBITEMS = *nb_apoints + *nb_events; + const int NBITEMS = *nb_apoints + *nb_events; - if (NBITEMS == 0 || reg == REG_BLACK_HOLE) - return; + if (NBITEMS == 0 || reg == REG_BLACK_HOLE) + return; - ui_day_item_cut_free(reg); - day_item_fork(day_get_item(ui_day_hilt()), &day_cut[reg]); + ui_day_item_cut_free(reg); + day_item_fork(day_get_item(ui_day_hilt()), &day_cut[reg]); } /* Paste a previously cut item. */ void ui_day_item_paste(unsigned *nb_events, unsigned *nb_apoints, - unsigned reg) + unsigned reg) { - int item_type; - struct day_item day; + int item_type; + struct day_item day; - if (reg == REG_BLACK_HOLE || !day_cut[reg].type) - return; + if (reg == REG_BLACK_HOLE || !day_cut[reg].type) + return; - day_item_fork(&day_cut[reg], &day); - item_type = day_paste_item(&day, ui_calendar_get_slctd_day_sec()); + day_item_fork(&day_cut[reg], &day); + item_type = day_paste_item(&day, ui_calendar_get_slctd_day_sec()); - ui_calendar_monthly_view_cache_set_invalid(); + ui_calendar_monthly_view_cache_set_invalid(); - if (item_type == EVNT || item_type == RECUR_EVNT) - (*nb_events)++; - else if (item_type == APPT || item_type == RECUR_APPT) - (*nb_apoints)++; - else - return; + if (item_type == EVNT || item_type == RECUR_EVNT) + (*nb_events)++; + else if (item_type == APPT || item_type == RECUR_APPT) + (*nb_apoints)++; + else + return; - if (ui_day_hilt() == 0) - ui_day_hilt_increase(1); + if (ui_day_hilt() == 0) + ui_day_hilt_increase(1); } /* Sets which appointment is highlighted. */ void ui_day_hilt_set(int highlighted) { - hilt = highlighted; + hilt = highlighted; } void ui_day_hilt_decrease(int n) { - hilt -= n; + hilt -= n; } void ui_day_hilt_increase(int n) { - hilt += n; + hilt += n; } /* Return which appointment is highlighted. */ int ui_day_hilt(void) { - return hilt; + return hilt; } /* @@ -803,15 +854,15 @@ int ui_day_hilt(void) */ static int get_item_line(int item_nb, int nb_events_inday) { - int separator = 2; - int line = 0; - - if (item_nb <= nb_events_inday) - line = item_nb - 1; - else - line = nb_events_inday + separator - + (item_nb - (nb_events_inday + 1)) * 3 - 1; - return line; + int separator = 2; + int line = 0; + + if (item_nb <= nb_events_inday) + line = item_nb - 1; + else + line = nb_events_inday + separator + + (item_nb - (nb_events_inday + 1)) * 3 - 1; + return line; } /* @@ -820,19 +871,19 @@ static int get_item_line(int item_nb, int nb_events_inday) */ void ui_day_scroll_pad_down(int nb_events_inday, int win_length) { - int pad_last_line = 0; - int item_first_line = 0, item_last_line = 0; - int borders = 6; - int awin_length = win_length - borders; - - item_first_line = get_item_line(hilt, nb_events_inday); - if (hilt < nb_events_inday) - item_last_line = item_first_line; - else - item_last_line = item_first_line + 1; - pad_last_line = apad.first_onscreen + awin_length; - if (item_last_line >= pad_last_line) - apad.first_onscreen = item_last_line - awin_length; + int pad_last_line = 0; + int item_first_line = 0, item_last_line = 0; + int borders = 6; + int awin_length = win_length - borders; + + item_first_line = get_item_line(hilt, nb_events_inday); + if (hilt < nb_events_inday) + item_last_line = item_first_line; + else + item_last_line = item_first_line + 1; + pad_last_line = apad.first_onscreen + awin_length; + if (item_last_line >= pad_last_line) + apad.first_onscreen = item_last_line - awin_length; } /* @@ -841,56 +892,62 @@ void ui_day_scroll_pad_down(int nb_events_inday, int win_length) */ void ui_day_scroll_pad_up(int nb_events_inday) { - int item_first_line = 0; + int item_first_line = 0; - item_first_line = get_item_line(hilt, nb_events_inday); - if (item_first_line < apad.first_onscreen) - apad.first_onscreen = item_first_line; + item_first_line = get_item_line(hilt, nb_events_inday); + if (item_first_line < apad.first_onscreen) + apad.first_onscreen = item_first_line; } /* Updates the Appointment panel */ void ui_day_update_panel(int which_pan) { - int title_xpos; - int bordr = 1; - int title_lines = conf.compact_panels ? 1 : 3; - int app_width = win[APP].w - bordr; - int app_length = win[APP].h - bordr - title_lines; - long date; - struct date slctd_date; - - /* variable inits */ - slctd_date = *ui_calendar_get_slctd_day(); - title_xpos = win[APP].w - (strlen(_(monthnames[slctd_date.mm - 1])) + 16); - if (slctd_date.dd < 10) - title_xpos++; - date = date2sec(slctd_date, 0, 0); - day_write_pad(date, app_width, app_length, (which_pan == APP) ? hilt : 0); - - /* Print current date in the top right window corner. */ - erase_window_part(win[APP].p, 1, title_lines, win[APP].w - 2, win[APP].h - 2); - custom_apply_attr(win[APP].p, ATTR_HIGHEST); - mvwprintw(win[APP].p, title_lines, title_xpos, "%s %s %d, %d", - ui_calendar_get_pom(date), _(monthnames[slctd_date.mm - 1]), - slctd_date.dd, slctd_date.yyyy); - custom_remove_attr(win[APP].p, ATTR_HIGHEST); - - /* Draw the scrollbar if necessary. */ - if ((apad.length >= app_length) || (apad.first_onscreen > 0)) { - int sbar_length = app_length * app_length / apad.length; - int highend = app_length * apad.first_onscreen / apad.length; - unsigned hilt_bar = (which_pan == APP) ? 1 : 0; - int sbar_top = highend + title_lines + 1; - - if ((sbar_top + sbar_length) > win[APP].h - 1) - sbar_length = win[APP].h - 1 - sbar_top; - draw_scrollbar(win[APP].p, sbar_top, win[APP].w - 2, sbar_length, - title_lines + 1, win[APP].h - 1, hilt_bar); - } - - wnoutrefresh(win[APP].p); - pnoutrefresh(apad.ptrwin, apad.first_onscreen, 0, - win[APP].y + title_lines + 1, win[APP].x + bordr, - win[APP].y + win[APP].h - 2 * bordr, - win[APP].x + win[APP].w - 3 * bordr); + int title_xpos; + int bordr = 1; + int title_lines = conf.compact_panels ? 1 : 3; + int app_width = win[APP].w - bordr; + int app_length = win[APP].h - bordr - title_lines; + long date; + struct date slctd_date; + + /* variable inits */ + slctd_date = *ui_calendar_get_slctd_day(); + title_xpos = + win[APP].w - (strlen(_(monthnames[slctd_date.mm - 1])) + 16); + if (slctd_date.dd < 10) + title_xpos++; + date = date2sec(slctd_date, 0, 0); + day_write_pad(date, app_width, app_length, + (which_pan == APP) ? hilt : 0); + + /* Print current date in the top right window corner. */ + erase_window_part(win[APP].p, 1, title_lines, win[APP].w - 2, + win[APP].h - 2); + custom_apply_attr(win[APP].p, ATTR_HIGHEST); + mvwprintw(win[APP].p, title_lines, title_xpos, "%s %s %d, %d", + ui_calendar_get_pom(date), + _(monthnames[slctd_date.mm - 1]), slctd_date.dd, + slctd_date.yyyy); + custom_remove_attr(win[APP].p, ATTR_HIGHEST); + + /* Draw the scrollbar if necessary. */ + if ((apad.length >= app_length) || (apad.first_onscreen > 0)) { + int sbar_length = app_length * app_length / apad.length; + int highend = + app_length * apad.first_onscreen / apad.length; + unsigned hilt_bar = (which_pan == APP) ? 1 : 0; + int sbar_top = highend + title_lines + 1; + + if ((sbar_top + sbar_length) > win[APP].h - 1) + sbar_length = win[APP].h - 1 - sbar_top; + draw_scrollbar(win[APP].p, sbar_top, win[APP].w - 2, + sbar_length, title_lines + 1, + win[APP].h - 1, hilt_bar); + } + + wnoutrefresh(win[APP].p); + pnoutrefresh(apad.ptrwin, apad.first_onscreen, 0, + win[APP].y + title_lines + 1, win[APP].x + bordr, + win[APP].y + win[APP].h - 2 * bordr, + win[APP].x + win[APP].w - 3 * bordr); } |