From beb2b3b1a7ecbf3182043b3a292dac2ef792a200 Mon Sep 17 00:00:00 2001 From: rdivacky Date: Mon, 20 Apr 2009 18:19:38 +0000 Subject: Implement highlighting of today in month view of cal/ncal just like gnu cal does. This is currently disabled for year view because of hard coded padding in that case. This will hopefully be fixed soon. Reviewed by: Simon 'corecode' Schubert Approved by: ed --- usr.bin/ncal/Makefile | 2 +- usr.bin/ncal/ncal.c | 94 ++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 82 insertions(+), 14 deletions(-) (limited to 'usr.bin/ncal') diff --git a/usr.bin/ncal/Makefile b/usr.bin/ncal/Makefile index 4ec8973..0d445c4 100644 --- a/usr.bin/ncal/Makefile +++ b/usr.bin/ncal/Makefile @@ -3,7 +3,7 @@ PROG= ncal DPADD= ${LIBCALENDAR} -LDADD= -lcalendar +LDADD= -lcalendar -ltermcap WARNS?= 1 LINKS= ${BINDIR}/ncal ${BINDIR}/cal diff --git a/usr.bin/ncal/ncal.c b/usr.bin/ncal/ncal.c index b9aaee8..49d78c4 100644 --- a/usr.bin/ncal/ncal.c +++ b/usr.bin/ncal/ncal.c @@ -42,6 +42,8 @@ static const char rcsid[] = #include #include #include +#include +#undef lines /* term.h defines this */ /* Width of one month with backward compatibility */ #define MONTH_WIDTH_B_J 27 @@ -50,7 +52,7 @@ static const char rcsid[] = #define MONTH_WIDTH_J 24 #define MONTH_WIDTH 18 -#define MAX_WIDTH 28 +#define MAX_WIDTH 64 typedef struct date date; @@ -159,6 +161,8 @@ char jdaystr[] = " 1 2 3 4 5 6 7 8 9" int flag_weeks; /* user wants number of week */ int nswitch; /* user defined switch date */ int nswitchb; /* switch date for backward compatibility */ +const char *term_r, *term_e; +int today; char *center(char *s, char *t, int w); wchar_t *wcenter(wchar_t *s, wchar_t *t, int w); @@ -199,6 +203,26 @@ main(int argc, char *argv[]) char *cp; /* character pointer */ char *flag_month = NULL; /* requested month as string */ const char *locale; /* locale to get country code */ + char tbuf[1024], cbuf[512], *b; + time_t t; + struct tm *tm1; + + term_e = term_r = NULL; + today = 0; + if (isatty(1) && tgetent(tbuf, getenv("TERM")) == 1) { + date dt; /* handy date */ + + b = cbuf; + term_r = tgetstr("mr", &b); + term_e = tgetstr("me", &b); + t = time(NULL); + tm1 = localtime(&t); + dt.y = tm1->tm_year + 1900; + dt.m = tm1->tm_mon + 1; + dt.d = tm1->tm_mday; + + today = sndaysb(&dt); + } /* * Use locale to determine the country code, @@ -334,12 +358,14 @@ main(int argc, char *argv[]) if (flag_easter) printeaster(y, flag_julian_cal, flag_orthodox); - else if (argc == 1 || flag_hole_year) + else if (argc == 1 || flag_hole_year) { + /* disable the highlight for now */ + today = 0; if (flag_backward) printyearb(y, flag_julian_day); else printyear(y, flag_julian_day); - else + } else if (flag_backward) printmonthb(y, m, flag_julian_day); else @@ -592,7 +618,7 @@ mkmonth(int y, int m, int jd_flag, struct monthlines *mlines) int dw; /* width of numbers */ int first; /* first day of month */ int firstm; /* first day of first week of month */ - int i, j, k; /* just indices */ + int i, j, k, l; /* just indices */ int last; /* the first day of next month */ int jan1 = 0; /* the first day of this year */ char *ds; /* pointer to day strings (daystr or @@ -640,17 +666,38 @@ mkmonth(int y, int m, int jd_flag, struct monthlines *mlines) * column is one day number. print column index: k. */ for (i = 0; i != 7; i++) { - for (j = firstm + i, k = 0; j < last; j += 7, k += dw) + l = 0; + for (j = firstm + i, k = 0; j < last; j += 7, k += dw) { + if (j == today && (term_r != NULL && term_e != NULL)) { + l = strlen(term_r); + if (jd_flag) + dt.d = j - jan1 + 1; + else + sdateb(j, &dt); + /* separator */ + mlines->lines[i][k] = ' '; + /* the actual text */ + memcpy(mlines->lines[i] + k + l, + ds + dt.d * dw, dw); + /* highlight on */ + memcpy(mlines->lines[i] + k + 1, term_r, l); + /* highlight off */ + memcpy(mlines->lines[i] + k + l + dw, term_e, + strlen(term_e)); + l = strlen(term_e) + strlen(term_r); + continue; + } if (j >= first) { if (jd_flag) dt.d = j - jan1 + 1; else sdate(j, &dt); - memcpy(mlines->lines[i] + k, + memcpy(mlines->lines[i] + k + l, ds + dt.d * dw, dw); } else - memcpy(mlines->lines[i] + k, " ", dw); - mlines->lines[i][k] = '\0'; + memcpy(mlines->lines[i] + k + l, " ", dw); + } + mlines->lines[i][k + l] = '\0'; } @@ -676,7 +723,7 @@ mkmonthb(int y, int m, int jd_flag, struct monthlines *mlines) int dw; /* width of numbers */ int first; /* first day of month */ int firsts; /* sunday of first week of month */ - int i, j, k; /* just indices */ + int i, j, k, l; /* just indices */ int jan1 = 0; /* the first day of this year */ int last; /* the first day of next month */ char *ds; /* pointer to day strings (daystr or @@ -737,21 +784,42 @@ mkmonthb(int y, int m, int jd_flag, struct monthlines *mlines) * column is one day number. print column index: k. */ for (i = 0; i != 6; i++) { + l = 0; for (j = firsts + 7 * i, k = 0; j < last && k != dw * 7; - j++, k += dw) + j++, k += dw) { + if (j == today && (term_r != NULL && term_e != NULL)) { + l = strlen(term_r); + if (jd_flag) + dt.d = j - jan1 + 1; + else + sdateb(j, &dt); + /* separator */ + mlines->lines[i][k] = ' '; + /* the actual text */ + memcpy(mlines->lines[i] + k + l, + ds + dt.d * dw, dw); + /* highlight on */ + memcpy(mlines->lines[i] + k + 1, term_r, l); + /* highlight off */ + memcpy(mlines->lines[i] + k + l + dw, term_e, + strlen(term_e)); + l = strlen(term_e) + strlen(term_r); + continue; + } if (j >= first) { if (jd_flag) dt.d = j - jan1 + 1; else sdateb(j, &dt); - memcpy(mlines->lines[i] + k, + memcpy(mlines->lines[i] + k + l, ds + dt.d * dw, dw); } else - memcpy(mlines->lines[i] + k, " ", dw); + memcpy(mlines->lines[i] + k + l, " ", dw); + } if (k == 0) mlines->lines[i][1] = '\0'; else - mlines->lines[i][k] = '\0'; + mlines->lines[i][k + l] = '\0'; } } -- cgit v1.1