This commit is contained in:
Michael Grant
2026-04-05 19:40:56 -04:00
35 changed files with 1256 additions and 1654 deletions

299
tmux.h
View File

@@ -129,18 +129,6 @@ struct winlink;
#define VISUAL_ON 1
#define VISUAL_BOTH 2
/* No key or unknown key. */
#define KEYC_NONE 0x000ff000000000ULL
#define KEYC_UNKNOWN 0x000fe000000000ULL
/*
* Base for special (that is, not Unicode) keys. An enum must be at most a
* signed int, so these are based in the highest Unicode PUA.
*/
#define KEYC_BASE 0x0000000010e000ULL
#define KEYC_USER 0x0000000010f000ULL
#define KEYC_USER_END (KEYC_USER + KEYC_NUSER)
/* Key modifier bits. */
#define KEYC_META 0x00100000000000ULL
#define KEYC_CTRL 0x00200000000000ULL
@@ -156,45 +144,122 @@ struct winlink;
#define KEYC_SENT 0x40000000000000ULL
/* Masks for key bits. */
#define KEYC_MASK_MODIFIERS 0x00f00000000000ULL
#define KEYC_MASK_TYPE 0x0000ff00000000ULL
#define KEYC_MASK_MODIFIERS 0x00ff0000000000ULL
#define KEYC_MASK_FLAGS 0xff000000000000ULL
#define KEYC_MASK_KEY 0x000fffffffffffULL
#define KEYC_MASK_KEY 0x0000ffffffffffULL
/* Available user keys. */
#define KEYC_NUSER 1000
#define KEYC_NUSER 1000
#define KEYC_SHIFT_TYPE(t) ((unsigned long long)(t) << 32)
#define KEYC_IS_TYPE(k, t) (((k) & KEYC_MASK_TYPE) == KEYC_SHIFT_TYPE(t))
enum key_code_type {
KEYC_TYPE_UNICODE,
KEYC_TYPE_USER,
KEYC_TYPE_FUNCTION,
KEYC_TYPE_MOUSEMOVE,
KEYC_TYPE_MOUSEDOWN,
KEYC_TYPE_MOUSEUP,
KEYC_TYPE_MOUSEDRAG,
KEYC_TYPE_MOUSEDRAGEND,
KEYC_TYPE_WHEELDOWN,
KEYC_TYPE_WHEELUP,
KEYC_TYPE_SECONDCLICK,
KEYC_TYPE_DOUBLECLICK,
KEYC_TYPE_TRIPLECLICK,
KEYC_TYPE_NOTYPE /* end */
};
/* Is this a mouse key? */
#define KEYC_IS_MOUSE(key) \
(((key) & KEYC_MASK_KEY) >= KEYC_MOUSE && \
((key) & KEYC_MASK_KEY) < KEYC_BSPACE)
enum key_code_mouse_location {
KEYC_MOUSE_LOCATION_PANE,
KEYC_MOUSE_LOCATION_STATUS,
KEYC_MOUSE_LOCATION_STATUS_LEFT,
KEYC_MOUSE_LOCATION_STATUS_RIGHT,
KEYC_MOUSE_LOCATION_STATUS_DEFAULT,
KEYC_MOUSE_LOCATION_BORDER,
KEYC_MOUSE_LOCATION_SCROLLBAR_UP,
KEYC_MOUSE_LOCATION_SCROLLBAR_SLIDER,
KEYC_MOUSE_LOCATION_SCROLLBAR_DOWN,
KEYC_MOUSE_LOCATION_CONTROL0, /* keep order */
KEYC_MOUSE_LOCATION_CONTROL1,
KEYC_MOUSE_LOCATION_CONTROL2,
KEYC_MOUSE_LOCATION_CONTROL3,
KEYC_MOUSE_LOCATION_CONTROL4,
KEYC_MOUSE_LOCATION_CONTROL5,
KEYC_MOUSE_LOCATION_CONTROL6,
KEYC_MOUSE_LOCATION_CONTROL7,
KEYC_MOUSE_LOCATION_CONTROL8,
KEYC_MOUSE_LOCATION_CONTROL9,
KEYC_MOUSE_LOCATION_NOWHERE /* end */
};
/* Is this a Unicode key? */
#define KEYC_IS_UNICODE(key) \
(((key) & KEYC_MASK_KEY) > 0x7f && \
(((key) & KEYC_MASK_KEY) < KEYC_BASE || \
((key) & KEYC_MASK_KEY) >= KEYC_BASE_END) && \
(((key) & KEYC_MASK_KEY) < KEYC_USER || \
((key) & KEYC_MASK_KEY) >= KEYC_USER_END))
(((key) & KEYC_MASK_TYPE) == KEYC_SHIFT_TYPE(KEYC_TYPE_UNICODE) && \
((key) & KEYC_MASK_KEY) > 0x7f)
/* Is this a user key? */
#define KEYC_IS_USER(key) \
(((key) & KEYC_MASK_TYPE) == KEYC_SHIFT_TYPE(KEYC_TYPE_USER))
/* Is this a function key? */
#define KEYC_IS_SPECIAL(key) \
(((key) & KEYC_MASK_TYPE) == KEYC_SHIFT_TYPE(KEYC_TYPE_FUNCTION))
/* Is this a mouse key? */
#define KEYC_IS_MOUSE(key) \
(((key) & KEYC_MASK_KEY) == KEYC_MOUSE || \
(((key) & KEYC_MASK_TYPE) >= KEYC_SHIFT_TYPE(KEYC_TYPE_MOUSEMOVE) && \
((key) & KEYC_MASK_TYPE) <= KEYC_SHIFT_TYPE(KEYC_TYPE_TRIPLECLICK)))
/* Is this a paste key? */
#define KEYC_IS_PASTE(key) \
(((key) & KEYC_MASK_KEY) == KEYC_PASTE_START || \
((key) & KEYC_MASK_KEY) == KEYC_PASTE_END)
(((key) & KEYC_MASK_TYPE) == KEYC_SHIFT_TYPE(KEYC_TYPE_FUNCTION) && \
(((key) & KEYC_MASK_KEY) == KEYC_PASTE_START || \
((key) & KEYC_MASK_KEY) == KEYC_PASTE_END))
/* Multiple click timeout. */
#define KEYC_CLICK_TIMEOUT 300
/* Bit shift for mouse events. */
#define KEYC_MOUSE_LOCATION_SHIFT 0
#define KEYC_MOUSE_BUTTON_SHIFT 8
/* Mouse key codes. */
#define KEYC_MOUSE_KEY(name) \
KEYC_ ## name ## _PANE, \
KEYC_ ## name ## _STATUS, \
KEYC_ ## name ## _STATUS_LEFT, \
KEYC_ ## name ## _STATUS_RIGHT, \
KEYC_ ## name ## _STATUS_DEFAULT, \
KEYC_ ## name ## _SCROLLBAR_UP, \
KEYC_ ## name ## _SCROLLBAR_SLIDER, \
KEYC_ ## name ## _SCROLLBAR_DOWN, \
KEYC_ ## name ## _BORDER
#define KEYC_MOUSE_KEYS(t) \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, PANE), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, STATUS), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, STATUS_LEFT), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, STATUS_RIGHT), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, STATUS_DEFAULT), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, BORDER), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, SCROLLBAR_UP), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, SCROLLBAR_SLIDER), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, SCROLLBAR_DOWN), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL0), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL1), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL2), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL3), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL4), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL5), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL6), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL7), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL8), \
KEYC_MOUSE_KEY(KEYC_ ## t, KEYC_TYPE_ ## t, CONTROL9)
#define KEYC_MOUSE_KEY(p, t, l) \
p ## _ ## l = KEYC_MAKE_MOUSE_KEY(t, 0, KEYC_MOUSE_LOCATION_ ## l), \
p ## 1_ ## l = KEYC_MAKE_MOUSE_KEY(t, 1, KEYC_MOUSE_LOCATION_ ## l), \
p ## 2_ ## l = KEYC_MAKE_MOUSE_KEY(t, 2, KEYC_MOUSE_LOCATION_ ## l), \
p ## 3_ ## l = KEYC_MAKE_MOUSE_KEY(t, 3, KEYC_MOUSE_LOCATION_ ## l), \
p ## 6_ ## l = KEYC_MAKE_MOUSE_KEY(t, 6, KEYC_MOUSE_LOCATION_ ## l), \
p ## 7_ ## l = KEYC_MAKE_MOUSE_KEY(t, 7, KEYC_MOUSE_LOCATION_ ## l), \
p ## 8_ ## l = KEYC_MAKE_MOUSE_KEY(t, 8, KEYC_MOUSE_LOCATION_ ## l), \
p ## 9_ ## l = KEYC_MAKE_MOUSE_KEY(t, 9, KEYC_MOUSE_LOCATION_ ## l), \
p ## 10_ ## l = KEYC_MAKE_MOUSE_KEY(t, 10, KEYC_MOUSE_LOCATION_ ## l), \
p ## 11_ ## l = KEYC_MAKE_MOUSE_KEY(t, 11, KEYC_MOUSE_LOCATION_ ## l)
#define KEYC_MAKE_MOUSE_KEY(t, b, l) \
((KEYC_SHIFT_TYPE(t)) | \
((unsigned long long)(b) << KEYC_MOUSE_BUTTON_SHIFT) | \
((unsigned long long)(l) << KEYC_MOUSE_LOCATION_SHIFT))
#define KEYC_MOUSE_STRING(name, s) \
{ #s "Pane", KEYC_ ## name ## _PANE }, \
{ #s "Status", KEYC_ ## name ## _STATUS }, \
@@ -204,7 +269,17 @@ struct winlink;
{ #s "ScrollbarUp", KEYC_ ## name ## _SCROLLBAR_UP }, \
{ #s "ScrollbarSlider", KEYC_ ## name ## _SCROLLBAR_SLIDER }, \
{ #s "ScrollbarDown", KEYC_ ## name ## _SCROLLBAR_DOWN }, \
{ #s "Border", KEYC_ ## name ## _BORDER }
{ #s "Border", KEYC_ ## name ## _BORDER }, \
{ #s "Control0", KEYC_ ## name ## _CONTROL0 }, \
{ #s "Control1", KEYC_ ## name ## _CONTROL1 }, \
{ #s "Control2", KEYC_ ## name ## _CONTROL2 }, \
{ #s "Control3", KEYC_ ## name ## _CONTROL3 }, \
{ #s "Control4", KEYC_ ## name ## _CONTROL4 }, \
{ #s "Control5", KEYC_ ## name ## _CONTROL5 }, \
{ #s "Control6", KEYC_ ## name ## _CONTROL6 }, \
{ #s "Control7", KEYC_ ## name ## _CONTROL7 }, \
{ #s "Control8", KEYC_ ## name ## _CONTROL8 }, \
{ #s "Control9", KEYC_ ## name ## _CONTROL9 }
/*
* A single key. This can be ASCII or Unicode or one of the keys between
@@ -250,8 +325,15 @@ enum {
/* Special key codes. */
enum {
/* User key code range. */
KEYC_USER = KEYC_SHIFT_TYPE(KEYC_TYPE_USER),
/* Functional key code range. */
KEYC_NONE = KEYC_SHIFT_TYPE(KEYC_TYPE_FUNCTION),
KEYC_UNKNOWN,
/* Focus events. */
KEYC_FOCUS_IN = KEYC_BASE,
KEYC_FOCUS_IN,
KEYC_FOCUS_OUT,
/* "Any" key, used if not found in key table. */
@@ -261,77 +343,6 @@ enum {
KEYC_PASTE_START,
KEYC_PASTE_END,
/* Mouse keys. */
KEYC_MOUSE, /* unclassified mouse event */
KEYC_DRAGGING, /* dragging in progress */
KEYC_DOUBLECLICK, /* double click complete */
KEYC_MOUSE_KEY(MOUSEMOVE),
KEYC_MOUSE_KEY(MOUSEDOWN1),
KEYC_MOUSE_KEY(MOUSEDOWN2),
KEYC_MOUSE_KEY(MOUSEDOWN3),
KEYC_MOUSE_KEY(MOUSEDOWN6),
KEYC_MOUSE_KEY(MOUSEDOWN7),
KEYC_MOUSE_KEY(MOUSEDOWN8),
KEYC_MOUSE_KEY(MOUSEDOWN9),
KEYC_MOUSE_KEY(MOUSEDOWN10),
KEYC_MOUSE_KEY(MOUSEDOWN11),
KEYC_MOUSE_KEY(MOUSEUP1),
KEYC_MOUSE_KEY(MOUSEUP2),
KEYC_MOUSE_KEY(MOUSEUP3),
KEYC_MOUSE_KEY(MOUSEUP6),
KEYC_MOUSE_KEY(MOUSEUP7),
KEYC_MOUSE_KEY(MOUSEUP8),
KEYC_MOUSE_KEY(MOUSEUP9),
KEYC_MOUSE_KEY(MOUSEUP10),
KEYC_MOUSE_KEY(MOUSEUP11),
KEYC_MOUSE_KEY(MOUSEDRAG1),
KEYC_MOUSE_KEY(MOUSEDRAG2),
KEYC_MOUSE_KEY(MOUSEDRAG3),
KEYC_MOUSE_KEY(MOUSEDRAG6),
KEYC_MOUSE_KEY(MOUSEDRAG7),
KEYC_MOUSE_KEY(MOUSEDRAG8),
KEYC_MOUSE_KEY(MOUSEDRAG9),
KEYC_MOUSE_KEY(MOUSEDRAG10),
KEYC_MOUSE_KEY(MOUSEDRAG11),
KEYC_MOUSE_KEY(MOUSEDRAGEND1),
KEYC_MOUSE_KEY(MOUSEDRAGEND2),
KEYC_MOUSE_KEY(MOUSEDRAGEND3),
KEYC_MOUSE_KEY(MOUSEDRAGEND6),
KEYC_MOUSE_KEY(MOUSEDRAGEND7),
KEYC_MOUSE_KEY(MOUSEDRAGEND8),
KEYC_MOUSE_KEY(MOUSEDRAGEND9),
KEYC_MOUSE_KEY(MOUSEDRAGEND10),
KEYC_MOUSE_KEY(MOUSEDRAGEND11),
KEYC_MOUSE_KEY(WHEELUP),
KEYC_MOUSE_KEY(WHEELDOWN),
KEYC_MOUSE_KEY(SECONDCLICK1),
KEYC_MOUSE_KEY(SECONDCLICK2),
KEYC_MOUSE_KEY(SECONDCLICK3),
KEYC_MOUSE_KEY(SECONDCLICK6),
KEYC_MOUSE_KEY(SECONDCLICK7),
KEYC_MOUSE_KEY(SECONDCLICK8),
KEYC_MOUSE_KEY(SECONDCLICK9),
KEYC_MOUSE_KEY(SECONDCLICK10),
KEYC_MOUSE_KEY(SECONDCLICK11),
KEYC_MOUSE_KEY(DOUBLECLICK1),
KEYC_MOUSE_KEY(DOUBLECLICK2),
KEYC_MOUSE_KEY(DOUBLECLICK3),
KEYC_MOUSE_KEY(DOUBLECLICK6),
KEYC_MOUSE_KEY(DOUBLECLICK7),
KEYC_MOUSE_KEY(DOUBLECLICK8),
KEYC_MOUSE_KEY(DOUBLECLICK9),
KEYC_MOUSE_KEY(DOUBLECLICK10),
KEYC_MOUSE_KEY(DOUBLECLICK11),
KEYC_MOUSE_KEY(TRIPLECLICK1),
KEYC_MOUSE_KEY(TRIPLECLICK2),
KEYC_MOUSE_KEY(TRIPLECLICK3),
KEYC_MOUSE_KEY(TRIPLECLICK6),
KEYC_MOUSE_KEY(TRIPLECLICK7),
KEYC_MOUSE_KEY(TRIPLECLICK8),
KEYC_MOUSE_KEY(TRIPLECLICK9),
KEYC_MOUSE_KEY(TRIPLECLICK10),
KEYC_MOUSE_KEY(TRIPLECLICK11),
/* Backspace key. */
KEYC_BSPACE,
@@ -384,8 +395,22 @@ enum {
KEYC_REPORT_DARK_THEME,
KEYC_REPORT_LIGHT_THEME,
/* End of special keys. */
KEYC_BASE_END
/* Mouse state. */
KEYC_MOUSE, /* unclassified mouse event */
KEYC_DRAGGING, /* dragging in progress */
KEYC_DOUBLECLICK, /* double click complete */
/* Mouse key code ranges. Must be at the end. */
KEYC_MOUSE_KEYS(MOUSEMOVE),
KEYC_MOUSE_KEYS(WHEELDOWN),
KEYC_MOUSE_KEYS(WHEELUP),
KEYC_MOUSE_KEYS(MOUSEDOWN),
KEYC_MOUSE_KEYS(MOUSEUP),
KEYC_MOUSE_KEYS(MOUSEDRAG),
KEYC_MOUSE_KEYS(MOUSEDRAGEND),
KEYC_MOUSE_KEYS(SECONDCLICK),
KEYC_MOUSE_KEYS(DOUBLECLICK),
KEYC_MOUSE_KEYS(TRIPLECLICK),
};
/* Termcap codes. */
@@ -880,7 +905,8 @@ enum style_range_type {
STYLE_RANGE_PANE,
STYLE_RANGE_WINDOW,
STYLE_RANGE_SESSION,
STYLE_RANGE_USER
STYLE_RANGE_USER,
STYLE_RANGE_CONTROL
};
struct style_range {
enum style_range_type type;
@@ -894,6 +920,12 @@ struct style_range {
};
TAILQ_HEAD(style_ranges, style_range);
/* Ranges connected with a status line. */
struct style_line_entry {
char *expanded;
struct style_ranges ranges;
};
/* Default style width and pad. */
#define STYLE_WIDTH_DEFAULT -1
#define STYLE_PAD_DEFAULT -1
@@ -952,6 +984,20 @@ enum screen_cursor_style {
SCREEN_CURSOR_BAR
};
/* Progress bar, OSC 9;4. */
enum progress_bar_state {
PROGRESS_BAR_HIDDEN = 0,
PROGRESS_BAR_NORMAL = 1,
PROGRESS_BAR_ERROR = 2,
PROGRESS_BAR_INDETERMINATE = 3,
PROGRESS_BAR_PAUSED = 4
};
struct progress_bar {
enum progress_bar_state state;
int progress;
};
/* Virtual screen. */
struct screen_sel;
struct screen_titles;
@@ -993,6 +1039,7 @@ struct screen {
struct screen_write_cline *write_list;
struct hyperlinks *hyperlinks;
struct progress_bar progress_bar;
};
/* Screen write context. */
@@ -1216,8 +1263,8 @@ struct window_pane {
#define PANE_DROP 0x2
#define PANE_FOCUSED 0x4
#define PANE_VISITED 0x8
/* 0x10 unused */
/* 0x20 unused */
#define PANE_ZOOMED 0x10
#define PANE_FLOATING 0x20
#define PANE_INPUTOFF 0x40
#define PANE_CHANGED 0x80
#define PANE_EXITED 0x100
@@ -1228,9 +1275,7 @@ struct window_pane {
#define PANE_THEMECHANGED 0x2000
#define PANE_UNSEENCHANGES 0x4000
#define PANE_REDRAWSCROLLBAR 0x8000
#define PANE_FLOATING 0x10000
#define PANE_MINIMISED 0x20000
#define PANE_ZOOMED 0x40000
#define PANE_SAVED_FLOAT 0x80000 /* saved_float_* fields are valid */
/* Last floating position/size, saved when the pane is tiled. */
@@ -1268,6 +1313,7 @@ struct window_pane {
struct grid_cell cached_active_gc;
struct colour_palette palette;
enum client_theme last_theme;
struct style_line_entry border_status_line;
int pipe_fd;
pid_t pipe_pid;
@@ -1892,10 +1938,6 @@ struct cmd_entry {
/* Status line. */
#define STATUS_LINES_LIMIT 5
struct status_line_entry {
char *expanded;
struct style_ranges ranges;
};
struct status_line {
struct event timer;
@@ -1904,7 +1946,7 @@ struct status_line {
int references;
struct grid_cell style;
struct status_line_entry entries[STATUS_LINES_LIMIT];
struct style_line_entry entries[STATUS_LINES_LIMIT];
};
/* Prompt type. */
@@ -1969,6 +2011,7 @@ typedef void (*overlay_resize_cb)(struct client *, void *);
struct client {
const char *name;
struct tmuxpeer *peer;
const char *user;
struct cmdq_list *queue;
struct client_windows windows;
@@ -2009,7 +2052,7 @@ struct client {
struct event repeat_timer;
struct event click_timer;
int click_where;
int click_loc;
int click_wp;
u_int click_button;
struct mouse_event click_event;
@@ -3312,6 +3355,7 @@ int screen_set_title(struct screen *, const char *);
void screen_set_path(struct screen *, const char *);
void screen_push_title(struct screen *);
void screen_pop_title(struct screen *);
void screen_set_progress_bar(struct screen *, enum progress_bar_state, int);
void screen_resize(struct screen *, u_int, u_int, int);
void screen_resize_cursor(struct screen *, u_int, u_int, int, int, int);
void screen_set_selection(struct screen *, u_int, u_int, u_int, u_int,
@@ -3324,7 +3368,7 @@ int screen_select_cell(struct screen *, struct grid_cell *,
void screen_alternate_on(struct screen *, struct grid_cell *, int);
void screen_alternate_off(struct screen *, struct grid_cell *, int);
const char *screen_mode_to_string(int);
const char *screen_print(struct screen *);
const char *screen_print(struct screen *, int);
/* window.c */
extern struct windows windows;
@@ -3404,7 +3448,7 @@ int window_pane_exited(struct window_pane *);
u_int window_pane_search(struct window_pane *, const char *, int,
int);
const char *window_printable_flags(struct winlink *, int);
const char *window_pane_printable_flags(struct window_pane *, int);
const char *window_pane_printable_flags(struct window_pane *);
struct window_pane *window_pane_find_up(struct window_pane *);
struct window_pane *window_pane_find_down(struct window_pane *);
struct window_pane *window_pane_find_left(struct window_pane *);
@@ -3435,6 +3479,8 @@ int window_pane_get_bg_control_client(struct window_pane *);
int window_get_bg_client(struct window_pane *);
enum client_theme window_pane_get_theme(struct window_pane *);
void window_pane_send_theme_update(struct window_pane *);
struct style_range *window_pane_border_status_get_range(struct window_pane *,
u_int, u_int);
/* layout.c */
u_int layout_count_cells(struct layout_cell *);
@@ -3756,6 +3802,9 @@ void style_set(struct style *, const struct grid_cell *);
void style_copy(struct style *, struct style *);
void style_set_scrollbar_style_from_option(struct style *,
struct options *);
void style_ranges_init(struct style_ranges *);
void style_ranges_free(struct style_ranges *);
struct style_range *style_ranges_get_range(struct style_ranges *, u_int);
/* spawn.c */
struct winlink *spawn_window(struct spawn_context *, char **);