mirror of
https://github.com/tmux/tmux.git
synced 2026-03-17 05:58:12 +00:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc117b5048 | ||
|
|
faebe7a70a | ||
|
|
01962e25dc | ||
|
|
ff207eb583 | ||
|
|
2fc123cf4a | ||
|
|
3b57077d01 | ||
|
|
33c1ba1549 | ||
|
|
52917abe21 | ||
|
|
a40f98df0a | ||
|
|
2c78a5aceb | ||
|
|
bfecbb0685 | ||
|
|
640e1a7643 | ||
|
|
2a0b078e15 | ||
|
|
0af04295f3 | ||
|
|
ec4b5b52af | ||
|
|
6db6a30ab5 |
26
CHANGES
26
CHANGES
@@ -1,3 +1,29 @@
|
||||
CHANGES FROM 3.6 TO 3.6a
|
||||
|
||||
* Fix a buffer overread and an infinite loop in format processing (reported by
|
||||
Giorgi Kobakhia, issue 4735).
|
||||
|
||||
* Allow drag in alternate screen again (issue 4743 reported by Brad King).
|
||||
|
||||
* Fix y offset of mouse if status at top (issue 4738 from Michael Grant).
|
||||
|
||||
* Add a missing skin tone (from Jake Stewart, issue 4736).
|
||||
|
||||
* Allow characters to be combined in either order (issue 4726, reported by Jake
|
||||
Stewart).
|
||||
|
||||
* Fix horizontal mouse resizing when pane status lines are on (from Michael
|
||||
Grant, issue 4720).
|
||||
|
||||
* Fix noattr so it does not delete attributes set in the style itself (issue
|
||||
4713).
|
||||
|
||||
* Newer libevents do not allow event_del on a zero'd event (issue 4706).
|
||||
|
||||
* Place cursor on correct line if message-line is not 0 (issue 4707).
|
||||
|
||||
* Fix compile error on FreeBSD (from Yasuhiro Kimura, issue 4701).
|
||||
|
||||
CHANGES FROM 3.5a TO 3.6
|
||||
|
||||
* Add seconds options for clock mode (issue 4697).
|
||||
|
||||
@@ -31,7 +31,7 @@ attributes_tostring(int attr)
|
||||
if (attr == 0)
|
||||
return ("none");
|
||||
|
||||
len = xsnprintf(buf, sizeof buf, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
len = xsnprintf(buf, sizeof buf, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
(attr & GRID_ATTR_CHARSET) ? "acs," : "",
|
||||
(attr & GRID_ATTR_BRIGHT) ? "bright," : "",
|
||||
(attr & GRID_ATTR_DIM) ? "dim," : "",
|
||||
@@ -45,7 +45,8 @@ attributes_tostring(int attr)
|
||||
(attr & GRID_ATTR_UNDERSCORE_3) ? "curly-underscore," : "",
|
||||
(attr & GRID_ATTR_UNDERSCORE_4) ? "dotted-underscore," : "",
|
||||
(attr & GRID_ATTR_UNDERSCORE_5) ? "dashed-underscore," : "",
|
||||
(attr & GRID_ATTR_OVERLINE) ? "overline," : "");
|
||||
(attr & GRID_ATTR_OVERLINE) ? "overline," : "",
|
||||
(attr & GRID_ATTR_NOATTR) ? "noattr," : "");
|
||||
if (len > 0)
|
||||
buf[len - 1] = '\0';
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# configure.ac
|
||||
|
||||
AC_INIT([tmux], 3.6)
|
||||
AC_INIT([tmux], 3.6a)
|
||||
AC_PREREQ([2.60])
|
||||
|
||||
AC_CONFIG_AUX_DIR(etc)
|
||||
|
||||
@@ -1104,8 +1104,6 @@ format_width(const char *expanded)
|
||||
more = utf8_append(&ud, *cp);
|
||||
if (more == UTF8_DONE)
|
||||
width += ud.width;
|
||||
else
|
||||
cp -= ud.have;
|
||||
} else if (*cp > 0x1f && *cp < 0x7f) {
|
||||
width++;
|
||||
cp++;
|
||||
|
||||
3
format.c
3
format.c
@@ -5545,7 +5545,8 @@ format_expand1(struct format_expand_state *es, const char *fmt)
|
||||
buf[off++] = *fmt++;
|
||||
continue;
|
||||
}
|
||||
fmt++;
|
||||
if (*fmt++ == '\0')
|
||||
break;
|
||||
|
||||
ch = (u_char)*fmt++;
|
||||
switch (ch) {
|
||||
|
||||
@@ -441,7 +441,7 @@ key_bindings_init(void)
|
||||
"bind -n MouseDown1Pane { select-pane -t=; send -M }",
|
||||
|
||||
/* Mouse button 1 drag on pane. */
|
||||
"bind -n MouseDrag1Pane { if -F '#{||:#{alternate_on},#{pane_in_mode},#{mouse_any_flag}}' { send -M } { copy-mode -M } }",
|
||||
"bind -n MouseDrag1Pane { if -F '#{||:#{pane_in_mode},#{mouse_any_flag}}' { send -M } { copy-mode -M } }",
|
||||
|
||||
/* Mouse wheel up on pane. */
|
||||
"bind -n WheelUpPane { if -F '#{||:#{alternate_on},#{pane_in_mode},#{mouse_any_flag}}' { send -M } { copy-mode -e } }",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
Λ̊1
|
||||
🏻2
|
||||
👍🏻3
|
||||
👍🏻 👍🏻4
|
||||
👍🏻 👍🏻4
|
||||
🤷♂️5
|
||||
♂️7
|
||||
🤷♂️8
|
||||
|
||||
@@ -1028,6 +1028,11 @@ screen_redraw_draw_scrollbar(struct screen_redraw_ctx *ctx,
|
||||
int sx = ctx->sx, sy = ctx->sy, xoff = wp->xoff;
|
||||
int yoff = wp->yoff;
|
||||
|
||||
if (ctx->statustop) {
|
||||
sb_y += ctx->statuslines;
|
||||
sy += ctx->statuslines;
|
||||
}
|
||||
|
||||
/* Set up style for slider. */
|
||||
gc = sb_style->gc;
|
||||
memcpy(&slgc, &gc, sizeof slgc);
|
||||
|
||||
@@ -2152,6 +2152,8 @@ screen_write_combine(struct screen_write_ctx *ctx, const struct grid_cell *gc)
|
||||
case HANGULJAMO_STATE_NOT_HANGULJAMO:
|
||||
if (utf8_should_combine(&last.data, ud))
|
||||
force_wide = 1;
|
||||
else if (utf8_should_combine(ud, &last.data))
|
||||
force_wide = 1;
|
||||
else if (!utf8_has_zwj(&last.data))
|
||||
return (0);
|
||||
break;
|
||||
|
||||
6
screen.c
6
screen.c
@@ -594,8 +594,12 @@ screen_select_cell(struct screen *s, struct grid_cell *dst,
|
||||
if (COLOUR_DEFAULT(dst->bg))
|
||||
dst->bg = src->bg;
|
||||
utf8_copy(&dst->data, &src->data);
|
||||
dst->attr = src->attr;
|
||||
dst->flags = src->flags;
|
||||
|
||||
if (dst->attr & GRID_ATTR_NOATTR)
|
||||
dst->attr |= (src->attr & GRID_ATTR_CHARSET);
|
||||
else
|
||||
dst->attr |= src->attr;
|
||||
}
|
||||
|
||||
/* Reflow wrapped lines. */
|
||||
|
||||
@@ -613,7 +613,8 @@ server_client_check_mouse_in_pane(struct window_pane *wp, u_int px, u_int py,
|
||||
line = wp->yoff + wp->sy;
|
||||
|
||||
/* Check if point is within the pane or scrollbar. */
|
||||
if (((pane_status != PANE_STATUS_OFF && py != line) ||
|
||||
if (((pane_status != PANE_STATUS_OFF &&
|
||||
py != line && py != wp->yoff + wp->sy) ||
|
||||
(wp->yoff == 0 && py < wp->sy) ||
|
||||
(py >= wp->yoff && py < wp->yoff + wp->sy)) &&
|
||||
((sb_pos == PANE_SCROLLBARS_RIGHT &&
|
||||
@@ -1270,7 +1271,11 @@ have_event:
|
||||
if (c->tty.mouse_scrolling_flag == 0 &&
|
||||
where == SCROLLBAR_SLIDER) {
|
||||
c->tty.mouse_scrolling_flag = 1;
|
||||
c->tty.mouse_slider_mpos = sl_mpos;
|
||||
if (m->statusat == 0) {
|
||||
c->tty.mouse_slider_mpos = sl_mpos +
|
||||
m->statuslines;
|
||||
} else
|
||||
c->tty.mouse_slider_mpos = sl_mpos;
|
||||
}
|
||||
break;
|
||||
case WHEEL:
|
||||
@@ -2901,8 +2906,8 @@ server_client_reset_state(struct client *c)
|
||||
struct window_pane *wp = server_client_get_pane(c), *loop;
|
||||
struct screen *s = NULL;
|
||||
struct options *oo = c->session->options;
|
||||
int mode = 0, cursor, flags, n;
|
||||
u_int cx = 0, cy = 0, ox, oy, sx, sy;
|
||||
int mode = 0, cursor, flags;
|
||||
u_int cx = 0, cy = 0, ox, oy, sx, sy, n;
|
||||
|
||||
if (c->flags & (CLIENT_CONTROL|CLIENT_SUSPENDED))
|
||||
return;
|
||||
@@ -2934,13 +2939,13 @@ server_client_reset_state(struct client *c)
|
||||
if (c->prompt_string != NULL) {
|
||||
n = options_get_number(oo, "status-position");
|
||||
if (n == 0)
|
||||
cy = 0;
|
||||
cy = status_prompt_line_at(c);
|
||||
else {
|
||||
n = status_line_size(c);
|
||||
if (n == 0)
|
||||
cy = tty->sy - 1;
|
||||
else
|
||||
n = status_line_size(c) - status_prompt_line_at(c);
|
||||
if (n <= tty->sy)
|
||||
cy = tty->sy - n;
|
||||
else
|
||||
cy = tty->sy - 1;
|
||||
}
|
||||
cx = c->prompt_cursor;
|
||||
} else if (c->overlay_draw == NULL) {
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <sys/wait.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
13
status.c
13
status.c
@@ -264,14 +264,19 @@ status_line_size(struct client *c)
|
||||
}
|
||||
|
||||
/* Get the prompt line number for client's session. 1 means at the bottom. */
|
||||
static u_int
|
||||
u_int
|
||||
status_prompt_line_at(struct client *c)
|
||||
{
|
||||
struct session *s = c->session;
|
||||
u_int line, lines;
|
||||
|
||||
if (c->flags & (CLIENT_STATUSOFF|CLIENT_CONTROL))
|
||||
return (1);
|
||||
return (options_get_number(s->options, "message-line"));
|
||||
lines = status_line_size(c);
|
||||
if (lines == 0)
|
||||
return (0);
|
||||
line = options_get_number(s->options, "message-line");
|
||||
if (line >= lines)
|
||||
return (lines - 1);
|
||||
return (line);
|
||||
}
|
||||
|
||||
/* Get window at window list position. */
|
||||
|
||||
35
style.c
35
style.c
@@ -218,20 +218,23 @@ style_parse(struct style *sy, const struct grid_cell *base, const char *in)
|
||||
sy->gc.attr = 0;
|
||||
else if (end > 2 && strncasecmp(tmp, "no", 2) == 0) {
|
||||
if (strcmp(tmp + 2, "attr") == 0)
|
||||
value = 0xffff & ~GRID_ATTR_CHARSET;
|
||||
else if ((value = attributes_fromstring(tmp + 2)) == -1)
|
||||
goto error;
|
||||
sy->gc.attr &= ~value;
|
||||
sy->gc.attr |= GRID_ATTR_NOATTR;
|
||||
else {
|
||||
value = attributes_fromstring(tmp + 2);
|
||||
if (value == -1)
|
||||
goto error;
|
||||
sy->gc.attr &= ~value;
|
||||
}
|
||||
} else if (end > 6 && strncasecmp(tmp, "width=", 6) == 0) {
|
||||
n = strtonum(tmp + 6, 0, UINT_MAX, &errstr);
|
||||
if (errstr != NULL)
|
||||
goto error;
|
||||
sy->width = (int)n;
|
||||
n = strtonum(tmp + 6, 0, UINT_MAX, &errstr);
|
||||
if (errstr != NULL)
|
||||
goto error;
|
||||
sy->width = (int)n;
|
||||
} else if (end > 4 && strncasecmp(tmp, "pad=", 4) == 0) {
|
||||
n = strtonum(tmp + 4, 0, UINT_MAX, &errstr);
|
||||
if (errstr != NULL)
|
||||
goto error;
|
||||
sy->pad = (int)n;
|
||||
n = strtonum(tmp + 4, 0, UINT_MAX, &errstr);
|
||||
if (errstr != NULL)
|
||||
goto error;
|
||||
sy->pad = (int)n;
|
||||
} else {
|
||||
if ((value = attributes_fromstring(tmp)) == -1)
|
||||
goto error;
|
||||
@@ -344,13 +347,13 @@ style_tostring(struct style *sy)
|
||||
attributes_tostring(gc->attr));
|
||||
comma = ",";
|
||||
}
|
||||
if (sy->width >= 0) {
|
||||
xsnprintf(s + off, sizeof s - off, "%swidth=%u", comma,
|
||||
if (sy->width >= 0) {
|
||||
xsnprintf(s + off, sizeof s - off, "%swidth=%u", comma,
|
||||
sy->width);
|
||||
comma = ",";
|
||||
}
|
||||
if (sy->pad >= 0) {
|
||||
xsnprintf(s + off, sizeof s - off, "%spad=%u", comma,
|
||||
if (sy->pad >= 0) {
|
||||
xsnprintf(s + off, sizeof s - off, "%spad=%u", comma,
|
||||
sy->pad);
|
||||
comma = ",";
|
||||
}
|
||||
|
||||
2
tmux.h
2
tmux.h
@@ -727,6 +727,7 @@ struct colour_palette {
|
||||
#define GRID_ATTR_UNDERSCORE_4 0x800
|
||||
#define GRID_ATTR_UNDERSCORE_5 0x1000
|
||||
#define GRID_ATTR_OVERLINE 0x2000
|
||||
#define GRID_ATTR_NOATTR 0x4000
|
||||
|
||||
/* All underscore attributes. */
|
||||
#define GRID_ATTR_ALL_UNDERSCORE \
|
||||
@@ -2943,6 +2944,7 @@ extern u_int status_prompt_hsize[];
|
||||
void status_timer_start(struct client *);
|
||||
void status_timer_start_all(void);
|
||||
void status_update_cache(struct session *);
|
||||
u_int status_prompt_line_at(struct client *);
|
||||
int status_at_line(struct client *);
|
||||
u_int status_line_size(struct client *);
|
||||
struct style_range *status_get_range(struct client *, u_int, u_int);
|
||||
|
||||
7
tty.c
7
tty.c
@@ -35,6 +35,8 @@
|
||||
|
||||
static int tty_log_fd = -1;
|
||||
|
||||
static void tty_start_timer_callback(int, short, void *);
|
||||
static void tty_clipboard_query_callback(int, short, void *);
|
||||
static void tty_set_italics(struct tty *);
|
||||
static int tty_try_colour(struct tty *, int, const char *);
|
||||
static void tty_force_cursor_colour(struct tty *, int);
|
||||
@@ -296,6 +298,8 @@ tty_open(struct tty *tty, char **cause)
|
||||
if (tty->out == NULL)
|
||||
fatal("out of memory");
|
||||
|
||||
evtimer_set(&tty->clipboard_timer, tty_clipboard_query_callback, tty);
|
||||
evtimer_set(&tty->start_timer, tty_start_timer_callback, tty);
|
||||
evtimer_set(&tty->timer, tty_timer_callback, tty);
|
||||
|
||||
tty_start_tty(tty);
|
||||
@@ -327,7 +331,6 @@ tty_start_start_timer(struct tty *tty)
|
||||
|
||||
log_debug("%s: start timer started", c->name);
|
||||
evtimer_del(&tty->start_timer);
|
||||
evtimer_set(&tty->start_timer, tty_start_timer_callback, tty);
|
||||
evtimer_add(&tty->start_timer, &tv);
|
||||
}
|
||||
|
||||
@@ -445,6 +448,7 @@ tty_stop_tty(struct tty *tty)
|
||||
tty->flags &= ~TTY_STARTED;
|
||||
|
||||
evtimer_del(&tty->start_timer);
|
||||
evtimer_del(&tty->clipboard_timer);
|
||||
|
||||
event_del(&tty->timer);
|
||||
tty->flags &= ~TTY_BLOCK;
|
||||
@@ -3228,6 +3232,5 @@ tty_clipboard_query(struct tty *tty)
|
||||
tty_putcode_ss(tty, TTYC_MS, "", "?");
|
||||
|
||||
tty->flags |= TTY_OSC52QUERY;
|
||||
evtimer_set(&tty->clipboard_timer, tty_clipboard_query_callback, tty);
|
||||
evtimer_add(&tty->clipboard_timer, &tv);
|
||||
}
|
||||
|
||||
@@ -122,6 +122,7 @@ utf8_should_combine(const struct utf8_data *with, const struct utf8_data *add)
|
||||
case 0x1F47C:
|
||||
case 0x1F481:
|
||||
case 0x1F482:
|
||||
case 0x1F483:
|
||||
case 0x1F485:
|
||||
case 0x1F486:
|
||||
case 0x1F487:
|
||||
|
||||
@@ -627,7 +627,7 @@ window_copy_scroll1(struct window_mode_entry *wme, struct window_pane *wp,
|
||||
new_slider_y = sb_top - wp->yoff + (sb_height - slider_height);
|
||||
} else {
|
||||
/* Slider is somewhere in the middle. */
|
||||
new_slider_y = my - wp->yoff - sl_mpos + 1;
|
||||
new_slider_y = my - wp->yoff - sl_mpos;
|
||||
}
|
||||
|
||||
if (TAILQ_FIRST(&wp->modes) == NULL ||
|
||||
|
||||
Reference in New Issue
Block a user