summaryrefslogtreecommitdiffstats
path: root/usr.bin/ncal
diff options
context:
space:
mode:
authorrdivacky <rdivacky@FreeBSD.org>2009-04-20 18:19:38 +0000
committerrdivacky <rdivacky@FreeBSD.org>2009-04-20 18:19:38 +0000
commitbeb2b3b1a7ecbf3182043b3a292dac2ef792a200 (patch)
tree06dadcdc90f82cf3995d12c4491e3440a6fe2a97 /usr.bin/ncal
parent6033ad3037c1f12a56a736f100f719cb4c42e7f6 (diff)
downloadFreeBSD-src-beb2b3b1a7ecbf3182043b3a292dac2ef792a200.zip
FreeBSD-src-beb2b3b1a7ecbf3182043b3a292dac2ef792a200.tar.gz
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 <corecode fs.ei.tum.de> Approved by: ed
Diffstat (limited to 'usr.bin/ncal')
-rw-r--r--usr.bin/ncal/Makefile2
-rw-r--r--usr.bin/ncal/ncal.c94
2 files changed, 82 insertions, 14 deletions
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 <unistd.h>
#include <wchar.h>
#include <wctype.h>
+#include <term.h>
+#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';
}
}
OpenPOWER on IntegriCloud