Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam
2026-06-29 20:15:07 +01:00
8 changed files with 73 additions and 95 deletions

View File

@@ -235,7 +235,7 @@ cmd_resize_pane_mouse_resize_move_floating(struct client *c,
struct window_pane *wp; struct window_pane *wp;
struct layout_cell *lc; struct layout_cell *lc;
int y, ly, x, lx, sx, sy, new_sx, new_sy; int y, ly, x, lx, sx, sy, new_sx, new_sy;
int scrollbars, sb_pos, left, right; int left, right;
int new_xoff, new_yoff, resizes = 0; int new_xoff, new_yoff, resizes = 0;
wp = cmd_mouse_pane(m, NULL, &wl); wp = cmd_mouse_pane(m, NULL, &wl);
@@ -247,15 +247,13 @@ cmd_resize_pane_mouse_resize_move_floating(struct client *c,
lc = wp->layout_cell; lc = wp->layout_cell;
sx = wp->sx; sx = wp->sx;
sy = wp->sy; sy = wp->sy;
scrollbars = options_get_number(w->options, "pane-scrollbars");
sb_pos = options_get_number(w->options, "pane-scrollbars-position");
left = wp->xoff - 1; left = wp->xoff - 1;
right = wp->xoff + sx; right = wp->xoff + sx;
if (window_pane_scrollbar_reserve(wp, scrollbars) && if (window_pane_scrollbar_reserve(wp) &&
sb_pos == PANE_SCROLLBARS_LEFT) { w->sb_pos == PANE_SCROLLBARS_LEFT) {
left -= wp->scrollbar_style.width + wp->scrollbar_style.pad; left -= wp->scrollbar_style.width + wp->scrollbar_style.pad;
} else if (window_pane_scrollbar_reserve(wp, scrollbars) && } else if (window_pane_scrollbar_reserve(wp) &&
sb_pos == PANE_SCROLLBARS_RIGHT) { w->sb_pos == PANE_SCROLLBARS_RIGHT) {
right += wp->scrollbar_style.width + wp->scrollbar_style.pad; right += wp->scrollbar_style.width + wp->scrollbar_style.pad;
} }

View File

@@ -433,13 +433,11 @@ layout_fix_panes(struct window *w, struct window_pane *skip)
{ {
struct window_pane *wp; struct window_pane *wp;
struct layout_cell *lc; struct layout_cell *lc;
int status, scrollbars, sb_pos, sb_w, sb_pad; int status, sb_w, sb_pad;
int old_xoff, old_yoff, changed = 0; int old_xoff, old_yoff, changed = 0;
u_int sx, sy, old_sx, old_sy; u_int sx, sy, old_sx, old_sy;
status = window_get_pane_status(w); status = window_get_pane_status(w);
scrollbars = options_get_number(w->options, "pane-scrollbars");
sb_pos = options_get_number(w->options, "pane-scrollbars-position");
TAILQ_FOREACH(wp, &w->panes, entry) { TAILQ_FOREACH(wp, &w->panes, entry) {
if ((lc = wp->layout_cell) == NULL || wp == skip) if ((lc = wp->layout_cell) == NULL || wp == skip)
@@ -462,14 +460,14 @@ layout_fix_panes(struct window *w, struct window_pane *skip)
sy--; sy--;
} }
if (window_pane_scrollbar_reserve(wp, scrollbars)) { if (window_pane_scrollbar_reserve(wp)) {
sb_w = wp->scrollbar_style.width; sb_w = wp->scrollbar_style.width;
sb_pad = wp->scrollbar_style.pad; sb_pad = wp->scrollbar_style.pad;
if (sb_w < 1) if (sb_w < 1)
sb_w = 1; sb_w = 1;
if (sb_pad < 0) if (sb_pad < 0)
sb_pad = 0; sb_pad = 0;
if (sb_pos == PANE_SCROLLBARS_LEFT) { if (w->sb_pos == PANE_SCROLLBARS_LEFT) {
if ((int)sx - sb_w - sb_pad < PANE_MINIMUM) { if ((int)sx - sb_w - sb_pad < PANE_MINIMUM) {
wp->xoff = wp->xoff + wp->xoff = wp->xoff +
(int)sx - PANE_MINIMUM; (int)sx - PANE_MINIMUM;
@@ -526,16 +524,15 @@ layout_resize_check(struct window *w, struct layout_cell *lc,
struct layout_cell *lcchild; struct layout_cell *lcchild;
struct style *sb_style = &w->active->scrollbar_style; struct style *sb_style = &w->active->scrollbar_style;
u_int available, minimum; u_int available, minimum;
int status, scrollbars; int status;
status = window_get_pane_status(w); status = window_get_pane_status(w);
scrollbars = options_get_number(w->options, "pane-scrollbars");
if (lc->type == LAYOUT_WINDOWPANE) { if (lc->type == LAYOUT_WINDOWPANE) {
/* Space available in this cell only. */ /* Space available in this cell only. */
if (type == LAYOUT_LEFTRIGHT) { if (type == LAYOUT_LEFTRIGHT) {
available = lc->sx; available = lc->sx;
if (scrollbars == PANE_SCROLLBARS_ALWAYS) if (w->sb == PANE_SCROLLBARS_ALWAYS)
minimum = PANE_MINIMUM + sb_style->width + minimum = PANE_MINIMUM + sb_style->width +
sb_style->pad; sb_style->pad;
else else
@@ -1253,17 +1250,16 @@ layout_split_check_space(struct window_pane *wp, struct layout_cell *lc,
{ {
struct style *sb_style = &wp->scrollbar_style; struct style *sb_style = &wp->scrollbar_style;
u_int minimum, sx = lc->sx, sy = lc->sy; u_int minimum, sx = lc->sx, sy = lc->sy;
int scrollbars, status; int status;
if (lc->flags & LAYOUT_CELL_FLOATING) if (lc->flags & LAYOUT_CELL_FLOATING)
fatalx("floating cells cannot be split"); fatalx("floating cells cannot be split");
status = window_get_pane_status(wp->window); status = window_get_pane_status(wp->window);
scrollbars = options_get_number(wp->window->options, "pane-scrollbars");
switch (type) { switch (type) {
case LAYOUT_LEFTRIGHT: case LAYOUT_LEFTRIGHT:
if (scrollbars == PANE_SCROLLBARS_ALWAYS) { if (wp->window->sb == PANE_SCROLLBARS_ALWAYS) {
minimum = PANE_MINIMUM * 2 + sb_style->width + minimum = PANE_MINIMUM * 2 + sb_style->width +
sb_style->pad; sb_style->pad;
} else } else

View File

@@ -1286,8 +1286,13 @@ options_push_changes(const char *name)
if (strcmp(name, "pane-border-status") == 0 || if (strcmp(name, "pane-border-status") == 0 ||
strcmp(name, "pane-scrollbars") == 0 || strcmp(name, "pane-scrollbars") == 0 ||
strcmp(name, "pane-scrollbars-position") == 0) { strcmp(name, "pane-scrollbars-position") == 0) {
RB_FOREACH(w, windows, &windows) RB_FOREACH(w, windows, &windows) {
w->sb = options_get_number(w->options,
"pane-scrollbars");
w->sb_pos = options_get_number(w->options,
"pane-scrollbars-position");
layout_fix_panes(w, NULL); layout_fix_panes(w, NULL);
}
} }
if (strcmp(name, "pane-scrollbars") == 0) { if (strcmp(name, "pane-scrollbars") == 0) {
RB_FOREACH(wp, window_pane_tree, &all_window_panes) RB_FOREACH(wp, window_pane_tree, &all_window_panes)

View File

@@ -212,8 +212,6 @@ struct redraw_build_ctx {
u_int sx; u_int sx;
u_int sy; u_int sy;
int sb;
int sbp;
int ind; int ind;
struct redraw_build_cell *cells; struct redraw_build_cell *cells;
@@ -285,16 +283,13 @@ redraw_set_context(struct client *c, struct redraw_build_ctx *bctx)
{ {
struct session *s = c->session; struct session *s = c->session;
struct window *w = s->curw->window; struct window *w = s->curw->window;
struct options *oo = w->options;
memset(bctx, 0, sizeof *bctx); memset(bctx, 0, sizeof *bctx);
bctx->c = c; bctx->c = c;
bctx->w = w; bctx->w = w;
redraw_get_window_offset(c, &bctx->ox, &bctx->oy, &bctx->sx, &bctx->sy); redraw_get_window_offset(c, &bctx->ox, &bctx->oy, &bctx->sx, &bctx->sy);
bctx->sb = options_get_number(oo, "pane-scrollbars"); bctx->ind = options_get_number(w->options, "pane-border-indicators");
bctx->sbp = options_get_number(oo, "pane-scrollbars-position");
bctx->ind = options_get_number(oo, "pane-border-indicators");
} }
/* Return a cell. */ /* Return a cell. */
@@ -769,8 +764,8 @@ redraw_mark_pane(struct redraw_build_ctx *bctx, struct window_pane *wp)
if (!window_pane_is_visible(wp)) if (!window_pane_is_visible(wp))
return; return;
if (window_pane_scrollbar_visible(wp, bctx->sb)) { if (window_pane_scrollbar_visible(wp)) {
overlay = window_pane_scrollbar_overlay(wp, bctx->sb); overlay = window_pane_scrollbar_overlay(wp);
if (overlay) { if (overlay) {
sb_w = wp->scrollbar_style.width + sb_w = wp->scrollbar_style.width +
wp->scrollbar_style.pad; wp->scrollbar_style.pad;
@@ -782,7 +777,7 @@ redraw_mark_pane(struct redraw_build_ctx *bctx, struct window_pane *wp)
} else } else
sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad; sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad;
} }
if (sb_w != 0 && bctx->sbp == PANE_SCROLLBARS_LEFT) if (sb_w != 0 && bctx->w->sb_pos == PANE_SCROLLBARS_LEFT)
sb_left = 1; sb_left = 1;
redraw_mark_pane_inside(bctx, wp); redraw_mark_pane_inside(bctx, wp);

View File

@@ -609,10 +609,9 @@ server_client_in_scrollbar_area(struct window_pane *wp, int px, int py)
{ {
struct window *w = wp->window; struct window *w = wp->window;
u_int width, pad, total; u_int width, pad, total;
int sb, sb_pos, start, end; int start, end;
sb = options_get_number(w->options, "pane-scrollbars"); if (!window_pane_scrollbar_overlay(wp))
if (!window_pane_scrollbar_overlay(wp, sb))
return (0); return (0);
if (py < wp->yoff || py >= wp->yoff + (int)wp->sy) if (py < wp->yoff || py >= wp->yoff + (int)wp->sy)
return (0); return (0);
@@ -623,8 +622,7 @@ server_client_in_scrollbar_area(struct window_pane *wp, int px, int py)
if (total == 0 || total > wp->sx) if (total == 0 || total > wp->sx)
total = wp->sx; total = wp->sx;
sb_pos = options_get_number(w->options, "pane-scrollbars-position"); if (w->sb_pos == PANE_SCROLLBARS_LEFT) {
if (sb_pos == PANE_SCROLLBARS_LEFT) {
start = wp->xoff; start = wp->xoff;
end = wp->xoff + (int)total - 1; end = wp->xoff + (int)total - 1;
} else { } else {
@@ -664,17 +662,15 @@ server_client_check_mouse_in_pane(struct window_pane *wp, int px, int py,
{ {
struct window *w = wp->window; struct window *w = wp->window;
struct window_pane *fwp; struct window_pane *fwp;
int pane_status, sb, sb_pos, sb_w, sb_pad; int pane_status, sb_w, sb_pad;
int pane_status_line, sl_top, sl_bottom; int pane_status_line, sl_top, sl_bottom;
int bdr_bottom, bdr_top, bdr_left, bdr_right; int bdr_bottom, bdr_top, bdr_left, bdr_right;
int sb_start, sb_end, sb_overlay; int sb_start, sb_end, sb_overlay;
sb = options_get_number(w->options, "pane-scrollbars");
sb_pos = options_get_number(w->options, "pane-scrollbars-position");
pane_status = window_pane_get_pane_status(wp); pane_status = window_pane_get_pane_status(wp);
sb_overlay = window_pane_scrollbar_overlay(wp, sb); sb_overlay = window_pane_scrollbar_overlay(wp);
if (window_pane_scrollbar_visible(wp, sb)) { if (window_pane_scrollbar_visible(wp)) {
sb_w = wp->scrollbar_style.width; sb_w = wp->scrollbar_style.width;
sb_pad = wp->scrollbar_style.pad; sb_pad = wp->scrollbar_style.pad;
if (sb_overlay && sb_w > (int)wp->sx) if (sb_overlay && sb_w > (int)wp->sx)
@@ -691,13 +687,13 @@ server_client_check_mouse_in_pane(struct window_pane *wp, int px, int py,
else else
pane_status_line = -1; /* not used */ pane_status_line = -1; /* not used */
bdr_left = wp->xoff - 1; bdr_left = wp->xoff - 1;
if (!sb_overlay && sb_pos == PANE_SCROLLBARS_LEFT) if (!sb_overlay && w->sb_pos == PANE_SCROLLBARS_LEFT)
bdr_left -= sb_pad + sb_w; bdr_left -= sb_pad + sb_w;
if (sb_overlay && sb_w != 0 && if (sb_overlay && sb_w != 0 &&
py >= wp->yoff && py < wp->yoff + (int)wp->sy && py >= wp->yoff && py < wp->yoff + (int)wp->sy &&
px >= wp->xoff && px < wp->xoff + (int)wp->sx) { px >= wp->xoff && px < wp->xoff + (int)wp->sx) {
if (sb_pos == PANE_SCROLLBARS_LEFT) { if (w->sb_pos == PANE_SCROLLBARS_LEFT) {
sb_start = wp->xoff; sb_start = wp->xoff;
sb_end = sb_start + sb_w - 1; sb_end = sb_start + sb_w - 1;
} else { } else {
@@ -724,15 +720,15 @@ server_client_check_mouse_in_pane(struct window_pane *wp, int px, int py,
py != pane_status_line && py != wp->yoff + (int)wp->sy) || py != pane_status_line && py != wp->yoff + (int)wp->sy) ||
(wp->yoff == 0 && py < (int)wp->sy) || (wp->yoff == 0 && py < (int)wp->sy) ||
(py >= wp->yoff && py < wp->yoff + (int)wp->sy)) && (py >= wp->yoff && py < wp->yoff + (int)wp->sy)) &&
((sb_pos == PANE_SCROLLBARS_RIGHT && ((w->sb_pos == PANE_SCROLLBARS_RIGHT &&
px < wp->xoff + (int)wp->sx + sb_pad + sb_w) || px < wp->xoff + (int)wp->sx + sb_pad + sb_w) ||
(sb_pos == PANE_SCROLLBARS_LEFT && (w->sb_pos == PANE_SCROLLBARS_LEFT &&
px < wp->xoff + (int)wp->sx - sb_pad - sb_w))) { px < wp->xoff + (int)wp->sx - sb_pad - sb_w))) {
/* Check if in the scrollbar. */ /* Check if in the scrollbar. */
if ((sb_pos == PANE_SCROLLBARS_RIGHT && if ((w->sb_pos == PANE_SCROLLBARS_RIGHT &&
(px >= wp->xoff + (int)wp->sx + sb_pad && (px >= wp->xoff + (int)wp->sx + sb_pad &&
px < wp->xoff + (int)wp->sx + sb_pad + sb_w)) || px < wp->xoff + (int)wp->sx + sb_pad + sb_w)) ||
(sb_pos == PANE_SCROLLBARS_LEFT && (w->sb_pos == PANE_SCROLLBARS_LEFT &&
(px >= wp->xoff - sb_pad - sb_w && (px >= wp->xoff - sb_pad - sb_w &&
px < wp->xoff - sb_pad))) { px < wp->xoff - sb_pad))) {
/* Check where inside the scrollbar. */ /* Check where inside the scrollbar. */
@@ -766,7 +762,7 @@ server_client_check_mouse_in_pane(struct window_pane *wp, int px, int py,
if (window_pane_is_floating(fwp) && if (window_pane_is_floating(fwp) &&
window_pane_get_pane_lines(fwp) == PANE_LINES_NONE) window_pane_get_pane_lines(fwp) == PANE_LINES_NONE)
continue; continue;
if (window_pane_scrollbar_reserve(fwp, sb)) { if (window_pane_scrollbar_reserve(fwp)) {
sb_w = fwp->scrollbar_style.width; sb_w = fwp->scrollbar_style.width;
sb_pad = fwp->scrollbar_style.pad; sb_pad = fwp->scrollbar_style.pad;
} else { } else {
@@ -776,7 +772,7 @@ server_client_check_mouse_in_pane(struct window_pane *wp, int px, int py,
bdr_top = fwp->yoff - 1; bdr_top = fwp->yoff - 1;
bdr_bottom = fwp->yoff + fwp->sy; bdr_bottom = fwp->yoff + fwp->sy;
bdr_left = fwp->xoff - 1; bdr_left = fwp->xoff - 1;
if (sb_pos == PANE_SCROLLBARS_LEFT) { if (w->sb_pos == PANE_SCROLLBARS_LEFT) {
bdr_left -= sb_pad + sb_w; bdr_left -= sb_pad + sb_w;
bdr_right = fwp->xoff + fwp->sx; bdr_right = fwp->xoff + fwp->sx;
} else { } else {
@@ -1997,7 +1993,7 @@ server_client_reset_state(struct client *c)
struct window_pane *wp = server_client_get_pane(c), *loop; struct window_pane *wp = server_client_get_pane(c), *loop;
struct screen *s = NULL; struct screen *s = NULL;
struct options *oo = c->session->options; struct options *oo = c->session->options;
int mode = 0, cursor, flags, pane_mode = 0, sb; int mode = 0, cursor, flags, pane_mode = 0;
u_int cx = 0, cy = 0, ox, oy, sx, sy, prompt = 0; u_int cx = 0, cy = 0, ox, oy, sx, sy, prompt = 0;
u_int sb_w; u_int sb_w;
struct visible_ranges *r; struct visible_ranges *r;
@@ -2057,9 +2053,8 @@ server_client_reset_state(struct client *c)
if (sb_w > wp->sx) if (sb_w > wp->sx)
sb_w = wp->sx; sb_w = wp->sx;
if (sb_w != 0 && if (sb_w != 0 &&
options_get_number(w->options, w->sb_pos ==
"pane-scrollbars-position") == PANE_SCROLLBARS_LEFT) {
PANE_SCROLLBARS_LEFT) {
if (s->cx < sb_w) if (s->cx < sb_w)
cursor = 0; cursor = 0;
} else if (sb_w != 0 && } else if (sb_w != 0 &&
@@ -2094,11 +2089,10 @@ server_client_reset_state(struct client *c)
mode |= MODE_MOUSE_ALL; mode |= MODE_MOUSE_ALL;
} }
} }
sb = options_get_number(w->options, "pane-scrollbars"); if (options_get_number(oo, "focus-follows-mouse") ||
if (options_get_number(oo, "focus-follows-mouse") || w->sb == PANE_SCROLLBARS_MODAL ||
sb == PANE_SCROLLBARS_MODAL || w->sb == PANE_SCROLLBARS_AUTOHIDE)
sb == PANE_SCROLLBARS_AUTOHIDE) mode |= MODE_MOUSE_ALL;
mode |= MODE_MOUSE_ALL;
else if (~mode & MODE_MOUSE_ALL) else if (~mode & MODE_MOUSE_ALL)
mode |= MODE_MOUSE_BUTTON; mode |= MODE_MOUSE_BUTTON;
} }

11
tmux.h
View File

@@ -1414,6 +1414,9 @@ struct window {
u_int last_new_pane_x; u_int last_new_pane_x;
u_int last_new_pane_y; u_int last_new_pane_y;
int sb;
int sb_pos;
struct utf8_data *fill_character; struct utf8_data *fill_character;
int flags; int flags;
#define WINDOW_BELL 0x1 #define WINDOW_BELL 0x1
@@ -3629,10 +3632,10 @@ void window_pane_update_used_data(struct window_pane *,
void window_set_fill_character(struct window *); void window_set_fill_character(struct window *);
void window_pane_default_cursor(struct window_pane *); void window_pane_default_cursor(struct window_pane *);
int window_pane_mode(struct window_pane *); int window_pane_mode(struct window_pane *);
int window_pane_show_scrollbar(struct window_pane *, int); int window_pane_show_scrollbar(struct window_pane *);
int window_pane_scrollbar_reserve(struct window_pane *, int); int window_pane_scrollbar_reserve(struct window_pane *);
int window_pane_scrollbar_visible(struct window_pane *, int); int window_pane_scrollbar_visible(struct window_pane *);
int window_pane_scrollbar_overlay(struct window_pane *, int); int window_pane_scrollbar_overlay(struct window_pane *);
int window_pane_scrollbar_overlay_visible(struct window_pane *); int window_pane_scrollbar_overlay_visible(struct window_pane *);
void window_pane_scrollbar_show(struct window_pane *, int); void window_pane_scrollbar_show(struct window_pane *, int);
void window_pane_scrollbar_hide(struct window_pane *); void window_pane_scrollbar_hide(struct window_pane *);

View File

@@ -55,7 +55,7 @@ window_visible_ranges(struct window_pane *base_wp, int px, int py, u_int width,
struct window *w; struct window *w;
struct visible_range *ri; struct visible_range *ri;
static struct visible_ranges sr = { NULL, 0, 0 }; static struct visible_ranges sr = { NULL, 0, 0 };
int found_self, sb, sb_w, sb_pos; int found_self, sb_w, sb_pos;
int lb, rb, tb, bb, sx, ex, no_border; int lb, rb, tb, bb, sx, ex, no_border;
u_int i, s; u_int i, s;
@@ -95,8 +95,6 @@ window_visible_ranges(struct window_pane *base_wp, int px, int py, u_int width,
r->used = 1; r->used = 1;
} }
sb = options_get_number(w->options, "pane-scrollbars");
sb_pos = options_get_number(w->options, "pane-scrollbars-position");
found_self = 0; found_self = 0;
TAILQ_FOREACH_REVERSE(wp, &w->z_index, window_panes_zindex, zentry) { TAILQ_FOREACH_REVERSE(wp, &w->z_index, window_panes_zindex, zentry) {
@@ -126,7 +124,9 @@ window_visible_ranges(struct window_pane *base_wp, int px, int py, u_int width,
continue; continue;
sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad; sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad;
if (!window_pane_scrollbar_reserve(wp, sb)) if (window_pane_scrollbar_reserve(wp))
sb_pos = w->sb_pos;
else
sb_w = sb_pos = 0; sb_w = sb_pos = 0;
for (i = 0; i < r->used; i++) { for (i = 0; i < r->used; i++) {

View File

@@ -1172,20 +1172,15 @@ window_pane_scrollbar_timer(__unused int fd, __unused short events, void *arg)
static int static int
window_pane_scrollbar_auto_hide(struct window_pane *wp) window_pane_scrollbar_auto_hide(struct window_pane *wp)
{ {
int sb; return (wp->window->sb == PANE_SCROLLBARS_MODAL ||
wp->window->sb == PANE_SCROLLBARS_AUTOHIDE);
sb = options_get_number(wp->window->options, "pane-scrollbars");
return (sb == PANE_SCROLLBARS_MODAL || sb == PANE_SCROLLBARS_AUTOHIDE);
} }
int int
window_pane_scrollbar_overlay_visible(struct window_pane *wp) window_pane_scrollbar_overlay_visible(struct window_pane *wp)
{ {
int sb; return (window_pane_scrollbar_overlay(wp) &&
window_pane_scrollbar_visible(wp));
sb = options_get_number(wp->window->options, "pane-scrollbars");
return (window_pane_scrollbar_overlay(wp, sb) &&
window_pane_scrollbar_visible(wp, sb));
} }
void void
@@ -1780,17 +1775,13 @@ window_pane_full_size_offset(struct window_pane *wp, int *xoff, int *yoff,
u_int *sx, u_int *sy) u_int *sx, u_int *sy)
{ {
struct window *w = wp->window; struct window *w = wp->window;
int pane_scrollbars; u_int sb_w;
u_int sb_w, sb_pos;
pane_scrollbars = options_get_number(w->options, "pane-scrollbars"); if (window_pane_scrollbar_reserve(wp))
sb_pos = options_get_number(w->options, "pane-scrollbars-position");
if (window_pane_scrollbar_reserve(wp, pane_scrollbars))
sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad; sb_w = wp->scrollbar_style.width + wp->scrollbar_style.pad;
else else
sb_w = 0; sb_w = 0;
if (sb_pos == PANE_SCROLLBARS_LEFT) { if (w->sb_pos == PANE_SCROLLBARS_LEFT) {
*xoff = wp->xoff - sb_w; *xoff = wp->xoff - sb_w;
*sx = wp->sx + sb_w; *sx = wp->sx + sb_w;
} else { /* sb_pos == PANE_SCROLLBARS_RIGHT */ } else { /* sb_pos == PANE_SCROLLBARS_RIGHT */
@@ -2206,40 +2197,39 @@ window_pane_mode(struct window_pane *wp)
return (WINDOW_PANE_NO_MODE); return (WINDOW_PANE_NO_MODE);
} }
/* Return 1 if scrollbar is or should be displayed. */
int int
window_pane_show_scrollbar(struct window_pane *wp, int sb_option) window_pane_show_scrollbar(struct window_pane *wp)
{ {
if (SCREEN_IS_ALTERNATE(&wp->base)) if (SCREEN_IS_ALTERNATE(&wp->base))
return (0); return (0);
if (sb_option == PANE_SCROLLBARS_ALWAYS || if (wp->window->sb == PANE_SCROLLBARS_ALWAYS ||
sb_option == PANE_SCROLLBARS_AUTOHIDE || wp->window->sb == PANE_SCROLLBARS_AUTOHIDE ||
(sb_option == PANE_SCROLLBARS_MODAL && (wp->window->sb == PANE_SCROLLBARS_MODAL &&
window_pane_mode(wp) != WINDOW_PANE_NO_MODE)) window_pane_mode(wp) != WINDOW_PANE_NO_MODE))
return (1); return (1);
return (0); return (0);
} }
int int
window_pane_scrollbar_reserve(struct window_pane *wp, int sb_option) window_pane_scrollbar_reserve(struct window_pane *wp)
{ {
if (!window_pane_show_scrollbar(wp, sb_option)) if (!window_pane_show_scrollbar(wp))
return (0); return (0);
return (sb_option == PANE_SCROLLBARS_ALWAYS); return (wp->window->sb == PANE_SCROLLBARS_ALWAYS);
} }
int int
window_pane_scrollbar_overlay(struct window_pane *wp, int sb_option) window_pane_scrollbar_overlay(struct window_pane *wp)
{ {
if (!window_pane_show_scrollbar(wp, sb_option)) if (!window_pane_show_scrollbar(wp))
return (0); return (0);
return (window_pane_scrollbar_auto_hide(wp)); return (window_pane_scrollbar_auto_hide(wp));
} }
int int
window_pane_scrollbar_visible(struct window_pane *wp, int sb_option) window_pane_scrollbar_visible(struct window_pane *wp)
{ {
if (!window_pane_show_scrollbar(wp, sb_option)) if (!window_pane_show_scrollbar(wp))
return (0); return (0);
if (!window_pane_scrollbar_auto_hide(wp)) if (!window_pane_scrollbar_auto_hide(wp))
return (1); return (1);
@@ -2267,12 +2257,9 @@ void
window_pane_scrollbar_show(struct window_pane *wp, int start_timer) window_pane_scrollbar_show(struct window_pane *wp, int start_timer)
{ {
int changed = 0; int changed = 0;
int sb;
if (!window_pane_scrollbar_auto_hide(wp)) if (!window_pane_scrollbar_auto_hide(wp))
return; return;
sb = options_get_number(wp->window->options, "pane-scrollbars"); if (!window_pane_show_scrollbar(wp))
if (!window_pane_show_scrollbar(wp, sb))
return; return;
if (!wp->sb_auto_visible) { if (!wp->sb_auto_visible) {
wp->sb_auto_visible = 1; wp->sb_auto_visible = 1;