diff --git a/options-table.c b/options-table.c index 83e44067..d9918193 100644 --- a/options-table.c +++ b/options-table.c @@ -664,6 +664,13 @@ const struct options_table_entry options_table[] = { .text = "Time for which status line messages should appear." }, + { .name = "focus-follows-mouse", + .type = OPTIONS_TABLE_FLAG, + .scope = OPTIONS_TABLE_SESSION, + .default_num = 0, + .text = "Whether moving the mouse into a pane selects it." + }, + { .name = "history-limit", .type = OPTIONS_TABLE_NUMBER, .scope = OPTIONS_TABLE_SESSION, diff --git a/server-client.c b/server-client.c index 7f1942c7..1c41870f 100644 --- a/server-client.c +++ b/server-client.c @@ -1060,8 +1060,16 @@ have_event: case NOTYPE: break; case MOVE: - if (where == PANE) + if (where == PANE) { key = KEYC_MOUSEMOVE_PANE; + if (wp != NULL && + wp != w->active && + options_get_number(s->options, "focus-follows-mouse")) { + window_set_active_pane(w, wp, 1); + server_redraw_window_borders(w); + server_status_window(w); + } + } if (where == STATUS) key = KEYC_MOUSEMOVE_STATUS; if (where == STATUS_LEFT) @@ -2969,7 +2977,8 @@ server_client_reset_state(struct client *c) /* * Set mouse mode if requested. To support dragging, always use button - * mode. + * mode. For focus-follows-mouse, we need all-motion mode to receive + * movement events. */ if (options_get_number(oo, "mouse")) { if (c->overlay_draw == NULL) { @@ -2979,7 +2988,9 @@ server_client_reset_state(struct client *c) mode |= MODE_MOUSE_ALL; } } - if (~mode & MODE_MOUSE_ALL) + if (options_get_number(oo, "focus-follows-mouse")) + mode |= MODE_MOUSE_ALL; + else if (~mode & MODE_MOUSE_ALL) mode |= MODE_MOUSE_BUTTON; } diff --git a/tmux.1 b/tmux.1 index 3085fb85..b8acaa38 100644 --- a/tmux.1 +++ b/tmux.1 @@ -4244,6 +4244,12 @@ passed through to applications running in .Nm . Attached clients should be detached and attached again after changing this option. +.It Xo Ic focus-follows-mouse +.Op Ic on | off +.Xc +When enabled and +.Ic mouse +is on, moving the mouse into a pane selects it. .It Xo Ic get-clipboard .Op Ic both | request | buffer | off .Xc @@ -6240,6 +6246,7 @@ The following variables are available, where appropriate: .It Li "selection_active" Ta "" Ta "1 if selection started and changes with the cursor in copy mode" .It Li "selection_end_x" Ta "" Ta "X position of the end of the selection" .It Li "selection_end_y" Ta "" Ta "Y position of the end of the selection" +.It Li "selection_mode" Ta "" Ta "Selection mode" .It Li "selection_present" Ta "" Ta "1 if selection started in copy mode" .It Li "selection_start_x" Ta "" Ta "X position of the start of the selection" .It Li "selection_start_y" Ta "" Ta "Y position of the start of the selection" diff --git a/window-copy.c b/window-copy.c index f8700555..87d0dea8 100644 --- a/window-copy.c +++ b/window-copy.c @@ -956,6 +956,18 @@ window_copy_formats(struct window_mode_entry *wme, struct format_tree *ft) format_add(ft, "selection_present", "0"); } + switch (data->selflag) { + case SEL_CHAR: + format_add(ft, "selection_mode", "char"); + break; + case SEL_WORD: + format_add(ft, "selection_mode", "word"); + break; + case SEL_LINE: + format_add(ft, "selection_mode", "line"); + break; + } + format_add(ft, "search_present", "%d", data->searchmark != NULL); format_add(ft, "search_timed_out", "%d", data->timeout); if (data->searchcount != -1) {