#define foreach_view(view, i) \
for (i = 0; i < ARRAY_SIZE(display) && (view = display[i]); i++)
+#define displayed_views() (display[1] != NULL ? 2 : 1)
/**
* Current head and commit ID
* Incremental updating
*/
+static void
+end_update(struct view *view)
+{
+ if (!view->pipe)
+ return;
+ set_nonblocking_input(FALSE);
+ if (view->pipe == stdin)
+ fclose(view->pipe);
+ else
+ pclose(view->pipe);
+ view->pipe = NULL;
+}
+
static bool
begin_update(struct view *view)
{
const char *id = view->id;
+ if (view->pipe)
+ end_update(view);
+
if (opt_cmd[0]) {
string_copy(view->cmd, opt_cmd);
opt_cmd[0] = 0;
return TRUE;
}
-static void
-end_update(struct view *view)
-{
- if (!view->pipe)
- return;
- set_nonblocking_input(FALSE);
- if (view->pipe == stdin)
- fclose(view->pipe);
- else
- pclose(view->pipe);
- view->pipe = NULL;
-}
-
static bool
update_view(struct view *view)
{
bool split = !!(flags & OPEN_SPLIT);
bool reload = !!(flags & OPEN_RELOAD);
struct view *view = VIEW(request);
- int nviews = display[1] ? 2 : 1;
+ int nviews = displayed_views();
+ struct view *base_view = display[0];
if (view == prev && nviews == 1 && !reload) {
report("Already in %s view", view->name);
display[current_view] = view;
}
- resize_display();
+ /* Resize the view when switching between split- and full-screen,
+ * or when switching between two different full-screen views. */
+ if (nviews != displayed_views() ||
+ (nviews == 1 && base_view != display[0]))
+ resize_display();
if (split && prev->lineno - prev->offset >= prev->height) {
/* Take the title line into account. */
}
if (prev && view != prev) {
- /* "Blur" the previous view. */
- if (!backgrounded)
- update_view_title(prev);
-
/* Continue loading split views in the background. */
if (!split)
end_update(prev);
+ else if (!backgrounded)
+ /* "Blur" the previous view. */
+ update_view_title(prev);
+
view->parent = prev;
}
if (view == VIEW(REQ_VIEW_DIFF) &&
view->parent == VIEW(REQ_VIEW_MAIN)) {
- bool redraw = display[0] == VIEW(REQ_VIEW_MAIN);
+ bool redraw = display[1] == view;
view = view->parent;
move_view(view, request, redraw);
- update_view_title(view);
+ if (redraw)
+ update_view_title(view);
} else {
move_view(view, request, TRUE);
break;
case REQ_VIEW_NEXT:
{
- int nviews = display[1] ? 2 : 1;
+ int nviews = displayed_views();
int next_view = (current_view + 1) % nviews;
if (next_view == current_view) {