X-Git-Url: https://git.distorted.org.uk/~mdw/tig/blobdiff_plain/21be28fb8413c6b0f01ae9423824213be2d4177d..d9c49e6ec76ac311bbe9a1d0d3699ff4be79e64f:/tig.c diff --git a/tig.c b/tig.c index 70bf7f3..fcfbc43 100644 --- a/tig.c +++ b/tig.c @@ -12,7 +12,7 @@ */ #ifndef VERSION -#define VERSION "tig-0.4.git" +#define VERSION "tig-0.5.git" #endif #ifndef DEBUG @@ -451,6 +451,14 @@ parse_options(int argc, char *argv[]) for (i = 1; i < argc; i++) { char *opt = argv[i]; + if (!strcmp(opt, "log") || + !strcmp(opt, "diff") || + !strcmp(opt, "show")) { + opt_request = opt[0] == 'l' + ? REQ_VIEW_LOG : REQ_VIEW_DIFF; + break; + } + if (opt[0] && opt[0] != '-') break; @@ -489,14 +497,6 @@ parse_options(int argc, char *argv[]) break; } - if (!strcmp(opt, "log") || - !strcmp(opt, "diff") || - !strcmp(opt, "show")) { - opt_request = opt[0] == 'l' - ? REQ_VIEW_LOG : REQ_VIEW_DIFF; - break; - } - die("unknown option '%s'\n\n%s", opt, usage); } @@ -730,9 +730,6 @@ static struct keybinding default_keybindings[] = { { 'g', REQ_TOGGLE_REV_GRAPH }, { ':', REQ_PROMPT }, - /* wgetch() with nodelay() enabled returns ERR when there's no input. */ - { ERR, REQ_NONE }, - /* Using the ncurses SIGWINCH handler. */ { KEY_RESIZE, REQ_SCREEN_RESIZE }, }; @@ -767,10 +764,9 @@ static struct keybinding *keybindings[ARRAY_SIZE(keymap_table)]; static void add_keybinding(enum keymap keymap, enum request request, int key) { - struct keybinding *keybinding = keybindings[keymap]; + struct keybinding *keybinding; - if (!keybinding) - keybinding = calloc(1, sizeof(*keybinding)); + keybinding = calloc(1, sizeof(*keybinding)); if (!keybinding) die("Failed to allocate keybinding"); @@ -1368,8 +1364,8 @@ update_view_title(struct view *view) else wbkgdset(view->title, get_line_attr(LINE_TITLE_BLUR)); - werase(view->title); mvwaddnstr(view->title, 0, 0, buf, bufpos); + wclrtoeol(view->title); wmove(view->title, 0, view->width - 1); if (input_mode) @@ -1878,7 +1874,7 @@ update_view(struct view *view) size_t ret; - ret = iconv(opt_iconv, &inbuf, &inlen, &outbuf, &outlen); + ret = iconv(opt_iconv, (const char **) &inbuf, &inlen, &outbuf, &outlen); if (ret != (size_t) -1) { line = out_buffer; linelen = strlen(out_buffer); @@ -2687,7 +2683,7 @@ static struct view_ops blob_ops = { struct commit { char id[SIZEOF_REV]; /* SHA1 ID. */ - char title[75]; /* First line of the commit message. */ + char title[128]; /* First line of the commit message. */ char author[75]; /* Author of the commit. */ struct tm time; /* Date from the author ident. */ struct ref **refs; /* Repository references. */ @@ -2891,13 +2887,19 @@ main_read(struct view *view, char *line) /* Require titles to start with a non-space character at the * offset used by git log. */ - /* FIXME: More gracefull handling of titles; append "..." to - * shortened titles, etc. */ - if (strncmp(line, " ", 4) || - isspace(line[4])) + if (strncmp(line, " ", 4)) break; + line += 4; + /* Well, if the title starts with a whitespace character, + * try to be forgiving. Otherwise we end up with no title. */ + while (isspace(*line)) + line++; + if (*line == '\0') + break; + /* FIXME: More graceful handling of titles; append "..." to + * shortened titles, etc. */ - string_copy(commit->title, line + 4); + string_copy(commit->title, line); } return TRUE; @@ -3148,7 +3150,6 @@ report(const char *msg, ...) va_start(args, msg); - werase(status_win); wmove(status_win, 0, 0); if (*msg) { vwprintw(status_win, msg, args); @@ -3156,6 +3157,7 @@ report(const char *msg, ...) } else { status_empty = TRUE; } + wclrtoeol(status_win); wrefresh(status_win); va_end(args); @@ -3269,12 +3271,12 @@ read_prompt(const char *prompt) } } - if (status == CANCEL) { - /* Clear the status window */ - status_empty = FALSE; - report(""); + /* Clear the status window */ + status_empty = FALSE; + report(""); + + if (status == CANCEL) return NULL; - } buf[pos++] = 0; @@ -3533,6 +3535,13 @@ main(int argc, char *argv[]) /* Refresh, accept single keystroke of input */ key = wgetch(status_win); + /* wgetch() with nodelay() enabled returns ERR when there's no + * input. */ + if (key == ERR) { + request = REQ_NONE; + continue; + } + request = get_keybinding(display[current_view]->keymap, key); /* Some low-level request handling. This keeps access to