+
+ getmaxyx(stdscr, y, x);
+
+ titlewin = newwin(1, 0, 0, 0);
+
+ wattrset(titlewin, COLOR_PAIR(COLOR_GREEN));
+ waddch(titlewin, ACS_VLINE);
+ wprintw(titlewin, "%s", "cg-view");
+ waddch(titlewin, ACS_LTEE);
+ whline(titlewin, ACS_HLINE, x);
+ wrefresh(titlewin);
+
+ statuswin = newwin(1, 0, y - 1, 0);
+
+ wattrset(statuswin, COLOR_PAIR(COLOR_GREEN));
+ wprintw(statuswin, "%s", CGIT_HELP);
+ wrefresh(statuswin);
+
+ mainwin = newwin(y - 2, 0, 1, 0);
+ scrollok(mainwin, TRUE);
+ keypad(mainwin, TRUE); /* enable keyboard mapping */
+}
+
+/*
+ * Pipe filters
+ */
+
+#define DIFF_CMD \
+ "git-rev-list $(git-rev-parse --since=1.month) HEAD^..HEAD | " \
+ "git-diff-tree --stdin --pretty -r --cc --always"
+
+
+#define LOG_CMD \
+ "git-rev-list $(git-rev-parse --since=1.month) HEAD | " \
+ "git-diff-tree --stdin --pretty -r"
+
+static void
+log_filter(char *line, int lineno)
+{
+ static int log_filter_skip;
+
+ if (!line) {
+ wattrset(mainwin, A_NORMAL);
+ log_filter_skip = 0;
+ return;
+ }
+
+ if (!strncmp("commit ", line, 7)) {
+ attrset(COLOR_PAIR(COLOR_GREEN));
+
+ } else if (!strncmp("Author: ", line, 8)) {
+ wattrset(mainwin, COLOR_PAIR(COLOR_CYAN));
+
+ } else if (!strncmp("Date: ", line, 6)) {
+ wattrset(mainwin, COLOR_PAIR(COLOR_YELLOW));
+
+ } else if (!strncmp("diff --git ", line, 11)) {
+ wattrset(mainwin, COLOR_PAIR(COLOR_YELLOW));
+
+ } else if (!strncmp("diff-tree ", line, 10)) {
+ wattrset(mainwin, COLOR_PAIR(COLOR_BLUE));
+
+ } else if (!strncmp("index ", line, 6)) {
+ wattrset(mainwin, COLOR_PAIR(COLOR_BLUE));
+
+ } else if (line[0] == '-') {
+ wattrset(mainwin, COLOR_PAIR(COLOR_RED));
+
+ } else if (line[0] == '+') {
+ wattrset(mainwin, COLOR_PAIR(COLOR_GREEN));
+
+ } else if (line[0] == '@') {
+ wattrset(mainwin, COLOR_PAIR(COLOR_MAGENTA));
+
+ } else if (line[0] == ':') {
+ log_filter_skip = 1;
+ return;
+
+ } else if (log_filter_skip) {
+ log_filter_skip = 0;
+ return;
+
+ } else {
+ wattrset(mainwin, A_NORMAL);
+ }
+
+ mvwaddstr(mainwin, lineno, 0, line);
+}
+
+static FILE *
+open_pipe(char *cmd, pipe_filter_T filter)
+{
+ pipe = popen(cmd, "r");
+ pipe_lineno = 1;
+ pipe_filter = filter;
+ return pipe;
+}
+
+static void
+read_pipe(int lines)
+{
+ char buffer[BUFSIZ];
+ char *line;
+
+ while ((line = fgets(buffer, sizeof(buffer), pipe))) {
+ pipe_filter(line, pipe_lineno++);
+ if (!--lines)
+ break;
+ }
+
+ if (feof(pipe) || ferror(pipe)) {
+ pipe_filter(NULL, pipe_lineno - 1);
+ pclose(pipe);
+ pipe = NULL;
+ pipe_filter = NULL;
+ }