Addresses issue #879
This commit is contained in:
parent
3142eb2fda
commit
d3914ef90e
@ -1210,15 +1210,48 @@ void Fl_Terminal::update_scrollbar(void) {
|
|||||||
scrollbar->redraw(); // redraw scroll always
|
scrollbar->redraw(); // redraw scroll always
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refit the display to match screen
|
// Refit the display - (display_rows()/cols()) to match screen (scrn_.h()/w())
|
||||||
|
// This implements an xterm-like resizing behavior. Refer to README-Fl_Terminal.txt,
|
||||||
|
// section "TERMINAL RESIZING" for a diagram of cases showing how this is implemented.
|
||||||
|
// See also issue #879.
|
||||||
|
//
|
||||||
void Fl_Terminal::refit_disp_to_screen(void) {
|
void Fl_Terminal::refit_disp_to_screen(void) {
|
||||||
int dh = h_to_row(scrn_.h()); // height in rows for tty pixel height
|
int dh = h_to_row(scrn_.h()); // disp height: in rows for tty pixel height
|
||||||
int dw = MAX(w_to_col(scrn_.w()), disp_cols()); // width in cols for tty pixel width - enlarge only!
|
int dw = MAX(w_to_col(scrn_.w()), disp_cols()); // disp width: in cols from pixel width - enlarge only!
|
||||||
int drows = clamp(dh, 2, dh); // 2 rows minimum
|
int drows = clamp(dh, 2, dh); // disp rows: 2 rows minimum
|
||||||
int dcols = clamp(dw, 10, dw); // 10 cols minimum
|
int dcols = clamp(dw, 10, dw); // disp cols: 10 cols minimum
|
||||||
int drow_diff = drows - display_rows(); // change in rows?
|
int drow_diff = drows - display_rows(); // disp row diff: change in rows?
|
||||||
ring_.resize(drows, dcols, hist_rows(), *current_style_);
|
int is_enlarge = drows >= display_rows(); // enlarging display size?
|
||||||
cursor_.scroll(-drow_diff);
|
|
||||||
|
// NOTE: Zeroing scrollbar can be avoided if we took the scroll position
|
||||||
|
// into account for the below calculations. But for now..
|
||||||
|
scrollbar->value(0); // force scrollbar to bottom before refit
|
||||||
|
|
||||||
|
if (drow_diff) { // change in display rows means shrink|enlarge
|
||||||
|
if (is_enlarge) { // enlarging widget?
|
||||||
|
for (int i=0; i<drow_diff; i++) { // carefully loop thru each change
|
||||||
|
if (history_use() > 0) { // CASE 1: Drag lines down from history
|
||||||
|
cursor_.scroll(-1); // cursor chases ring_.resize()
|
||||||
|
} else { // CASE 2: add blank lines below cursor
|
||||||
|
scroll(1); // scroll up to create blank lines at bottom
|
||||||
|
}
|
||||||
|
// Handle enlarging ring's display
|
||||||
|
ring_.resize(display_rows()+1, dcols, hist_rows(), *current_style_);
|
||||||
|
}
|
||||||
|
} else { // shrinking widget?
|
||||||
|
for (int i=0; i<(-drow_diff); i++) { // carefully loop thru each row change
|
||||||
|
int cur_row = cursor_.row(); // cursor row
|
||||||
|
int below_cur = (drows > cur_row); // shrink is below cursor row?
|
||||||
|
if (below_cur) { // CASE 3: shrinking below cursor? drop lines below
|
||||||
|
ring_.disp_rows(display_rows() - 1); // effectively "deletes" lines below cursor
|
||||||
|
} else { // CASE 4: need to move cursor + lines up into hist
|
||||||
|
cursor_up(-1, false); // move cursor down to follow ring_.resize()
|
||||||
|
// Handle shrinking ring's display up into history
|
||||||
|
ring_.resize(display_rows()-1, dcols, hist_rows(), *current_style_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
clear_mouse_selection();
|
clear_mouse_selection();
|
||||||
update_screen(false);
|
update_screen(false);
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,51 @@ Some terminal operations necessarily call redraw() directly, such as interactive
|
|||||||
selection, or during user scrolling the terminal's scrollbar, where it's important there's
|
selection, or during user scrolling the terminal's scrollbar, where it's important there's
|
||||||
no delay in what the user sees while interacting directly with the widget.
|
no delay in what the user sees while interacting directly with the widget.
|
||||||
|
|
||||||
|
TERMINAL RESIZING
|
||||||
|
=================
|
||||||
|
Resizing currently follows xterm(1) style behavior:
|
||||||
|
|
||||||
|
CASE 1: ENLARGE, USING HISTORY:
|
||||||
|
-2 Line 1 ┐_ scrollback
|
||||||
|
-1 Line 2 ┘ history
|
||||||
|
┌──────────────────┐ ┌──────────────────┐
|
||||||
|
1│ Hello! │ 1│ Line 1 │
|
||||||
|
2│ ▒ │ enlarge 2│ Line 2 │
|
||||||
|
└──────────────────┘ ──┐ 3│ Hello! │
|
||||||
|
│ 4│ ▒ │
|
||||||
|
└──────> └──────────────────┘
|
||||||
|
┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄
|
||||||
|
CASE 2: ENLARGE, ADDING LINES BELOW CURSOR
|
||||||
|
┌──────────────────┐ ┌──────────────────┐
|
||||||
|
1│ Line 1 │ 1│ Line 1 │
|
||||||
|
2│ Line 2 │ enlarge 2│ Line 2 │
|
||||||
|
3│ Hello! │ 3│ Hello! │
|
||||||
|
4│ ▒ │ 4│ ▒ │
|
||||||
|
└──────────────────┘ ──┐ 5│ │
|
||||||
|
│ 6│ │
|
||||||
|
└──────> └──────────────────┘
|
||||||
|
┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄
|
||||||
|
CASE 3: SHRINK, TRIMMING LINES BELOW CURSOR
|
||||||
|
┌──────────────────┐ ┌──────────────────┐
|
||||||
|
1│ Line 1 │ 1│ Line 1 │
|
||||||
|
2│ Line 2 │ 2│ Line 2 │
|
||||||
|
3│ Hello! │ resize 3│ Hello! │
|
||||||
|
4│ ▒ │ 4│ ▒ │
|
||||||
|
5│ │ ╭────> └──────────────────┘
|
||||||
|
6│ │ │ 5 ┐ Lines below cursor erased
|
||||||
|
└──────────────────┘ ──╯ 6 ┘ (regardless of contents)
|
||||||
|
┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄ ┄
|
||||||
|
CASE 4: SHRINK, PUSH TO HISTORY: -2 Line 1 ┐_ moved into
|
||||||
|
-1 Line 2 ┘ scrollback history
|
||||||
|
┌──────────────────┐ ┌──────────────────┐
|
||||||
|
1│ Line 1 │ 1│ Hello! │
|
||||||
|
2│ Line 2 │ resize 2│ ▒ │
|
||||||
|
3│ Hello! │ ╭────> └──────────────────┘
|
||||||
|
4│ ▒ │ │
|
||||||
|
└──────────────────┘ ──╯
|
||||||
|
|
||||||
|
These case numbers (CASE 1 tru 4) are referenced in the source code for
|
||||||
|
Fl_Terminal::refit_disp_to_screen(void).
|
||||||
|
|
||||||
|
|
||||||
OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD
|
OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD
|
||||||
|
Loading…
Reference in New Issue
Block a user