mirror of
https://github.com/tmux/tmux.git
synced 2026-09-22 12:57:43 +00:00
a7f74730d7d9ea9501ccd59565c8a52edb038783
server_client_key_callback()'s mouse-drag dispatch opens a synchronized-output frame (tty_sync_start()) before running the drag callback, on every single drag motion event - deliberately, so a fast- path write and any later damage-composed correction land in one atomic terminal update instead of two visible frames. But server_client_check_redraw() later in the same pass checks EVBUFFER_LENGTH(tty->out) != 0 to decide whether to defer this pass's redraw, and nothing drains tty->out in between (the actual write happens later, via libevent) - so the frame-open sequence just queued (8 bytes: "\033[?2026h" on a synchronized-output-capable terminal) makes that check see "outstanding output" and defer against itself, escalating the drag's damage to a full-window redraw on every single motion event. Confirmed via the server's own -vv log: a 6-step drag produced five "redraw deferred (8 left)" lines, one per motion event, with no fix. Fix: record how much was already queued at the instant the sync frame opened (tty->sync_offset), and have the redraw check discount anything queued after that point - it's already part of the frame this pass is committed to flushing, not a reason to defer. If the buffer was genuinely non-empty before the frame opened, sync_offset holds that real backlog and deferral still happens correctly. regress/floating-pane-drag-sync-no-self-defer.sh drags a floating pane on a synchronized-output-capable terminal and asserts the server log never shows the self-inflicted 8-byte deferral. Verified failing 3/3 against the pre-fix code (5 occurrences per run, matching the manual -vv repro) and passing 5/5 against the fix. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Welcome to tmux! tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached. This release runs on OpenBSD, FreeBSD, NetBSD, Linux, macOS and Solaris. * Dependencies tmux depends on libevent 2.x, available from: https://github.com/libevent/libevent/releases/latest It also depends on ncurses, available from: https://invisible-mirror.net/archives/ncurses/ To build tmux, a C compiler (for example gcc or clang), make, pkg-config and a suitable yacc (yacc or bison) are needed. * Installation To build and install tmux from a release tarball, use: $ ./configure && make $ sudo make install tmux can use the utempter library to update utmp(5), if it is installed - run configure with --enable-utempter to enable this. To get and build the latest from version control - note that this requires autoconf, automake and pkg-config: $ git clone https://github.com/tmux/tmux.git $ cd tmux $ sh autogen.sh $ ./configure && make $ sudo make install * Contributing Bug reports, feature suggestions and especially code contributions are most welcome. Please send by email to: tmux-users@googlegroups.com Or open a GitHub issue or pull request. * Documentation For documentation on using tmux, see the tmux.1 manpage. View it from the source tree with: $ nroff -mdoc tmux.1|less A small example configuration is in example_tmux.conf. Other documentation is available in the wiki: https://github.com/tmux/tmux/wiki Also see the tmux FAQ at: https://github.com/tmux/tmux/wiki/FAQ A bash(1) completion file is at: https://github.com/scop/bash-completion/blob/main/completions/tmux For debugging, run tmux with -v and -vv to generate server and client log files in the current directory. * Support The tmux mailing list for general discussion and bug reports is: https://groups.google.com/forum/#!forum/tmux-users Subscribe by sending an email to: tmux-users+subscribe@googlegroups.com * License This file and the CHANGES files are licensed under the ISC license. All other files have a license and copyright notice at their start.
Description
Languages
C
73.1%
Shell
19.1%
Roff
5.7%
Yacc
0.9%
M4
0.7%
Other
0.4%