summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 6908bdb)
raw | patch | inline | side by side (parent: 6908bdb)
author | Jonas Fonseca <fonseca@diku.dk> | |
Thu, 11 May 2006 00:41:32 +0000 (02:41 +0200) | ||
committer | Jonas Fonseca <fonseca@antimatter.localdomain> | |
Thu, 11 May 2006 00:41:32 +0000 (02:41 +0200) |
tig.c | patch | blob | history |
index 882b2fd537b6ac5d9ee78a1a3f9b7cef74051a76..90e9e5f022a79abe0cd250ba423891201a1798dc 100644 (file)
--- a/tig.c
+++ b/tig.c
static char opt_cmd[SIZEOF_CMD] = "";
static FILE *opt_pipe = NULL;
-char ref_head[SIZEOF_REF] = "HEAD";
-char ref_commit[SIZEOF_REF] = "HEAD";
-
/* Returns the index of log or diff command or -1 to exit. */
static int
parse_options(int argc, char *argv[])
struct view {
const char *name; /* View name */
- const char *defcmd; /* Default command line */
+ const char *cmdfmt; /* Default command line format */
char *id; /* Points to either of ref_{head,commit} */
size_t objsize; /* Size of objects in the line index */
} *ops;
char cmd[SIZEOF_CMD]; /* Command buffer */
- char ref[SIZEOF_REF]; /* Hovered Commit reference */
- /* The view reference that describes the content of this view. */
- char vref[SIZEOF_REF];
+ char ref[SIZEOF_REF]; /* Hovered commit reference */
+ char vid[SIZEOF_REF]; /* View ID. Set to id member when updating. */
WINDOW *win;
WINDOW *title;
#define HELP_CMD \
"man tig 2> /dev/null"
+char ref_head[SIZEOF_REF] = "HEAD";
+char ref_commit[SIZEOF_REF] = "HEAD";
+
static struct view views[] = {
{ "main", MAIN_CMD, ref_head, sizeof(struct commit), &main_ops },
{ "diff", DIFF_CMD, ref_commit, sizeof(char), &pager_ops },
string_copy(view->cmd, opt_cmd);
opt_cmd[0] = 0;
} else {
- if (snprintf(view->cmd, sizeof(view->cmd), view->defcmd,
+ if (snprintf(view->cmd, sizeof(view->cmd), view->cmdfmt,
id, id, id) >= sizeof(view->cmd))
return FALSE;
}
view->offset = 0;
view->lines = 0;
view->lineno = 0;
+ string_copy(view->vid, id);
if (view->line) {
int i;
return FALSE;
}
+enum open_flags {
+ OPEN_DEFAULT = 0, /* Use default view switching. */
+ OPEN_SPLIT = 1, /* Split current view. */
+ OPEN_BACKGROUNDED = 2, /* Backgrounded. */
+ OPEN_RELOAD = 4, /* Reload view even if it is the current. */
+};
+
static void
-switch_view(struct view *prev, enum request request,
- bool backgrounded, bool split)
+open_view(struct view *prev, enum request request, enum open_flags flags)
{
+ bool backgrounded = !!(flags & OPEN_BACKGROUNDED);
+ bool split = !!(flags & OPEN_SPLIT);
+ bool reload = !!(flags & OPEN_RELOAD);
struct view *view = VIEW(request);
struct view *displayed;
int nviews;
}
}
- if (view == prev && nviews == 1) {
+ if (view == prev && nviews == 1 && !reload) {
report("Already in %s view", view->name);
return;
}
- if (strcmp(view->vref, view->id) &&
+ if (strcmp(view->vid, view->id) &&
!begin_update(view)) {
report("Failed to load %s view", view->name);
return;
case REQ_VIEW_LOG:
case REQ_VIEW_HELP:
case REQ_VIEW_PAGER:
- switch_view(view, request, FALSE, FALSE);
+ open_view(view, request, OPEN_DEFAULT);
break;
case REQ_ENTER:
break;
case REQ_PROMPT:
- switch_view(view, opt_request, FALSE, FALSE);
+ open_view(view, opt_request, OPEN_RELOAD);
break;
case REQ_STOP_LOADING:
char *line = view->line[view->lineno];
if (get_line_type(line) == LINE_COMMIT) {
- switch_view(view, REQ_VIEW_DIFF, FALSE, FALSE);
+ open_view(view, REQ_VIEW_DIFF, OPEN_DEFAULT);
}
return TRUE;
if (view->offset + lineno == view->lineno) {
string_copy(view->ref, commit->id);
+ string_copy(ref_commit, view->ref);
type = LINE_CURSOR;
} else {
type = LINE_MAIN_COMMIT;
static bool
main_enter(struct view *view)
{
- switch_view(view, REQ_VIEW_DIFF, TRUE, TRUE);
+ open_view(view, REQ_VIEW_DIFF, OPEN_SPLIT | OPEN_BACKGROUNDED);
return TRUE;
}
* input. */
nocbreak();
echo();
- if (wgetnstr(status_win, opt_cmd, sizeof(opt_cmd)) == OK)
- die("%s", opt_cmd);
+
+ if (wgetnstr(status_win, opt_cmd + 4, sizeof(opt_cmd) - 4) == OK) {
+ memcpy(opt_cmd, "git ", 4);
+ opt_request = REQ_VIEW_PAGER;
+ } else {
+ request = ERR;
+ }
+
noecho();
cbreak();
}