From owner-svn-src-all@FreeBSD.ORG Mon Apr 20 18:19:39 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0BC18106566C; Mon, 20 Apr 2009 18:19:39 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E3C518FC13; Mon, 20 Apr 2009 18:19:38 +0000 (UTC) (envelope-from rdivacky@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n3KIJcgP054308; Mon, 20 Apr 2009 18:19:38 GMT (envelope-from rdivacky@svn.freebsd.org) Received: (from rdivacky@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n3KIJcZo054306; Mon, 20 Apr 2009 18:19:38 GMT (envelope-from rdivacky@svn.freebsd.org) Message-Id: <200904201819.n3KIJcZo054306@svn.freebsd.org> From: Roman Divacky Date: Mon, 20 Apr 2009 18:19:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r191330 - head/usr.bin/ncal X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Apr 2009 18:19:39 -0000 Author: rdivacky Date: Mon Apr 20 18:19:38 2009 New Revision: 191330 URL: http://svn.freebsd.org/changeset/base/191330 Log: 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 Modified: head/usr.bin/ncal/Makefile head/usr.bin/ncal/ncal.c Modified: head/usr.bin/ncal/Makefile ============================================================================== --- head/usr.bin/ncal/Makefile Mon Apr 20 17:39:44 2009 (r191329) +++ head/usr.bin/ncal/Makefile Mon Apr 20 18:19:38 2009 (r191330) @@ -3,7 +3,7 @@ PROG= ncal DPADD= ${LIBCALENDAR} -LDADD= -lcalendar +LDADD= -lcalendar -ltermcap WARNS?= 1 LINKS= ${BINDIR}/ncal ${BINDIR}/cal Modified: head/usr.bin/ncal/ncal.c ============================================================================== --- head/usr.bin/ncal/ncal.c Mon Apr 20 17:39:44 2009 (r191329) +++ head/usr.bin/ncal/ncal.c Mon Apr 20 18:19:38 2009 (r191330) @@ -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 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, struc 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, struc * 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, stru 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, stru * 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'; } }