LINE(CURSOR, "", COLOR_WHITE, COLOR_GREEN, A_BOLD), \
LINE(STATUS, "", COLOR_GREEN, COLOR_DEFAULT, 0), \
LINE(DELIMITER, "", COLOR_MAGENTA, COLOR_DEFAULT, 0), \
+LINE(LINE_NUMBER, "", COLOR_CYAN, COLOR_DEFAULT, 0), \
LINE(TITLE_BLUR, "", COLOR_WHITE, COLOR_BLUE, 0), \
LINE(TITLE_FOCUS, "", COLOR_WHITE, COLOR_BLUE, A_BOLD), \
LINE(MAIN_DATE, "", COLOR_BLUE, COLOR_DEFAULT, 0), \
LINE(BLAME_DATE, "", COLOR_BLUE, COLOR_DEFAULT, 0), \
LINE(BLAME_AUTHOR, "", COLOR_GREEN, COLOR_DEFAULT, 0), \
LINE(BLAME_COMMIT, "", COLOR_DEFAULT, COLOR_DEFAULT, 0), \
-LINE(BLAME_ID, "", COLOR_MAGENTA, COLOR_DEFAULT, 0), \
-LINE(BLAME_LINENO, "", COLOR_CYAN, COLOR_DEFAULT, 0)
+LINE(BLAME_ID, "", COLOR_MAGENTA, COLOR_DEFAULT, 0)
enum line_type {
#define LINE(type, line, fg, bg, attr) \
if (max < max_number)
max_number = max;
+ if (!selected)
+ wattrset(view->win, get_line_attr(LINE_LINE_NUMBER));
col = draw_text(view, number, max_number, showtrimmed, selected);
if (col < max) {
if (!selected)
OPEN_SPLIT = 1, /* Split current view. */
OPEN_BACKGROUNDED = 2, /* Backgrounded. */
OPEN_RELOAD = 4, /* Reload view even if it is the current. */
+ OPEN_NOMAXIMIZE = 8, /* Do not maximize the current view. */
};
static void
bool backgrounded = !!(flags & OPEN_BACKGROUNDED);
bool split = !!(flags & OPEN_SPLIT);
bool reload = !!(flags & OPEN_RELOAD);
+ bool nomaximize = !!(flags & OPEN_NOMAXIMIZE);
struct view *view = VIEW(request);
int nviews = displayed_views();
struct view *base_view = display[0];
display[1] = view;
if (!backgrounded)
current_view = 1;
- } else {
+ } else if (!nomaximize) {
/* Maximize the current view. */
memset(display, 0, sizeof(display));
current_view = 0;
if (view->pipe && view->lines == 0) {
/* Clear the old view and let the incremental updating refill
* the screen. */
- wclear(view->win);
+ werase(view->win);
report("");
} else {
redraw_view(view);
case REQ_TOGGLE_LINENO:
opt_line_number = !opt_line_number;
- redraw_display();
+ redraw_view(view);
break;
case REQ_TOGGLE_DATE:
opt_date = !opt_date;
- redraw_display();
+ redraw_view(view);
break;
case REQ_TOGGLE_AUTHOR:
opt_author = !opt_author;
- redraw_display();
+ redraw_view(view);
break;
case REQ_TOGGLE_REV_GRAPH:
opt_rev_graph = !opt_rev_graph;
- redraw_display();
+ redraw_view(view);
break;
case REQ_TOGGLE_REFS:
opt_show_refs = !opt_show_refs;
- redraw_display();
+ redraw_view(view);
break;
case REQ_PROMPT:
}
{
- if (!selected)
- wattrset(view->win, get_line_attr(LINE_BLAME_LINENO));
col += draw_lineno(view, lineno, view->width - col, selected);
if (col >= view->width)
return TRUE;
return REQ_NONE;
}
+static bool
+status_exists(struct status *status, enum line_type type)
+{
+ struct view *view = VIEW(REQ_VIEW_STATUS);
+ struct line *line;
+
+ for (line = view->line; line < view->line + view->lines; line++) {
+ struct status *pos = line->data;
+
+ if (line->type == type && pos &&
+ !strcmp(status->new.name, pos->new.name))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static FILE *
status_update_prepare(enum line_type type)
return TRUE;
}
-static void
+static bool
stage_update(struct view *view, struct line *line)
{
if (!opt_no_head && stage_line_type != LINE_STAT_UNTRACKED &&
(line->type == LINE_DIFF_CHUNK || !stage_status.status)) {
if (!stage_update_chunk(view, line)) {
report("Failed to apply chunk");
- return;
+ return FALSE;
}
} else if (!status_update_file(&stage_status, stage_line_type)) {
report("Failed to update file");
- return;
+ return FALSE;
}
- open_view(view, REQ_VIEW_STATUS, OPEN_RELOAD);
-
- view = VIEW(REQ_VIEW_STATUS);
- if (view_is_displayed(view))
- status_enter(view, &view->line[view->lineno]);
+ return TRUE;
}
static enum request
open_editor(stage_status.status != '?', stage_status.new.name);
break;
+ case REQ_REFRESH:
+ /* Reload everything ... */
+ break;
+
case REQ_VIEW_BLAME:
if (stage_status.new.name[0]) {
string_copy(opt_file, stage_status.new.name);
return request;
case REQ_ENTER:
- pager_request(view, request, line);
- break;
+ return pager_request(view, request, line);
default:
return request;
}
+ open_view(view, REQ_VIEW_STATUS, OPEN_RELOAD | OPEN_NOMAXIMIZE);
+
+ /* Check whether the staged entry still exists, and close the
+ * stage view if it doesn't. */
+ if (!status_exists(&stage_status, stage_line_type))
+ return REQ_VIEW_CLOSE;
+
+ if (stage_line_type == LINE_STAT_UNTRACKED)
+ opt_pipe = fopen(stage_status.new.name, "r");
+ else
+ string_copy(opt_cmd, view->cmd);
+ open_view(view, REQ_VIEW_STAGE, OPEN_RELOAD | OPEN_NOMAXIMIZE);
+
return REQ_NONE;
}