index 7cdd3eaa3371202ed2016eec4cb2e9ec03545295..a31d18eb23bd1213610bc94fe78f09e2836bff8d 100644 (file)
--- a/tig.c
+++ b/tig.c
LINE(COMMITTER, "committer ", COLOR_MAGENTA, COLOR_DEFAULT, 0), \
LINE(SIGNOFF, " Signed-off-by", COLOR_YELLOW, COLOR_DEFAULT, 0), \
LINE(ACKED, " Acked-by", COLOR_YELLOW, COLOR_DEFAULT, 0), \
+LINE(TESTED, " Tested-by", COLOR_YELLOW, COLOR_DEFAULT, 0), \
+LINE(REVIEWED, " Reviewed-by", COLOR_YELLOW, COLOR_DEFAULT, 0), \
LINE(DEFAULT, "", COLOR_DEFAULT, COLOR_DEFAULT, A_NORMAL), \
LINE(CURSOR, "", COLOR_WHITE, COLOR_GREEN, A_BOLD), \
LINE(STATUS, "", COLOR_GREEN, COLOR_DEFAULT, 0), \
add_keybinding(enum keymap keymap, enum request request, int key)
{
struct keybinding_table *table = &keybindings[keymap];
+ size_t i;
+
+ for (i = 0; i < keybindings[keymap].size; i++) {
+ if (keybindings[keymap].data[i].alias == key) {
+ keybindings[keymap].data[i].request = request;
+ return;
+ }
+ }
table->data = realloc(table->data, (table->size + 1) * sizeof(*table->data));
if (!table->data)
int i;
for (i = 0; i < ARRAY_SIZE(reqs); i++) {
- enum request req;
+ enum request req = get_keybinding(reqs[i].keymap, reqs[i].key);
+ if (req != reqs[i].key)
+ continue;
req = add_run_request(reqs[i].keymap, reqs[i].key, reqs[i].argc, reqs[i].argv);
if (req != REQ_NONE)
add_keybinding(reqs[i].keymap, req, reqs[i].key);
return ERR;
}
- if (set_keymap(&keymap, argv[0]) == ERR) {
+ if (!set_keymap(&keymap, argv[0])) {
config_msg = "Unknown key map";
return ERR;
}
const char *tigrc_system = getenv("TIGRC_SYSTEM");
char buf[SIZEOF_STR];
- add_builtin_run_requests();
-
if (!tigrc_system)
tigrc_system = SYSCONFDIR "/tigrc";
load_option_file(tigrc_system);
}
load_option_file(tigrc_user);
+ /* Add _after_ loading config files to avoid adding run requests
+ * that conflict with keybindings. */
+ add_builtin_run_requests();
+
return OK;
}
/* If non-NULL, points to the view that opened this view. If this view
* is closed tig will switch back to the parent view. */
struct view *parent;
+ struct view *prev;
/* Buffering */
size_t lines; /* Total number of lines */
#define view_is_displayed(view) \
(view == display[0] || view == display[1])
-#define view_has_parent(view, child_type, parent_type) \
- (view->type == child_type && view->parent && view->parent->type == parent_type)
+
+/*
+ * View drawing.
+ */
static inline void
set_view_attr(struct view *view, enum line_type type)
}
}
+
+/*
+ * Option management
+ */
+
static void
toggle_enum_option_do(unsigned int *opt, const char *help,
const struct enum_map *map, size_t size)
end_update(view, TRUE);
} else if (io_eof(view->pipe)) {
- report("");
+ if (view_is_displayed(view))
+ report("");
end_update(view, FALSE);
}
if (split) {
display[1] = view;
current_view = 1;
+ view->parent = prev;
} else if (!nomaximize) {
/* Maximize the current view. */
memset(display, 0, sizeof(display));
display[current_view] = view;
}
- /* No parent signals that this is the first loaded view. */
+ /* No prev signals that this is the first loaded view. */
if (prev && view != prev) {
- view->parent = prev;
+ view->prev = prev;
}
/* Resize the view when switching between split- and full-screen,
case REQ_PREVIOUS:
request = request == REQ_NEXT ? REQ_MOVE_DOWN : REQ_MOVE_UP;
- if (view_has_parent(view, VIEW_DIFF, VIEW_MAIN) ||
- view_has_parent(view, VIEW_DIFF, VIEW_BLAME) ||
- view_has_parent(view, VIEW_STAGE, VIEW_STATUS) ||
- view_has_parent(view, VIEW_BLOB, VIEW_TREE) ||
- view_has_parent(view, VIEW_MAIN, VIEW_BRANCH)) {
+ if (view->parent) {
int line;
view = view->parent;
break;
case REQ_VIEW_CLOSE:
- /* XXX: Mark closed views by letting view->parent point to the
+ /* XXX: Mark closed views by letting view->prev point to the
* view itself. Parents to closed view should never be
* followed. */
- if (view->parent &&
- view->parent->parent != view->parent) {
- maximize_view(view->parent);
- view->parent = view;
+ if (view->prev && view->prev != view) {
+ maximize_view(view->prev);
+ view->prev = view;
break;
}
/* Fall-through */
return FALSE;
}
- if (parents > 1 && !open_commit_parent_menu(buf, &parents))
+ if (parents == 1)
+ parents = 0;
+ else if (!open_commit_parent_menu(buf, &parents))
return FALSE;
string_copy_rev(rev, &buf[41 * parents]);
break;
case LINE_TREE_FILE:
- flags = display[0] == view ? OPEN_SPLIT : OPEN_DEFAULT;
+ flags = view_is_displayed(view) ? OPEN_SPLIT : OPEN_DEFAULT;
request = REQ_VIEW_BLOB;
break;
{
char path[SIZEOF_STR];
- if (!view->parent && *opt_prefix) {
+ if (!view->prev && *opt_prefix) {
string_copy(path, opt_file);
if (!string_format(opt_file, "%s%s", opt_prefix, path))
return FALSE;
const char **argv = *opt_ref ? blame_ref_argv : blame_head_argv;
struct io io = {};
- if (view->lines == 0 && !view->parent)
+ if (view->lines == 0 && !view->prev)
die("No blame exist for %s", view->vid);
if (view->lines == 0 || !io_run_rd(&io, argv, opt_cdup, FORMAT_ALL)) {
static enum request
blame_request(struct view *view, enum request request, struct line *line)
{
- enum open_flags flags = display[0] == view ? OPEN_SPLIT : OPEN_DEFAULT;
+ enum open_flags flags = view_is_displayed(view) ? OPEN_SPLIT : OPEN_DEFAULT;
struct blame *blame = line->data;
switch (request) {
die("line type %d not handled in switch", line->type);
}
- split = view_is_displayed(view) ? OPEN_SPLIT : 0;
+ split = view_is_displayed(view) ? OPEN_SPLIT : OPEN_DEFAULT;
open_view(view, REQ_VIEW_STAGE, OPEN_PREPARED | split);
if (view_is_displayed(VIEW(REQ_VIEW_STAGE))) {
if (status) {
if (!line) {
int i;
- if (!view->lines && !view->parent)
+ if (!view->lines && !view->prev)
die("No revisions match the given arguments.");
if (view->lines > 0) {
commit = view->line[view->lines - 1].data;
static enum request
main_request(struct view *view, enum request request, struct line *line)
{
- enum open_flags flags = display[0] == view ? OPEN_SPLIT : OPEN_DEFAULT;
+ enum open_flags flags = view_is_displayed(view) ? OPEN_SPLIT : OPEN_DEFAULT;
switch (request) {
case REQ_ENTER: