2351 Commits
1.2 ... 1.8

Author SHA1 Message Date
Thomas Adam
1b083aa0fd Update CHANGES and configure.ac for 1.8 release. 2013-03-26 20:19:04 +00:00
Thomas
399a15b9fc Merge branch 'obsd-master' 2013-03-26 16:59:37 +00:00
Nicholas Marriott
dfac36b6c3 Only accept partial keys if the timer has not expired, fixes infinite
loop when Escape is pressed the wrong number of times.
2013-03-26 14:14:08 +00:00
Nicholas Marriott
771d7db3a6 Fix compiler warnings, missing #include. From Thomas Adam. 2013-03-26 10:54:48 +00:00
Thomas
00af2df102 Merge branch 'obsd-master' 2013-03-25 16:30:37 +00:00
Nicholas Marriott
be390c1991 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-03-25 16:13:22 +00:00
Nicholas Marriott
2fd0cb7600 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code
Conflicts:
	TODO
	cmd-queue.c
	cmd-server-info.c
	cmd-wait-for.c
	tmux.1
2013-03-25 16:11:22 +00:00
Thomas Adam
5f5d413408 Remove compat/vis.h from cmd-save-buffer.
The include for compat.h in tmux.h takes care of this.

BUG-ID:  N/A
2013-03-25 16:09:34 +00:00
Nicholas Marriott
972da2d498 Try to establish client for run-shell and if-shell if no -t. 2013-03-25 16:04:07 +00:00
Nicholas Marriott
e44bd9f750 Revert the command-prefix change which breaks sequences of commands. 2013-03-25 15:59:57 +00:00
Nicholas Marriott
777edd0269 Add to TODO. 2013-03-25 15:47:16 +00:00
Nicholas Marriott
855d6fe1fe Add to TODO. 2013-03-25 15:47:10 +00:00
Nicholas Marriott
b625ad6d8b Use -std=gnu99 not c99 with GCC. 2013-03-25 15:33:23 +00:00
Thomas Adam
97b5df35b1 Portability fix-ups
* Ammend the Makefile to include newer commands.
* "compat/vis.h" versus <vis.h>
* Removal of cmd-send-prefix.c and cmd-show-buffer.c
* osdep-* for processes.

BUG-ID:  N/A
2013-03-25 15:32:02 +00:00
Thomas Adam
7a87c7eff6 Fixup Makefile 2013-03-25 15:00:56 +00:00
Thomas Adam
f90eb43fcb Merge branch 'obsd-master' 2013-03-25 14:59:29 +00:00
Nicholas Marriott
a09d8e88fc Use -std=gnu99 not c99 with GCC. 2013-03-25 12:16:03 +00:00
Nicholas Marriott
b5fda7ad2a Spacing, warning nits. 2013-03-25 12:00:30 +00:00
Nicholas Marriott
58bb6f8c56 Set pane resize flag when needed. 2013-03-25 11:55:01 +00:00
Nicholas Marriott
673eb160d4 Sort includes and fix spaces. 2013-03-25 11:53:54 +00:00
Nicholas Marriott
e97e0d7e54 Man page fixes. 2013-03-25 11:49:54 +00:00
Nicholas Marriott
4119c476aa b comes before t. 2013-03-25 11:46:28 +00:00
Nicholas Marriott
e2295014d9 Process ^[ as meta when a partial key is found. 2013-03-25 11:44:16 +00:00
Nicholas Marriott
43fb9835fa Add -P and -F to new-session. 2013-03-25 11:44:00 +00:00
Nicholas Marriott
599dd2a560 Create a new context when copying instead of using the input
context. The input context may not exist yet. Fixes crash when copying
from config file errors.
2013-03-25 11:43:33 +00:00
Nicholas Marriott
d28a39d01d Extend jobs to support writing and use that for copy-pipe instead of
popen, from Chris Johnsen.
2013-03-25 11:43:01 +00:00
Nicholas Marriott
270d90ce1e Handle empty pending output (not a failure) and add \n. From George
Nachman.
2013-03-25 11:42:19 +00:00
Nicholas Marriott
0c969a7dfd Handle no client better in display-message. 2013-03-25 11:42:01 +00:00
Nicholas Marriott
111d993e75 When only two panes in a window, only draw half the separating line as
active.
2013-03-25 11:41:49 +00:00
Nicholas Marriott
0ef24f9912 Only send end guard if begin was sent, from George Nachman. 2013-03-25 11:41:16 +00:00
Nicholas Marriott
87fe1c0b0e Include prefix on ids, from George Nachman. 2013-03-25 11:40:54 +00:00
Nicholas Marriott
114d822d27 Don't zoom windows with one pane, from Romain Francoise. 2013-03-25 11:39:11 +00:00
Nicholas Marriott
88b92df849 We ignore SIGWINCH until ready, so send a MSG_RESIZE immediately when
becoming ready.
2013-03-25 11:38:57 +00:00
Nicholas Marriott
e4c0730bf1 Use single stdout and stderr for control clients. 2013-03-25 11:36:59 +00:00
Nicholas Marriott
8a40e10d55 Add time and a command count to control mode guards, based on code from
George Nachman.
2013-03-25 11:35:55 +00:00
Nicholas Marriott
e0961dfdf4 Fix handling of short (< 4 character) checksums and a bug with parsing
old-style custom layouts. Based on fix from Chris Johnsen.
2013-03-25 11:35:30 +00:00
Nicholas Marriott
446fb0cb9c Do not redraw panes if invisible. 2013-03-25 10:12:01 +00:00
Nicholas Marriott
6fee3e9e4b Rename session idx to session id throughout and add $ prefix to targets
to use it, extended from a diff from George Nachman.
2013-03-25 10:11:45 +00:00
Nicholas Marriott
748acdc77c Add wait-for -L and -U for lock and unlock, from Thiago Padilha. 2013-03-25 10:09:35 +00:00
Nicholas Marriott
410a3abbef Add a wait-for command which blocks a client on a named channel until it
is woken up again (with wait-for -S). From Thiago Padilha.
2013-03-25 10:09:05 +00:00
Nicholas Marriott
304336a591 Allow lastgc to be NULL in grid_string_cells so find-window doesn't
crash, problem reported by eugene everson.
2013-03-25 10:07:40 +00:00
Nicholas Marriott
35452b3e55 Do not leak command in formats, from Romain Francoise. 2013-03-25 10:07:21 +00:00
Nicholas Marriott
ebd9c615c8 Add some additional debug logging. 2013-03-25 10:06:13 +00:00
Nicholas Marriott
e9cef8bf30 Continue the parent cmdq after sourcing a file. 2013-03-25 10:05:58 +00:00
Nicholas Marriott
e85f764f23 Preserve trailing spaces with capture-pane -J, from George Nachman. 2013-03-25 10:05:35 +00:00
Nicholas Marriott
e2e85650ac tty.path can be NULL, don't dereference it. From George Nachman. 2013-03-25 10:04:44 +00:00
Nicholas Marriott
2c14a771a8 Remove some unused/unnecessary control notifications, from George Nachman. 2013-03-25 10:04:23 +00:00
Nicholas Marriott
d39b1a87a5 Add -q flags to shut up errors to capture-pane and show-options, from
George Nachman.
2013-03-25 10:04:04 +00:00
Nicholas Marriott
62db3c8efe Send DSC 1000p at the beginning of a -CC client's lifetime and ST and
the end, from George Nachman.
2013-03-25 10:03:24 +00:00
Nicholas Marriott
efa06643b0 Remove previous. 2013-03-25 10:03:00 +00:00
Nicholas Marriott
14fad6a5cc Add -A flag to new-session to make it behave like attach-session if the
session exists. If -A is used, -D behaves like -d to attach-session.
2013-03-24 09:58:40 +00:00
Nicholas Marriott
c71844de63 Add resize-pane -Z to temporary zoom the active pane to occupy the full
window or unzoom (restored to the normal layout) if it already zoomed,
bound to C-b z by default. The pane is unzoomed on pretty much any
excuse whatsoever.

We considered making this a new layout but the requirements are quite
different from layouts so decided it is better as a special case. Each
current layout cell is saved, a temporary one-cell layout generated and
all except the active pane set to NULL.

Prompted by suggestions and scripts from several. Thanks to Aaron Jensen
and Thiago Padilha for testing an earlier version.
2013-03-24 09:57:59 +00:00
Nicholas Marriott
a05b8c4143 Add a -o option to set-option to prevent setting an option already set,
from Thiago Padilha.
2013-03-24 09:55:02 +00:00
Nicholas Marriott
20636d956d Add a command queue to standardize and simplify commands that call other
commands and allow a command to block execution of subsequent
commands. This allows run-shell and if-shell to be synchronous which has
been much requested.

Each client has a default command queue and commands are consumed one at
a time from it. A command may suspend execution from the queue by
returning CMD_RETURN_WAIT and then resume it by calling cmd_continue() -
for example run-shell does this from the callback that is fired after
the job is freed.

When the command queue becomes empty, command clients are automatically
exited (unless attaching). A callback is also fired - this is used for
nested commands in, for example, if-shell which can block execution of
the client's cmdq until a new cmdq becomes empty.

Also merge all the old error/info/print functions together and lose the
old curclient/cmdclient distinction - a cmdq is bound to one client (or
none if in the configuration file), this is a command client if
c->session is NULL otherwise an attached client.
2013-03-24 09:54:10 +00:00
Nicholas Marriott
66edb3392b Expand format variables in the run-shell and if-shell shell commands,
from Thiago Padilha.
2013-03-24 09:33:35 +00:00
Nicholas Marriott
86adcd4b26 Add pane_tabs format to format_window_pane based on code from George
Nachman.
2013-03-24 09:29:40 +00:00
Nicholas Marriott
a60687f9ba Handle focus events from the terminal, from Aaron Jensen. 2013-03-24 09:28:59 +00:00
Nicholas Marriott
bb8457b166 Fix error reporting for client commands by adding a flag to
cmd_find_client to tell it whether or not to show errors, sometimes it's
needed and sometimes not.
2013-03-24 09:27:19 +00:00
Nicholas Marriott
3eae71b5b2 Do pane resize ioctls once at the end of the server loop rather than
immediately.
2013-03-24 09:25:04 +00:00
Nicholas Marriott
8094e82287 Add option command-prefix which is automatically prepended to any
command (apart from a naked default-shell). The default is "exec ".
2013-03-24 09:21:27 +00:00
Nicholas Marriott
1ec4354998 Add support for focus notifications when tmux pane changes, based on
work by Aaron Jensen.
2013-03-24 09:18:16 +00:00
Nicholas Marriott
ac1fe83596 Couple of fixes pointed out by jmc. 2013-03-22 18:45:36 +00:00
Nicholas Marriott
c7d1849e1c Process ^[ as meta when a partial key is found. 2013-03-22 17:02:12 +00:00
Nicholas Marriott
7f191c7951 Add -P and -F to new-session. 2013-03-22 17:01:15 +00:00
Nicholas Marriott
702ab8bab0 Add a load of miscellaneous pane formats, from George Nachman. 2013-03-22 16:03:35 +00:00
Nicholas Marriott
eaaeb28cda Add session_set_current helper function, extracted from a diff from
Aaron Jensen.
2013-03-22 16:00:26 +00:00
Nicholas Marriott
295d86911e Add -C and -J to capture pane to escape control sequences and to join
wrapped line, based on a diff from George Nachman.
2013-03-22 15:56:11 +00:00
Nicholas Marriott
c519f9a84c evbuffer_readline returns allocated storage, don't leak it. 2013-03-22 15:55:22 +00:00
Nicholas Marriott
2243cfbe75 Need to set clients in context before changing their reference count. 2013-03-22 15:54:29 +00:00
Nicholas Marriott
d644e5143f Fix so capture-pane/save-buffer can work in control clients, from George
Nachman.
2013-03-22 15:53:24 +00:00
Nicholas Marriott
58932295fc Add copy-pipe mode command to copy selection and also pipe to a command. 2013-03-22 15:52:40 +00:00
Nicholas Marriott
8478895eeb Add -e flag to capture-pane to include embedded ANSI SGR escape
sequences, from George Nachman.
2013-03-22 15:51:54 +00:00
Nicholas Marriott
8a6fbfa148 Don't use a target-client for stdout, just always cmdclient. 2013-03-22 15:51:15 +00:00
Nicholas Marriott
a1722d5c2e Remove unnecessary initializers of cmd_ctx. 2013-03-22 15:50:42 +00:00
Nicholas Marriott
0ff9275ad7 load_cfg can actually use the same context now they are reference counted. 2013-03-22 15:50:13 +00:00
Nicholas Marriott
d1e6ce2672 Add functions to allocate and free command contexts rather than doing it
all on the stack.
2013-03-22 15:49:55 +00:00
Nicholas Marriott
0ccd84d2ef Instead of skipping del_curterm on FreeBSD < 7, skip it on ncurses < 5.7. It
looks like 5.6 on Linux has the problem too. Reported by Myles Dear.
2013-03-22 15:36:45 +00:00
Nicholas Marriott
29613f2f31 Prevent lock on control clients, not on others. 2013-03-22 10:42:55 +00:00
Nicholas Marriott
8c545bbfa8 Don't try to print unterminated strings when loading configuration file. 2013-03-22 10:41:57 +00:00
Nicholas Marriott
f19836550b Unbreak line wrapping. 2013-03-22 10:41:01 +00:00
Nicholas Marriott
79f5fe6f5b Use tty_raw on stop, not tty_puts. 2013-03-22 10:40:22 +00:00
Nicholas Marriott
2f5fa4ee9d Don't hang when clearing line in choose mode now that the cursor stays
at the end with wrap.
2013-03-22 10:38:33 +00:00
Nicholas Marriott
db66d85176 Fix double space in sessions template. 2013-03-22 10:38:13 +00:00
Nicholas Marriott
f0efa576e0 Add resize-pane -x and -y for absolute pane size (much requested). 2013-03-22 10:37:39 +00:00
Nicholas Marriott
ad5df9bc2f Implement DECAWM (SM/RM 7) using existing MODE_WRAP flag. 2013-03-22 10:36:53 +00:00
Nicholas Marriott
22a2949bd2 Correctly handle UTF8 mouse option being toggled, from Egmont Koblinger. 2013-03-22 10:34:46 +00:00
Nicholas Marriott
67b4d5b609 Support the latest theory for mouse input, this is enabled/disabled with
SM/RM 1006 and is similar in style to SGR input: \033[<b;x;yM or
\033[b;x;ym. From Egmont Koblinger.
2013-03-22 10:33:50 +00:00
Nicholas Marriott
ad760b3bf7 Add client_session and client_last_session formats. 2013-03-22 10:32:36 +00:00
Nicholas Marriott
8d59b189cc No more lint means no more ARGSUSED. 2013-03-22 10:31:22 +00:00
Nicholas Marriott
306a3b8d80 In terminals with XT, turn on modifyOtherKeys=1 with the escape sequence
and handle the most common set. Pass them through if xterm-keys is on.
2013-03-22 10:30:04 +00:00
Nicholas Marriott
041a911c43 Create a new context when copying instead of using the input context. The input
context may not exist yet.
2013-03-21 23:57:21 +00:00
Nicholas Marriott
10682b9e7e Instead of loads of little screen_write_*_on and off functions which
just change mode flags, just have screen_write_mode_set and
screen_write_mode_clear.
2013-03-21 18:47:56 +00:00
Nicholas Marriott
c5504af4a6 Add various checks to turn off bits that can't work in control mode
(such as lock).
2013-03-21 18:47:01 +00:00
Nicholas Marriott
49ac5b5fe0 Do not include status line in size calculations in control mode. 2013-03-21 18:46:12 +00:00
Nicholas Marriott
d4785fe798 Don't set key KEYC_NONE on xterm_keys_find match()
When calling xterm_keys_find(); if we get a complete match, don't set
the key to unknown before calling the action to complete the binding;
otherwise non-prefixed bindings will not work.

From Thomas Adam
2013-03-21 18:45:38 +00:00
Nicholas Marriott
3d24c75d0f Include the \033 in the key tree and adjust key matching for this change. 2013-03-21 18:44:47 +00:00
Nicholas Marriott
78543cce30 Support capture-pane -p to send to stdout. 2013-03-21 18:43:34 +00:00
Jason McIntyre
55bf2ecc68 tweak previous; ok nicm 2013-03-21 17:42:36 +00:00
Nicholas Marriott
51ac2a3202 Fix a couple of memory leaks, from Romain Francoise. 2013-03-21 16:54:37 +00:00
Nicholas Marriott
48291f0eeb Make choose-tree actually work again. 2013-03-21 16:53:12 +00:00
Nicholas Marriott
d5139d1401 Fix a comment for new key table names. 2013-03-21 16:52:02 +00:00
Nicholas Marriott
3665be7c44 Tidy by splitting default key tables into two. 2013-03-21 16:50:22 +00:00
Nicholas Marriott
801d64a16e Add -c to refresh-client to set client size in control mode, based on
code from George Nachman.
2013-03-21 16:49:37 +00:00
Nicholas Marriott
dd46c95e23 Aargh. Spaces -> tabs. 2013-03-21 16:25:08 +00:00
Nicholas Marriott
4920306486 Clarify choose-tree entry in man page. 2013-03-21 16:23:46 +00:00
Nicholas Marriott
66414029a1 Run session command before window in choose-tree. 2013-03-21 16:23:07 +00:00
Nicholas Marriott
51d989f5df Do not crash when calling choose-tree with a command that changes the mode. 2013-03-21 16:22:48 +00:00
Nicholas Marriott
c982279950 Fix constness of cmd_template_replace, window_choose_add_item and
window_choose_add_window.
2013-03-21 16:19:25 +00:00
Nicholas Marriott
0c0953f3bd Add user options, prefixed with @. May be set to any arbitrary string. 2013-03-21 16:17:01 +00:00
Nicholas Marriott
69fe5ca567 Add -v to set and setw to show only option value. 2013-03-21 16:15:52 +00:00
Nicholas Marriott
63b4fd5cac Add a format client_prefix which is 1 if prefix key has been
pressed, used for example #{?client_prefix,X,Y}. Also a few extra
server_client_status needed.
2013-03-21 16:14:09 +00:00
Nicholas Marriott
dd76497ab0 Show alias in lscm output. 2013-03-21 16:12:50 +00:00
Nicholas Marriott
9b7e18f166 Rework reflow code so it does not do so much allocation which should be
faster with large histories.
2013-03-21 16:12:10 +00:00
Nicholas Marriott
180faf73af Allow choose commands to be used outside tmux, so long as at least one
client is attached.
2013-03-21 16:09:59 +00:00
Nicholas Marriott
6ddb06d372 Extend jobs to support writing and use that for copy-pipe instead of popen,
from Chris Johnsen.
2013-03-21 14:24:33 +00:00
Nicholas Marriott
69d97f6d4b Handle empty pending output (not a failure) and add \n. From George Nachman. 2013-03-19 09:34:00 +00:00
Nicholas Marriott
f5de847a0c Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-03-17 23:45:19 +00:00
Nicholas Marriott
6bdc947f6b Handle no client better in display-message. 2013-03-14 16:02:33 +00:00
Nicholas Marriott
919bde7cb1 When only two panes in a window, only draw half the separating line as active. 2013-03-14 12:08:26 +00:00
Nicholas Marriott
3d974b7267 Don't let display-message crash if no client, from George Nachman. 2013-03-14 07:31:20 +00:00
Nicholas Marriott
c5ad47ee7c Only send end guard if begin was sent, from George Nachman. 2013-03-13 07:31:36 +00:00
Nicholas Marriott
4d38b6d1fa Include prefix on ids, from George Nachman. 2013-03-13 07:28:12 +00:00
Nicholas Marriott
9e879b4aab Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-03-12 22:49:56 +00:00
Nicholas Marriott
99934bf998 Write escaped output in control mode rather than hex, from George Nachman. 2013-03-12 22:48:58 +00:00
Nicholas Marriott
8840f2d629 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-03-12 14:59:27 +00:00
Nicholas Marriott
d32a546d6e Clarify zoom/unzoom, from Romain Francoise. 2013-03-12 14:58:48 +00:00
Nicholas Marriott
8aa40ec1c7 Don't zoom windows with one pane, from Romain Francoise. 2013-03-12 12:18:52 +00:00
Nicholas Marriott
543420ccd2 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-03-11 21:31:46 +00:00
Nicholas Marriott
064022548b We ignore SIGWINCH until ready, so send a MSG_RESIZE immediately when becoming
ready.
2013-03-11 21:30:48 +00:00
Nicholas Marriott
7c00950967 Don't add prefix to %output pane id. 2013-03-11 15:28:34 +00:00
Nicholas Marriott
b5516771d3 Clean up capture-pane and add -P option to dump pending output, based on code
from George Nachman.
2013-03-11 13:47:29 +00:00
Nicholas Marriott
7b4084a15a Document control mode in the manpage, from George Nachman. 2013-03-11 13:06:30 +00:00
Nicholas Marriott
412ac6bc3a Use single stdout and stderr for control clients. 2013-03-11 09:46:18 +00:00
Nicholas Marriott
a6ad44f111 Fix if-shell and run-shell if there are no sessions. Batted around through
several people, finished off by Chris Johnsen.
2013-03-11 09:43:56 +00:00
Nicholas Marriott
97620bb5be Add a home and end as modified by xterm in keypad mode, from Chris Johnsen. 2013-03-11 09:37:52 +00:00
Nicholas Marriott
49ed75d883 Fix a warning. 2013-03-11 09:37:16 +00:00
Nicholas Marriott
c41d92d27a Add time and a command count to control mode guards, based on code from George
Nachman.
2013-03-11 09:35:44 +00:00
Nicholas Marriott
a060aa2bf0 Fix handling of short (< 4 character) checksums and a bug with parsing
old-style custom layouts. Based on fix from Chris Johnsen.
2013-03-10 23:41:59 +00:00
Nicholas Marriott
2ac6501698 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-03-09 21:33:28 +00:00
Nicholas Marriott
06ac399ce6 Zoom script is no longer needed. 2013-03-09 21:32:47 +00:00
Nicholas Marriott
dde5d49a5e Do not redraw panes if invisible. 2013-03-09 17:29:22 +00:00
Nicholas Marriott
89d3f13945 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-03-07 10:09:13 +00:00
Nicholas Marriott
f47a063841 Rename session idx to session id throughout and add $ prefix to targets to use
it, extended from a diff from George Nachman.
2013-03-07 10:07:22 +00:00
Nicholas Marriott
e964ff70e6 Fix --disable-static, reported by Shea Levy. 2013-03-06 14:58:48 +00:00
Nicholas Marriott
bc3580fa06 Add wait-for -L and -U for lock and unlock, from Thiago Padilha. 2013-03-06 11:00:55 +00:00
Nicholas Marriott
7fd4d49d56 Add a wait-for command which blocks a client on a named channel until it is
wokrn up again (with wait-for -S). From Thiago Padilha.
2013-03-06 09:57:26 +00:00
Nicholas Marriott
ec75f9d1a3 Allow lastgc to be NULL in grid_string_cells so find-window doesn't crash,
problem reported by eugene everson.
2013-03-06 09:56:31 +00:00
Nicholas Marriott
6405fceee2 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-03-05 20:02:47 +00:00
Nicholas Marriott
f9e46a373f Do not leak command in formats, from Romain Francoise. 2013-03-05 20:01:16 +00:00
Nicholas Marriott
d05debbe19 Unzoom on last-pane and fix a typo, from Romain Francoise. 2013-03-05 18:00:14 +00:00
Nicholas Marriott
f8c86a9515 Add some additional debug logging. 2013-03-05 17:17:59 +00:00
Nicholas Marriott
2c9cddd876 Continue the parent cmdq after sourcing a file. 2013-03-05 17:14:19 +00:00
Nicholas Marriott
aaeee34c32 Preserve trailing spaces with capture-pane -J, from George Nachman. 2013-03-04 11:03:03 +00:00
Nicholas Marriott
70397e4a95 Print %%error not %%end guard on error, from George Nachman. 2013-03-04 09:09:07 +00:00
Nicholas Marriott
43d904dbf3 tty.path can be NULL, don't dereference it. From George Nachman. 2013-03-04 09:02:32 +00:00
Nicholas Marriott
1da64bf786 Remove some unused/unnecessary control notifications, from George Nachman. 2013-03-04 09:01:30 +00:00
Nicholas Marriott
1cb1fb5bd4 Add -q flags to shut up errors to capture-pane and show-options, from George
Nachman.
2013-03-04 09:00:24 +00:00
Nicholas Marriott
208881a735 Send DSC 1000p at the beginning of a -CC client's lifetime and ST and the end,
from George Nachman..
2013-03-04 08:52:41 +00:00
Thomas Adam
a2f52d4224 Remove previous 2013-02-25 18:25:37 +00:00
Thomas Adam
2ccb67cae4 Plug small memory leak in run-shell
Don't potentially leak the command to run were it to fail.
2013-02-25 07:33:21 +00:00
Nicholas Marriott
b2a61348dd Add -a to capture-pane to capture alternate screen, from George Nachman. 2013-02-24 07:52:03 +00:00
Nicholas Marriott
234f6d27c1 Use \\ not \ for escaping \. 2013-02-24 07:49:54 +00:00
Nicholas Marriott
f339cfd315 Add -A flag to new-session to make it behave like attach-session if the session
exists. If -A is used, -D behaves like -d to attach-session.
2013-02-24 00:43:28 +00:00
Nicholas Marriott
c5239c5984 Add resize-pane -Z to temporary zoom the active pane to occupy the full window
or unzoom (restored to the normal layout) if it already zoomed, bound to C-b z
by default. The pane is unzoomed on pretty much any excuse whatsoever.

We considered making this a new layout but the requirements are quite different
from layouts so decided it is better as a special case. Each current layout
cell is saved, a temporary one-cell layout generated and all except the active
pane set to NULL.

Prompted by suggestions and scripts from several. Thanks to Aaron Jensen and
Thiago Padilha for testing an earlier version.
2013-02-24 00:25:03 +00:00
Nicholas Marriott
be13479f09 Add a -o option to set-option to prevent setting an option already set, from
Thiago Padilha.
2013-02-23 23:22:03 +00:00
Nicholas Marriott
69a8d64716 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code
Conflicts:
	cmd-if-shell.c
	cmd-run-shell.c
	tmux.1
2013-02-23 22:42:49 +00:00
Nicholas Marriott
3964309c67 Add a command queue to standardize and simplify commands that call other
commands and allow a command to block execution of subsequent commands. This
allows run-shell and if-shell to be synchronous which has been much requested.

Each client has a default command queue and commands are consumed one at a time
from it. A command may suspend execution from the queue by returning
CMD_RETURN_WAIT and then resume it by calling cmd_continue() - for example
run-shell does this from the callback that is fired after the job is freed.

When the command queue becomes empty, command clients are automatically exited
(unless attaching). A callback is also fired - this is used for nested commands
in, for example, if-shell which can block execution of the client's cmdq until
a new cmdq becomes empty.

Also merge all the old error/info/print functions together and lose the old
curclient/cmdclient distinction - a cmdq is bound to one client (or none if in
the configuration file), this is a command client if c->session is NULL
otherwise an attached client.
2013-02-23 22:25:58 +00:00
Nicholas Marriott
243244d285 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-23 19:26:12 +00:00
Nicholas Marriott
497b27dafb Expand format variables in the run-shell and if-shell shell commands, from
Thiago Padilha.
2013-02-23 19:24:42 +00:00
Nicholas Marriott
ca6d9f799e Tidy TODO and nuke stuff that is done in some form or not going to happen. 2013-02-23 15:52:56 +00:00
Nicholas Marriott
f1aa5f6a1d Add to TODO. 2013-02-23 15:43:13 +00:00
Nicholas Marriott
dc50de782a The visit -> Visit 2013-02-23 15:15:20 +00:00
Nicholas Marriott
2e85eeea37 www Project Page -> SourceForge Page 2013-02-23 14:51:56 +00:00
Nicholas Marriott
357da035b9 Merge send-prefix into send-keys. 2013-02-23 14:41:07 +00:00
Nicholas Marriott
5aa54c863d Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-23 14:23:59 +00:00
Nicholas Marriott
42735d446e Merge show-buffer into save-buffer. 2013-02-23 14:23:35 +00:00
Nicholas Marriott
57eb334d5b Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-23 13:03:47 +00:00
Nicholas Marriott
5f904aa350 Add pane_tags format to format_window_pane based on code from George Nachman. 2013-02-23 13:02:52 +00:00
Nicholas Marriott
ee0f8adfac Handle focus events from the terminal, from Aaron Jensen. 2013-02-23 10:01:34 +00:00
Nicholas Marriott
1ed37385c6 Use -O2 without debugging. 2013-02-22 23:37:55 +00:00
Nicholas Marriott
3a2e9d805a Fix error reporting for client commands by adding a flag to cmd_find_client to
tell it whether or not to show errors, sometimes it's needed and sometimes not.
2013-02-22 23:04:53 +00:00
Nicholas Marriott
911ef4e69a Allow display-message with no curclient. 2013-02-22 22:57:26 +00:00
Nicholas Marriott
1994ae4640 Missing PANE_RESIZE define. 2013-02-22 21:47:34 +00:00
Nicholas Marriott
dbd8e47846 Do pane resize ioctls once at the end of the server loop rather than
immediately.
2013-02-22 21:35:29 +00:00
Nicholas Marriott
ce7bf1083e Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-22 16:25:50 +00:00
Nicholas Marriott
1db4ec6e63 Add pane_current_command format. 2013-02-22 16:25:21 +00:00
Nicholas Marriott
1c82cf7660 Remove a couple of FAQ bits that are out of date and not frequent. 2013-02-22 14:53:00 +00:00
Nicholas Marriott
e43fc6f08a Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-22 14:32:33 +00:00
Nicholas Marriott
31407b70e0 Add option command-prefix which is automatically prepended to any command
(apart from a naked default-shell). The default is "exec ".
2013-02-22 14:31:38 +00:00
Nicholas Marriott
7d3c1016ce Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-22 07:25:38 +00:00
Nicholas Marriott
4c9f9438ff Add support for focus notifications when tmux pane changes, based on work by
Aaron Jensen.
2013-02-22 07:23:11 +00:00
Nicholas Marriott
374dae6635 Add a load of miscellaneous pane formats, from George Nachman. 2013-02-21 19:44:27 +00:00
Nicholas Marriott
8c50f625b0 Add session_set_current helper function, extracted from a diff from Aaron
Jensen.
2013-02-21 16:54:13 +00:00
Nicholas Marriott
6fc96978c2 Add to TODO. 2013-02-21 16:43:04 +00:00
Nicholas Marriott
8e3767e344 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-21 09:37:06 +00:00
Nicholas Marriott
b8b5631d9d Add -C and -J to capture pane to escape control sequences and to join wrapped
line, based on a diff from George Nachman.
2013-02-21 09:35:01 +00:00
Nicholas Marriott
c577b47cd5 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-20 23:16:53 +00:00
Nicholas Marriott
cb6f36655e evbuffer_readline returns allocated storage, don't leak it. 2013-02-20 23:15:21 +00:00
Nicholas Marriott
7905f4600d Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-20 14:58:23 +00:00
Nicholas Marriott
41c39e9bd9 Remove stray blank line. 2013-02-20 13:01:59 +00:00
Nicholas Marriott
f81d723264 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-20 10:59:02 +00:00
Nicholas Marriott
afd5e978cf Need to set clients in context before changing their reference count. 2013-02-20 10:25:15 +00:00
Nicholas Marriott
e68b9abd04 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-20 10:20:44 +00:00
Nicholas Marriott
e487b87f6f Clear last attributes after reset in string_cells, from George Nachman. 2013-02-20 09:34:21 +00:00
Nicholas Marriott
1e20153b6e Fix so capture-pane/save-buffer can work in control clients, from George
Nachman.
2013-02-20 09:32:52 +00:00
Nicholas Marriott
4621a52183 Include ML and IRC in the text. 2013-02-20 00:16:00 +00:00
Nicholas Marriott
e90a742db8 Tweak bold link. 2013-02-20 00:06:01 +00:00
Nicholas Marriott
b219d54503 Simplify main www page. 2013-02-20 00:03:59 +00:00
Nicholas Marriott
3108d80b7e Move NOTES->README, move Vim syntax file documentation to the file itself and
otherwise tweak some bits.
2013-02-19 23:31:04 +00:00
Nicholas Marriott
8a7d463b87 Prevent lock on control clients, not on others. 2013-02-19 21:11:32 +00:00
Nicholas Marriott
c3859d1df1 Add copy-pipe mode command to copy selection and also pipe to a command. 2013-02-19 17:49:53 +00:00
Nicholas Marriott
5a5e285be8 Don't try to print unterminated strings when loading configuration file. 2013-02-19 17:28:21 +00:00
Nicholas Marriott
4d1d4d6e8e Add -e flag to capture-pane to include embedded ANSI SGR escape sequences, from
George Nachman.
2013-02-19 09:55:02 +00:00
Nicholas Marriott
a96dd1932a Don't use a target-client for stdout, just always cmdclient. 2013-02-19 09:51:04 +00:00
Nicholas Marriott
693244795c Remove unnecessary initializers of cmd_ctx. 2013-02-18 23:38:57 +00:00
Nicholas Marriott
255a4f8ce3 load_cfg can actually use the same context now they are reference counted. 2013-02-18 23:35:54 +00:00
Nicholas Marriott
e2b26d910c Unbreak line wrapping. 2013-02-18 23:31:23 +00:00
Nicholas Marriott
293e331d69 Add functions to allocate and free command contexts rather than doing it all on
the stack.
2013-02-18 23:20:21 +00:00
Nicholas Marriott
2a91025581 Use tty_raw on stop, not tty_puts. 2013-02-18 17:35:53 +00:00
Nicholas Marriott
37d34b6b83 Don't hang when clearing line in choose mode now that the cursor stays at the
end with wrap.
2013-02-18 17:23:08 +00:00
Nicholas Marriott
44452823b7 Fix double space in sessions template. 2013-02-18 17:12:58 +00:00
Nicholas Marriott
e4bb87032e Add resize-pane -x and -y for absolute pane size. 2013-02-18 17:00:35 +00:00
Nicholas Marriott
a6c4c2cca0 Implement DECAWM (SM/RM 7) using existing MODE_WRAP flag. 2013-02-18 15:57:46 +00:00
Nicholas Marriott
ba3b8ccc1d Correctly turn handle UTF8 mouse option being toggled, from Egmont Koblinger. 2013-02-18 15:03:50 +00:00
Nicholas Marriott
e5eee7de0c Support the latest theory for mouse input, this is enabled/disabled with SM/RM
1006 and is similar in style to SGR input: \033[<b;x;yM or \033[b;x;ym. From
Egmont Koblinger.
2013-02-18 14:52:27 +00:00
Nicholas Marriott
d8261019f1 Add client_session and client_last_session formats. 2013-02-18 14:23:40 +00:00
Nicholas Marriott
9d165df18a No more lint means no more ARGSUSED. 2013-02-17 23:15:38 +00:00
Nicholas Marriott
7d1a8f7e9e Remove stray test code which would convert abc to x. 2013-02-17 23:05:57 +00:00
Nicholas Marriott
8df3ec612a In terminals with XT, turn on modifyOtherKeys=1 with the escape sequence and
handle the most common set. Pass them through if xterm-keys is on.
2013-02-17 22:56:12 +00:00
Nicholas Marriott
4c91c153cb I strongly suspect it is possible for tmux to block on detach in tty_raw, so
make the fd blocking again much later and have tty_raw just retry the write a
few times.
2013-02-17 22:28:11 +00:00
Nicholas Marriott
cf2c0237f4 Instead of loads of little screen_write_*_on and off functions which just
change mode flags, just have screen_write_mode_set and screen_write_mode_clear.
2013-02-17 10:43:35 +00:00
Nicholas Marriott
3d9fd1c7f2 Add various checks to turn off bits that can't work in control mode (such as
lock).
2013-02-17 10:12:55 +00:00
Nicholas Marriott
d1e8fb33da Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-17 10:04:59 +00:00
Nicholas Marriott
1e3a4f2331 Do not include status line in size calculations in control mode. 2013-02-17 10:04:26 +00:00
Thomas Adam
2ac1d46f46 Don't set key KEYC_NONE on xterm_keys_find match()
When calling xterm_keys_find(); if we get a complete match, don't set the
key to unknown before calling the action to complete the binding; otherwise
non-prefixed bindings will not work.
2013-02-16 21:04:48 +00:00
Nicholas Marriott
77a2174685 Fix a couple of memory leaks, from Romain Francoise. 2013-02-16 19:35:49 +00:00
Nicholas Marriott
3e270af17a Don't omit half the default table (!= not ==). 2013-02-16 13:29:40 +00:00
Nicholas Marriott
10db7ec51b Include the \033 in the key tree and adjust key matching for this change. 2013-02-16 13:21:14 +00:00
Nicholas Marriott
4f01bfc4bc Make choose-tree actually work again. 2013-02-15 12:57:13 +00:00
Nicholas Marriott
1d591ada76 Support capture-pane -p to send to stdout. 2013-02-15 09:31:45 +00:00
Nicholas Marriott
2bdc59fac8 Fix a comment for new key table names. 2013-02-15 02:38:15 +00:00
Nicholas Marriott
784a74df0b Fix function parameter to tty_keys_free. 2013-02-15 02:18:38 +00:00
Nicholas Marriott
82355d2f2d Tidy by splitting default key tables into two. 2013-02-15 02:16:41 +00:00
Nicholas Marriott
97a99d8718 Add -c to refresh-client to set client size in control mode, based on code from
George Nachman.
2013-02-15 01:54:48 +00:00
Nicholas Marriott
755d4863c8 Spaces -> tabs. 2013-02-14 12:22:14 +00:00
Nicholas Marriott
28544391f5 Do not leak formats in status_replace. 2013-02-14 12:20:17 +00:00
Nicholas Marriott
931b0103cd Clarify choose-tree entry in man page. 2013-02-13 11:07:21 +00:00
Nicholas Marriott
6e03b50771 Run session command before window in choose-tree. 2013-02-13 11:05:10 +00:00
Nicholas Marriott
362c460767 Do not crash when calling choose-tree with a command that changes the mode. 2013-02-13 11:01:26 +00:00
Nicholas Marriott
f4c815a1d9 Fix constness again, sigh. 2013-02-13 10:41:12 +00:00
Nicholas Marriott
fc6f08d5b7 No more need for freefn. 2013-02-13 10:27:49 +00:00
Nicholas Marriott
68e370574a Fix constness of window_choose_add_item and _window. 2013-02-13 10:25:37 +00:00
Nicholas Marriott
544c80d715 Fix constness of cmd_template_replace. 2013-02-13 10:19:43 +00:00
Nicholas Marriott
36fe146a74 Fix choose-tree usage. 2013-02-13 09:55:37 +00:00
Nicholas Marriott
caa29af2a9 Add user options, prefixed with @. May be set to any arbitrary string. 2013-02-13 09:54:24 +00:00
Nicholas Marriott
0f31d231db Return error for --foo when using compat/getopt.c. 2013-02-12 20:36:22 +00:00
Nicholas Marriott
102cb77435 Add -v to set and setw to show only option value. 2013-02-12 20:12:10 +00:00
Nicholas Marriott
7360ff4496 Use proc_pidinfo on Darwin for process name too, from OZAKI Kiichi. 2013-02-12 09:40:22 +00:00
Nicholas Marriott
a6fd92bd8d Remove stray change accidentally committed. 2013-02-10 19:15:49 +00:00
Nicholas Marriott
06ac4b628d Add a format client_prefix which is 1 if prefix key has been pressed, used for
example #{?client_prefix,X,Y}. Also a few extra server_client_status needed.
2013-02-10 18:58:05 +00:00
Nicholas Marriott
6c53a1ed68 Allow formats in status options. 2013-02-10 18:53:25 +00:00
Nicholas Marriott
6ad2c5c40f Show alias in lscm output. 2013-02-10 18:26:22 +00:00
Nicholas Marriott
99cc0015f8 Rework reflow code so it does not do so much allocation which should be faster
with large histories.
2013-02-10 18:15:30 +00:00
Nicholas Marriott
f1ce95915c Allow choose commands to be used outside tmux, so long as at least one client
is attached.
2013-02-10 17:52:51 +00:00
Nicholas Marriott
aadc87f5a7 Remove free callback for window_choose_data objects. 2013-02-10 17:36:58 +00:00
Nicholas Marriott
4d382ae8e6 Miscellaneous tidying of choose API, including:
- rename client and session to start_client and start_session in
  window_choose_data struct. also add TREE_OTHER define and reorder the
  struct
- rename window_choose_ctx to window_choose_data_run
- don't pass a cmd_ctx into window_choose_create (will let it use a
  different client later). instead take type, session, client
- add window_choose_data_free and use it to dispose of wcd rather than
  each cmd-*.c doing it individually
- change so ref counting is done by wcd_add and wcd_free rather than
  callers. this means 1 ref for each item but what of it :-)
- also add a ref to tree_session - not sure if this is needed?
- all the callbacks except choose-client and find-window are the same so
  remove them and add window_choose_default_callback
- reorder/rename some other bits and pieces for tidyness
2013-02-10 17:32:58 +00:00
Nicholas Marriott
418ba99078 Add to TODO. 2013-02-09 16:21:20 +00:00
Nicholas Marriott
648ce2f56a Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-02-09 14:53:51 +00:00
Nicholas Marriott
0648c58716 Add to TODO list. 2013-02-09 14:52:11 +00:00
Thomas Adam
01da28efb1 Minor update to .gitignore
Now ignores:  corefiles, stray patches and tags file.
2013-02-09 10:26:57 +00:00
Thomas Adam
6d6e1581b5 Use osdep_get_cwd() for format change 2013-02-07 13:06:31 +00:00
Thomas Adam
64da762c15 Merge branch 'obsd-master' 2013-02-07 12:08:55 +00:00
Nicholas Marriott
8903c1f167 Automatically reflow wrapped lines when a pane is resized, requested by
many over the years and finally implemented by Richard Woodbury.
2013-02-05 11:08:59 +00:00
Nicholas Marriott
a5521597b0 Don't set some string formats if the string is NULL. 2013-02-05 11:01:45 +00:00
Thomas Adam
fe00607816 Only set AUTO{MAKE,CONF}_VERSION on OpenBSD
OpenBSD requires the presence of AUTOMAKE_VERSION and AUTOCONF_VERSION for
bootstrapping purposes.  Setting these on any other system requires that
explicit version to be used, rather than what might already be installed.

Therefore, only do this when the platform is OpenBSD and ignore everything
else.
2013-01-31 00:14:59 +00:00
Thomas Adam
6e6d756109 Corrections to SYNCING
* Reflow some paragraphs due to repo-naming pushing the line length over 80
  chaacters.

* Correct path to git clone commands for each repo.
2013-01-30 23:28:38 +00:00
Nicholas Marriott
85531fd404 Unused variable/type nit from Thomas Adam. 2013-01-30 17:00:17 +00:00
Nicholas Marriott
c4c98df4f2 Add -Wdeclaration-after-statement. 2013-01-30 16:35:00 +00:00
Thomas Adam
a3f4eb7b24 Merge branch 'obsd-master'
Conflicts:
	Makefile
	grid-utf8.c
2013-01-30 15:27:19 +00:00
Nicholas Marriott
fdbfc7e349 Rather than having two grids for each pane, one for ASCII and one for
UTF-8, collapse the two together. Simplifies the code at the expense of
more memory (which can probably be reduced again later).
2013-01-18 02:16:21 +00:00
Nicholas Marriott
c2e2107063 Style nits - return (x) not return x. 2013-01-18 02:10:29 +00:00
Thomas Adam
2ca8b7f359 Merge branch 'obsd-master' 2013-01-17 22:14:18 +00:00
Nicholas Marriott
3a09e01a8e Do not allow cursor colours to be set beginning with ? as that will
report the colour, from Hayaki Saito.
2013-01-17 20:30:43 +00:00
Nicholas Marriott
d31315884c Fix some blank line nits. 2013-01-17 03:51:21 +00:00
Nicholas Marriott
57ca428975 Merge branch 'master' of ssh://git.code.sf.net/p/tmux/tmux-code 2013-01-17 02:09:18 +00:00
Nicholas Marriott
b0e2ef1a7d Update www for new SF URLs. 2013-01-17 02:08:58 +00:00
Thomas Adam
b237d9dd95 Updated SYNCING 2013-01-17 02:02:04 +00:00
Thomas Adam
de194016ec Merge branch 'obsd-master' 2013-01-17 01:38:21 +00:00
Nicholas Marriott
e33ba57c13 Remove the layout undo/redo code which never really worked. 2013-01-17 00:11:22 +00:00
Nicholas Marriott
44f8e1caff Implement ECH (erase character, CSI X). Reported by Christian Neukirchen. 2013-01-15 23:18:55 +00:00
Nicholas Marriott
bc2e4a36df If timing between keys is less than (by default) 1 millisecond, assume
the text is being pasted. assume-paste-time option changes the value (0
disables). Based on a diff from Marcin Kulik.
2013-01-15 22:55:29 +00:00
Thomas Adam
675c6b3773 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-12-31 18:50:37 +00:00
Tiago Cunha
f4472c16b2 Fix keyword matching.
Per the documentation in *:syn-keyword* (in particular *E789*), the
optional characters inside the square brackets can only be used in the
end. Therefore, unfold some keywords which were being wrongly
recognised.

Noticed by Bruce Wolk.
2012-12-24 17:18:35 +00:00
Nicholas Marriott
854e8ae04d Add ^ and $ special command targets to select lowest and highest
numbered windows, from Raghavendra D Prabhu.
2012-12-24 12:38:57 +00:00
Nicholas Marriott
3e6d45acf6 Add -T option to select-window to toggle to last window if already
current, from Raghavendra D Prabhu.
2012-12-24 12:34:32 +00:00
Nicholas Marriott
a2c8af97e9 Add missing function prototype. 2012-12-24 12:33:05 +00:00
Nicholas Marriott
b18ff67646 Add a -u flag to choose-tree to start uncollapsed, from Raghavendra D
Prabhu.
2012-12-24 12:25:52 +00:00
millert
6a5adfc0ba We no longer use struct eproc for kinfo_proc in sysctl.h so there
is no direct need for sys/proc.h or sys/resource.h.  Some consumers
of kinfo_proc need these for the proc flags and rlimit defines like
RLIM_INF so add the appropriate includes to them.
OK deraadt@ sthen@
2012-12-18 21:28:45 +00:00
Nicholas Marriott
9714880283 Change load_cfg to fix a crash reported by jasper. 2012-12-13 15:36:16 +00:00
Nicholas Marriott
3a0016a78a Use the CMD_*_USAGE defines consistently, from Thomas Adam. 2012-12-09 23:17:35 +00:00
Thomas Adam
fb83914bd7 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-12-08 20:29:37 +00:00
Thomas Adam
d5de489dc4 .+ 2012-12-08 19:16:45 +00:00
Nicholas Marriott
3fa4f691e3 Handle resetting 256-colours properly when parsing #[default],
#[fg=default] and #[bg=default] styles.
2012-12-08 17:05:57 +00:00
Nicholas Marriott
8600fe054b Use strlcat not strncat in load_cfg and some other trivial tidying from
Tiago Cunha.
2012-12-06 13:06:05 +00:00
Nicholas Marriott
8378be03d1 Fix argument order in a log statement. 2012-12-06 12:49:13 +00:00
Nicholas Marriott
51a1dbfe09 Simplify command string parsing with a helper function from Tiago Cunha. 2012-12-06 12:47:48 +00:00
Nicholas Marriott
8264e92b37 Fix return value of load_cfg, from Thomas Adam. 2012-11-27 22:59:34 +00:00
Thomas Adam
739a76634c Merge branch 'obsd-master'
Sync from OpenBSD.
2012-11-27 22:24:00 +00:00
Nicholas Marriott
47c097cb51 Support middle-click paste, based on a diff from Ailin Nemui. 2012-11-27 20:22:12 +00:00
Nicholas Marriott
24d7d073ff Support the 47 and 1047 SM and RM sequences (alternate screen without
cursor), requested by I forget who ages ago.
2012-11-27 20:08:42 +00:00
Thomas Adam
39631edb98 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-11-27 18:12:04 +00:00
Nicholas Marriott
9b8998aeec Correctly aggregate together errors from nested config files (with
source-file). Fix by Thomas Adam, reported by Sam Livingstone-Gray
2012-11-27 16:12:29 +00:00
Nicholas Marriott
4aa4e9fb26 Allow cmd-run-shell to accept -t to specify the pane to display the
output, requested by Alexander Tsepkov.
2012-11-27 15:09:35 +00:00
Nicholas Marriott
1fcc7f50ac When scrolling in copy mode with the mouse, scroll screen rather than
moving cursor. This change from Ailin Nemui, alternative to a change
from Stephen Hicks.
2012-11-27 14:42:56 +00:00
Nicholas Marriott
6ef4f8e16c Revert last, after discussion it isn't necessary. 2012-11-27 14:26:48 +00:00
Nicholas Marriott
93224260ae Add window-status-last-* options, from Boris Faure. 2012-11-27 13:52:23 +00:00
Nicholas Marriott
991bfcf443 Fix session choice so that preferring unattached sessions actually
works, reported by Drew Frank.
2012-11-27 09:20:03 +00:00
Nicholas Marriott
d762ced298 Call realpath earlier on the socket directory path rather than on the
socket file path because the latter may not exist yet and in that case
realpath is allowed to fail. From Romain Francoise.
2012-11-26 11:35:28 +00:00
Thomas Adam
1bc910a963 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-11-22 22:19:04 +00:00
Nicholas Marriott
63f451965c Merge branch 'master' of ssh://tmux.git.sourceforge.net/gitroot/tmux/tmux 2012-11-22 16:48:50 +00:00
Nicholas Marriott
260419f48e Put helper function back, will be needed in a bit. 2012-11-22 14:41:11 +00:00
Thomas Adam
c04aa90207 Merge branch 'obsd-master'
Sync from OpenBSD.

* obsd-master:
  Add halfpage commands to mode command string table (missed by accident), from Thomas Adam.
  Clarify some points about config files, notably that they are only read at server start. From Thomas Adam.
  Use a utility function for common code to show errors in config file, from Thomas Adam.
2012-11-22 13:24:14 +00:00
Nicholas Marriott
0679eb6a6d Add halfpage commands to mode command string table (missed by accident),
from Thomas Adam.
2012-11-19 10:51:25 +00:00
Nicholas Marriott
9a7e5bd1d3 Clarify some points about config files, notably that they are only read
at server start. From Thomas Adam.
2012-11-19 10:50:24 +00:00
Nicholas Marriott
827b311c81 Use a utility function for common code to show errors in config file,
from Thomas Adam.
2012-11-19 10:38:06 +00:00
Thomas Adam
e4679172e3 Sanitise additional .mailmap entries
This sanitises multiple author addresses some more, mapping them back to one
common entity.
2012-11-08 21:39:35 +00:00
Thomas Adam
be10e8eee6 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-11-08 21:27:40 +00:00
Thomas Adam
cb4553bd06 Add .mailmap for commit author translations
Because it's not possible to enumerate up-front all of the committers to
tmux coming from OpenBSD, at the time a commit is imported in to git from
the OpenBSD CVS repository, the author information is not known to Git,
necessarily.

But it's possible to alter for output the respective author after the fact,
via Git's .mailmap file.  It is this file which will therefore provide a new
mapping of OpenBSD commiter to an actual real name and real email address.
2012-11-08 21:14:32 +00:00
Nicholas Marriott
c68efec6c0 Show last client activity time in default choose-client list. 2012-11-05 13:13:04 +00:00
Thomas Adam
a75801320d Merge branch 'obsd-master'
Sync from OpenBSD.
2012-11-04 01:27:57 +00:00
okan
241a746f32 fix an off-by-one
ok nicm@
2012-10-31 19:11:18 +00:00
Thomas Adam
47fbf87185 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-10-26 20:28:58 +01:00
Nicholas Marriott
d210d99cce Make mouse event structure clearer by defining events (up, click, drag)
and simplifying how buttons and wheels are represented, from Ailin
Nemui. Should be no functional changes.
2012-10-26 14:35:42 +00:00
Thomas Adam
31f93d8445 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-10-25 23:32:14 +01:00
Nicholas Marriott
2a609b332f Add ability to active pane in list-windows and find-window formats, from
Carl Henrik Lunde.
2012-10-25 11:26:47 +00:00
Nicholas Marriott
18236c1c1b Fix BELL_NONE which had been broken in some code reorganisation or other
also don't redraw unnecessarily. From Seiji Ohashi.
2012-10-25 11:16:53 +00:00
Nicholas Marriott
596e9d8068 Fix bad size in memcpy from Romain Francoise. 2012-10-25 11:14:46 +00:00
Nicholas Marriott
589b4b8c6a Fix typo bell->bells from Thomas Adam. 2012-10-25 11:11:58 +00:00
Nicholas Marriott
60808bbded +. 2012-10-23 18:47:52 +01:00
Thomas Adam
d4dc52ec84 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-10-16 18:30:36 +01:00
Nicholas Marriott
c695c0c085 Fix some function prototypes from Helmut Tessarek. 2012-10-15 21:53:30 +00:00
Nicholas Marriott
a91c598971 Link to git instructions from index.html. 2012-10-15 18:25:44 +01:00
Thomas Adam
bf45619441 Don't push all tags when releasing tmux
Pushing all tags with "git push --tags" will also transfer tags from the
tmux-openbsd repository which isn't what we want to do!

Therefore, just specify the newly created tag to push instead for the next
release.
2012-10-13 13:35:35 +01:00
Thomas Adam
9b2aabb752 Merge branch 'master' of ssh://tmux.git.sourceforge.net/gitroot/tmux/tmux 2012-10-13 12:25:08 +01:00
Thomas Adam
c0fb5edff9 Update website. 2012-10-13 12:22:11 +01:00
Thomas Adam
5cdc9591d3 Working on 1.8 2012-10-13 12:12:43 +01:00
Thomas Adam
2b5c3fc49f Update NOTES, CHANGES, configure.ac for 1.7 release 2012-10-13 11:56:14 +01:00
Thomas Adam
b4ad1759b8 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-10-11 17:52:23 +01:00
Nicholas Marriott
6589120667 Fix a use-after-free when collapsing the tree in choose mode, from
Carl Henrik Lunde.
2012-10-11 08:53:50 +00:00
Thomas Adam
0cdcae3532 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-10-09 20:47:28 +01:00
Nicholas Marriott
0e87430462 Add tree keys to vi mode too, missed by accident. 2012-10-09 18:08:21 +00:00
Thomas Adam
43d2b6a648 Remove references to PATCHES file 2012-10-07 10:57:11 +01:00
Nicholas Marriott
8249fbfb60 Make some tweaks to NOTES and add a paragraph on git rather than huge PATCHES
file.
2012-10-05 09:05:44 +01:00
Thomas Adam
3a545376f0 Reference PATCHES document from TODO file
In terms of submitting patches via the TODO file from the tmux portable
repository, mention the PATCHES file in passing.
2012-10-05 00:19:53 +01:00
Thomas Adam
5cc9380bfa Add PATCHES document
This describes how to send patches against the portable tmux version as
hosted on souceforge, using Git.
2012-10-05 00:18:50 +01:00
Thomas Adam
ca84659ca1 Add explanatory sections to TODO file
This restructures the TODO file slightly, separating out the
terminal-specific tasks from the tmux user interface tasks.
2012-10-04 23:57:31 +01:00
Thomas Adam
8dc78377d1 +. 2012-10-04 22:45:22 +01:00
Thomas Adam
64deb34c3b Add choose-list to tmux.vim 2012-10-02 18:13:13 +01:00
Thomas Adam
8b05d84ece Update TODO list.
Keeping this in sync with work done.
2012-10-02 13:02:30 +01:00
Thomas Adam
619ffe1f4f Merge branch 'obsd-master'
Sync from OpenBSD.

* obsd-master:
  Allow session tree (C-b s) to expand and collapse sessions with left/right/space keys. From Thomas Adam.
  Remove some out of date text from man page, from Thomas Adam.
2012-10-02 10:47:16 +01:00
Nicholas Marriott
9107b0c69a Allow session tree (C-b s) to expand and collapse sessions with
left/right/space keys. From Thomas Adam.
2012-10-02 08:16:28 +00:00
Nicholas Marriott
ea289bc457 Remove some out of date text from man page, from Thomas Adam. 2012-10-02 08:02:21 +00:00
Thomas Adam
9763282dc1 Merge branch 'obsd-master' 2012-10-01 13:32:52 +01:00
Nicholas Marriott
44dccf7ea2 Do not test client flags against TTY_FREEZE bit, reported by Tom Ryder. 2012-09-29 06:57:56 +00:00
Thomas
80b5c0e076 Merge branch 'obsd-master'
Sync from OpenBSD.

* obsd-master:
  Do not leak file descriptor if not a tty, reported by Sebastien Marie.
2012-09-27 11:55:55 +01:00
Nicholas Marriott
7a3ec77dbd Do not leak file descriptor if not a tty, reported by Sebastien Marie. 2012-09-27 10:02:56 +00:00
Thomas Adam
48750022c0 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-09-25 17:05:36 +01:00
Nicholas Marriott
ce0b285aad Fix up missing bits. 2012-09-25 08:54:01 +01:00
Nicholas Marriott
17bbf90393 Add notification for input from a pane, from George Nachman. 2012-09-25 07:41:22 +00:00
Nicholas Marriott
0d0b3cf9a4 Fix search forward so it can match strings on the last line, SF bug
3571114 from "LiJunLe".
2012-09-25 07:39:28 +00:00
Nicholas Marriott
149f5bac05 Merge branch 'master' of ssh://tmux.git.sourceforge.net/gitroot/tmux/tmux
Conflicts:
	cmd.c
	format.c
	osdep-openbsd.c
2012-09-25 08:07:39 +01:00
Thomas Adam
253f1395a0 Don't rely on "-s ours" for merging
The ours strategy assumes one subsumes the other -- which isn't the case for
the portable version, so for now -- just go back to using the default merge
strategy of recursive, and fix-up any conflicts manually.
2012-09-24 18:05:34 +01:00
Thomas Adam
e342304134 Merge branch 'obsd-master'
Conflicts:
	cmd.c
	format.c
	osdep-openbsd.c
	tmux.h
2012-09-24 17:55:06 +01:00
Nicholas Marriott
d785c37ee2 Fix some UTF-8 Japanese issue on OS X, SF bug 3566884. 2012-09-24 17:53:15 +01:00
Nicholas Marriott
69683ba7b4 Use ACS characters for choose-tree arrows based on diff from Romain
Francoise.
2012-09-24 17:53:10 +01:00
Thomas
7b189f1ad7 Merge branch 'obsd-master'
* obsd-master:
  Use pgrp of pty fd not pid of immediate child when recovering current working directory (like current process). From Marcel Partap.
  Use ACS characters for choose-tree arrows based on diff from Romain Francoise.
2012-09-24 14:56:56 +01:00
Nicholas Marriott
84612a8196 Add control_write_buffer, from George Nachman. 2012-09-24 13:39:10 +00:00
Nicholas Marriott
5d60bc7f7c Use pgrp of pty fd not pid of immediate child when recovering current working
directory (like current process). From Marcel Partap.
2012-09-24 14:05:38 +01:00
Nicholas Marriott
42272dfbd5 Use pgrp of pty fd not pid of immediate child when recovering current
working directory (like current process). From Marcel Partap.
2012-09-24 13:05:10 +00:00
Nicholas Marriott
5b85efeb93 Fix some UTF-8 Japanese issue on OS X, SF bug 3566884. 2012-09-24 13:56:32 +01:00
Nicholas Marriott
eb0ad181e9 Use ACS characters for choose-tree arrows based on diff from Romain
Francoise.
2012-09-24 12:53:55 +00:00
Thomas Adam
dc3df931d7 Merge branch 'master' of ssh://tmux.git.sourceforge.net/gitroot/tmux/tmux
Conflicts:
	SYNCING
2012-09-20 23:02:49 +01:00
Thomas Adam
d3d48fa3e7 Add release instructions for new tmux versions
Document how actual releases will happen.  Largely based on tcunha's
original notes.  Tweaked by me slightly to adapt to git.
2012-09-20 22:59:08 +01:00
Thomas Adam
73f29094d0 .+ SYNCING. 2012-09-19 09:50:39 +01:00
Thomas Adam
a043b975ca Add SYNCING document
This explains how to keep the tmux and tmux-openbsd repositories in sync
with one another during the course of tmux development.
2012-09-16 22:53:58 +01:00
Thomas Adam
68cc635ed5 Merge branch 'obsd-master'
Sync from OpenBSD.
2012-09-15 12:23:25 +01:00
Nicholas Marriott
b2a9f4115f Handle empty list properly in choose-list, based on fix from Thomas Adam. 2012-09-05 10:14:21 +00:00
Nicholas Marriott
b433886840 We can't tell what the terminal has done with a DCS string, so reset the
cursor and attributes afterwards.
2012-09-05 09:59:41 +00:00
Thomas Adam
248cd423a1 Fixup Makefile.am
Since this is just Makefile in the OpenBSD directory, pull in those trivial
changes to the templated one for use in autotools.
2012-09-04 22:50:16 +01:00
Nicholas Marriott
b79f86e32a Trivial code simplification from Tim Ruehsen. 2012-09-04 22:37:31 +01:00
Nicholas Marriott
40505e59f1 Remove xterm CRA support - support is patchy and it will be done better
using margins.
2012-09-04 22:37:31 +01:00
Nicholas Marriott
a1cd0eee1b Use the right index when adding item in choose-tree, from Thomas Adam. 2012-09-04 22:37:31 +01:00
Nicholas Marriott
c914fcfacb When choosing a pane found by find-window, switch to that pane rather
than just the window. Also use a helper function for the inner loop.
2012-09-04 22:37:31 +01:00
Nicholas Marriott
4d7967de7a Rename variables to something a but more understandable. 2012-09-04 22:37:31 +01:00
Nicholas Marriott
28fd3a3835 add cmd-choose-list to allow arbitrary options to be selected. From
Thomas Adam.
2012-09-04 22:37:29 +01:00
Nicholas Marriott
996a636713 Remove an unused variable. 2012-09-04 22:36:56 +01:00
Nicholas Marriott
41a448193f Send notifications to control clients. Also don't redraw client when
suspended.
2012-09-04 22:36:47 +01:00
Nicholas Marriott
0304555184 Change format of choose-tree arrows slightly, from Romain Francoise. 2012-09-04 22:35:52 +01:00
Nicholas Marriott
f536dc47c4 If stdin in the client is enable immediately, tmux will eat anything
sent to stdin before it is needed, which can be inconvenient (eg pasting
commands). Instead, start with stdin disabled and reuse MSG_STDIN from
server->client to mean that stdin should be enabled. Based on a diff
from Chris Johnsen.
2012-09-04 22:35:52 +01:00
Nicholas Marriott
d6066552ee Can't call evtimer_pending on uninitialized events, call
evtimer_initialized first. Reported by Vladimir Lomov, fix from Thomas
Adam slightly modified by me.
2012-09-04 22:35:52 +01:00
Nicholas Marriott
59c760dfcd Trivial code simplification from Tim Ruehsen. 2012-09-04 13:24:50 +00:00
Nicholas Marriott
c06b2e4fb9 .gitignore + Makefile Makefile.in configure 2012-09-04 09:26:54 +01:00
Thomas Adam
1f29f6ac4d Add .gitignore
Tell git not to consider certain files, such as object files.
2012-09-04 09:21:09 +01:00
Thomas Adam
3ad812cbd5 Make autogen.sh executable 2012-09-04 08:19:12 +01:00
Nicholas Marriott
53c430eced Change WWW links to Git not Subverson. 2012-09-04 08:00:34 +01:00
Nicholas Marriott
6307d63715 Remove xterm CRA support - support is patchy and it will be done better
using margins.
2012-09-03 15:47:40 +00:00
Nicholas Marriott
4f8a6867fa Use the right index when adding item in choose-tree, from Thomas Adam. 2012-09-03 12:24:25 +00:00
Nicholas Marriott
9e7bbc7281 When choosing a pane found by find-window, switch to that pane rather
than just the window. Also use a helper function for the inner loop.
2012-09-03 12:20:17 +00:00
Nicholas Marriott
c96a2a3c9e Rename variables to something a but more understandable. 2012-09-03 10:02:39 +00:00
Nicholas Marriott
7263fa36eb add cmd-choose-list to allow arbitrary options to be selected. From
Thomas Adam.
2012-09-03 09:57:57 +00:00
Nicholas Marriott
adc9fad4ac Remove an unused variable. 2012-09-03 09:36:07 +00:00
Nicholas Marriott
9247c90d69 Send notifications to control clients. Also don't redraw client when
suspended.
2012-09-03 09:32:38 +00:00
Nicholas Marriott
a679a4a708 Change format of choose-tree arrows slightly, from Romain Francoise. 2012-09-03 09:01:16 +00:00
Nicholas Marriott
2e43372d0b If stdin in the client is enable immediately, tmux will eat anything
sent to stdin before it is needed, which can be inconvenient (eg pasting
commands). Instead, start with stdin disabled and reuse MSG_STDIN from
server->client to mean that stdin should be enabled. Based on a diff
from Chris Johnsen.
2012-09-03 08:48:57 +00:00
Nicholas Marriott
473911fb73 Can't call evtimer_pending on uninitialized events, call
evtimer_initialized first. Reported by Vladimir Lomov, fix from Thomas
Adam slightly modified by me.
2012-09-03 06:26:48 +00:00
Tiago Cunha
686d461144 Sync OpenBSD patchset 1168:
Change a log to fprintf that was missed last time around, from Tiago Cunha.
2012-08-31 09:25:19 +00:00
Tiago Cunha
554f19eb05 Sync OpenBSD patchset 1167:
Instead of requiring a prompt to enter all numbers >10, go back to
0-9a-z and add A-Z and enter the prompt when M-0 to M-9 are pressed
(like in copy mode). Prompted by request from mcbride@, help from Thomas
Adam.
2012-08-31 09:24:51 +00:00
Tiago Cunha
fc8d3f7a56 Sync OpenBSD patchset 1166:
xterm won't reach version 500 for a while so set that as the upper limit.
2012-08-31 09:22:50 +00:00
Tiago Cunha
56e37487a8 Sync OpenBSD patchset 1165:
Fix up window reference counting and don't crash if the rename timer
fires while the window is dead but still referenced. Fixes problem
reported by Michael Scholz.
2012-08-31 09:22:08 +00:00
Tiago Cunha
674545f7e6 Sync OpenBSD patchset 1164:
Boldify windows with alerts in choose-* list.
2012-08-31 09:20:47 +00:00
Tiago Cunha
35690fb3a5 Sync OpenBSD patchset 1163:
Tidy up tty_write, from Sean Estabrooks.
2012-08-31 09:20:09 +00:00
Tiago Cunha
1c608031b5 Sync OpenBSD patchset 1162:
Use a separate define for each default format template and strip clutter
from the choose-tree defaults.
2012-08-31 09:18:50 +00:00
Nicholas Marriott
84a4007b06 Change a log to fprintf that was missed last time around, from Tiago Cunha. 2012-08-27 21:35:11 +00:00
Nicholas Marriott
753775033a Instead of requiring a prompt to enter all numbers >10, go back to
0-9a-z and add A-Z and enter the prompt when M-0 to M-9 are pressed
(like in copy mode). Prompted by request from mcbride@, help from Thomas
Adam.
2012-08-27 21:29:23 +00:00
Nicholas Marriott
d39c58c01c xterm won't reach version 500 for a while so set that as the upper limit. 2012-08-21 10:08:11 +00:00
Nicholas Marriott
58e8e0eac8 Fix up window reference counting and don't crash if the rename timer
fires while the window is dead but still referenced. Fixes problem
reported by Michael Scholz.
2012-08-21 10:00:33 +00:00
Nicholas Marriott
d50f157f7e +. 2012-08-14 09:38:34 +00:00
Nicholas Marriott
a1e4908ed7 Boldify windows with alerts in choose-* list. 2012-08-14 09:17:14 +00:00
Nicholas Marriott
f61fc576d9 Tidy up tty_write, from Sean Estabrooks. 2012-08-14 08:58:25 +00:00
Nicholas Marriott
73c6785538 Use a separate define for each default format template and strip clutter
from the choose-tree defaults.
2012-08-14 08:51:53 +00:00
Nicholas Marriott
6804d5841e Add a patch missed during a merge sometime to use
TAILQ_FOREACH_SAFE. From Tiago Cunha.
2012-08-14 08:15:00 +00:00
Tiago Cunha
96aaa87df6 Remove osdep include. 2012-08-12 19:34:57 +00:00
Tiago Cunha
454e7d9c3a Sync OpenBSD patchset 1160:
Simplify width calculation (all numbers always sequential) and don't
rely on uninitialized data, from Thomas Adam.
2012-08-12 19:31:26 +00:00
Tiago Cunha
db27dc82f0 Sync OpenBSD patchset 1159:
Remove dead code, from Sean Estabrooks.
2012-08-12 19:30:54 +00:00
Tiago Cunha
061027fefc Sync OpenBSD patchset 1158:
Another missing format from sam at sltosis.org.
2012-08-12 19:30:11 +00:00
Tiago Cunha
45d68963ab Sync OpenBSD patchset 1157:
Fix a return type.
2012-08-12 19:29:05 +00:00
Tiago Cunha
200b0e5821 Sync OpenBSD patchset 1156:
Instead of numbering choose mode items 0-9a-z and then nothing, number
them all and if there are more than 10 use a prompt when 0-9 is
pressed. From Thomas Adam.
2012-08-12 19:28:20 +00:00
Tiago Cunha
30b801decf Sync OpenBSD patchset 1155:
Add some missing formats from Samuel Le Thiec.
2012-08-12 19:25:15 +00:00
Tiago Cunha
ca3f92e78c Sync OpenBSD patchset 1154:
Document pane_index variable, from sam at sltosis dot org.
2012-08-12 19:24:31 +00:00
Tiago Cunha
c8849ac990 Sync OpenBSD patchset 1153:
Add a queue of notifys and a way to turn them off and on (we do not want
notifys to happen during some commands). Based on code from George
Nachman.
2012-08-12 19:23:01 +00:00
Nicholas Marriott
44307712ed Add to TODO. 2012-08-12 18:56:25 +00:00
Nicholas Marriott
20129b7bf9 Simplify width calculation (all numbers always sequential) and don't
rely on uninitialized data, from Thomas Adam.
2012-08-12 06:22:26 +00:00
Nicholas Marriott
a194430e5d Remove dead code, from Sean Estabrooks. 2012-08-11 07:32:16 +00:00
Nicholas Marriott
cf2e65c0e2 Another missing format from sam at sltosis.org. 2012-08-11 07:10:01 +00:00
Nicholas Marriott
8889a48f9b Fix a return type. 2012-08-11 06:46:47 +00:00
Nicholas Marriott
a3dec6bece Instead of numbering choose mode items 0-9a-z and then nothing, number
them all and if there are more than 10 use a prompt when 0-9 is
pressed. From Thomas Adam.
2012-08-11 06:45:33 +00:00
Nicholas Marriott
ff4097e02c Add some missing formats from Samuel Le Thiec. 2012-08-11 05:55:12 +00:00
Tiago Cunha
c081af2963 Sync with reality. 2012-07-16 22:19:13 +00:00
Nicholas Marriott
89a96b05fa Document pane_index variable, from sam at sltosis dot org. 2012-07-15 06:51:57 +00:00
Nicholas Marriott
5385a9bb34 Add a queue of notifys and a way to turn them off and on (we do not want
notifys to happen during some commands). Based on code from George
Nachman.
2012-07-13 06:27:41 +00:00
Tiago Cunha
d697b5ef20 Sync OpenBSD patchset 1152:
Nuke unused variable from Thomas Adam.
2012-07-12 21:14:46 +00:00
Tiago Cunha
81858d7891 Now that the queue _SAFE macros are available, use them instead of rolling
our own. This is analogous to the recent changes to the detach-client and
kill-{session,window} commands.
2012-07-12 21:04:43 +00:00
Tiago Cunha
7a583b1e54 Sync with OpenBSD. Mostly because of the added _SAFE macros which is
needed by an upcoming change.
2012-07-12 20:59:39 +00:00
Nicholas Marriott
35a8a61254 Nuke unused variable from Thomas Adam. 2012-07-12 13:03:42 +00:00
Tiago Cunha
513bd8f62d Remove remaining xfree calls from the portable version. 2012-07-11 19:50:46 +00:00
Tiago Cunha
1f5e6e35d5 Sync OpenBSD patchset 1151:
Make command exec functions return an enum rather than -1/0/1 values and
add a new value to mean "leave client running but don't attach" to fix
problems with using some commands in a command sequence. Most of the
work by Thomas Adam, problem reported by "jspenguin" on SF bug 3535531.
2012-07-11 19:37:32 +00:00
Tiago Cunha
a432fcd306 Sync OpenBSD patchset 1150:
xfree is not particularly helpful, remove it. From Thomas Adam.
2012-07-11 19:34:16 +00:00
Tiago Cunha
06d27e94b2 Sync OpenBSD patchset 1149:
Move a NULL check inside a function, from Tiago Cunha.
2012-07-11 19:30:01 +00:00
Tiago Cunha
188be9718e Sync OpenBSD patchset 1148:
Fix choose-tree usage string.
2012-07-11 17:16:25 +00:00
Tiago Cunha
bbd3e822c7 Sync OpenBSD patchset 1147:
remove extraneous line;
2012-07-11 17:15:53 +00:00
Tiago Cunha
45a2e2d6c6 Update list of sources to reflect the recent changes introduced by the
choose-tree command.
2012-07-11 17:15:23 +00:00
Tiago Cunha
a10143a2d1 Sync OpenBSD patchset 1146:
Add choose-tree command to show windows and sessions in the same
list. Change choose-window and -session to use the same code. From
Thomas Adam.
2012-07-11 17:13:55 +00:00
Tiago Cunha
38530de622 Sync OpenBSD patchset 1144:
Clear flags across all sessions, from Thomas Adam.
2012-07-11 17:06:11 +00:00
Nicholas Marriott
f040bc249f Add. 2012-07-11 09:28:11 +00:00
Nicholas Marriott
ede8312d59 Make command exec functions return an enum rather than -1/0/1 values and
add a new value to mean "leave client running but don't attach" to fix
problems with using some commands in a command sequence. Most of the
work by Thomas Adam, problem reported by "jspenguin" on SF bug 3535531.
2012-07-11 07:10:15 +00:00
Nicholas Marriott
df912e3540 xfree is not particularly helpful, remove it. From Thomas Adam. 2012-07-10 11:53:01 +00:00
Nicholas Marriott
3886f60671 +. 2012-07-09 20:46:41 +00:00
Nicholas Marriott
a3391692ad Move a NULL check inside a function, from Tiago Cunha. 2012-07-09 09:55:57 +00:00
Nicholas Marriott
91f54b59ac Fix choose-tree usage string. 2012-07-09 07:08:03 +00:00
Jason McIntyre
b0f4f94b5b remove extraneous line; 2012-07-08 17:24:29 +00:00
Nicholas Marriott
f20c6fe009 Add choose-tree command to show windows and sessions in the same
list. Change choose-window and -session to use the same code. From
Thomas Adam.
2012-07-08 16:04:38 +00:00
Nicholas Marriott
191a92c0c6 Sort SRCS list. 2012-07-08 15:24:08 +00:00
Nicholas Marriott
adba3d35b1 + entry to show default options, suggested by Thomas Adam. 2012-07-08 13:32:09 +00:00
Nicholas Marriott
63f5c38023 Clear flags across all sessions, from Thomas Adam. 2012-07-08 07:27:32 +00:00
Tiago Cunha
7e02d2f459 Sync OpenBSD patchset 1143:
Provide common helper function for adding windows and sessions to choose
lists and expand %% in command before using it rather than at callback
time. From Thomas Adam.
2012-07-04 11:03:20 +00:00
Tiago Cunha
5761712799 Sync OpenBSD patchset 1142:
Clean up and simplify the choose mode code, from Thomas Adam.
2012-07-04 11:01:00 +00:00
Tiago Cunha
9bb97522d5 Sync OpenBSD patchset 1141:
Trim a blank line.
2012-07-04 10:55:22 +00:00
Tiago Cunha
f4053bc217 Sync OpenBSD patchset 1140:
Remove a couple of unused variables from redbrain at gcc dot gnu dot org.
2012-07-04 10:54:45 +00:00
Nicholas Marriott
67b926cf3c Provide common helper function for adding windows and sessions to choose
lists and expand %% in command before using it rather than at callback
time. From Thomas Adam.
2012-06-25 14:27:25 +00:00
Nicholas Marriott
5b6f78186c Clean up and simplify the choose mode code, from Thomas Adam. 2012-06-25 14:08:55 +00:00
Nicholas Marriott
39abca401a Trim a blank line. 2012-06-25 13:49:16 +00:00
Nicholas Marriott
a7917430d8 Remove a couple of unused variables from redbrain at gcc dot gnu dot org. 2012-06-20 12:55:55 +00:00
Tiago Cunha
202c04414c More ifdef goo is needed due to NOKERNINFO. 2012-06-18 16:23:42 +00:00
Tiago Cunha
bc47596313 Sync OpenBSD patchset 1139:
Actually write all the data to stdout/stderr.
2012-06-18 15:25:23 +00:00
Tiago Cunha
dfc845e7f9 Add control.c to the list of sources. 2012-06-18 15:24:17 +00:00
Tiago Cunha
0159c74a32 Sync OpenBSD patchset 1138:
Add a skeleton mode to tmux (called "control mode") that let's tmux
commands be sent and output received on stdout. This can be used to
integrate with other terminal emulators and should allow some other
things to be made simpler later. More to come so doesn't do much yet and
deliberately not documented.
2012-06-18 15:23:01 +00:00
Tiago Cunha
a401420273 Sync OpenBSD patchset 1137:
Tidy up bell code, from Thomas Adam.
2012-06-18 15:17:55 +00:00
Tiago Cunha
fce30422f3 Sync OpenBSD patchset 1136:
Add a couple of NULL pointer checks to key binding functions, from
jspenguin on SF bug 3535531.
2012-06-18 15:15:32 +00:00
Tiago Cunha
2a36a0a067 Sync OpenBSD patchset 1135:
Do not crash when the current session has no window, fixes a bug
reported by Giorgio Lando. Fix from Thomas Adam.
2012-06-18 15:14:48 +00:00
Tiago Cunha
1c15848c47 Sync OpenBSD patchset 1134:
Add -a for kill-session, from Thomas Adam.
2012-06-18 15:12:54 +00:00
Tiago Cunha
4a634a7da4 Sync OpenBSD patchset 1133:
Add -a flag for detach-client, from Thomas Adam.
2012-06-18 15:11:35 +00:00
Tiago Cunha
576f2694b1 Sync OpenBSD patchset 1132:
Simplify references to alerts in the man page, from Thomas Adam.
2012-06-18 15:10:40 +00:00
Nicholas Marriott
0f00c3b47a Actually write all the data to stdout/stderr. 2012-06-18 13:34:56 +00:00
Nicholas Marriott
2942eca895 Add a skeleton mode to tmux (called "control mode") that let's tmux
commands be sent and output received on stdout. This can be used to
integrate with other terminal emulators and should allow some other
things to be made simpler later. More to come so doesn't do much yet and
deliberately not documented.
2012-06-18 13:16:42 +00:00
Nicholas Marriott
7c39850d1f Tidy up bell code, from Thomas Adam. 2012-06-18 10:58:44 +00:00
Nicholas Marriott
a13b4a819a Add a couple of NULL pointer checks to key binding functions, from
jspenguin on SF bug 3535531.
2012-06-18 09:58:02 +00:00
Nicholas Marriott
a4a2c68fa9 Do not crash when the current session has no window, fixes a bug
reported by Giorgio Lando. Fix from Thomas Adam.
2012-06-18 09:20:19 +00:00
Nicholas Marriott
2113115cdd Add -a for kill-session, from Thomas Adam. 2012-06-18 09:16:15 +00:00
Nicholas Marriott
038e8b770d Add -a flag for detach-client, from Thomas Adam. 2012-06-18 09:15:22 +00:00
Nicholas Marriott
04ac61ecd7 Simplify references to alerts in the man page, from Thomas Adam. 2012-06-18 09:13:12 +00:00
Nicholas Marriott
eed7d9b473 Do not use stderr for log file and don't call log_close when not needed. 2012-05-30 15:01:57 +00:00
Nicholas Marriott
021e95b09f Do not use stderr for log file and don't call log_close when not needed. 2012-05-30 15:01:21 +00:00
Tiago Cunha
bf4b02cea2 Sync OpenBSD patchset 1130:
Add pane title to choose-window template and use the right index for the
pane, from Romain Francoise.
2012-05-30 13:49:45 +00:00
Tiago Cunha
e96d514247 Sync OpenBSD patchset 1129:
Use RB_FOREACH_SAFE as winlinks are being removed, from Chris Johnsen.
2012-05-30 13:49:05 +00:00
Tiago Cunha
bcda6eed63 Sync OpenBSD patchset 1128:
Use session from -t for killw -a, from Chris Johnsen.
2012-05-30 13:48:16 +00:00
Tiago Cunha
2e3a260315 Sync OpenBSD patchset 1127:
Use default-shell not _PATH_BSHELL to spawn commands, pointed out by
Dennis G?nnewig and Thomas Adam.
2012-05-30 13:47:33 +00:00
Tiago Cunha
b24829a99c Sync OpenBSD patchset 1126:
Trim a double space from template.
2012-05-30 13:46:25 +00:00
Tiago Cunha
7c7bd14c61 Sync OpenBSD patchset 1125:
Strip layout from choose-windows again (leave in list-windows),
suggested by Romain Francoise, diff from Thomas Adam.
2012-05-30 13:45:16 +00:00
Tiago Cunha
30b23baaf5 Sync OpenBSD patchset 1124:
Fix client templates, from Romain Francoise.
2012-05-30 13:44:13 +00:00
Tiago Cunha
169d362945 Sync OpenBSD patchset 1123:
Simplify logging and just fprintf(stderr, ...) for early errors.
2012-05-30 13:42:57 +00:00
Tiago Cunha
c6fc8771a9 Sync OpenBSD patchset 1122:
Use a predefined structure for not-space cells used to set attributes.
2012-05-30 13:41:58 +00:00
Nicholas Marriott
626c8aa8e7 Add a simple zoom script from Juan Ignacio Pumarino. 2012-05-30 10:33:20 +00:00
Nicholas Marriott
db20f2d907 Add pane title to choose-window template and use the right index for the
pane, from Romain Francoise.
2012-05-29 08:15:45 +00:00
Nicholas Marriott
63d109fb7f Use RB_FOREACH_SAFE as winlinks are being removed, from Chris Johnsen. 2012-05-29 08:12:13 +00:00
Nicholas Marriott
226f9fa012 Use session from -t for killw -a, from Chris Johnsen. 2012-05-29 08:11:34 +00:00
Nicholas Marriott
f51c55c3f0 Use default-shell not _PATH_BSHELL to spawn commands, pointed out by
Dennis G?nnewig and Thomas Adam.
2012-05-28 08:55:43 +00:00
Nicholas Marriott
fbf2bd865c Trim a double space from template. 2012-05-28 08:00:46 +00:00
Nicholas Marriott
1845800651 Strip layout from choose-windows again (leave in list-windows),
suggested by Romain Francoise, diff from Thomas Adam.
2012-05-28 07:59:07 +00:00
Nicholas Marriott
993f1b96a3 Fix client templates, from Romain Francoise. 2012-05-27 21:43:57 +00:00
Nicholas Marriott
196710e2d3 Simplify logging and just fprintf(stderr, ...) for early errors. 2012-05-25 08:28:10 +00:00
Nicholas Marriott
ed85c5a198 Remove an extraneous word. 2012-05-23 20:08:14 +00:00
Nicholas Marriott
1f23f6d686 Use a predefined structure for not-space cells used to set attributes. 2012-05-23 19:19:40 +00:00
Tiago Cunha
17da2f7d5f Sync OpenBSD patchset 1121:
Store client in tty struct directly instead of using a callback function
pointer.
2012-05-22 21:05:30 +00:00
Tiago Cunha
fff7c0b276 Sync OpenBSD patchset 1120:
Store mouse data in tty structure not on the stack.
2012-05-22 21:04:25 +00:00
Tiago Cunha
5cc4961fd2 Sync OpenBSD patchset 1119:
Switch all of the various choose- and list- commands over to the format
infrastructure, from Thomas Adam.
2012-05-22 21:03:25 +00:00
Tiago Cunha
baafc17a1e Sync OpenBSD patchset 1118:
Add a helper function to send ready message.
2012-05-22 20:59:58 +00:00
Tiago Cunha
49b2a255b6 Sync OpenBSD patchset 1117:
Use tty_pane_full_width macro in some more places.
2012-05-22 20:59:12 +00:00
Tiago Cunha
d9cb07df3b Sync OpenBSD patchset 1116:
If there are any terminals with insert mode but not ich1, they can go
through the slow path. Tidies code slightly.
2012-05-22 20:58:33 +00:00
Tiago Cunha
a97f22ff2b Sync OpenBSD patchset 1115:
Move some common code to repeat spaces into a function.
2012-05-22 20:57:47 +00:00
Tiago Cunha
ffab6dbc9a Sync OpenBSD patchset 1114:
Instead of passing stdin/stdout/stderr file descriptors over imsg and
handling them in the server, handle them in the client and pass buffers
over imsg. This is much tidier for some upcoming changes and the
performance hit isn't critical.

The tty fd is still passed to the server as before.

This bumps the tmux protocol version so new clients and old servers are
incompatible.
2012-05-22 20:56:35 +00:00
Tiago Cunha
04bf0d8efc Sync OpenBSD patchset 1113:
Ignore line continuation when escaped as \\, from Simon Nicolussi.
2012-05-22 20:50:51 +00:00
Tiago Cunha
3604b31b6f Sync OpenBSD patchset 1112:
Use -t for move-window with -r rather than dying. Reported by Ben
Boeckel and Thomas Adam.
2012-05-22 20:50:03 +00:00
Nicholas Marriott
84c708f355 Store client in tty struct directly instead of using a callback function
pointer.
2012-05-22 14:32:28 +00:00
Nicholas Marriott
fe4f00834d Store mouse data in tty structure not on the stack. 2012-05-22 14:11:30 +00:00
Nicholas Marriott
ebf94bc9cb Switch all of the various choose- and list- commands over to the format
infrastructure, from Thomas Adam.
2012-05-22 11:35:37 +00:00
Nicholas Marriott
682884edc5 Add a helper function to send ready message. 2012-05-22 10:56:48 +00:00
Nicholas Marriott
82b053a811 Use tty_pane_full_width macro in some more places. 2012-05-22 09:37:54 +00:00
Nicholas Marriott
2f93affb98 If there are any terminals with insert mode but not ich1, they can go
through the slow path. Tidies code slightly.
2012-05-22 09:36:12 +00:00
Nicholas Marriott
243d12752c Move some common code to repeat spaces into a function. 2012-05-22 09:09:16 +00:00
Nicholas Marriott
7a4679a17f Instead of passing stdin/stdout/stderr file descriptors over imsg and
handling them in the server, handle them in the client and pass buffers
over imsg. This is much tidier for some upcoming changes and the
performance hit isn't critical.

The tty fd is still passed to the server as before.

This bumps the tmux protocol version so new clients and old servers are
incompatible.
2012-05-21 18:27:42 +00:00
Nicholas Marriott
d61c572c92 +/- from Thomas Adam. 2012-05-20 11:09:17 +00:00
Nicholas Marriott
cae8d02b2e Add FAQ entry on terminal scrollback, from Andrew Pimlott. 2012-05-17 23:30:20 +00:00
Nicholas Marriott
ac7e2f13e9 Ignore line continuation when escaped as \\, from Simon Nicolussi. 2012-05-17 21:21:31 +00:00
Nicholas Marriott
50cefec497 Use -t for move-window with -r rather than dying. Reported by Ben
Boeckel and Thomas Adam.
2012-05-13 07:33:31 +00:00
Tiago Cunha
1340c012b0 Sync OpenBSD patchset 1111:
Add a helper function to open the terminal for attach-/new-session.
2012-05-12 15:00:19 +00:00
Tiago Cunha
2f0db58777 Sync OpenBSD patchset 1110:
Only enter copy mode on scroll up, from Ailin Nemui.
2012-05-12 14:59:17 +00:00
Tiago Cunha
470f521410 Sync OpenBSD patchset 1109:
Tidy up by adding a macro for the pane being the full screen width, from
Ailin Nemui.
2012-05-12 14:58:43 +00:00
Tiago Cunha
8f29eeaae6 Sync OpenBSD patchset 1108:
Missing ()s in macros.
2012-05-12 14:57:36 +00:00
Tiago Cunha
f2f9bc0181 Sync OpenBSD patchset 1107:
Pull CRA out into a separate function and add ERA, from Ailin Nemui.
2012-05-12 14:57:02 +00:00
Tiago Cunha
5f92f62ac3 Sync OpenBSD patchset 1106:
Make unbind-key -a work with -t, based on a diff from Kazuhiko Sakaguchi.
2012-05-12 14:56:10 +00:00
Nicholas Marriott
673b1abe5f +. 2012-05-10 06:04:31 +00:00
Nicholas Marriott
37f9bb46d8 Add a helper function to open the terminal for attach-/new-session. 2012-05-06 07:38:17 +00:00
Nicholas Marriott
218b692221 Only enter copy mode on scroll up, from Ailin Nemui. 2012-05-05 18:48:31 +00:00
Nicholas Marriott
96a34a0c0a Tidy up by adding a macro for the pane being the full screen width, from
Ailin Nemui.
2012-05-05 18:45:55 +00:00
Nicholas Marriott
132403b6be Missing ()s in macros. 2012-05-05 18:31:09 +00:00
Nicholas Marriott
3e6454f2d6 Pull CRA out into a separate function and add ERA, from Ailin Nemui. 2012-05-05 18:17:59 +00:00
Nicholas Marriott
f66b105c21 Make unbind-key -a work with -t, based on a diff from Kazuhiko Sakaguchi. 2012-05-05 17:40:47 +00:00
Tiago Cunha
b74b875f25 Sync OpenBSD tree.h due to patchset 1104.
Prompted by ore on #tmux.
2012-05-03 20:39:42 +00:00
Tiago Cunha
e79c647052 Sync OpenBSD patchset 1105:
default-path has the same possibilities as new-window -c now.
2012-05-03 17:53:50 +00:00
Tiago Cunha
b728970c65 Sync OpenBSD patchset 1104:
Add a flag to move-window to renumber the windows in a session (closing
any gaps) and add an option to do this automatically each time a window
is killed. From Thomas Adam.
2012-05-03 17:51:04 +00:00
Tiago Cunha
e45dc6ae59 Sync OpenBSD patchset 1103:
Use int not u_char for colours from options since they may have bit 8
set to mark them as 256-colour. Reported by Chris Johnson.
2012-05-03 17:12:38 +00:00
Tiago Cunha
d0907861f9 Sync OpenBSD patchset 1102:
Add a buffer with all input from last ground state, will be used for
control mode. From George Nachman.
2012-05-03 16:55:48 +00:00
Nicholas Marriott
cc979bda0f default-path has the same possibilities as new-window -c now. 2012-05-02 19:29:13 +00:00
Nicholas Marriott
a6c22d650b Add a flag to move-window to renumber the windows in a session (closing
any gaps) and add an option to do this automatically each time a window
is killed. From Thomas Adam.
2012-04-29 17:20:01 +00:00
Nicholas Marriott
e60f48ab09 Use int not u_char for colours from options since they may have bit 8
set to mark them as 256-colour. Reported by Chris Johnson.
2012-04-29 07:33:41 +00:00
Nicholas Marriott
ff5155f719 Add a buffer with all input from last ground state, will be used for
control mode. From George Nachman.
2012-04-25 21:12:49 +00:00
Tiago Cunha
714416074a Sync OpenBSD patchset 1101:
Add missing prototype.
2012-04-24 16:24:37 +00:00
Tiago Cunha
bea5155fee Sync OpenBSD patchset 1100:
Use an enum for client exit reasons, from George Nachman.
2012-04-24 16:24:03 +00:00
Tiago Cunha
995c9a50ab Sync OpenBSD patchset 1099:
Do not return a buffer on the stack, mentioned by jsg a while ago.
2012-04-24 16:22:28 +00:00
Tiago Cunha
c8c6a23d66 Sync OpenBSD patchset 1098:
Use a helper function to fire choose callback.
2012-04-24 16:21:43 +00:00
Tiago Cunha
6df8953f4f Sync OpenBSD patchset 1097:
Add window-status-separator option, from Thomas Adam.
2012-04-24 16:20:18 +00:00
Tiago Cunha
00e2e35740 Sync OpenBSD patchset 1096:
Add -a flag to kill-window, from Thomas Adam.
2012-04-24 16:19:27 +00:00
Tiago Cunha
31cf5314ee Sync OpenBSD patchset 1095:
Fix printing commands with no arguments, from Benjamin Poirier.
2012-04-24 16:18:35 +00:00
Tiago Cunha
bdfbb52951 Sync OpenBSD patchset 1094:
Handle partial keys properly by making sure the timer has actually
expired, fixes problems with mintty reported by Michael Simpson.
2012-04-24 16:17:57 +00:00
Nicholas Marriott
94795eb48e Add missing prototype. 2012-04-23 23:25:02 +00:00
Nicholas Marriott
d3e432069b Use an enum for client exit reasons, from George Nachman. 2012-04-23 23:18:43 +00:00
Nicholas Marriott
0f9e0d1cfe Do not return a buffer on the stack, mentioned by jsg a while ago. 2012-04-23 22:43:09 +00:00
Nicholas Marriott
48e6ebbe1e Use a helper function to fire choose callback. 2012-04-23 22:40:47 +00:00
Nicholas Marriott
e02d1bce98 Add window-status-separator option, from Thomas Adam. 2012-04-23 22:23:14 +00:00
Nicholas Marriott
ed58b2d353 Add -a flag to kill-window, from Thomas Adam. 2012-04-23 22:10:45 +00:00
Nicholas Marriott
5cbca2e70f Fix printing commands with no arguments, from Benjamin Poirier. 2012-04-22 05:24:05 +00:00
Nicholas Marriott
e8dff68588 Handle partial keys properly by making sure the timer has actually
expired, fixes problems with mintty reported by Michael Simpson.
2012-04-22 05:21:40 +00:00
Tiago Cunha
e65c5ad56c Sync OpenBSD patchset 1093:
Turn automatic-rename off properly if turned off by renaming a
window. Reported by Romain Francoise.
2012-04-12 12:44:26 +00:00
Tiago Cunha
bae2701289 Sync OpenBSD patchset 1092:
Stop accepting new clients for 1 second on EMFILE/ENFILE. Based on
ongoing fixes to other daemons by Theo.
2012-04-12 12:43:40 +00:00
Nicholas Marriott
c6e0af9bdb Turn automatic-rename off properly if turned off by renaming a
window. Reported by Romain Francoise.
2012-04-11 07:45:30 +00:00
Nicholas Marriott
6703ca8d26 Stop accepting new clients for 1 second on EMFILE/ENFILE. Based on
ongoing fixes to other daemons by Theo.
2012-04-11 06:16:14 +00:00
Tiago Cunha
ce67a44a94 Sync OpenBSD patchset 1091:
Do not fire name timer when automatic-rename is off, from Tim Ruehsen a
while ago.
2012-04-10 09:57:08 +00:00
Tiago Cunha
14e5cdf02e Sync OpenBSD patchset 1090:
Fix comment for mouse bits.
2012-04-10 09:56:04 +00:00
Tiago Cunha
21f62c2cee Sync OpenBSD patchset 1089:
Fix some indentation.
2012-04-10 09:55:27 +00:00
Tiago Cunha
bd6153195f Sync OpenBSD patchset 1088:
Simplify mouse input function.
2012-04-10 09:54:59 +00:00
Tiago Cunha
e5b3858944 Sync OpenBSD patchset 1087:
Minor style nits - return ().
2012-04-10 09:54:29 +00:00
Tiago Cunha
09e6b7c137 Sync OpenBSD patchset 1086:
Turn some errors down to info.
2012-04-10 09:53:52 +00:00
Tiago Cunha
36ece3fcf5 Sync OpenBSD patchset 1085:
Fix option name.
2012-04-10 09:53:14 +00:00
Tiago Cunha
f99de22808 Sync OpenBSD patchset 1084:
Add a layout history which can be stepped through with select-layout -u
and -U commands (bound to 'u' and 'U' by default).
2012-04-10 09:52:45 +00:00
Tiago Cunha
b58d7f78a1 Adjust OpenBSD patchset 1083 to the portable version. 2012-04-10 09:50:32 +00:00
Tiago Cunha
2ce636a315 Sync OpenBSD patchset 1083:
Add pane_current_path format, suggested by Mikolaj Kucharski.
2012-04-10 09:49:04 +00:00
Tiago Cunha
2c4e8b92ab Sync OpenBSD patchset 1082:
Only exit mouse mode on scroll wheel when actually reaching the end of
the history, from James Nylen.
2012-04-10 09:45:41 +00:00
Tiago Cunha
86c1335452 Sync OpenBSD patchset 1081:
Only find each window once no matter how many panes, from Jonathan
Daugherty.
2012-04-10 09:44:58 +00:00
Nicholas Marriott
631d6b59fd Do not fire name timer when automatic-rename is off, from Tim Ruehsen a
while ago.
2012-04-08 06:47:26 +00:00
Nicholas Marriott
ed54f01d2f Fix comment for mouse bits. 2012-04-01 21:45:48 +00:00
Nicholas Marriott
711d2205dd Fix some indentation. 2012-04-01 21:07:35 +00:00
Nicholas Marriott
18d3498fb2 Simplify mouse input function. 2012-04-01 20:56:47 +00:00
Nicholas Marriott
c829bdf537 Minor style nits - return (). 2012-04-01 20:53:47 +00:00
Nicholas Marriott
20d10c608d Turn some errors down to info. 2012-04-01 13:27:18 +00:00
Nicholas Marriott
e1273fb6a1 Fix option name. 2012-04-01 13:21:38 +00:00
Nicholas Marriott
85f5485cb5 Add a layout history which can be stepped through with select-layout -u
and -U commands (bound to 'u' and 'U' by default).
2012-04-01 13:18:38 +00:00
Nicholas Marriott
b831f86354 Add pane_current_path format, suggested by Mikolaj Kucharski. 2012-04-01 10:42:39 +00:00
Nicholas Marriott
c11da7ca88 Only exit mouse mode on scroll wheel when actually reaching the end of
the history, from James Nylen.
2012-04-01 09:23:31 +00:00
Nicholas Marriott
f881ff1c18 +. 2012-04-01 08:39:19 +00:00
Nicholas Marriott
cd8e536c43 Only find each window once no matter how many panes, from Jonathan
Daugherty.
2012-04-01 08:10:56 +00:00
Tiago Cunha
58e5442d37 Sync OpenBSD patchset 1080:
Add sys/file.h.
2012-03-29 21:10:41 +00:00
Tiago Cunha
faf51d748e Sync OpenBSD patchset 1079:
Accept an argument to show-environment to show one variable, based on a
diff from Kazuhiko Sakaguchi.
2012-03-29 21:10:10 +00:00
Tiago Cunha
407f66ccbc Sync OpenBSD patchset 1078:
Some terminals respond to secondary DA with primary (they ignore the
intermediate character). So ignore the possible responses to primary DA.
2012-03-29 21:09:19 +00:00
Tiago Cunha
bfc9f475c6 Sync OpenBSD patchset 1077:
Fix save-buffer usage, from Kazuhiko Sakaguchi.
2012-03-29 21:08:44 +00:00
Tiago Cunha
8121b541e0 Sync OpenBSD patchset 1076:
Remove a stale comment.
2012-03-29 21:08:14 +00:00
Tiago Cunha
65748fb197 Sync OpenBSD patchset 1075:
Add -C -N -T flags to find-window to find in content, name, title. From
Jonathan Daugherty.
2012-03-29 21:07:28 +00:00
Tiago Cunha
37e5b5d947 Sync OpenBSD patchset 1074:
Check changes_timer with event_initialized before event_del.
2012-03-29 21:06:25 +00:00
Tiago Cunha
8ff20a5c6d Sync OpenBSD patchset 1073:
50 is a too low trigger default on larger terminals, bump to 250.
2012-03-29 21:05:53 +00:00
Tiago Cunha
f9f6eea444 Sync OpenBSD patchset 1072:
Add a simple form of output rate limiting by counting the number of
certain C0 sequences (linefeeds, backspaces, carriage returns) and if it
exceeds a threshold (current default 50/millisecond), start to redraw
the pane every 100 milliseconds instead of making each change as it
comes. Two configuration options - c0-change-trigger and
c0-change-interval.

This makes tmux much more responsive under very fast output (for example
yes(1) or accidentally cat'ing a large file) but may not be perfect on
all terminals and connections - feedback very welcome, particularly
where this change has a negative rather than positive effect (making it
off by default is a possibility).

After much experimentation based originally on a request Robin Lee
Powell (which ended with a completely different solution), this idea
from discussion with Ailin Nemui.
2012-03-29 21:05:16 +00:00
Tiago Cunha
621fa0a686 Sync OpenBSD patchset 1071:
Move MSG_IDENTIFY to the last sent by the client, this will be needed by
control clients and irrelevant for others.
2012-03-29 21:02:34 +00:00
Nicholas Marriott
0edaa34bfd Add sys/file.h. 2012-03-24 11:23:19 +00:00
Nicholas Marriott
c0cfbe12e4 Accept an argument to show-environment to show one variable, based on a
diff from Kazuhiko Sakaguchi.
2012-03-22 11:11:57 +00:00
Nicholas Marriott
7c9d003e99 Some terminals respond to secondary DA with primary (they ignore the
intermediate character). So ignore the possible responses to primary DA.
2012-03-21 21:28:03 +00:00
Nicholas Marriott
49ce38b09a Fix save-buffer usage, from Kazuhiko Sakaguchi. 2012-03-21 19:16:07 +00:00
Nicholas Marriott
b1e4b8769b Remove a stale comment. 2012-03-20 23:20:08 +00:00
Nicholas Marriott
90bf560fe4 Add -C -N -T flags to find-window to find in content, name, title. From
Jonathan Daugherty.
2012-03-20 17:09:48 +00:00
Nicholas Marriott
5672f2ce6b Check changes_timer with event_initialized before event_del. 2012-03-20 14:06:44 +00:00
Nicholas Marriott
01f2b5d64b 50 is a too low trigger default on larger terminals, bump to 250. 2012-03-20 11:23:12 +00:00
Nicholas Marriott
f59971276a Add a simple form of output rate limiting by counting the number of
certain C0 sequences (linefeeds, backspaces, carriage returns) and if it
exceeds a threshold (current default 50/millisecond), start to redraw
the pane every 100 milliseconds instead of making each change as it
comes. Two configuration options - c0-change-trigger and
c0-change-interval.

This makes tmux much more responsive under very fast output (for example
yes(1) or accidentally cat'ing a large file) but may not be perfect on
all terminals and connections - feedback very welcome, particularly
where this change has a negative rather than positive effect (making it
off by default is a possibility).

After much experimentation based originally on a request Robin Lee
Powell (which ended with a completely different solution), this idea
from discussion with Ailin Nemui.
2012-03-20 11:01:00 +00:00
Nicholas Marriott
2e2c9bd623 +. 2012-03-20 10:24:12 +00:00
Nicholas Marriott
bf9e7a1c68 Move MSG_IDENTIFY to the last sent by the client, this will be needed by
control clients and irrelevant for others.
2012-03-19 08:42:06 +00:00
Tiago Cunha
df31f1dfc9 Sync OpenBSD patchset 1070:
On xterm 271 and later, put the terminal into SCL 5 and use DECCRA for
scrolling the region in panes (if the large region check isn't
hit). With help from Ailin Nemui.
2012-03-18 02:25:26 +00:00
Tiago Cunha
0f9f30de2e Add notify.c to the list of sources. 2012-03-18 02:24:33 +00:00
Tiago Cunha
f41efd9d89 Sync OpenBSD patchset 1069:
Add notify hooks for various events, the functions are currently empty
stubs but will be filled in for control mode later. From George Nachman.
2012-03-18 02:22:09 +00:00
Tiago Cunha
ba7278373d Sync OpenBSD patchset 1067:
Use snprintf for constructing attribute string, from Tim Ruehsen.
2012-03-18 02:17:20 +00:00
Tiago Cunha
e4eb43ec71 Sync OpenBSD patchset 1066:
Add a wrap-search option to turn off wrapping of searches in copy
mode. From Jacobo de Vera.
2012-03-18 02:12:24 +00:00
Tiago Cunha
dc83ba0372 Sync OpenBSD patchset 1065:
Michael Krysiak points out that some terminals (eg mintty) have cursor
styles 5 and 6 too, so allow them to be set.
2012-03-18 02:11:27 +00:00
Tiago Cunha
cf8faa3b33 Sync OpenBSD patchset 1064:
Need to call recalculate_sizes() when changing window with the mouse,
from marcel partap.
2012-03-18 02:10:50 +00:00
Tiago Cunha
68ba5377e3 Sync OpenBSD patchset 1063:
Add -q option to set-option to turn off info message, from marcel partap.
2012-03-18 02:09:51 +00:00
Tiago Cunha
be4d77e60f Sync OpenBSD patchset 1062:
Break out termios initialization into a separate function, from George
Nachman.
2012-03-18 02:03:15 +00:00
Tiago Cunha
bde45cdd9c Sync OpenBSD patchset 1061:
Do not clear to end of line if the line is full, fixes missing last
character in rightmost pane.
2012-03-18 02:02:18 +00:00
Tiago Cunha
a7c615a794 Sync OpenBSD patchset 1060:
Use the region lower not the pane size to work out where the bottom line
is.
2012-03-18 02:01:46 +00:00
Tiago Cunha
92c522228b Sync OpenBSD patchset 1059:
Tweak last fix to actually hit the right end of pane.
2012-03-18 02:01:16 +00:00
Tiago Cunha
3a902f4196 Sync OpenBSD patchset 1058:
Fix warnings. Doh.
2012-03-18 02:00:39 +00:00
Tiago Cunha
0987d55231 Sync OpenBSD patchset 1057:
Check event_initialized before event_del if event may not have been set
up; libevent2 complains about this. Reported by Moriyoshi Koizumi.
2012-03-18 01:59:34 +00:00
Tiago Cunha
5aa28473dd Sync OpenBSD patchset 1056:
Redirect libevent logging to tmux's log.
2012-03-18 01:58:09 +00:00
Tiago Cunha
21ab66569c Sync OpenBSD patchset 1055:
Revert screen-write.c r1.54 and fix the bug properly. After wrapping a
line in a pane, the cursor needs to move to the next line unless it
scrolled.
2012-03-18 01:57:01 +00:00
Tiago Cunha
070d266aae Sync OpenBSD patchset 1054:
Send secondary DA to terminals with XT in terminfo when starting up and
parse it to work out the xterm version.
2012-03-18 01:55:45 +00:00
Tiago Cunha
3b990ef6b2 Sync OpenBSD patchset 1053:
Respond to secondary DA requests.
2012-03-18 01:48:04 +00:00
Tiago Cunha
e920fa3e36 Sync OpenBSD patchset 1052:
Fix a warning. Doh.
2012-03-18 01:47:11 +00:00
Tiago Cunha
84207f06b7 Sync OpenBSD patchset 1051:
Add a helper function for enabling an optimization to make some code
clearer.
2012-03-18 01:46:37 +00:00
Tiago Cunha
c7f078dcbc Sync OpenBSD patchset 1050:
Store context off before moving the cursor when wrapping, to fix long
standing bug drawing over the status line.
2012-03-18 01:40:26 +00:00
Tiago Cunha
3893cc17a4 Sync OpenBSD patchset 1049:
Add -P/-F flags to break-pane too, from George Nachman.
2012-03-18 01:38:27 +00:00
Tiago Cunha
4d1c513968 Sync OpenBSD patchset 1048:
Erm, use EL in a way that actually works...
2012-03-18 01:37:26 +00:00
Tiago Cunha
14d6a4ab26 Sync OpenBSD patchset 1047:
Use EL to clear to end of line if possible.
2012-03-18 01:36:49 +00:00
Tiago Cunha
e678ba3943 Sync OpenBSD patchset 1046:
Always remember last cursor position when moving up or down, not just
for if crossing zero length lines. From Itay Perl.
2012-03-18 01:35:39 +00:00
Tiago Cunha
166681eee9 Sync OpenBSD patchset 1045:
Remove some bits leftover from unused backoff code.
2012-03-18 01:33:56 +00:00
Tiago Cunha
1fdac2adf1 Sync OpenBSD patchset 1044:
Add a missing call to window_set_name, from George Nachman.
2012-03-18 01:28:56 +00:00
Tiago Cunha
40b1d64ce7 Sync OpenBSD patchset 1043:
Use a lock file and flock() to serialize server start, avoids problems
when running a bunch of tmux from cron at the same time. Based on a diff
from Tim Ruehsen.
2012-03-18 01:28:10 +00:00
Nicholas Marriott
d8805af66b On xterm 271 and later, put the terminal into SCL 5 and use DECCRA for
scrolling the region in panes (if the large region check isn't
hit). With help from Ailin Nemui.
2012-03-17 22:56:04 +00:00
Nicholas Marriott
46210344a6 Add notify hooks for various events, the functions are currently empty
stubs but will be filled in for control mode later. From George Nachman.
2012-03-17 22:35:09 +00:00
Nicholas Marriott
4f480c901d $Id$ -> $OpenBSD$. 2012-03-17 22:34:12 +00:00
Nicholas Marriott
50f5d2a7ec Use snprintf for constructing attribute string, from Tim Ruehsen. 2012-03-17 21:45:25 +00:00
Nicholas Marriott
95f48a219a Add a wrap-search option to turn off wrapping of searches in copy
mode. From Jacobo de Vera.
2012-03-17 21:40:53 +00:00
Nicholas Marriott
87d092d226 Michael Krysiak points out that some terminals (eg mintty) have cursor
styles 5 and 6 too, so allow them to be set.
2012-03-17 21:37:36 +00:00
Nicholas Marriott
e87d4b43ab Need to call recalculate_sizes() when changing window with the mouse,
from marcel partap.
2012-03-17 21:34:34 +00:00
Nicholas Marriott
f152379e5a Add -q option to set-option to turn off info message, from marcel partap. 2012-03-17 21:33:33 +00:00
Nicholas Marriott
889fe42e11 Break out termios initialization into a separate function, from George
Nachman.
2012-03-17 21:27:51 +00:00
Nicholas Marriott
164e85cca7 Do not clear to end of line if the line is full, fixes missing last
character in rightmost pane.
2012-03-17 19:29:46 +00:00
Nicholas Marriott
0b34fefe6e Use the region lower not the pane size to work out where the bottom line
is.
2012-03-17 19:18:37 +00:00
Nicholas Marriott
928f40615c Tweak last fix to actually hit the right end of pane. 2012-03-17 18:51:50 +00:00
Nicholas Marriott
7ad052583a Fix warnings. Doh. 2012-03-17 18:38:58 +00:00
Nicholas Marriott
d3c842d367 Check event_initialized before event_del if event may not have been set
up; libevent2 complains about this. Reported by Moriyoshi Koizumi.
2012-03-17 18:24:07 +00:00
Nicholas Marriott
a597e3546c Redirect libevent logging to tmux's log. 2012-03-17 18:23:03 +00:00
Nicholas Marriott
0489213b1b Revert screen-write.c r1.54 and fix the bug properly. After wrapping a
line in a pane, the cursor needs to move to the next line unless it
scrolled.
2012-03-17 17:36:03 +00:00
Nicholas Marriott
9b8fc982ec +. 2012-03-16 21:10:39 +00:00
Nicholas Marriott
92a720157b +. 2012-03-16 07:37:19 +00:00
Nicholas Marriott
c8c0d68128 Send secondary DA to terminals with XT in terminfo when starting up and
parse it to work out the xterm version.
2012-03-15 10:36:00 +00:00
Nicholas Marriott
523ed3873d Respond to secondary DA requests. 2012-03-15 10:05:49 +00:00
Nicholas Marriott
005566f915 Fix a warning. Doh. 2012-03-15 09:22:31 +00:00
Nicholas Marriott
698361ccde Add a helper function for enabling an optimization to make some code
clearer.
2012-03-15 09:10:33 +00:00
Nicholas Marriott
71df37c247 Store context off before moving the cursor when wrapping, to fix long
standing bug drawing over the status line.
2012-03-14 23:29:07 +00:00
Nicholas Marriott
21c11c7f48 +. 2012-03-12 13:58:11 +00:00
Nicholas Marriott
4e05a2c0ae Add -P/-F flags to break-pane too, from George Nachman. 2012-03-12 13:31:09 +00:00
Nicholas Marriott
575bfa4b4b Erm, use EL in a way that actually works... 2012-03-12 12:43:18 +00:00
Nicholas Marriott
31ddae7735 Use EL to clear to end of line if possible. 2012-03-12 12:38:42 +00:00
Nicholas Marriott
33fac234c0 Fix trailing \, pointed out by Romain Francoise and a few others. 2012-03-11 23:04:19 +00:00
Nicholas Marriott
1bbb793263 Always remember last cursor position when moving up or down, not just
for if crossing zero length lines. From Itay Perl.
2012-03-11 23:01:19 +00:00
Nicholas Marriott
799f437eff Remove some bits leftover from unused backoff code. 2012-03-09 21:42:13 +00:00
Nicholas Marriott
be63fef872 Add a missing call to window_set_name, from George Nachman. 2012-03-09 21:11:28 +00:00
Nicholas Marriott
ac9ebc29a2 Use a lock file and flock() to serialize server start, avoids problems
when running a bunch of tmux from cron at the same time. Based on a diff
from Tim Ruehsen.
2012-03-09 09:57:40 +00:00
Tiago Cunha
3307813a07 Sync OpenBSD patchset 1042:
free -> xfree.
2012-03-07 13:40:08 +00:00
Tiago Cunha
3d98adaf91 Sync OpenBSD patchset 1041:
Add -F format to new-window and split-window to use with the -P flag,
from George Nachman.
2012-03-07 13:39:29 +00:00
Tiago Cunha
cf11809cd4 Sync OpenBSD patchset 1040:
Accept hex values as keys, needed for send-keys, based on a diff from
George Nachman.
2012-03-07 13:38:26 +00:00
Tiago Cunha
32a6092f71 Sync OpenBSD patchset 1039:
Add A and I keys for vi status line editing.
2012-03-07 13:37:44 +00:00
Tiago Cunha
e7c7024907 Sync OpenBSD patchset 1038:
Terminate strftime buffer properly and free format string, whoops. From
Tiago Cunha.
2012-03-07 13:36:57 +00:00
Tiago Cunha
3275e9bd5b Sync OpenBSD patchset 1037:
Support "bracketed paste" mode. This adds a -p flag to paste-buffer - if
this is used and the application has requested bracketed pastes, then
tmux surrounds the pasted text by \033[200~ and \033[201~. Applications
like vim can (apparently) use this to avoid, for example, indenting the
text. From Ailin Nemui.
2012-03-07 13:36:19 +00:00
Tiago Cunha
9d79a56402 Sync OpenBSD patchset 1036:
The wlmouse offset should be part of the client, not the server. From
Ailin Nemui.
2012-03-07 13:35:03 +00:00
Nicholas Marriott
18012f5b18 free -> xfree. 2012-03-04 20:52:05 +00:00
Nicholas Marriott
03dca66ae2 Add -F format to new-window and split-window to use with the -P flag,
from George Nachman.
2012-03-04 20:50:53 +00:00
Nicholas Marriott
178a20718c Accept hex values as keys, needed for send-keys, based on a diff from
George Nachman.
2012-03-04 20:40:54 +00:00
Nicholas Marriott
30f4c30ca3 Add A and I keys for vi status line editing. 2012-03-04 07:38:11 +00:00
Nicholas Marriott
8b68ea1462 Terminate strftime buffer properly and free format string, whoops. From
Tiago Cunha.
2012-03-03 09:45:41 +00:00
Nicholas Marriott
f4fdddc930 Support "bracketed paste" mode. This adds a -p flag to paste-buffer - if
this is used and the application has requested bracketed pastes, then
tmux surrounds the pasted text by \033[200~ and \033[201~. Applications
like vim can (apparently) use this to avoid, for example, indenting the
text. From Ailin Nemui.
2012-03-03 09:43:22 +00:00
Tiago Cunha
e4f1fbd008 Sync OpenBSD patchset 1035:
Add move-pane command (like join-pane but allows the same window). Also
-b flag to join-pane and move-pane to place the pane to the left or
above. From George Nachman.
2012-03-03 09:19:40 +00:00
Tiago Cunha
89ab147093 Sync OpenBSD patchset 1034:
Add printf attribute to a couple of functions, from Tim Ruehsen.
2012-03-03 09:17:30 +00:00
Tiago Cunha
95f427c34e Sync OpenBSD patchset 1032:
Allow a single option to be specified to show-options to show just that
option.
2012-03-03 09:16:52 +00:00
Tiago Cunha
e0d2221879 Sync OpenBSD patchset 1031:
Use format for display-message, based on a diff from George Nachman.
2012-03-03 09:14:21 +00:00
Nicholas Marriott
4b8bb7770f The wlmouse offset should be part of the client, not the server. From
Ailin Nemui.
2012-03-03 08:55:56 +00:00
Nicholas Marriott
07ac16807f Add move-pane command (like join-pane but allows the same window). Also
-b flag to join-pane and move-pane to place the pane to the left or
above. From George Nachman.
2012-03-03 08:31:18 +00:00
Nicholas Marriott
82f4db0d10 ANSIfy function prototypes, from Tim Ruehsen. 2012-03-02 11:23:51 +00:00
Nicholas Marriott
4d9ccd3229 Add printf attribute to a couple of functions, from Tim Ruehsen. 2012-03-02 11:16:44 +00:00
Nicholas Marriott
b801118fe5 +book at http://pragprog.com/book/bhtmux/tmux 2012-03-01 17:16:49 +00:00
Nicholas Marriott
952ffdd288 Remove accidentally committed option. 2012-02-29 21:10:51 +00:00
Nicholas Marriott
4e7de210e4 Allow a single option to be specified to show-options to show just that
option.
2012-02-25 12:57:42 +00:00
Nicholas Marriott
aaf0bfccf4 Use format for display-message, based on a diff from George Nachman. 2012-02-23 22:40:58 +00:00
Nicholas Marriott
a870a596bc +. 2012-02-21 08:56:18 +00:00
Tiago Cunha
88f25bb677 Sync OpenBSD patchset 1030:
Sort some entries, from Ben Boeckel.
2012-02-15 19:32:39 +00:00
Tiago Cunha
290636bc86 Sync OpenBSD patchset 1029:
Add a wrapper function tty_set_size from George Nachman.
2012-02-15 19:32:12 +00:00
Tiago Cunha
3e94fa70f9 Sync OpenBSD patchset 1028:
Don't die if fail to get root directory, from Ben Boeckel.
2012-02-15 19:31:35 +00:00
Tiago Cunha
cfa6ac9161 Sync OpenBSD patchset 1026:
Check for the right return value from sscanf.
2012-02-15 19:30:51 +00:00
Tiago Cunha
6e6e8046ba Sync OpenBSD patchset 1026:
Document option values, particularly that omitting on|off for a flag is
a toggle.
2012-02-15 19:30:17 +00:00
Nicholas Marriott
d7ea1ac847 Update, from Ben Boeckel. 2012-02-15 18:48:52 +00:00
Nicholas Marriott
fe055c89f5 Sort some entries, from Ben Boeckel. 2012-02-15 18:44:49 +00:00
Nicholas Marriott
fddbd44c18 Add a wrapper function tty_set_size from George Nachman. 2012-02-15 17:25:02 +00:00
Nicholas Marriott
67949de0a1 Don't die if fail to get root directory, from Ben Boeckel. 2012-02-06 17:29:29 +00:00
Nicholas Marriott
3f49137f90 Check for the right return value from sscanf. 2012-02-05 22:23:13 +00:00
Nicholas Marriott
fe7cf0ba90 Document option values, particularly that omitting on|off for a flag is
a toggle.
2012-02-02 22:33:05 +00:00
Tiago Cunha
94e46dd724 Sync OpenBSD patchset 1025:
Add -l flag to send-keys to send input literally (without translating
key names). From Frank Terbeck.
2012-02-02 02:01:18 +00:00
Tiago Cunha
c82e06804e Sync OpenBSD patchset 1024:
Move window name changes into wrapper function window_set_name, from
George Nachman.
2012-02-02 02:00:12 +00:00
Tiago Cunha
509a7e8b73 Sync OpenBSD patchset 1023:
Do not change pane when changing window with mouse on status line,
pointed out by Romain Francoise.
2012-02-02 01:58:47 +00:00
Tiago Cunha
98e24b9f70 Sync OpenBSD patchset 1022:
Get client_width and client_height the right way round, from Stephen
Thirlwall.
2012-02-02 01:58:16 +00:00
Tiago Cunha
0fd0030a2a Adjust function name to the portable version. 2012-02-02 01:57:14 +00:00
Tiago Cunha
4bb01c1768 Sync OpenBSD patchset 1021:
Provide defined ways to set the various default-path possibilities: ~
for home directory, . for server start directory, - for session start
directory and empty for the pane's working directory (the default). All
can also be used as part of a relative path (eg -/foo). Also provide -c
flags to neww and splitw to override default-path setting.

Based on a diff from sthen. ok sthen
2012-02-02 01:55:34 +00:00
Nicholas Marriott
efb639e1d2 Add -l flag to send-keys to send input literally (without translating
key names). From Frank Terbeck.
2012-02-02 00:15:28 +00:00
Nicholas Marriott
8363d19307 Move window name changes into wrapper function window_set_name, from
George Nachman.
2012-02-02 00:10:11 +00:00
Nicholas Marriott
fdeaa73342 Do not change pane when changing window with mouse on status line,
pointed out by Romain Francoise.
2012-02-02 00:04:54 +00:00
Nicholas Marriott
d1ae2d9757 Get client_width and client_height the right way round, from Stephen
Thirlwall.
2012-02-02 00:03:45 +00:00
Nicholas Marriott
908a22e41c Provide defined ways to set the various default-path possibilities: ~
for home directory, . for server start directory, - for session start
directory and empty for the pane's working directory (the default). All
can also be used as part of a relative path (eg -/foo). Also provide -c
flags to neww and splitw to override default-path setting.

Based on a diff from sthen. ok sthen
2012-01-31 15:52:21 +00:00
Tiago Cunha
c2176afe9c Sync OpenBSD patchset 1020:
Add pane id to each pane in layout description (while still accepting
the old form). Based on diff from George Nachman.
2012-01-31 12:03:56 +00:00
Tiago Cunha
6b3988b749 Sync OpenBSD patchset 1019:
id -> ID; ok nicm
2012-01-31 12:03:00 +00:00
Tiago Cunha
896c55291f Sync OpenBSD patchset 1018:
Don't print double spaces in list output.
2012-01-31 12:02:24 +00:00
Tiago Cunha
2ee0d851d9 Sync OpenBSD patchset 1017:
Give each window a unique id, like panes but prefixed with @. Based on
work from George Nachman.
2012-01-31 12:01:43 +00:00
Tiago Cunha
c08a532440 Sync OpenBSD patchset 1016:
Enforce history-limit option when clearing the screen, memory leak
spotted by R I Pienaar.
2012-01-31 11:58:55 +00:00
Nicholas Marriott
49a5a587ec Add pane id to each pane in layout description (while still accepting
the old form). Based on diff from George Nachman.
2012-01-30 20:57:02 +00:00
Jason McIntyre
677ed3e5f0 id -> ID; ok nicm 2012-01-30 20:48:28 +00:00
Nicholas Marriott
f188345b33 Don't print double spaces in list output. 2012-01-30 20:39:56 +00:00
Nicholas Marriott
0e59bc75fd Give each window a unique id, like panes but prefixed with @. Based on
work from George Nachman.
2012-01-30 09:39:34 +00:00
Nicholas Marriott
937173ff11 Enforce history-limit option when clearing the screen, memory leak
spotted by R I Pienaar.
2012-01-29 21:31:11 +00:00
Tiago Cunha
e4a7cefe0c Sync OpenBSD patchset 1015:
Add an option to move the status line to the top of the screen,
requested by many.
2012-01-29 12:57:01 +00:00
Tiago Cunha
e23df3af5a Sync OpenBSD patchset 1014:
Call bufferevent_free before closing file descriptor associated with it
or bugs in $EventMechanism on $OtherOS makes libevent get it's knickers
in a twist. From Dylan Alex Simon.
2012-01-29 12:53:33 +00:00
Tiago Cunha
9c1d3046ca Sync OpenBSD patchset 1013:
Terminate strftime buffer properly even if a really long format string
is given, from Tiago Cunha.
2012-01-29 12:52:16 +00:00
Tiago Cunha
c846298747 Sync OpenBSD patchset 1012:
Fix memory leak in error path, from Tiago Cunha.
2012-01-29 12:51:43 +00:00
Nicholas Marriott
230d0fbc9e Add an option to move the status line to the top of the screen,
requested by many.
2012-01-29 09:37:02 +00:00
Nicholas Marriott
9bbc63ed65 Call bufferevent_free before closing file descriptor associated with it
or bugs in $EventMechanism on $OtherOS makes libevent get it's knickers
in a twist. From Dylan Alex Simon.
2012-01-29 02:22:11 +00:00
Nicholas Marriott
ad2cc63412 Fill in osdep_get_cwd on Darwin, from Alex Ernst. 2012-01-27 09:01:06 +00:00
Nicholas Marriott
a7a44bfcd9 Terminate strftime buffer properly even if a really long format string
is given, from Tiago Cunha.
2012-01-26 09:05:54 +00:00
Nicholas Marriott
d2d2df1365 Fix memory leak in error path, from Tiago Cunha. 2012-01-26 09:03:09 +00:00
Tiago Cunha
224255cb89 Create a debug build by default. 2012-01-23 13:20:14 +00:00
Tiago Cunha
74b2eaa73e Working on 1.7. 2012-01-23 13:19:08 +00:00
Tiago Cunha
e254aeb9f9 Major changes since the previous version. 2012-01-23 12:41:36 +00:00
Tiago Cunha
1d4c54717c Add notes about some potential configuration file breaking in the 1.6 release. 2012-01-23 12:38:05 +00:00
Tiago Cunha
30b816f101 Done. 2012-01-23 12:35:55 +00:00
Tiago Cunha
9803aee98e Releases don't have debugging enabled. 2012-01-23 12:34:47 +00:00
Tiago Cunha
a34a72d2d9 Sync OpenBSD patchset 1011:
Remove unused backoff code that doesn't do any good.
2012-01-23 12:24:00 +00:00
Tiago Cunha
4d80980e50 Sync OpenBSD patchset 1010:
Show pane size in top right of display panes mode.
2012-01-23 12:23:27 +00:00
Tiago Cunha
85152ef35c Expand the Id keyword. 2012-01-22 23:41:34 +00:00
Nicholas Marriott
678e67437f Remove unused backoff code that doesn't do any good. 2012-01-21 23:51:34 +00:00
Nicholas Marriott
b92e81a1aa Show pane size in top right of display panes mode. 2012-01-21 23:45:44 +00:00
Tiago Cunha
ebce251183 Sync OpenBSD patchset 1009:
it's -> its.
2012-01-21 21:40:33 +00:00
Nicholas Marriott
e870a3f3ec it's -> its. 2012-01-21 20:40:28 +00:00
Tiago Cunha
a3c1b730c9 Sync OpenBSD patchset 1008:
Use RB trees not SPLAY.
2012-01-21 19:38:26 +00:00
Tiago Cunha
a7b0b30bdd Sync OpenBSD patchset 1007:
Drop the ability to have a list of keys in the prefix in favour of two
separate options, prefix and prefix2. This simplifies the code and gets
rid the data options type which was only used for this one option.

Also add a -2 flag to send-prefix to send the secondary prefix key,
fixing a cause of minor irritation.

People who want three prefix keys are out of luck :-).
2012-01-21 19:36:40 +00:00
Tiago Cunha
d4c2a935f2 Sync OpenBSD patchset 1006:
Add strings to allow the aixterm bright colours to be used when
configuring colours, requested by Elliott Cable a few months ago.
2012-01-21 19:33:45 +00:00
Tiago Cunha
cc967ffeb9 Sync OpenBSD patchset 1005:
One day I will actually fix ALL the warnings before I commit...
2012-01-21 19:32:36 +00:00
Tiago Cunha
4bea559037 Sync OpenBSD patchset 1004:
Add a -R flag to send-keys to reset the terminal. Written ages ago and
Suggested by someone, I forget who.
2012-01-21 19:31:59 +00:00
Tiago Cunha
674de910ca Sync OpenBSD patchset 1003:
Only hide flags on the current window when the session is attached, from
Roland Walker.
2012-01-21 19:30:07 +00:00
Nicholas Marriott
8ed9124f3f Use RB trees not SPLAY. 2012-01-21 11:12:13 +00:00
Nicholas Marriott
535286c05a Drop the ability to have a list of keys in the prefix in favour of two
separate options, prefix and prefix2. This simplifies the code and gets
rid the data options type which was only used for this one option.

Also add a -2 flag to send-prefix to send the secondary prefix key,
fixing a cause of minor irritation.

People who want three prefix keys are out of luck :-).
2012-01-21 08:40:09 +00:00
Nicholas Marriott
7f24020cbe Add strings to allow the aixterm bright colours to be used when
configuring colours, requested by Elliott Cable a few months ago.
2012-01-21 08:23:12 +00:00
Nicholas Marriott
be7b56a613 One day I will actually fix ALL the warnings before I commit... 2012-01-21 08:12:03 +00:00
Nicholas Marriott
66f04514cf Add a -R flag to send-keys to reset the terminal. Written ages ago and
Suggested by someone, I forget who.
2012-01-21 08:10:21 +00:00
Nicholas Marriott
cd10f7322a Only hide flags on the current window when the session is attached, from
Roland Walker.
2012-01-21 06:13:16 +00:00
Tiago Cunha
5434a2759a Sync OpenBSD patchset 1002:
Add some const and fix a warning.
2012-01-20 21:21:32 +00:00
Tiago Cunha
b7551c9193 Sync OpenBSD patchset 1001:
Add some trivial additional status line attributes from jwcxz at users
dot sourceforge dot net.
2012-01-20 21:20:35 +00:00
Tiago Cunha
d4312281da Sync OpenBSD patchset 1000:
Remove trailing spaces.
2012-01-20 21:19:20 +00:00
Tiago Cunha
d9eb34b28d Sync OpenBSD patchset 999:
Add an option to disable the window rename escape sequence, from Romain
Francoise.
2012-01-20 21:18:39 +00:00
Tiago Cunha
b79189958f Sync OpenBSD patchset 998:
Add space movement keys for vi mode in the status line from Ben Boeckel.
2012-01-20 21:17:18 +00:00
Tiago Cunha
ad5c4e719b Sync OpenBSD patchset 997:
Calculate last position correctly for UTF-8 wide characters, reported by
Matthias Lederhofer.
2012-01-20 21:16:07 +00:00
Nicholas Marriott
db7570daab Set IUTF8 in termios where supported, suggested by Egmont Koblinger. 2012-01-20 20:18:20 +00:00
Nicholas Marriott
8332413305 Add some const and fix a warning. 2012-01-20 19:54:07 +00:00
Nicholas Marriott
8cf19ab770 Add some trivial additional status line attributes from jwcxz at users
dot sourceforge dot net.
2012-01-20 19:51:28 +00:00
Nicholas Marriott
199d148740 Remove trailing spaces. 2012-01-20 19:16:16 +00:00
Nicholas Marriott
dcad13155b Add an option to disable the window rename escape sequence, from Romain
Francoise.
2012-01-20 19:15:40 +00:00
Nicholas Marriott
e6519d3e27 Add space movement keys for vi mode in the status line from Ben Boeckel. 2012-01-20 19:10:29 +00:00
Nicholas Marriott
299a8fd4a3 Calculate last position correctly for UTF-8 wide characters, reported by
Matthias Lederhofer.
2012-01-15 19:39:42 +00:00
Tiago Cunha
60069fe8fe Sync OpenBSD patchset 995:
Add a man page section on window names and pane titles, from Felix
Rosencrantz.
2012-01-03 18:36:40 +00:00
Tiago Cunha
d817f88fec Sync OpenBSD patchset 995:
Show how to set default-path to revert to tmux's old behaviour of opening
new windows in the current working directory at the time tmux was started,
it's not obvious. naddy@ agrees this is a useful inclusion.
2012-01-03 18:35:54 +00:00
Nicholas Marriott
eeaf92ad06 Add a man page section on window names and pane titles, from Felix
Rosencrantz.
2011-12-31 03:40:15 +00:00
Stuart Henderson
16f9667620 Show how to set default-path to revert to tmux's old behaviour of opening
new windows in the current working directory at the time tmux was started,
it's not obvious. naddy@ agrees this is a useful inclusion.
2011-12-30 14:59:13 +00:00
Tiago Cunha
90b331ea46 Sync OpenBSD patchset 994:
Add CNL and CPL escape sequences.
2011-12-30 14:21:40 +00:00
Tiago Cunha
e2d59a6c17 Sync OpenBSD patchset 993:
Allow $HOME as default-path in tmux.conf so the same config file can be used
on different machines regardless of where the user's home directory is.
ok nicm
2011-12-30 14:21:02 +00:00
Tiago Cunha
2ca1849350 Sync OpenBSD patchset 992:
Add \033[s and \033[u to save and restore cursor position.
2011-12-30 14:19:21 +00:00
Tiago Cunha
e210abf335 $Id$ not $OpenBSD$. 2011-12-30 14:18:27 +00:00
Tiago Cunha
f9b4095188 Sync OpenBSD patchset 991:
Extend history that can be captured to INT_MIN rather than
SHRT_MIN. From Chris Johnsen.
2011-12-30 14:16:44 +00:00
Tiago Cunha
d1f0138653 Sync OpenBSD patchset 990:
Reset flags on every loop or it is displayed too often, from Chris
Johnsen.
2011-12-30 14:15:40 +00:00
Nicholas Marriott
92aef64c5a Add CNL and CPL escape sequences. 2011-12-29 08:06:24 +00:00
Stefan Sperling
fdd1d0b72e Allow $HOME as default-path in tmux.conf so the same config file can be used
on different machines regardless of where the user's home directory is.
ok nicm
2011-12-27 14:07:20 +00:00
Nicholas Marriott
d377a68593 Add \033[s and \033[u to save and restore cursor position. 2011-12-27 14:06:19 +00:00
Nicholas Marriott
5db593e5c2 Extend history that can be captured to INT_MIN rather than
SHRT_MIN. From Chris Johnsen.
2011-12-27 13:46:26 +00:00
Nicholas Marriott
d71e4b9aca Reset flags on every loop or it is displayed too often, from Chris
Johnsen.
2011-12-27 13:41:50 +00:00
Tiago Cunha
9e7ec2e971 Sync OpenBSD patchset 989:
formatting errors, found using freebsd's "igor";
2011-12-25 23:36:27 +00:00
Tiago Cunha
3a9a24a7c0 Sync OpenBSD patchset 988:
Fix so that when mouse-select-pane and mouse-select-window are both
enabled, clicking on the status line does not change the current
pane. From Romain Francoise.
2011-12-25 23:33:30 +00:00
Jason McIntyre
da145e7c20 formatting errors, found using freebsd's "igor"; 2011-12-24 08:46:48 +00:00
Nicholas Marriott
d655566ce7 Fix so that when mouse-select-pane and mouse-select-window are both
enabled, clicking on the status line does not change the current
pane. From Romain Francoise.
2011-12-24 08:26:59 +00:00
Nicholas Marriott
c1b9948525 Change the way the working directory for new processes is discovered. If
default-path isn't empty, it is used. Otherwise:

1) If tmux neww is run from the command line, the working directory of the
client is used.

2) Otherwise use some platform specific code to retrieve the current working
directory of the process in the active pane.

3) If that fails, the directory where the session was created is used.

Idea and support code, Linux, Solaris, FreeBSD bits by Romain Francoise,
OpenBSD bits by me.
2011-12-09 16:37:29 +00:00
Nicholas Marriott
f308ba93aa Change the way the working directory for new processes is discovered. If
default-path isn't empty, it is used. Otherwise:

1) If tmux neww is run from the command line, the working directory of the
   client is used.

2) Otherwise sysctl KERN_PROC_CWD is used to retrieve the current
   working directory of the process in the active pane.

3) If that fails, the directory where the session was created is used.

Support code by Romain Francois, OpenBSD specific bits by me.

Note this requires a recent userland and kernel with KERN_PROC_CWD.
2011-12-09 16:28:18 +00:00
Tiago Cunha
76862acf3e Sync OpenBSD patchset 986:
Support "jump to" like vi in copy mode using t and T keys. Also add x
and X for delete in edit mode.

From Ben Boeckel, thanks.
2011-12-06 18:50:26 +00:00
Tiago Cunha
f308663ad4 Sync OpenBSD patchset 985:
Log terminal overrides.
2011-12-06 18:48:45 +00:00
Tiago Cunha
876f46abb9 Sync OpenBSD patchset 984:
Add home and end keys for command prompt, from Matthias Lederhofer.
2011-12-06 18:48:02 +00:00
Tiago Cunha
620a87db25 Sync OpenBSD patchset 983:
Make M-f and M-b work the same at the command prompt as in copy mode,
pointed out by Romain Francoise.
2011-12-06 18:47:14 +00:00
Nicholas Marriott
e04d13f6a6 Support "jump to" like vi in copy mode using t and T keys. Also add x
and X for delete in edit mode.

From Ben Boeckel, thanks.
2011-12-04 16:18:01 +00:00
Nicholas Marriott
c44d2d854f Log terminal overrides. 2011-12-01 23:47:08 +00:00
Nicholas Marriott
31f13e49d8 Add home and end keys for command prompt, from Matthias Lederhofer. 2011-12-01 20:44:12 +00:00
Nicholas Marriott
2397083f7e Make M-f and M-b work the same at the command prompt as in copy mode,
pointed out by Romain Francoise.
2011-12-01 20:42:31 +00:00
Tiago Cunha
08014af243 New commands and options. From Ben Boeckel. 2011-11-25 14:31:11 +00:00
Tiago Cunha
774bffb3c6 Sync OpenBSD patchset 982:
Add word movement and editing command for command prompt editing, from
Ben Boeckel.
2011-11-25 13:34:20 +00:00
Tiago Cunha
9c920214e6 Sync OpenBSD patchset 981:
Move word-separators to be a session rather than window option, from Ben
Boeckel.
2011-11-25 13:33:04 +00:00
Tiago Cunha
5cc3d50289 Sync OpenBSD patchset 980:
Add a pane_index format string and use it, from Ben Boeckel.
2011-11-25 13:31:56 +00:00
Tiago Cunha
9ec457575d Sync OpenBSD patchset 979:
Make window_pane_index work the same as window_index, from Ben Boeckel.
2011-11-25 13:30:45 +00:00
Nicholas Marriott
fc5f8804ec Add word movement and editing command for command prompt editing, from
Ben Boeckel.
2011-11-15 23:34:12 +00:00
Nicholas Marriott
fd25d35868 Move word-separators to be a session rather than window option, from Ben
Boeckel.
2011-11-15 23:24:04 +00:00
Nicholas Marriott
7c9bc377a3 Add a pane_index format string and use it, from Ben Boeckel. 2011-11-15 23:21:52 +00:00
Nicholas Marriott
57df442916 Make window_pane_index work the same as window_index, from Ben Boeckel. 2011-11-15 23:19:51 +00:00
Nicholas Marriott
398af28d2a +. 2011-11-15 23:12:28 +00:00
Tiago Cunha
8798079ab0 Typo. From Bastien Dejean. 2011-11-10 21:50:40 +00:00
Tiago Cunha
c26ec766cb Add command colour options. From Ben Boeckel. 2011-11-10 21:49:27 +00:00
Tiago Cunha
c3794d4303 Sync OpenBSD patchset 978:
Fix a trivial copy-and-paste error (sx->sy), from Chris Johnsen.
2011-11-10 21:41:37 +00:00
Tiago Cunha
4fbb296438 Sync OpenBSD patchset 977:
Missing bits for new keys and buffer indexes, from Tiago Cunha
2011-11-10 21:41:01 +00:00
Tiago Cunha
21128fea1e Sync OpenBSD patchset 976:
Option to change status line (message) background when using vi keys and
in command mode. From Ben Boeckel.
2011-11-10 21:40:17 +00:00
Nicholas Marriott
9f738dd2fe Fix a trivial copy-and-paste error (sx->sy), from Chris Johnsen. 2011-11-09 12:02:07 +00:00
Nicholas Marriott
693c106a1d Add. 2011-11-09 12:00:11 +00:00
Nicholas Marriott
6c1c304fc3 Missing bits for new keys and buffer indexes, from Tiago Cunha 2011-11-05 09:13:00 +00:00
Nicholas Marriott
e5bf63cb59 Option to change status line (message) background when using vi keys and
in command mode. From Ben Boeckel.
2011-11-05 09:06:31 +00:00
Tiago Cunha
046d8b096f Sync OpenBSD patchset 975:
minor formatting fix;
2011-10-31 13:56:55 +00:00
Tiago Cunha
0cbab892d5 Sync OpenBSD patchset 974:
Add screen*:XT to terminal-overrides for tmux-in-tmux, from Romain
Francoise.
2011-10-31 13:56:16 +00:00
Tiago Cunha
b44f78fe9f Sync OpenBSD patchset 973:
Missing -o on usage for pipe-pane, from Tiago Cunha.
2011-10-31 13:55:43 +00:00
Tiago Cunha
3f5ec24b5a Sync OpenBSD patchset 972:
Didn't really think the else behaviour through - requiring argv to
contain "else" is silly so just omit that, also some manpage
tweaks. From Tiago Cunha.
2011-10-31 13:55:10 +00:00
Tiago Cunha
d8d9c2af98 Sync OpenBSD patchset 971:
When copying, make repeat count indicate buffer to replace if used.
2011-10-31 13:54:28 +00:00
Jason McIntyre
e5d6df8979 minor formatting fix; 2011-10-27 23:33:35 +00:00
Nicholas Marriott
cf317412d9 Use pkg-config for libevent. 2011-10-27 23:00:45 +00:00
Nicholas Marriott
b2ee98b8d7 Add screen*:XT to terminal-overrides for tmux-in-tmux, from Romain
Francoise.
2011-10-27 22:54:06 +00:00
Nicholas Marriott
5213d9674b Add. 2011-10-27 22:43:02 +00:00
Nicholas Marriott
0ff42d975b Missing -o on usage for pipe-pane, from Tiago Cunha. 2011-10-27 22:41:03 +00:00
Nicholas Marriott
5ed3daf28b Didn't really think the else behaviour through - requiring argv to
contain "else" is silly so just omit that, also some manpage
tweaks. From Tiago Cunha.
2011-10-27 22:40:15 +00:00
Nicholas Marriott
f5a73c5433 When copying, make repeat count indicate buffer to replace if used. 2011-10-23 23:38:16 +00:00
Tiago Cunha
0e45ca1718 Recognise special keys and binds with multiple modifiers. From Bastien Dejean. 2011-10-23 15:42:15 +00:00
Tiago Cunha
c1eeac86fe Sync OpenBSD patchset 970:
Alias NPage/PPage as PageDown/PgDn/PageUp/PgUp to reduce occasional
confusion.
2011-10-23 15:11:09 +00:00
Tiago Cunha
03ee7f7edf Sync OpenBSD patchset 969:
Support for \e[3J to clear the history. Also send the corresponding
terminfo code (E3) before locking.
2011-10-23 15:10:22 +00:00
Tiago Cunha
a8ca1340ad Sync OpenBSD patchset 968:
Try to resolve relative paths for loadb and saveb (first using client
working directory if any then default-path or session wd).
2011-10-23 15:08:58 +00:00
Tiago Cunha
7d169a3679 Sync OpenBSD patchset 967:
For initial session, use size of command client even if detached.
2011-10-23 15:05:20 +00:00
Tiago Cunha
98e500f598 Sync OpenBSD patchset 966:
Ignore LC_ALL and LC_CTYPE if they are empty as well as unset.
2011-10-23 15:04:30 +00:00
Tiago Cunha
1c1797e4f2 Sync OpenBSD patchset 965:
Add client formats, from Ben Boeckel.
2011-10-23 15:03:50 +00:00
Tiago Cunha
653d1e2fc8 Sync OpenBSD patchset 964:
Plug a memory leak and update some comments, from Tiago Cunha.
2011-10-23 15:02:20 +00:00
Tiago Cunha
9b48c77493 Sync OpenBSD patchset 963:
Add an else clause for if-shell, from "arno-" on SourceForge.
2011-10-23 15:00:41 +00:00
Nicholas Marriott
96146a8c6f Done. 2011-10-23 10:21:02 +00:00
Nicholas Marriott
e3225bc4e3 Alias NPage/PPage as PageDown/PgDn/PageUp/PgUp to reduce occasional
confusion.
2011-10-23 10:19:26 +00:00
Nicholas Marriott
f0aad68aee Support for \e[3J to clear the history. Also send the corresponding
terminfo code (E3) before locking.
2011-10-23 10:16:14 +00:00
Nicholas Marriott
7d53e2c946 Done! 2011-10-23 08:36:19 +00:00
Nicholas Marriott
7ff4cf9405 Try to resolve relative paths for loadb and saveb (first using client
working directory if any then default-path or session wd).
2011-10-23 08:34:01 +00:00
Nicholas Marriott
179d0686d7 For initial session, use size of command client even if detached. 2011-10-23 08:10:11 +00:00
Nicholas Marriott
b32254acda Ignore LC_ALL and LC_CTYPE if they are empty as well as unset. 2011-10-23 08:03:27 +00:00
Nicholas Marriott
16d75a6bf2 Add client formats, from Ben Boeckel. 2011-10-23 01:12:46 +00:00
Nicholas Marriott
e63909655c Plug a memory leak and update some comments, from Tiago Cunha. 2011-10-23 00:49:25 +00:00
Nicholas Marriott
213deb5c66 +. 2011-10-23 00:43:58 +00:00
Nicholas Marriott
69c1521895 +. 2011-10-23 00:31:35 +00:00
Nicholas Marriott
6821ccc882 Add an else clause for if-shell, from "arno-" on SourceForge. 2011-10-18 08:57:01 +00:00
Nicholas Marriott
17e6dc4405 Add manpage, also spaces->tabs. 2011-10-10 20:17:17 +00:00
Nicholas Marriott
a7341715c1 Fix some warnings with newer autoconf, from Matt Curtis. 2011-10-06 12:14:22 +00:00
Tiago Cunha
521bf41d12 Sync OpenBSD patchset 962:
Add a few more formats for panes (tty, pid, start cmd/cwd).
2011-10-02 11:34:04 +00:00
Tiago Cunha
f0c3e9babe Sync OpenBSD patchset 961:
Add -S option to refresh-client to redraw status line, from Marco Beck.
2011-10-02 11:33:14 +00:00
Tiago Cunha
edd59d9e0f Sync OpenBSD patchset 960:
Reject $SHELL if it is not a full path.
2011-10-02 11:32:24 +00:00
Tiago Cunha
326c5bf1b4 Sync OpenBSD patchset 959:
Tweaks to the format parts, from Tiago Cunha.
2011-10-02 11:31:34 +00:00
Tiago Cunha
550906cb09 Sync OpenBSD patchset 958:
Fix typo: ) -> }.
2011-10-02 11:30:26 +00:00
Nicholas Marriott
175d82c95b Done. 2011-10-02 06:56:31 +00:00
Nicholas Marriott
49ef0b4af3 Add a few more formats for panes (tty, pid, start cmd/cwd). 2011-10-02 06:55:48 +00:00
Nicholas Marriott
3740f8f846 Add. 2011-10-02 06:44:16 +00:00
Nicholas Marriott
adfa5050d5 Add. 2011-10-02 06:33:32 +00:00
Nicholas Marriott
f62dcc1ea1 Separate dfly from fbsd as one or the other keeps becoming incompatible
;-). From Antonio Huete Jimenez
2011-09-29 08:43:01 +00:00
Nicholas Marriott
b1ed2d5bd9 Add -S option to refresh-client to redraw status line, from Marco Beck. 2011-09-28 20:11:21 +00:00
Nicholas Marriott
e6a59c4bee Reject $SHELL if it is not a full path. 2011-09-25 18:53:04 +00:00
Nicholas Marriott
d6dc4c30f4 +. 2011-09-25 18:45:15 +00:00
Nicholas Marriott
f14da260c8 Tweaks to the format parts, from Tiago Cunha. 2011-09-23 18:33:43 +00:00
Nicholas Marriott
d635d79042 The HAVE_DIRFD check should be for dirfd() not /proc/$$/fd. Doh. 2011-09-23 12:35:08 +00:00
Nicholas Marriott
b8ce435a54 +. 2011-09-23 12:34:31 +00:00
Nicholas Marriott
b6bd9515ea Fix typo: ) -> }. 2011-09-23 12:23:24 +00:00
Tiago Cunha
6e0c097d9f Sync OpenBSD patchset 957:
Mark dead panes with some text saying they are dead, suggested by and
with help from Randy Stauner.
2011-09-21 16:35:13 +00:00
Tiago Cunha
d9807eeba1 Sync OpenBSD patchset 956:
Another memory leak from Tiago Cunha.
2011-09-21 16:34:34 +00:00
Tiago Cunha
cb752f9938 Sync OpenBSD patchset 955:
Plug memory leak, from Tiago Cunha.
2011-09-21 16:34:04 +00:00
Tiago Cunha
2e98603db9 Sync OpenBSD patchset 954:
tweak previous;
2011-09-21 16:33:19 +00:00
Tiago Cunha
39628e8280 Add format.c to the list of sources. 2011-09-21 16:32:31 +00:00
Tiago Cunha
40af1a854c Sync OpenBSD patchset 953:
Add initial framework for more powerful formatting of command output and
use it for list-{panes,windows,sessions}. This allows more descriptive
replacements (such as #{session_name}) and conditionals.

Later this will be used for status_replace and list-keys and other
places.
2011-09-21 16:31:15 +00:00
Nicholas Marriott
fb5b958837 Add build instructions based on diff from Frank Terbeck. 2011-09-15 12:58:39 +00:00
Nicholas Marriott
99f78340af Use %u for process group on Sun OS. 2011-09-11 23:54:32 +00:00
Nicholas Marriott
5985143813 Mark dead panes with some text saying they are dead, suggested by and
with help from Randy Stauner.
2011-09-05 23:40:51 +00:00
Nicholas Marriott
9800eaa63f Another memory leak from Tiago Cunha. 2011-08-30 09:20:17 +00:00
Nicholas Marriott
423649b2c6 Plug memory leak, from Tiago Cunha. 2011-08-30 09:18:52 +00:00
Jason McIntyre
2888843a18 tweak previous; 2011-08-26 13:07:49 +00:00
Nicholas Marriott
4a5dff3f11 Add initial framework for more powerful formatting of command output and
use it for list-{panes,windows,sessions}. This allows more descriptive
replacements (such as #{session_name}) and conditionals.

Later this will be used for status_replace and list-keys and other
places.
2011-08-26 10:53:16 +00:00
Tiago Cunha
4a01da19df Sync OpenBSD patchset 951:
Support \ for line continuation in the configuration file, from Julius
Plenz.
2011-08-25 21:14:23 +00:00
Tiago Cunha
d390a90bf0 Sync OpenBSD patchset 950:
Add pane-base-index option, from Ben Barbour.
2011-08-25 21:13:45 +00:00
Tiago Cunha
c41a93d130 Sync OpenBSD patchset 949:
Add a tty_bell wrapper function, from Dylan Alex Simon.
2011-08-25 21:12:52 +00:00
Tiago Cunha
0a4fd0f7a4 libm isn't needed anymore. 2011-08-25 21:12:10 +00:00
Tiago Cunha
a54e670301 Sync OpenBSD patchset 948:
There is no need to use sqrt()/INFINITY here which simplifies the code
and makes it more portable, from Havard Eidnes.
2011-08-25 21:11:16 +00:00
Nicholas Marriott
4697b35d4f -lm is no longer needed, from Tiago Cunha. 2011-08-25 10:52:23 +00:00
Nicholas Marriott
0588168a64 Support \ for line continuation in the configuration file, from Julius
Plenz.
2011-08-24 10:46:01 +00:00
Nicholas Marriott
f01b7191a3 Add pane-base-index option, from Ben Barbour. 2011-08-24 10:29:57 +00:00
Nicholas Marriott
029c34ce6b Add a tty_bell wrapper function, from Dylan Alex Simon. 2011-08-24 09:58:44 +00:00
Nicholas Marriott
47d41d0203 There is no need to use sqrt()/INFINITY here which simplifies the code
and makes it more portable, from Havard Eidnes.
2011-08-22 10:14:15 +00:00
Tiago Cunha
2651c0d69c Sync OpenBSD patchset 947:
Fix a couple of memory leaks, from marcel partap.
2011-08-21 12:39:34 +00:00
Tiago Cunha
87a2a13f68 Sync OpenBSD patchset 946:
Add a -r flag to switch-client to toggle the client read-only flag. From
Johan Commelin.
2011-08-21 12:38:55 +00:00
Tiago Cunha
5775074f73 Sync OpenBSD patchset 945:
Add up/down/left/right keys in vi edit mode. From "livibetter" SF bug
3385651.
2011-08-21 12:37:26 +00:00
Tiago Cunha
abb4af7a14 Sync OpenBSD patchset 944:
Use key_bindings_remove for unbind-key -a to allow it to work from key
bindings. From "miaout17" SF bug 3392063.
2011-08-21 12:36:43 +00:00
Tiago Cunha
b9bbe1d81c Sync OpenBSD patchset 943:
Correctly skip existing numbers when generating the name for a new
session.
2011-08-21 12:35:47 +00:00
Nicholas Marriott
3657aa675e Fix a couple of memory leaks, from marcel partap. 2011-08-20 20:37:30 +00:00
Nicholas Marriott
88e9079870 Add a -r flag to switch-client to toggle the client read-only flag. From
Johan Commelin.
2011-08-16 10:00:52 +00:00
Nicholas Marriott
cd62411d78 +. 2011-08-16 09:58:49 +00:00
Nicholas Marriott
f95f792ddf Add up/down/left/right keys in vi edit mode. From "livibetter" SF bug
3385651.
2011-08-16 09:47:18 +00:00
Nicholas Marriott
2fc84c7c34 Use key_bindings_remove for unbind-key -a to allow it to work from key
bindings. From "miaout17" SF bug 3392063.
2011-08-16 09:37:48 +00:00
Nicholas Marriott
6b734d1074 Correctly skip existing numbers when generating the name for a new
session.
2011-08-16 09:36:23 +00:00
Nicholas Marriott
e39c5a9e14 +. 2011-08-15 09:01:23 +00:00
Nicholas Marriott
b2fe881307 +. 2011-08-14 15:36:15 +00:00
Tiago Cunha
b6659dc563 Sync OpenBSD patchset 942:
fix error in previous;
2011-08-04 17:06:10 +00:00
Tiago Cunha
3ce1b91b1b Sync OpenBSD patchset 941:
Extend the mode-mouse option to add a third choice which means the mouse
does not enter copy mode. Patch from SF bug 3374493.

In future the mode-mouse option is likely to die and be broken into
several smaller options.
2011-08-04 17:05:35 +00:00
Tiago Cunha
2589d117b0 Sync OpenBSD patchset 940:
Do not require a client here, or pipe-pane will not work from the
command line.
2011-08-04 17:04:08 +00:00
Tiago Cunha
8aec4c93eb $Id$ not $OpenBSD$. 2011-08-04 17:03:29 +00:00
Tiago Cunha
9960a06a67 Sync OpenBSD patchset 939:
Sort options alphabetically, from Tiago Cunha.
2011-08-04 17:01:55 +00:00
Jason McIntyre
cf90f2a29c fix error in previous; 2011-07-30 18:27:57 +00:00
Nicholas Marriott
cc5bcbfb59 Extend the mode-mouse option to add a third choice which means the mouse
does not enter copy mode. Patch from SF bug 3374493.

In future the mode-mouse option is likely to die and be broken into
several smaller options.
2011-07-30 18:01:26 +00:00
Nicholas Marriott
be179f6d7e Do not require a client here, or pipe-pane will not work from the
command line.
2011-07-30 17:52:32 +00:00
Nicholas Marriott
0ecb11fe4f Add. 2011-07-30 17:47:21 +00:00
Nicholas Marriott
7d604ab717 Add. 2011-07-30 17:44:24 +00:00
Nicholas Marriott
ee5e97926d Fix --enable-static and add a different check for b64_ntop that might work on
OS X.
2011-07-27 09:31:08 +00:00
Nicholas Marriott
0252796a57 Sort options alphabetically, from Tiago Cunha. 2011-07-25 09:57:28 +00:00
Nicholas Marriott
e9ebdac3dd Can't use the same va_list twice, from Emanuele Giaquinta. 2011-07-25 09:56:43 +00:00
Nicholas Marriott
5339b8ce3a Typo. 2011-07-22 15:10:24 +00:00
Nicholas Marriott
20134fa9f4 Compatibility for b64_ntop, missing from some alternative libc. 2011-07-22 10:49:33 +00:00
Nicholas Marriott
1f01dd8c0a +. 2011-07-19 01:47:26 +00:00
Nicholas Marriott
25eb48aea3 Only get -lrt when needed, from Pietro Cerutti. 2011-07-19 01:35:33 +00:00
Nicholas Marriott
e5cee89727 Typo, from Si Feng. 2011-07-19 01:31:00 +00:00
Tiago Cunha
d86c6b2fff Bump version and create a debug build by default. 2011-07-09 16:24:44 +00:00
Tiago Cunha
5175db270d Changes for 1.5. 2011-07-09 16:01:55 +00:00
Tiago Cunha
8d63a99390 Releases don't have debugging enabled. 2011-07-09 16:00:16 +00:00
Tiago Cunha
f16b6aeabb Use an empty CFLAGS by default to prevent autoconf from setting it when
debugging isn't enabled.
2011-07-09 15:57:56 +00:00
Tiago Cunha
df69ee07e2 Delete subversion directories before the actual tarball is created. 2011-07-09 13:45:24 +00:00
Tiago Cunha
31def00f59 Done. 2011-07-09 09:47:12 +00:00
Tiago Cunha
27bd09f075 HP-UX should work now. 2011-07-09 09:46:15 +00:00
Tiago Cunha
391f1f08c0 Expand the Id keyword. 2011-07-09 09:42:33 +00:00
Tiago Cunha
8357a55d76 Add missing $Id$. 2011-07-09 09:34:04 +00:00
Tiago Cunha
5f38f8cd64 Sync OpenBSD patchset 938:
Unused variable.
2011-07-09 09:05:05 +00:00
Nicholas Marriott
5ae4b4acc0 Pass the right size to calloc (* not **). 2011-07-09 01:38:01 +00:00
Nicholas Marriott
7e423ea491 Unused variable. 2011-07-09 01:37:00 +00:00
Nicholas Marriott
9dacc1700b Pass the right size to calloc (* not **). 2011-07-09 01:36:42 +00:00
Tiago Cunha
67e70770c8 Sync OpenBSD patchset 936:
Do not continue to send data to suspended/locked clients or there will
be a huge rush of it after they are resumed/unlocked. The main output
path was fine but status line updates and the terminal state reset code
were missed.
2011-07-08 22:58:30 +00:00
Nicholas Marriott
d5269a2eed Do not continue to send data to suspended/locked clients or there will
be a huge rush of it after they are resumed/unlocked. The main output
path was fine but status line updates and the terminal state reset code
were missed.
2011-07-08 21:51:40 +00:00
Tiago Cunha
bcacbb1a89 Sync OpenBSD patchset 935:
flags[] should be initialized. From Thomas Adam.
2011-07-08 16:44:06 +00:00
Nicholas Marriott
a8e9654b65 flags[] should be initialized. From Thomas Adam. 2011-07-08 15:18:20 +00:00
Tiago Cunha
bba822105b Sync OpenBSD patchset 934:
Make confirm-before prompt customizable with -p option like
command-prompt. Also move responsibility for calling status_replace into
status_prompt_{set,update} and add #W and #P to the default kill-window
and kill-pane prompts. By Tiago Cunha.
2011-07-08 08:42:03 +00:00
Tiago Cunha
dc2c174496 Sync OpenBSD patchset 933:
Fix a couple of comments.
2011-07-08 08:40:35 +00:00
Nicholas Marriott
2de9b1e005 Make confirm-before prompt customizable with -p option like
command-prompt. Also move responsibility for calling status_replace into
status_prompt_{set,update} and add #W and #P to the default kill-window
and kill-pane prompts. By Tiago Cunha.
2011-07-08 06:37:57 +00:00
Nicholas Marriott
b4b3d9c936 Fix a couple of comments. 2011-07-08 06:28:05 +00:00
Tiago Cunha
6c4166ce20 Sync OpenBSD patchset 932:
Show full targets for lsp/lsw -a.
2011-07-05 10:43:59 +00:00
Tiago Cunha
5dad3166f9 Sync OpenBSD patchset 931:
Use screen_reinit for respawn-pane to keep history and call input_init
for respawn-window to break out of waiting for DCS/OSC to finish.
2011-07-05 10:42:09 +00:00
Nicholas Marriott
e80e7b38bb Done too. 2011-07-04 14:04:55 +00:00
Nicholas Marriott
26aa0689a5 Show full targets for lsp/lsw -a. 2011-07-04 14:04:40 +00:00
Nicholas Marriott
6457052a93 Done too. 2011-07-04 13:54:43 +00:00
Nicholas Marriott
d91bf78e8a These are done. 2011-07-04 13:36:12 +00:00
Nicholas Marriott
a70379d8f9 Use screen_reinit for respawn-pane to keep history and call input_init
for respawn-window to break out of waiting for DCS/OSC to finish.
2011-07-04 13:35:37 +00:00
Tiago Cunha
bc8d09ef84 Sync OpenBSD patchset 930:
Change the list-keys format so that it shows the keys using actual tmux
commands which should be able to be directly copied into the config
file. From Markus Schnalke, tweaked by me.
2011-07-04 08:26:41 +00:00
Tiago Cunha
8144e5cb7e Sync OpenBSD patchset 929:
Add an option to trigger the terminal bell when there is an alert, from
Marco Beck.
2011-07-04 08:23:39 +00:00
Tiago Cunha
fce026eb32 Sync OpenBSD patchset 928:
Include the existing window and session name in the prompt when renaming
and add a new key binding ($) for rename session. From Tiago Cunha.
2011-07-04 08:22:37 +00:00
Nicholas Marriott
5e90476b25 Change the list-keys format so that it shows the keys using actual tmux
commands which should be able to be directly copied into the config
file. From Markus Schnalke, tweaked by me.
2011-07-04 00:31:57 +00:00
Tiago Cunha
e097f0b4ee Sync OpenBSD patchset 927:
Allow the initial context on prompts to be set with the new -I option to
command-prompt. From Tiago Cunha.
2011-07-03 21:52:50 +00:00
Tiago Cunha
ff7343c203 Sync OpenBSD patchset 926:
PANE_FREEZE doesn't do anything anymore, so remove it.
2011-07-03 21:51:17 +00:00
Tiago Cunha
3d47b5cd07 Sync OpenBSD patchset 925:
Add a couple of extra xterm-style keys that gnome terminal provides,
from Dustin Kirkland.
2011-07-03 21:50:27 +00:00
Nicholas Marriott
f12158bc25 Add an option to trigger the terminal bell when there is an alert, from
Marco Beck.
2011-07-03 19:07:54 +00:00
Nicholas Marriott
94f86edfee Include the existing window and session name in the prompt when renaming
and add a new key binding ($) for rename session. From Tiago Cunha.
2011-07-03 18:18:15 +00:00
Nicholas Marriott
ad60a2c952 Allow the initial context on prompts to be set with the new -I option to
command-prompt. From Tiago Cunha.
2011-07-02 21:05:44 +00:00
Nicholas Marriott
6ce5ed60a6 +. 2011-06-27 23:04:44 +00:00
Nicholas Marriott
1202284f37 PANE_FREEZE doesn't do anything anymore, so remove it. 2011-06-27 00:04:49 +00:00
Nicholas Marriott
c80f75f4f4 tparm requires 10 arguments on Solaris. 2011-06-26 23:59:23 +00:00
Nicholas Marriott
4564624f2c +. 2011-06-26 23:18:05 +00:00
Nicholas Marriott
84aa9c34f8 trunk/tmux not tmux/tmux 2011-06-24 13:13:21 +00:00
Nicholas Marriott
db7d3a3966 Tweaks, one thing I have an uncommitted fix for. 2011-06-23 23:27:07 +00:00
Nicholas Marriott
f513898e92 PatchSet 924
Date: 2011/06/05 12:19:03
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Add a respawn-pane command, from Marcel Partap.
2011-06-23 19:23:12 +00:00
Nicholas Marriott
7407459ed1 Removed file. 2011-06-23 19:22:01 +00:00
Nicholas Marriott
fa0f10d77a PatchSet 923
Date: 2011/06/05 11:53:05
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Get rid of the layout string code which tries to walk through the layout
hierarchy and instead just look at what panes are actually in the window.
2011-06-23 19:21:26 +00:00
Nicholas Marriott
ddade84e0a PatchSet 922
Date: 2011/05/30 22:02:28
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Fix a typo, spotted by Michal Mazurek..
2011-06-23 19:19:08 +00:00
Nicholas Marriott
0503f83c64 Add a couple of extra xterm-style keys that gnome terminal provides,
from Dustin Kirkland.
2011-06-23 10:02:49 +00:00
Nicholas Marriott
65177b82be Add a respawn-pane command, from Marcel Partap. 2011-06-05 11:19:03 +00:00
Nicholas Marriott
1cf916ca73 Add. 2011-06-05 11:03:10 +00:00
Nicholas Marriott
2b60c648c4 Get rid of the layout string code which tries to walk through the layout
hierarchy and instead just look at what panes are actually in the window.
2011-06-05 10:53:05 +00:00
Nicholas Marriott
12544ccd41 Add. 2011-06-05 10:29:33 +00:00
Nicholas Marriott
dac6e55e0a Add. 2011-06-05 10:21:32 +00:00
Nicholas Marriott
f537870909 Fix a typo, spotted by Michal Mazurek.. 2011-05-30 21:02:28 +00:00
Tiago Cunha
213544a30a $Id$ not $OpenBSD$. 2011-05-29 15:13:36 +00:00
Tiago Cunha
159faa4ed7 Sync OpenBSD patchset 921:
Trim another useless if statement, from Ailin Nemui.
2011-05-26 20:18:06 +00:00
Tiago Cunha
f9cb06cf2c Sync OpenBSD patchset 920:
Memory leak in error path, from Tiago Cunha.
2011-05-26 20:16:17 +00:00
Tiago Cunha
28427efbac Sync OpenBSD patchset 819:
Nuke a redundant if statement, from Tiago Cunha.
2011-05-26 20:12:07 +00:00
Nicholas Marriott
e14bf9bb8f One of these gives us b64_ntop. 2011-05-26 10:35:07 +00:00
Nicholas Marriott
34e5ec1807 Trim another useless if statement, from Ailin Nemui. 2011-05-26 07:08:48 +00:00
Nicholas Marriott
d0f362a503 Add. 2011-05-26 07:00:48 +00:00
Nicholas Marriott
480e48aa66 Memory leak in error path, from Tiago Cunha. 2011-05-25 17:51:31 +00:00
Nicholas Marriott
70d232289b Nuke a redundant if statement, from Tiago Cunha. 2011-05-25 17:50:52 +00:00
Nicholas Marriott
ea6844b5b7 Bye bye stray tmux directory. 2011-05-23 17:58:45 +00:00
Nicholas Marriott
def72b2985 ... 2011-05-22 20:58:40 +00:00
Nicholas Marriott
a0b271a8a0 ... 2011-05-22 20:58:29 +00:00
Nicholas Marriott
7a529cc32a ... 2011-05-22 20:56:56 +00:00
Nicholas Marriott
f89d0c3c2c ... 2011-05-22 20:55:40 +00:00
Nicholas Marriott
4bf85ecbb0 ... 2011-05-22 20:53:55 +00:00
Nicholas Marriott
cae34a8ce7 . 2011-05-22 20:48:57 +00:00
Nicholas Marriott
07377d5a97 Update links. 2011-05-22 20:30:21 +00:00
Tiago Cunha
b5b630229a Sync OpenBSD patchset 918:
tweak the TERMINFO section; ok nicm
2011-05-22 16:26:58 +00:00
Tiago Cunha
d256660a78 Sync OpenBSD patchset 917:
Pass prompts through status_replace so that they can be more helpful
(such as showing the previous session name when renaming). From Tiago
Cunha.
2011-05-22 16:26:38 +00:00
Tiago Cunha
b2f301f4e2 Sync OpenBSD patchset 916:
Support DECSCUSR sequence to set the cursor style with two new
terminfo(5) extensions, Cs and Csr. Written by Ailin Nemui.
2011-05-22 16:26:09 +00:00
Tiago Cunha
719755574d Sync OpenBSD patchset 915:
Support xterm(1) cursor colour change sequences through terminfo(5) Cc
(set) and Cr (reset) extensions. Originally by Sean Estabrooks, tweaked
by me and Ailin Nemui.
2011-05-22 16:25:02 +00:00
Tiago Cunha
89f35125b4 Sync OpenBSD patchset 914:
Support setting the xterm clipboard when copying from copy mode using
the xterm escape sequence for the purpose (if xterm is configured to
allow it).

Written by and much discussed Ailin Nemui, guidance on
xterm/termcap/terminfo from Thomas Dickey.
2011-05-22 16:23:07 +00:00
Nicholas Marriott
e7f3be9187 Someone mentioned this at LinuxTag as well. 2011-05-21 11:22:47 +00:00
Jason McIntyre
240cae4c92 tweak the TERMINFO section; ok nicm 2011-05-21 10:04:17 +00:00
Nicholas Marriott
1af2021de6 Pass prompts through status_replace so that they can be more helpful
(such as showing the previous session name when renaming). From Tiago
Cunha.
2011-05-20 19:29:13 +00:00
Nicholas Marriott
3ea5e06bfb Support DECSCUSR sequence to set the cursor style with two new
terminfo(5) extensions, Cs and Csr. Written by Ailin Nemui.
2011-05-20 19:17:39 +00:00
Nicholas Marriott
944b5e6fa0 Support xterm(1) cursor colour change sequences through terminfo(5) Cc
(set) and Cr (reset) extensions. Originally by Sean Estabrooks, tweaked
by me and Ailin Nemui.
2011-05-20 19:03:58 +00:00
Nicholas Marriott
0cad8a5808 Add. 2011-05-18 20:39:24 +00:00
Tiago Cunha
69e0aabcdf Sync OpenBSD patchset 913:
Add three new copy-mode commands - select-line, copy-line,
copy-end-of-line. From Dave Disser and Randy Stauner a while back.
2011-05-18 20:35:36 +00:00
Tiago Cunha
3cb428bc7e Sync OpenBSD patchset 912:
Use xfree not free, from Tiago Cunha.
2011-05-18 20:33:55 +00:00
Tiago Cunha
e0fcd3b247 Sync OpenBSD patchset 911:
Use button mouse mode not any for copy mode, fixes issues with
putty. From Ailin Nemui.
2011-05-18 20:33:24 +00:00
Tiago Cunha
21140d426d Sync OpenBSD patchset 910:
Reset last pane properly when using break-pane as well, fixes a problem
reported to Debian by Hannes von Haugwitz (bug 622677).
2011-05-18 20:32:47 +00:00
Tiago Cunha
13d5ac6f9e Sync OpenBSD patchset 909:
Reset last pane on swap-pane across windows, fixes crash noticed by hsim
at gmx.li.
2011-05-18 20:32:04 +00:00
Tiago Cunha
1e7cea407d Sync OpenBSD patchset 908:
Only select pane on click, not drag. From hsim at gmx.li.
2011-05-18 20:31:32 +00:00
Tiago Cunha
bb38112ec8 Sync OpenBSD patchset 907:
Fix a couple of memory leaks, from Tiago Cunha.
2011-05-18 20:31:00 +00:00
Tiago Cunha
1d2b487c84 Sync OpenBSD patchset 906:
Fix a memory leak if cmd_pane_session succeeds, from Tiago Cunha.
2011-05-18 20:30:36 +00:00
Tiago Cunha
4efd45628d Sync OpenBSD patchset 905:
Add a new option, mouse-resize-pane. When on, panes may be resized by
dragging their borders. From hsim at gmx.li.
2011-05-18 20:30:14 +00:00
Tiago Cunha
4fcbf4b872 Sync OpenBSD patchset 904:
Use the tsl and fsl terminfo(5) capabilities to update terminal title
and automatically fill them in on terminals with the XT capability
(which means their title setting is xterm-compatible). From hsim at
gmx.li.
2011-05-18 20:28:43 +00:00
Nicholas Marriott
96e7f33da3 Support setting the xterm clipboard when copying from copy mode using
the xterm escape sequence for the purpose (if xterm is configured to
allow it).

Written by and much discussed Ailin Nemui, guidance on
xterm/termcap/terminfo from Thomas Dickey.
2011-05-18 20:24:29 +00:00
Nicholas Marriott
046e8363b4 +. 2011-05-18 19:52:33 +00:00
Nicholas Marriott
58908fd8c5 Add three new copy-mode commands - select-line, copy-line,
copy-end-of-line. From Dave Disser and Randy Stauner a while back.
2011-05-18 18:06:36 +00:00
Nicholas Marriott
992dbdedd8 +. 2011-05-18 17:57:59 +00:00
Nicholas Marriott
d344816d91 Update from Tiago Resende. 2011-05-18 17:47:33 +00:00
Nicholas Marriott
f702dbfea2 Use xfree not free, from Tiago Cunha. 2011-05-18 08:07:44 +00:00
Nicholas Marriott
fb527c1bad Use button mouse mode not any for copy mode, fixes issues with
putty. From Ailin Nemui.
2011-05-18 08:04:47 +00:00
Nicholas Marriott
75e7c7eed5 Add some stuff mentioned to me at LinuxTag. 2011-05-17 18:20:04 +00:00
Nicholas Marriott
4b6babcfa2 +. 2011-05-10 22:05:04 +00:00
Nicholas Marriott
ec3efab01e Reset last pane properly when using break-pane as well, fixes a problem
reported to Debian by Hannes von Haugwitz (bug 622677).
2011-05-08 21:30:00 +00:00
Nicholas Marriott
583c885d68 Reset last pane on swap-pane across windows, fixes crash noticed by hsim
at gmx.li.
2011-05-08 21:12:52 +00:00
Nicholas Marriott
acfabf3a50 Only select pane on click, not drag. From hsim at gmx.li. 2011-05-08 20:45:35 +00:00
Nicholas Marriott
538af37c35 Fix a couple of memory leaks, from Tiago Cunha. 2011-05-08 20:37:04 +00:00
Nicholas Marriott
6f08472049 Fix a memory leak if cmd_pane_session succeeds, from Tiago Cunha. 2011-05-08 20:35:58 +00:00
Nicholas Marriott
f3741f0653 Add a new option, mouse-resize-pane. When on, panes may be resized by
dragging their borders. From hsim at gmx.li.
2011-05-08 20:34:12 +00:00
Nicholas Marriott
295ace6820 Use the tsl and fsl terminfo(5) capabilities to update terminal title
and automatically fill them in on terminals with the XT capability
(which means their title setting is xterm-compatible). From hsim at
gmx.li.
2011-05-08 19:53:06 +00:00
Tiago Cunha
268a2efb16 Sync OpenBSD patchset 903:
Change window with mouse wheel over status line if mouse-select-window
is on, from marcel partap.
2011-05-05 10:12:33 +00:00
Tiago Cunha
b5812013ef Sync OpenBSD patchset 901:
Don't use strnvis for the title as it breaks UTF-8. set-titles is now
off by default and we have to trust the terminal can understand what we
send it anyway so there isn't any harm.
2011-05-05 10:10:57 +00:00
Tiago Cunha
a734b41fda Sync OpenBSD patchset 900:
Check if mouse-select-pane is ON not off when setting mouse flags,
reported by oga.
2011-05-05 10:03:05 +00:00
Tiago Cunha
4846af8f95 Sync OpenBSD patchset 899:
Only redraw the status line on command update, not the entire client
(big DOH).
2011-05-05 10:02:36 +00:00
Nicholas Marriott
b0a88ebead Change window with mouse wheel over status line if mouse-select-window
is on, from marcel partap.
2011-05-04 18:10:28 +00:00
Nicholas Marriott
a70df70d20 Don't need vis.h anymore. 2011-05-04 17:43:35 +00:00
Nicholas Marriott
b1dfc740a3 Don't use strnvis for the title as it breaks UTF-8. set-titles is now
off by default and we have to trust the terminal can understand what we
send it anyway so there isn't any harm.
2011-05-04 17:43:11 +00:00
Nicholas Marriott
7dddf56c08 Check if mouse-select-pane is ON not off when setting mouse flags,
reported by oga.
2011-05-04 17:40:32 +00:00
Nicholas Marriott
075816eb72 Only redraw the status line on command update, not the entire client
(big DOH).
2011-04-29 07:07:31 +00:00
Tiago Cunha
341f67e827 Sync OpenBSD patchset 898:
Provide #h for short hostname (no domain) from Michal Mazurek.
2011-04-25 20:35:22 +00:00
Tiago Cunha
38611d3207 Sync OpenBSD patchset 897:
Tweak copy behaviour slightly in vi mode to be closer to real vi. From
Tiago Resende.
2011-04-25 20:34:26 +00:00
Tiago Cunha
215ee46106 Sync OpenBSD patchset 896:
When mode-mouse is on (it is off by default), automatically enter copy
mode when the mouse is dragged or the mouse wheel is used. Also exit
copy mode when the mouse wheel is scrolled off the bottom. Discussed
with and written by hsim at gmx dot li.
2011-04-25 20:33:42 +00:00
Tiago Cunha
d5150484d1 Sync OpenBSD patchset 895:
POSIX only guarantees uname() will return a non-negative value on
success.

ok nicm@
2011-04-25 20:32:03 +00:00
Nicholas Marriott
eb288aae32 Provide #h for short hostname (no domain) from Michal Mazurek. 2011-04-24 21:32:07 +00:00
Nicholas Marriott
dc8fb9fb23 Tweak copy behaviour slightly in vi mode to be closer to real vi. From
Tiago Resende.
2011-04-24 21:06:12 +00:00
Nicholas Marriott
8738141913 When mode-mouse is on (it is off by default), automatically enter copy
mode when the mouse is dragged or the mouse wheel is used. Also exit
copy mode when the mouse wheel is scrolled off the bottom. Discussed
with and written by hsim at gmx dot li.
2011-04-19 21:31:33 +00:00
Nicholas Marriott
656a668473 Add. 2011-04-19 20:21:42 +00:00
Matthew Dempsky
3970853feb POSIX only guarantees uname() will return a non-negative value on
success.

ok nicm@
2011-04-19 20:12:47 +00:00
Nicholas Marriott
7aafee7e48 |PatchSet 894
|Date: 2011/04/18 21:57:16
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|The mouse should only work in copy mode if mode-mouse is set, not just
|mouse-select-pane.
2011-04-18 22:03:55 +00:00
Nicholas Marriott
dc6bd98425 |PatchSet 893
|Date: 2011/04/18 20:49:05
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Add an option (mouse-select-window) which allows the mouse to be used by
|clicking on the status line, written by hsim at gmx dot li.
2011-04-18 21:07:58 +00:00
Nicholas Marriott
34a331aa99 |PatchSet 891
|Date: 2011/04/17 20:28:09
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Add -t to list-clients, based on a diff from Zac Sprackett.
2011-04-18 21:07:12 +00:00
Nicholas Marriott
6351940744 |PatchSet 890
|Date: 2011/04/17 20:21:19
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Fix character position check, from Tiago Resende.
2011-04-18 21:06:49 +00:00
Nicholas Marriott
65fc8ef43a |PatchSet 889
|Date: 2011/04/11 17:44:36
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|-s comes before -t and also add -s to command syntax. Prompted by jmc.
2011-04-18 21:06:25 +00:00
Nicholas Marriott
d5ab166307 Sync man page. 2011-04-18 21:05:24 +00:00
Nicholas Marriott
a6456f4db3 PatchSet 887
Date: 2011/04/10 04:20:59
Author: guenther
Branch: HEAD
Tag: (none)
Log:
Switch back from KERN_PROC2/kinfo_proc2 to KERN_PROC/kinfo_proc now
that we've got name we want for the API we want
2011-04-18 21:03:42 +00:00
Nicholas Marriott
dd34cc012a |PatchSet 886
|Date: 2011/04/09 21:00:29
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Since buffers are now global, bump the default buffer-limit a bit higher
|to 20 rather than 9.
2011-04-18 21:01:44 +00:00
Nicholas Marriott
0f97ac4221 The mouse should only work in copy mode if mode-mouse is set, not just
mouse-select-pane.
2011-04-18 20:57:16 +00:00
Nicholas Marriott
0bb2119781 Add an option (mouse-select-window) which allows the mouse to be used by
clicking on the status line, written by hsim at gmx dot li.
2011-04-18 19:49:05 +00:00
Jason McIntyre
4e75e82cc3 new sentence, new line; 2011-04-17 20:39:44 +00:00
Nicholas Marriott
2c0846569d Window content backup script from Victor J Orlikowski. 2011-04-17 19:36:35 +00:00
Nicholas Marriott
f4432030ee Add -t to list-clients, based on a diff from Zac Sprackett. 2011-04-17 19:28:09 +00:00
Nicholas Marriott
044c0f978f Fix character position check, from Tiago Resende. 2011-04-17 19:21:19 +00:00
Nicholas Marriott
afbbdff581 Add tmuxinator. 2011-04-15 22:10:20 +00:00
Nicholas Marriott
cb60ea1bdb Add some third party stuff. 2011-04-15 21:56:38 +00:00
Nicholas Marriott
3aee28c58b +. 2011-04-15 19:01:51 +00:00
Nicholas Marriott
088232e0e0 Add. 2011-04-12 16:58:49 +00:00
Nicholas Marriott
5e5acbeccd a independent -> an independent. 2011-04-11 22:59:57 +00:00
Nicholas Marriott
3dc7b805d3 -s comes before -t and also add -s to command syntax. Prompted by jmc. 2011-04-11 16:44:36 +00:00
Nicholas Marriott
f0843d2173 Entry on italics from Tiago Resende. 2011-04-11 07:14:54 +00:00
Nicholas Marriott
457147d59d Add -s option to detach all clients attached to a session, from Zac
Sprackett.
2011-04-11 06:44:56 +00:00
Nicholas Marriott
735f87bc66 Add -s option to detach all clients attached to a session, from Zac
Sprackett.
2011-04-11 06:44:39 +00:00
Philip Guenther
98d450ac3a Switch back from KERN_PROC2/kinfo_proc2 to KERN_PROC/kinfo_proc now
that we've got name we want for the API we want

"ZAP!" deraadt@
2011-04-10 03:20:59 +00:00
Nicholas Marriott
48a1169f4e Since buffers are now global, bump the default buffer-limit a bit higher
to 20 rather than 9.
2011-04-09 20:00:29 +00:00
Nicholas Marriott
75f218dc73 If the terminal supports sitm for italics, use it instead of standout
(smso). From Tiago Resende.
2011-04-09 07:48:58 +00:00
Nicholas Marriott
0a09d04e1b If the terminal supports sitm for italics, use it instead of standout
(smso). From Tiago Resende.
2011-04-09 07:48:08 +00:00
Nicholas Marriott
1d00f88757 Manual date. 2011-04-06 22:31:23 +00:00
Nicholas Marriott
e5f4bf3f3e |PatchSet 884
|Date: 2011/04/06 22:51:31
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Change so that an empty session name always means the current sessions
|even if given with, for example, -t '', and explicitly forbid empty
|session names and those containing a : when they are created.
2011-04-06 22:29:26 +00:00
Nicholas Marriott
13c54a04a0 |PatchSet 883
|Date: 2011/04/06 12:36:26
|Author: miod
|Branch: HEAD
|Tag: (none)
|Log:
|Avoid using NULL in non-pointer contexts: use 0 for integer values and '\0'
|for chars.
2011-04-06 22:24:20 +00:00
Nicholas Marriott
4e452a2e11 |PatchSet 882
|Date: 2011/04/05 20:37:01
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Add a flag to cmd_find_session so that attach-session can prefer
|unattached sessions when choosing the most recently used (if -t is not
|given). Suggested by claudio@.
2011-04-06 22:24:01 +00:00
Nicholas Marriott
ae5954d30a |PatchSet 881
|Date: 2011/04/05 19:55:38
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Bind C-u to delete-line in vi mode like ksh does, suggested by thib.
2011-04-06 22:23:30 +00:00
Nicholas Marriott
01f5f041d3 |PatchSet 880
|Date: 2011/04/01 17:59:11
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|"or" should be on a line on its own here so it is not emphasised as
|well.
2011-04-06 22:23:14 +00:00
Nicholas Marriott
d9cb059e34 |PatchSet 879
|Date: 2011/03/29 22:09:13
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|For convenience, work out what type of option is being set by name
|regardless of the -s or -w flags (these remain documented however).
2011-04-06 22:22:49 +00:00
Nicholas Marriott
ec3be580ec |PatchSet 878
|Date: 2011/03/29 22:07:08
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Checking for particular options and redrawing is not necessary as we
|already redraw unconditionally.
2011-04-06 22:22:25 +00:00
Nicholas Marriott
02462e5e57 |PatchSet 877
|Date: 2011/03/29 21:31:22
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Update an out-of-date and inaccurate comment.
2011-04-06 22:21:24 +00:00
Nicholas Marriott
ffce6b34b2 |PatchSet 876
|Date: 2011/03/29 20:30:16
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Change -t on display-message to be target-pane for the #[A-Z]
|replacements and add -c as target-client.
2011-04-06 22:21:02 +00:00
Nicholas Marriott
108fb38cbc |PatchSet 875
|Date: 2011/03/29 00:13:00
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Add -a and -s options to lsp to list all panes in the server or session
|respectively. Likewise add -s to lsw. From Ben Boeckel.
2011-04-06 22:20:16 +00:00
Nicholas Marriott
0a2b3492c3 |PatchSet 874
|Date: 2011/03/28 21:17:39
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Allow a start and end line to be specified for capture-pane which may be
|negative to capture part of the history. Prompted by request from Victor
|J Orlikowski.
2011-04-06 22:19:42 +00:00
Nicholas Marriott
8ab7fcf7eb |PatchSet 873
|Date: 2011/03/28 20:44:31
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Style: uint -> u_int and a missing else.
2011-04-06 22:18:56 +00:00
Nicholas Marriott
129f0dc893 |PatchSet 872
|Date: 2011/03/27 21:36:19
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Set the terminal blocking again earlier, before sending the reset
|sequences.
2011-04-06 22:18:05 +00:00
Nicholas Marriott
2b508f7f6b |PatchSet 871
|Date: 2011/03/27 21:31:25
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|Don't include meta twice when working out the flags to output for
|xterm-style keys - bit 3 is accepted on input but not on output. Also a
|style nit in the header.
2011-04-06 22:17:33 +00:00
Nicholas Marriott
536fc24653 PatchSet 870
Date: 2011/03/27 21:27:26
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Give each pane created in a tmux server a unique id (starting from 0),
put it in the TMUX_PANE environment variable and accept it as a
target. Suggested by and with testing and tweaks from Ben Boeckel.
2011-04-06 22:16:33 +00:00
Nicholas Marriott
ec89eb9552 Change so that an empty session name always means the current sessions
even if given with, for example, -t '', and explicitly forbid empty
session names and those containing a : when they are created.
2011-04-06 21:51:31 +00:00
Nicholas Marriott
95832241aa Add a couple of items. 2011-04-06 20:52:04 +00:00
Miod Vallat
c8a14def9f Avoid using NULL in non-pointer contexts: use 0 for integer values and '\0'
for chars.
2011-04-06 11:36:26 +00:00
Nicholas Marriott
5d519ba526 Add a flag to cmd_find_session so that attach-session can prefer
unattached sessions when choosing the most recently used (if -t is not
given). Suggested by claudio@.
2011-04-05 19:37:01 +00:00
Nicholas Marriott
f16ea60cc0 Bind C-u to delete-line in vi mode like ksh does, suggested by thib. 2011-04-05 18:55:38 +00:00
Nicholas Marriott
f8a218882a "or" should be on a line on its own here so it is not emphasised as
well.
2011-04-01 16:59:11 +00:00
Nicholas Marriott
f7e9aedf10 For convenience, work out what type of option is being set by name
regardless of the -s or -w flags (these remain documented however).
2011-03-29 21:09:13 +00:00
Nicholas Marriott
beb6db9b5f Checking for particular options and redrawing is not necessary as we
already redraw unconditionally.
2011-03-29 21:07:08 +00:00
Nicholas Marriott
25d551e8b2 Update an out-of-date and inaccurate comment. 2011-03-29 20:31:22 +00:00
Nicholas Marriott
d88c20e718 Change -t on display-message to be target-pane for the #[A-Z]
replacements and add -c as target-client.
2011-03-29 19:30:16 +00:00
Nicholas Marriott
f19a4bf9d1 Add -a and -s options to lsp to list all panes in the server or session
respectively. Likewise add -s to lsw. From Ben Boeckel.
2011-03-28 23:13:00 +00:00
Nicholas Marriott
82e0165c49 Allow a start and end line to be specified for capture-pane which may be
negative to capture part of the history. Prompted by request from Victor
J Orlikowski.
2011-03-28 20:17:39 +00:00
Nicholas Marriott
8091dcdd97 Add. 2011-03-28 20:14:30 +00:00
Nicholas Marriott
fa6abac98d Style: uint -> u_int and a missing else. 2011-03-28 19:44:31 +00:00
Nicholas Marriott
f8dbfb0aa7 Add. 2011-03-28 18:59:37 +00:00
Nicholas Marriott
b9216d9566 Done. 2011-03-27 21:02:27 +00:00
Nicholas Marriott
71e8e26ccc Set the terminal blocking again earlier, before sending the reset
sequences.
2011-03-27 20:36:19 +00:00
Nicholas Marriott
7ce8fee4f3 Don't include meta twice when working out the flags to output for
xterm-style keys - bit 3 is accepted on input but not on output. Also a
style nit in the header.
2011-03-27 20:31:25 +00:00
Nicholas Marriott
808502ac3d Give each pane created in a tmux server a unique id (starting from 0),
put it in the TMUX_PANE environment variable and accept it as a
target. Suggested by and with testing and tweaks from Ben Boeckel.
2011-03-27 20:27:26 +00:00
Nicholas Marriott
d74e5bffba Fix to properly wrap wide characters, from Micah Cowan. 2011-03-26 19:07:33 +00:00
Micah Cowan
a9eb5e12ec Fix to properly wrap wide characters. 2011-03-24 17:03:29 +00:00
Tiago Cunha
164c2cbcb0 Sync OpenBSD patchset 868:
Fix an incorrect test which was always true (oupper is always < olower),
from Yusuke ENDOH.
2011-03-19 23:32:01 +00:00
Tiago Cunha
20e17604b5 Sync OpenBSD patchset 867:
Prevent tiled producing a corrupt layout when only one column is needed,
from Karl Ferdinand Ebert.
2011-03-19 23:31:08 +00:00
Tiago Cunha
a0295b4c2f Sync OpenBSD patchset 866:
Support passing through escape sequences to the underlying terminal by
using DCS with a "tmux;" prefix. Escape characters in the sequences must
be doubled. For example:

$ printf '\033Ptmux;\033\033]12;red\007\033\\'

Will pass \033]12;red\007 to the terminal (and change the cursor colour
in xterm). From Kevin Goodsell.
2011-03-19 23:30:37 +00:00
Tiago Cunha
9bc44043a4 Sync OpenBSD patchset 864:
Fix a typo that meant we did not reset the background colour when it was
omitted in a 256-colour SGR ([48;5m). From Yusuke ENDOH.
2011-03-19 23:28:30 +00:00
Tiago Cunha
d0cca3924e Sync OpenBSD patchset 863:
Add a -P option to detach to HUP the client's parent process (usually
causing it to exit as well).
2011-03-19 23:27:35 +00:00
Nicholas Marriott
54456d5602 Fix an incorrect test which was always true (oupper is always < olower),
from Yusuke ENDOH.
2011-03-08 19:23:49 +00:00
Nicholas Marriott
0a404aabd3 Prevent tiled producing a corrupt layout when only one column is needed,
from Karl Ferdinand Ebert.
2011-03-07 23:55:16 +00:00
Nicholas Marriott
79e30daeae Support passing through escape sequences to the underlying terminal by
using DCS with a "tmux;" prefix. Escape characters in the sequences must
be doubled. For example:

$ printf '\033Ptmux;\033\033]12;red\007\033\\'

Will pass \033]12;red\007 to the terminal (and change the cursor colour
in xterm). From Kevin Goodsell.
2011-03-07 23:46:27 +00:00
Nicholas Marriott
34bb013b92 Use the right asprintf since we don't support truly broken platforms right now. 2011-03-04 23:39:41 +00:00
Nicholas Marriott
d5ed5fb08f Two fixes by Micah Cowan: make mouse work properly beyond >127 on signed
char architectures and properly parse $TMUX by stopping the socket path
at the first comma.
2011-03-04 23:26:44 +00:00
Micah Cowan
4cb976b408 Fix sscanf that was guaranteed to always fail. 2011-03-04 23:13:56 +00:00
Micah Cowan
c0888f3fd1 Make sure non-UTF8 mouse coordinates are kept to 8-bit values. 2011-03-04 20:36:59 +00:00
Nicholas Marriott
c36f67a288 Fix a typo that meant we did not reset the background colour when it was
omitted in a 256-colour SGR ([48;5m). From Yusuke ENDOH.
2011-03-03 08:53:14 +00:00
Nicholas Marriott
7954126dcd Add a -P option to detach to HUP the client's parent process (usually
causing it to exit as well).
2011-03-03 08:51:47 +00:00
Nicholas Marriott
9def6baaba +. 2011-02-28 21:10:33 +00:00
Tiago Cunha
c7624fd25d Sync OpenBSD patchset 862:
Size on split-window is -l not -s. Doh.
2011-02-15 15:26:54 +00:00
Tiago Cunha
32de1d52ea Sync OpenBSD patchset 861:
Don't require -d with -x or -y since it could be in the config file.
2011-02-15 15:25:48 +00:00
Tiago Cunha
677286bc0e Sync OpenBSD patchset 860:
Redraw pane borders when switching to last pane.
2011-02-15 15:25:12 +00:00
Tiago Cunha
19e81ffda5 Sync OpenBSD patchset 859:
Free old argument even if setting to NULL.
2011-02-15 15:24:40 +00:00
Tiago Cunha
d718a14bd0 Sync OpenBSD patchset 858:
Accept tcgetattr/tcsetattr failure, fixes problems with fatal() if the
terminal disappears while locked.
2011-02-15 15:24:00 +00:00
Tiago Cunha
04ce5cc2d1 Sync OpenBSD patchset 857:
Use input_clear to reset the APC, DCS, OSC state or it could be reused
improperly by a later state. From Kevin Goodsell.
2011-02-15 15:21:14 +00:00
Tiago Cunha
065384056b Sync OpenBSD patchset 856:
Unused declaration.
2011-02-15 15:20:38 +00:00
Tiago Cunha
3d7b8105e1 Sync OpenBSD patchset 855:
Simplify the way jobs work and drop the persist type, so all jobs are
fire-and-forget.

Status jobs now managed with two trees of output (new and old), rather
than storing the output in the jobs themselves. When the status line is
processed any jobs which don't appear in the new tree are started and
the output from the old tree displayed. When a job finishes it updates
the new tree with its output and that is used for any subsequent
redraws. When the status interval expires, the new tree is moved to the
old so that all jobs are run again.

This fixes the "#(echo %H:%M:%S)" problem which would lead to thousands
of identical persistent jobs and high memory use (this can still be
achieved by adding "sleep 30" but that is much less likely to happen by
accident).
2011-02-15 15:20:03 +00:00
Tiago Cunha
3b56ebce6d Sync OpenBSD patchset 854:
Use LIST_* not SLIST_*.
2011-02-15 15:12:28 +00:00
Tiago Cunha
2ab568fa88 Sync OpenBSD patchset 853:
When clearing the entire screen, clear lines that are used into the
history like xterm does. Requested ages ago by someone I've forgotten.
2011-02-15 15:10:47 +00:00
Tiago Cunha
4e4568cade Sync OpenBSD patchset 852:
Check if the index is in use and fail before creating the child process,
rather than leaving a stray child on failure.
2011-02-15 15:09:52 +00:00
Tiago Cunha
d0d1c0e486 Sync OpenBSD patchset 848:
Set $TMUX without the session when background jobs are run.
2011-02-14 23:11:33 +00:00
Nicholas Marriott
d37650dc4f Spacing. 2011-02-14 20:39:40 +00:00
Nicholas Marriott
cf3b73167d Expand an entry. 2011-02-12 15:51:11 +00:00
Nicholas Marriott
5532615bc0 Solaris is SunOS. 2011-02-11 23:31:15 +00:00
Nicholas Marriott
ce91520e12 Size on split-window is -l not -s. Doh. 2011-02-10 12:12:14 +00:00
Nicholas Marriott
8ec3e5725c Don't require -d with -x or -y since it could be in the config file. 2011-02-03 20:50:03 +00:00
Nicholas Marriott
7462c03281 Redraw pane borders when switching to last pane. 2011-01-31 20:54:42 +00:00
Nicholas Marriott
567741caf5 Free old argument even if setting to NULL. 2011-01-30 12:09:30 +00:00
Nicholas Marriott
9fc2c34a3b Accept tcgetattr/tcsetattr failure, fixes problems with fatal() if the
terminal disappears while locked.
2011-01-29 08:39:43 +00:00
Nicholas Marriott
b6bb350289 Use input_clear to reset the APC, DCS, OSC state or it could be reused
improperly by a later state. From Kevin Goodsell.
2011-01-28 20:39:22 +00:00
Nicholas Marriott
bcc7c689c1 Unused declaration. 2011-01-26 02:55:34 +00:00
Nicholas Marriott
0fa8d18775 Remove some that are done and some that are duplicates or no longer needed. 2011-01-26 02:05:02 +00:00
Nicholas Marriott
db7a89b1ee Simplify the way jobs work and drop the persist type, so all jobs are
fire-and-forget.

Status jobs now managed with two trees of output (new and old), rather
than storing the output in the jobs themselves. When the status line is
processed any jobs which don't appear in the new tree are started and
the output from the old tree displayed. When a job finishes it updates
the new tree with its output and that is used for any subsequent
redraws. When the status interval expires, the new tree is moved to the
old so that all jobs are run again.

This fixes the "#(echo %H:%M:%S)" problem which would lead to thousands
of identical persistent jobs and high memory use (this can still be
achieved by adding "sleep 30" but that is much less likely to happen by
accident).
2011-01-26 01:54:56 +00:00
Nicholas Marriott
4dfb29fa38 Use LIST_* not SLIST_*. 2011-01-26 00:11:47 +00:00
Nicholas Marriott
ecc22c521d When clearing the entire screen, clear lines that are used into the
history like xterm does. Requested ages ago by someone I've forgotten.
2011-01-25 23:40:26 +00:00
Nicholas Marriott
1270f8fed8 Check if the index is in use and fail before creating the child process,
rather than leaving a stray child on failure.
2011-01-25 22:31:50 +00:00
Nicholas Marriott
5cbdd84686 While here, maximum percentage is 100 not INT_MAX. Oops. 2011-01-23 15:49:32 +00:00
Nicholas Marriott
1df3355438 While here, maximum percentage is 100 not INT_MAX. Oops. 2011-01-23 15:49:10 +00:00
Nicholas Marriott
2be75a0129 Size is -l not -s. 2011-01-23 15:47:31 +00:00
Nicholas Marriott
8820aa9f65 Size is -l not -s. 2011-01-23 15:46:49 +00:00
Nicholas Marriott
3872e24847 Allow top-bit-set characters to be used for key bindings, from Tiago
Cunha.
2011-01-23 11:04:25 +00:00
Nicholas Marriott
b8023044c3 Set $TMUX without the session when background jobs are run. 2011-01-23 11:03:43 +00:00
Tiago Cunha
ec3a764c76 Make bind-key accept characters with the top-bit-set and print them as octal. 2011-01-22 22:31:09 +00:00
Tiago Cunha
e3defd9b25 Sync OpenBSD patchset 847:
Fix bind-key -t.
2011-01-22 00:00:23 +00:00
Tiago Cunha
1930181b18 Sync OpenBSD patchset 846:
Only set a mouse mode for mouse-select-pane if none already set by the
mode (any will do).
2011-01-21 23:56:53 +00:00
Tiago Cunha
332bfbf273 Sync OpenBSD patchset 845:
Mouse highlight mode (1001) requires a program to cooperate so
supporting it through tmux is not as easy as this, remove it for now.
2011-01-21 23:56:11 +00:00
Tiago Cunha
7a68cff1db Sync OpenBSD patchset 844:
Support -x and -y for new-session to specify the initial size of the
window if created detached with -d.
2011-01-21 23:55:26 +00:00
Tiago Cunha
6d9fe6c3aa Sync OpenBSD patchset 843:
The maximum history-limit was accidentally reduced, fix it back to INT_MAX.
2011-01-21 23:54:19 +00:00
Tiago Cunha
c2ed0186de Sync OpenBSD patchset 842:
Clarify alternate-screen description a little.
2011-01-21 23:53:45 +00:00
Tiago Cunha
3866988f87 Sync OpenBSD patchset 841:
Er, fix next and previous session functions to actually work, part 2.
2011-01-21 23:53:01 +00:00
Tiago Cunha
43f8d62f6a Sync OpenBSD patchset 840:
Fix next and previous session functions to actually work.
2011-01-21 23:52:36 +00:00
Tiago Cunha
a880639f48 Sync OpenBSD patchset 839:
Log termios backspace for each client since it is used to recognise
backspace input.
2011-01-21 23:51:36 +00:00
Tiago Cunha
57eb948c48 Sync OpenBSD patchset 838:
Use TMPDIR if set, from Han Boetes.
2011-01-21 23:46:50 +00:00
Tiago Cunha
6c3186a19a Sync OpenBSD patchset 837:
unbind-key -a is allowed no arguments.
2011-01-21 23:46:09 +00:00
Tiago Cunha
10a5a2175e Sync OpenBSD patchset 836:
Remove a bit of text that makes exit-unattached description unclear.
2011-01-21 23:45:34 +00:00
Tiago Cunha
be7cec5640 Sync OpenBSD patchset 835:
Add missing arguments to some options.
2011-01-21 23:45:04 +00:00
Tiago Cunha
492e3aa437 Sync OpenBSD patchset 834:
Move all calls to fcntl(...O_NONBLOCK) into a function and clear the
flag on the stdio file descriptors before closing them (fixes things
like "tmux ls && cat").
2011-01-21 23:44:13 +00:00
Tiago Cunha
6b19621112 Sync OpenBSD patchset 833:
Accept colours of the hex form #ffffff and translate to the nearest from
the xterm(1) 256-colour set.
2011-01-21 23:42:14 +00:00
Tiago Cunha
324ffe20e9 Link with libm due to the upcoming patchset. 2011-01-21 23:40:30 +00:00
Nicholas Marriott
38f169113e Support for HP-UX. 2011-01-21 20:35:20 +00:00
Nicholas Marriott
e34c6fd187 Only have one asprintf implementation, that's likely to always work. 2011-01-21 20:03:18 +00:00
Nicholas Marriott
1377427e70 Fix bind-key -t. 2011-01-15 20:14:41 +00:00
Nicholas Marriott
3de1700f61 Only set a mouse mode for mouse-select-pane if none already set by the
mode (any will do).
2011-01-15 00:46:19 +00:00
Nicholas Marriott
8f8e81c0c9 Mouse highlight mode (1001) requires a program to cooperate so
supporting it through tmux is not as easy as this, remove it for now.
2011-01-15 00:16:00 +00:00
Nicholas Marriott
4f34e25dd8 Support -x and -y for new-session to specify the initial size of the
window if created detached with -d.
2011-01-14 23:49:23 +00:00
Nicholas Marriott
ac01c2025a Whoops, did not mean to do this. 2011-01-13 19:59:48 +00:00
Nicholas Marriott
e08a40be56 osdep-linux.c 2011-01-13 19:58:47 +00:00
Nicholas Marriott
9ad9e8c5dd The maximum history-limit was accidentally reduced, fix it back to INT_MAX. 2011-01-13 13:38:57 +00:00
Nicholas Marriott
fa4a75cdab Clarify alternate-screen description a little. 2011-01-13 09:50:11 +00:00
Nicholas Marriott
2d82567070 Er, fix next and previous session functions to actually work, part 2. 2011-01-13 02:08:14 +00:00
Nicholas Marriott
588ebb5393 Fix next and previous session functions to actually work. 2011-01-13 02:07:06 +00:00
Nicholas Marriott
96ab50a701 Log termios backspace for each client since it is used to recognise
backspace input.
2011-01-13 00:54:32 +00:00
Nicholas Marriott
b3438c86bf Use TMPDIR if set, from Han Boetes. 2011-01-12 22:23:58 +00:00
Nicholas Marriott
abd1f615b2 Trim spaces. 2011-01-10 22:45:10 +00:00
Nicholas Marriott
a7b6445cc3 Better __progname check. 2011-01-10 22:12:31 +00:00
Nicholas Marriott
96fe3b26c1 Copy osdep-unknown.c for AIX to make @PLATFORM@ work. 2011-01-10 22:00:47 +00:00
Nicholas Marriott
93fd9cc29d Check for optarg, optind, optreset. 2011-01-10 21:51:56 +00:00
Nicholas Marriott
47e18f4cea unbind-key -a is allowed no arguments. 2011-01-10 21:28:47 +00:00
Nicholas Marriott
87841b4f91 +. 2011-01-09 18:57:05 +00:00
Nicholas Marriott
17f1cd5be8 Remove a bit of text that makes exit-unattached description unclear. 2011-01-09 18:46:46 +00:00
Nicholas Marriott
c3041eb9f0 Add missing arguments to some options. 2011-01-09 18:42:19 +00:00
Nicholas Marriott
69cb1f830e Move all calls to fcntl(...O_NONBLOCK) into a function and clear the
flag on the stdio file descriptors before closing them (fixes things
like "tmux ls && cat").
2011-01-08 01:52:36 +00:00
Nicholas Marriott
703160b5d6 Accept colours of the hex form #ffffff and translate to the nearest from
the xterm(1) 256-colour set.
2011-01-08 00:48:54 +00:00
Nicholas Marriott
676c62647c +. 2011-01-07 19:01:19 +00:00
Tiago Cunha
30f6d9b167 Sync OpenBSD patchset 813:
Add a function to create window flags rather than doing the same thing
in two places. From Thomas Adam.
2011-01-07 16:55:40 +00:00
Tiago Cunha
1cb579d0fd Bring the last remaining bits of dist.mk. 2011-01-07 15:09:04 +00:00
Tiago Cunha
3d4ebeb1b0 Sync OpenBSD patchset 832:
Whoops, command-prompt can take 0 or 1 argument.
2011-01-07 15:04:51 +00:00
Tiago Cunha
0fc4353fb3 Remove dead files entries. 2011-01-07 15:04:24 +00:00
Tiago Cunha
ca413cf270 Sync OpenBSD patchset 831:
Now that parsing is common, merge some of the small, related commands
together to use the same code.

Also add some arguments (such as -n and -p) to some commands to match
existing commands.
2011-01-07 15:02:38 +00:00
Tiago Cunha
b2b5d88f3f Sync OpenBSD patchset 830:
argc will be 1 not 2 with no option value.
2011-01-07 14:51:54 +00:00
Tiago Cunha
ecec113b63 cmd-generic.c isn't needed anymore due to OpenBSD patchset 829. 2011-01-07 14:50:54 +00:00
Tiago Cunha
0740d3dbb8 Remove compat include. 2011-01-07 14:46:57 +00:00
Tiago Cunha
9301eeb4dd More _SOURCES. 2011-01-07 14:46:13 +00:00
Tiago Cunha
1df427bc7b Sync OpenBSD patchset 829:
Clean up and simplify tmux command argument parsing.

Originally, tmux commands were parsed in the client process into a
struct with the command data which was then serialised and sent to the
server to be executed. The parsing was later moved into the server (an
argv was sent from the client), but the parse step and intermediate
struct was kept.

This change removes that struct and the separate parse step. Argument
parsing and printing is now common to all commands (in arguments.c) with
each command left with just an optional check function (to validate the
arguments at parse time), the exec function and a function to set up any
key bindings (renamed from the old init function).

This is overall more simple and consistent.

There should be no changes to any commands behaviour or syntax although
as this touches every command please watch for any unexpected changes.
2011-01-07 14:45:34 +00:00
Tiago Cunha
219442cff7 Sync OpenBSD patchset 828:
Support for UTF-8 mouse input (\033[1005h). This was added in xterm 262
and supports larger terminals than the older way.

If the new mouse-utf8 option is on, UTF-8 mouse input is enabled for all
UTF-8 terminals. The option defaults to on if LANG etc are set in the
same manner as the utf8 option.

With help and based on code from hsim at gmx.li.
2011-01-07 14:34:45 +00:00
Tiago Cunha
3aaf5b9b1e Sync OpenBSD patchset 827:
Handle a # at the end of a replacement string (such as status-left)
correctly. Found by Thomas Adam.
2011-01-07 14:32:26 +00:00
Nicholas Marriott
b463d3de54 Missing HAVE_STDINT_H. 2011-01-07 00:35:13 +00:00
Nicholas Marriott
64f02dab7c Whoops, command-prompt can take 0 or 1 argument. 2011-01-05 22:38:28 +00:00
Nicholas Marriott
f705c0e013 Whoops, bad copy and paste. 2011-01-04 09:48:10 +00:00
Nicholas Marriott
11dcbd7556 Support --enable-static. 2011-01-04 09:43:14 +00:00
Nicholas Marriott
96c37fa80a Now that parsing is common, merge some of the small, related commands
together to use the same code.

Also add some arguments (such as -n and -p) to some commands to match
existing commands.
2011-01-04 02:03:41 +00:00
Nicholas Marriott
55346b0d10 argc will be 1 not 2 with no option value. 2011-01-04 01:58:12 +00:00
Nicholas Marriott
7502cb3adb Clean up and simplify tmux command argument parsing.
Originally, tmux commands were parsed in the client process into a
struct with the command data which was then serialised and sent to the
server to be executed. The parsing was later moved into the server (an
argv was sent from the client), but the parse step and intermediate
struct was kept.

This change removes that struct and the separate parse step. Argument
parsing and printing is now common to all commands (in arguments.c) with
each command left with just an optional check function (to validate the
arguments at parse time), the exec function and a function to set up any
key bindings (renamed from the old init function).

This is overall more simple and consistent.

There should be no changes to any commands behaviour or syntax although
as this touches every command please watch for any unexpected changes.
2011-01-04 00:42:46 +00:00
Tiago Cunha
03ec2482c9 libevent-2 works now as well. 2011-01-03 23:58:10 +00:00
Tiago Cunha
a2387330ce Zap paths.h include. 2011-01-03 23:55:30 +00:00
Tiago Cunha
3689640b4e Update _SOURCES. 2011-01-03 23:54:51 +00:00
Tiago Cunha
36c7c7537a Sync OpenBSD patchset 826:
Move the user-visible parts of all options (names, types, limit, default
values) together into one set of tables in options-table.c. Also clean
up and simplify cmd-set-options.c and move a common print function into
option-table.c.
2011-01-03 23:52:38 +00:00
Nicholas Marriott
2bdae526ad More indentation tweaking. 2011-01-03 23:43:35 +00:00
Nicholas Marriott
69f6b23945 Include all osdep-*.c in dist. 2011-01-03 23:40:21 +00:00
Nicholas Marriott
ac3b78a841 Support for UTF-8 mouse input (\033[1005h). This was added in xterm 262
and supports larger terminals than the older way.

If the new mouse-utf8 option is on, UTF-8 mouse input is enabled for all
UTF-8 terminals. The option defaults to on if LANG etc are set in the
same manner as the utf8 option.

With help and based on code from hsim at gmx.li.
2011-01-03 23:35:21 +00:00
Tiago Cunha
a0e7facee6 Sync OpenBSD patchset 825:
suspend-client has used -t for the client target (like everything else)
for ages, fix the usage string and man page and trim some leftover code.
2011-01-03 23:33:12 +00:00
Tiago Cunha
a24b67fc5a Sync OpenBSD patchset 824:
Last few tables that should be const.
2011-01-03 23:32:04 +00:00
Tiago Cunha
521247bedb Sync OpenBSD patchset 823:
Sprinkle a little more const.
2011-01-03 23:31:26 +00:00
Tiago Cunha
9ad028e8ee Sync OpenBSD patchset 822:
Another table that should be const.
2011-01-03 23:30:43 +00:00
Tiago Cunha
d9c848d3a6 Sync OpenBSD patchset 821:
Key table should be const.
2011-01-03 23:29:49 +00:00
Tiago Cunha
66fb24c3a5 Sync OpenBSD patchset 820:
Add a -P option to new-window and split-window to print the new window
or pane index in target form (useful to pass it into other commands).
2011-01-03 23:29:09 +00:00
Tiago Cunha
d3c04b74ec Sync OpenBSD patchset 819:
Don't reset the activity timer for unattached sessions every second,
this screws up the choice of most-recently-used. Instead, break the time
update into a little function and do it when the session is attached.

Pointed out by joshe@.
2011-01-03 23:27:54 +00:00
Tiago Cunha
09ef2c9f40 Sync OpenBSD patchset 818:
Remove unused variable.
2011-01-03 23:26:14 +00:00
Nicholas Marriott
5158dd9a8d Handle a # at the end of a replacement string (such as status-left)
correctly. Found by Thomas Adam.
2011-01-03 21:30:49 +00:00
Nicholas Marriott
edc298d0a1 Wrap long line differently. 2011-01-02 15:49:31 +00:00
Nicholas Marriott
703baa8769 Fail if no libevent or curses, from Thomas Adam. 2011-01-02 15:45:43 +00:00
Nicholas Marriott
3e8124009f Move the user-visible parts of all options (names, types, limit, default
values) together into one set of tables in options-table.c. Also clean
up and simplify cmd-set-options.c and move a common print function into
option-table.c.
2011-01-01 16:51:21 +00:00
Nicholas Marriott
0d77e5e959 Make version more prominent. 2011-01-01 13:39:19 +00:00
Nicholas Marriott
c120d09a5e libevent 2 works now as well. 2011-01-01 13:34:57 +00:00
Nicholas Marriott
a4515ce138 suspend-client has used -t for the client target (like everything else)
for ages, fix the usage string and man page and trim some leftover code.
2011-01-01 11:24:45 +00:00
Nicholas Marriott
3a0d40b84d Add. 2011-01-01 05:09:11 +00:00
Nicholas Marriott
234211a6f6 Add. 2011-01-01 05:01:54 +00:00
Nicholas Marriott
f833b885a1 Last few tables that should be const. 2011-01-01 03:43:20 +00:00
Nicholas Marriott
67ee86085c Sprinkle a little more const. 2011-01-01 03:39:21 +00:00
Nicholas Marriott
5d0cfe079b Another table that should be const. 2011-01-01 03:32:28 +00:00
Nicholas Marriott
1c86713afd Key table should be const. 2011-01-01 02:16:25 +00:00
Nicholas Marriott
7ecbc18d5d Also done. 2011-01-01 02:00:50 +00:00
Nicholas Marriott
dc7fb15251 Remove some done or duplicates, reorder. 2011-01-01 01:59:03 +00:00
Nicholas Marriott
b6950ed8aa Add a -P option to new-window and split-window to print the new window
or pane index in target form (useful to pass it into other commands).
2011-01-01 01:33:07 +00:00
Nicholas Marriott
04b32fa734 Don't reset the activity timer for unattached sessions every second,
this screws up the choice of most-recently-used. Instead, break the time
update into a little function and do it when the session is attached.

Pointed out by joshe@.
2011-01-01 01:12:09 +00:00
Nicholas Marriott
91218f8714 Remove unused variable. 2011-01-01 00:44:24 +00:00
Nicholas Marriott
ce79d6081f And moar. 2010-12-31 22:33:44 +00:00
Nicholas Marriott
d5a63c21b4 Make indentation better. 2010-12-31 22:31:45 +00:00
Nicholas Marriott
b066ad0fd8 Default enable-debug to on in CVS (can be changed for releases). 2010-12-31 22:18:35 +00:00
Nicholas Marriott
620b59e843 RCS $Id$. 2010-12-31 22:13:48 +00:00
Nicholas Marriott
f71b3054cd Switch tmux to use autoconf and automake.
Although they suck, they suck less than the alternatives.
2010-12-31 22:12:33 +00:00
Tiago Cunha
60dd440082 Sync OpenBSD patchset 817:
fix trailing whitespace;
2010-12-31 02:00:30 +00:00
Tiago Cunha
f72f21951c Sync OpenBSD patchset 816:
Remove some unused defines.
2010-12-31 01:59:47 +00:00
Tiago Cunha
67b333ec84 Sync OpenBSD patchset 815:
Fix BUFFERS section now they are global.
2010-12-31 01:58:27 +00:00
Nicholas Marriott
b9f36cc226 +. 2010-12-31 01:39:50 +00:00
Jason McIntyre
1a1efd5bc9 fix trailing whitespace; 2010-12-31 00:41:11 +00:00
Nicholas Marriott
4fb1045f5a Remove some unused defines. 2010-12-30 23:20:13 +00:00
Nicholas Marriott
2b3c2fd852 Fix BUFFERS section now they are global. 2010-12-30 23:17:41 +00:00
Nicholas Marriott
cc42614fa9 Change from a per-session stack of buffers to one global stack which is
much more convenient and also simplifies lot of code. This renders
copy-buffer useless and makes buffer-limit now a server option.

By Tiago Cunha.
2010-12-30 23:16:18 +00:00
Tiago Cunha
bbf44d6ff3 Done. 2010-12-30 23:15:34 +00:00
Tiago Cunha
9ebee6aef8 Global paste buffers instead of per-session which renders copy-buffer useless.
As a consequence buffer-limit is now a server option.
2010-12-30 22:39:49 +00:00
Tiago Cunha
095e1b410a Sync OpenBSD patchset 812:
Support all four of the xterm mouse modes. Based on a diff from hsim at
gmx.li.
2010-12-30 22:27:38 +00:00
Tiago Cunha
210b4553a5 Sync OpenBSD patchset 811:
Allow the config file parser and source-file to return "don't exit" to
the client to let attach work from configuration files.
2010-12-30 22:26:07 +00:00
Nicholas Marriott
2231e72968 Add a function to create window flags rather than doing the same thing
in two places. From Thomas Adam.
2010-12-30 21:35:17 +00:00
Nicholas Marriott
e0ad1e5706 Stray blank line. 2010-12-30 20:42:39 +00:00
Nicholas Marriott
436f3b357e epoll on Linux is broken with /dev/null so it needs to be disabled.
Instead of adding another BROKEN_* define, move event_init into
osdep-*.c.
2010-12-30 20:41:08 +00:00
Nicholas Marriott
f7c42c21ba Support all four of the xterm mouse modes. Based on a diff from hsim at
gmx.li.
2010-12-29 21:49:06 +00:00
Nicholas Marriott
230e39ec35 Allow the config file parser and source-file to return "don't exit" to
the client to let attach work from configuration files.
2010-12-29 21:28:32 +00:00
Tiago Cunha
ba89a048ed Working on 1.5. 2010-12-27 22:13:35 +00:00
Tiago Cunha
dcef4f8084 Major changes since the previous version. 2010-12-27 21:37:42 +00:00
Tiago Cunha
030d284006 No point in talking about this here when it's already covered by other files. 2010-12-27 21:36:37 +00:00
Tiago Cunha
1b037f74f4 Bump VERSION and comment FDEBUG. 2010-12-27 21:32:16 +00:00
Tiago Cunha
750e6ad542 usage output should fit on a 80 column display. 2010-12-27 21:22:24 +00:00
Tiago Cunha
5f72510edf Sync OpenBSD patchset 810:
tweak previous;
2010-12-27 21:17:25 +00:00
Tiago Cunha
5d86284a1a Sync OpenBSD patchset 809:
Add a missing .Pp and sort options alphabetically, from Tiago Cunha.
2010-12-27 21:13:59 +00:00
Jason McIntyre
efa8c93664 tweak previous; 2010-12-27 19:57:31 +00:00
Nicholas Marriott
3e0bc052e1 Add a missing .Pp and sort options alphabetically, from Tiago Cunha. 2010-12-27 18:22:25 +00:00
Tiago Cunha
3cd9ea1789 Sync OpenBSD patchset 808:
server_kill_window can modify the RB tree so don't use RB_FOREACH, fixes
crash seen by Dan Harnett.
2010-12-25 23:44:37 +00:00
Tiago Cunha
3585feca54 Sync OpenBSD patchset 807:
Style tweaks.
2010-12-25 23:43:53 +00:00
Nicholas Marriott
d3d25365f1 server_kill_window can modify the RB tree so don't use RB_FOREACH, fixes
crash seen by Dan Harnett.
2010-12-23 21:56:38 +00:00
Nicholas Marriott
6fd2b5b87f Style tweaks. 2010-12-23 20:18:39 +00:00
Tiago Cunha
a373235106 Sync OpenBSD patchset 806:
Store sessions in an RB tree by name rather than a list, this is tidier
and allows them to easily be shown sorted in various lists
(list-sessions/choose-sessions).

Keep a session index which is used in a couple of places internally but
make it an ever-increasing number rather than filling in gaps with new
sessions.
2010-12-22 15:36:44 +00:00
Tiago Cunha
9f3399da00 Sync OpenBSD patchset 805:
Fix another stray addition that was too early. Oops.
2010-12-22 15:33:14 +00:00
Tiago Cunha
c05a47ad0d Sync OpenBSD patchset 804:
Undo a change to next/previous session that got mixed in prematurely.
2010-12-22 15:32:40 +00:00
Tiago Cunha
a932742a8a Sync OpenBSD patchset 803:
Dead sessions are never on the active sessions list, so the SESSION_DEAD
flag is effectively unused. Remove it.
2010-12-22 15:31:56 +00:00
Tiago Cunha
bb728b89a7 Sync OpenBSD patchset 802:
Use pointer rather than index for the client's last session.
2010-12-22 15:31:00 +00:00
Tiago Cunha
64d16cf2d6 Sync OpenBSD patchset 801:
Unify the way sessions are used by callbacks - store the address and use
the reference count, then check it is still on the global sessions list
in the callback.
2010-12-22 15:28:51 +00:00
Tiago Cunha
b8eae3902b Sync OpenBSD patchset 800:
Don't nuke the index counter when a session group comes up.
2010-12-22 15:25:07 +00:00
Tiago Cunha
d1bdc9a161 Sync OpenBSD patchset 799:
Add other-pane-height and other-pane-width options, allowing the width
or height of the smaller panes in the main-horizontal and main-vertical
layouts to be set. Mostly from David Goodlad.
2010-12-22 15:23:59 +00:00
Nicholas Marriott
acf13ce978 Store sessions in an RB tree by name rather than a list, this is tidier
and allows them to easily be shown sorted in various lists
(list-sessions/choose-sessions).

Keep a session index which is used in a couple of places internally but
make it an ever-increasing number rather than filling in gaps with new
sessions.
2010-12-21 22:37:59 +00:00
Nicholas Marriott
1b8488ee75 Fix another stray addition that was too early. Oops. 2010-12-20 01:28:18 +00:00
Nicholas Marriott
6fcdc714b6 Undo a change to next/previous session that got mixed in prematurely. 2010-12-20 00:43:24 +00:00
Nicholas Marriott
8705c6b435 Dead sessions are never on the active sessions list, so the SESSION_DEAD
flag is effectively unused. Remove it.
2010-12-20 00:19:20 +00:00
Nicholas Marriott
9358cfaf4a Use pointer rather than index for the client's last session. 2010-12-20 00:17:22 +00:00
Nicholas Marriott
a51dcdc430 Unify the way sessions are used by callbacks - store the address and use
the reference count, then check it is still on the global sessions list
in the callback.
2010-12-20 00:03:55 +00:00
Nicholas Marriott
c65d4220f0 Don't nuke the index counter when a session group comes up. 2010-12-19 22:35:54 +00:00
Nicholas Marriott
c198664d15 Add other-pane-height and other-pane-width options, allowing the width
or height of the smaller panes in the main-horizontal and main-vertical
layouts to be set. Mostly from David Goodlad.
2010-12-19 18:35:08 +00:00
Nicholas Marriott
cd92f44686 "So you have screwed up your /dev/null?" From Mathias Gumz. 2010-12-15 23:31:30 +00:00
Nicholas Marriott
206ae727f9 Read ${X} environment variables in strings and $HOME from the global
environment rather than getenv, this allows them to be updated during
the configuration file.
2010-12-13 22:53:56 +00:00
Nicholas Marriott
8715247a43 Read ${X} environment variables in strings and $HOME from the global
environment rather than getenv, this allows them to be updated during
the configuration file.
2010-12-13 22:53:14 +00:00
Nicholas Marriott
5fcd6711e4 Track the last session for a client and add a flag to switch-client and
a key binding (L) to move a client back to its last session.
2010-12-11 18:42:20 +00:00
Nicholas Marriott
51487ed22f Track the last session for a client and add a flag to switch-client and
a key binding (L) to move a client back to its last session.
2010-12-11 18:39:25 +00:00
Nicholas Marriott
d227a2e661 Remove a bunch of stuff that is done a few that aren't going to happen
and remove the priority list for now.
2010-12-11 18:06:42 +00:00
Nicholas Marriott
0b8ce56d73 Fix rectangle copy to behave like emacs - the cursor is not part of the
selection on the right edge but on the left it is.
2010-12-11 17:57:28 +00:00
Nicholas Marriott
20ed20ea1e Fix rectangle copy to behave like emacs - the cursor is not part of the
selection on the right edge but on the left it is.
2010-12-11 17:56:01 +00:00
Nicholas Marriott
095ffe9cd1 Make the prompt history global for all clients which is much more useful
than per-client history.
2010-12-11 16:15:02 +00:00
Nicholas Marriott
9802fea615 Oops, these functions return a const char *, so make the local variable
const as well.
2010-12-11 16:13:15 +00:00
Nicholas Marriott
7ce77ffc9c Make the prompt history global for all clients which is much more useful than per-client history. 2010-12-11 16:05:57 +00:00
Nicholas Marriott
1a4d78c7af -V to report version, SF issue 3038862. 2010-12-10 21:19:13 +00:00
Nicholas Marriott
286fef9b4d Rephrase a confusing sentence. 2010-12-10 21:05:22 +00:00
Nicholas Marriott
6be32c89c5 Rephrase a confusing sentence. 2010-12-10 21:01:38 +00:00
Nicholas Marriott
1f18523565 In the built-in layouts, distribute the panes more evenly. Set the
default value of main-pane-width to 80, rather than 81. By Micah Cowan.
2010-12-08 19:57:03 +00:00
Nicholas Marriott
1891f1ce99 Some do still need -lrt. 2010-12-08 19:55:31 +00:00
Micah Cowan
3ab25ac5b5 In the built-in layouts, distribute the panes more evenly.
Set the default value of main-pane-width to 80, rather than 81.
2010-12-07 20:23:21 +00:00
Nicholas Marriott
3a4f765a51 Add an option to alert (monitor) for silence (lack of activity) in a
window. From Thomas Adam.
2010-12-06 22:52:21 +00:00
Nicholas Marriott
e26a351865 Add an option to alert (monitor) for silence (lack of activity) in a
window. From Thomas Adam.
2010-12-06 22:51:02 +00:00
Nicholas Marriott
d0adcbc98a PatchSet 790
Date: 2010/11/29 19:45:58
Author: nicm
Branch: HEAD
Tag: (none)
Log:
If VISUAL or EDITOR contains "vi", configure mode-keys and status-keys
to vi.

Based on a diff from martynas@, previously requested by a couple of
other people.

Members:
        tmux.1:1.190->1.191
        tmux.c:1.93->1.94
2010-12-06 21:59:42 +00:00
Nicholas Marriott
e75187310d PatchSet 789
Date: 2010/11/22 21:13:13
Author: nicm
Branch: HEAD
Tag: (none)
Log:
There is somewhere that WINDOW_HIDDEN is getting set when it shouldn't
be and I can't find it, but the flag itself is a useless optimisation
that only applies to automatic-resize windows, so just dispose of it
entirely.

Fixes problems reported by Nicholas Riley.

Members:
        resize.c:1.5->1.6
        tmux.h:1.246->1.247
        tty.c:1.92->1.93
2010-12-06 21:57:56 +00:00
Nicholas Marriott
7a0468c95c PatchSet 788
Date: 2010/11/15 06:52:11
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Show more window and pane flags in list-* output, and put layout on the
same line.

Members:
        cmd-list-panes.c:1.5->1.6
        cmd-list-windows.c:1.9->1.10
2010-12-06 21:56:32 +00:00
Nicholas Marriott
1b0d235e3a PatchSet 787
Date: 2010/11/14 09:04:22
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Update man page for update-environment.

Members:
        tmux.1:1.189->1.190
2010-12-06 21:55:42 +00:00
Nicholas Marriott
36e537bcef PatchSet 786
Date: 2010/11/14 08:58:25
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Don't allow last and active window to become the same - a very bad move
when the active window is closed and freed. Reported by sthen@.

Members:
        window.c:1.58->1.59
2010-12-06 21:53:50 +00:00
Nicholas Marriott
fd51bf61c9 Add XAUTHORITY to update-environment, requested by Andreas Kloeckner. 2010-12-06 21:53:00 +00:00
Nicholas Marriott
fe4f760eba PatchSet 784
Date: 2010/11/11 20:54:06
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Flag to flush all key bindings from Rob Paisley.

Members:
        cmd-unbind-key.c:1.7->1.8
        tmux.1:1.188->1.189
2010-12-06 21:51:02 +00:00
Nicholas Marriott
3a4b82d27a PatchSet 783
Date: 2010/11/11 20:51:30
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Declaration in header should be extern.

Members:
        tmux.h:1.245->1.246
2010-12-06 21:50:24 +00:00
Nicholas Marriott
ccdafdabca PatchSet 782
Date: 2010/11/01 20:59:45
Author: nicm
Branch: HEAD
Tag: (none)
Log:
Typo, from Rob Paisley.

Members:
        tmux.1:1.187->1.188
2010-12-06 21:49:57 +00:00
Nicholas Marriott
39e277be3c |---------------------
|PatchSet 781
|Date: 2010/10/29 21:11:57
|Author: nicm
|Branch: HEAD
|Tag: (none)
|Log:
|We now send argv to the server after parsing it in the client to get the
|command, so the client should not modify it. Instead, take a copy. Fixes
|parsing command lists, reported by mcbride@.
|
|Members:
|       cmd-list.c:1.5->1.6
|       cmd.c:1.45->1.46
|       tmux.h:1.244->1.245
2010-12-06 21:48:56 +00:00
Nicholas Marriott
1650155589 Another. 2010-12-06 17:10:42 +00:00
Nicholas Marriott
42327f06df And moar. 2010-12-06 17:09:00 +00:00
Nicholas Marriott
1585b1e928 Moar. 2010-12-06 17:05:31 +00:00
Nicholas Marriott
9ab191b053 + SF requests. 2010-12-06 17:03:22 +00:00
Nicholas Marriott
13032d1d88 Using working directory always, from Vivien Mallet. 2010-12-06 17:00:34 +00:00
Nicholas Marriott
64387d18dd +. 2010-12-04 15:28:14 +00:00
Nicholas Marriott
ebd0eb4fb4 If VISUAL or EDITOR contains "vi", configure mode-keys and status-keys
to vi.

Based on a diff from martynas@, previously requested by a couple of
other people.
2010-11-29 19:45:58 +00:00
Nicholas Marriott
25bf0faf21 +. 2010-11-22 22:29:30 +00:00
Nicholas Marriott
ef9b2eb566 There is somewhere that WINDOW_HIDDEN is getting set when it shouldn't
be and I can't find it, but the flag itself is a useless optimisation
that only applies to automatic-resize windows, so just dispose of it
entirely.

Fixes problems reported by Nicholas Riley.
2010-11-22 21:13:13 +00:00
Nicholas Marriott
112fc58e6e +. 2010-11-15 20:34:38 +00:00
Nicholas Marriott
9a1b4f9ed3 Show more window and pane flags in list-* output, and put layout on the
same line.
2010-11-15 06:52:11 +00:00
Nicholas Marriott
7e542d119b Update man page for update-environment. 2010-11-14 09:04:22 +00:00
Nicholas Marriott
503edae26f Don't allow last and active window to become the same - a very bad move
when the active window is closed and freed. Reported by sthen@.
2010-11-14 08:58:25 +00:00
Nicholas Marriott
ba68bed10e +. 2010-11-13 16:55:30 +00:00
Nicholas Marriott
30e8ed393e Whoops, get the logic the right way round. 2010-11-13 16:29:05 +00:00
Nicholas Marriott
e4e728664b Add XAUTHORITY to update-environment, requested by Andreas Kloeckner. 2010-11-11 21:06:09 +00:00
Nicholas Marriott
17b56562c4 Flag to flush all key bindings from Rob Paisley. 2010-11-11 20:54:06 +00:00
Nicholas Marriott
c7fccfa299 Declaration in header should be extern. 2010-11-11 20:51:30 +00:00
Nicholas Marriott
a6fc49ae08 Fix AIX warnings. 2010-11-11 20:45:49 +00:00
Nicholas Marriott
94c2adf499 malloc(0) may return NULL, so only assume that is an error if allocating
more than zero.
2010-11-11 20:41:08 +00:00
Nicholas Marriott
9c541e42f0 AIX doesn't have daemon(). 2010-11-11 20:37:53 +00:00
Nicholas Marriott
96601ce9fe Bring back fuzz.c. 2010-11-02 20:55:13 +00:00
Nicholas Marriott
1cec111af3 >4 now. 2010-11-01 21:42:20 +00:00
Nicholas Marriott
023137a891 Typo, from Rob Paisley. 2010-11-01 20:59:45 +00:00
Nicholas Marriott
34d05ea7cd We now send argv to the server after parsing it in the client to get the
command, so the client should not modify it. Instead, take a copy. Fixes
parsing command lists, reported by mcbride@.
2010-10-29 20:11:57 +00:00
Nicholas Marriott
ae7a7be819 I am almost certain we don't need crypt or rt now, and it builds fine on
Linux without.
2010-10-27 21:40:03 +00:00
Nicholas Marriott
58684ea998 And more. 2010-10-27 21:34:59 +00:00
Nicholas Marriott
914f8584ef Style tweaks. 2010-10-27 21:33:15 +00:00
Nicholas Marriott
2287ec7b3e Compat for closefrom(). 2010-10-27 20:21:01 +00:00
Nicholas Marriott
8f84217023 Put setproctitle back under HAVE_SETPROCTITLE. 2010-10-24 19:54:41 +00:00
Tiago Cunha
83447580b1 Remove redundant preprocessor check (it's already taken care of by tmux.h). 2010-10-24 01:55:21 +00:00
Tiago Cunha
1cd9ff4460 Ugh. Don't know how this happened, but make it compile by removing duplicate
code.
2010-10-24 01:51:34 +00:00
Tiago Cunha
cd079e8fbf Sync OpenBSD patchset 780:
Add a last-pane command (bound to ; by default). Requested ages ago by
somebody whose name I have forgotten.
2010-10-24 01:34:30 +00:00
Tiago Cunha
8703e9f2f9 Sync OpenBSD patchset 779:
When removing a pane, don't change the active pane unless the active
pane is actually the one being removed.
2010-10-24 01:32:35 +00:00
Tiago Cunha
2da0730f78 Sync OpenBSD patchset 778:
Mark repeating keys with "(repeat)" in the key list.
2010-10-24 01:31:57 +00:00
Tiago Cunha
bdbd4e28c2 Sync OpenBSD patchset 777:
Merge the before and after attach client code into one in client.c
(instead of two in tmux.c and client.c).
2010-10-24 01:31:08 +00:00
Tiago Cunha
1276ea3653 Zap paths.h compat include. 2010-10-24 00:50:11 +00:00
Tiago Cunha
f79b467dce Sync OpenBSD patchset 776:
Make stdio blocking again before calling shell command with -c.
2010-10-24 00:47:46 +00:00
Tiago Cunha
d4b58c71a2 Sync OpenBSD patchset 775:
Trying to set FD_CLOEXEC on every fd is a lost cause, just use
closefrom() before exec.
2010-10-24 00:45:57 +00:00
Tiago Cunha
5fb4f8c1fa Helper script which greps for compat includes that shouldn't be present in all files but compat.h. 2010-10-24 00:42:04 +00:00
Tiago Cunha
5a0ecc5931 Sync OpenBSD patchset 774:
Fall back on normal session choice method if $TMUX exists but is invalid
rather than rejecting.
2010-10-24 00:32:35 +00:00
Tiago Cunha
e7a4b68f73 Sync OpenBSD patchset 773:
Use an explicit event rather than event_once for the main event so it
can be removed when the client becomes ready.
2010-10-24 00:31:57 +00:00
Tiago Cunha
a7e5092bd4 Sync OpenBSD patchset 772:
Treat the meta bit in the xterm extended modifier key set as the same as
escape (tmux's meta). From Emanuele Giaquinta.
2010-10-24 00:30:51 +00:00
Tiago Cunha
b73ac822fb Sync OpenBSD patchset 771:
Put "or" on new line from command with .Ic.
2010-10-24 00:29:57 +00:00
Nicholas Marriott
0ad532d9c2 Rewrite the screen vs tmux bit to be more accurate and complete and less
subjective.
2010-10-23 14:09:29 +00:00
Nicholas Marriott
5de84eca3d Add a last-pane command (bound to ; by default). Requested ages ago by
somebody whose name I have forgotten.
2010-10-23 13:04:34 +00:00
Nicholas Marriott
a3efd2ab5a When removing a pane, don't change the active pane unless the active
pane is actually the one being removed.
2010-10-23 12:51:51 +00:00
Nicholas Marriott
139754b9fe Mark repeating keys with "(repeat)" in the key list. 2010-10-20 18:20:36 +00:00
Nicholas Marriott
248fb14f08 Merge the before and after attach client code into one in client.c
(instead of two in tmux.c and client.c).
2010-10-18 20:00:02 +00:00
Nicholas Marriott
b0ad6e94bb +ttyfast. 2010-10-18 19:01:07 +00:00
Nicholas Marriott
31954339d1 Make stdio blocking again before calling shell command with -c. 2010-10-16 08:42:35 +00:00
Nicholas Marriott
f56b4ec2ff Trying to set FD_CLOEXEC on every fd is a lost cause, just use
closefrom() before exec.
2010-10-16 08:31:55 +00:00
Nicholas Marriott
6c42f1a89e Fall back on normal session choice method if $TMUX exists but is invalid
rather than rejecting.
2010-10-16 07:57:42 +00:00
Nicholas Marriott
65ff5b00bd Use an explicit event rather than event_once for the main event so it
can be removed when the client becomes ready.
2010-10-14 17:38:39 +00:00
Nicholas Marriott
f6cd0342f6 Treat the meta bit in the xterm extended modifier key set as the same as
escape (tmux's meta). From Emanuele Giaquinta.
2010-10-14 00:37:51 +00:00
Nicholas Marriott
1580afdfdf Put "or" on new line from command with .Ic. 2010-10-14 00:30:03 +00:00
Tiago Cunha
b2ae7c6261 Sync OpenBSD patchset 770:
Set cause when failing due to linking a window to itself, from Martin
Pieuchot.
2010-10-09 14:31:50 +00:00
Tiago Cunha
6c9269baa7 Sync OpenBSD patchset 769:
Skip NULL entries in the sessions list when choosing the next session,
from Simon Olofsson.
2010-10-09 14:31:14 +00:00
Tiago Cunha
45784bd5d6 Sync OpenBSD patchset 767:
Nuke a leftover RB tree declaration spotted by blambert.
2010-10-09 14:30:26 +00:00
Tiago Cunha
b5349ab5d9 Sync OpenBSD patchset 766:
Two new options:

- server option "exit-unattached" makes the server exit when no clients
  are attached, even if sessions are present;

- session option "destroy-unattached" destroys a session once no clients
  are attached to it.

These are useful for preventing tmux remaining in the background where
it is undesirable and when using tmux as a login shell to keep a limit
on new sessions.
2010-10-09 14:29:32 +00:00
Tiago Cunha
7874b00d4c Sync OpenBSD patchset 765:
Modify the permissions on the socket when adding or removing +x to show
attached sessions, rather than replacing them.
2010-10-09 14:26:29 +00:00
Tiago Cunha
6139fac10d Sync OpenBSD patchset 764:
detach-on-destroy is a session option, not server.
2010-10-09 14:25:40 +00:00
Nicholas Marriott
7aef2994e4 Set cause when failing due to linking a window to itself, from Martin
Pieuchot.
2010-10-09 12:58:00 +00:00
Nicholas Marriott
08bcd6978c Skip NULL entries in the sessions list when choosing the next session,
from Simon Olofsson.
2010-10-05 17:15:21 +00:00
Nicholas Marriott
4789a4ee1f Nuke a leftover RB tree declaration spotted by blambert. 2010-09-28 07:15:45 +00:00
Nicholas Marriott
9a7cde0c9b Two new options:
- server option "exit-unattached" makes the server exit when no clients
  are attached, even if sessions are present;

- session option "destroy-unattached" destroys a session once no clients
  are attached to it.

These are useful for preventing tmux remaining in the background where
it is undesirable and when using tmux as a login shell to keep a limit
on new sessions.
2010-09-26 20:43:30 +00:00
Nicholas Marriott
66152010a7 Modify the permissions on the socket when adding or removing +x to show
attached sessions, rather than replacing them.
2010-09-26 18:51:48 +00:00
Nicholas Marriott
2772557d15 detach-on-destroy is a session option, not server. 2010-09-25 20:35:52 +00:00
Nicholas Marriott
d0d98d4ec0 done 2010-09-25 20:21:51 +00:00
Tiago Cunha
29f04400b5 Sync OpenBSD patchset 763:
Ugh. Pass the right type into tty_term_has. Teaches me to make last
minute changes :-/.
2010-09-18 15:45:03 +00:00
Tiago Cunha
5126037ea0 Sync OpenBSD patchset 762:
Use UTF-8 line drawing characters on UTF-8 terminals. Fixes some stupid
terminals (I'm looking at you, putty) which disable the vt100 ACS mode
switching sequences in UTF-8 mode.

Also on terminals without ACS at all, use ASCII equivalents where
obvious.
2010-09-18 15:43:53 +00:00
Tiago Cunha
d7a3fc3df4 Sync OpenBSD patchset 761:
Ignore terminal overrides settings without a value.
2010-09-18 15:41:50 +00:00
Tiago Cunha
59dc08a7a0 Sync OpenBSD patchset 760:
When resizing the copy mode screen, don't allow it to end up with the
viewable position beyond the size of the history.
2010-09-18 15:41:18 +00:00
Nicholas Marriott
fe3621cbc5 Update, from Daniel Thau. 2010-09-18 09:36:15 +00:00
Nicholas Marriott
ea4487c6da Ugh. Pass the right type into tty_term_has. Teaches me to make last
minute changes :-/.
2010-09-11 16:20:58 +00:00
Nicholas Marriott
cb564bb427 Use UTF-8 line drawing characters on UTF-8 terminals. Fixes some stupid
terminals (I'm looking at you, putty) which disable the vt100 ACS mode
switching sequences in UTF-8 mode.

Also on terminals without ACS at all, use ASCII equivalents where
obvious.
2010-09-11 16:19:22 +00:00
Nicholas Marriott
3696cce4ae Ignore terminal overrides settings without a value. 2010-09-11 15:43:11 +00:00
Nicholas Marriott
c1c5f43a01 When resizing the copy mode screen, don't allow it to end up with the
viewable position beyond the size of the history.
2010-09-11 15:39:55 +00:00
Tiago Cunha
89c07dedd9 Sync OpenBSD patchset 759:
Add -n and -p flags to switch-client to move to the next and previous
session (yes, it doesn't match window/pane, but so what, nor does
switch-client).

Based on a diff long ago from "edsouza".
2010-09-10 13:36:17 +00:00
Tiago Cunha
28a0b6fd20 Sync OpenBSD patchset 758:
Do not crash if the screen size is too small for the indicator in copy mode.
2010-09-10 13:34:12 +00:00
Nicholas Marriott
a22a6deda5 Add -n and -p flags to switch-client to move to the next and previous
session (yes, it doesn't match window/pane, but so what, nor does
switch-client).

Based on a diff long ago from "edsouza".
2010-09-08 22:02:28 +00:00
Nicholas Marriott
bbf743769b Do not crash if the screen size is too small for the indicator in copy mode. 2010-09-08 20:36:42 +00:00
Nicholas Marriott
f54482a461 Solaris 9 has no stdint.h, ugh. Reported by a couple of people most
recently Timothy Larson.
2010-09-07 19:32:58 +00:00
Tiago Cunha
afcc29a51d Sync OpenBSD patchset 757:
Simplify xterm modifier detection by treating as a bitmask + 1. Spotted
by and diff from Emanuele Giaquinta.
2010-09-07 13:21:18 +00:00
Tiago Cunha
33df467d40 Sync OpenBSD patchset 756:
Reset running jobs when the status line is enabled or disabled as well,
some people have it bound to a key.
2010-09-07 13:20:28 +00:00
Tiago Cunha
510b43569f Sync OpenBSD patchset 755:
Add missing prototype.
2010-09-07 13:19:53 +00:00
Nicholas Marriott
de68c2a7da Simplify xterm modifier detection by treating as a bitmask + 1. Spotted
by and diff from Emanuele Giaquinta.
2010-09-01 21:11:14 +00:00
Nicholas Marriott
5309252053 Reset running jobs when the status line is enabled or disabled as well,
some people have it bound to a key.
2010-09-01 21:06:51 +00:00
Nicholas Marriott
a8b22d3673 +. 2010-09-01 20:39:32 +00:00
Nicholas Marriott
19923625d4 +. 2010-09-01 20:37:20 +00:00
Nicholas Marriott
8e8e0f1d53 Add missing prototype. 2010-08-31 22:46:59 +00:00
Nicholas Marriott
3b4d26d16b +. 2010-08-31 22:44:01 +00:00
Tiago Cunha
01052ca38e Sync OpenBSD patchset 754:
When destroying a pane, reset any mode (which reenables pane
bufferevent) before freeing the bufferevent.
2010-08-29 14:46:13 +00:00
Tiago Cunha
ee44a8dca9 Sync OpenBSD patchset 753:
Can't call event_del() without event_set() first - so call event_set()
when setting up the client.
2010-08-29 14:44:55 +00:00
Tiago Cunha
89acd757d0 Sync OpenBSD patchset 752:
MSG_EXIT can now have a return code in the message, so check for that
size as well. Stops the client fatal()ing on exit.
2010-08-29 14:43:45 +00:00
Tiago Cunha
56040be346 Sync OpenBSD patchset 751:
Do not call event_del() for signals after fork(), just use sigaction()
directly instead - calling libevent functions after fork() w/o
event_reinit() is a bad idea, even if in this case it was harmless.
2010-08-29 14:42:11 +00:00
Tiago Cunha
e6bb3d6942 Sync OpenBSD patchset 750:
Do not need to dup() the tty fd sent from the client because it is
already dup()d again later. Fixes a leak seen by espie@.
2010-08-29 14:39:45 +00:00
Nicholas Marriott
f69ce39a6c When destroying a pane, reset any mode (which reenables pane
bufferevent) before freeing the bufferevent.
2010-08-25 19:19:43 +00:00
Nicholas Marriott
fc9f08235b Can't call event_del() without event_set() first - so call event_set()
when setting up the client.
2010-08-23 17:36:32 +00:00
Nicholas Marriott
5f5104e782 MSG_EXIT can now have a return code in the message, so check for that
size as well. Stops the client fatal()ing on exit.
2010-08-22 16:09:49 +00:00
Nicholas Marriott
e3be9b1951 Do not call event_del() for signals after fork(), just use sigaction()
directly instead - calling libevent functions after fork() w/o
event_reinit() is a bad idea, even if in this case it was harmless.
2010-08-19 18:29:01 +00:00
Nicholas Marriott
aba555509e +-. 2010-08-19 18:04:56 +00:00
Nicholas Marriott
c2822ca119 Do not need to dup() the tty fd sent from the client because it is
already dup()d again later. Fixes a leak seen by espie@.
2010-08-19 17:20:26 +00:00
Tiago Cunha
c50c4ec834 Sync OpenBSD patchset 749:
Do not allow duplicate session names to be created, reported by Dominik
Honnef, patch from Thomas Adam.
2010-08-11 22:19:03 +00:00
Tiago Cunha
9858071dd0 Sync OpenBSD patchset 748:
Handle failure to change mode, to avoid dying when switching into copy
mode when already in a different mode. Reported by "Florian".
2010-08-11 22:18:28 +00:00
Tiago Cunha
b0169d9b84 Sync OpenBSD patchset 747:
Usage string fixes from Ben Boeckel.
2010-08-11 22:17:32 +00:00
Tiago Cunha
e34c6e2305 Sync OpenBSD patchset 746:
Treat trying to link or move to the same window as an error to avoid
removing it accidentally.
2010-08-11 22:16:43 +00:00
Tiago Cunha
761bd3c9e3 Sync OpenBSD patchset 745:
Change the way backoff works. Instead of stopping reading from the pty
when the client tty backs up too much, just stop updating the tty and
only update the internal screen. Then when the tty recovers, force a
redraw.

This prevents a dodgy client from causing other clients to go into
backoff while still allowing tmux to be responsive (locally) when seeing
lots of output.
2010-08-11 22:16:04 +00:00
Tiago Cunha
5e9429e2d6 Sync OpenBSD patchset 744:
Show which pane is active in the list-panes output, suggested by Dominik
Honnef.
2010-08-11 22:14:23 +00:00
Nicholas Marriott
828f12b748 Do not allow duplicate session names to be created, reported by Dominik
Honnef, patch from Thomas Adam.
2010-08-11 07:45:06 +00:00
Nicholas Marriott
ae70071494 Handle failure to change mode, to avoid dying when switching into copy
mode when already in a different mode. Reported by "Florian".
2010-08-11 07:41:05 +00:00
Nicholas Marriott
3999886901 Usage string fixes from Ben Boeckel. 2010-08-11 07:38:00 +00:00
Nicholas Marriott
cc474b4ede Treat trying to link or move to the same window as an error to avoid
removing it accidentally.
2010-08-11 07:36:23 +00:00
Nicholas Marriott
8363e31953 Change the way backoff works. Instead of stopping reading from the pty
when the client tty backs up too much, just stop updating the tty and
only update the internal screen. Then when the tty recovers, force a
redraw.

This prevents a dodgy client from causing other clients to go into
backoff while still allowing tmux to be responsive (locally) when seeing
lots of output.
2010-08-11 07:34:43 +00:00
Nicholas Marriott
933dc48de3 Show which pane is active in the list-panes output, suggested by Dominik
Honnef.
2010-08-11 07:27:50 +00:00
Tiago Cunha
4387db506f Sync OpenBSD patchset 742:
dup() the stdin fd so it isn't closed twice (once for stdin, once for tty).
2010-08-09 21:45:37 +00:00
Tiago Cunha
d7bae0edce Sync OpenBSD patchset 741:
When changing so that the client passes its stdout and stderr as well as
stdin up to the server, I forgot one essential point - the tmux server
could now be both the producer and consumer. This happens when tmux is
run inside tmux, as well as when piping tmux commands together.

So, using stdio(3) was a bad idea - if sufficient data was written, this
could block in write(2). When that happened and the server was both
producer and consumer, it deadlocks.

Change to use libevent bufferevents for the client stdin, stdout and
stderr instead. This is trivial enough for output but requires a
callback mechanism to trigger when stdin is finished.

This relies on the underlying polling mechanism for libevent to work
with whatever devices to which the user could redirect stdin, stdout or
stderr, hence the change to use poll(2) over kqueue(2) for tmux.
2010-08-09 21:44:25 +00:00
Nicholas Marriott
482bd7b65e Basic GNU bash completion from Frank Barknecht. 2010-08-09 18:22:33 +00:00
Theo Deraadt
4274a7ec89 switch back to kqueue for now, since (a) kqueue has been fixed to deal
with strange devices and (b) since there appears to be a bull in the
poll code in libevent as well...
requested by nicm who is away
2010-08-04 19:46:13 +00:00
Nicholas Marriott
f42364b4b5 How to blank on lock, from Thomas Adam, slightly tweaked by me. 2010-07-31 11:46:28 +00:00
Nicholas Marriott
5be8175b0b No more up-pane/down-pane. 2010-07-31 11:39:13 +00:00
Nicholas Marriott
77f9c49829 dup() the stdin fd so it isn't closed twice (once for stdin, once for tty). 2010-07-28 22:15:15 +00:00
Tiago Cunha
5576fe42b2 Sync with reality, per SF bug #3035214. 2010-07-27 18:29:07 +00:00
Nicholas Marriott
c87187f913 When changing so that the client passes its stdout and stderr as well as
stdin up to the server, I forgot one essential point - the tmux server
could now be both the producer and consumer. This happens when tmux is
run inside tmux, as well as when piping tmux commands together.

So, using stdio(3) was a bad idea - if sufficient data was written, this
could block in write(2). When that happened and the server was both
producer and consumer, it deadlocks.

Change to use libevent bufferevents for the client stdin, stdout and
stderr instead. This is trivial enough for output but requires a
callback mechanism to trigger when stdin is finished.

This relies on the underlying polling mechanism for libevent to work
with whatever devices to which the user could redirect stdin, stdout or
stderr, hence the change to use poll(2) over kqueue(2) for tmux.
2010-07-24 20:11:59 +00:00
Nicholas Marriott
bf09b00fe9 kqueue(2) is currently broken when used with /dev/null and a few other
devices.

An upcoming fix for some problems with the client stdout/stderr handling
relies on it working, so make tmux force libevent to use poll(2) via
EVENT_NOKQUEUE, until we have fixed kqueue.
2010-07-24 19:25:31 +00:00
Nicholas Marriott
a97b7ad11c Fix a crash: if remain-on-exit is set and the pane has exited, the
buffers may not be valid, so do not try to disable/enable them when
switching to copy mode.
2010-07-22 21:10:51 +00:00
Micah Cowan
1944747759 Don't enable/disable invalid event pointers. Fixes SF #3033119. 2010-07-22 19:51:48 +00:00
Tiago Cunha
28c4c86589 Sync OpenBSD patchset 738:
Don't return if in the current window since we may want to report a bell
(if bell-action any/current), just clear the flag so the status line
doesn't show the bell.
2010-07-20 17:36:41 +00:00
Tiago Cunha
7ed9b0f8fb Sync OpenBSD patchset 737:
Send the \n to stdout with the message, not stderr... doh.
2010-07-20 17:36:03 +00:00
Nicholas Marriott
2b80ede963 Don't return if in the current window since we may want to report a bell
(if bell-action any/current), just clear the flag so the status line
doesn't show the bell.
2010-07-19 21:13:03 +00:00
Nicholas Marriott
11497af4dd Solaris has MAXHOSTNAMELEN in netdb.h. 2010-07-19 18:31:42 +00:00
Nicholas Marriott
2a0f3f0d79 Send the \n to stdout with the message, not stderr... doh. 2010-07-19 18:27:38 +00:00
Tiago Cunha
b0878774e0 Don't hard-code the username. 2010-07-19 13:57:22 +00:00
Tiago Cunha
e71f0842ce Working on 1.4. 2010-07-18 14:53:27 +00:00
Tiago Cunha
9b47a48393 Changes for 1.3. 2010-07-18 13:40:59 +00:00
Tiago Cunha
0482983d53 Done. 2010-07-18 13:39:02 +00:00
Tiago Cunha
2b512dc49d Bump VERSION, and comment FDEBUG. 2010-07-18 13:36:52 +00:00
Tiago Cunha
ae45c2ea45 Sync OpenBSD patchset 736:
some escapes i missed;
2010-07-17 14:39:01 +00:00
Tiago Cunha
11f81e8134 Sync OpenBSD patchset 735:
Make pane/window wrapping more logical (so with 10 windows, +10 from
window 5 stays in the same place), and tidy the code. From Tiago Cunha.
2010-07-17 14:38:13 +00:00
Tiago Cunha
ad6a528f61 Sync OpenBSD patchset 734:
Return the command client return code with MSG_EXIT now that MSG_ERROR and
MSG_PRINT are unused.

New clients should be compatible with old tmux servers but vice versa may print
an error.
2010-07-17 14:36:41 +00:00
Jason McIntyre
a471b5de9c some escapes i missed; 2010-07-15 21:54:20 +00:00
Nicholas Marriott
43355fa75c Make pane/window wrapping more logical (so with 10 windows, +10 from
window 5 stays in the same place), and tidy the code. From Tiago Cunha.
2010-07-14 18:37:49 +00:00
Nicholas Marriott
b9c873cdaa Return the command client return code with MSG_EXIT now that MSG_ERROR and
MSG_PRINT are unused.

New clients should be compatible with old tmux servers but vice versa may print
an error.
2010-07-11 17:06:45 +00:00
Tiago Cunha
46f27eab22 Sync OpenBSD patchset 733:
replace some magic mouse constants with defines for clarity. ok nicm
2010-07-02 02:56:07 +00:00
Tiago Cunha
e4703bacb5 Sync OpenBSD patchset 732:
Custom layouts. list-windows command displays the layout as a string (such as
"bb62,159x48,0,0{79x48,0,0,79x48,80,0}") and it can be applied to another
window (with the same number of panes or fewer) using select-layout.
2010-07-02 02:54:52 +00:00
Tiago Cunha
e4573de97b Sync OpenBSD patchset 731:
Send all three of stdin, stdout, stderr from the client to the server, so that
commands can directly make use of them. This means that load-buffer and
save-buffer can have "-" as the file to read from stdin or write to stdout.

This is a protocol version bump so the tmux server will need to be restarted
after upgrade (or an older client used).
2010-07-02 02:52:13 +00:00
Tiago Cunha
63e76b555d Sync OpenBSD patchset 730:
Store the current working directory in the session, change the default-path
option to default to empty and make that mean that the stored session CWD is
used.
2010-07-02 02:49:19 +00:00
Tiago Cunha
13e7f060b1 Update. 2010-07-02 02:46:39 +00:00
Tiago Cunha
fa34c76275 Sync OpenBSD patchset 729:
New option, detach-on-destroy, to set what happens to a client when the session
it is attached to is destroyed. If on (the default), it is detached; if off, it
is switched to the most recently active session.
2010-07-02 02:45:52 +00:00
Tiago Cunha
985cd3a4de Sync OpenBSD patchset 728:
Use server_destroy_session() for kill-session.
2010-07-02 02:43:50 +00:00
Tiago Cunha
03c1c1cd9f Sync OpenBSD patchset 727:
Setting the cmdlist pointer in the bind-key to NULL to prevent it being freed
after the command is executing is bogus because it may still be needed if the
same command is going to be executed again (for example if you "bind-key a
bind-key b ..."). Making a copy is hard, so instead add a reference count to
the cmd_list.

While here, also print bind-key -n and the rest of the flags properly.

Fixes problem reported by mcbride@.
2010-07-02 02:43:01 +00:00
Ted Unangst
b4b9b831ee replace some magic mouse constants with defines for clarity. ok nicm 2010-06-29 05:24:49 +00:00
Nicholas Marriott
552c9cd83f Custom layouts. list-windows command displays the layout as a string (such as
"bb62,159x48,0,0{79x48,0,0,79x48,80,0}") and it can be applied to another
window (with the same number of panes or fewer) using select-layout.
2010-06-29 03:30:13 +00:00
Nicholas Marriott
76bbdeb586 Send all three of stdin, stdout, stderr from the client to the server, so that
commands can directly make use of them. This means that load-buffer and
save-buffer can have "-" as the file to read from stdin or write to stdout.

This is a protocol version bump so the tmux server will need to be restarted
after upgrade (or an older client used).
2010-06-28 22:10:42 +00:00
Nicholas Marriott
07a71fd432 Store the current working directory in the session, change the default-path
option to default to empty and make that mean that the stored session CWD is
used.
2010-06-27 02:56:59 +00:00
Nicholas Marriott
26524c99f6 New option, detach-on-destroy, to set what happens to a client when the session
it is attached to is destroyed. If on (the default), it is detached; if off, it
is switched to the most recently active session.
2010-06-27 00:22:22 +00:00
Nicholas Marriott
34464da8d3 Use server_destroy_session() for kill-session. 2010-06-26 23:55:50 +00:00
Nicholas Marriott
42e2413978 Setting the cmdlist pointer in the bind-key to NULL to prevent it being freed
after the command is executing is bogus because it may still be needed if the
same command is going to be executed again (for example if you "bind-key a
bind-key b ..."). Making a copy is hard, so instead add a reference count to
the cmd_list.

While here, also print bind-key -n and the rest of the flags properly.

Fixes problem reported by mcbride@.
2010-06-26 18:20:53 +00:00
Tiago Cunha
0e70c8801c Update. 2010-06-22 23:37:28 +00:00
Tiago Cunha
617386370b Nuke vis.h. 2010-06-22 23:36:54 +00:00
Tiago Cunha
bf1e237410 Sync OpenBSD patchset 726:
Add a choose-buffer command for easier use of the paste buffer stack.
2010-06-22 23:35:20 +00:00
Tiago Cunha
8d3b726396 Sync OpenBSD patchset 725:
Extend the -t:+ and -t:- window targets for next and previous window to
accept an offset such as -t:+2. From Tiago Cunha.
2010-06-22 23:29:05 +00:00
Tiago Cunha
47b335dee7 Sync OpenBSD patchset 724:
Having a list of winlinks->alerts for each session is stupid, just store
the alert flags directly in the winlink itself.
2010-06-22 23:26:18 +00:00
Tiago Cunha
6c76724201 Sync OpenBSD patchset 723:
Rename activity->alert in a couple of functions for consistency.
2010-06-22 23:22:31 +00:00
Tiago Cunha
29434cb043 Sync OpenBSD patchset 722:
Give tmux sockets (but not the containing folder) group
permissions. This allows hardlinks to the sockets to be used more
easily.
2010-06-22 23:21:39 +00:00
Nicholas Marriott
ef7293379f Add a choose-buffer command for easier use of the paste buffer stack. 2010-06-21 21:44:09 +00:00
Nicholas Marriott
386849edc1 Extend the -t:+ and -t:- window targets for next and previous window to
accept an offset such as -t:+2. From Tiago Cunha.
2010-06-21 01:46:36 +00:00
Nicholas Marriott
e63f0546a1 Having a list of winlinks->alerts for each session is stupid, just store
the alert flags directly in the winlink itself.
2010-06-21 01:27:46 +00:00
Nicholas Marriott
447a07e9f8 Rename activity->alert in a couple of functions for consistency. 2010-06-21 00:25:32 +00:00
Nicholas Marriott
b7454e37cb Done. 2010-06-21 00:19:44 +00:00
Nicholas Marriott
ad466a69aa Give tmux sockets (but not the containing folder) group
permissions. This allows hardlinks to the sockets to be used more
easily.
2010-06-21 00:18:57 +00:00
Nicholas Marriott
e2a5e02022 +. 2010-06-21 00:13:13 +00:00
Nicholas Marriott
5afb820d23 Ensure we overwrite UTF-8 wide characters properly, and never overwrite
characters we weren't overlapping.  Fixes "disappearing wide characters"
glitch. From Micah Cowan.
2010-06-21 00:11:12 +00:00
Micah Cowan
cac532c3d1 Ensure we overwrite wide characters properly, and never overwrite characters we weren't overlapping.
Fixes "disappearing wide characters" glitch.
2010-06-16 18:09:23 +00:00
Tiago Cunha
e186450788 Sync OpenBSD patchset 720:
Last change erroneously used the target argument for looking up the
client which caused pipe-pane to fail when used from the command
line. Instead pass NULL which should use the current client.

Spotted by Tiago Cunha.
2010-06-15 20:25:40 +00:00
Tiago Cunha
3e8092709c Sync OpenBSD patchset 719:
Add a missing command and some missing Ic, from Tiago Cunha.
2010-06-15 20:24:52 +00:00
Nicholas Marriott
278d9bc721 Last change erroneously used the target argument for looking up the
client which caused pipe-pane to fail when used from the command
line. Instead pass NULL which should use the current client.

Spotted by Tiago Cunha.
2010-06-14 23:06:13 +00:00
Nicholas Marriott
1484eb8a51 Add a missing command and some missing Ic, from Tiago Cunha. 2010-06-14 23:04:44 +00:00
Nicholas Marriott
1b77ae2684 +. 2010-06-13 11:28:26 +00:00
Nicholas Marriott
dcc100f165 Use a macro-based mask for obtaining a key or modifier-set from the
combination. Display C-@, etc, as C-Space, in list-keys. By Micah Cowan.
2010-06-06 19:00:13 +00:00
Tiago Cunha
60134cebda imsg was moved into libutil on OpenBSD. 2010-06-06 13:00:47 +00:00
Tiago Cunha
f34861bad4 Sync OpenBSD patchset 717:
Couple of missing command aliases/flags, from Tiago Cunha.
2010-06-06 00:31:32 +00:00
Tiago Cunha
6503207185 Sync OpenBSD patchset 716:
Fix problems with window sizing seen by Raghavendra D Prabhu when
starting tmux from .xinitrc.

One of the very few things the server relies on the client for now is to
pass through a message on SIGWINCH, but there is a condition where
potentially a SIGWINCH may be lost during the transition from unattached
(main.c) to attached (client.c). So trigger a size change immediately
after the client installs its SIGWINCH handler.

Also, when the terminal is resized, reset the scroll region and cursor
position. Previously, we were clearing our saved idea of these, but in
fact some terminals do not reset them on resize, so this caused problems
during redraw.

While here make a resize to the same size not cause a redraw and rename
the tmux.out output log file to include the tmux PID.
2010-06-06 00:30:34 +00:00
Tiago Cunha
3bba401609 Sync OpenBSD patchset 715:
Support the status_replace # replacement sequences in the pipe-pane
command, thanks to Andrea Barisani.
2010-06-06 00:28:00 +00:00
Tiago Cunha
31657820bc Sync OpenBSD patchset 714:
Shut up gcc4 warnings.
2010-06-06 00:27:08 +00:00
Tiago Cunha
be3643fba0 Sync OpenBSD patchset 713:
This ioctl(TIOCGWINSZ) call is no longer necessary, the result is never
used and the server now does it later on the tty fd directly.
2010-06-06 00:25:47 +00:00
Tiago Cunha
f62d3d22bb Sync OpenBSD patchset 710:
When the mode-mouse option is on, support dragging to make a selection
in copy mode.

Also support the scroll wheel, although xterm strangely does not ignore
it in application mouse mode, causing redraw artifacts when scrolling up
(other terminals appear to be better behaved).
2010-06-06 00:23:44 +00:00
Tiago Cunha
67dc249d0e Sync OpenBSD patchset 709:
Better to say "command key bindings" since we've just called them
command keys.
2010-06-06 00:21:36 +00:00
Tiago Cunha
0778ef230b Sync OpenBSD patchset 708:
There is no real reason not to list all the key bindings here rather
than just a selection.
2010-06-06 00:20:53 +00:00
Tiago Cunha
bebfd7c2c8 Sync OpenBSD patchset 706:
Rename some imsg bits to make namespace collisions less likely buf to
ibuf, buf_read to ibuf_read, READ_BUF_SIZE to IBUF_READ_SIZE.
2010-06-06 00:08:28 +00:00
Tiago Cunha
348c3e69de Sync OpenBSD patchset 705:
Don't die if the client has been detached when the job finishes, just
don't display the output.
2010-06-06 00:04:59 +00:00
Tiago Cunha
0d6a64070c Sync OpenBSD patchset 704:
Fix an out-of-date comment.
2010-06-06 00:04:18 +00:00
Tiago Cunha
bb4d770e45 No vis.h in here. 2010-06-06 00:03:02 +00:00
Tiago Cunha
e55a59eebc Sync OpenBSD patchset 702:
Enhance paste-buffer to allow lines to be separated by any string, from
Andrea Barisani.
2010-06-06 00:01:36 +00:00
Tiago Cunha
11cd05db27 Sync OpenBSD patchset 701:
Colour+attribute options for status line alerts, from Alex Alexander.
2010-06-05 23:56:29 +00:00
Tiago Cunha
6c6255f2d7 Sync OpenBSD patchset 700:
Accept (and document) "none" instead of "default" for attributes as it
is clearer and avoids confusion with default colours.
2010-06-05 23:54:51 +00:00
Micah Cowan
227e458ebb Use a macro-based mask for obtaining a key or modifier-set from the combination.
Display C-@, etc, as C-Space, in list-keys.
2010-06-05 20:29:11 +00:00
Nicholas Marriott
89eb95265a Must allocate for putenv. 2010-06-05 18:20:48 +00:00
Nicholas Marriott
d98efa5378 Only need to build setenv.c once. 2010-06-05 18:14:29 +00:00
Nicholas Marriott
4e3bed2035 Couple of missing command aliases/flags, from Tiago Cunha. 2010-06-05 16:54:24 +00:00
Nicholas Marriott
510ec3fb9e Fix problems with window sizing seen by Raghavendra D Prabhu when
starting tmux from .xinitrc.

One of the very few things the server relies on the client for now is to
pass through a message on SIGWINCH, but there is a condition where
potentially a SIGWINCH may be lost during the transition from unattached
(main.c) to attached (client.c). So trigger a size change immediately
after the client installs its SIGWINCH handler.

Also, when the terminal is resized, reset the scroll region and cursor
position. Previously, we were clearing our saved idea of these, but in
fact some terminals do not reset them on resize, so this caused problems
during redraw.

While here make a resize to the same size not cause a redraw and rename
the tmux.out output log file to include the tmux PID.
2010-06-05 16:47:11 +00:00
Nicholas Marriott
ceed5cc9a9 Support the status_replace # replacement sequences in the pipe-pane
command, thanks to Andrea Barisani.
2010-06-05 16:34:30 +00:00
Nicholas Marriott
0440d325d9 Shut up gcc4 warnings. 2010-06-05 16:32:22 +00:00
Nicholas Marriott
36c0871c23 This ioctl(TIOCGWINSZ) call is no longer necessary, the result is never
used and the server now does it later on the tty fd directly.
2010-06-05 16:29:45 +00:00
Nicholas Marriott
a9c6976268 Should be const char *. 2010-06-05 16:29:40 +00:00
Nicholas Marriott
b88ec14f0e Fix binding of C-Space/C-@, from Micah Cowan. 2010-06-05 15:51:53 +00:00
Nicholas Marriott
cc724f327a Make start-of-line work the same as end-of-line on wrapped lines (jump
to real start if at edge of screen). By Micah Cowan.
2010-06-05 15:49:48 +00:00
Micah Cowan
d9c99b83c7 Make double start-of-line do what double end-of-line does, on wrapped lines. 2010-06-05 07:48:35 +00:00
Micah Cowan
d27956f160 Allow C-Space to work correctly once again, and forbid nonsensical combinations such as C-Enter or C-Escape. 2010-06-05 06:27:19 +00:00
Nicholas Marriott
43fa9a9ba6 When the mode-mouse option is on, support dragging to make a selection
in copy mode.

Also support the scroll wheel, although xterm strangely does not ignore
it in application mouse mode, causing redraw artifacts when scrolling up
(other terminals appear to be better behaved).
2010-05-31 19:51:29 +00:00
Nicholas Marriott
e1e120de1c Better to say "command key bindings" since we've just called them
command keys.
2010-05-30 19:19:42 +00:00
Nicholas Marriott
7b7397241f There is no real reason not to list all the key bindings here rather
than just a selection.
2010-05-30 19:09:50 +00:00
Nicholas Marriott
e334deb872 +. 2010-05-27 08:29:17 +00:00
Nicholas Marriott
1618f3eae6 Move imsg into libutil and add a man page.
Minor bump for libutil.

Previous versions of this diff and man page looked at by various people.

"you should just commit" deraadt
2010-05-26 16:44:32 +00:00
Nicholas Marriott
c47d66f49b Rename some imsg bits to make namespace collisions less likely buf to
ibuf, buf_read to ibuf_read, READ_BUF_SIZE to IBUF_READ_SIZE.

ok henning gilles claudio jacekm deraadt
2010-05-26 13:56:07 +00:00
Nicholas Marriott
1e8faaa217 Don't die if the client has been detached when the job finishes, just
don't display the output.
2010-05-25 20:05:25 +00:00
Nicholas Marriott
608eef731a Fix an out-of-date comment. 2010-05-25 19:47:30 +00:00
Nicholas Marriott
e50dc0745f +. 2010-05-24 18:21:07 +00:00
Nicholas Marriott
4f5c5b37b8 Pass in the session, rather than the client, to window modes' key()
function. We were only ever using the client to find the session anyway.

This allows send-key to work properly for manipulating copy mode from
outside tmux.

From Micah Cowan.
2010-05-23 19:42:19 +00:00
Micah Cowan
f11f71752a Pass in the session, rather than the client, to window modes' key() function.
We were only ever using the client to find the session anyway.
2010-05-22 21:56:04 +00:00
Nicholas Marriott
0ed727a012 Enhance paste-buffer to allow lines to be separated by any string, from
Andrea Barisani.
2010-05-19 22:28:14 +00:00
Nicholas Marriott
9e7a5fa5ef Spacing nits. 2010-05-19 21:49:57 +00:00
Nicholas Marriott
9c01a3d0db Solaris 9 is missing CMSG_ALIGN and some of the RFC2292 CMSG_*. From
Dagobert Michelsen.
2010-05-19 21:40:49 +00:00
Nicholas Marriott
278effd7ea Solaris 9 doesn't have setenv and unsetenv so add compat versions, based
on code from Dagobert Michelsen.
2010-05-19 21:31:39 +00:00
Nicholas Marriott
59c13133de Fix bad merge, from Romain Francoise. 2010-05-16 17:50:31 +00:00
Nicholas Marriott
41afc38dcc +. 2010-05-14 19:05:06 +00:00
Nicholas Marriott
d91127958d Colour+attribute options for status line alerts, from Alex Alexander. 2010-05-14 19:03:09 +00:00
Nicholas Marriott
4af4d12475 Accept (and document) "none" instead of "default" for attributes as it
is clearer and avoids confusion with default colours.
2010-05-14 18:56:21 +00:00
Nicholas Marriott
e5f01febd7 Use $OpenBSD$. 2010-05-14 14:41:06 +00:00
Tiago Cunha
0beb31c261 Update. 2010-05-14 14:38:50 +00:00
Tiago Cunha
6694a01861 Sync OpenBSD patchset 698:
Catch SIGHUP and terminate if running as a client. This prevents clients
from being left hanging around when, for example, a SSH session is
disconnected.

ok nicm@
2010-05-14 14:35:26 +00:00
Tiago Cunha
9900e28ba8 Sync OpenBSD patchset 697:
Identical behaviour to select-prompt can now be obtained with
command-prompt, so remove select-prompt and change ' to be bound to
command-prompt -p index "select-window -t :%%".
2010-05-14 14:33:39 +00:00
Tiago Cunha
fc69b9ccb7 Sync OpenBSD patchset 696:
Make signal handler setup/teardown two common functions instead of six,
and reset SIGCHLD after fork to fix problems with some shells. From
Romain Francoise.
2010-05-14 14:30:01 +00:00
Tiago Cunha
d3dd6709bc Sync OpenBSD patchset 693:
Make C-] and other punctuation-based control key combinations work again.

ok nicm
2010-05-14 14:21:07 +00:00
Tiago Cunha
3cded44623 Sync OpenBSD patchset 692:
sort options.
2010-05-14 14:19:41 +00:00
Tiago Cunha
50cad52ae6 Sync OpenBSD patchset 691:
Make the active pane border have a green foreground instead of
background by default.
2010-05-14 14:18:54 +00:00
Tiago Cunha
701b5bdf61 Sync OpenBSD patchset 688:
Add a tiled layout, originally from Liam Bedford a while ago, fixed up
by me.
2010-05-14 14:16:37 +00:00
Nicholas Marriott
4e120c00f7 Use LC_ALL for sed too since apparently some platforms play silly games
in other locales.
2010-05-12 19:47:25 +00:00
Nicholas Marriott
7d4588f470 +. 2010-05-12 19:21:15 +00:00
Joel Sing
72d1afa169 Catch SIGHUP and terminate if running as a client. This prevents clients
from being left hanging around when, for example, a SSH session is
disconnected.

ok nicm@
2010-05-12 15:05:39 +00:00
Nicholas Marriott
e0f4697e7c Identical behaviour to select-prompt can now be obtained with
command-prompt, so remove select-prompt and change ' to be bound to
command-prompt -p index "select-window -t :%%".
2010-05-05 23:24:23 +00:00
Nicholas Marriott
c4a2fdf15b Put this back in with the initialisation in the right order. 2010-05-04 17:28:16 +00:00
Nicholas Marriott
af5e0bd15a Revert last change, it appears to be broken somehow. 2010-05-04 08:48:06 +00:00
Nicholas Marriott
ec1d37b1b2 Make signal handler setup/teardown two common functions instead of six,
and reset SIGCHLD after fork to fix problems with some shells. From
Romain Francois.
2010-05-03 16:06:32 +00:00
Ryan McBride
c919139433 Make C-] and other punctuation-based control key combinations work again.
ok nicm
2010-05-03 09:38:03 +00:00
Igor Sobrado
fc09ec3025 sort options. 2010-05-02 15:19:35 +00:00
Nicholas Marriott
893be14cf8 +. 2010-04-28 19:08:40 +00:00
Nicholas Marriott
99e54f46c7 Make the active pane border have a green foreground instead of
background by default.
2010-04-28 18:22:32 +00:00
Nicholas Marriott
2240199dbf Fix crash when resizing in copy mode, when cursor can end up outside screen.
Reported by Romain Francois, fixed by Micah Cowan.
2010-04-28 18:19:16 +00:00
Micah Cowan
342a47bc77 Avoid crashing in copy-mode during resize, when our history-viewing offset is larger than the new total number of history lines. 2010-04-28 14:29:27 +00:00
Nicholas Marriott
83e1a33ff5 imsg.h does not need sys/tree.h.
ok eric
2010-04-27 21:04:04 +00:00
Nicholas Marriott
d529e7e14e Add a tiled layout, originally from Liam Bedford a while ago, fixed up
by me.
2010-04-25 20:28:13 +00:00
Nicholas Marriott
18ed37622e When converting A-Z into a control character, want to subtract 64 not
65... whoops.
2010-04-23 20:33:08 +00:00
Nicholas Marriott
6769115df2 When converting A-Z into a control character, want to subtract 64 not
65... whoops.
2010-04-23 14:27:04 +00:00
Nicholas Marriott
ec56ec7920 Use INSTALL so people on Solaris can set it to ginstall. 2010-04-23 07:38:36 +00:00
Nicholas Marriott
0c5a964e63 Support NetBSD 6 which will now have its own terminfo (yay). 2010-04-23 07:29:39 +00:00
Tiago Cunha
c4c542efb9 Sync OpenBSD patchset 686:
Mark zombie windows as dead in choose-window list, from Romain Francoise.
2010-04-22 21:51:27 +00:00
Tiago Cunha
2bc150d16d Sync OpenBSD patchset 685:
Rewrite key string conversions to be readable and to work properly for
multiple modifiers.
2010-04-22 21:50:30 +00:00
Tiago Cunha
7163907ab6 Sync OpenBSD patchset 684:
Catch SIGCHLD to avoid a zombie, from patrick keshishian.
2010-04-22 21:48:49 +00:00
Nicholas Marriott
261b6b8615 Mark zombie windows as dead in choose-window list, from Romain Francoise. 2010-04-21 21:41:21 +00:00
Nicholas Marriott
02fc1fe0da Done. 2010-04-21 21:35:07 +00:00
Nicholas Marriott
8e67b07489 Don't set user and group with install, from Nicolas Pinto. 2010-04-21 21:22:06 +00:00
Nicholas Marriott
3ae1b82695 Rewrite key string conversions to be readable and to work properly for
multiple modifiers.
2010-04-21 21:17:33 +00:00
Tiago Cunha
0ed80637e7 Sync OpenBSD patchset 683:
Fix typo in escape state table leading to fatal() when \033} or \033~
was entered, from Chris Johnsen.
2010-04-18 15:11:47 +00:00
Tiago Cunha
b03418fc6b Sync OpenBSD patchset 682:
If remain-on-exit is set, both the error callback and a SIGCHLD could
destroy the same pane (because the first one doesn't remove it from the
list of panes), causing the pane bufferevent to be freed twice. So don't
free it if the fd has already been set to -1, from Romain Francoise.
2010-04-18 15:10:55 +00:00
Nicholas Marriott
67dd5df876 Catch SIGCHLD to avoid a zombie, from patrick keshishian. 2010-04-18 13:41:29 +00:00
Nicholas Marriott
c0f03afbac +. 2010-04-18 07:37:09 +00:00
Nicholas Marriott
622593a77f Fix typo in escape state table leading to fatal() when \033} or \033~
was entered, from Chris Johnsen.
2010-04-17 23:31:09 +00:00
Nicholas Marriott
a6d52405a8 If remain-on-exit is set, both the error callback and a SIGCHLD could
destroy the same pane (because the first one doesn't remove it from the
list of panes), causing the pane bufferevent to be freed twice. So don't
free it if the fd has already been set to -1, from Romain Francoise.
2010-04-17 23:25:16 +00:00
Nicholas Marriott
842bc2b855 Fix use-after-free of the window link when it is part of a grouped
session (and hence could have been recreated), from Micah Cowan.
2010-04-17 23:14:17 +00:00
Tiago Cunha
0646b3caf2 Sync OpenBSD patchset 680:
Remove XXX comment and just close received fd if calloc() fails.

If this happens the imsg may no longer be usable as there may be queued
messages, but this is a) already the case with the code now, and b)
would be the case if recvmsg() fails anyway, so we can document that -1
from imsg_read() invalidates the struct imsgbuf.

discussed with and ok eric
2010-04-12 21:45:18 +00:00
Micah Cowan
b2e752b384 Don't try to use a window-link that may have been freed.
In the case where a join-pane is performed from within a grouped session,
and the source pane had no siblings in the window (causing the window to
be destroyed), there was an invalid access of the destination window
link (which had been destroyed as part of the group session's
resynchronization with the original session, due to killing the
now-empty source window).
CVS: ----------------------------------------------------------------------
CVS: Enter Log.  Lines beginning with `CVS:' are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Modified Files:
CVS: 	cmd-join-pane.c
CVS: ----------------------------------------------------------------------
2010-04-09 07:09:37 +00:00
Nicholas Marriott
08632b4f0a there can be only one rpathbuf 2010-04-08 07:54:43 +00:00
Nicholas Marriott
a2c86dcbf6 Remove XXX comment and just close received fd if calloc() fails.
If this happens the imsg may no longer be usable as there may be queued
messages, but this is a) already the case with the code now, and b)
would be the case if recvmsg() fails anyway, so we can document that -1
from imsg_read() invalidates the struct imsgbuf.

discussed with and ok eric
2010-04-07 18:09:39 +00:00
Nicholas Marriott
10b73b7a11 Sync nit. 2010-04-06 22:08:10 +00:00
Nicholas Marriott
cd0f22b96e Unbreak. Whoops. 2010-04-06 22:02:52 +00:00
Nicholas Marriott
610056abbe Man page sync. 2010-04-06 22:02:03 +00:00
Nicholas Marriott
3743238a86 From Bob Beck:
rather than using an empty "" as the default window title, put the hostname
of the machine we are running on in there.

makes my many green lines easier to deal with without using fiddly options to
set it.
2010-04-06 22:01:32 +00:00
Nicholas Marriott
531db321e3 -s src-pane. 2010-04-06 21:59:59 +00:00
Nicholas Marriott
642f549e4d Dead assignment. 2010-04-06 21:59:37 +00:00
Nicholas Marriott
0fc65537a3 Run job commands explicitly in the global enviroment (which can be
modified with setenv -g) rather than with the environment tmux started
with.
2010-04-06 21:59:19 +00:00
Nicholas Marriott
091db41bc9 Squash a function that is only called in a callback into the
callback function.
2010-04-06 21:58:33 +00:00
Nicholas Marriott
67300e9524 Stupid style nits. 2010-04-06 21:45:36 +00:00
Nicholas Marriott
ac9daf92d7 Merge copy mode and output mode, dropping the latter. Idea and code from
Micah Cowan.
2010-04-06 21:35:44 +00:00
Nicholas Marriott
f2a4ef5260 window-more.c is now defunct. 2010-04-06 10:53:41 +00:00
Nicholas Marriott
7dc1720522 +. 2010-04-05 22:28:56 +00:00
Nicholas Marriott
07dcf8610f FreeBSD kqueue is broken before 8. 2010-04-05 22:28:25 +00:00
Nicholas Marriott
f81190a793 Mention title setting, and the new default. 2010-04-05 17:46:05 +00:00
Micah Cowan
2d74ce1d3a Merge output (more) and copy modes into one single mode (called copy). 2010-04-05 05:11:44 +00:00
Bob Beck
6704c86301 rather than using an empty "" as the default window title, put the hostname
of the machine we are running on in there.

makes my many green lines easier to deal with without using fiddly options to
set it.

ok nicm@
2010-04-04 23:05:15 +00:00
Jason McIntyre
680f920b55 tweak; 2010-04-04 21:23:20 +00:00
Nicholas Marriott
089c33f5be Should be -s for src pane. 2010-04-04 19:12:20 +00:00
Nicholas Marriott
46d5c14b17 Dead assignment, found with clang. 2010-04-04 19:04:09 +00:00
Nicholas Marriott
b02cd35354 Run job commands explicitly in the global enviroment (which can be
modified with setenv -g) rather than with the environment tmux started
with.
2010-04-04 19:02:09 +00:00
Nicholas Marriott
7425122c1c Squash a function that is only called in a callback into the callback
function.
2010-04-04 18:48:37 +00:00
Nicholas Marriott
5879e2a32b libevent needs librt on Linux, from Aaron Isotton. 2010-04-02 21:26:40 +00:00
Nicholas Marriott
1392fba63d Don't accept keys with modifiers as input. Fixes crash reported by Brian
R Landy.
2010-03-31 18:24:08 +00:00
Nicholas Marriott
56481a46bf Don't accept keys with modifiers as input. Fixes crash reported by Brian
R Landy.
2010-03-31 18:05:14 +00:00
Nicholas Marriott
1c6ab725f5 +. 2010-03-29 18:54:07 +00:00
Nicholas Marriott
4012917302 Nuke unused functions. 2010-03-27 15:12:56 +00:00
Nicholas Marriott
dd7abd9b4c -a flag to insert a window after an existing one, moving other windows
up as necessary.
2010-03-27 15:12:11 +00:00
Nicholas Marriott
41f90bd08f Don't leak job command in #(). 2010-03-27 15:06:40 +00:00
Nicholas Marriott
51c776fe93 +. 2010-03-27 13:43:13 +00:00
Nicholas Marriott
d3d85c3df9 -a flag to insert a window after an existing one, moving other windows
up necessary.
2010-03-27 11:46:58 +00:00
Jason McIntyre
d267845cfc dispense with some wacky escape sequences; 2010-03-26 19:30:40 +00:00
Nicholas Marriott
c550e66e85 Dead functions, lint. 2010-03-22 19:18:46 +00:00
Nicholas Marriott
e16b7b8399 Reset output functions too when changing client after attaching, to
avoid crash if a command in a sequence after new/attach causes output.
2010-03-22 19:14:55 +00:00
Nicholas Marriott
9abbe349af paste-buffer should be per pane, from C. Coutinho. 2010-03-22 19:13:28 +00:00
Nicholas Marriott
509ce7f766 Nuke unused variable. 2010-03-22 19:11:54 +00:00
Nicholas Marriott
0ac6efa6d5 Add vi-style "jump" commands for copy mode, from Micah Cowan. 2010-03-22 19:10:42 +00:00
Nicholas Marriott
6f04866044 Support up, down, left, right movement through panes with -UDLR flags to
select-pane.

Also REMOVE the up- and down-pane commands: equivalent behaviour is now
available using -t :.+ and -t :.-.
2010-03-22 19:07:52 +00:00
Nicholas Marriott
021037c419 Accept a full key match (not a partial) even if there is data left in
the buffer.
2010-03-22 19:03:52 +00:00
Nicholas Marriott
4baafd8126 New input parser based on http://vt100.net/emu/dec_ansi_parser. 2010-03-22 19:02:54 +00:00
Nicholas Marriott
9382e546df +. 2010-03-18 21:10:11 +00:00
Nicholas Marriott
659d15786a Reset output functions too when changing client after attaching. 2010-03-18 21:06:40 +00:00
Nicholas Marriott
2307b91ecb paste-buffer should be per pane, from C. Coutinho. 2010-03-18 21:02:41 +00:00
Nicholas Marriott
a2c87eb899 Unused variable. 2010-03-16 23:40:14 +00:00
Nicholas Marriott
33a90efc93 Minor Nazi style tweaks to previous, and man page rephrasery. 2010-03-16 17:51:32 +00:00
Micah Cowan
009d8d2ea7 Jump-forward, jump-backward in copy mode, based on vi's F and f commands. 2010-03-16 17:30:58 +00:00
Nicholas Marriott
aa8f9018ea Support up, down, left, right movement through panes with -UDLR flags to
select-pane.

Also remove up- and down-pane: equivalent behaviour is now available
using -t :.+ and -t :.-.
2010-03-15 22:03:38 +00:00
Nicholas Marriott
4de04fac2c Accept a full key match (not a partial) even if there is data left in
the buffer.
2010-03-15 20:44:51 +00:00
Nicholas Marriott
593bcbdd49 +. 2010-03-15 16:09:49 +00:00
Nicholas Marriott
9f5b9ba0d6 New input parser based on http://vt100.net/emu/dec_ansi_parser. 2010-03-15 12:51:23 +00:00
Nicholas Marriott
b1a3090877 + an item. 2010-03-14 23:46:52 +00:00
Nicholas Marriott
4271320bb7 Quick prioritise for 1.3. 2010-03-14 23:46:09 +00:00
Nicholas Marriott
48dd72005e Fix a use-after-free when cancelling copy mode, or trying to repeat cancel.
ok kettenis
2010-03-14 23:31:23 +00:00
Nicholas Marriott
51eab54102 Avoid use-after-free when cancelling copy mode. 2010-03-14 23:17:59 +00:00
Nicholas Marriott
51c135ed73 +. 2010-03-10 23:32:49 +00:00
Nicholas Marriott
f6d36e60cf Mention dependencies. 2010-03-10 22:13:17 +00:00
Tiago Cunha
38bc7e87c5 Working on 1.3. 2010-03-10 15:44:13 +00:00
Nicholas Marriott
7bc3f5dd8a Permit keys in copy mode to be prefixed by a repeat count, entered with
[1-9] in vi mode, or M-[1-9] in emacs mode.

From Micah Cowan, tweaked a little by me.
2010-03-02 00:32:41 +00:00
Nicholas Marriott
56a33b157b Extend the end-of-line key so that in normal mode a second press moves
the cursor to the end of a wrapped line (if present) and in rectangle
mode it toggles between the end of the text and the last cell on the
line.

From Micah Cowan.
2010-03-01 23:53:27 +00:00
Nicholas Marriott
c7046b9a0c Check for colour and attribute modifications early so the translated
values can be stored in the cached terminal attributes rather than the
requested (untranslated) values. Prevents tmux clearing and setting the
attributes for every character when using aixterm colours.
2010-03-01 22:44:31 +00:00
Nicholas Marriott
6ac3343617 Typo fix from Tim van der Molen. 2010-02-24 19:13:38 +00:00
Nicholas Marriott
f1dd95650b Don't set the terminal to nonblocking on detach until we have finished with it
entirely.
2010-02-24 19:08:39 +00:00
Nicholas Marriott
6767072c9d Option to set the characters considered word separators in copy mode, from
Micah Cowan.
2010-02-22 20:41:16 +00:00
Nicholas Marriott
efbcf8747d In load-buffer, read until EOF rather than using stat() and reading a fixed
size. Allows use of FIFOs and whatnot. From Tiago Cunha, idea from Fulvio
Ciriaco.
2010-02-22 20:33:12 +00:00
Nicholas Marriott
73b8c3ebf3 Another copy mode fix from Micah Cowan: in rectangle copy mode, the cursor
should not wrap at the end of the text on the line but should be allowed to
move freely.
2010-02-22 20:28:21 +00:00
Nicholas Marriott
25211020bf Display -t argument to new-session, from Tiago Cunha. 2010-02-22 20:19:16 +00:00
Nicholas Marriott
24634b6281 have_arg matches buf so it is no longer necessary, spotted by Tim van der
Molen.
2010-02-19 17:14:23 +00:00
Nicholas Marriott
3a89d1ef7f copy mode uses the real screen as backing and if it is updated while copying,
strange things can happen. So, freeze reading from the pty while in copy mode.
2010-02-19 00:03:21 +00:00
Nicholas Marriott
a61b8a2033 Make next-word stop at beginning of word even if it is at the start of the
line, from Micah Cowan.
2010-02-17 21:27:18 +00:00
Nicholas Marriott
c164f5886f Man page additions/improvements, thanks to Robin Lee Powell. 2010-02-17 21:12:06 +00:00
Nicholas Marriott
d285f7fd4d Don't strip add newline if only copying part of wrapped line. Problem spotted
by and fix from Micah Cowan.
2010-02-17 20:58:24 +00:00
Nicholas Marriott
44ded35d5d Add "N" key to search the opposite way from the last search (reverse of "n"),
from Micah Cowan.
2010-02-11 20:39:40 +00:00
Nicholas Marriott
f429057072 Clarify default status-right, from Seth Wright. 2010-02-10 19:17:27 +00:00
Nicholas Marriott
11dedde511 Add an option to disable the smcup/rmcup alternate screen behaviour inside
tmux. From clemens fischer.
2010-02-08 00:14:38 +00:00
Nicholas Marriott
2dc74f2e4d next-layout is bound to Space not C-Space. 2010-02-07 20:33:27 +00:00
Nicholas Marriott
4651180503 Use the array.h code for the causes list. 2010-02-06 23:22:27 +00:00
Nicholas Marriott
bb53c20c18 Support attaching a client read-only with a new -r flag to the attach-session
command.
2010-02-06 22:55:31 +00:00
Nicholas Marriott
0a86d3579e Change nested check to compare server socket path rather than just assuming
that if $TMUX is set it is nested. From Micah Cowan.
2010-02-06 18:47:41 +00:00
Nicholas Marriott
4a5017d1d8 Clean up $TMUX parsing, from Micah Cowan, tweaked by me. 2010-02-06 18:29:15 +00:00
Nicholas Marriott
3ef3802629 Rectangle copy support, from Robin Lee Powell. 2010-02-06 17:35:01 +00:00
Nicholas Marriott
8aba77b7be Instead of bailing out on the first configuration file error, carry on,
collecting all the errors, then start with the active window in more mode
displaying them.
2010-02-06 17:15:33 +00:00
Nicholas Marriott
5e6a7c85cc vi-style B, W and E keys in copy mode to navigate between words treating only
spaces as word separators. Also add . to the list of word separators for
standard word navigation.

From Micah Cowan, tweaked slightly by me.
2010-02-04 20:00:26 +00:00
Nicholas Marriott
e7c6f81016 Read the path from $TMUX if it is present and -L and -S are not given. Based on
a diff from Micah Cowan.
2010-02-04 18:27:06 +00:00
Nicholas Marriott
604b02cfaa Option to display the active pane in a different colour with the display-panes
command. From Paul Hoffman, thanks.
2010-02-04 18:20:16 +00:00
Nicholas Marriott
d6bd9c0e7f Fix divide by zero on small windows with main-* layouts. 2010-02-03 22:24:34 +00:00
Nicholas Marriott
9ffe549ab1 If redrawing line 0 of the screen onto the tty, there can't be a wrap flag on
the previous line, so move the cursor. Fixes status line redraw issues when
resizing in choose mode and hopefully at other times as well.
2010-02-01 23:06:24 +00:00
Nicholas Marriott
06ce9da32a Add scroll-up/scroll-down for choose/more mode, from Micah Cowan. 2010-02-01 22:15:51 +00:00
Nicholas Marriott
c29bfd2ff3 Remove unnecessary comparison, pointed out by Tiago Cunha. 2010-01-31 18:47:03 +00:00
Nicholas Marriott
383c682563 Fix DPADD, from Brad. 2010-01-31 11:11:28 +00:00
Nicholas Marriott
8a37a1cc2d Don't stop parsing command sequences when a command requests the client to
stick around (attach-session/new-session).
2010-01-30 19:08:47 +00:00
Nicholas Marriott
65c9004550 Ignore SIGHUP as well. 2010-01-30 19:05:18 +00:00
Nicholas Marriott
6abd984608 Typo, from Micah Cowan. 2010-01-28 19:09:12 +00:00
Nicholas Marriott
f941879c15 Actually bind the new key to e. 2010-01-27 23:26:14 +00:00
Nicholas Marriott
05213e4c8c Calculate offset correctly, fixes incorrect offset and prevents crash when
status-left is empty. From Micah Cowan.
2010-01-27 20:26:42 +00:00
Nicholas Marriott
3e2cc2d2c4 Alter next-word to have vi-like movement behaviour, and add next-word-end with
the existing emacs behaviour. From Micah Cowan.
2010-01-27 20:18:52 +00:00
Nicholas Marriott
ba6dedbbbd Actually use the copy made when no newline is found, from martynas@. 2010-01-26 21:36:53 +00:00
Nicholas Marriott
f26312ffbf Hugely simplify window_copy_cursor_next_word, which was way overcomplicated. 2010-01-25 22:34:11 +00:00
Nicholas Marriott
e31480cf44 Update the selection properly after goto line or searching. 2010-01-25 21:37:40 +00:00
Nicholas Marriott
1e5a94fdb5 Top/bottom of history mode keys, diff from Micah Cowan, tweaked by me. 2010-01-25 21:33:39 +00:00
Nicholas Marriott
75e13c8977 Redraw properly when scrolling backward and the cursor is on the last
line. Based on a fix from Micah Cowan.
2010-01-24 21:05:12 +00:00
Nicholas Marriott
b9ade6e6bb When a window is destroyed, remove all links to it from each session rather
than just the first. Reported by Robin Lee Powell.
2010-01-23 21:07:31 +00:00
Nicholas Marriott
c0d3e4315c Don't leak if arguments appear multiple times, from Tiago Cunha. 2010-01-23 17:50:56 +00:00
Nicholas Marriott
8865eb2866 Use C-e and C-y for scrolling in vi mode, from Micah Cowan. 2010-01-23 17:49:21 +00:00
Nicholas Marriott
097a501414 Don't leak line, from Tiago Cunha. 2010-01-20 18:30:20 +00:00
Nicholas Marriott
7d75dbbdda Permit !, + and - to be used for window targets to specify last window (!), or
next and previous window by number (+ and -).

Also tidy an if in cmd-new-window.c.
2010-01-19 21:27:47 +00:00
Nicholas Marriott
f569950664 Missing Pp, from Tiago Cunha. 2010-01-18 19:16:04 +00:00
Nicholas Marriott
a4ebd9af33 Document swap-pane -d. 2010-01-14 22:10:47 +00:00
Nicholas Marriott
d5d0a36f66 Permit S- prefix on keys for shift. Relatively few terminals support this
(basically xterm only) and even fewer have them in terminfo (kLFT2 and kRIT2).
2010-01-14 21:53:40 +00:00
Nicholas Marriott
8f301ed62d key should be an int not a char. 2010-01-11 23:46:22 +00:00
Nicholas Marriott
3211bc5f23 $OpenBSD$ not $Id$ 2010-01-08 17:44:27 +00:00
Nicholas Marriott
6789088dce mouse-select-pane has to redraw the borders now too. 2010-01-08 09:14:15 +00:00
Nicholas Marriott
6a45fab608 New command, join-pane, to split and move an existing pane into the space (like
splitw then movep, or the reverse of breakp).
2010-01-07 20:52:18 +00:00
Nicholas Marriott
519c6fc7e7 Fix this properly. 2010-01-07 20:30:02 +00:00
Nicholas Marriott
ac46e87685 Don't return the root cell if the string doesn't match. 2010-01-07 20:28:01 +00:00
Nicholas Marriott
526bb6f3e9 Use the specified pane for size calculations. Doh. 2010-01-07 20:02:01 +00:00
Nicholas Marriott
462a11301a Change split-window to accept a pane target (it should be split-pane but
renaming the command would be annoying).
2010-01-07 19:47:10 +00:00
Nicholas Marriott
ad8509f361 Correctly clear 256-colour flag for aixterm colours. 2010-01-06 23:13:52 +00:00
Nicholas Marriott
739b937b74 Fix selection behaviour when the cursor is moved backwards (ie so the selection
start is after the end).
2010-01-03 17:12:04 +00:00
Nicholas Marriott
7e4f8b45b6 Options to set the colour of the pane borders, with different colours for the
active pane.
2010-01-03 12:51:05 +00:00
Nicholas Marriott
121ba57b55 Use the target print function for copy-mode, spotted by Tiago Cunha. 2010-01-02 22:50:02 +00:00
Nicholas Marriott
9ee979167a Use tcflush(3) instead of TIOCFLUSH, from Ed Schouten. 2010-01-01 14:29:18 +00:00
Nicholas Marriott
a775107f5f Fix the logic so that transition from a 256 colour to default works properly. 2009-12-26 11:02:32 +00:00
Nicholas Marriott
cd9b1b1fd3 Nuke some stray debugging. 2009-12-26 10:39:02 +00:00
Philip Guenther
a3715e7867 Use sysctl() KERN_PROC2 instead of KERN_PROC, as the latter's ABI
is sensitive to changes in struct proc.

fixes for warnings and ok nicm@
2009-12-24 22:29:15 +00:00
Nicholas Marriott
4feee126b8 Fix a couple of problems with grouped sessions reported by danh: redraw
properly and choose the correct last window after a window is killed.
2009-12-22 10:20:08 +00:00
Nicholas Marriott
19ea306606 Allow keys to be replaced and reorder the table so that terminfo-defined keys
(or terminal-overrides) take precedence over internally defined.
2009-12-17 17:39:56 +00:00
Nicholas Marriott
0dda866679 Pass through the aixterm bright colours if the terminal supports them (>= 16
colours).
2009-12-14 21:33:38 +00:00
Nicholas Marriott
84d2e6c8a0 Add server options to completion as well. 2009-12-14 10:47:11 +00:00
Nicholas Marriott
30962cb200 New server option, escape-time, to set the timeout used to detect if escapes
are alone or part of a function key or meta sequence.
2009-12-14 10:43:41 +00:00
Nicholas Marriott
3f58cbaae9 Use quiet variable, and add missing sentinel to options array. 2009-12-11 13:58:48 +00:00
Nicholas Marriott
a4c9a80dac Add "server options" which are server-wide and not bound to a session or
window. Set and displayed with "set -s" and "show -s".

Currently the only option is "quiet" (like command-line -q, allowing it to be
set from .tmux.conf), but others will come along.
2009-12-10 09:16:52 +00:00
Nicholas Marriott
6311bd119e Permit panes to be referred to as "top", "bottom", "top-left" etc, if the right
pane can be identified.
2009-12-08 07:49:31 +00:00
Nicholas Marriott
796eb522ac vte is buggy and doesn't home the cursor after changing the scroll
region. Several people are hitting this, so add a workaround.
2009-12-04 11:01:29 +00:00
Nicholas Marriott
e755475475 Wrap at 80 columns. 2009-12-03 22:54:34 +00:00
Nicholas Marriott
15a64b805e Massive spaces->tabs and trailing whitespace cleanup, hopefully for the last
time now I've configured emacs to make them displayed in really annoying
colours...
2009-12-03 22:50:09 +00:00
Nicholas Marriott
6c9862662f Eliminate duplicate code and ease the passage for server-wide options by adding
a -w flag to set-option and show-options and making setw and showw aliases to
set -w and show -w.

Note: setw and showw are still there, but now aliases for set -w and show -w.
2009-12-03 17:44:02 +00:00
Nicholas Marriott
6bbc92a6f5 Reflect the keypad mode of the application so that numlock works. 2009-12-02 22:13:15 +00:00
Nicholas Marriott
459e9de81a Close the pane if the process died due to a signal, not just if it exited
normally.
2009-12-02 15:06:14 +00:00
Nicholas Marriott
0926a23014 New command, capture-pane, which copies the entire pane contents to a paste
buffer. From Jonathan Alvarado.
2009-12-01 18:42:38 +00:00
Nicholas Marriott
f27fefd7b8 Look for mice and xterm keys before standard function keys as they are less
likely to be partial versions.
2009-12-01 07:59:40 +00:00
Nicholas Marriott
29a5931c6a Handle partial xterm function key sequences. 2009-11-30 16:44:03 +00:00
Nicholas Marriott
2182e1badc Add a couple of comments. 2009-11-27 09:41:03 +00:00
Nicholas Marriott
106ee8f30a This doesn't need to be u_int. 2009-11-26 23:13:47 +00:00
Nicholas Marriott
1acf066fb9 Make types clearer and lint happier. 2009-11-26 22:56:59 +00:00
Nicholas Marriott
e7f4319ac6 Fix type - attributes should be u_char not int. 2009-11-26 22:47:14 +00:00
Nicholas Marriott
c2eb869f72 Change paranoia check to check for <= 0 and to avoid warning. 2009-11-26 22:32:00 +00:00
Nicholas Marriott
8cb410c63c Tidy up various bits of the paste code, make the data buffer char * and add
comments.
2009-11-26 22:28:24 +00:00
Nicholas Marriott
ba5404d93e Continue rather than returning if not a mouse key, to avoid hanging on any
function key...
2009-11-26 22:26:51 +00:00
Nicholas Marriott
4ca857e0e9 Remove a couple of unused arguments where possible, and add /* ARGSUSED */ to
the rest to reduce lint output.
2009-11-26 21:37:13 +00:00
Nicholas Marriott
621dabd44e Rename a variable to something more helpful. 2009-11-26 21:22:31 +00:00
Nicholas Marriott
3e147967e2 Get a u_char from the string, otherwise it isn't possible to enter \0377 as it
is mistaken for EOF (doh).

Also drop an unused argument.
2009-11-26 21:14:30 +00:00
Nicholas Marriott
9c0147915e Handle the possibility of partial mouse reads, and fix a comment while here. 2009-11-26 15:14:03 +00:00
Nicholas Marriott
d31d4c05cf Emulate il1, dl1, ich1 to run (albeit slowly) with vt100 feature set. 2009-11-26 14:46:08 +00:00
Nicholas Marriott
094bca5ac3 Output the right keys for application and number keypad modes (they were the
wrong way round).
2009-11-25 12:24:31 +00:00
Nicholas Marriott
87821fce0e Add a -p flag to display-message to print the output rather than displaying in
the status line, this allows things like "display -p '#W'" to find the current
window index.
2009-11-24 19:16:11 +00:00
Nicholas Marriott
fce47e2e63 Add cursor keys to the key names list. 2009-11-22 22:52:39 +00:00
Nicholas Marriott
9b9d26f80e Use home from struct passwd if HOME is empty as well as if it is NULL, and fix
a style nit. Both from Tiago Cunha.
2009-11-21 17:52:18 +00:00
Nicholas Marriott
58688c48aa When -h and -p are given to split-window, calculate the percentage size using
the width instead of the height.
2009-11-20 19:12:39 +00:00
Nicholas Marriott
5d56225d95 Display UTF-8 properly in status line messages and prompt. Cursor handling is
still way off though.
2009-11-20 07:01:12 +00:00
Nicholas Marriott
070e3b4178 Remove oldest messages from log when limit is hit, not newest. 2009-11-20 06:33:26 +00:00
Nicholas Marriott
2cea9433c2 Get some brackets in the right place so ## works. Also fix a space in a
comment.
2009-11-19 21:30:53 +00:00
Nicholas Marriott
33b337f618 Change status line drawing to create the window list in a separate screen and
then copy it into the status line screen. This allows UTF-8 in window names and
fixes some problems with #[] in window-status-format.
2009-11-19 19:47:28 +00:00
Nicholas Marriott
543fb99bc6 Two new options, window-status-format and window-status-current-format, which
allow the format of each window in the status line window list to be controlled
using similar # sequences as status-left/right.

This diff also moves part of the way towards UTF-8 support in window names but
it isn't quite there yet.
2009-11-19 16:22:10 +00:00
Jason McIntyre
8b8a211185 tweak previous; 2009-11-19 15:00:32 +00:00
Nicholas Marriott
4a38189349 Revert to xterm-keys off by default. It was on as an experiment to see if the
option could be removed, but it affects vi, so we have to keep the option, and
a conservative default is better.
2009-11-19 14:06:33 +00:00
Nicholas Marriott
ed781e84ee Tidy up by breaking the # replacement code into a separate function, also add a
few comments.
2009-11-19 11:38:54 +00:00
Nicholas Marriott
ac5b7d518e Don't interpret #() for display-message, it usually doesn't make sense and may
leak commands.
2009-11-19 10:22:06 +00:00
Nicholas Marriott
8d4eae5662 Missed an unused variable :-/. 2009-11-18 17:03:16 +00:00
Nicholas Marriott
a78cc98c8b Cleanup by moving various (mostly horrible) little bits handling UTF-8 grid
data into functions in a new file, grid-utf8.c, and use sizeof intead of
UTF8_DATA.

Also nuke trailing whitespace from tmux.1, reminded by jmc.
2009-11-18 17:02:17 +00:00
Nicholas Marriott
8db145da1e Add a per-client log of status line messages displayed while that client
exists. A new message-limit session option sets the maximum number of entries
and a command, show-messages, shows the log (bound to ~ by default).

This (and prompt history) might be better as a single global log but until
there are global options it is easier for them to be per client.
2009-11-18 13:16:33 +00:00
Nicholas Marriott
68f5c9c72d Mark -n keys with (no prefix) rather than []. 2009-11-18 10:18:25 +00:00
Nicholas Marriott
a9ca8df8e3 Permit top-bit-set characters to be entered in the status line. They could
already be set from the shell and are just passed through when printing (so
invisible characters or displaying on terminals with different character sets
may cause problems).

Note that entering UTF-8 may not work and in any case currently the status line
cannot display it correctly (outside of status-left/status-right).
2009-11-17 13:30:07 +00:00
Nicholas Marriott
67bf0933e2 In choose mode, assign each item a number or lowercase letter from those
available and accept that as a shortcut key for the item.
2009-11-17 13:06:11 +00:00
Nicholas Marriott
5d7bff4051 A screen can be one cell wide; don't crash if that is the case. 2009-11-16 13:40:45 +00:00
Nicholas Marriott
9f6d685c05 I made a complete horlicks of the last change, fix it so it doesn't either lead
to a double free or free the item after the end of the array.
2009-11-16 11:15:44 +00:00
Nicholas Marriott
10e05f9867 Tweak a comment and add some spacing. 2009-11-13 19:58:32 +00:00
Nicholas Marriott
76ef8770cd Get rid of the ugly CMD_CHFLAG macro and use a const string (eg "dDU") in the
command entry structs and a couple of functions to check/set the flags.
2009-11-13 19:53:28 +00:00
Nicholas Marriott
dafa0f022c Unreachable statement, found by lint. 2009-11-13 18:59:14 +00:00
Nicholas Marriott
390472566c Tidy up and fix some types, prompted by lint via deraadt. 2009-11-13 18:13:18 +00:00
Nicholas Marriott
a18a374d51 imsg_read returns ssize_t not int, pointed out by lint via deraadt. 2009-11-13 18:07:52 +00:00
Nicholas Marriott
8e47966225 Destroy panes immediately rather than checking them all every loop. 2009-11-13 17:33:07 +00:00
Nicholas Marriott
1415eb3dd2 Use winlink_remove() to remove old winlinks when synchronizing grouped sessions
rather than doing it manually and not adjusted the reference count. Fixes
crash seen by Dan Harnett.
2009-11-13 14:47:31 +00:00
Nicholas Marriott
5d397462e4 Zap unused functions, prompted by deraadt. 2009-11-13 07:00:54 +00:00
Nicholas Marriott
5ae542e7ee Emulate the ri (reverse index) capability: this allows tmux to at least start
on Sun consoles (TERM=sun or sun-color), even if there appear to still be
problems on some boxes (my Blade 100 is fine but edd's Blade 1000 shows odd
screen corruption).
2009-11-12 08:05:23 +00:00
Nicholas Marriott
d9deb4b530 Support rxvt-style keys again, but this time: support all the variations, put
them in as raw escape sequences rather than fiddling with the values from
terminfo, put them /after/ the terminfo values so the latter take precedence.
2009-11-12 08:01:02 +00:00
Nicholas Marriott
89763f2ace Rewrite a confusing loop when freeing the arg array on exit and move the check
for argv being NULL, prompted by parfait via deraadt.

Also fix some definite brokenness when assigning multiple environment variables
in arguments (such as "X=1 Y=2").
2009-11-11 18:56:07 +00:00
Nicholas Marriott
9df4e7597d Add an explicit zero-length check for UTF-8 input data, prompted by a report
from parfait via deraadt.

While here, add a statement to set the width when filling with _s if not enough
space (width should never be high enough at the moment anyway), and wrap some
long lines.
2009-11-11 18:53:21 +00:00
Nicholas Marriott
08a8ccf46b Free the pane bufferevent when the fd is closed (the signal could come before
the error callback).
2009-11-11 13:24:42 +00:00
Nicholas Marriott
2756437f4b Only need to chmod +x or -x the socket when a client is created, lost or
attached, rather than every event loop.
2009-11-11 08:00:42 +00:00
Nicholas Marriott
15b9946a40 There is no real standard for modifier plus function keys. Previously, tmux
output some from rxvt but in other ways did the same as xterm or other
terminals, but this is a bit inconsistent.

xterm's method is fairly sensible and we already support it (xterm-keys), so
enable it by default instead.
2009-11-10 18:53:11 +00:00
Nicholas Marriott
d9961f40bf Don't output rxvtisms either. 2009-11-10 18:48:03 +00:00
Nicholas Marriott
05831b52c4 Twiddling the last bit is an rxvtism, so do not support it in the table by
default.
2009-11-10 17:59:34 +00:00
Nicholas Marriott
b92fcf23fd Whoops, this is needed for last commit as well. 2009-11-10 17:41:35 +00:00
Nicholas Marriott
38f64b3da3 Lookup key as a named key (eg 'Space') before checking for single character
keys, makes C-Space/M-Space etc resolve to the correct key code.
2009-11-10 17:24:43 +00:00
Nicholas Marriott
9f47c6083a Don't return 1 unless there was actually a problem (signal/lost server) rather
than for all events (normal exit/detach/etc).
2009-11-10 15:47:48 +00:00
Nicholas Marriott
6609093625 Just ignore tty fd errors rather than dying, stops the server dying if the
session is disconnected abrubtly (eg ssh ~.).
2009-11-09 22:50:29 +00:00
Nicholas Marriott
591fa23f6e The input key should be a u_char. Fixes top-bit-set input problem reported by
ajacoutot@.
2009-11-09 14:40:06 +00:00
Nicholas Marriott
daf150c38d Constify buf. 2009-11-09 11:45:10 +00:00
Nicholas Marriott
f98d13e7dc Don't try enable/disable the event if the window pane is dead (fd == -1), as
the event will have been freed.
2009-11-06 10:42:06 +00:00
Nicholas Marriott
bed8153ba0 Clear to the end of the screen from the right starting point when drawing
line-by-line (in panes or if ed not supported). Fixes problem spotted by Frank
Terbeck.
2009-11-05 22:35:28 +00:00
Nicholas Marriott
297ebb1160 Old xterm F1-F4 are \033O_P not \033[O_P. 2009-11-05 19:35:16 +00:00
Nicholas Marriott
ff55eb5bfa Unused variable. Aargh. 2009-11-05 19:32:34 +00:00
Nicholas Marriott
80e0158112 Switch the tty key tree over to an (unbalanced) ternary tree which allows
partial matches to be done (they wait for further data or a timer to expire,
like a naked escape).

Mouse and xterm-style keys still expect to be atomic.
2009-11-05 19:29:41 +00:00
Nicholas Marriott
05855393f0 key_string_lookup_key uses a static buffer, so copy its output into the working
buffer before calling the command print function which can also use it (eg
send-keys).
2009-11-05 12:04:50 +00:00
Nicholas Marriott
a790e16fa2 Key flags are only used for initialisation so they are not needed in the main
tty_key struct.
2009-11-05 10:44:36 +00:00
Nicholas Marriott
25c604fb1c EVLOOP_ONCE takes care of the wakeup, so no need to call event_loopexit(NULL). 2009-11-05 08:50:32 +00:00
Nicholas Marriott
38e13942ac Now all timers are events, there is no longer any need to wake up every 50 ms -
only wake up when an event happens.
2009-11-05 08:48:15 +00:00
Nicholas Marriott
b58bf49e91 Switch tty key input over to happen on a read event. This is a bit more
complicated because of escape input, but in that case instead of processing a
key immediately, schedule a timer and reprocess the bufer when it expires.

This currently assumes that keys will be atomic (ie that if eg F1 is pressed
the entire sequence is present in the buffer). This is usually but not always
true, a change in the tree format so it can differentiate potential (partial)
key sequences will happens soon and will allow this to be fixed.
2009-11-05 08:45:08 +00:00
Nicholas Marriott
80444436f3 Convert the key repeat timer to an event. 2009-11-05 00:05:00 +00:00
Nicholas Marriott
44d6a2c435 Change window name change to use a timer event rather than a gettimeofday()
check every loop.
2009-11-04 23:54:57 +00:00
Nicholas Marriott
946ed97273 Move status timer check into the global once-per-second timer, this could maybe
be done better but one every second is better than once every 50 ms.
2009-11-04 23:42:51 +00:00
Nicholas Marriott
b1264a7416 Use timeout events for the identify and message timers. 2009-11-04 23:29:42 +00:00
Nicholas Marriott
b3c4956efe Don't reenlist the client imsg event every loop, instead have a small function
to it and call it after the event triggers or after a imsg is added.
2009-11-04 23:12:43 +00:00
Nicholas Marriott
6a6a42aa3a It would help if I read my own comments... make alt keys work again by sending
alt AND the key not alt instead of it.
2009-11-04 23:00:22 +00:00
Nicholas Marriott
862fe15c32 Move some common code into a function. 2009-11-04 22:57:49 +00:00
Nicholas Marriott
fde36fccc3 Tell the client to exit on configuration file error. 2009-11-04 22:47:34 +00:00
Nicholas Marriott
5bebbd81d7 Bye-bye buffer*.c. 2009-11-04 22:44:53 +00:00
Nicholas Marriott
a02c7e804c Convert the window pane (pty master side) fd over to use a bufferevent.
The evbuffer API is very similar to the existing tmux buffer API so this was
remarkably painless. Not many possible ways to do it, I suppose.
2009-11-04 22:43:11 +00:00
Nicholas Marriott
06ffed3216 Call event_init() before loading the config file, since potentially it could
set up events.
2009-11-04 22:40:36 +00:00
Nicholas Marriott
91ad830c88 Switch window pane pipe redirect fd over to a bufferevent. 2009-11-04 22:02:38 +00:00
Nicholas Marriott
7342615c7d Switch tty fds over to a bufferevent. 2009-11-04 21:47:42 +00:00
Nicholas Marriott
abb728684b Add back JOB_PERSIST checks that got lost. 2009-11-04 21:10:49 +00:00
Nicholas Marriott
4d6091379b Switch jobs over to use a bufferevent. 2009-11-04 21:04:43 +00:00
Nicholas Marriott
ea8c8c5f33 A couple of minor cosmetic changes. 2009-11-04 20:59:22 +00:00
Nicholas Marriott
abf3a5d50e Initial changes to move tmux to libevent.
This moves the client-side loops are pretty much fully over to event-based only
(tmux.c and client.c) but server-side (server.c and friends) treats libevent as
a sort of clever poll, waking up after every event to run various things.

Moving the server stuff over to bufferevents and timers and so on will come
later.
2009-11-04 20:50:11 +00:00
Nicholas Marriott
f575e39b0a Unused (but assigned to) variable, found by lint. 2009-11-04 20:35:19 +00:00
Nicholas Marriott
10f58cb1bc Ignore the colour on space, /not/ the attributes. 2009-11-04 15:59:27 +00:00
Nicholas Marriott
a94535f318 Fix the reverse emulation when a terminal doesn't have setab to use the correct
fg/bg (adjusted if spaces) and happen before attribute setting.
2009-11-04 13:34:26 +00:00
Nicholas Marriott
d2dfbef05a Change declaration and use of malloc_options to be more standard, from Tim van
der Molen.
2009-11-04 12:41:43 +00:00
Nicholas Marriott
d8332e6373 Don't backoff based on suspended or deda clients as they are always likely to
have data backed up.
2009-11-04 08:35:11 +00:00
Nicholas Marriott
0785f2872f Add an activity time for clients, like for sessions, and change session and
client lookup to pick the most recently used rather than the most recently
created - this is much more useful when used interactively and (because the
activity time is set at creation) should have no effect on source-file.

Based on a problem reported by Jan Johansson.
2009-11-03 22:40:40 +00:00
Nicholas Marriott
5761ab6b55 If it isn't available explicitly, work out the current client in a similar way
to the current session - build a list of the possibilities then pick the
newest.
2009-11-03 20:59:22 +00:00
Nicholas Marriott
5289da29ba Change session and client activity and creation time members to have more
meaningful names.

Also, remove the code to try and update the session activity time for the
command client when a command message is received as is pointless because it
des not have a session.
2009-11-03 20:29:47 +00:00
Nicholas Marriott
c95f1d1ff9 tv member of struct paste_buffer is updated but not otherwise used, so remove
it.
2009-11-03 17:17:24 +00:00
Nicholas Marriott
01943062b4 Fix vi page up mode key (from naddy), add missing half page keys, and sort. 2009-11-03 06:55:49 +00:00
Nicholas Marriott
86182f33c3 Double the escape timer (the time after a \033 is received before tmux gives up
waiting to see if it is part of a key sequence and passes it through) to 500
ms, the previous setting was too fast. Suggested by naddy.
2009-11-02 20:18:22 +00:00
Nicholas Marriott
1c853c6860 When matching the session names with -t, look for exact matches first before
trying partial matches.

Avoids problems where two ambiguous matches are present before an exact match
(eg foo1, foo2, foo would give an error on trying -tfoo), reported by Natacha
Port? natbsd at instinctive dot eu.
2009-11-02 16:24:29 +00:00
Nicholas Marriott
2a585dc4ed Leftover unused variable :-/. 2009-11-02 13:42:25 +00:00
Nicholas Marriott
42fd44f1db There isn't much point in doing lstat before connect so instead just do connect
and handle ENOENT from it which is a little tidier.
2009-11-02 13:41:25 +00:00
Nicholas Marriott
992dd86309 Reorder slightly to tidy code. 2009-11-02 12:48:44 +00:00
Nicholas Marriott
2f813ef75d Add a flag for jobs that shouldn't be freed after they've died and use it for
status jobs, then only kill those jobs when status-left, status-right or
set-titles-string is changed.

Fixes problems with changing options from inside #().
2009-11-01 23:20:37 +00:00
Nicholas Marriott
32299e4010 Missing setenv/showenv aliases. 2009-11-01 19:17:08 +00:00
Nicholas Marriott
e8b25188ad Missing ;. From eric@ ages ago. 2009-10-29 08:59:17 +00:00
Nicholas Marriott
dc3fdc8dc7 If any client currently displaying a window pane has more than 1 KB of output
buffered, don't accept any further data from the process running in the pane.

This makes tmux much more responsive when flooded with output, although other
buffers can still have an impact when running remotely.

Prompted by a query from Ranganathan Sankaralingam.
2009-10-28 22:53:14 +00:00
Nicholas Marriott
1eaefbf169 Add a minor optimisatin: if the character being printed is space, don't worry
about setting the background colour or attributes (except reverse).
2009-10-28 08:52:36 +00:00
Nicholas Marriott
5730cbf3e3 Twaek this slightly to avoid confusing use of flags variable. 2009-10-28 08:33:20 +00:00
Nicholas Marriott
eb5f4460d1 Setting SGR0 when setting the fg and bg has problems if only one of the two is
meant to be default, so rewrite the code to move this outside, move setting
colours before attributes and generally clean up.

Tested by sthen@, fixes problems he was seeing with mutt and should fix some
existing problems with (rarely) lost attributes.
2009-10-28 08:27:33 +00:00
Nicholas Marriott
37ffdff5ba Move the poll registration functions into the server-*.c files. 2009-10-27 13:03:33 +00:00
Theo Deraadt
ed62d1263c tabs are better; ok nicm 2009-10-26 21:42:04 +00:00
Nicholas Marriott
a8b1379ccb Clear signal flags /before/ taking action and continue afterwards to reduce
chance of dropping signals. Pointed out by deraadt@.
2009-10-26 21:38:18 +00:00
Nicholas Marriott
6b804f3a4a Call fstat() after fopen() rather than stat() before. 2009-10-26 21:25:57 +00:00
Nicholas Marriott
539c73bdb1 Reset the umask right after fopen to avoid leaving it changed on error, noticed
by deraadt@.
2009-10-26 21:13:06 +00:00
Nicholas Marriott
6dc6333323 Use strlcpy instead of strncpy, pointed out by deraadt. 2009-10-26 21:10:24 +00:00
Nicholas Marriott
353f2a2ad4 Don't do anything in the client callback if the client has already died to
avoid a use-after-free (the callback is used twice, once for the client itself
and once for the tty). Fixes crashes seen by Han Boetes.
2009-10-26 20:47:00 +00:00
Nicholas Marriott
53957dcbaa Nuke accidentally-committed debugging statement. 2009-10-26 18:16:32 +00:00
Nicholas Marriott
e831649b64 Not all terminals swap CSI and SS3 on ctrl, so remove that.
Also mark the rxvt special-cases as such until terminfo is updated to have
kLFT5, kRIT5 etc.
2009-10-26 17:59:46 +00:00
Nicholas Marriott
fd2ef18a70 Rewrite xterm-keys code (both input and output) so that works (doesn't always
output the same modifiers, accepts all the possible input keys) and is more
understandable.
2009-10-26 17:46:33 +00:00
Nicholas Marriott
c92c2bfb10 Support the (mostly new) function key+modifier caps (kIC-kIC7). Most of these
will be caught (soon) by the xterm keys code in xterm itself but some other
descriptions such as rxvt define them as well.
2009-10-26 16:00:51 +00:00
Nicholas Marriott
bbca6fe5b0 On second thoughts, drop the rxvt output entirely. 2009-10-26 14:30:57 +00:00
Nicholas Marriott
5cce40d4c3 Set the output code for ctrl+cursor keys correctly, and disable (comment)
rxvt-style output.
2009-10-26 14:27:13 +00:00
Nicholas Marriott
d0aa883e07 As we always put the cursor keys into application mode, assume keys sent
with CSI have ctrl.

Also add a couple of comments.
2009-10-26 13:58:02 +00:00
Nicholas Marriott
fcd3b260ac Tidy up table. 2009-10-26 13:41:46 +00:00
Nicholas Marriott
a0ec4a11ee Drop INPUTKEY_CTRL and just handle it as part of the table. 2009-10-26 13:34:26 +00:00
Nicholas Marriott
25d2000625 Add or fix some comments. 2009-10-26 13:29:24 +00:00
Nicholas Marriott
b3604dcf83 Tidy up table. 2009-10-26 13:22:30 +00:00
Nicholas Marriott
db4452d307 Rename keypad keys to something more useful. 2009-10-26 13:13:33 +00:00
Nicholas Marriott
10a656eedb Remove the xterm-keys code which is broken (a replacement is coming but some
more cleanup is needed first).
2009-10-26 13:02:53 +00:00
Nicholas Marriott
3c9619bb0a Don't try to continue processing a client if the session has been destroyed. 2009-10-25 22:00:15 +00:00
Nicholas Marriott
48b6d18e7f Remove -d from tmux.1 as well. 2009-10-25 21:12:15 +00:00
Nicholas Marriott
3a7636ff0f Remove the -d flag to tmux and just use op/AX to detect default colours.
Irritatingly, although op can be used to tell if a terminal supports default
colours, it can't be used to set them because in some terminfo descriptions it
resets attributes as a side-effect (acts as sgr0) and in others it doesn't, so
it is not possible to determine reliably what the terminal state will be
afterwards. So if AX is missing and op is present, tmux just sends sgr0.

Anyone using -d for a terminal who finds they actually needed it can replace it
using terminal-overrides, but please let me know as it is probably an omission
from terminfo.
2009-10-25 21:11:21 +00:00
Nicholas Marriott
5bed597e61 +time.h. 2009-10-25 17:51:07 +00:00
Nicholas Marriott
7b4f0398c3 [ is a punctuation character and should be escaped with Ql. Although the
current groff version we have seems to handle it fine, other versions are not
so tolerant.
2009-10-25 01:10:57 +00:00
Nicholas Marriott
385236e967 Bring a comment into line with reality. 2009-10-24 21:18:33 +00:00
Nicholas Marriott
df818c1b69 -a option to kill all except current pane. From Tiago Cunha, thanks! 2009-10-24 10:12:39 +00:00
Nicholas Marriott
c2b8f3b55a Support the bright fg/bg colour SGR 90-97 and 100-107.
Reported by Tim Allen.
2009-10-23 15:48:39 +00:00
Nicholas Marriott
1f22a199fb Redraw checks have to after handling input or pane redraw flags set by key
presses will not be acted on.
2009-10-22 21:01:52 +00:00
Nicholas Marriott
9c40a4edc5 The client buffers have to be checked after every event in order to catch the
escape timers and properly reset the cursor.
2009-10-22 20:04:21 +00:00
Nicholas Marriott
eddcc3dfa9 Split the server code handling clients, jobs and windows off into separate
files from server.c (merging server-msg.c into the client file) and rather than
iterating over each set after poll(), allow a callback to be specified when the
fd is added and just walk once over the returned pollfds calling each callback
where needed.

More to come, getting this in so it is tested.
2009-10-22 19:41:51 +00:00
Nicholas Marriott
fd35b6f836 Only redraw the pane when changing mode, not the entire window. 2009-10-22 12:30:00 +00:00
Nicholas Marriott
eb0c33cba4 Merge prepare_cmd into main as it is short and only called once. 2009-10-22 10:04:07 +00:00
Nicholas Marriott
284b94662a Tidy identify message send into a separate function. 2009-10-21 21:11:55 +00:00
Nicholas Marriott
d69b364b5f Don't try to unsuspend a client if it isn't suspended. 2009-10-21 20:16:40 +00:00
Nicholas Marriott
90ad041fa5 Client tidying: get rid of client_ctx struct in favour of two variables in
client.c, and move the functions in client-fn.c into other files.
2009-10-21 20:11:47 +00:00
Nicholas Marriott
59e667906f Unused variable. 2009-10-21 19:27:09 +00:00
Nicholas Marriott
a22c06a2d6 Remove unused function. 2009-10-21 18:20:16 +00:00
Nicholas Marriott
9a4855295b Nuke dead store. 2009-10-21 18:12:31 +00:00
Nicholas Marriott
dd46f634fe Now we are correctly not redrawing the whole pane on linefeed, redo the
last-cursor-position code to move to the right position when panes reach EOL.
2009-10-21 16:52:30 +00:00
Nicholas Marriott
af2b0f452c Tweak descriptions for up/down pane to be clearer. 2009-10-21 13:48:27 +00:00
Nicholas Marriott
9b5da97e6f Don't redraw the scroll region on linefeed/reverse index unless it is necessary
(the cursor is at the bottom/top). Should fix slow cursor movement when using
vi in a pane spotted by pirofti@.
2009-10-21 13:42:44 +00:00
Nicholas Marriott
683ddbc466 Some terminals don't correctly clear their let's-wrap flag after changing the
scroll region (which moves the cursor to 0,0). This means that if the cursor
was at the edge of the screen, any further output after scroll region change
incorrectly causes a line wrap. Add a workaround to move the cursor to position
0 if it is at the screen edge before changing scroll region.
2009-10-21 09:36:53 +00:00
Nicholas Marriott
7825871d6a Getting the read and write ends of the pipe the right way round is usually
recommended. DOH.
2009-10-21 07:24:23 +00:00
Nicholas Marriott
9afb0d739e %zu not %u, doh. 2009-10-20 22:17:33 +00:00
Nicholas Marriott
6f2169037e Sort out stdout before stdin/stderr in case the stdout side of the pipe got one
of their fds.
2009-10-20 22:15:32 +00:00
Nicholas Marriott
480f5d3184 Correctly nuke the EOL $ marker when scrolling, reported by martynas@, thanks. 2009-10-20 21:35:25 +00:00
Nicholas Marriott
1af09d6330 Try to reduce the UTF-8 mess.
Get rid of passing around u_char[4]s and define a struct utf8_data which has
character data, size (sequence length) and width. Move UTF-8 character
collection into two functions utf8_open/utf8_append in utf8.c which fill in
this struct and use these functions from input.c and the various functions in
screen-write.c.

Space for rather more data than is necessary for one UTF-8 sequence is in the
utf8_data struct because screen_write_copy is still nasty and needs to reinject
the character (after combining) into screen_write_cell.
2009-10-20 19:18:28 +00:00
Nicholas Marriott
62f234ce3b UTF-8 combined character fixes.
Thai can have treble combinations (1 x width=1 then 2 x width=0) so bump the
UTF-8 cell data size to 9 and alter the code to allow this.

Also break off the combining code into a separate function, handle any further
combining beyond the buffer size by replacing the character with _s, and when
redrawing the UTF-8 character don't assume the first part has just been
printed, redraw the entire line.
2009-10-20 17:33:33 +00:00
Nicholas Marriott
387f4d42cc Move the check for whether to force a line wrapper lower down into the tty code
where it has access to the tty width, which is what should have been checked.
2009-10-20 16:32:23 +00:00
Nicholas Marriott
d1e6388fed Nuke stray blank line. 2009-10-20 14:22:57 +00:00
Nicholas Marriott
2afe395ff2 Stop updating the screen when not in output mode, stops copy mode getting
confused.
2009-10-19 13:18:13 +00:00
Nicholas Marriott
daa26079ee Always move the cursor position on !xenl terminals, since there is no invisible
last cursor position.

Also nuke an unused variable.
2009-10-17 08:35:38 +00:00
Nicholas Marriott
fe26b5d25f Don't print wide characters at screen width - 1. Matches uterm behaviour and
is probably a better idea anyway.
2009-10-17 08:32:18 +00:00
Nicholas Marriott
43d62c1ae3 Instead of having a complicated check to see if the cursor is in the last
position to avoid an explicit wrap, actually move it there.

Some UTF-8 fixes to come.
2009-10-17 08:24:46 +00:00
Nicholas Marriott
70355021d8 When checking whether the region will scroll and the cursor position is thus
unsuitable for using CUD/CUU, check the current cursor position not the target
position.
2009-10-16 19:09:40 +00:00
Nicholas Marriott
dba0d54cf5 The pane pty name isn't useful for anything so show the pane number instead. 2009-10-15 07:05:38 +00:00
Nicholas Marriott
1a3c334c75 cmd_find_client shouldn't die when there is an empty slot in the clients
array. DOH.
2009-10-14 20:52:28 +00:00
Nicholas Marriott
adad557499 Don't allow cmd_lookup_client to test clients without a session. 2009-10-14 09:29:10 +00:00
Nicholas Marriott
ad566a86de Move lines into the history when scrolling even if the scroll region is not
the entire screen.

Allows ircII users to see history, prompted by naddy.
2009-10-13 15:38:37 +00:00
Nicholas Marriott
71dc6e04e8 Handle DECCOLM by just emulating its side-effect of clearing the screen. 2009-10-13 15:23:13 +00:00
Nicholas Marriott
38df960e68 Add mode keys to move the cursor to the top, middle and bottom of the screen.
H/M/L in vi mode and M-R/M-r in emacs (bottom of screen not bound in emacs).
2009-10-13 13:45:56 +00:00
Nicholas Marriott
0907ca1931 Do this in a better way - print messages when exiting with nonzero.
Also remove the login shell information from server-info, only the client
should care about it.
2009-10-13 13:15:26 +00:00
Nicholas Marriott
760e39e405 Don't print exit messages when used as a login shell, requested by martynas@ a
while back.
2009-10-13 13:11:06 +00:00
Nicholas Marriott
5d78371628 Don't try to use \n across scroll region when doing \r\n either. 2009-10-13 08:37:15 +00:00
Nicholas Marriott
9294cb099f When a session is unattached, reset its activity timer to prevent it locking
instantly when reattached.
2009-10-13 06:14:08 +00:00
Nicholas Marriott
4dcb5040a0 Instead of using something sort of similar for both newline checks, use
something the same. Doesn't fix the bug I'm looking for though :-/.
2009-10-13 00:44:16 +00:00
Nicholas Marriott
d7626cd9d7 When drawing lines that have wrapped naturally, don't force a newline but
permit them to wrap naturally again. This allows terminals that use this to
guess where lines start and end for eg mouse selecting (like xterm) to work
correctly.

This was another long-standing issue raised by several people over the last
while.

Thanks to martynas@ for much testing. This was not trivial to get right so
bringing it in for wider testing and adn to fix any further glitches in-tree.
2009-10-12 17:19:47 +00:00
Nicholas Marriott
8608c6970d When backspace is received at the beginning of a line and the previous line was
wrapped, move the cursor back up to the end of the previous line.

Another one of the forgotten persons requested this quite a while ago (I need
to start noting names on todo items...) when it was quite hard to
implement. Now it is easy and I don't see it can do any harm, so hey presto...
2009-10-12 16:59:55 +00:00
Nicholas Marriott
693b3d03e6 Don't run through the column unchanged case if the row was unchanged but there
were no suitable optimisations, instead make it an else to fall through to
absolute addressing.
2009-10-12 16:41:02 +00:00
Nicholas Marriott
eb9826f65d If the vertical cursor movement crosses the scroll region, CUU and CUD
shouldn't be used even if VPA isn't present - in that case CUP should be used.
2009-10-12 16:37:43 +00:00
Nicholas Marriott
56157444de Wrap a couple of long lines. 2009-10-12 16:33:39 +00:00
Nicholas Marriott
0aab5811ca Use absolute movement if right at the end of the line as it isn't a reliable
place to move from relatively.
2009-10-12 14:54:19 +00:00
Nicholas Marriott
687c4a9fab Use relative cursor movement instead of absolute when possible and when
supported by the terminal to reduce the size of the output data (generally
about 10-20%).
2009-10-12 13:01:18 +00:00
Nicholas Marriott
33ae063cae Permit attributes to be turned off in #[] by prefixing with "no", for example
"noblink".
2009-10-12 11:08:02 +00:00
Nicholas Marriott
762459954f Similarly add a tty_cursor_pane function to tidy up most of the calls. 2009-10-12 09:29:58 +00:00
Nicholas Marriott
972a6f5656 _absolute is redundant, just use tty_region. 2009-10-12 09:16:59 +00:00
Nicholas Marriott
f05b32f7ad Cleanup: use two functions for region setting, one for absolute and one inside
pane.
2009-10-12 09:09:35 +00:00
Nicholas Marriott
0a2a354499 Like linefeed, don't set the scroll region for reverse index unless it will be
needed.

While here, also tidy up a couple of long lines and remove an extraneous blank.
2009-10-11 22:35:10 +00:00
Jason McIntyre
b4ef3e5071 punctuation fix; 2009-10-11 14:12:10 +00:00
Nicholas Marriott
fbb030d7f7 Set the current window pointer to NULL when killing a winlink that is to be
replaced with link-window -k. This prevents it being pushed onto the last
window stack and causing a use-after-free.

Only took me an hour to find this :-/...
2009-10-11 10:39:27 +00:00
Nicholas Marriott
64b5f39656 Add a pipe-pane command to allow a pane to be piped to a shell command, for
example:

	pipe-pane 'cat >~/out'

No arguments stops outputing and closes the pipe; the -o flag toggles a pipe
and on and off (useful for key bindings).

Suggested by espie@.
2009-10-11 10:04:27 +00:00
Nicholas Marriott
325e20d76d Convert if-shell over to the background job framework as well. 2009-10-11 09:10:57 +00:00
Nicholas Marriott
88f3ffe86e Remove a debugging leftover and add copyright. 2009-10-11 09:04:33 +00:00
Nicholas Marriott
cebc988dd4 Switch run-shell over to queue the command in the background like #(). 2009-10-11 08:58:05 +00:00
Nicholas Marriott
abedfa77da There isn't much point in having a free function if it isn't used.
Also allow a NULL tree.
2009-10-11 07:30:07 +00:00
Nicholas Marriott
ff4b4e667a Collect status from dead jobs and don't invoke the callback until both
all input (the socket is closed) and status is available.
2009-10-11 07:20:16 +00:00
Nicholas Marriott
4bc0f6e7e9 Clean up by introducing a wrapper struct for mouse clicks rather than passing
three u_chars around.

As a side-effect this fixes incorrectly rejecting high cursor positions
(because it was comparing them as signed char), reported by Tom Doherty.
2009-10-11 07:01:10 +00:00
Nicholas Marriott
f68ade7b1d Braek some bits out of server_fill_client() that aren't really related to
polling into their own function.
2009-10-11 00:53:14 +00:00
Nicholas Marriott
095ecf2d90 Put all jobs on a global all_jobs list and use that in server.c instead of
running through all the clients.
2009-10-10 18:42:14 +00:00
Nicholas Marriott
b7c364a853 -scroll mode which is dead. 2009-10-10 17:39:55 +00:00
Nicholas Marriott
5aa49e695e Split list-panes off from list-windows. 2009-10-10 17:19:38 +00:00
Nicholas Marriott
2988c594cc Accept key and mouse input for keys in zombified windows if they are in a mode.. 2009-10-10 15:29:34 +00:00
Nicholas Marriott
9ed62eeb91 When a window is zombified and automatic-rename is on, append [dead] to the
name.
2009-10-10 15:23:13 +00:00
Nicholas Marriott
6bca92db4d Rather than running status-left, status-right and window title #() with popen
immediately every redraw, queue them up and run them in the background,
starting each once every status-interval. The actual status line uses the
output from the last run.

This brings several advantages:

- tmux itself may be called from inside #() without causing the server to hang;
- likewise, sleep or similar doesn't cause the server to block;
- commands aren't run excessively often when redrawing;
- commands shared by status-left and status-right, or used multiple times, will
  only be run once.

run-shell and if-shell still use system()/popen() but will be changed over to
use this too later.
2009-10-10 15:03:01 +00:00
Nicholas Marriott
4658c063d5 New option, mouse-select-pane. If on, the mouse may be used to select the
current pane.

Suggested by sthen@ and also by someone else ages ago who I have forgotten.
2009-10-10 14:51:16 +00:00
Nicholas Marriott
3a20a05a49 There is no point setting the scroll region up for line feeds unless scrolling
is actually going to happen, so don't.
2009-10-10 10:36:46 +00:00
Nicholas Marriott
9dd72b9583 Add "grouped sessions" which have independent name, options, current window and
so on but where the linked windows are synchronized (ie creating, killing
windows and so on are mirrored between the sessions). A grouped session may be
created by passing -t to new-session.

Had this around for a while, tested by a couple of people.
2009-10-10 10:02:48 +00:00
Nicholas Marriott
b7d031cc92 Support for individual session idle time locking. May be enabled by turning off
the lock-server option (it is on by default). When this is off, each session
locks when it has been idle for the lock-after-time setting. When on, the
entire server locks when ALL sessions have been idle for their individual
lock-after-time settings.

This replaces one global-only option (lock-after-time) with another
(lock-server), but the default behaviour is usually preferable so there don't
seem to be many alternatives.

Diff/idea largely from Thomas Adam, tweaked by me.
2009-10-10 09:46:11 +00:00
Nicholas Marriott
93b353d353 Instead of passing a struct pollfd ** around through various functions, build
them into a tree and then convert into a flat poll array before and after poll.

This adds a little code but should reduce annoying problems with ordering when
adding new things that also need to be polled.
2009-10-10 09:31:39 +00:00
Nicholas Marriott
bf38a311da The UTF-8 detection idea doesn't work and I am reasonably happy with the
current methods, so remove the (already #ifdef 0'd) code.
2009-10-09 07:33:12 +00:00
Nicholas Marriott
3af09ac946 Add a simple synchronize-panes window option: when set, all input to any pane
that is part of the window is also sent to all other panes in the same
window. Suggested by several, most recently Tomasz Pajor.
2009-10-09 07:27:00 +00:00
Nicholas Marriott
d528184836 Be less aggressive about turning the cursor off, only explicitly turn it off
when tmux is redrawing, otherwise leave in the state set by the application.
2009-10-09 07:23:28 +00:00
Nicholas Marriott
2cb2bb8257 Support J and K for scroll up and scroll down in copy mode with vi keys,
suggested by martynas.
2009-10-07 15:58:40 +00:00
Nicholas Marriott
56ddd3c0b1 Fix comment. 2009-10-07 07:02:40 +00:00
Nicholas Marriott
82efcc32ec Accept ^? for backspace as well as BSpace. 2009-10-06 07:32:26 +00:00
Nicholas Marriott
35ca994ba2 Remove scroll mode which is now redundant, copy mode should be used instead.
The = key binding now does nothing.
2009-10-06 07:19:32 +00:00
Nicholas Marriott
9400fdac77 Make C-Up and C-Down in copy mode scroll the screen up and down one line
without moving the cursor, like Up and Down in scroll mode (which will shortly
disappear).
2009-10-06 07:09:00 +00:00
Nicholas Marriott
4ca2200d83 If no target client is specified to commands which accept one, try to guess the
current client, in a similar manner to how sessions already work: if the
current session can be established and has only one client, use that; otherwise
use the most recently created client.
2009-10-05 18:30:54 +00:00
Jason McIntyre
45043ebf3e tweak previous; 2009-10-04 11:33:35 +00:00
Nicholas Marriott
d42b86d22b Get / and ? the right way round in vi mode, and use : for goto line rather than
g.
2009-10-04 11:18:26 +00:00
Nicholas Marriott
c734789b18 Check for already locked/suspended clients in server_lock_client rather than
its callers.
2009-10-04 10:55:30 +00:00
Nicholas Marriott
205857b232 Add a key string for space ("Space") and document the names, suggested by
guenther@. Also document how to bind " and ', suggested by miod@.
2009-10-04 08:50:05 +00:00
Nicholas Marriott
97ca5711f9 C-v and M-v too. 2009-10-04 08:26:41 +00:00
Nicholas Marriott
123ae9e103 Support C-n/C-p with emacs keys in choice mode, also fix a comment. 2009-10-04 08:23:01 +00:00
Nicholas Marriott
8fa1858a2c New lock-client and lock-session commands to lock an individual client or all
clients attached to a session respectively.
2009-09-24 14:17:09 +00:00
Nicholas Marriott
1764ef81ef Don't allow locked or suspended clients to limit the size of active clients. 2009-09-24 07:02:56 +00:00
Nicholas Marriott
fecf8dc44e Remove PROMPT_HIDDEN code which is now unused. 2009-09-23 14:42:48 +00:00
Nicholas Marriott
9200a0be7a Support -c like sh(1) to execute a command, useful when tmux is a login
shell. Suggested by halex@.

This includes another protocol version increase (the last for now) so again
restart the tmux server before upgrading.
2009-09-23 12:03:30 +00:00
Nicholas Marriott
18ea820cb0 On SIGTERM, just abandon any suspended/locked clients and leave them to it,
otherwise the server will hang around (refusing new connections) until they
exit properly.
2009-09-23 08:21:57 +00:00
Nicholas Marriott
631a618238 Don't die if the client is detaching (the tty has been closed) after waking up
from locking.
2009-09-23 07:25:31 +00:00
Nicholas Marriott
b01dcd7971 Remove the internal tmux locking and instead detach each client and run the
command specified by a new option "lock-command" (by default "lock -np") in
each client.

This means each terminal has to be unlocked individually but simplifies the
code and allows the system password to be used to unlock.

Note that the set-password command is gone, so it will need to be removed from
configuration files, and the -U command line flag has been removed.

This is the third protocol version change so again it is best to stop the tmux
server before upgrading.
2009-09-23 06:18:47 +00:00
Nicholas Marriott
962fa20b36 Trim some code by moving the ioctl(TIOCGWINSZ) after SIGWINCH from the client
into the server.

This is another (the second of four) protocol version changes coming this
morning, so again the server should be killed before upgrading.
2009-09-23 06:12:58 +00:00
Nicholas Marriott
64caf59e84 Don't attempt to open() the tty path, rely on the client sending its stdin fd
with imsg and fatal if it doesn't, then set the FD_CLOEXEC flag in tty_init
instead of tty_open to prevent them leaking into child processes if any are
created between the two calls.

This bumps the protocol version, so the tmux server should be killed before
upgrading.
2009-09-23 06:05:02 +00:00
Nicholas Marriott
0a9005678d Be more careful about what flags are cleared when opening the terminal,
otherwise the opened/started flags are cleared and the terminal never released.
2009-09-22 19:11:52 +00:00
Nicholas Marriott
96dd3e8eb9 Permit multiple prefix keys to be defined, separated by commas, for example:
set -g prefix ^a,^b

Any key in the list acts as the prefix. The send-prefix command always sends
the first key in the list.
2009-09-22 12:38:10 +00:00
Nicholas Marriott
6fab9a3e6f Use KEYC_NONE constant instead of 0 on init. 2009-09-21 15:32:06 +00:00
Nicholas Marriott
a448524424 Nuke -i option which isn't used anymore. 2009-09-21 15:25:36 +00:00
Nicholas Marriott
6b37b2d79d Use option print function for info messages as well. 2009-09-21 14:56:03 +00:00
Nicholas Marriott
e3c3d746f7 Move common code from show-options and show-window-options into a function. 2009-09-21 14:46:47 +00:00
Jason McIntyre
b769aa59d3 zap trailing whitespace; 2009-09-21 07:45:10 +00:00
Nicholas Marriott
fc9107a16a Drop tiny union from option struct. 2009-09-21 07:00:09 +00:00
Nicholas Marriott
c7a8db5543 Key options were implemented as a number so these struct members are unused. 2009-09-21 06:55:06 +00:00
Nicholas Marriott
14ebcab5b0 run-shell command to run a shell command without opening a window, sending
stdout to output mode.
2009-09-20 19:15:01 +00:00
Nicholas Marriott
105ce36792 Nuke unused variables and fix stupid error message. 2009-09-20 17:31:26 +00:00
Nicholas Marriott
9b5f5ed8e8 Move some common and untidy code for window link/unlink into generic functions
instead of duplicating it in move/link window..
2009-09-20 17:27:18 +00:00
Nicholas Marriott
273f1b385c Regularise some fatal messages. 2009-09-20 14:58:12 +00:00
Nicholas Marriott
63d499f480 New option, set-titles-string, to allow the window title to be specified (as
for status-left/right) if set-titles is on. Also only update the title when the
status line is being redrawn.
2009-09-18 15:19:27 +00:00
Nicholas Marriott
5c60162e3c Rather than constructing an entire termios struct from ttydefaults.h, just let
forkpty do it and then alter the bits that should be changed after fork. A
little neater and more portable.
2009-09-16 12:35:04 +00:00
Jacek Masiulaniec
a6dd9e8e7e Enclose repeated buffer draining code in a new msgbuf_drain()
function, which is additionally exported for use by others.

From nicm@, who reminded me that tmux is now using buffer.c, too.
2009-09-15 18:12:51 +00:00
Nicholas Marriott
4278199101 Stick line length to what is actually used (removing an optimization that
allowed it to be bigger), and use clear line/EOL sequences rather than spaces
in copy/scroll mode.

This fixes xterm copy/paste from tmux which treats trailing spaces differently
from clearing a line with the escape sequences. Reported by martynas@.
2009-09-15 15:14:09 +00:00
Nicholas Marriott
f39865e8e4 The default terminal size should be 80x24, not 80x25. 2009-09-15 07:45:16 +00:00
Nicholas Marriott
8548624676 Nuke unused server_client_index function, pointed out by martynas@. 2009-09-14 11:25:35 +00:00
Nicholas Marriott
8a873b97a3 Doh, trim variables unused now. 2009-09-12 13:09:43 +00:00
Nicholas Marriott
8cb8a0da8d Tidy some common code for destroying sessions into a new function. 2009-09-12 13:01:19 +00:00
Nicholas Marriott
d771614d33 tmux always outputs \177 for backspace, so explicitly set VERASE to \177 for
new windows.
2009-09-12 09:54:34 +00:00
Nicholas Marriott
372a8cb1d9 Permit options such as status-bg to be configured using the entire 256 colour
palette by setting "colour0" to "colour255".
2009-09-10 17:16:24 +00:00
Nicholas Marriott
3f3b01c7ce While the display-panes indicator is on screen, make the number keys select the
pane with that index.
2009-09-07 21:12:12 +00:00
Nicholas Marriott
51c95747d8 Reference count clients and sessions rather than relying on a saved index for
cmd-choose-*.
2009-09-07 21:01:50 +00:00
Matthias Kilian
e323f6620d Tiny cleanup.
ok nicm@
2009-09-07 19:08:45 +00:00
Nicholas Marriott
ccba613e5b Give each paste buffer a size member instead of requiring them to be
zero-terminated.
2009-09-07 18:50:45 +00:00
Nicholas Marriott
e97006b102 Permit embedded colour and attributes in status-left and status-right using new
#[] special characters, for example #[fg=red,bg=blue,blink].
2009-09-07 10:49:32 +00:00
Nicholas Marriott
ffab22bb35 Only redraw all clients once when the backoff timer expires rather than every
second all the time.

Reported by Simon Nicolussi.
2009-09-05 17:42:16 +00:00
Nicholas Marriott
83af55bed4 Tidy main and make it a bit easier to read. 2009-09-04 15:15:24 +00:00
Nicholas Marriott
be0d6faa15 Tell the user when sleeping due to password backoff. 2009-09-04 13:29:10 +00:00
Nicholas Marriott
751a2fa915 Fix a race condition when asking a client to take over the terminal (switching
to a different poll loop):

If a MSG_READY was followed very quickly by a MSG_EXIT (for example if doing
"tmux new 'exit'"), both messages could be read as part of the same imsg_read
in the first client poll loop. The MSG_READY would then cause a switch to the
second client loop, which would immediately call poll(2) again, causing the
client to hang forever waiting for an exit message that it already had.

Change to call imsg_get to process any existing messages before polling.
2009-09-02 23:49:25 +00:00
Nicholas Marriott
81a457e6fb When shutting down the server, expect clients to be polite and exit when asked
with the right message.
2009-09-02 21:25:57 +00:00
Nicholas Marriott
459abafcea That was the wrong fix. MSG_ERROR should set the error and the client should
use the error and exit on MSG_EXIT (it was being handled in the default
case). Undo the last change, move the errstr check into the MSG_EXIT case, and
add a comment.
2009-09-02 20:15:49 +00:00
Nicholas Marriott
7a4bac82d7 Set exittype for error exit as well as the error string. 2009-09-02 20:00:10 +00:00
Nicholas Marriott
74c35c513e Accept -l to make it easier for people who use tmux as a login shell to use
$SHELL. Originally from martynas@, tweaked by me.
2009-09-02 17:34:57 +00:00
Nicholas Marriott
c5ac2579ba When incorrect passwords are entered, behave similarly to login(1) and backoff
for a bit. Based on a diff from martynas@.
2009-09-02 16:38:35 +00:00
Nicholas Marriott
61b7dc522d Add a transpose-chars command in edit mode (C-t in emacs mode only). From Kalle
Olavi Niemitalo.
2009-09-02 06:33:20 +00:00
Nicholas Marriott
c089e19020 If forking a login shell or if SHELL is otherwise not useful, set it to the
default shell. Based on a diff from martynas@.
2009-09-01 14:40:33 +00:00
Nicholas Marriott
7d5e494716 When using tmux as a login shell, there is currently no way to specify a shell
to be used as a login shell inside tmux, so add a default-shell session option.
This sets the shell invoked as a login shell when the default-command option is
empty.

The default option value is whichever of $SHELL, getpwuid(getuid())'s pw_shell
or /bin/sh is valid first.

Based on a diff from martynas@, changed by me to be a session option rather
than a window option.
2009-09-01 13:09:49 +00:00
Nicholas Marriott
f8aa5821be Use "Password:" with no space for password prompts and don't display a *s for
the password, like pretty much everything else. From martynas@ with minor
tweaks by me.
2009-09-01 09:11:05 +00:00
Nicholas Marriott
34bb735a65 Sort cases same as getopt argument, from martynas. 2009-09-01 09:00:54 +00:00
Nicholas Marriott
04319964b9 Add a new display-panes command, with two options (display-panes-colour and
display-panes-time), which displays a visual indication of the number of each
pane.
2009-08-31 20:46:19 +00:00
Stefan Sperling
8102ec3be5 squash typo
ok nicm@
2009-08-31 11:52:32 +00:00
Nicholas Marriott
71ede76c68 Don't call tty_free unless the client is a terminal, otherwise tty_init hasn't
been called and it may end up doing close(0). From Kalle Olavi Niemitalo.
2009-08-31 11:37:27 +00:00
Nicholas Marriott
2e5b3ab8bc Initialise the arg2 pointer properly (also free it when freeing the
others). Fixes crashes with J in malloc_options reported by oga.
2009-08-26 18:09:52 +00:00
Nicholas Marriott
ddf97f8289 Make this work when the clock is in small characters as well. Doh. 2009-08-26 16:23:30 +00:00
Nicholas Marriott
1ba5ce9cb3 Fix clock mode in black and white terminals now that tty.c tries to fix
reverse.
2009-08-26 16:16:06 +00:00
Nicholas Marriott
f949107a32 Print -l and -p when showing command, pointed out by Tiago Cunha. 2009-08-25 14:53:22 +00:00
Nicholas Marriott
be16f79438 These should #include <ctype.h>. 2009-08-25 13:32:14 +00:00
Nicholas Marriott
7b847ced4a Add a choose-client command and extend choose-{session,window} to accept a
template. After a choice is made, %% (or %1) in the template is replaced by the
name of the session, window or client suitable for -t and the result executed
as a command. So, for example, "choose-window "killw -t '%%'"" will kill the
selected window.

The defaults if no template is given are (as now) select-window for
choose-window, switch-client for choose-session, and detach-client for
choose-client (now bound to D).
2009-08-25 12:18:51 +00:00
Nicholas Marriott
4f1d81c4ce gcc2 doesn't understand attributes on function pointers. 2009-08-24 08:03:11 +00:00
Nicholas Marriott
90400ae96a Add some other obvious variables to update-environment (WINDOWID SSH_ASKPASS
SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION) so they are updated in the session
environment on new/attach.
2009-08-23 18:21:02 +00:00
Nicholas Marriott
a910b38a35 Some code tidying. 2009-08-23 17:37:48 +00:00
Nicholas Marriott
c7394ac4e0 When using source-file, run the commands in the context of the source-file
command rather than with no context. This makes things like attach work from a
file.
2009-08-23 17:29:51 +00:00
Nicholas Marriott
43cd40e87a The cursession member in struct cmd_ctx is always either curclient->session or
NULL when curclient is also NULL, so just eliminate it.
2009-08-23 16:45:00 +00:00
Nicholas Marriott
1eb303e6d4 Check the return value of strunvis against -1 not NULL. 2009-08-23 11:40:05 +00:00
Nicholas Marriott
926b52b600 Emulate dch/dch1 if missing by redrawing the entire line. 2009-08-21 12:29:59 +00:00
Nicholas Marriott
915a1913e1 Move reading termios settings to before tty_open alters them, and expand the
comment.
2009-08-21 11:36:08 +00:00
Nicholas Marriott
65ac8e9f0c Ugh, committed the wrong version of this change and got both solutions rather
than just the second. Remove unused assignment.
2009-08-21 08:12:05 +00:00
Nicholas Marriott
f817a338d0 When moving up or down in copy mode, save the cursor position and size of the
last line with content (width != 0) and use it to determine if the cursor
should be at the end of the line. Fixes problem of the cursor always jumping to
the end of the line when scrolling past a blank line.
2009-08-21 07:33:58 +00:00
Nicholas Marriott
0198bb6bf3 Fix grid_expand_line so it actually works when the required size is bigger than
2 * the current size.
2009-08-21 07:29:37 +00:00
Nicholas Marriott
1501b3fbbd A few trivial optimisations: no need to check for zero size if calling
buffer_ensure in buffer.c; expand grid lines by a greater increase than one
each time; and don't read UTF-8 data unless it actually needs to be checked
when overwriting a cell.
2009-08-20 19:14:42 +00:00
Nicholas Marriott
234ad54b2c Nuke unused variable. 2009-08-20 10:48:25 +00:00
Nicholas Marriott
bf121f7c60 Handle the device attributes (DA) escape sequence. 2009-08-19 17:00:31 +00:00
Jason McIntyre
c741f2f4a6 tweak previous; 2009-08-19 16:10:26 +00:00
Nicholas Marriott
55336657d4 Don't read beyond the edge of the screen when searching (dies with debug
enabled).
2009-08-19 14:46:56 +00:00
Nicholas Marriott
c41aa49059 Use cfsetispeed/cfsetospeed to set termios speed members. 2009-08-19 14:32:15 +00:00
Nicholas Marriott
3f4418d84d Extend command-prompt with a -p option which is a comma-separated list of one
or more prompts to present in order.

The responses to the prompt are replaced in the template string: %% are
replaced in order, so the first prompt replaces the first %%, the second
replaces the second, and so on. In addition, %1 up to %9 are replaced with the
responses to the first the ninth prompts

The default template is "%1" so the response to the first prompt is processed
as a command.

Note that this changes the behaviour for %% so if there is only one prompt,
only the first %% will be replaced. Templates such as "neww -n '%%' 'ssh %%'"
should be changed to "neww -n '%1' 'ssh %1'".

From Tiago Cunha.
2009-08-19 10:39:50 +00:00
Nicholas Marriott
036de0c5e4 Instead of just checking for an empty buffer, which may not be the case if
there is unconsumed data, save the previous size and use it instead. This means
that activity monitoring should work in this (unlikely) event.

Also remove a debugging statement that no longer seems necessary.
2009-08-18 21:41:13 +00:00
Nicholas Marriott
c488e5e40d Whoops, getting the comparison the right way round is usually recommended. 2009-08-18 21:37:04 +00:00
Nicholas Marriott
8b7be5861e Move another expensive options test to after a cheaper timer check/update. 2009-08-18 21:18:20 +00:00
Nicholas Marriott
fa617467b1 options_get_number() is relatively expensive and a check for dead panes happens
a lot more often than actually finding one, so instead of getting the option
for every check, get it for every dead window found.
2009-08-18 21:14:24 +00:00
Nicholas Marriott
145ba777e8 Now that pane targets (-t) are supported, switch some commands to use them
where it makes sense: clock-mode, copy-mode, scroll-mode, send-keys,
send-prefix.
2009-08-18 16:21:04 +00:00
Nicholas Marriott
dc6271cd79 Tag a few missed printf-like functions and fix a missing "%s". 2009-08-18 14:48:42 +00:00
Nicholas Marriott
003a2e6479 Pass show-buffer output through vis(3) as well, and wrap it to the edge of the
terminal when used from the command line.
2009-08-18 13:08:43 +00:00
Nicholas Marriott
840fff5e5e Change list-buffers to run the preview of the buffer through vis(1). 2009-08-18 12:26:37 +00:00
Nicholas Marriott
1c58b94141 Use the full screen width when printing output rather than one less. 2009-08-18 11:53:03 +00:00
Nicholas Marriott
406fc209ac Nuke unnecessary assignment. 2009-08-18 09:51:51 +00:00
Nicholas Marriott
feaf91ab93 Add a "delete line" key when editing in the status line or the search up/down
prompt. C-u with emacs keys, d with vi.
2009-08-18 07:23:43 +00:00
Nicholas Marriott
c828c2f366 Add (naive) searching and goto line in copy mode. Searching is C-r and C-s with
emacs keys, / and ? with vi; n repeats the search again with either key
set. All searching wraps the top/bottom. Goto line is g for both emacs and vi.

The search prompts don't have full line editing, just simple append and delete
characters.

Also sort the mode keys list in tmux.1.
2009-08-18 07:08:26 +00:00
Nicholas Marriott
e7cd547457 Reset attributes as well as scroll region before poll(2) and add a big comment
explaining why.
2009-08-14 11:23:34 +00:00
Nicholas Marriott
5cf994856f Send SGR0 when initialising the screen. Fixes problems on terminals with BCE
(like putty) if the background colours is non-default when tmux starts. May
also fix problems when resuming a suspended tmux.
2009-08-14 08:53:52 +00:00
Nicholas Marriott
09cbd0c695 Switch the prompt code to return an empty string when the user enters no
response and reserve NULL for an explicit cancel. Change all callbacks to treat
them the same so no functional change.

Also add cancel key bindings to emacs mode which were missing.
2009-08-13 23:44:18 +00:00
Nicholas Marriott
7a359c00ac vi(1)-style half page scroll in copy and scroll modes. Move the vi full page
scroll key to C-b instead of C-u and use C-u/C-d for half page scrolling with
vi keys. In emacs mode, half page scrolling is bound to M-Up and M-Down.

Suggested by merdely (about a year ago :-)).
2009-08-13 22:32:18 +00:00
Nicholas Marriott
39154402e5 Scroll by two less than the number of lines in the screen, like emacs, rather
than by the entire screen, to make it easier to pull things out from under the
line indicator. Suggested by claudio.
2009-08-13 22:11:43 +00:00
Nicholas Marriott
375be90fd1 Disable mode-mouse (mouse in copy/choice mode) by default as it isn't very
useful at the moment and causes confusion.
2009-08-13 21:56:14 +00:00
Nicholas Marriott
3ad4de6c8c Add a base-index session option to specify the first index checked when looking
for an index for a new window.
2009-08-13 20:11:58 +00:00
Nicholas Marriott
3026118c70 Allowing copy mode to scroll left and right is annoying, so limit it to the
real screen width. To indicate the cursor is at the end of the line rather than
the cell before, put a '$' in the last cell.

Also clear the selection when the terminal is resized to avoid tmux getting
confused.
2009-08-13 19:35:20 +00:00
Nicholas Marriott
e2ff51f93f Rather than telling the client to exit in the function when creating a new
session detached, let the caller do it. Allows "tmux new -d \; attach" to work.
2009-08-13 19:16:14 +00:00
Nicholas Marriott
52793e7a3f When creating a new session from the command-line where there is an external
terminal, copy the termios(4) special characters and use them for new windows
created in the new session. Suggested by Theo.
2009-08-13 19:03:59 +00:00
Nicholas Marriott
2e3bb5a511 Redraw the screen after resizing. 2009-08-13 16:48:43 +00:00
Nicholas Marriott
b02e429788 It was originally intended that scroll mode would show content that was
currently off-screen due to resize, but somewhere along the way this got
lost. Restore this behaviour to scroll mode by fixing screen_write_copy to read
up to the saved line length rather than the current screen width. Copy mode
remains unaltered for now.
2009-08-13 16:24:33 +00:00
Nicholas Marriott
7a005b91b3 If the client passes zero for the window size in the identify message (which it
can, for example on serial terminals), reset it to 80x25, same as for resize
messages. Problem reported by kettenis@.
2009-08-13 12:15:45 +00:00
Nicholas Marriott
bc497dbb92 A tty context must not be modified as it may be reused to update multiple
clients, so make it const.

Also fix an actual modification which caused a hang when a session was
connected to multiple terminals at least one of which was missing ich/ich1.
2009-08-12 09:41:59 +00:00
Nicholas Marriott
9a52ef099a When started as the shell, __progname contains a leading -, so hardcode "tmux"
for socket path and log files, and strip it when working out the shell.
2009-08-12 09:14:25 +00:00
Nicholas Marriott
85e8b70625 imsg closes the fd after sending, so dup() STDIN_FILENO before passing it to
the parent, otherwise TIOCGWINSZ will fail when the window is resized (that
could actually be moved into the server but this is more future-proof and
avoids breaking the protocol).
2009-08-12 06:04:28 +00:00
Nicholas Marriott
e0a19abb99 Initialise log_fd to -1, prevents spurious disconnection of the client when it
ends up as fd 0 (likely if the server is started with "tmux start").

Also add some extra debugging messages to server.c.
2009-08-11 22:34:17 +00:00
Nicholas Marriott
4310282a4c Have the client pass its stdin fd to the server when identifying itself and
have the server use that rather than reopening the tty. If the fd isn't given,
use the old behaviour (so no need for a version change).

This allows tmux to be used as the shell, so also change so that when working
out the command to execute if default-command is empty (the default), tmux will
try not execute itself.
2009-08-11 21:28:11 +00:00
Nicholas Marriott
4ec8ade11c Add a TTY_OPENED flag and tidy a little. 2009-08-11 20:29:04 +00:00
Nicholas Marriott
ff65e37545 Drop the no_stop argument to tty_close and tty_free in favour of a flag in the
tty struct.
2009-08-11 19:32:25 +00:00
Nicholas Marriott
f0635717b3 Switch tmux to use imsg. This is the last major change to make the
client-server protocol more resilient and make the protocol versioning work
properly. In future, the only things requiring a protocol version bump will be
changes in the message structs, and (when both client and server have this
change) mixing different versions should nicely report an error message.

As a side effect this also makes the code tidier, fixes a problem with the way
errors reported during server startup were handled, and supports fd passing
(which will be used in future).

Looked over by eric@, thanks.

Please note that mixing a client with this change with an older server or vice
versa may cause tmux to crash or hang - tmux should be completely exited before
upgrading.
2009-08-11 17:18:35 +00:00
Nicholas Marriott
60db6e3df4 Add flags for 1+2 and 2 arguments to the generic target code, use it for
cmd-set-environment/option/window-option and remove the generic options
parsing.
2009-08-11 12:53:37 +00:00
Nicholas Marriott
edcb22a6fb No arguments are the same as new-session and this requires the environment to
be sent, so set that flag too when argc == 0.
2009-08-10 20:51:29 +00:00
Nicholas Marriott
181e1bcffd Reset the attributes after drawing all or part of the screen, and reset the
region before poll(2). This reduces (but does not eliminate) the chance of the
attributes not being normal if tmux is disconnected without warning (ssh ~.,
reboot from inside, etc).
2009-08-10 19:42:03 +00:00
Nicholas Marriott
fa64c1235e Use the right source and destination lines in grid_duplicate_lines. 2009-08-10 17:59:59 +00:00
Jason McIntyre
ec0c33b844 some minor tweaks; ok nicm 2009-08-10 17:14:55 +00:00
Jason McIntyre
de73fed73d zap trailing whitespace; 2009-08-09 16:03:05 +00:00
Nicholas Marriott
d7de29e1e5 Minor language tweaks, change which key bindings are summarised. 2009-08-09 15:25:56 +00:00
Nicholas Marriott
ad18e45206 Nuke a dead variable found with clang and an unused declaration with lint. 2009-08-09 15:17:50 +00:00
Nicholas Marriott
57381aa560 Move the key bindings section to near the start, mention attach/detach in the
first section, and another couple of tweaks. Based on a diff from Theo.
2009-08-09 14:35:15 +00:00
Nicholas Marriott
b3107d26df Don't leak in the (rare) case of an invalid command at the end of a file not
terminated by a \n.
2009-08-09 08:34:17 +00:00
Nicholas Marriott
05f1680efa Use a temporary variable for strdup of const char *. 2009-08-08 21:54:26 +00:00
Nicholas Marriott
6491274f60 Infrastructure and commands to manage the environment for processes started
within tmux.

There is a global environment, copied from the external environment when the
server is started and each sesssion has an (initially empty) session
environment which overrides it.

New commands set-environment and show-environment manipulate or display the
environments.

A new session option, update-environment, is a space-separated list of
variables which are updated from the external environment into the session
environment every time a new session is created - the default is DISPLAY.
2009-08-08 21:52:43 +00:00
Nicholas Marriott
e985629440 Tidy function a little by using a temporary variable. 2009-08-08 21:18:23 +00:00
Nicholas Marriott
90f8151ffd Options to set the colours and attributes for status-left/-right. From Thomas
Adam, thanks.
2009-08-08 20:36:42 +00:00
Nicholas Marriott
92cc3a6914 Handle ttyname(3) failure better. 2009-08-08 16:05:01 +00:00
Nicholas Marriott
06ddd3dcf8 Add a flags member to the grid_line struct and use it to differentiate lines
wrapped at the screen edge from those terminated by a newline. Then use this
when copying to combine wrapped lines together into one.
2009-08-08 15:57:49 +00:00
Nicholas Marriott
5e01b6d663 Change the way the grid is stored, previously it was:
- a two-dimensional array of cells;
- a two-dimensional array of utf8 data;
- an array of line lengths.

Now it is a single array of a new struct grid_line each of which represents a
line and containts the length and an array of cells and an array of utf8 data.

This will make it easier to add additional per-line members, such as flags.
2009-08-08 13:29:27 +00:00
Nicholas Marriott
e89e70e715 If there is an error in the configuration file, don't just exit(1) as this can
cause the client to hang. Instead, send the error message, then mark the client
as bad and start a normal shutdown so the server exits once the error is
written.

This also allows some code duplicating daemon(3) to be trimmed and logging to
begin earlier.

Prompted by Theo noticing the behaviour on error wasn't documented.
2009-08-07 15:39:10 +00:00
Nicholas Marriott
ccaf8724e4 Move introduction section up into description. From jmc. 2009-08-07 12:24:16 +00:00
Nicholas Marriott
04e97e8aef Using the alternative screen (smcup/rmcup) should also preserve the current
colours and attributes. Found thanks to a report from Taylor Venable.

While here also nuke a couple of extra blank lines.
2009-08-07 00:12:13 +00:00
Jason McIntyre
746fe5832a tweak INTRODUCTION; from nicm and myself 2009-08-06 21:06:35 +00:00
Nicholas Marriott
4027335fa9 Clear the codes array earlier as tty_term_free could be called on error. 2009-08-05 19:05:02 +00:00
Nicholas Marriott
bcddddf98d If colours are not supported by the terminal, try to emulate a coloured
background by setting or clearing the reverse attribute.

This makes a few applications which don't use the reverse attribute themselves
a little happier, and allows the status, message and mode options to have
default attributes and fg/bg options that work as expected when set as reverse.
2009-08-05 16:26:38 +00:00
Nicholas Marriott
12ef3ceda1 Add a -a flag to set-option and set-window-option to append to an existing
string value, useful for terminal-overrides.
2009-08-04 18:45:57 +00:00
Jason McIntyre
a0647f1616 restructure the layout of this page, moving the commands into various
subsections; lots of tweaks to come on the text

from nicm and myself
2009-08-04 18:41:28 +00:00
Nicholas Marriott
9e3bb986d5 Show the bell/activity/current status and the window title in the choice list. 2009-08-04 14:28:23 +00:00
Nicholas Marriott
93bf2a1d72 Check for "UTF8" as well as "UTF-8" in LANG etc as it seems this may also
appear.
2009-08-04 10:31:28 +00:00
Jason McIntyre
6b69b93b53 clean up some macro abuse in the commands section; 2009-08-04 07:56:38 +00:00
Nicholas Marriott
189fb08e13 Split the comparison into a function to make this code smaller and more
understandable.
2009-08-03 17:12:07 +00:00
Nicholas Marriott
ac54dee9bb Don't try to free old string values (and crash) when they are overridden unless
they were actually found in the source terminal description. Reported by jmc.
2009-08-03 15:30:16 +00:00
Jason McIntyre
9a391b3320 tweak previous; 2009-08-03 14:34:47 +00:00
Nicholas Marriott
1673735f02 Add a terminal-overrides session option allowing individual terminfo(5) entries
to be overridden. The 88col/256col checks are now moved into the default
setting and out of the code.

Also remove a couple of old workarounds for xterm and rxvt which are no longer
necessary (tmux can emulate them if missing).
2009-08-03 14:10:54 +00:00
Matthieu Herrb
e4bb08e1f5 Fix checking of setupterm(3) error codes. While there include the
name of the terminal type causing the error where relevant. ok nicm@.
2009-08-02 20:47:35 +00:00
Nicholas Marriott
5db47ed53a Pass the ACS border characters through tty_get_acs so they appear correctly on
terminals which don't use the standard set.
2009-07-31 10:12:49 +00:00
Nicholas Marriott
95caeaa5dc Don't leak when rollling buffers off when the paste buffer limit is reached. 2009-07-30 20:50:54 +00:00
Nicholas Marriott
97f105cde2 Plug some memory leaks. 2009-07-30 20:41:48 +00:00
Nicholas Marriott
61f3fc7e4d Don't babysit people and let them try to load /dev/zero or (more useful)
/dev/null if they want.
2009-07-30 17:46:12 +00:00
Nicholas Marriott
8df3035831 Remove some dead code found by clang. 2009-07-30 17:29:12 +00:00
Jason McIntyre
6d86882ed4 tweak previous; 2009-07-30 16:59:24 +00:00
Nicholas Marriott
9f1dd4d0af Similar changes for server_msg_dispatch: use a switch instead of a lookup table
and merge smaller functions inline.
2009-07-30 16:40:12 +00:00
Nicholas Marriott
5f13bb0c3a There aren't many client message types or code to handle them so get rid of the
lookup table and use a switch, merge the tiny handler functions into it, and
move the whole lot to client.c.

Also change client_msg_dispatch to consume as many messages as possible and
move the call to it to the right place so it checks for signals afterwards.

Prompted by suggestions from eric@.
2009-07-30 16:32:12 +00:00
Nicholas Marriott
479d614884 Tell the server when the client gets SIGTERM so it can clean up the terminal
properly, rather than just exiting.
2009-07-30 16:16:19 +00:00
Nicholas Marriott
071494d8fa Merge pane number into the target specification for pane commands. Instead of
using -p index, a target pane is now addressed with the normal -t window form
but suffixed with a period and a pane index, for example :0.2 or
mysess:mywin.1. An unadorned number such as -t 1 is tried as a pane index in
the current window, if that fails the same rules are followed as for a target
window and the current pane in that window used.

As a side-effect this now means that swap-pane can swap panes between different
windows.

Note that this changes the syntax of the break-pane, clear-history, kill-pane,
resize-pane, select-pane and swap-pane commands.
2009-07-30 13:45:56 +00:00
Jason McIntyre
a87228b4ff new sentence, new line; 2009-07-30 13:31:22 +00:00
Nicholas Marriott
a419e73f7a Add a mode-mouse option to prevent tmux taking over the mouse in choice or copy
modes.
2009-07-30 07:04:50 +00:00
Nicholas Marriott
2b331084b4 Add an additional heuristic to work out the current session when run from the
command line. The name of all slave ptys in the server is known, so if the
client was run on a tty, look for any sessions containing that tty and use the
most recently created.

This is more reliable than looking at $TMUX if windows have been moved or
linked between sessions.
2009-07-29 17:03:16 +00:00
Nicholas Marriott
c1d6d7ac6b Rename struct hdrtype to msgtype which is a better name and can be used even
when struct hdr disappears.
2009-07-29 14:17:26 +00:00
Nicholas Marriott
d3c461097b Taking account of the "s, 22 not 24 is the maximum length of #T in status-right
to prevent the date being cut off.
2009-07-29 05:36:53 +00:00
Nicholas Marriott
f596be9950 Final pieces of mode key rebinding: bind-key and unbind-key now accept a -t
argument to modify a table.
2009-07-28 17:05:10 +00:00
Nicholas Marriott
9e5d585ba4 Accept and print "Enter" and "Escape" for keys rather than C-m and C-[. 2009-07-28 09:18:01 +00:00
Nicholas Marriott
86785004ba Next step towards customisable mode keys: build each default table of keys into
a named tree on start and use that for lookups. Also add command to string
translation tables and modify list-keys to show the the mode key bindings (new
-t argument).
2009-07-28 07:03:32 +00:00
Nicholas Marriott
2da4864483 If select-layout is not given an argument, repply the last layout used in the
window, if any.
2009-07-28 06:48:44 +00:00
Nicholas Marriott
309b76fb32 Remove an unused entry in the mode keys command enum and rename
MODEKEYCOPY_QUIT to _CANCEL to match the others.
2009-07-27 20:36:13 +00:00
Nicholas Marriott
d95274c5f2 Change mode key bindings from big switches into a set of tables. Rather than
lumping them all together, split editing keys from those used in choice/more
mode and those for copy/scroll mode.

Tidier and clearer, and the first step towards customisable mode keys.
2009-07-27 19:29:35 +00:00
Nicholas Marriott
13e29dd7b5 Get rid of empty mode_key_free function. 2009-07-27 18:51:46 +00:00
Nicholas Marriott
ad0aad21d5 Add a key to delete to end of line at the prompt (^K in emacs mode, C/D in vi).
From Kalle Olavi Niemitalo.
2009-07-27 12:11:11 +00:00
Nicholas Marriott
fc65da1eed Draw UTF-8 characters under the selection correctly. 2009-07-27 11:33:21 +00:00
Nicholas Marriott
584eda8339 Change previous-word behavior to move to the beginning of the word (matches
emacs and vi). From Kalle Olavi Niemitalo.
2009-07-27 07:42:45 +00:00
Nicholas Marriott
639fbe0392 Detect backspace by looking at termios VERASE and translate it into \177 (which
matches screen's behaviour if not its termcap/terminfo entry). The terminfo kbs
cap is often wrong or missing so it can't be used, and just assuming \177 may
be wrong.
2009-07-26 21:42:08 +00:00
Nicholas Marriott
55d8c01c33 Calculate the space available for the prompt buffer and the cursor position
correctly, and make it work when the screen is not wide enough.

Noticed by Kalle Olavi Niemitalo.
2009-07-26 21:13:47 +00:00
Nicholas Marriott
6b3b852ebc Go to the next if the current best process is replaced, don't keep comparing it
with itself. Also fix process name comparison.
2009-07-26 19:42:26 +00:00
Nicholas Marriott
34a82e7629 Make all messages sent between the client and server fixed size.
This is the first of two changes to make the protocol more resilient and less
sensitive to other changes in the code, particularly with commands. The client
now packs argv into a buffer and sends it to the server for parsing, rather
than doing it itself and sending the parsed command data.

As a side-effect this also removes a lot of now-unused command marshalling
code.

Mixing a server without this change and a client with or vice versa will cause
tmux to hang or crash, please ensure that tmux is entirely killed before
upgrading.
2009-07-26 12:58:44 +00:00
Nicholas Marriott
2bb89bc5bc Set the active pane when respawning a window - fixes problems when respawning a
window with multiple panes.
2009-07-24 19:35:33 +00:00
Nicholas Marriott
133173850c Use the full range of ACS line drawing characters to draw pane borders,
including intersections.
2009-07-24 19:14:38 +00:00
Nicholas Marriott
c6dac5c3c9 cmd_find_index should return -2 on error. 2009-07-24 18:46:40 +00:00
Nicholas Marriott
029599c02c Simplify screen redrawing by drawing the border and background together rather
than border separately, and consolidating all the drawing characters into one
string.
2009-07-24 16:21:42 +00:00
Nicholas Marriott
1d1ea681f0 Accept lowercase c- and m- prefix as well as C- and M-. 2009-07-24 14:57:22 +00:00
Nicholas Marriott
5a1a106637 Permit commands to be bound to key presses without the prefix key first. The
new -n flag to bind-key and unbind-key sets or removes these bindings, and
list-key shows them in []s.
2009-07-24 14:52:47 +00:00
Stuart Henderson
ce4eb6559e up-pane and down-pane no longer auto-repeat; update the description of
repeat-time accordingly. ok nicm@

if you prefer old behaviour;

bind -r Up up-pane
bind -r Down down-pane
2009-07-24 14:50:24 +00:00
Nicholas Marriott
4a04b498db None of the server message functions return anything but 0, so make them all
void.

Also remove a leftover variable in client.c.
2009-07-23 21:19:11 +00:00
Nicholas Marriott
16e017d5a6 Tidy client message return slightly: convert flags into an enum, and merge
error string into struct client_ctx as well.
2009-07-23 20:24:27 +00:00
Nicholas Marriott
ba84ddcf8e Redraw after starting selection to correctly remove any existing selection. 2009-07-23 17:03:47 +00:00
Nicholas Marriott
895171478f Revert r1.5, I don't like it, new sessions should start off identically - with
the defaults.
2009-07-23 15:47:56 +00:00
Nicholas Marriott
e0d1954840 C-d is delete as well in emacs mode. 2009-07-23 13:44:02 +00:00
Nicholas Marriott
96a7cf1e6a Both of cmdclient and curclient CAN be NULL - if the command is executed from
the configuration file. In this case, attach-session can't do much, and
new-session should just assume -d.
2009-07-23 12:33:48 +00:00
Nicholas Marriott
05b511f96a If there is a current session, use its default path and working directory for
the initial window when creating a new session.
2009-07-22 22:47:43 +00:00
Nicholas Marriott
bb14c36a27 Pass a set of flags into client_init rather than just a start_server
variable. Only one flag now but more to come later.
2009-07-22 21:58:56 +00:00
Nicholas Marriott
5ee84436c8 window_add_pane cannot fail, so remove the unused cause argument and don't
bother to check for a NULL return.
2009-07-22 21:34:36 +00:00
Nicholas Marriott
f7df0bac96 Tidy the target parsing code a bit and correct the behaviour so that as before
a string with no colon as a target window is first looked up as a window then
as a session, noted by Iain Morgan.

Also attempt to clarify the description of the target specification in the man
page.
2009-07-22 21:23:29 +00:00
Nicholas Marriott
dd4a3b24fc tty_write is relatively short and the only function left in tty-write.c so move
it into tty.c.
2009-07-22 20:56:58 +00:00
Nicholas Marriott
ddad0be5f7 More tty code tidying: move the saved cursor/region position (from before the
screen was updated) out of struct screen and into struct tty_ctx.
2009-07-22 20:53:38 +00:00
Nicholas Marriott
bb4bab4c26 log_debug3 no longer exists, change the sole use in GRID_DEBUG to log_debug2. 2009-07-22 18:06:58 +00:00
Nicholas Marriott
2ec2837daa enum tty_cmd is only used as an index into the array of command function
pointers, so remove it and use the function pointers directly to represent
themselves.
2009-07-22 18:02:23 +00:00
Nicholas Marriott
6a309c53a8 There are relatively few arguments to tty_cmd_* functions now, so tidy them up
by using a struct rather than hiding everything with varargs.
2009-07-22 16:45:31 +00:00
Nicholas Marriott
5bd72ec629 tty_cmd_raw is only used once, for raw UTF-8 output, so rename it to
tty_cmd_utf8character and eliminate the size argument.
2009-07-22 15:55:32 +00:00
Nicholas Marriott
e43b6a2dd2 Adjust field width to fit longest key when listing. 2009-07-21 22:41:00 +00:00
Nicholas Marriott
3eb6080de3 Remove leftover debug logging of password. 2009-07-21 21:20:07 +00:00
Nicholas Marriott
76a9d98562 Make some functions which return unused values void (mostly found by lint) and
tweak a redundant expression in window_pane_set_mode.
2009-07-21 19:54:22 +00:00
Nicholas Marriott
6945e86fd7 Nix a few unused attributes on arguments which are no longer unused. 2009-07-21 18:52:03 +00:00
Nicholas Marriott
044ebf1952 Remove a couple of unused functions and fix a type ("FALLTHOUGH"), found by
lint.
2009-07-21 18:40:30 +00:00
Nicholas Marriott
b9a179089b __progname is not const, pointed out by deraadt. 2009-07-21 18:38:52 +00:00
Nicholas Marriott
725938fb85 Tidy up keys: use an enum for the key codes, and remove the macros which just
wrap flag sets/clears/tests.
2009-07-21 17:57:29 +00:00
Nicholas Marriott
c6012aaabc Now that #P could be in the status line, flag it for redraw when the active
pane changes.
2009-07-20 19:35:33 +00:00
Nicholas Marriott
c0862dae45 Tweak unbind-key language very slightly. 2009-07-20 15:51:55 +00:00
Nicholas Marriott
54afcfbfb4 Display the number of failed password attempts (if any) when the server is
locked. From Tom Doherty.
2009-07-20 14:37:51 +00:00
Nicholas Marriott
b292f71c49 Add a status-justify option to allow the window list in the status line to be
positioned at the left, centre, or right.
2009-07-20 14:32:09 +00:00
Nicholas Marriott
e32e0d5692 New options, window-status-current-{fg,bg,attr}, to set the fg, bg and
attributes with which the current window is shown in the status line. From
Johan Friis, thanks.
2009-07-20 09:15:18 +00:00
Nicholas Marriott
73732ffa05 Kill some dead stores and fix a null pointer deref, found by clang. 2009-07-20 07:31:10 +00:00
Nicholas Marriott
ff2cc0e387 Move the offsets as well when swapping panes. 2009-07-20 07:13:31 +00:00
Jason McIntyre
550b855c9d tweak previous; 2009-07-19 14:07:47 +00:00
Nicholas Marriott
6036bdd06c Improved layout code.
Each window now has a tree of layout cells associated with it. In this tree,
each node is either a horizontal or vertical cell containing a list of other
cells running from left-to-right or top-to-bottom, or a leaf cell which is
associated with a pane.

The major functional changes are:

- panes may now be split arbitrarily both horizontally (splitw -h, C-b %) and
  vertically (splitw -v, C-b ");
- panes may be resized both horizontally and vertically (resizep -L/-R/-U/-D,
  bound to C-b left/right/up/down and C-b M-left/right/up/down);
- layouts are now applied and then may be modified by resizing or splitting
  panes, rather than being fixed and reapplied when the window is resized or
  panes are added;
- manual-vertical layout is no longer necessary, and active-only layout is gone
  (but may return in future);
- the main-pane layouts now reduce the size of the main pane to fit all panes
  if possible.

Thanks to all who tested.
2009-07-19 13:21:40 +00:00
Nicholas Marriott
fc6a65c620 Add three new session options: visual-activity, visual-bell, visual-content. If
these are enabled (and the monitor-activity, bell-actio and monitor-content
options are configurated appropriately), when activity, a bell, or content is
detected, a message is shown.

Also tidy up the bell/activity/content code in server.c slightly and fix a
couple of errors.
2009-07-18 14:59:25 +00:00
Nicholas Marriott
0ca6f667e3 Make it so using kill-pane to destroy the last pane in a window destroys the
window instead of being an error.
2009-07-17 20:37:03 +00:00
Nicholas Marriott
6f5150a943 - New command display-message (alias display) to display a message in the
status line (bound to "i" and displays the current window and time by
  default). The same substitutions are applied as for status-left/right.
- Add support for including the window index (#I), pane index (#P) and window
  name (#W) in the message, and status-left or status-right.
- Bump protocol version.

From Tiago Cunha, thanks!
2009-07-17 18:45:08 +00:00
Nicholas Marriott
ad006bc6b6 When resizing a screen smaller in alternate screen mode, all the lines needed
could be consumed by deleting from the bottom, leaving none to be removed from
the top. In this case, don't call grid_view_delete_lines with ny of 0 as this
is incorrect and causes a bounds check to fatal error if built with -DDEBUG.
2009-07-17 18:35:11 +00:00
Nicholas Marriott
ce53936a2b Tidy up new-session and attach-session and change them to work from inside
tmux, switching the current client to the new or requested session.

Written with Josh Elsasser.
2009-07-17 15:03:11 +00:00
Nicholas Marriott
1938c994e7 Remove a duplicate key binding, and turn off autorepeat for up/down as it is
kind of annoying by default.
2009-07-17 13:43:07 +00:00
Nicholas Marriott
7ddba901a4 If -u is specified or UTF-8 is otherwise detected when the server is started,
enable the utf8 and status-utf8 optons. While here, note in the man page that
the server is started with the first session and exits when none remain.
2009-07-17 13:38:03 +00:00
Nicholas Marriott
d3b5c242cc Oops, it is always a good idea to get arguments the right way round. 2009-07-17 07:09:46 +00:00
Nicholas Marriott
216df07688 A similar for fix for window_choose: don't rely on the callback always being
called to free data, have a separate free callback and call it from the mode
cleanup code.
2009-07-17 07:05:58 +00:00
Nicholas Marriott
65deba3a35 Memory could be leaked if a second prompt or message appeared while another was
still present, so add a separate prompt free callback and make the _clear
function responsible for calling it if necessary (rather than the individual
prompt callbacks). Also make both messages and prompts clear any existing when
a new is set.

In addition, the screen could be modified while the prompt is there, restore
the redraw-entire-screen behaviour on prompt clear; add a comment as a
reminder.
2009-07-17 06:13:27 +00:00
Nicholas Marriott
9642f0373f Remove some duplicate code that was causing the status line to be redrawn even
when it hadn't changed.
2009-07-16 23:25:21 +00:00
Nicholas Marriott
3e9d9a2119 Fix arguments to switch-client. 2009-07-16 22:50:49 +00:00
Nicholas Marriott
924bf8477f Typo in grid_duplicate_lines (sy for dy) causing it to write into the wrong
place when copying UTF-8 data. Found by Dan Colish.
2009-07-16 07:34:37 +00:00
Nicholas Marriott
92da443a9e Make status_message_set a variadic printf-like function. No functional change -
helpful for a couple of things coming soon.
2009-07-15 17:39:00 +00:00
Nicholas Marriott
780fd8f7a6 Return -1 not NULL on error, pointed out by Roy Marples. 2009-07-15 15:09:17 +00:00
Nicholas Marriott
aa3403a343 Add a -k flag to unlink-window which makes it behave the same as the old
kill-window - if a window is linked into only one session it unlinked and
destroyed.
2009-07-15 08:05:56 +00:00
Nicholas Marriott
9601b72e4c The man page says that kill-window removes the window entirely, unlinking it
from any sessions. In fact the implementation only affected the current
session, making it the same as unlink-window but destroying the window if it
was linked into only one session (unlinkw gives an error). Change the behaviour
to match what it documented and was originally intended.
2009-07-15 08:00:49 +00:00
Nicholas Marriott
ca617d679f Having to update NSETOPTION/NSETWINDOWOPTION when adding new options is a bit
annoying and it is only use for iterating, so use a sentinel to mark the end of
each array instead. Different fix for a problem pointed out by Kalle Olavi
Niemitalo.
2009-07-15 07:50:34 +00:00
Nicholas Marriott
615d85fb23 Add main-pane-height to the options list (was missed before). 2009-07-14 20:20:04 +00:00
Nicholas Marriott
f08c9b2217 For some reason when clearing status/message it was redrawing the entire client
not just the status line. Changing this also revealed the check for the status
line was incorrect when drawing the pane.
2009-07-14 19:11:58 +00:00
Nicholas Marriott
ae2ea52575 Instead of faking up a status line in status_redraw, use the same code to
redraw it as to draw the entire screen, just skip all lines but the last.

This makes horizontal split redraw properly when the status line is off.
2009-07-14 19:03:16 +00:00
Nicholas Marriott
e76caa0017 Don't accept input to a window if it not visible. 2009-07-14 16:52:50 +00:00
Nicholas Marriott
975f516f51 The scroll region cannot be one line only, ignore attempts to make it so. 2009-07-14 14:47:32 +00:00
Nicholas Marriott
fe20c0d89e Get rid of the PANE_HIDDEN flag in favour of a function, and moving the
decision for whether or not a pane should be drawn out of the layout code and
into the redraw code.

This is needed for the new layout design, getting it in now to make that easier
to work on.
2009-07-14 07:23:36 +00:00
Nicholas Marriott
4a9b01eb0d Need time.h not sys/time.h for time(2). 2009-07-14 06:59:06 +00:00
Nicholas Marriott
6910458a92 Add backspace key to named keys. 2009-07-14 06:56:30 +00:00
Nicholas Marriott
ceace9c6bd Since tmux doesn't actually need ncurses, use -lcurses/curses.h
instead. Pointed out by millert a while ago.
2009-07-14 06:30:45 +00:00
Nicholas Marriott
5f108d9df6 Having fixed flags for single-character getopt options is a bit hard to
maintain and is only going to get worse as more are used. So instead, add a new
uint64_t member to cmd_entry which is a bitmask of upper and lowercase options
accepted by the command.

This means new single character options can be used without the need to add it
explicitly to the list.
2009-07-13 23:11:35 +00:00
Jason McIntyre
5d91555c7c zap trailing whitespace; 2009-07-13 20:14:23 +00:00
Nicholas Marriott
cba885a67c Expand leading tildes in arguments, from Tiage Cunha. 2009-07-13 18:49:36 +00:00
Nicholas Marriott
cf411053c7 copy-mode and scroll-mode have a -u flag missing from usage, add it. 2009-07-13 18:44:17 +00:00
Nicholas Marriott
023d8d38ec Tidy up and improve target (-t) argument parsing:
- move the code back into cmd.c and merge with the existing functions where
  possible;
- accept "-tttyp0" as well as "-t/dev/ttyp0" for clients;
- when looking up session names, try an exact match first, and if that fails
  look for it as an fnmatch pattern and then as the start of a name - if more
  that one session matches an error is given; so if there is one session called
  "mysession", -tmysession, -tmysess, -tmysess* are equivalent but if there
  is also "mysession2", the last two are errors;
- similarly for windows, if the argument is not a valid index or exact window
  name match, try it against the window names as an fnmatch pattern and a
  prefix.
2009-07-13 17:47:46 +00:00
Nicholas Marriott
359285928b Support "alternate screen" mode (terminfo smcup/rmcup) typically used by full
screen interactive programs to preserve the screen contents. When activated, it
saves a copy of the visible grid and disables scrolling into and resizing out
of the history; when deactivated the visible data is restored and the history
reenabled.
2009-07-13 10:43:52 +00:00
Nicholas Marriott
0b788a3d61 Missed this declaration in key bindings change. Whoops. 2009-07-12 23:46:49 +00:00
Nicholas Marriott
88555d96d5 Document the -k flag to new-window. 2009-07-12 23:45:03 +00:00
Nicholas Marriott
9e49ec6cd3 Creating a key binding which replaces itself (such as "bind x bind x lsw")
frees the command list bound to the key while it is still being executed,
leading to a use after free. To prevent this, create a dead keys list and defer
freeing replaced or removed key bindings until the main loop when the key
binding will have finished executing.

Found by Johan Friis when creating a key binding to reload his configuration
file.
2009-07-12 17:33:18 +00:00
Nicholas Marriott
22d51ec1ea Add a "back to indentation" key in copy mode to move the cursor to the first
non-whitespace character. ^ with vi and M-m with emacs key bindings. Another
from Kalle Olavi Niemitalo, thanks.
2009-07-12 16:15:34 +00:00
Nicholas Marriott
fa8333eddb Merge three copies of identical code to move the cursor x position into a
single function, from Kalle Olavi Niemitalo.
2009-07-12 16:12:34 +00:00
Nicholas Marriott
22355ce947 If it exist, load a system-wide configuration file /etc/tmux.conf before any
user-specified one.
2009-07-12 16:07:56 +00:00
Nicholas Marriott
bd098c273b Limit the history to hlimit not hlimit - 1. This makes a history-limit setting
of 0 work as expected.
2009-07-11 20:11:18 +00:00
Nicholas Marriott
e415ead361 Add -r to the synopsis of the paste-buffer command, prompted by jmc. 2009-07-11 20:04:19 +00:00
Nicholas Marriott
2f7198246e When pasting, translate \n into \r. This matches xterm and putty's behaviour,
and makes emacs happy when pasting into some modes. A new -r (raw) flag to
paste-buffer pastes without the translation.

From Kalle Olavi Niemitalo, thanks!
2009-07-11 19:14:56 +00:00
Nicholas Marriott
289320a9b1 Copy was using the real line length which after resize can be larger than the
screen width. When built with -DDEBUG, this made the grid bounds checking code
kill the server. Restrict copying to the actual width.

From Kalle Olavi Niemitalo, thanks.
2009-07-11 19:09:24 +00:00
Nicholas Marriott
4cbbbddf22 paste-buffer -d was not documented. From Kalle Olavi Niemitalo. 2009-07-10 19:01:40 +00:00
Nicholas Marriott
9cd5ba40d3 Redraw the status line after renaming a session (it may contain the name). 2009-07-10 17:34:51 +00:00
Nicholas Marriott
4a6d62e401 Don't send initialisation strings is1/2/3 (barely anything else does) and move
smcup to the first and rmcup to the last sequences output to the terminal. This
allows tmux to use the alternate screen (smcup/rmcup) when available.
2009-07-10 07:11:59 +00:00
Nicholas Marriott
daa1faa905 Add a default-terminal option to set the starting value of $TERM in new
windows.

This is "screen" by default and must be either that or something closely
related. This does makes it easier to customise it if necessary.
2009-07-10 05:50:54 +00:00
Nicholas Marriott
25d5734496 Document display-time option which seems to have been missed. 2009-07-10 05:43:01 +00:00
Nicholas Marriott
58361eb965 When the terminal size is reduced horizontally, don't truncate lines to the new
width, so that if the same lines are later increased in size the content
reappears.
2009-07-09 22:48:20 +00:00
Nicholas Marriott
5f2f07ed8a Cursor up and down should be limited by the scroll region (cuu should stop at
the scroll region top if starting from below it and cud stop at the bottom if
starting from above). Fixes another vttest test.
2009-07-09 17:57:11 +00:00
Nicholas Marriott
81181bfb72 New command, if-shell (alias if). Executes the tmux command in the second
argument if the shell command in the first succeeds, for example:

       if "[ -e ~/.tmux.conf.alt ]" "source .tmux.conf.alt"

Written by Tiago Cunha, many thanks.
2009-07-09 15:47:49 +00:00
Nicholas Marriott
24e1327d0d Stop in the right place so all the lines selected are copied. Reported by Kalle
Olavi Niemitalo, thanks.
2009-07-09 15:02:00 +00:00
Nicholas Marriott
29f9d5f335 Don't leak FILE * on malloc failure. From ivoire at users dot sourceforge dot net. 2009-07-09 09:54:56 +00:00
Nicholas Marriott
86c93c6e34 Change inserting and deleting lines inside the scroll region to properly clear
lines that should be inserted/deleted but not moved. Fixes problems with mutt
reported by Brian Lewis, thanks.
2009-07-09 07:58:14 +00:00
Nicholas Marriott
643c219d18 Tidy by removing unused argument from grid_view_{insert,delete}_line_region
functions (currently don't fully work, this is to make fix easier).
2009-07-09 00:29:32 +00:00
Nicholas Marriott
f63761eabc Fix two memory leaks when assigning shell variables in configuration
file/command prompt. From Tiago Cunha.
2009-07-08 16:04:56 +00:00
Nicholas Marriott
8c497ecac0 When reinitialising the screen, do not omit to clear the last line. 2009-07-08 05:56:11 +00:00
Nicholas Marriott
084d07f4eb Just appending -l to $SHELL to create a login shell is wrong: -l is not POSIX,
and some people may use shells which do not support it. Instead, make an empty
default-command option mean a login shell, and fork it with a - in argv[0]
which is the method used by login(1).

Also fix the automatic-rename code to handle this correctly and to strip a
leading - if present.
2009-07-08 05:26:45 +00:00
Nicholas Marriott
b4efd1ca89 Don't let ambiguous commands override an exact alias match: eg if commands
"abc-1", "abc-2", "abc-3" exist and "abc-3" has the alias "abc", "tmux abc"
should execute abc-3, not complain about the command being ambiguous.

Not a problem at the moment but will be soon.
2009-07-07 21:23:22 +00:00
Nicholas Marriott
923ccfa2e8 Rename the global options variables to be shorter and to make session options
clear. No functional change, getting this out of the way to make later options
changes easier.
2009-07-07 19:49:19 +00:00
Nicholas Marriott
474fdebb7a Handle empty or unset TERM correctly; also fix a fatal() message while here. 2009-07-07 17:24:32 +00:00
Nicholas Marriott
9ced016cbc When sending a "protocol mismatch" error message, tell the client to exit
afterwards, otherwise it hangs.
2009-07-07 12:34:47 +00:00
Nicholas Marriott
e538d4adae The fix for default-path (use target session options instead of global options)
is required here as well, doh.
2009-07-07 07:01:10 +00:00
Nicholas Marriott
eb424cf63d Minor fix: look for default-path in the options for the specified session first
rather than just the global options. From Brandon Mercer, thanks.
2009-07-07 06:58:49 +00:00
Nicholas Marriott
69e150b7e3 Add a section summarising how options work, make the distinction between window
and session options clearer, and fix the incorrect synopses and descriptions of
show-options and show-window-options.
2009-07-06 19:50:04 +00:00
Nicholas Marriott
fe5edad1fc Fix two copy/paste bugs: forbid zero-length buffers to prevent a fatal error
when trying to paste them, found by me, and miscalculation of the start/end
causing random fatal errors when copying in copy-mode, reported by sthen.

ok sthen "put it in" deraadt
2009-07-02 16:15:43 +00:00
Nicholas Marriott
4c5c125173 When unlocking the server, don't try to clear the prompt on clients without a
prompt (such as the one issuing the unlock request).

This caused the server to die if the wrong password was entered when unlocking
from the command line with -U (nasty).
2009-06-30 13:40:30 +00:00
Nicholas Marriott
68e06fb6b7 Fix two errors with character/line insertion and deletion: the maximum number
of characters which may be inserted or deleted is the screen width, not one
less (and similarly for lines and height); and if characters or lines are
deleted by moving the ones that follow, the space at the end needs to be
cleared.

This appears to solve long-standing redraw issues most visible when using the
force-width option then scrolling in view(1) or unwrapping lines in emacs.
2009-06-29 21:30:50 +00:00
Nicholas Marriott
003e8e65f7 Don't try to page up with scroll-mode -u or copy-mode -u unless the mode was
successfully changed - if already in a different mode, it would corrupt the
mode data.
2009-06-29 07:11:20 +00:00
Nicholas Marriott
710393e388 Use gmtime_r so the current time isn't overwritten, the minute comparison works
and the clock is actually updated. It was already used for lock-server but not
here.
2009-06-27 14:40:22 +00:00
Nicholas Marriott
2660692fb1 Copy the 256-colour flag into the tty saved cell as well as the actual colour,
otherwise colour 8 isn't reset properly.
2009-06-27 12:57:14 +00:00
Nicholas Marriott
916669a244 Add missing spaces before some alias closing brackets, otherwise they are
shown in the wrong style.
2009-06-26 22:47:06 +00:00
Nicholas Marriott
46f80d01ff After logging (if enabled) is switched to file, there is no reason to keep
stdin/stdout/stderr active, so dup them to /dev/null.
2009-06-26 22:12:19 +00:00
Nicholas Marriott
b11b1dd1c0 Remove some unused function declarations; no binary change. 2009-06-26 19:44:36 +00:00
Nicholas Marriott
1ec736a3dc Status line fixes: don't truncate status-right now the length calculation is
done for UTF-8, limit to the maximum length correctly when printing, and always
print a space even if the left string is longer than the width available.
2009-06-26 15:13:39 +00:00
Nicholas Marriott
c506e7f711 Also #ifndef nitems here, caught by Thomas Jeunet. 2009-06-26 10:55:37 +00:00
Nicholas Marriott
eb8ab96980 Remove some dead assignments, found by sthen with clang. 2009-06-25 22:09:20 +00:00
Nicholas Marriott
e225ce0fd7 #ifndef nitems to avoid redefining it if it is already in a header. 2009-06-25 22:08:15 +00:00
Nicholas Marriott
e8c10f5b34 Use the pane flags not the window flags. Doh. 2009-06-25 08:08:18 +00:00
Marc Espie
5050171f6b diagflags for diags
okay nicm@
2009-06-25 07:42:41 +00:00
Nicholas Marriott
dbbb297d5f If getcwd() fails, use the user's home directory, or /, instead of failing with
an error.
2009-06-25 06:54:32 +00:00
Nicholas Marriott
be17ac1eb2 lines variable can be -1 (to be ignored), so should be signed. Found by lint. 2009-06-25 06:48:23 +00:00
Nicholas Marriott
40c242a6d5 Remove error about using -L and -S together which was never displayed as
logging wasn't yet enabled, was unnecessary, and contradicted the man page
which says using -S will cause -L to be ignored.
2009-06-25 06:40:25 +00:00
Nicholas Marriott
a7075f1c66 tmux doesn't and won't need syslog logging, so remove it and some other unused
functions found by lint.

Also move a couple of internal function declarations into file scope.
2009-06-25 06:23:10 +00:00
Nicholas Marriott
1675ddb4d1 Miscellaneous unused functions, including one which was basically a
duplicate. Found by lint.
2009-06-25 06:15:04 +00:00
Nicholas Marriott
ed8350422e Nuke unused buffer functions. Found by lint.
Also remove some old debug output which was #if 0.
2009-06-25 06:05:47 +00:00
Nicholas Marriott
9144d30848 Unused prototypes. Found by lint, no binary change. 2009-06-25 06:00:45 +00:00
Nicholas Marriott
83078bdcbc Unused variables. Found by lint, no binary change. 2009-06-25 05:56:44 +00:00
Nicholas Marriott
74d0851ac5 Remove some cruft from the Makefile. 2009-06-24 23:32:18 +00:00
Nicholas Marriott
23326e40cf Now that a UTF-8-capable puts function exists, use it for printing strings in
choice/more modes - lines with UTF-8 now display properly in find-window
results.
2009-06-24 23:00:31 +00:00
Nicholas Marriott
3db2433448 Fix a type mismatch warning in assignment. 2009-06-24 22:51:47 +00:00
Nicholas Marriott
7e796dea03 Change find-window and monitor-content to use fnmatch(3). For convenience and
compatibility, *s are implicitly added at the start and end of the pattern.

Also display the line number and the entire line in the results, and lose the
nasty section_string function and the now empty util.c file.

Initially from Tiago Cunha.
2009-06-24 22:49:56 +00:00
Nicholas Marriott
096cbf2ea5 Add a dedicated function to convert a line into a string and use it to simplify the search window function. 2009-06-24 22:04:18 +00:00
Nicholas Marriott
f4b8f00255 Change to match xterm's resizing behaviour, including pushing lines into the
history from the top when reducing vertical size and pulling them again when
increasing size.

ok todd sthen
2009-06-24 19:12:44 +00:00
Nicholas Marriott
da8401d8be Make remain-on-exit work again when there is only one pane left, which was
broken sometime during the pane/layout changes. Reported/tested by Iain Morgan,
thanks.
2009-06-24 17:36:15 +00:00
Nicholas Marriott
2de599ac0e Trying to predict the cursor position for UTF-8 output in the same way as for
normal eight-bit output is wrong, separate it into a different function. Fixes
spacing when mixing UTF-8 with some escape sequences, notably the way w3m does
it.
2009-06-24 16:01:02 +00:00
Jason McIntyre
7b4077ef87 tweak previous; 2009-06-24 08:13:22 +00:00
Nicholas Marriott
27cfa81110 Constify utf8_width() function argument. 2009-06-24 05:35:07 +00:00
Nicholas Marriott
013b88dfc3 Mention LC_ALL, LC_CTYPE. 2009-06-23 23:26:08 +00:00
Nicholas Marriott
6d2830a473 Add some common config file examples to the quick start section. 2009-06-23 22:13:11 +00:00
Nicholas Marriott
69f3c24647 If a pane is "zombified" (remain-on-exit flag), don't continue to queue key and
mouse input for it (otherwise they are processed after respawn).
2009-06-23 20:17:30 +00:00
Nicholas Marriott
c2b0fdae5b LC_ALL overrides LC_CTYPE and LANG. Comment was correct but the code
wrong. Pointed out by Hannah Schroeter, thanks.
2009-06-23 18:27:40 +00:00
Nicholas Marriott
89262c62fe Terminate cwd buffer before running xstrdup on it. 2009-06-05 11:14:13 +00:00
Nicholas Marriott
18665b8cc9 Check the first of LC_CTYPE, LC_ALL and LANG, rather than just the last, when
trying to decide about UTF-8, and use strcasestr. Reported by Geert Hendrickx.
2009-06-05 07:22:23 +00:00
Nicholas Marriott
a3c32841e6 strdup the input to putenv to avoid in one case passing a string that is later
freed and in the other const strings.

looks sane to millert, ok ray
2009-06-05 07:18:37 +00:00
Nicholas Marriott
1156467726 Call setproctitle earlier in the client, and include the socket name. Makes it
easier to match client to server in ps/pgrep when using several servers.
2009-06-05 07:15:58 +00:00
Ray Lai
74749e8705 Remove trailing newlines, spaces, and tabs.
No binary change.
2009-06-05 03:13:16 +00:00
Nicholas Marriott
85e0d8a221 Print a better message than '(null)' if no command is specified ("tmux \;"). 2009-06-04 23:34:32 +00:00
Nicholas Marriott
38b2c42f63 Zero the password given to -U in the client as well. 2009-06-04 21:56:14 +00:00
Nicholas Marriott
50bd094856 If the prompt is hidden or a password is sent with -U, zero it before freeing
it.
2009-06-04 21:43:24 +00:00
Nicholas Marriott
f031975dc0 Implement the CBT (backward tab) sequence (\033[Z). 2009-06-04 21:02:21 +00:00
Nicholas Marriott
d42fb43f4f Proper support for tab stops (\033H etc), using a bitstring(3). Makes another
vttest test happy.
2009-06-04 18:48:24 +00:00
Nicholas Marriott
d6015824dd Okay, so I screwed up when testing this, doh. Unbreak so that CAN/SUB actually
do cancel the sequence, and tweak to make the code more clear.
2009-06-04 14:42:14 +00:00
Nicholas Marriott
6c1f03578d Oops, CAN and SUB should abort the sequence (return to first state), not remain
in the same state.
2009-06-04 14:24:49 +00:00
Nicholas Marriott
8dd2f0da3f More input compatibility love. Support C0 within escape sequences, and the C0
control character VT (vertical tab, \013), which is treated as LF like
VT102. Makes another vttest happy.
2009-06-04 14:15:50 +00:00
Jason McIntyre
0ba85cc326 zap trailing whitespace; 2009-06-04 13:36:25 +00:00
Nicholas Marriott
c1a4c0186a Support insert mode by using insert character to shift the cells before writing
as normal.
2009-06-03 23:37:30 +00:00
Nicholas Marriott
52ec9b9ec4 Implement the DEC alignment test. With the last change this is enough for the
first cursor test in vttest (in ports) to pass; it still shops a few more
problems though.
2009-06-03 23:30:40 +00:00
Nicholas Marriott
ebe07c2726 Fix some miscalculations when clearing to start of screen: the number of lines
to the cursor is cy not cy - 1, and the current cursor cell should be included.
2009-06-03 23:26:56 +00:00
Nicholas Marriott
3f16fcb30a Use vis(3) instead of handrolled function. 2009-06-03 19:37:27 +00:00
Nicholas Marriott
2faec76afa Pass window titles through vis(1). <0x20 is dropped anyway by the input state
machine but top-bit-set nonprintables could cause trouble, and they are neater
like this anyway.

Suggested by deraadt a few days ago.
2009-06-03 19:33:04 +00:00
Nicholas Marriott
655a1aea6c Do not set the window title by default (make set-titles option default to off),
wiping over the title is rude and annoying. Agreed by several.
2009-06-03 17:04:16 +00:00
Nicholas Marriott
6521427a45 New session option, status-utf8, to control the interpretation of top-bit-set
characters in status-left and status-right (if on, they are treated as UTF-8;
otherwise passed through).
2009-06-03 16:54:26 +00:00
Nicholas Marriott
7d45e29683 Add a UTF-8 aware string length function and make UTF-8 in
status-left/status-right work properly. At the moment any top-bit-set
characters are assumed to be UTF-8: a status-utf8 option to configure this will
come shortly.
2009-06-03 16:05:46 +00:00
Nicholas Marriott
41d985ace3 Add missing documentation for the -a flag used to move to next/previous window
with alert.
2009-06-03 15:58:40 +00:00
Nicholas Marriott
e659aa86b9 Add a section summarising the status line. There are quite a number of status
line options, it is something many want to configure, and the meaning of some
bits weren't really documented.
2009-06-03 15:47:14 +00:00
Jason McIntyre
5823854b5e undo a mistake found by sobrado; 2009-06-03 09:29:06 +00:00
Nicholas Marriott
c5dbec9e85 When swapping pane positions, swap the PANE_HIDDEN flag as well, otherwise tmux
crashes when trying to find the new active pane.

While here, nuke an unused pane flag.

Fixes PR 6160, reported by and a slightly different version of diff tested by
ralf.horstmann at gmx.de.
2009-06-03 07:51:24 +00:00
Jason McIntyre
646cfa6983 some cleanup; ok nicm 2009-06-03 06:49:05 +00:00
Ray Lai
fdda4142bf Cast char to u_char before passing to isalnum().
OK nicm@
2009-06-03 04:03:16 +00:00
Nicholas Marriott
3f76a973ee Recent code to try and detect if a terminal supports UTF-8 by printing to it
fails spectacularly on (at least) sparc64, so disable it for now. Thanks to
naddy and Josh Elsasser for help and testing.
2009-06-02 23:39:32 +00:00
Igor Sobrado
4215d009a5 remove unused flag; while here, make usage's output fit on 80-column displays. 2009-06-02 16:53:20 +00:00
Igor Sobrado
a35630838f sort options alphabetically. 2009-06-02 16:46:00 +00:00
Pierre-Yves Ritschard
dc373abba8 spawn login shells by default, adapt manpage bits as well.
ok nicm@
2009-06-02 15:55:32 +00:00
Ray Lai
f60bc7e03b Don't access array[-1] if array is an empty string.
OK nicm@
2009-06-02 11:18:59 +00:00
Ray Lai
49c776ea59 Make code clearer:
-       if (hdr->size > SIZE_MAX - 1)
+       if (hdr->size == SIZE_MAX)

OK nicm@
2009-06-02 11:17:03 +00:00
Ray Lai
3686645e77 Don't dereference NULL if buf winds up being empty. Can't happen
right now according to NicM but better safe than sorry.

OK nicm@
2009-06-02 11:14:08 +00:00
Ray Lai
df91860b52 Don't leak memory if multiple -f flags are given.
OK nicm@
2009-06-02 10:49:40 +00:00
Nicholas Marriott
29d4016572 Update the man page with some recent changes to the code:
- SIGUSR1 recreates the socket;
- guesswork to work out if the terminal supports UTF-8;
- a paste key for the command prompt;
- main-horizontal layout to match main-vertical, and options to configure the
  size of the large pane;
- clear-history command;
- select-layout command.
2009-06-01 23:51:00 +00:00
Nicholas Marriott
6e3f673ef7 Whoops, didn't mean to add this. 2009-06-01 23:00:54 +00:00
Nicholas Marriott
35876eaab9 Import tmux, a terminal multiplexor allowing (among other things) a single
terminal to be switched between several different windows and programs
displayed on one terminal be detached from one terminal and moved to another.

ok deraadt pirofti
2009-06-01 22:58:49 +00:00
205 changed files with 22145 additions and 12801 deletions

17
.gitignore vendored Normal file
View File

@@ -0,0 +1,17 @@
*.o
*~
*.diff
*.patch
*.core
core
tags
.deps/
aclocal.m4
autom4te.cache/
config.log
config.status
etc/
tmux
Makefile
Makefile.in
configure

24
.mailmap Normal file
View File

@@ -0,0 +1,24 @@
Bob Beck <beck@openbsd.org> beck <beck>
Igor Sobrado <sobrado@openbsd.org> sobrado <sobrado>
Jacek Masiulaniec <jacekm@openbsd.org> jacekm <jacekm>
Jason McIntyre <jmc@openbsd.org> jcm <jcm>
Joel Sing <jsing@openbsd.org> jsing <jsing>
Marc Espie <espie@openbsd.org> espie <espie>
Matthew Dempsky <matthew@openbsd.org> matthew <matthew>
Matthias Kilian <kili@openbsd.org> kili <kili>
Matthieu Herrb <matthieu@openbsd.org> matthieu <matthieu>
Miod Vallat <miod@openbsd.org> miod <miod>
Nicholas Marriott <nicm@openbsd.org> nicm <nicm>
Nicholas Marriott <nicm@openbsd.org> no_author <no_author@example.org>
<nicm@openbsd.org> <nicholas.marriott@gmail.com>
Okan Demirmen <okan@openbsd.org> okan <okan>
Philip Guenther <guenther@openbsd.org> guenther <guenther>
Pierre-Yves Ritschard <pyr@openbsd.org> pyr <pyr>
Ray Lai <ray@openbsd.org> ray <ray>
Ryan McBride <mcbride@openbsd.org> mcbride <mcbride>
Stefan Sperling <stsp@openbsd.org> stsp <stsp>
Stuart Henderson <sthen@openbsd.org> sthen <sthen>
Ted Unangst <tedu@openbsd.org> tedu <tedu>
Theo Deraadt <deraadt@openbsd.org> deraadt <deraadt>
Thomas Adam <thomas@xteddy.org> Thomas <thomas@xteddy.org>
William Yodlowsky <william@openbsd.org> william <william>

335
CHANGES
View File

@@ -1,3 +1,336 @@
CHANGES FROM 1.7 to 1.8, 26 March 2013
Incompatible Changes
====================
* layout redo/undo has been removed.
Normal Changes
==============
* Add halfpage up/down bindings to copy mode.
* Session choosing fixed to work with unattached sessions.
* New window options window-status-last-{attr,bg,fg} to denote the last
window which was active.
* Scrolling in copy-mode now scrolls the region without moving the mouse
cursor.
* run-shell learnt '-t' to specify the pane to use when displaying output.
* Support for middle-click pasting.
* choose-tree learns '-u' to start uncollapsed.
* select-window learnt '-T; to toggle to the last window if it's already
current.
* New session option 'assume-paste-time' for pasting text versus key-binding
actions.
* choose-* commands now work outside of an attached client.
* Aliases are now shown for list-commands command.
* Status learns about formats.
* Free-form options can be set with set-option if prepended with an '@'
sign.
* capture-pane learnt '-p' to send to stdout, and '-e' for capturing escape
sequences, and '-a' to capture the alternate screen, and '-P' to dump
pending output.
* Many new formats added (client_session, client_last_session, etc.)
* Control mode, which is a way for a client to send tmux commands.
Currently more useful to users of iterm2.
* resize-pane learnt '-x' and '-y' for absolute pane sizing.
* Config file loading now reports errors from all files which are loaded via
the 'source-file' command.
* 'copy-pipe' mode command to copy selection and pipe the selection to a
command.
* Changes panes can now emit focus notifications for certain applications
which use those.
* run-shell and if-shell now accept format placeholders.
* resize-pane learnt '-Z' for zooming a pane temporarily.
* new-session learnt '-A' to make it behave like attach-session.
* set-option learnt '-o' to prevent setting an option which is already set.
* capture-pane and show-options learns '-q' to silence errors.
* New command 'wait-for' which blocks a client until woken up again.
* Resizing panes will now reflow the text inside them.
* Lots and lots of bug fixes, fixing memory-leaks, etc.
* Various manpage improvements.
CHANGES FROM 1.6 to 1.7, 13 October 2012
* tmux configuration files now support line-continuation with a "\" at the
end of a line.
* New option status-position to move the status line to the top or bottom of
the screen.
* Enforce history-limit option when clearing the screen.
* Give each window a unique id, like panes but prefixed with @.
* Add pane id to each pane in layout description (while still accepting
the old form).
* Provide defined ways to set the various default-path possibilities: ~
for home directory, . for server start directory, - for session start
directory and empty for the pane's working directory (the default). All
can also be used as part of a relative path (eg -/foo). Also provide -c
flags to neww and splitw to override default-path setting.
* Add -l flag to send-keys to send input literally (without translating
key names).
* Allow a single option to be specified to show-options to show just that
option.
* New command "move-pane" (like join-pane but allows the same window).
* join-pane and move-pane commands learn "-b" option to place the pane to
the left or above.
* Support for bracketed-paste mode.
* Allow send-keys command to accept hex values.
* Add locking around "start-server" to avoid race-conditions.
* break-pane learns -P/-F arguments for display formatting.
* set-option learns "-q" to make it quiet, and not print out anything.
* copy mode learns "wrap-search" option.
* Add a simple form of output rate limiting by counting the number of
certain C0 sequences (linefeeds, backspaces, carriage returns) and if it
exceeds a threshold (current default 250/millisecond), start to redraw
the pane every 100 milliseconds instead of making each change as it
comes. Two configuration options - c0-change-trigger and
c0-change-interval.
* find-window learns new flags: "-C", "-N", "-T" to match against either or
all of a window's content, name, or title. Defaults to all three options
if none specified.
* find-window automatically selects the appropriate pane for the found
matches.
* show-environment can now accept one option to show that environment value.
* Exit mouse mode when end-of-screen reached when scrolling with the mouse
wheel.
* select-layout learns -u and -U for layout history stacks.
* kill-window, detach-client, kill-session all learn "-a" option for
killing all but the current thing specified.
* move-window learns "-r" option to renumber window sequentially in a
session.
* New session option "renumber-windows" to automatically renumber windows in
a session when a window is closed. (see "move-window -r").
* Only enter copy-mode on scroll up.
* choose-* and list-* commands all use "-F" for format specifiers.
* When spawning external commands, the value from the "default-shell" option
is now used, rather than assuming /bin/sh.
* New choose-tree command to render window/sessions as a tree for selection.
* display-message learns new format options.
* For linked-windows across sessions, all flags for that window are now
cleared across sessions.
* Lots and lots of bug fixes, fixing memory-leaks, etc.
* Various manpage improvements.
CHANGES FROM 1.5 TO 1.6, 23 January 2012
* Extend the mode-mouse option to add a third choice which means the mouse
does not enter copy mode.
* Add a -r flag to switch-client to toggle the client read-only flag.
* Add pane-base-index option.
* Support \ for line continuation in the configuration file.
* Framework for more powerful formatting of command output and use it for
list-{panes,windows,sessions}. This allows more descriptive replacements
(such as #{session_name}) and conditionals.
* Mark dead panes with some text saying they are dead.
* Reject $SHELL if it is not a full path.
* Add -S option to refresh-client to redraw status line.
* Add an else clause for if-shell.
* Try to resolve relative paths for loadb and saveb (first, using client
working directory, if any, then default-path or session working directory).
* Support for \e[3J to clear the history and send the corresponding
terminfo code (E3) before locking.
* When in copy mode, make repeat count indicate buffer to replace, if used.
* Add screen*:XT to terminal-overrides for tmux-in-tmux.
* Status-line message attributes added.
* Move word-separators to be a session rather than window option.
* Change the way the working directory for new processes is discovered. If
default-path isn't empty, it is used. Otherwise, if a new window is created
from the command-line, the working directory of the client is used. If not,
platform specific code is used to retrieve the current working directory
of the process in the active pane. If that fails, the directory where the
session was created is used, instead.
* Do not change the current pane if both mouse-select-{pane,window} are
enabled.
* Add \033[s and \033[u to save and restore cursor position.
* Allow $HOME to be used as default-path.
* Add CNL and CPL escape sequences.
* Calculate last position correctly for UTF-8 wide characters.
* Add an option allow-rename to disable the window rename escape sequence.
* Attributes for each type of status-line alert (ie bell, content and
activity) added. Therefore, remove the superfluous options
window-status-alert-{attr,bg,fg}.
* Add a -R flag to send-keys to reset the terminal.
* Add strings to allow the aixterm bright colours to be used when
configuring colours.
* Drop the ability to have a list of keys in the prefix in favour of two
separate options, prefix and prefix2.
* Flag -2 added to send-prefix to send the secondary prefix key.
* Show pane size in top right of display panes mode.
* Some memory leaks plugged.
* More command-prompt editing improvements.
* Various manpage improvements.
* More Vi mode improvements.
CHANGES FROM 1.4 TO 1.5, 09 July 2011
* Support xterm mouse modes 1002 and 1003.
* Change from a per-session stack of buffers to one global stack. This renders
copy-buffer useless and makes buffer-limit now a server option.
* Fix most-recently-used choice by avoiding reset the activity timer for
unattached sessions every second.
* Add a -P option to new-window and split-window to print the new window or
pane index in target form (useful to pass it into other commands).
* Handle a # at the end of a replacement string (such as status-left)
correctly.
* Support for UTF-8 mouse input (\033[1005h) which was added in xterm 262.
If the new mouse-utf8 option is on, UTF-8 mouse input is enabled for all
UTF-8 terminals. The option defaults to on if LANG etc are set in the same
manner as the utf8 option.
* Support for HP-UX.
* Accept colours of the hex form #ffffff and translate to the nearest from the
xterm(1) 256-colour set.
* Clear the non-blocking IO flag (O_NONBLOCK) on the stdio file descriptors
before closing them (fixes things like "tmux ls && cat").
* Use TMPDIR if set.
* Fix next and previous session functions to actually work.
* Support -x and -y for new-session to specify the initial size of the window
if created detached with -d.
* Make bind-key accept characters with the top-bit-set and print them as octal.
* Set $TMUX without the session when background jobs are run.
* Simplify the way jobs work and drop the persist type, so all jobs are
fire-and-forget.
* Accept tcgetattr/tcsetattr(3) failure, fixes problems with fatal() if the
terminal disappears while locked.
* Add a -P option to detach to HUP the client's parent process (usually causing
it to exit as well).
* Support passing through escape sequences to the underlying terminal by using
DCS with a "tmux;" prefix.
* Prevent tiled producing a corrupt layout when only one column is needed.
* Give each pane created in a tmux server a unique id (starting from 0), put it
in the TMUX_PANE environment variable and accept it as a target.
* Allow a start and end line to be specified for capture-pane which may be
negative to capture part of the history.
* Add -a and -s options to lsp to list all panes in the server or session
respectively. Likewise add -s to lsw.
* Change -t on display-message to be target-pane for the #[A-Z] replacements
and add -c as target-client.
* The attach-session command now prefers the most recently used unattached
session.
* Add -s option to detach-client to detach all clients attached to a session.
* Add -t to list-clients.
* Change window with mouse wheel over status line if mouse-select-window is on.
* When mode-mouse is on, automatically enter copy mode when the mouse is
dragged or the mouse wheel is used. Also exit copy mode when the mouse wheel
is scrolled off the bottom.
* Provide #h character pair for short hostname (no domain).
* Don't use strnvis(3) for the title as it breaks UTF-8.
* Use the tsl and fsl terminfo(5) capabilities to update terminal title and
automatically fill them in on terminals with the XT capability (which means
their title setting is xterm-compatible).
* Add a new option, mouse-resize-pane. When on, panes may be resized by
dragging their borders.
* Fix crash by resetting last pane on {break,swap}-pane across windows.
* Add three new copy-mode commands - select-line, copy-line, copy-end-of-line.
* Support setting the xterm clipboard when copying from copy mode using the
xterm escape sequence for the purpose (if xterm is configured to allow it).
* Support xterm(1) cursor colour change sequences through terminfo(5) Cc
(set) and Cr (reset) extensions.
* Support DECSCUSR sequence to set the cursor style with two new terminfo(5)
extensions, Cs and Csr.
* Make the command-prompt custom prompts recognize the status-left option
character pairs.
* Add a respawn-pane command.
* Add a couple of extra xterm-style keys that gnome terminal provides.
* Allow the initial context on prompts to be set with the new -I option to
command-prompt. Include the current window and session name in the prompt
when renaming and add a new key binding ($) for rename session.
* Option bell-on-alert added to trigger the terminal bell when there is an
alert.
* Change the list-keys format so that it shows the keys using actual tmux
commands which should be able to be directly copied into the config file.
* Show full targets for lsp/lsw -a.
* Make confirm-before prompt customizable with -p option like command-prompt
and add the character pairs #W and #P to the default kill-{pane,window}
prompts.
* Avoid sending data to suspended/locked clients.
* Small memory leaks in error paths plugged.
* Vi mode improvements.
CHANGES FROM 1.3 TO 1.4, 27 December 2010
* Window bell reporting fixed.
* Show which pane is active in the list-panes output.
* Backoff reworked.
* Prevent the server from dying when switching into copy mode when already
in a different mode.
* Reset running jobs when the status line is enabled or disabled.
* Simplify xterm modifier detection.
* Avoid crashing in copy mode if the screen size is too small for the
indicator.
* Flags -n and -p added to switch-client.
* Use UTF-8 line drawing characters on UTF-8 terminals, thus fixing some
terminals (eg putty) which disable the vt100 ACS mode switching sequences
in UTF-8 mode. On terminals without ACS, use ASCII equivalents.
* New server option exit-unattached added.
* New session option destroy-unattached added.
* Fall back on normal session choice method if $TMUX exists but is invalid
rather than rejecting.
* Mark repeating keys with "(repeat)" in the key list.
* When removing a pane, don't change the active pane unless the active pane
is actually the one being removed.
* New command last-pane added.
* AIX fixes.
* Flag -a added to unbind-key.
* Add XAUTHORITY to update-environment.
* More info regarding window and pane flags is now shown in list-*.
* If VISUAL or EDITOR contains "vi" configure mode-keys and status-key to vi.
* New window option monitor-silence and session option visual-silence added.
* In the built-in layouts distribute the panes more evenly.
* Set the default value of main-pane-width to 80 instead of 81.
* Command-line flag -V added.
* Instead of keeping a per-client prompt history make it global.
* Fix rectangle copy to behave like emacs (the cursor is not part of the
selection on the right edge but on the left it is).
* Flag -l added to switch-client.
* Retrieve environment variables from the global environment rather than
getenv(3), thus allowing them to be updated during the configuration file.
* New window options other-pane-{height,width} added.
* More minor bugs fixed and manpage improvements.
CHANGES FROM 1.2 TO 1.3, 18 July 2010
* New input parser.
* Flags to move through panes -UDLR added to select-pane.
* Commands up-pane, and down-pane removed, since equivalent behaviour is now
available through the target flag (-t:+ and -t:-).
* Jump-forward/backward in copy move (based on vi's F, and f commands).
* Make paste-buffer accept a pane as a target.
* Flag -a added to new-window to insert a window after an existing one, moving
windows up if necessary.
* Merge more mode into copy mode.
* Run job commands explicitly in the global environment (which can be modified
with setenv -g), rather than with the environment tmux started with.
* Use the machine's hostname as the default title, instead of an empty string.
* Prevent double free if the window option remain-on-exit is set.
* Key string conversions rewritten.
* Mark zombie windows as dead in the choose-window list.
* Tiled layout added.
* Signal handling reworked.
* Reset SIGCHLD after fork to fix problems with some shells.
* Select-prompt command removed. Therefore, bound ' to command-prompt -p index
"select-window -t:%%" by default.
* Catch SIGHUP and terminate if running as a client, thus avoiding clients from
being left hanging around when, for instance, a SSH session is disconnected.
* Solaris 9 fixes (such as adding compat {get,set}env(3) code).
* Accept none instead of default for attributes.
* Window options window-status-alert-{alert,bg,fg} added.
* Flag -s added to the paste-buffer command to specify a custom separator.
* Allow dragging to make a selection in copy mode if the mode-mouse option is
set.
* Support the mouse scroll wheel.
* Make pipe-pane accept special character sequences (eg #I).
* Fix problems with window sizing when starting tmux from .xinitrc.
* Give tmux sockets (but not the containing folder) group permissions.
* Extend the target flags (ie -t) to accept an offset (for example -t:+2), and
make it wrap windows, and panes.
* New command choose-buffer added.
* New server option detach-on-destroy to set what happens to a client when the
session it is attached to is destroyed. If on (default), the client is
detached. Otherwise, the client is switched to the most recently active of
the remaining sessions.
* The commands load-buffer, and save-buffer now accept a dash (-) as the file
to read from stdin, or write to stdout.
* Custom layouts added.
* Additional code reduction, bug fixes, and manpage enhancements.
CHANGES FROM 1.1 TO 1.2, 10 March 2010 CHANGES FROM 1.1 TO 1.2, 10 March 2010
* Switch to libevent. * Switch to libevent.
@@ -1467,7 +1800,7 @@ The list of older changes is below.
(including mutt, emacs). No status bar yet and no key remapping or other (including mutt, emacs). No status bar yet and no key remapping or other
customisation. customisation.
$Id: CHANGES,v 1.302 2010-03-10 15:18:11 tcunha Exp $ $Id$
LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr LocalWords: showw utf UTF fulvio ciriaco joshe OSC APC gettime abc DEF OA clr
LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB ms LocalWords: rivo nurges lscm Erdely eol smysession mysession ek dstname RB ms

198
FAQ
View File

@@ -12,29 +12,98 @@ tmux frequently asked questions
* and derivatives. * * and derivatives. *
****************************************************************************** ******************************************************************************
* How is tmux different from GNU screen? What else does it offer? * How is tmux different from GNU screen?
tmux offers several advantages over screen: tmux and GNU screen have many similarities. Some of the main differences I am
aware of are (bearing in mind I haven't used screen for a few years now):
- a clearly-defined client-server model: windows are independent entities which - tmux uses a client-server model. Each server has single Unix domain socket in
may be attached simultaneously to multiple sessions and viewed from multiple /tmp and within one server there are multiple sessions which may be attached
clients (terminals), as well as moved freely between sessions within the same to multiple clients (terminals).
tmux server;
- a consistent, well-documented command interface, with the same syntax
whether used interactively, as a key binding, or from the shell;
- easily scriptable from the shell;
- multiple paste buffers;
- choice of vi or emacs key layouts;
- an option to limit the window size;
- a more usable status line syntax, with the ability to display the first line
of output of a specific command;
- a cleaner, modern, easily extended, BSD-licensed codebase.
There are still a few features screen includes that tmux omits: This has advantages, notably: windows may be linked simultaneously to
multiple sessions; windows may be moved freely between sessions; and a client
may be switched between sessions easily (C-b D). There is one major
disadvantage: if the server crashes, game over, all sessions die. In
practice, however, tmux is quite stable and gets more so as people report any
bugs they hit :-).
- builtin serial and telnet support; this is bloat and is unlikely to be added This model is different from screen, where typically each new screen instance
to tmux; is independent. tmux supports the same behaviour by using multiple servers
- wider platform support, for example IRIX and HP-UX, and for odd terminals. with the -L option but it is not typically recommended.
- Different command interfaces. One of the goals of tmux is that the shell
should be easily usable as a scripting language - almost all tmux commands
can be used from the shell and behave identically whether used from the
shell, from a key binding or from the command prompt. Personally I also find
tmux's command interface much more consistent and clearer, but this is
subjective.
- tmux calls window names (what you see in the status line) "names", screen
calls them "titles".
- tmux has a multiple paste buffers. Not a major one but comes in handy quite a
lot.
- tmux supports automatically renaming windows to the running application
without gross hacks using escape sequences. Its even on by default.
- tmux has a choice of vi or emacs key layouts. Again, not major, but I use
emacs so if tmux did support only one key set it would be emacs and then all
the vi users would get humpy. Key bindings may be completely reconfigured in
any case.
- tmux has an option to limit the window size.
- tmux has search in windows (C-b f).
- The window split (pane) model is different. tmux has two objects, windows and
panes; screen has just windows. This difference has several implications:
* In screen you can have a window appear in several layouts, in tmux a pane
can only be in one window (fixing this is a big todo item but quite
invasive).
* tmux layouts are immutable and do not get changed unless you modify them.
* In tmux, all panes are closed when you kill a window.
* tmux panes do not have individual names, titles and so on.
I think tmux's model is much easier to manage and navigate within a window,
but breaking panes off from and joining them to windows is more clumsy.
tmux also has support for preset pane layouts.
- tmux's status line syntax is more readable and easier to use. I think it'd be
hard for anyone to argue with this. tmux doesn't support running a command
constantly and always using the last line of its output, commands must be run
again each time.
- tmux has modern, easily extended code. Again hard to argue screen is better
if you have looked at the code.
- tmux depends on libevent. I don't see this as a disadvantage: libevent is
small and portable, and on modern systems with current package management
systems dependencies are not an issue. libevent brings advantages in code
simplicity and performance.
- screen allows the window to be bigger than the terminal and can pan around
it. tmux limits the size to the largest attached client. This is a big todo
item for tmux but it is not trivial.
- screen has builtin serial and telnet support; this is bloat and is unlikely
to be added to tmux.
- screen has support for updating utmp. Nobody has really come up with a clean,
portable way to do this without making tmux setuid or setgid yet.
- Environment handling is different.
- tmux tends to be more demanding on the terminal so tends to show up terminal
and application bugs which screen does not.
- screen has wider platform support, for example IRIX, and for odd terminals.
* I found a bug! What do I do? * I found a bug! What do I do?
@@ -167,6 +236,8 @@ the ctrl (bit 5 set, for example ^[[5~ to ^[[5^) modifier in non-xterm(1) mode;
it may be possible to configure vim to accept these, an example of how to do so it may be possible to configure vim to accept these, an example of how to do so
would be welcome. would be welcome.
vim users may also want to set the "ttyfast" option inside tmux.
* Why doesn't elinks set the window title inside tmux? * Why doesn't elinks set the window title inside tmux?
There isn't a way to detect if a terminal supports setting the window title, so There isn't a way to detect if a terminal supports setting the window title, so
@@ -239,4 +310,91 @@ set -g terminal-overrides "xterm*:kLFT5=\eOD:kRIT5=\eOC:kUP5=\eOA:kDN5=\eOB:smkx
Note that this will only work in tmux 1.2 and above. Note that this will only work in tmux 1.2 and above.
$Id: FAQ,v 1.36 2010-02-04 21:01:59 nicm Exp $ * How can I blank the tmux window?
GNU screen has a feature whereby it will blank the screen after a period of
inactivity. To do the same thing in tmux, use the lock-command setting, for
example (with GNU bash):
set -g lock-command 'tput civis && read -s -n1'
This will remove the cursor and tell the shell to quit once a key has been
pressed. For zsh, use "read -s -k1".
In addition, it's possible to have both blanking and locking (for instance via
lock(1) or vlock(1)) by using the following:
bind x set lock-command '/usr/bin/vlock' \; lock-client \; set lock-command 'tput civis && read -s -n1'
* vim displays reverse video instead of italics, while less displays italics
(or just regular text) instead of reverse. What's wrong?
Screen's terminfo description lacks italics mode and has standout mode in its
place, but using the same escape sequence that urxvt uses for italics. This
means applications (like vim) looking for italics will not find it and might
turn to reverse in its place, while applications (like less) asking for
standout will end up with italics instead of reverse. To make applications
aware that tmux supports italics and to use a proper escape sequence for
standout, you'll need to create a new terminfo file with modified sgr, smso,
rmso, sitm and ritm entries:
$ mkdir $HOME/.terminfo/
$ screen_terminfo="screen"
$ infocmp "$screen_terminfo" | sed \
-e 's/^screen[^|]*|[^,]*,/screen-it|screen with italics support,/' \
-e 's/%?%p1%t;3%/%?%p1%t;7%/' \
-e 's/smso=[^,]*,/smso=\\E[7m,/' \
-e 's/rmso=[^,]*,/rmso=\\E[27m,/' \
-e '$s/$/ sitm=\\E[3m, ritm=\\E[23m,/' > /tmp/screen.terminfo
$ tic /tmp/screen.terminfo
And tell tmux to use it in ~/.tmux.conf:
set -g default-terminal "screen-it"
If your terminal supports 256 colors, use:
$ screen_terminfo="screen-256color"
instead of "screen". See the FAQ entry about 256 colors support for more info.
Also note that tmux will still display reverse video on terminals that do not
support italics.
If your urxvt cannot display italics at all, make sure you have an italics
capable font enabled, for example, add to ~/.Xdefaults:
urxvt.italicFont: xft:Bitstream Vera Sans Mono:italic:autohint=true
* How can I make tmux use my terminal's scrollback buffer?
Normally, tmux enables the terminal's "alternate screen". Most terminals (such
as xterm) do not save scrollback for the alternate screen. You might prefer
tmux to use the normal screen, so it uses your terminal's scrollback
buffer. This way, you can access the scrollback buffer as usual, for example
using the mouse wheel - although there is no guarantee output inside tmux will
always (or ever) be added to the scrollback.
You can make tmux use the normal screen by telling it that your terminal does
not have an alternate screen. Put the following in ~/.tmux.conf:
set -g terminal-overrides 'xterm*:smcup@:rmcup@'
Adjust if your $TERM does not start with xterm.
tmux will still emulate the alternate screen for applications run under tmux,
so you don't really lose anything with this setting. The only disadvantage is
that when you exit tmux, it will not restore whatever was there before you
started.
* How do I see the default configuration?
Show the default session options by starting a new tmux server with no
configuration file:
$ tmux -Lfoo -f/dev/null start\; show -g
Or the default window options:
$ tmux -Lfoo -f/dev/null start\; show -gw
$Id$

View File

@@ -1,86 +0,0 @@
# $Id: GNUmakefile,v 1.122 2010-03-10 15:15:33 tcunha Exp $
#
# Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
# OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
.PHONY: clean
VERSION= 1.2
#FDEBUG= 1
CC?= cc
CFLAGS+= -DBUILD="\"$(VERSION)\""
LDFLAGS+= -L/usr/local/lib
LIBS+=
# Sun CC
ifneq ($(shell ($(CC) -V 2>&1|awk '/Sun C/' || true)), )
CFLAGS+=-erroff=E_EMPTY_DECLARATION
FDEBUG=
endif
ifdef FDEBUG
CFLAGS+= -g -ggdb -DDEBUG
CFLAGS+= -Wno-long-long -Wall -W -Wnested-externs -Wformat=2
CFLAGS+= -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations
CFLAGS+= -Wwrite-strings -Wshadow -Wpointer-arith -Wsign-compare
CFLAGS+= -Wundef -Wbad-function-cast -Winline -Wcast-align
endif
# This sort of sucks but gets rid of the stupid warning and should work on
# most platforms...
ifeq ($(shell (LC_ALL=C $(CC) -v 2>&1|awk '/gcc version 4|clang/') || true), )
CPPFLAGS:= -I. -I- $(CPPFLAGS)
else
CPPFLAGS:= -iquote. $(CPPFLAGS)
ifdef FDEBUG
CFLAGS+= -Wno-pointer-sign
endif
endif
PREFIX?= /usr/local
INSTALLDIR= install -d
INSTALLBIN= install -g bin -o root -m 555
INSTALLMAN= install -g bin -o root -m 444
SRCS= $(shell echo *.c|sed 's|osdep-[a-z0-9]*.c||g')
include config.mk
OBJS= $(patsubst %.c,%.o,$(SRCS))
all: tmux
tmux: $(OBJS)
$(CC) $(LDFLAGS) -o tmux $+ $(LIBS)
depend: $(SRCS)
$(CC) $(CPPFLAGS) $(CFLAGS) -MM $(SRCS) > .depend
clean:
rm -f tmux *.o *~ *.core *.log compat/*.o compat/*~
clean-depend:
rm -f .depend
clean-all: clean clean-depend
rm -f config.h config.mk
install: all
$(INSTALLDIR) $(DESTDIR)$(PREFIX)/bin
$(INSTALLBIN) tmux $(DESTDIR)$(PREFIX)/bin/tmux
$(INSTALLDIR) $(DESTDIR)$(PREFIX)/man/man1
$(INSTALLMAN) tmux.1 $(DESTDIR)$(PREFIX)/man/man1/tmux.1
-include .depend

View File

@@ -1,83 +0,0 @@
# $Id: Makefile,v 1.155 2010-03-10 15:15:33 tcunha Exp $
#
# Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
# OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
.SUFFIXES: .c .o
.PHONY: clean
VERSION= 1.2
#FDEBUG= 1
CC?= cc
CFLAGS+= -DBUILD="\"$(VERSION)\""
LDFLAGS+= -L/usr/local/lib
LIBS+=
.ifdef FDEBUG
CFLAGS+= -g -ggdb -DDEBUG
CFLAGS+= -Wno-long-long -Wall -W -Wnested-externs -Wformat=2
CFLAGS+= -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations
CFLAGS+= -Wwrite-strings -Wshadow -Wpointer-arith -Wsign-compare
CFLAGS+= -Wundef -Wbad-function-cast -Winline -Wcast-align
.endif
# This sort of sucks but gets rid of the stupid warning and should work on
# most platforms...
CCV!= (LC_ALL=C ${CC} -v 2>&1|awk '/gcc version 4|clang/') || true
.if empty(CCV)
CPPFLAGS:= -I. -I- -I/usr/local/include ${CPPFLAGS}
.else
CPPFLAGS:= -iquote. -I/usr/local/include ${CPPFLAGS}
.ifdef FDEBUG
CFLAGS+= -Wno-pointer-sign
.endif
.endif
PREFIX?= /usr/local
INSTALLDIR= install -d
INSTALLBIN= install -g bin -o root -m 555
INSTALLMAN= install -g bin -o root -m 444
SRCS!= echo *.c|sed 's|osdep-[a-z0-9]*.c||g'
.include "config.mk"
OBJS= ${SRCS:S/.c/.o/}
.c.o:
${CC} ${CPPFLAGS} ${CFLAGS} -c ${.IMPSRC} -o ${.TARGET}
all: tmux
tmux: ${OBJS}
${CC} ${LDFLAGS} -o tmux ${OBJS} ${LIBS}
depend:
mkdep ${CPPFLAGS} ${CFLAGS} ${SRCS:M*.c}
clean:
rm -f tmux *.o *~ *.core *.log compat/*.o compat/*~
clean-depend:
rm -f .depend
clean-all: clean clean-depend
rm -f config.h config.mk
install: all
${INSTALLDIR} ${DESTDIR}${PREFIX}/bin
${INSTALLBIN} tmux ${DESTDIR}${PREFIX}/bin/
${INSTALLDIR} ${DESTDIR}${PREFIX}/man/man1
${INSTALLMAN} tmux.1 ${DESTDIR}${PREFIX}/man/man1/

248
Makefile.am Normal file
View File

@@ -0,0 +1,248 @@
# $Id$
# Obvious program stuff.
bin_PROGRAMS = tmux
dist_man1_MANS = tmux.1
# Distribution tarball options.
EXTRA_DIST = \
CHANGES FAQ README TODO examples compat \
array.h compat.h tmux.h osdep-*.c
dist-hook:
grep "^#found_debug=" configure
find $(distdir) -name .svn -type d|xargs rm -Rf
# Preprocessor flags.
CPPFLAGS += @XOPEN_DEFINES@
# glibc as usual does things ass-backwards and hides useful things by default,
# so everyone has to add this.
if IS_GLIBC
CFLAGS += -D_GNU_SOURCE
endif
# Set flags for gcc. gcc4 whines abouts silly stuff so it needs slightly
# different flags.
if IS_GCC
CFLAGS += -std=gnu99
if IS_DEBUG
CFLAGS += -O0 -g
CFLAGS += -Wno-long-long -Wall -W -Wnested-externs -Wformat=2
CFLAGS += -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations
CFLAGS += -Wwrite-strings -Wshadow -Wpointer-arith -Wsign-compare
CFLAGS += -Wundef -Wbad-function-cast -Winline -Wcast-align
CFLAGS += -Wdeclaration-after-statement
CPPFLAGS += -DDEBUG
else
CFLAGS += -O2
endif
if IS_GCC4
CPPFLAGS += -iquote. -I/usr/local/include
if IS_DEBUG
CFLAGS += -Wno-pointer-sign
endif
else
CPPFLAGS += -I. -I- -I/usr/local/include
endif
endif
# Set flags for Solaris.
if IS_SUNOS
CPPFLAGS += -D_XPG4_2 -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS
endif
# Set flags for Sun CC.
if IS_SUNCC
CFLAGS += -erroff=E_EMPTY_DECLARATION
endif
# List of sources.
dist_tmux_SOURCES = \
arguments.c \
attributes.c \
cfg.c \
client.c \
clock.c \
cmd-attach-session.c \
cmd-bind-key.c \
cmd-break-pane.c \
cmd-capture-pane.c \
cmd-choose-buffer.c \
cmd-choose-client.c \
cmd-choose-list.c \
cmd-choose-tree.c \
cmd-clear-history.c \
cmd-clock-mode.c \
cmd-command-prompt.c \
cmd-confirm-before.c \
cmd-copy-mode.c \
cmd-delete-buffer.c \
cmd-detach-client.c \
cmd-display-message.c \
cmd-display-panes.c \
cmd-find-window.c \
cmd-has-session.c \
cmd-if-shell.c \
cmd-join-pane.c \
cmd-kill-pane.c \
cmd-kill-server.c \
cmd-kill-session.c \
cmd-kill-window.c \
cmd-link-window.c \
cmd-list-buffers.c \
cmd-list-clients.c \
cmd-list-commands.c \
cmd-list-keys.c \
cmd-list-panes.c \
cmd-list-sessions.c \
cmd-list-windows.c \
cmd-list.c \
cmd-load-buffer.c \
cmd-lock-server.c \
cmd-move-window.c \
cmd-new-session.c \
cmd-new-window.c \
cmd-paste-buffer.c \
cmd-pipe-pane.c \
cmd-queue.c \
cmd-refresh-client.c \
cmd-rename-session.c \
cmd-rename-window.c \
cmd-resize-pane.c \
cmd-respawn-pane.c \
cmd-respawn-window.c \
cmd-rotate-window.c \
cmd-run-shell.c \
cmd-save-buffer.c \
cmd-select-layout.c \
cmd-select-pane.c \
cmd-select-window.c \
cmd-send-keys.c \
cmd-server-info.c \
cmd-set-buffer.c \
cmd-set-environment.c \
cmd-set-option.c \
cmd-show-environment.c \
cmd-show-messages.c \
cmd-show-options.c \
cmd-source-file.c \
cmd-split-window.c \
cmd-start-server.c \
cmd-string.c \
cmd-suspend-client.c \
cmd-swap-pane.c \
cmd-swap-window.c \
cmd-switch-client.c \
cmd-unbind-key.c \
cmd-unlink-window.c \
cmd-wait-for.c \
cmd.c \
colour.c \
control.c \
control-notify.c \
environ.c \
format.c \
grid-cell.c \
grid-view.c \
grid.c \
input-keys.c \
input.c \
job.c \
key-bindings.c \
key-string.c \
layout-custom.c \
layout-set.c \
layout.c \
log.c \
mode-key.c \
names.c \
notify.c \
options-table.c \
options.c \
paste.c \
resize.c \
screen-redraw.c \
screen-write.c \
screen.c \
server-client.c \
server-fn.c \
server-window.c \
server.c \
session.c \
signal.c \
status.c \
tmux.c \
tty-acs.c \
tty-keys.c \
tty-term.c \
tty.c \
utf8.c \
window-choose.c \
window-clock.c \
window-copy.c \
window.c \
xmalloc.c \
xterm-keys.c
nodist_tmux_SOURCES = osdep-@PLATFORM@.c
# Pile in all the compat/ stuff that is needed.
if NO_FORKPTY
nodist_tmux_SOURCES += compat/forkpty-@PLATFORM@.c
endif
if NO_IMSG
nodist_tmux_SOURCES += compat/imsg.c compat/imsg-buffer.c
endif
if NO_CLOSEFROM
nodist_tmux_SOURCES += compat/closefrom.c
endif
if NO_DAEMON
nodist_tmux_SOURCES += compat/daemon.c
endif
if NO_SETENV
nodist_tmux_SOURCES += compat/setenv.c
endif
if NO_STRLCAT
nodist_tmux_SOURCES += compat/strlcat.c
endif
if NO_STRLCPY
nodist_tmux_SOURCES += compat/strlcpy.c
endif
if NO_ASPRINTF
nodist_tmux_SOURCES += compat/asprintf.c
endif
if NO_FGETLN
nodist_tmux_SOURCES += compat/fgetln.c
endif
if NO_GETOPT
nodist_tmux_SOURCES += compat/getopt.c
endif
if NO_STRCASESTR
nodist_tmux_SOURCES += compat/strcasestr.c
endif
if NO_STRSEP
nodist_tmux_SOURCES += compat/strsep.c
endif
if NO_VIS
nodist_tmux_SOURCES += compat/vis.c compat/unvis.c
endif
if NO_STRTONUM
nodist_tmux_SOURCES += compat/strtonum.c
endif
if NO_B64_NTOP
nodist_tmux_SOURCES += compat/b64_ntop.c
endif
# Update SF web site.
upload-index.html: update-index.html
scp www/index.html www/main.css www/images/*.png \
${USER},tmux@web.sf.net:/home/groups/t/tm/tmux/htdocs
rm -f www/index.html www/images/small-*
update-index.html:
(cd www/images && \
rm -f small-* && \
for i in *.png; do \
convert "$$i" -resize 200x150 "small-$$i"; \
done \
)
sed "s/%%VERSION%%/${VERSION}/g" www/index.html.in >www/index.html

89
NOTES
View File

@@ -1,89 +0,0 @@
Welcome to tmux!
tmux is a "terminal multiplexer", it enables a number of terminals (or windows)
to be accessed and controlled from a single terminal. tmux is intended to be a
simple, modern, BSD-licensed alternative to programs such as GNU screen.
This release runs on OpenBSD, FreeBSD, NetBSD, Linux and OS X and may still
run on Solaris and AIX (although they haven't been tested in a while). It is
usable, although there remain a number of missing features and some remaining
bugs are expected.
Since the 1.2 release that tmux depends on libevent. Download the stable
version from:
http://www.monkey.org/~provos/libevent/
tmux consists of a server part and multiple clients. The server is created when
required and runs continuously unless killed by the user. Clients access the
server through a socket in /tmp. Multiple sessions may be created on a single
server and attached to a number of clients. Each session may then have a number
of windows and windows may be linked to a number of sessions. Commands are
available to create, rename and destroy windows and sessions; to attach and
detach sessions from client terminals; to set configuration options; to split
windows into several simultaneously displayed panes; and to bind and unbind
command keys (invoked preceded by a prefix key, by default ctrl-b). Please see
the tmux(1) man page for further information.
The following is a summary of major features implemented in this version:
- Basic multiplexing, window switching, attaching and detaching.
- Window listing and renaming.
- Key binding.
- Handling of client terminal resize.
- Terminal emulation sufficient to handle most curses applications.
- A optional status line (enabled by default).
- Window history and copy and paste.
- Support for VT100 line drawing characters.
- A large command set.
- Vertical window splitting and layout.
- Automatic server locking on inactivity by running an external command.
- A configuration file.
- UTF-8 support.
A more extensive, but rough, todo list is included in the TODO file.
tmux also depends on several features of the client terminal (TERM), if these
are missing it may refuse to run, or not behave correctly.
tmux supports UTF-8. To use it, the utf8 option must be set on each window;
this may be turned on for all windows by setting it as a global option, see
tmux(1) and the FAQ file. As of 0.9, tmux attempts to autodetect a
UTF-8 capable terminal by checking the LC_ALL, LC_CTYPE and LANG environment
variables. list-clients may be used to check if this is detected correctly; if
not, the -u command-line flag may be specified.
A Vim syntax file is available in the examples directory. To install it:
- Drop the file in the syntax directory in your runtimepath (such as
~/.vim/syntax/tmux.vim).
- Make the filetype recognisable by adding the following to filetype.vim
in your runtimepath (~/.vim/filetype.vim):
augroup filetypedetect
au BufNewFile,BufRead .tmux.conf*,tmux.conf* setf tmux
augroup END
- Switch on syntax highlighting by adding "syntax enable" to your vimrc file.
For debugging, running tmux with -v or -vv will generate server and client log
files in the current directory.
tmux mailing lists are available; visit:
https://sourceforge.net/mail/?group_id=200378
Bug reports, feature suggestions and especially code contributions are most
welcome. Please send by email to:
nicm@users.sf.net
This file and the CHANGES, FAQ and TODO files are licensed under the ISC
license. Files under examples/ remain copyright their authors unless otherwise
stated in the file but permission has been received to distribute them with
tmux. All other files have a license and copyright notice at their
start. Please contact me with any queries.
-- Nicholas Marriott <nicm@users.sf.net>
$Id: NOTES,v 1.53 2010-03-10 15:18:11 tcunha Exp $

60
README Normal file
View File

@@ -0,0 +1,60 @@
Welcome to tmux!
tmux is a "terminal multiplexer", it enables a number of terminals (or windows)
to be accessed and controlled from a single terminal. tmux is intended to be a
simple, modern, BSD-licensed alternative to programs such as GNU screen.
This release runs on OpenBSD, FreeBSD, NetBSD, Linux and OS X and may still
run on Solaris and AIX (although they haven't been tested in a while).
Since the 1.2 release tmux depends on libevent. Download it from:
http://www.monkey.org/~provos/libevent/
To build tmux from a release tarball, do:
$ ./configure && make
$ sudo make install
To get and build the latest from version control:
$ git clone git://git.code.sf.net/p/tmux/tmux-code tmux
$ cd tmux
$ sh autogen.sh
$ ./configure && make
For more information see https://sourceforge.net/scm/?type=git&group_id=200378
and http://git-scm.com. Patches should be sent by email to the mailing list at
tmux-users@lists.sourceforge.net.
For documentation on using tmux, see the tmux.1 manpage. It can be viewed from
the source tree with:
$ nroff -mdoc tmux.1|less
Some common questions are answered in the FAQ file and a more extensive (but
slightly out of date) guide is available in the OpenBSD FAQ at
http://www.openbsd.org/faq/faq7.html#tmux. A rough todo list is in the TODO
file and some example configurations and a Vim syntax file are in the examples
directory.
For debugging, running tmux with -v or -vv will generate server and client log
files in the current directory.
tmux mailing lists are available. Visit:
https://sourceforge.net/mail/?group_id=200378
Bug reports, feature suggestions and especially code contributions are most
welcome. Please send by email to:
tmux-users@lists.sourceforge.net
This file and the CHANGES, FAQ and TODO files are licensed under the ISC
license. Files under examples/ remain copyright their authors unless otherwise
stated in the file but permission has been received to distribute them with
tmux. All other files have a license and copyright notice at their start.
-- Nicholas Marriott <nicm@users.sf.net>
$Id$

174
SYNCING Normal file
View File

@@ -0,0 +1,174 @@
Preamble
========
Tmux on SourceForge has two git repositories [1] "tmux-code" and "tmux-openbsd".
Here's a description of them:
* "tmux-code" is the portable version, the one which contains code for other
operating systems, and autotools, etc., which isn't found or needed in the
OpenBSD base system.
* "tmux-openbsd" is the version of tmux in OpenBSD base system which provides
the basis of the portable tmux version.
Note: The "tmux-openbsd" repository is actually handled by "git cvsimport"
running at 15 minute intervals, so a commit made to OpenBSD's tmux CVS
repository will take at least that long to appear in this git repository.
(It might take longer, depending on the CVS mirror used to import the
OpenBSD code).
It is assumed that the person doing the sync has read/write access to the
tmux-code repository on SourceForge already.
If you've never used git before, git tracks meta-data about the committer
and the author, as part of a commit, hence:
% git config [--global] user.name "Your name"
% git config [--global] user.email "you@yourdomain.com"
Note that, if you already have this in the global ~/.gitconfig option, then
this will be used. Setting this per-repository would involve not using the
"--global" flag above. If you wish to use the same credentials always,
pass the "--global" option, as shown.
This is a one-off operation once the repository has been cloned, assuming
this information has ever been set before.
Cloning repositories
====================
This involves having both tmux-code and tmux-openbsd cloned, as in:
% cd /some/where/useful
% git clone ssh://${USER}@git.code.sf.net/p/tmux/tmux
% git clone ssh://${USER}@git.code.sf.net/p/tmux/tmux-openbsd
Note that you do not need additional checkouts to manage the sync -- an
existing clone of either repositories will suffice. So if you already have
these checkouts existing, skip that.
Adding in git-remotes
=====================
Because the portable "tmux-code" git repository and the "tmux-openbsd"
repository do not inherently share any history between each other, the
history has been faked between them. This "faking of history" is something
which has to be told to git for the purposes of comparing the "tmux" and
"tmux-openbsd" repositories for syncing. To do this, we must reference the
clone of the "tmux-openbsd" repository from the "tmux-code" repository, as
shown by the following command:
% cd /path/to/tmux-code
% git remote add obsd-tmux file:///path/to/tmux-openbsd
So that now, the remote "obsd-tmux" can be used to reference branches and
commits from the "tmux-openbsd" repository, but from the context of the
portable "tmux-code" repository, which makes sense because it's the "tmux"
repository which will have the updates applied to them.
Fetching updates
================
To ensure the latest commits from "tmux-openbsd" can be found from within
"tmux-code", we have to ensure the "master" branch from "tmux-openbsd" is
up-to-date first, and then reference that update in "tmux-code", as in:
% cd /path/to/tmux-openbsd
% git checkout master
% git pull
Then back in "tmux-code":
% cd /path/to/tmux-code
% git fetch obsd-tmux-code
Creating the necessary branches
===============================
Now that "tmux-code" can see commits and branches from "tmux-openbsd" by way
of the remote name "obsd-tmux", we can now create the master branch from
"tmux-openbsd" in the "tmux-code" repository:
% git checkout -b obsd-master obsd-tmux/master
Adding in the fake history points
=================================
To tie both the "master" branch from "tmux-code" and the "obsd-master"
branch from "tmux-openbsd" together, the fake history points added to the
"tmux-code" repository need to be added. To do this, we must add an
additional refspec line, as in:
% cd /path/to/tmux-code
% git config --add remote.origin.fetch '+refs/replace/*:refs/replace/*'
% git fetch origin
Performing the Sync
===================
Make sure the "master" branch is checked out:
% git checkout master
The following will show commits on OpenBSD not yet synched with "tmux-code":
% git log master..obsd-master
From there, merge the result in, fixing up any conflicts which might arise.
% git merge obsd-master
Then ensure things look correct by BULDING the result of that sync:
% make clean && ./autogen.sh && ./configure && make
Compare the git merge result with what's on origin/master -- that is, check
which commits you're about to push:
% git log origin/master..master
And if happy:
% git push origin master
Release tmux for next version
=============================
1. Comment the "found_debug=yes" line in configure.ac, since releases
don't have debugging enabled, otherwise make(1) aborts when
preparing the distribution.
2. Update and commit README and CHANGES. The former should be checked for
anything outdated and updated with a list of things that might break
upgrades and the latter should mention all the major changes since
the last version.
3. Tag with:
% git tag -a 1.X
Where "1.X" is the next version.
Push the tag out with:
% git push 1.X
4. Build the tarball with make dist. Now that it's using autoconf there
shouldn't be any weird files (such as the original and rejection files
from patch(1)) but it doesn't hurt taking a quick look at it.
5. Split the release changes into a new file. This should be named
tmux-$VERSION-readme to make sourceforge show it automagically in specific
parts of the project page.
6. Upload the tarball and the above file. Make the tarball the default
download by selecting all operating systems under the file details.
7. Run make update-index.html upload-index.html to replace %%VERSION%%.
8. Bump version in configure.ac and uncomment "found_debug=yes" to create
a debug build by default.
9. Update freshmeat.
[1] https://sourceforge.net/p/tmux/_list/git

194
TODO
View File

@@ -1,135 +1,155 @@
- window creation/idle time NOTES
- better errors when creating new windows/sessions (how?) =====
This file describes rough notes regarding ideas for potential future tmux
development. It's not necessarily guaranteed that items in this TODO file
will ever get implemented.
It is asked therefore, that anyone thinking of undertaking a task in this
TODO file, email tmux-users@lists.sf.net to discuss the feature.
Thie file is split up between tmux user interface (UI) issues, and terminal
compatibility issues.
TMUX UI ISSUES
==============
- implicitly add exec to the commands for new windows (switch to disable it)? - implicitly add exec to the commands for new windows (switch to disable it)?
- it would be nice to have multichar commands eg C-b K K - bring back detach-session to detach all clients on a session?
- commands:
extend list-clients to list clients attached to a session (-a for all?)
bring back detach-session to detach all clients on a session?
- allow fnmatch for -c, so that you can, eg, detach all clients - allow fnmatch for -c, so that you can, eg, detach all clients
- garbage collect window history (100 lines at a time?) if it hasn't been used - garbage collect window history (100 lines at a time?) if it hasn't been used
in $x time (need window creation/use times) in $x time
- lift SHRT_MAX limits for history?
- flags to centre screen in window - flags to centre screen in window
- better terminal emulation
- activity/bell should be per-window not per-link? what if it is cur win in - activity/bell should be per-window not per-link? what if it is cur win in
session not being watched? session not being watched?
- next prev word etc in command prompt
- many more info() displays for various things
- input.c is too complicated. simplify?
- use a better termcap internally instead of screen, perhaps xterm
- fix rxvt cursor fg issue (text under cursor can have non-white fg)
- should be able to move to a hidden pane and it would be moved into view. pane - should be able to move to a hidden pane and it would be moved into view. pane
number in status line/top-right would be cool for this number in status line/top-right would be cool for this
- support other mouse modes (highlight etc) and use it in copy mode - support other mouse modes (highlight etc) and use it in copy mode
- set-remain-on-exit is a bit of a hack, some way to do it generically? - set-remain-on-exit is a bit of a hack, some way to do it generically?
- set-option should be set-session-option and should be overall global options
also quiet, utf8 and maybe other flags?
-g is a bit unexpected in conf file
- clear window title on exit
- the output code (tty.c) could do with optimisation depending on term
capabilities
- would be nice to be able to use "--" to mark start of command w/ neww etc - would be nice to be able to use "--" to mark start of command w/ neww etc
to avoid quoting to avoid quoting
- make command sequences more usable: don't require space after ;, handle - make command sequences more usable: don't require space after ;, handle
errors better errors better
- attach should have a flag to create session if it doesn't exist
- choice and more mode would be better per client than per window? - choice and more mode would be better per client than per window?
- hooks to which commands may be attached, for example: tmux add-hook - hooks to which commands may be attached, for example: tmux add-hook
"new-session" if-shell "[ -e $HOME/.tmux-session.conf ]" source-file "new-session" if-shell "[ -e $HOME/.tmux-session.conf ]" source-file
$HOME/.tmux-session.conf $HOME/.tmux-session.conf
- get it passing all the vttest tests that don't require resizing the terminal
- esc seq to set window name and title should be documented, and name variant
should clear automatic-rename
- way to set socket path from config file - way to set socket path from config file
- XXX once env stuff is in, default-path and VISUAL/EDITOR should be picked up
when session is started
- what about utmp etc? can tmux update it like screen? setgid?
- warts on current naming: - warts on current naming:
- display-time but message-fg/bg/attr - display-time but message-fg/bg/attr
- list-* vs show-* - list-* vs show-*
- server-info - server-info
- up-pane/down-pane/swap-pane -U/swap-pane -D vs next-*/previous-* - up-pane/down-pane/swap-pane -U/swap-pane -D vs next-*/previous-*
- split-window -> split-pane?? - split-window -> split-pane??
- tidy up and prioritise todo list ;-)
- neww and attach can create a session if none exists?
would work fine with config file since
- a way for force-width/height to apply to only one pane (how?)
- command to list what is actually running in each window with command line,
pid (need some adaption of the osdep code)
- support for bce
- it would be nice if the start/end line keys in copy mode were aware of
wrapped lines
- some way to force a screen to use the entire terminal even if it is forced - some way to force a screen to use the entire terminal even if it is forced
to be smaller by other clients. pan smaller terminal? (like screen F) to be smaller by other clients. pan smaller terminal? (like screen F)
-- idea of a "view" onto a window, need base x/y offsets -- idea of a "view" onto a window, need base x/y offsets for redraw
for redraw
- handle resize better in copy mode
- way to copy stuff that is off screen due to resize
- commands should be able to succeed or fail and have || or && for command - commands should be able to succeed or fail and have || or && for command
lists lists
- support the mouse wheel to scroll through history - some way to keep a command running continually and just use its last line of
- some way to KEEP a command running continually and just use its LAST line of
output output
- bind commands to mouse buttons
- UTF-8 to a non-UTF-8 terminal should not be able to balls up - UTF-8 to a non-UTF-8 terminal should not be able to balls up
the terminal - www/ruby-addressable; make regress the terminal - www/ruby-addressable; make regress
- copy mode needs a tidy/cleanup
- ability to save history (to buffer?)
- multiple keys could be done with tables, ie have prefixes go and instead
bind -n ^A prefix-table "default"
where prefix-table sets command lookup table and sets prefix flag, then next
key is looked up in that table
- UTF-8 should be a pointer into a combined string buffer
- check irssi (term_charset) works with UTF-8
- support esc-esc to quit in modes - support esc-esc to quit in modes
- fix ctrl+F1-F4 output. to what? - fix ctrl+F1-F4 output. to what?
- look into xterm clearing its selection when scrolling etc - better utf8 support: window names, prompt input, message display
- better utf8 support:
window names
prompt input
message display
copy and paste cursor and wide characters
...?
- option so that when session is destroyed, attach client to another session
rather than exiting
- session history for client and last-session command
- option to change status line colour when current window is in a mode?
- option to move copy mode indicator into status line - option to move copy mode indicator into status line
- list-buffer/show-buffer should display UTF-8
- selection behaviour closer to vi in vi mode - selection behaviour closer to vi in vi mode
- live update: server started with -U connects to server, requests sessions and - live update: server started with -U connects to server, requests sessions and
windows, receives fds windows, receives fds
- convert status line history to be server global (anything else?)
- something for -t "last window in session" so a session can be used as a stack
- command to show a tree of sessions-windows-panes (active marked with *)
- sort out inheriting config from shell on new sessions/windows: - sort out inheriting config from shell on new sessions/windows:
should pick up default-path/termios/etc from client if possible, should pick up default-path/termios/etc from client if possible,
else leave empty/default else leave empty/default
- define custom layouts
- link panes into multiple windows - link panes into multiple windows
- -h option to capture-pane to capture the history as well
- bells should be passed between sessions with visual-bell etc - bells should be passed between sessions with visual-bell etc
- use screen-256color when started on 256 colour terminal??
- if-shell/run-shell should block further command execution in the same command
sequence until its shell exits, to allow them to be used from the config file sequence until its shell exits, to allow them to be used from the config file
- better session sharing: create-socket command to create socket somewhere (-r - better session sharing: create-socket command to create socket somewhere (-r
flag for readonly) flag for readonly)
- allow buffer to be specified when copying in copy mode - multiline status line (no?)
- multiline status line
- flag for absolute pane size to resize-pane
- sanity check input to socket
- stdin fd should be passed up to parent so load-buffer and others could use it
for nonattaching clients
- environment should be set up for jobs
- select-buffer command
- fix jobs so they block in config file rather than executing at an arbitrary
future point -- need state stored in client so other clients can proceed
- rectangle copy:
when selecting leftward, cursor should be inside block per emacs
key to rotate corner at which cursor is
- double C-a should walk back over wrapped lines like C-e
- support title stack, both internally and externally - support title stack, both internally and externally
http://docs.freebsd.org/cgi/getmsg.cgi?fetch=1149299+0+archive/2010/freebsd-questions/20100207.freebsd-questions http://docs.freebsd.org/cgi/getmsg.cgi?fetch=1149299+0+archive/2010/freebsd-questions/20100207.freebsd-questions
- copy buffers should be global, limit can be server option, nuke copy-buffer - some way to pad # stuff with spaces, #!2T maybe
command - a binding to "scroll down and exit at bottom" copy mode
- command to show status line information briefly when it is off - some way to pass keystrokes in copy mode through to underlying window. why?
- last window update time and # replacement for it for display-message
- find-window across sessions - other ways to make session handling easier?
- ' and " should be parsed the same (eg "\e" vs '\e') in config and command
prompt?
- command to toggle selection not to move it in copy-mode
- audit of escape sequence support vs xterm
- support binding keys to mouse (mouse-select-pane -> mouse-keys or something,
mouse click == select-pane -t %%, mouse scroll up == copy-mode)
- bind commands to key sequences? -- make it so ALL keys go through a table,
first an implicit table in which C-b is the only default binding to a
command that says "next key from $othertable" and so on. means -n can
go away as well
- monitor, bell etc should monitor /all/ panes in the window not just one
- a history of commands that can be reversed (reverse member of each command,
and a buffer)
- info() when changing to same window
- way to add dest for break-pane; maybe some easier way to unbreak-pane
- case insensitive searching
- incremental searching in copy mode.
- configurable borders and empty space filler for when panes < window?
- mouse-select-pane will screw up with !MODE_MOUSE_STANDARD (it sets the
flag on w/o checking the others before calling tty_update_mode)
- pass shell commands as argv rather than strings, allow them to be specified
in commands without quotes
- named buffers and allow gaps in the stack
- monitor-activity is broken in several ways with multiple clients
- monitor-activity should be more powerful (eg set a region)
- maybe a way to put pane names instead of window names in status line
- support for borderless panes
- wait-for command 20130222153957.GY6782@yelena.nicm.ath.cx
- last-pane across sessions
- panes should have names like windows
- command-prompt doesn't work if made read-only. why?
- option to quote format eg #{session_name:quoted}
- formats need conditions for >0 (for #P)
- fetch full command line on !Linux, and add option to strip prefixes
such as "sh " "/bin/sh " etc etc
- synchronize-windows option
- append to buffer in copy mode
- way to paste w/o trailing whitespace
- flag to switch-client to switch all clients
- history of layouts and undo/redo flags to selectl
- way to tag a layout as a number/name
- optimize pane redraws, 20120318184853.GK10965@yelena.nicm.ath.cx
- support multibyte key strings
- allow commands to be executed when certain patterns in a screen
are clicked on with the mouse
- flag to make next/previous commands skip a window
- way to do tmux command/run-shell from mode keys
- send command to all windows
- choose-pane command (augment choose-tree to do this?)
- choose-mode and copy-mode are very similar. Perhaps make choose-mode a subset
of copy-mode in that it inherits key-bindings and other traits but not all
- add -c for new-session like new-window
- flag to choose-* for sort order (eg sort windows/sessions/clients by last
used time) - perhaps using formats (but what about numeric sort)?
- instead of separate window and session options, just one master options list
with each option having a type (window or session), then options on window,
on session, and global. for window options we look window->session->global,
and for session we look session->global
- maybe keep last layout + size around and if size reverts just put it back
- way to set hints/limits about pane size for resizing
- revamp layouts: they are too complicated, should be more closely integrated,
should support hints, layout sets should just be a special case of custom
layouts, and we should support panes that are not attached to a cell at
all. this could be the time to introduce panelink to replace layout_cell
- run-shell/if-shell should support formats
- attach should take a pane and select it as well as attaching
- attach should have a flag to create session if it doesn't exist. or better
new a flag to attach it
TERMINAL ISSUES
================
- use a better termcap internally instead of screen, perhaps xterm
- clear window title on exit (see using xterm title stack)
- get it passing all the vttest tests that don't require resizing the terminal
- support for bce
- use screen-256color when started on 256 colour terminal?
* We need a tmux terminfo entry to document the extensions we are using in
upstream terminfo. Must NOT change (only add or remove) anything from
TERM=screen so we can fallback!

218
arguments.c Normal file
View File

@@ -0,0 +1,218 @@
/* $Id$ */
/*
* Copyright (c) 2010 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include "tmux.h"
/* Create an arguments set with no flags. */
struct args *
args_create(int argc, ...)
{
struct args *args;
va_list ap;
int i;
args = xcalloc(1, sizeof *args);
if ((args->flags = bit_alloc(SCHAR_MAX)) == NULL)
fatal("bit_alloc failed");
args->argc = argc;
if (argc == 0)
args->argv = NULL;
else
args->argv = xcalloc(argc, sizeof *args->argv);
va_start(ap, argc);
for (i = 0; i < argc; i++)
args->argv[i] = xstrdup(va_arg(ap, char *));
va_end(ap);
return (args);
}
/* Parse an argv and argc into a new argument set. */
struct args *
args_parse(const char *template, int argc, char **argv)
{
struct args *args;
char *ptr;
int opt;
args = xcalloc(1, sizeof *args);
if ((args->flags = bit_alloc(SCHAR_MAX)) == NULL)
fatal("bit_alloc failed");
optreset = 1;
optind = 1;
while ((opt = getopt(argc, argv, template)) != -1) {
if (opt < 0 || opt >= SCHAR_MAX)
continue;
if (opt == '?' || (ptr = strchr(template, opt)) == NULL) {
free(args->flags);
free(args);
return (NULL);
}
bit_set(args->flags, opt);
if (ptr[1] == ':') {
free(args->values[opt]);
args->values[opt] = xstrdup(optarg);
}
}
argc -= optind;
argv += optind;
args->argc = argc;
args->argv = cmd_copy_argv(argc, argv);
return (args);
}
/* Free an arguments set. */
void
args_free(struct args *args)
{
u_int i;
cmd_free_argv(args->argc, args->argv);
for (i = 0; i < SCHAR_MAX; i++)
free(args->values[i]);
free(args->flags);
free(args);
}
/* Print a set of arguments. */
size_t
args_print(struct args *args, char *buf, size_t len)
{
size_t off;
int i;
const char *quotes;
/* There must be at least one byte at the start. */
if (len == 0)
return (0);
off = 0;
/* Process the flags first. */
buf[off++] = '-';
for (i = 0; i < SCHAR_MAX; i++) {
if (!bit_test(args->flags, i) || args->values[i] != NULL)
continue;
if (off == len - 1) {
buf[off] = '\0';
return (len);
}
buf[off++] = i;
buf[off] = '\0';
}
if (off == 1)
buf[--off] = '\0';
/* Then the flags with arguments. */
for (i = 0; i < SCHAR_MAX; i++) {
if (!bit_test(args->flags, i) || args->values[i] == NULL)
continue;
if (off >= len) {
/* snprintf will have zero terminated. */
return (len);
}
if (strchr(args->values[i], ' ') != NULL)
quotes = "\"";
else
quotes = "";
off += xsnprintf(buf + off, len - off, "%s-%c %s%s%s",
off != 0 ? " " : "", i, quotes, args->values[i], quotes);
}
/* And finally the argument vector. */
for (i = 0; i < args->argc; i++) {
if (off >= len) {
/* snprintf will have zero terminated. */
return (len);
}
if (strchr(args->argv[i], ' ') != NULL)
quotes = "\"";
else
quotes = "";
off += xsnprintf(buf + off, len - off, "%s%s%s%s",
off != 0 ? " " : "", quotes, args->argv[i], quotes);
}
return (off);
}
/* Return if an argument is present. */
int
args_has(struct args *args, u_char ch)
{
return (bit_test(args->flags, ch));
}
/* Set argument value. */
void
args_set(struct args *args, u_char ch, const char *value)
{
free(args->values[ch]);
if (value != NULL)
args->values[ch] = xstrdup(value);
else
args->values[ch] = NULL;
bit_set(args->flags, ch);
}
/* Get argument value. Will be NULL if it isn't present. */
const char *
args_get(struct args *args, u_char ch)
{
return (args->values[ch]);
}
/* Convert an argument value to a number. */
long long
args_strtonum(struct args *args,
u_char ch, long long minval, long long maxval, char **cause)
{
const char *errstr;
long long ll;
if (!args_has(args, ch)) {
*cause = xstrdup("missing");
return (0);
}
ll = strtonum(args->values[ch], minval, maxval, &errstr);
if (errstr != NULL) {
*cause = xstrdup(errstr);
return (0);
}
*cause = NULL;
return (ll);
}

View File

@@ -1,4 +1,4 @@
/* $Id: array.h,v 1.10 2010-02-08 18:29:32 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2006 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2006 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -47,7 +47,7 @@
} \ } \
} while (0) } while (0)
#define ARRAY_EMPTY(a) ((a) == NULL || (a)->num == 0) #define ARRAY_EMPTY(a) (((void *) (a)) == NULL || (a)->num == 0)
#define ARRAY_LENGTH(a) ((a)->num) #define ARRAY_LENGTH(a) ((a)->num)
#define ARRAY_DATA(a) ((a)->list) #define ARRAY_DATA(a) ((a)->list)
@@ -109,13 +109,12 @@
} while (0) } while (0)
#define ARRAY_FREE(a) do { \ #define ARRAY_FREE(a) do { \
if ((a)->list != NULL) \ free((a)->list); \
xfree((a)->list); \
ARRAY_INIT(a); \ ARRAY_INIT(a); \
} while (0) } while (0)
#define ARRAY_FREEALL(a) do { \ #define ARRAY_FREEALL(a) do { \
ARRAY_FREE(a); \ ARRAY_FREE(a); \
xfree(a); \ free(a); \
} while (0) } while (0)
#endif #endif

View File

@@ -1,4 +1,4 @@
/* $Id: attributes.c,v 1.3 2009-11-28 14:46:23 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Joshua Elsasser <josh@elsasser.org> * Copyright (c) 2009 Joshua Elsasser <josh@elsasser.org>
@@ -26,27 +26,21 @@ const char *
attributes_tostring(u_char attr) attributes_tostring(u_char attr)
{ {
static char buf[128]; static char buf[128];
size_t len;
if (attr == 0) if (attr == 0)
return ("default"); return ("none");
buf[0] = '\0'; len = xsnprintf(buf, sizeof buf, "%s%s%s%s%s%s%s",
if (attr & GRID_ATTR_BRIGHT) attr & GRID_ATTR_BRIGHT ? "bright," : "",
strlcat(buf, "bright,", sizeof (buf)); attr & GRID_ATTR_DIM ? "dim," : "",
if (attr & GRID_ATTR_DIM) attr & GRID_ATTR_UNDERSCORE ? "underscore," : "",
strlcat(buf, "dim,", sizeof (buf)); attr & GRID_ATTR_BLINK ? "blink," : "",
if (attr & GRID_ATTR_UNDERSCORE) attr & GRID_ATTR_REVERSE ? "reverse," : "",
strlcat(buf, "underscore,", sizeof (buf)); attr & GRID_ATTR_HIDDEN ? "hidden," : "",
if (attr & GRID_ATTR_BLINK) attr & GRID_ATTR_ITALICS ? "italics," : "");
strlcat(buf, "blink,", sizeof (buf)); if (len > 0)
if (attr & GRID_ATTR_REVERSE) buf[len - 1] = '\0';
strlcat(buf, "reverse,", sizeof (buf));
if (attr & GRID_ATTR_HIDDEN)
strlcat(buf, "hidden,", sizeof (buf));
if (attr & GRID_ATTR_ITALICS)
strlcat(buf, "italics,", sizeof (buf));
if (*buf != '\0')
*(strrchr(buf, ',')) = '\0';
return (buf); return (buf);
} }
@@ -63,7 +57,7 @@ attributes_fromstring(const char *str)
if (strchr(delimiters, str[strlen(str) - 1]) != NULL) if (strchr(delimiters, str[strlen(str) - 1]) != NULL)
return (-1); return (-1);
if (strcasecmp(str, "default") == 0) if (strcasecmp(str, "default") == 0 || strcasecmp(str, "none") == 0)
return (0); return (0);
attr = 0; attr = 0;

18
autogen.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/sh
# $Id$
if [ "x$(uname)" = "xOpenBSD" ]; then
[ -z "$AUTOMAKE_VERSION" ] && export AUTOMAKE_VERSION=1.10
[ -z "$AUTOCONF_VERSION" ] && export AUTOCONF_VERSION=2.65
fi
die()
{
echo "$@" >&2
exit 1
}
mkdir -p etc
aclocal || die "aclocal failed"
automake --add-missing --force-missing --copy --foreign || die "automake failed"
autoreconf || die "autoreconf failed"

188
cfg.c
View File

@@ -1,4 +1,4 @@
/* $Id: cfg.c,v 1.26 2010-02-08 18:29:32 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -19,125 +19,133 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <ctype.h>
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
/* struct cmd_q *cfg_cmd_q;
* Config file parser. Pretty quick and simple, each line is parsed into a int cfg_finished;
* argv array and executed as a command. int cfg_references;
*/ struct causelist cfg_causes;
void printflike2 cfg_print(struct cmd_ctx *, const char *, ...);
void printflike2 cfg_error(struct cmd_ctx *, const char *, ...);
char *cfg_cause;
int cfg_finished;
struct causelist cfg_causes = ARRAY_INITIALIZER;
/* ARGSUSED */
void printflike2
cfg_print(unused struct cmd_ctx *ctx, unused const char *fmt, ...)
{
}
/* ARGSUSED */
void printflike2
cfg_error(unused struct cmd_ctx *ctx, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
xvasprintf(&cfg_cause, fmt, ap);
va_end(ap);
}
void printflike2
cfg_add_cause(struct causelist *causes, const char *fmt, ...)
{
char *cause;
va_list ap;
va_start(ap, fmt);
xvasprintf(&cause, fmt, ap);
va_end(ap);
ARRAY_ADD(causes, cause);
}
/*
* Load configuration file. Returns -1 for an error with a list of messages in
* causes. Note that causes and ncauses must be initialised by the caller!
*/
int int
load_cfg(const char *path, struct cmd_ctx *ctxin, struct causelist *causes) load_cfg(const char *path, struct cmd_q *cmdq, char **cause)
{ {
FILE *f; FILE *f;
u_int n; u_int n, found;
char *buf, *line, *cause; char *buf, *copy, *line, *cause1, *msg;
size_t len; size_t len, oldlen;
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
struct cmd_ctx ctx;
log_debug("loading %s", path);
if ((f = fopen(path, "rb")) == NULL) { if ((f = fopen(path, "rb")) == NULL) {
cfg_add_cause(causes, "%s: %s", path, strerror(errno)); xasprintf(cause, "%s: %s", path, strerror(errno));
return (-1); return (-1);
} }
n = 0;
n = found = 0;
line = NULL; line = NULL;
while ((buf = fgetln(f, &len))) { while ((buf = fgetln(f, &len))) {
/* Trim \n. */
if (buf[len - 1] == '\n') if (buf[len - 1] == '\n')
buf[len - 1] = '\0'; len--;
else { log_debug("%s: %.*s", path, (int)len, buf);
line = xrealloc(line, 1, len + 1);
memcpy(line, buf, len); /* Current line is the continuation of the previous one. */
line[len] = '\0'; if (line != NULL) {
buf = line; oldlen = strlen(line);
line = xrealloc(line, 1, oldlen + len + 1);
} else {
oldlen = 0;
line = xmalloc(len + 1);
} }
/* Append current line to the previous. */
memcpy(line + oldlen, buf, len);
line[oldlen + len] = '\0';
n++; n++;
if (cmd_string_parse(buf, &cmdlist, &cause) != 0) { /* Continuation: get next line? */
if (cause == NULL) len = strlen(line);
if (len > 0 && line[len - 1] == '\\') {
line[len - 1] = '\0';
/* Ignore escaped backslash at EOL. */
if (len > 1 && line[len - 2] != '\\')
continue; continue;
cfg_add_cause(causes, "%s: %u: %s", path, n, cause); }
xfree(cause); copy = line;
line = NULL;
/* Skip empty lines. */
buf = copy;
while (isspace((u_char)*buf))
buf++;
if (*buf == '\0') {
free(copy);
continue; continue;
} }
/* Parse and run the command. */
if (cmd_string_parse(buf, &cmdlist, path, n, &cause1) != 0) {
free(copy);
if (cause1 == NULL)
continue;
xasprintf(&msg, "%s:%u: %s", path, n, cause1);
ARRAY_ADD(&cfg_causes, msg);
free(cause1);
continue;
}
free(copy);
if (cmdlist == NULL) if (cmdlist == NULL)
continue; continue;
cfg_cause = NULL; cmdq_append(cmdq, cmdlist);
if (ctxin == NULL) {
ctx.msgdata = NULL;
ctx.curclient = NULL;
ctx.cmdclient = NULL;
} else {
ctx.msgdata = ctxin->msgdata;
ctx.curclient = ctxin->curclient;
ctx.cmdclient = ctxin->cmdclient;
}
ctx.error = cfg_error;
ctx.print = cfg_print;
ctx.info = cfg_print;
cfg_cause = NULL;
cmd_list_exec(cmdlist, &ctx);
cmd_list_free(cmdlist); cmd_list_free(cmdlist);
if (cfg_cause != NULL) { found++;
cfg_add_cause(causes, "%s: %d: %s", path, n, cfg_cause);
xfree(cfg_cause);
continue;
}
} }
if (line != NULL) if (line != NULL)
xfree(line); free(line);
fclose(f); fclose(f);
if (ARRAY_LENGTH(causes) != 0) return (found);
return (-1); }
return (0);
void
cfg_default_done(unused struct cmd_q *cmdq)
{
if (--cfg_references != 0)
return;
cfg_finished = 1;
if (!RB_EMPTY(&sessions))
cfg_show_causes(RB_MIN(sessions, &sessions));
cmdq_free(cfg_cmd_q);
cfg_cmd_q = NULL;
}
void
cfg_show_causes(struct session *s)
{
struct window_pane *wp;
char *cause;
u_int i;
if (s == NULL || ARRAY_EMPTY(&cfg_causes))
return;
wp = s->curw->window->active;
window_pane_set_mode(wp, &window_copy_mode);
window_copy_init_for_output(wp);
for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) {
cause = ARRAY_ITEM(&cfg_causes, i);
window_copy_add(wp, "%s", cause);
free(cause);
}
ARRAY_FREE(&cfg_causes);
} }

584
client.c
View File

@@ -1,4 +1,4 @@
/* $Id: client.c,v 1.90 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -17,7 +17,7 @@
*/ */
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h> #include <sys/file.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/un.h> #include <sys/un.h>
@@ -29,102 +29,295 @@
#include <pwd.h> #include <pwd.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <syslog.h>
#include <unistd.h> #include <unistd.h>
#include "tmux.h" #include "tmux.h"
struct imsgbuf client_ibuf; struct imsgbuf client_ibuf;
struct event client_event; struct event client_event;
const char *client_exitmsg; struct event client_stdin;
enum {
CLIENT_EXIT_NONE,
CLIENT_EXIT_DETACHED,
CLIENT_EXIT_DETACHED_HUP,
CLIENT_EXIT_LOST_TTY,
CLIENT_EXIT_TERMINATED,
CLIENT_EXIT_LOST_SERVER,
CLIENT_EXIT_EXITED,
CLIENT_EXIT_SERVER_EXITED,
} client_exitreason = CLIENT_EXIT_NONE;
int client_exitval; int client_exitval;
enum msgtype client_exittype;
int client_attached;
int client_get_lock(char *);
int client_connect(char *, int);
void client_send_identify(int); void client_send_identify(int);
void client_send_environ(void); void client_send_environ(void);
void client_write_server(enum msgtype, void *, size_t); void client_write_server(enum msgtype, void *, size_t);
void client_update_event(void); void client_update_event(void);
void client_signal(int, short, void *); void client_signal(int, short, void *);
void client_stdin_callback(int, short, void *);
void client_write(int, const char *, size_t);
void client_callback(int, short, void *); void client_callback(int, short, void *);
int client_dispatch(void); int client_dispatch_attached(void);
int client_dispatch_wait(void *);
const char *client_exit_message(void);
struct imsgbuf * /*
client_init(char *path, int cmdflags, int flags) * Get server create lock. If already held then server start is happening in
* another client, so block until the lock is released and return -1 to
* retry. Ignore other errors - just continue and start the server without the
* lock.
*/
int
client_get_lock(char *lockfile)
{
int lockfd;
if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1)
fatal("open failed");
if (flock(lockfd, LOCK_EX|LOCK_NB) == -1 && errno == EWOULDBLOCK) {
while (flock(lockfd, LOCK_EX) == -1 && errno == EINTR)
/* nothing */;
close(lockfd);
return (-1);
}
return (lockfd);
}
/* Connect client to server. */
int
client_connect(char *path, int start_server)
{ {
struct sockaddr_un sa; struct sockaddr_un sa;
size_t size; size_t size;
int fd, mode; int fd, lockfd;
#ifdef HAVE_SETPROCTITLE char *lockfile;
char rpathbuf[MAXPATHLEN];
#endif
#ifdef HAVE_SETPROCTITLE
if (realpath(path, rpathbuf) == NULL)
strlcpy(rpathbuf, path, sizeof rpathbuf);
setproctitle("client (%s)", rpathbuf);
#endif
memset(&sa, 0, sizeof sa); memset(&sa, 0, sizeof sa);
sa.sun_family = AF_UNIX; sa.sun_family = AF_UNIX;
size = strlcpy(sa.sun_path, path, sizeof sa.sun_path); size = strlcpy(sa.sun_path, path, sizeof sa.sun_path);
if (size >= sizeof sa.sun_path) { if (size >= sizeof sa.sun_path) {
errno = ENAMETOOLONG; errno = ENAMETOOLONG;
goto not_found; return (-1);
} }
retry:
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
fatal("socket failed"); fatal("socket failed");
if (connect(fd, (struct sockaddr *) &sa, SUN_LEN(&sa)) == -1) { if (connect(fd, (struct sockaddr *) &sa, SUN_LEN(&sa)) == -1) {
if (!(cmdflags & CMD_STARTSERVER)) if (errno != ECONNREFUSED && errno != ENOENT)
goto not_found; goto failed;
switch (errno) { if (!start_server)
case ECONNREFUSED: goto failed;
if (unlink(path) != 0) close(fd);
goto not_found;
/* FALLTHROUGH */ xasprintf(&lockfile, "%s.lock", path);
case ENOENT: if ((lockfd = client_get_lock(lockfile)) == -1)
if ((fd = server_start(path)) == -1) goto retry;
goto start_failed; if (unlink(path) != 0 && errno != ENOENT)
goto server_started; return (-1);
} fd = server_start(lockfd, lockfile);
goto not_found; free(lockfile);
close(lockfd);
} }
server_started: setblocking(fd, 0);
if ((mode = fcntl(fd, F_GETFL)) == -1) return (fd);
fatal("fcntl failed");
if (fcntl(fd, F_SETFL, mode|O_NONBLOCK) == -1)
fatal("fcntl failed");
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
fatal("fcntl failed");
imsg_init(&client_ibuf, fd);
if (cmdflags & CMD_SENDENVIRON) failed:
client_send_environ(); close(fd);
if (isatty(STDIN_FILENO)) return (-1);
client_send_identify(flags);
return (&client_ibuf);
start_failed:
log_warnx("server failed to start");
return (NULL);
not_found:
log_warn("server not found");
return (NULL);
} }
/* Get exit string from reason number. */
const char *
client_exit_message(void)
{
switch (client_exitreason) {
case CLIENT_EXIT_NONE:
break;
case CLIENT_EXIT_DETACHED:
return ("detached");
case CLIENT_EXIT_DETACHED_HUP:
return ("detached and SIGHUP");
case CLIENT_EXIT_LOST_TTY:
return ("lost tty");
case CLIENT_EXIT_TERMINATED:
return ("terminated");
case CLIENT_EXIT_LOST_SERVER:
return ("lost server");
case CLIENT_EXIT_EXITED:
return ("exited");
case CLIENT_EXIT_SERVER_EXITED:
return ("server exited");
}
return ("unknown reason");
}
/* Client main loop. */
int
client_main(int argc, char **argv, int flags)
{
struct cmd *cmd;
struct cmd_list *cmdlist;
struct msg_command_data cmddata;
int cmdflags, fd;
pid_t ppid;
enum msgtype msg;
char *cause;
struct termios tio, saved_tio;
/* Set up the initial command. */
cmdflags = 0;
if (shell_cmd != NULL) {
msg = MSG_SHELL;
cmdflags = CMD_STARTSERVER;
} else if (argc == 0) {
msg = MSG_COMMAND;
cmdflags = CMD_STARTSERVER|CMD_SENDENVIRON|CMD_CANTNEST;
} else {
msg = MSG_COMMAND;
/*
* It sucks parsing the command string twice (in client and
* later in server) but it is necessary to get the start server
* flag.
*/
cmdlist = cmd_list_parse(argc, argv, NULL, 0, &cause);
if (cmdlist == NULL) {
fprintf(stderr, "%s\n", cause);
return (1);
}
cmdflags &= ~CMD_STARTSERVER;
TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (cmd->entry->flags & CMD_STARTSERVER)
cmdflags |= CMD_STARTSERVER;
if (cmd->entry->flags & CMD_SENDENVIRON)
cmdflags |= CMD_SENDENVIRON;
if (cmd->entry->flags & CMD_CANTNEST)
cmdflags |= CMD_CANTNEST;
}
cmd_list_free(cmdlist);
}
/*
* Check if this could be a nested session, if the command can't nest:
* if the socket path matches $TMUX, this is probably the same server.
*/
if (shell_cmd == NULL && environ_path != NULL &&
(cmdflags & CMD_CANTNEST) &&
strcmp(socket_path, environ_path) == 0) {
fprintf(stderr, "sessions should be nested with care, "
"unset $TMUX to force\n");
return (1);
}
/* Initialise the client socket and start the server. */
fd = client_connect(socket_path, cmdflags & CMD_STARTSERVER);
if (fd == -1) {
fprintf(stderr, "failed to connect to server\n");
return (1);
}
/* Set process title, log and signals now this is the client. */
#ifdef HAVE_SETPROCTITLE
setproctitle("client (%s)", socket_path);
#endif
logfile("client");
/* Create imsg. */
imsg_init(&client_ibuf, fd);
event_set(&client_event, fd, EV_READ, client_callback, shell_cmd);
/* Create stdin handler. */
setblocking(STDIN_FILENO, 0);
event_set(&client_stdin, STDIN_FILENO, EV_READ|EV_PERSIST,
client_stdin_callback, NULL);
if (flags & IDENTIFY_TERMIOS) {
if (tcgetattr(STDIN_FILENO, &saved_tio) != 0) {
fprintf(stderr, "tcgetattr failed: %s\n",
strerror(errno));
return (1);
}
cfmakeraw(&tio);
tio.c_iflag = ICRNL|IXANY;
tio.c_oflag = OPOST|ONLCR;
#ifdef NOKERNINFO
tio.c_lflag = NOKERNINFO;
#endif
tio.c_cflag = CREAD|CS8|HUPCL;
tio.c_cc[VMIN] = 1;
tio.c_cc[VTIME] = 0;
cfsetispeed(&tio, cfgetispeed(&saved_tio));
cfsetospeed(&tio, cfgetospeed(&saved_tio));
tcsetattr(STDIN_FILENO, TCSANOW, &tio);
}
/* Establish signal handlers. */
set_signals(client_signal);
/* Send initial environment. */
if (cmdflags & CMD_SENDENVIRON)
client_send_environ();
client_send_identify(flags);
/* Send first command. */
if (msg == MSG_COMMAND) {
/* Fill in command line arguments. */
cmddata.pid = environ_pid;
cmddata.session_id = environ_session_id;
/* Prepare command for server. */
cmddata.argc = argc;
if (cmd_pack_argv(
argc, argv, cmddata.argv, sizeof cmddata.argv) != 0) {
fprintf(stderr, "command too long\n");
return (1);
}
client_write_server(msg, &cmddata, sizeof cmddata);
} else if (msg == MSG_SHELL)
client_write_server(msg, NULL, 0);
/* Set the event and dispatch. */
client_update_event();
event_dispatch();
/* Print the exit message, if any, and exit. */
if (client_attached) {
if (client_exitreason != CLIENT_EXIT_NONE && !login_shell)
printf("[%s]\n", client_exit_message());
ppid = getppid();
if (client_exittype == MSG_DETACHKILL && ppid > 1)
kill(ppid, SIGHUP);
} else if (flags & IDENTIFY_TERMIOS) {
if (flags & IDENTIFY_CONTROL) {
if (client_exitreason != CLIENT_EXIT_NONE)
printf("%%exit %s\n", client_exit_message());
else
printf("%%exit\n");
printf("\033\\");
}
tcsetattr(STDOUT_FILENO, TCSAFLUSH, &saved_tio);
}
setblocking(STDIN_FILENO, 1);
return (client_exitval);
}
/* Send identify message to server with the file descriptors. */
void void
client_send_identify(int flags) client_send_identify(int flags)
{ {
struct msg_identify_data data; struct msg_identify_data data;
struct winsize ws;
char *term; char *term;
int fd; int fd;
if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == -1)
fatal("ioctl(TIOCGWINSZ)");
data.flags = flags; data.flags = flags;
if (getcwd(data.cwd, sizeof data.cwd) == NULL) if (getcwd(data.cwd, sizeof data.cwd) == NULL)
@@ -139,8 +332,10 @@ client_send_identify(int flags)
fatal("dup failed"); fatal("dup failed");
imsg_compose(&client_ibuf, imsg_compose(&client_ibuf,
MSG_IDENTIFY, PROTOCOL_VERSION, -1, fd, &data, sizeof data); MSG_IDENTIFY, PROTOCOL_VERSION, -1, fd, &data, sizeof data);
client_update_event();
} }
/* Forward entire environment to server. */
void void
client_send_environ(void) client_send_environ(void)
{ {
@@ -154,12 +349,15 @@ client_send_environ(void)
} }
} }
/* Write a message to the server without a file descriptor. */
void void
client_write_server(enum msgtype type, void *buf, size_t len) client_write_server(enum msgtype type, void *buf, size_t len)
{ {
imsg_compose(&client_ibuf, type, PROTOCOL_VERSION, -1, -1, buf, len); imsg_compose(&client_ibuf, type, PROTOCOL_VERSION, -1, -1, buf, len);
client_update_event();
} }
/* Update client event based on whether it needs to read or read and write. */
void void
client_update_event(void) client_update_event(void)
{ {
@@ -169,102 +367,72 @@ client_update_event(void)
events = EV_READ; events = EV_READ;
if (client_ibuf.w.queued > 0) if (client_ibuf.w.queued > 0)
events |= EV_WRITE; events |= EV_WRITE;
event_set(&client_event, client_ibuf.fd, events, client_callback, NULL); event_set(
&client_event, client_ibuf.fd, events, client_callback, shell_cmd);
event_add(&client_event, NULL); event_add(&client_event, NULL);
} }
__dead void /* Callback to handle signals in the client. */
client_main(void)
{
struct event ev_sigcont, ev_sigterm, ev_sigwinch;
struct sigaction sigact;
logfile("client");
/* Note: event_init() has already been called. */
/* Set up signals. */
memset(&sigact, 0, sizeof sigact);
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = SA_RESTART;
sigact.sa_handler = SIG_IGN;
if (sigaction(SIGINT, &sigact, NULL) != 0)
fatal("sigaction failed");
if (sigaction(SIGPIPE, &sigact, NULL) != 0)
fatal("sigaction failed");
if (sigaction(SIGUSR1, &sigact, NULL) != 0)
fatal("sigaction failed");
if (sigaction(SIGUSR2, &sigact, NULL) != 0)
fatal("sigaction failed");
if (sigaction(SIGTSTP, &sigact, NULL) != 0)
fatal("sigaction failed");
signal_set(&ev_sigcont, SIGCONT, client_signal, NULL);
signal_add(&ev_sigcont, NULL);
signal_set(&ev_sigterm, SIGTERM, client_signal, NULL);
signal_add(&ev_sigterm, NULL);
signal_set(&ev_sigwinch, SIGWINCH, client_signal, NULL);
signal_add(&ev_sigwinch, NULL);
/*
* imsg_read in the first client poll loop (before the terminal has
* been initialised) may have read messages into the buffer after the
* MSG_READY switched to here. Process anything outstanding now to
* avoid hanging waiting for messages that have already arrived.
*/
if (client_dispatch() != 0)
goto out;
/* Set the event and dispatch. */
client_update_event();
event_dispatch();
out:
/* Print the exit message, if any, and exit. */
if (client_exitmsg != NULL && !login_shell)
printf("[%s]\n", client_exitmsg);
exit(client_exitval);
}
/* ARGSUSED */
void void
client_signal(int sig, unused short events, unused void *data) client_signal(int sig, unused short events, unused void *data)
{ {
struct sigaction sigact; struct sigaction sigact;
int status;
switch (sig) { if (!client_attached) {
case SIGTERM: switch (sig) {
client_exitmsg = "terminated"; case SIGCHLD:
client_exitval = 1; waitpid(WAIT_ANY, &status, WNOHANG);
client_write_server(MSG_EXITING, NULL, 0); break;
break; case SIGTERM:
case SIGWINCH: event_loopexit(NULL);
client_write_server(MSG_RESIZE, NULL, 0); break;
break; }
case SIGCONT: } else {
memset(&sigact, 0, sizeof sigact); switch (sig) {
sigemptyset(&sigact.sa_mask); case SIGHUP:
sigact.sa_flags = SA_RESTART; client_exitreason = CLIENT_EXIT_LOST_TTY;
sigact.sa_handler = SIG_IGN; client_exitval = 1;
if (sigaction(SIGTSTP, &sigact, NULL) != 0) client_write_server(MSG_EXITING, NULL, 0);
fatal("sigaction failed"); break;
client_write_server(MSG_WAKEUP, NULL, 0); case SIGTERM:
break; client_exitreason = CLIENT_EXIT_TERMINATED;
client_exitval = 1;
client_write_server(MSG_EXITING, NULL, 0);
break;
case SIGWINCH:
client_write_server(MSG_RESIZE, NULL, 0);
break;
case SIGCONT:
memset(&sigact, 0, sizeof sigact);
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = SA_RESTART;
sigact.sa_handler = SIG_IGN;
if (sigaction(SIGTSTP, &sigact, NULL) != 0)
fatal("sigaction failed");
client_write_server(MSG_WAKEUP, NULL, 0);
break;
}
} }
client_update_event(); client_update_event();
} }
/* ARGSUSED */ /* Callback for client imsg read events. */
void void
client_callback(unused int fd, short events, unused void *data) client_callback(unused int fd, short events, void *data)
{ {
ssize_t n; ssize_t n;
int retval;
if (events & EV_READ) { if (events & EV_READ) {
if ((n = imsg_read(&client_ibuf)) == -1 || n == 0) if ((n = imsg_read(&client_ibuf)) == -1 || n == 0)
goto lost_server; goto lost_server;
if (client_dispatch() != 0) { if (client_attached)
retval = client_dispatch_attached();
else
retval = client_dispatch_wait(data);
if (retval != 0) {
event_loopexit(NULL); event_loopexit(NULL);
return; return;
} }
@@ -279,13 +447,143 @@ client_callback(unused int fd, short events, unused void *data)
return; return;
lost_server: lost_server:
client_exitmsg = "lost server"; client_exitreason = CLIENT_EXIT_LOST_SERVER;
client_exitval = 1; client_exitval = 1;
event_loopexit(NULL); event_loopexit(NULL);
} }
/* Callback for client stdin read events. */
void
client_stdin_callback(unused int fd, unused short events, unused void *data1)
{
struct msg_stdin_data data;
data.size = read(STDIN_FILENO, data.data, sizeof data.data);
if (data.size < 0 && (errno == EINTR || errno == EAGAIN))
return;
client_write_server(MSG_STDIN, &data, sizeof data);
if (data.size <= 0)
event_del(&client_stdin);
client_update_event();
}
/* Force write to file descriptor. */
void
client_write(int fd, const char *data, size_t size)
{
ssize_t used;
while (size != 0) {
used = write(fd, data, size);
if (used == -1) {
if (errno == EINTR || errno == EAGAIN)
continue;
break;
}
data += used;
size -= used;
}
}
/* Dispatch imsgs when in wait state (before MSG_READY). */
int int
client_dispatch(void) client_dispatch_wait(void *data)
{
struct imsg imsg;
ssize_t n, datalen;
struct msg_shell_data shelldata;
struct msg_exit_data exitdata;
struct msg_stdout_data stdoutdata;
struct msg_stderr_data stderrdata;
const char *shellcmd = data;
for (;;) {
if ((n = imsg_get(&client_ibuf, &imsg)) == -1)
fatalx("imsg_get failed");
if (n == 0)
return (0);
datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
log_debug("got %d from server", imsg.hdr.type);
switch (imsg.hdr.type) {
case MSG_EXIT:
case MSG_SHUTDOWN:
if (datalen != sizeof exitdata) {
if (datalen != 0)
fatalx("bad MSG_EXIT size");
} else {
memcpy(&exitdata, imsg.data, sizeof exitdata);
client_exitval = exitdata.retcode;
}
imsg_free(&imsg);
return (-1);
case MSG_READY:
if (datalen != 0)
fatalx("bad MSG_READY size");
event_del(&client_stdin);
client_attached = 1;
client_write_server(MSG_RESIZE, NULL, 0);
break;
case MSG_STDIN:
if (datalen != 0)
fatalx("bad MSG_STDIN size");
event_add(&client_stdin, NULL);
break;
case MSG_STDOUT:
if (datalen != sizeof stdoutdata)
fatalx("bad MSG_STDOUT");
memcpy(&stdoutdata, imsg.data, sizeof stdoutdata);
client_write(STDOUT_FILENO, stdoutdata.data, stdoutdata.size);
break;
case MSG_STDERR:
if (datalen != sizeof stderrdata)
fatalx("bad MSG_STDERR");
memcpy(&stderrdata, imsg.data, sizeof stderrdata);
client_write(STDERR_FILENO, stderrdata.data, stderrdata.size);
break;
case MSG_VERSION:
if (datalen != 0)
fatalx("bad MSG_VERSION size");
fprintf(stderr, "protocol version mismatch "
"(client %u, server %u)\n", PROTOCOL_VERSION,
imsg.hdr.peerid);
client_exitval = 1;
imsg_free(&imsg);
return (-1);
case MSG_SHELL:
if (datalen != sizeof shelldata)
fatalx("bad MSG_SHELL size");
memcpy(&shelldata, imsg.data, sizeof shelldata);
shelldata.shell[(sizeof shelldata.shell) - 1] = '\0';
clear_signals(0);
shell_exec(shelldata.shell, shellcmd);
/* NOTREACHED */
case MSG_DETACH:
client_write_server(MSG_EXITING, NULL, 0);
break;
case MSG_EXITED:
imsg_free(&imsg);
return (-1);
default:
fatalx("unexpected message");
}
imsg_free(&imsg);
}
}
/* Dispatch imsgs in attached state (after MSG_READY). */
int
client_dispatch_attached(void)
{ {
struct imsg imsg; struct imsg imsg;
struct msg_lock_data lockdata; struct msg_lock_data lockdata;
@@ -299,21 +597,27 @@ client_dispatch(void)
return (0); return (0);
datalen = imsg.hdr.len - IMSG_HEADER_SIZE; datalen = imsg.hdr.len - IMSG_HEADER_SIZE;
log_debug("client got %d", imsg.hdr.type); log_debug("got %d from server", imsg.hdr.type);
switch (imsg.hdr.type) { switch (imsg.hdr.type) {
case MSG_DETACHKILL:
case MSG_DETACH: case MSG_DETACH:
if (datalen != 0) if (datalen != 0)
fatalx("bad MSG_DETACH size"); fatalx("bad MSG_DETACH size");
client_exittype = imsg.hdr.type;
if (imsg.hdr.type == MSG_DETACHKILL)
client_exitreason = CLIENT_EXIT_DETACHED_HUP;
else
client_exitreason = CLIENT_EXIT_DETACHED;
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
client_exitmsg = "detached";
break; break;
case MSG_EXIT: case MSG_EXIT:
if (datalen != 0) if (datalen != 0 &&
datalen != sizeof (struct msg_exit_data))
fatalx("bad MSG_EXIT size"); fatalx("bad MSG_EXIT size");
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
client_exitmsg = "exited"; client_exitreason = CLIENT_EXIT_EXITED;
break; break;
case MSG_EXITED: case MSG_EXITED:
if (datalen != 0) if (datalen != 0)
@@ -326,7 +630,7 @@ client_dispatch(void)
fatalx("bad MSG_SHUTDOWN size"); fatalx("bad MSG_SHUTDOWN size");
client_write_server(MSG_EXITING, NULL, 0); client_write_server(MSG_EXITING, NULL, 0);
client_exitmsg = "server exited"; client_exitreason = CLIENT_EXIT_SERVER_EXITED;
client_exitval = 1; client_exitval = 1;
break; break;
case MSG_SUSPEND: case MSG_SUSPEND:

View File

@@ -1,4 +1,4 @@
/* $Id: clock.c,v 1.9 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-attach-session.c,v 1.36 2010-02-08 18:27:34 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,47 +18,48 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include "tmux.h" #include "tmux.h"
/* /*
* Attach existing session to the current terminal. * Attach existing session to the current terminal.
*/ */
int cmd_attach_session_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_attach_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_attach_session_entry = { const struct cmd_entry cmd_attach_session_entry = {
"attach-session", "attach", "attach-session", "attach",
"drt:", 0, 0,
"[-dr] " CMD_TARGET_SESSION_USAGE, "[-dr] " CMD_TARGET_SESSION_USAGE,
CMD_CANTNEST|CMD_STARTSERVER|CMD_SENDENVIRON, "dr", CMD_CANTNEST|CMD_STARTSERVER|CMD_SENDENVIRON,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_attach_session_exec, cmd_attach_session_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_attach_session(struct cmd_q *cmdq, const char* tflag, int dflag, int rflag)
{ {
struct cmd_target_data *data = self->data; struct session *s;
struct session *s; struct client *c;
struct client *c; const char *update;
const char *update; char *cause;
char *overrides, *cause; u_int i;
u_int i;
if (ARRAY_LENGTH(&sessions) == 0) { if (RB_EMPTY(&sessions)) {
ctx->error(ctx, "no sessions"); cmdq_error(cmdq, "no sessions");
return (-1); return (CMD_RETURN_ERROR);
} }
if ((s = cmd_find_session(ctx, data->target)) == NULL)
return (-1);
if (ctx->cmdclient == NULL && ctx->curclient == NULL) if ((s = cmd_find_session(cmdq, tflag, 1)) == NULL)
return (0); return (CMD_RETURN_ERROR);
if (ctx->cmdclient == NULL) { if (cmdq->client == NULL)
if (cmd_check_flag(data->chflags, 'd')) { return (CMD_RETURN_NORMAL);
if (cmdq->client->session != NULL) {
if (dflag) {
/* /*
* Can't use server_write_session in case attaching to * Can't use server_write_session in case attaching to
* the same session as currently attached to. * the same session as currently attached to.
@@ -67,44 +68,53 @@ cmd_attach_session_exec(struct cmd *self, struct cmd_ctx *ctx)
c = ARRAY_ITEM(&clients, i); c = ARRAY_ITEM(&clients, i);
if (c == NULL || c->session != s) if (c == NULL || c->session != s)
continue; continue;
if (c == ctx->curclient) if (c == cmdq->client)
continue; continue;
server_write_client(c, MSG_DETACH, NULL, 0); server_write_client(c, MSG_DETACH, NULL, 0);
} }
} }
ctx->curclient->session = s; cmdq->client->session = s;
server_redraw_client(ctx->curclient); notify_attached_session_changed(cmdq->client);
session_update_activity(s);
server_redraw_client(cmdq->client);
s->curw->flags &= ~WINLINK_ALERTFLAGS;
} else { } else {
if (!(ctx->cmdclient->flags & CLIENT_TERMINAL)) { if (server_client_open(cmdq->client, s, &cause) != 0) {
ctx->error(ctx, "not a terminal"); cmdq_error(cmdq, "open terminal failed: %s", cause);
return (-1); free(cause);
return (CMD_RETURN_ERROR);
} }
overrides = if (rflag)
options_get_string(&s->options, "terminal-overrides"); cmdq->client->flags |= CLIENT_READONLY;
if (tty_open(&ctx->cmdclient->tty, overrides, &cause) != 0) {
ctx->error(ctx, "terminal open failed: %s", cause);
xfree(cause);
return (-1);
}
if (cmd_check_flag(data->chflags, 'r')) if (dflag)
ctx->cmdclient->flags |= CLIENT_READONLY;
if (cmd_check_flag(data->chflags, 'd'))
server_write_session(s, MSG_DETACH, NULL, 0); server_write_session(s, MSG_DETACH, NULL, 0);
ctx->cmdclient->session = s;
server_write_client(ctx->cmdclient, MSG_READY, NULL, 0);
update = options_get_string(&s->options, "update-environment"); update = options_get_string(&s->options, "update-environment");
environ_update(update, &ctx->cmdclient->environ, &s->environ); environ_update(update, &cmdq->client->environ, &s->environ);
server_redraw_client(ctx->cmdclient); cmdq->client->session = s;
notify_attached_session_changed(cmdq->client);
session_update_activity(s);
server_redraw_client(cmdq->client);
s->curw->flags &= ~WINLINK_ALERTFLAGS;
server_write_ready(cmdq->client);
cmdq->client_exit = 0;
} }
recalculate_sizes(); recalculate_sizes();
server_update_socket(); server_update_socket();
return (1); /* 1 means don't tell command client to exit */ return (CMD_RETURN_NORMAL);
}
enum cmd_retval
cmd_attach_session_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
return (cmd_attach_session(cmdq, args_get(args, 't'),
args_has(args, 'd'), args_has(args, 'r')));
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-bind-key.c,v 1.28 2010-01-25 17:12:44 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
@@ -26,177 +27,110 @@
* Bind a key to a command, this recurses through cmd_*. * Bind a key to a command, this recurses through cmd_*.
*/ */
int cmd_bind_key_parse(struct cmd *, int, char **, char **); enum cmd_retval cmd_bind_key_check(struct args *);
int cmd_bind_key_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_bind_key_exec(struct cmd *, struct cmd_q *);
void cmd_bind_key_free(struct cmd *);
size_t cmd_bind_key_print(struct cmd *, char *, size_t);
int cmd_bind_key_table(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_bind_key_table(struct cmd *, struct cmd_q *, int);
struct cmd_bind_key_data {
int key;
int can_repeat;
struct cmd_list *cmdlist;
int command_key;
char *tablename;
char *modecmd;
};
const struct cmd_entry cmd_bind_key_entry = { const struct cmd_entry cmd_bind_key_entry = {
"bind-key", "bind", "bind-key", "bind",
"cnrt:", 1, -1,
"[-cnr] [-t key-table] key command [arguments]", "[-cnr] [-t key-table] key command [arguments]",
0, "", 0,
NULL, NULL,
cmd_bind_key_parse, cmd_bind_key_check,
cmd_bind_key_exec, cmd_bind_key_exec
cmd_bind_key_free,
cmd_bind_key_print
}; };
int enum cmd_retval
cmd_bind_key_parse(struct cmd *self, int argc, char **argv, char **cause) cmd_bind_key_check(struct args *args)
{ {
struct cmd_bind_key_data *data; if (args_has(args, 't')) {
int opt, no_prefix = 0; if (args->argc != 2 && args->argc != 3)
return (CMD_RETURN_ERROR);
self->data = data = xmalloc(sizeof *data);
data->can_repeat = 0;
data->cmdlist = NULL;
data->command_key = 0;
data->tablename = NULL;
data->modecmd = NULL;
while ((opt = getopt(argc, argv, "cnrt:")) != -1) {
switch (opt) {
case 'c':
data->command_key = 1;
break;
case 'n':
no_prefix = 1;
break;
case 'r':
data->can_repeat = 1;
break;
case 't':
if (data->tablename == NULL)
data->tablename = xstrdup(optarg);
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (argc < 1)
goto usage;
if ((data->key = key_string_lookup_string(argv[0])) == KEYC_NONE) {
xasprintf(cause, "unknown key: %s", argv[0]);
goto error;
}
if (!no_prefix)
data->key |= KEYC_PREFIX;
argc--;
argv++;
if (data->tablename != NULL) {
if (argc != 1)
goto usage;
data->modecmd = xstrdup(argv[0]);
} else { } else {
if ((data->cmdlist = cmd_list_parse(argc, argv, cause)) == NULL) if (args->argc < 2)
goto error; return (CMD_RETURN_ERROR);
}
return (CMD_RETURN_NORMAL);
}
enum cmd_retval
cmd_bind_key_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
char *cause;
struct cmd_list *cmdlist;
int key;
key = key_string_lookup_string(args->argv[0]);
if (key == KEYC_NONE) {
cmdq_error(cmdq, "unknown key: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
} }
return (0); if (args_has(args, 't'))
return (cmd_bind_key_table(self, cmdq, key));
usage: cmdlist = cmd_list_parse(args->argc - 1, args->argv + 1, NULL, 0,
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage); &cause);
if (cmdlist == NULL) {
cmdq_error(cmdq, "%s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
error: if (!args_has(args, 'n'))
self->entry->free(self); key |= KEYC_PREFIX;
return (-1); key_bindings_add(key, args_has(args, 'r'), cmdlist);
return (CMD_RETURN_NORMAL);
} }
int enum cmd_retval
cmd_bind_key_exec(struct cmd *self, unused struct cmd_ctx *ctx) cmd_bind_key_table(struct cmd *self, struct cmd_q *cmdq, int key)
{ {
struct cmd_bind_key_data *data = self->data; struct args *args = self->args;
const char *tablename;
if (data == NULL)
return (0);
if (data->tablename != NULL)
return (cmd_bind_key_table(self, ctx));
key_bindings_add(data->key, data->can_repeat, data->cmdlist);
data->cmdlist = NULL; /* avoid free */
return (0);
}
int
cmd_bind_key_table(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_bind_key_data *data = self->data;
const struct mode_key_table *mtab; const struct mode_key_table *mtab;
struct mode_key_binding *mbind, mtmp; struct mode_key_binding *mbind, mtmp;
enum mode_key_cmd cmd; enum mode_key_cmd cmd;
const char *arg;
if ((mtab = mode_key_findtable(data->tablename)) == NULL) { tablename = args_get(args, 't');
ctx->error(ctx, "unknown key table: %s", data->tablename); if ((mtab = mode_key_findtable(tablename)) == NULL) {
return (-1); cmdq_error(cmdq, "unknown key table: %s", tablename);
return (CMD_RETURN_ERROR);
} }
cmd = mode_key_fromstring(mtab->cmdstr, data->modecmd); cmd = mode_key_fromstring(mtab->cmdstr, args->argv[1]);
if (cmd == MODEKEY_NONE) { if (cmd == MODEKEY_NONE) {
ctx->error(ctx, "unknown command: %s", data->modecmd); cmdq_error(cmdq, "unknown command: %s", args->argv[1]);
return (-1); return (CMD_RETURN_ERROR);
} }
mtmp.key = data->key & ~KEYC_PREFIX; if (cmd != MODEKEYCOPY_COPYPIPE) {
mtmp.mode = data->command_key ? 1 : 0; if (args->argc != 2) {
if ((mbind = SPLAY_FIND(mode_key_tree, mtab->tree, &mtmp)) != NULL) { cmdq_error(cmdq, "no argument allowed");
mbind->cmd = cmd; return (CMD_RETURN_ERROR);
return (0); }
arg = NULL;
} else {
if (args->argc != 3) {
cmdq_error(cmdq, "no argument given");
return (CMD_RETURN_ERROR);
}
arg = args->argv[2];
}
mtmp.key = key;
mtmp.mode = !!args_has(args, 'c');
if ((mbind = RB_FIND(mode_key_tree, mtab->tree, &mtmp)) == NULL) {
mbind = xmalloc(sizeof *mbind);
mbind->key = mtmp.key;
mbind->mode = mtmp.mode;
RB_INSERT(mode_key_tree, mtab->tree, mbind);
} }
mbind = xmalloc(sizeof *mbind);
mbind->key = mtmp.key;
mbind->mode = mtmp.mode;
mbind->cmd = cmd; mbind->cmd = cmd;
SPLAY_INSERT(mode_key_tree, mtab->tree, mbind); mbind->arg = arg != NULL ? xstrdup(arg) : NULL;
return (0); return (CMD_RETURN_NORMAL);
}
void
cmd_bind_key_free(struct cmd *self)
{
struct cmd_bind_key_data *data = self->data;
if (data->cmdlist != NULL)
cmd_list_free(data->cmdlist);
if (data->tablename != NULL)
xfree(data->tablename);
if (data->modecmd != NULL)
xfree(data->modecmd);
xfree(data);
}
size_t
cmd_bind_key_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_bind_key_data *data = self->data;
size_t off = 0;
const char *skey;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
if (off < len) {
skey = key_string_lookup_key(data->key);
off += xsnprintf(buf + off, len - off, " %s ", skey);
}
if (off < len)
off += cmd_list_print(data->cmdlist, buf + off, len - off);
return (off);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-break-pane.c,v 1.11 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,59 +26,90 @@
* Break pane off into a window. * Break pane off into a window.
*/ */
int cmd_break_pane_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_break_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_break_pane_entry = { const struct cmd_entry cmd_break_pane_entry = {
"break-pane", "breakp", "break-pane", "breakp",
CMD_TARGET_PANE_USAGE " [-d]", "dPF:t:", 0, 0,
0, "d", "[-dP] [-F format] " CMD_TARGET_PANE_USAGE,
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_break_pane_exec, NULL,
cmd_target_free, cmd_break_pane_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_break_pane_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_break_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct winlink *wl;
struct session *s; struct session *s;
struct window_pane *wp; struct window_pane *wp;
struct window *w; struct window *w;
char *name;
char *cause; char *cause;
int base_idx; int base_idx;
struct client *c;
struct format_tree *ft;
const char *template;
char *cp;
if ((wl = cmd_find_pane(ctx, data->target, &s, &wp)) == NULL) if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
if (window_count_panes(wl->window) == 1) { if (window_count_panes(wl->window) == 1) {
ctx->error(ctx, "can't break with only one pane"); cmdq_error(cmdq, "can't break with only one pane");
return (-1); return (CMD_RETURN_ERROR);
} }
TAILQ_REMOVE(&wl->window->panes, wp, entry); w = wl->window;
if (wl->window->active == wp) { server_unzoom_window(w);
wl->window->active = TAILQ_PREV(wp, window_panes, entry);
if (wl->window->active == NULL) TAILQ_REMOVE(&w->panes, wp, entry);
wl->window->active = TAILQ_NEXT(wp, entry); if (wp == w->active) {
} w->active = w->last;
w->last = NULL;
if (w->active == NULL) {
w->active = TAILQ_PREV(wp, window_panes, entry);
if (w->active == NULL)
w->active = TAILQ_NEXT(wp, entry);
}
} else if (wp == w->last)
w->last = NULL;
layout_close_pane(wp); layout_close_pane(wp);
w = wp->window = window_create1(s->sx, s->sy); w = wp->window = window_create1(s->sx, s->sy);
TAILQ_INSERT_HEAD(&w->panes, wp, entry); TAILQ_INSERT_HEAD(&w->panes, wp, entry);
w->active = wp; w->active = wp;
w->name = default_window_name(w); name = default_window_name(w);
layout_init(w); window_set_name(w, name);
free(name);
layout_init(w, wp);
base_idx = options_get_number(&s->options, "base-index"); base_idx = options_get_number(&s->options, "base-index");
wl = session_attach(s, w, -1 - base_idx, &cause); /* can't fail */ wl = session_attach(s, w, -1 - base_idx, &cause); /* can't fail */
if (!cmd_check_flag(data->chflags, 'd')) if (!args_has(self->args, 'd'))
session_select(s, wl->idx); session_select(s, wl->idx);
server_redraw_session(s); server_redraw_session(s);
server_status_session_group(s); server_status_session_group(s);
return (0); if (args_has(args, 'P')) {
if ((template = args_get(args, 'F')) == NULL)
template = BREAK_PANE_TEMPLATE;
ft = format_create();
if ((c = cmd_find_client(cmdq, NULL, 1)) != NULL)
format_client(ft, c);
format_session(ft, s);
format_winlink(ft, s, wl);
format_window_pane(ft, wp);
cp = format_expand(ft, template);
cmdq_print(cmdq, "%s", cp);
free(cp);
format_free(ft);
}
return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-capture-pane.c,v 1.3 2010-01-22 17:29:19 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Jonathan Alvarado <radobobo@users.sourceforge.net> * Copyright (c) 2009 Jonathan Alvarado <radobobo@users.sourceforge.net>
@@ -18,66 +18,201 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
/* /*
* Write the entire contents of a pane to a buffer. * Write the entire contents of a pane to a buffer or stdout.
*/ */
int cmd_capture_pane_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_capture_pane_exec(struct cmd *, struct cmd_q *);
char *cmd_capture_pane_append(char *, size_t *, char *, size_t);
char *cmd_capture_pane_pending(struct args *, struct window_pane *,
size_t *);
char *cmd_capture_pane_history(struct args *, struct cmd_q *,
struct window_pane *, size_t *);
const struct cmd_entry cmd_capture_pane_entry = { const struct cmd_entry cmd_capture_pane_entry = {
"capture-pane", "capturep", "capture-pane", "capturep",
CMD_BUFFER_PANE_USAGE, "ab:CeE:JpPqS:t:", 0, 0,
0, "", "[-aCeJpPq] [-b buffer-index] [-E end-line] [-S start-line]"
cmd_buffer_init, CMD_TARGET_PANE_USAGE,
cmd_buffer_parse, 0,
cmd_capture_pane_exec, NULL,
cmd_buffer_free, NULL,
cmd_buffer_print cmd_capture_pane_exec
}; };
int char *
cmd_capture_pane_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_capture_pane_append(char *buf, size_t *len, char *line, size_t linelen)
{ {
struct cmd_buffer_data *data = self->data; buf = xrealloc(buf, 1, *len + linelen + 1);
struct window_pane *wp; memcpy(buf + *len, line, linelen);
char *buf, *line; *len += linelen;
struct screen *s; return (buf);
struct session *sess; }
u_int i, limit;
size_t len, linelen;
if (cmd_find_pane(ctx, data->target, &sess, &wp) == NULL) char *
return (-1); cmd_capture_pane_pending(struct args *args, struct window_pane *wp,
s = &wp->base; size_t *len)
{
char *buf, *line, tmp[5];
size_t linelen;
u_int i;
if (wp->ictx.since_ground == NULL)
return (xstrdup(""));
line = EVBUFFER_DATA(wp->ictx.since_ground);
linelen = EVBUFFER_LENGTH(wp->ictx.since_ground);
buf = xstrdup("");
if (args_has(args, 'C')) {
for (i = 0; i < linelen; i++) {
if (line[i] >= ' ') {
tmp[0] = line[i];
tmp[1] = '\0';
} else
xsnprintf(tmp, sizeof tmp, "\\%03o", line[i]);
buf = cmd_capture_pane_append(buf, len, tmp,
strlen(tmp));
}
} else
buf = cmd_capture_pane_append(buf, len, line, linelen);
return (buf);
}
char *
cmd_capture_pane_history(struct args *args, struct cmd_q *cmdq,
struct window_pane *wp, size_t *len)
{
struct grid *gd;
const struct grid_line *gl;
struct grid_cell *gc = NULL;
int n, with_codes, escape_c0, join_lines;
u_int i, sx, top, bottom, tmp;
char *cause, *buf, *line;
size_t linelen;
sx = screen_size_x(&wp->base);
if (args_has(args, 'a')) {
gd = wp->saved_grid;
if (gd == NULL) {
if (!args_has(args, 'q')) {
cmdq_error(cmdq, "no alternate screen");
return (NULL);
}
return (xstrdup(""));
}
} else
gd = wp->base.grid;
n = args_strtonum(args, 'S', INT_MIN, SHRT_MAX, &cause);
if (cause != NULL) {
top = gd->hsize;
free(cause);
} else if (n < 0 && (u_int) -n > gd->hsize)
top = 0;
else
top = gd->hsize + n;
if (top > gd->hsize + gd->sy - 1)
top = gd->hsize + gd->sy - 1;
n = args_strtonum(args, 'E', INT_MIN, SHRT_MAX, &cause);
if (cause != NULL) {
bottom = gd->hsize + gd->sy - 1;
free(cause);
} else if (n < 0 && (u_int) -n > gd->hsize)
bottom = 0;
else
bottom = gd->hsize + n;
if (bottom > gd->hsize + gd->sy - 1)
bottom = gd->hsize + gd->sy - 1;
if (bottom < top) {
tmp = bottom;
bottom = top;
top = tmp;
}
with_codes = args_has(args, 'e');
escape_c0 = args_has(args, 'C');
join_lines = args_has(args, 'J');
buf = NULL; buf = NULL;
len = 0; for (i = top; i <= bottom; i++) {
line = grid_string_cells(gd, 0, i, sx, &gc, with_codes,
escape_c0, !join_lines);
linelen = strlen(line);
for (i = 0; i < screen_size_y(s); i++) { buf = cmd_capture_pane_append(buf, len, line, linelen);
line = grid_view_string_cells(s->grid, 0, i, screen_size_x(s));
linelen = strlen(line);
buf = xrealloc(buf, 1, len + linelen + 1); gl = grid_peek_line(gd, i);
memcpy(buf + len, line, linelen); if (!join_lines || !(gl->flags & GRID_LINE_WRAPPED))
len += linelen; buf[(*len)++] = '\n';
buf[len++] = '\n';
xfree(line); free(line);
} }
return (buf);
limit = options_get_number(&sess->options, "buffer-limit"); }
if (data->buffer == -1) {
paste_add(&sess->buffers, buf, len, limit); enum cmd_retval
return (0); cmd_capture_pane_exec(struct cmd *self, struct cmd_q *cmdq)
} {
if (paste_replace(&sess->buffers, data->buffer, buf, len) != 0) { struct args *args = self->args;
ctx->error(ctx, "no buffer %d", data->buffer); struct client *c;
xfree(buf); struct window_pane *wp;
return (-1); char *buf, *cause;
} int buffer;
return (0); u_int limit;
size_t len;
if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
return (CMD_RETURN_ERROR);
len = 0;
if (args_has(args, 'P'))
buf = cmd_capture_pane_pending(args, wp, &len);
else
buf = cmd_capture_pane_history(args, cmdq, wp, &len);
if (buf == NULL)
return (CMD_RETURN_ERROR);
if (args_has(args, 'p')) {
c = cmdq->client;
if (c == NULL ||
(c->session != NULL && !(c->flags & CLIENT_CONTROL))) {
cmdq_error(cmdq, "can't write to stdout");
return (CMD_RETURN_ERROR);
}
evbuffer_add(c->stdout_data, buf, len);
if (args_has(args, 'P') && len > 0)
evbuffer_add(c->stdout_data, "\n", 1);
server_push_stdout(c);
} else {
limit = options_get_number(&global_options, "buffer-limit");
if (!args_has(args, 'b')) {
paste_add(&global_buffers, buf, len, limit);
return (CMD_RETURN_NORMAL);
}
buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
if (cause != NULL) {
cmdq_error(cmdq, "buffer %s", cause);
free(buf);
free(cause);
return (CMD_RETURN_ERROR);
}
if (paste_replace(&global_buffers, buffer, buf, len) != 0) {
cmdq_error(cmdq, "no buffer %d", buffer);
free(buf);
return (CMD_RETURN_ERROR);
}
}
return (CMD_RETURN_NORMAL);
} }

96
cmd-choose-buffer.c Normal file
View File

@@ -0,0 +1,96 @@
/* $Id$ */
/*
* Copyright (c) 2010 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <ctype.h>
#include <stdlib.h>
#include "tmux.h"
/*
* Enter choice mode to choose a buffer.
*/
enum cmd_retval cmd_choose_buffer_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_choose_buffer_entry = {
"choose-buffer", NULL,
"F:t:", 0, 1,
CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
0,
NULL,
NULL,
cmd_choose_buffer_exec
};
enum cmd_retval
cmd_choose_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct client *c;
struct window_choose_data *cdata;
struct winlink *wl;
struct paste_buffer *pb;
char *action, *action_data;
const char *template;
u_int idx;
if ((c = cmd_current_client(cmdq)) == NULL) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
if ((template = args_get(args, 'F')) == NULL)
template = CHOOSE_BUFFER_TEMPLATE;
if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
return (CMD_RETURN_ERROR);
if (paste_get_top(&global_buffers) == NULL)
return (CMD_RETURN_NORMAL);
if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
return (CMD_RETURN_NORMAL);
if (args->argc != 0)
action = xstrdup(args->argv[0]);
else
action = xstrdup("paste-buffer -b '%%'");
idx = 0;
while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) {
cdata = window_choose_data_create(TREE_OTHER, c, c->session);
cdata->idx = idx - 1;
cdata->ft_template = xstrdup(template);
format_add(cdata->ft, "line", "%u", idx - 1);
format_paste_buffer(cdata->ft, pb);
xasprintf(&action_data, "%u", idx - 1);
cdata->command = cmd_template_replace(action, action_data, 1);
free(action_data);
window_choose_add(wl->window->active, cdata);
}
free(action);
window_choose_ready(wl->window->active, 0, NULL);
return (CMD_RETURN_NORMAL);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-choose-client.c,v 1.4 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -19,6 +19,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#include <stdlib.h>
#include "tmux.h" #include "tmux.h"
@@ -26,127 +27,99 @@
* Enter choice mode to choose a client. * Enter choice mode to choose a client.
*/ */
int cmd_choose_client_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_choose_client_exec(struct cmd *, struct cmd_q *);
void cmd_choose_client_callback(void *, int); void cmd_choose_client_callback(struct window_choose_data *);
void cmd_choose_client_free(void *);
const struct cmd_entry cmd_choose_client_entry = { const struct cmd_entry cmd_choose_client_entry = {
"choose-client", NULL, "choose-client", NULL,
CMD_TARGET_WINDOW_USAGE " [template]", "F:t:", 0, 1,
CMD_ARG01, "", CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_choose_client_exec, NULL,
cmd_target_free, cmd_choose_client_exec
cmd_target_print
}; };
struct cmd_choose_client_data { struct cmd_choose_client_data {
struct client *client; struct client *client;
char *template;
}; };
int enum cmd_retval
cmd_choose_client_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_choose_client_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct cmd_choose_client_data *cdata;
struct winlink *wl;
struct client *c; struct client *c;
struct client *c1;
struct window_choose_data *cdata;
struct winlink *wl;
const char *template;
char *action;
u_int i, idx, cur; u_int i, idx, cur;
if (ctx->curclient == NULL) { if ((c = cmd_current_client(cmdq)) == NULL) {
ctx->error(ctx, "must be run interactively"); cmdq_error(cmdq, "no client available");
return (-1); return (CMD_RETURN_ERROR);
} }
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0) if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
return (0); return (CMD_RETURN_NORMAL);
if ((template = args_get(args, 'F')) == NULL)
template = CHOOSE_CLIENT_TEMPLATE;
if (args->argc != 0)
action = xstrdup(args->argv[0]);
else
action = xstrdup("detach-client -t '%%'");
cur = idx = 0; cur = idx = 0;
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i); c1 = ARRAY_ITEM(&clients, i);
if (c == NULL || c->session == NULL) if (c1 == NULL || c1->session == NULL || c1->tty.path == NULL)
continue; continue;
if (c == ctx->curclient) if (c1 == cmdq->client)
cur = idx; cur = idx;
idx++; idx++;
window_choose_add(wl->window->active, i, cdata = window_choose_data_create(TREE_OTHER, c, c->session);
"%s: %s [%ux%u %s]%s", c->tty.path, cdata->idx = i;
c->session->name, c->tty.sx, c->tty.sy,
c->tty.termname, c->tty.flags & TTY_UTF8 ? " (utf8)" : ""); cdata->ft_template = xstrdup(template);
format_add(cdata->ft, "line", "%u", i);
format_session(cdata->ft, c1->session);
format_client(cdata->ft, c1);
cdata->command = cmd_template_replace(action, c1->tty.path, 1);
window_choose_add(wl->window->active, cdata);
} }
free(action);
cdata = xmalloc(sizeof *cdata); window_choose_ready(wl->window->active, cur,
if (data->arg != NULL) cmd_choose_client_callback);
cdata->template = xstrdup(data->arg);
else
cdata->template = xstrdup("detach-client -t '%%'");
cdata->client = ctx->curclient;
cdata->client->references++;
window_choose_ready(wl->window->active, return (CMD_RETURN_NORMAL);
cur, cmd_choose_client_callback, cmd_choose_client_free, cdata);
return (0);
} }
void void
cmd_choose_client_callback(void *data, int idx) cmd_choose_client_callback(struct window_choose_data *cdata)
{ {
struct cmd_choose_client_data *cdata = data; struct client *c;
struct client *c;
struct cmd_list *cmdlist;
struct cmd_ctx ctx;
char *template, *cause;
if (idx == -1) if (cdata == NULL)
return; return;
if (cdata->client->flags & CLIENT_DEAD) if (cdata->start_client->flags & CLIENT_DEAD)
return; return;
if ((u_int) idx > ARRAY_LENGTH(&clients) - 1) if (cdata->idx > ARRAY_LENGTH(&clients) - 1)
return; return;
c = ARRAY_ITEM(&clients, idx); c = ARRAY_ITEM(&clients, cdata->idx);
if (c == NULL || c->session == NULL) if (c == NULL || c->session == NULL)
return; return;
template = cmd_template_replace(cdata->template, c->tty.path, 1);
if (cmd_string_parse(template, &cmdlist, &cause) != 0) { window_choose_data_run(cdata);
if (cause != NULL) {
*cause = toupper((u_char) *cause);
status_message_set(c, "%s", cause);
xfree(cause);
}
xfree(template);
return;
}
xfree(template);
ctx.msgdata = NULL;
ctx.curclient = cdata->client;
ctx.error = key_bindings_error;
ctx.print = key_bindings_print;
ctx.info = key_bindings_info;
ctx.cmdclient = NULL;
cmd_list_exec(cmdlist, &ctx);
cmd_list_free(cmdlist);
}
void
cmd_choose_client_free(void *data)
{
struct cmd_choose_client_data *cdata = data;
cdata->client->references--;
xfree(cdata->template);
xfree(cdata);
} }

98
cmd-choose-list.c Normal file
View File

@@ -0,0 +1,98 @@
/* $Id$ */
/*
* Copyright (c) 2012 Thomas Adam <thomas@xteddy.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "tmux.h"
#define CMD_CHOOSE_LIST_DEFAULT_TEMPLATE "run-shell '%%'"
/*
* Enter choose mode to choose a custom list.
*/
enum cmd_retval cmd_choose_list_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_choose_list_entry = {
"choose-list", NULL,
"l:t:", 0, 1,
"[-l items] " CMD_TARGET_WINDOW_USAGE "[template]",
0,
NULL,
NULL,
cmd_choose_list_exec
};
enum cmd_retval
cmd_choose_list_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct client *c;
struct winlink *wl;
const char *list1;
char *template, *item, *copy, *list;
u_int idx;
if ((c = cmd_current_client(cmdq)) == NULL) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
if ((list1 = args_get(args, 'l')) == NULL)
return (CMD_RETURN_ERROR);
if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
return (CMD_RETURN_ERROR);
if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
return (CMD_RETURN_NORMAL);
if (args->argc != 0)
template = xstrdup(args->argv[0]);
else
template = xstrdup(CMD_CHOOSE_LIST_DEFAULT_TEMPLATE);
copy = list = xstrdup(list1);
idx = 0;
while ((item = strsep(&list, ",")) != NULL)
{
if (*item == '\0') /* no empty entries */
continue;
window_choose_add_item(wl->window->active, c, wl, item,
template, idx);
idx++;
}
free(copy);
if (idx == 0) {
free(template);
window_pane_reset_mode(wl->window->active);
return (CMD_RETURN_ERROR);
}
window_choose_ready(wl->window->active, 0, NULL);
free(template);
return (CMD_RETURN_NORMAL);
}

View File

@@ -1,162 +0,0 @@
/* $Id: cmd-choose-session.c,v 1.15 2009-11-14 17:56:39 tcunha Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <ctype.h>
#include "tmux.h"
/*
* Enter choice mode to choose a session.
*/
int cmd_choose_session_exec(struct cmd *, struct cmd_ctx *);
void cmd_choose_session_callback(void *, int);
void cmd_choose_session_free(void *);
const struct cmd_entry cmd_choose_session_entry = {
"choose-session", NULL,
CMD_TARGET_WINDOW_USAGE " [template]",
CMD_ARG01, "",
cmd_target_init,
cmd_target_parse,
cmd_choose_session_exec,
cmd_target_free,
cmd_target_print
};
struct cmd_choose_session_data {
struct client *client;
char *template;
};
int
cmd_choose_session_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct cmd_choose_session_data *cdata;
struct winlink *wl;
struct session *s;
struct session_group *sg;
u_int i, idx, cur;
char tmp[64];
if (ctx->curclient == NULL) {
ctx->error(ctx, "must be run interactively");
return (-1);
}
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return (-1);
if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
return (0);
cur = idx = 0;
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
s = ARRAY_ITEM(&sessions, i);
if (s == NULL)
continue;
if (s == ctx->curclient->session)
cur = idx;
idx++;
sg = session_group_find(s);
if (sg == NULL)
*tmp = '\0';
else {
idx = session_group_index(sg);
xsnprintf(tmp, sizeof tmp, " (group %u)", idx);
}
window_choose_add(wl->window->active, i,
"%s: %u windows [%ux%u]%s%s", s->name,
winlink_count(&s->windows), s->sx, s->sy,
tmp, s->flags & SESSION_UNATTACHED ? "" : " (attached)");
}
cdata = xmalloc(sizeof *cdata);
if (data->arg != NULL)
cdata->template = xstrdup(data->arg);
else
cdata->template = xstrdup("switch-client -t '%%'");
cdata->client = ctx->curclient;
cdata->client->references++;
window_choose_ready(wl->window->active,
cur, cmd_choose_session_callback, cmd_choose_session_free, cdata);
return (0);
}
void
cmd_choose_session_callback(void *data, int idx)
{
struct cmd_choose_session_data *cdata = data;
struct session *s;
struct cmd_list *cmdlist;
struct cmd_ctx ctx;
char *template, *cause;
if (idx == -1)
return;
if (cdata->client->flags & CLIENT_DEAD)
return;
if ((u_int) idx > ARRAY_LENGTH(&sessions) - 1)
return;
s = ARRAY_ITEM(&sessions, idx);
if (s == NULL)
return;
template = cmd_template_replace(cdata->template, s->name, 1);
if (cmd_string_parse(template, &cmdlist, &cause) != 0) {
if (cause != NULL) {
*cause = toupper((u_char) *cause);
status_message_set(cdata->client, "%s", cause);
xfree(cause);
}
xfree(template);
return;
}
xfree(template);
ctx.msgdata = NULL;
ctx.curclient = cdata->client;
ctx.error = key_bindings_error;
ctx.print = key_bindings_print;
ctx.info = key_bindings_info;
ctx.cmdclient = NULL;
cmd_list_exec(cmdlist, &ctx);
cmd_list_free(cmdlist);
}
void
cmd_choose_session_free(void *data)
{
struct cmd_choose_session_data *cdata = data;
cdata->client->references--;
xfree(cdata->template);
xfree(cdata);
}

239
cmd-choose-tree.c Normal file
View File

@@ -0,0 +1,239 @@
/* $Id$ */
/*
* Copyright (c) 2012 Thomas Adam <thomas@xteddy.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "tmux.h"
#define CMD_CHOOSE_TREE_WINDOW_ACTION "select-window -t '%%'"
#define CMD_CHOOSE_TREE_SESSION_ACTION "switch-client -t '%%'"
/*
* Enter choice mode to choose a session and/or window.
*/
enum cmd_retval cmd_choose_tree_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_choose_tree_entry = {
"choose-tree", NULL,
"S:W:swub:c:t:", 0, 1,
"[-suw] [-b session-template] [-c window template] [-S format] " \
"[-W format] " CMD_TARGET_WINDOW_USAGE,
0,
NULL,
NULL,
cmd_choose_tree_exec
};
const struct cmd_entry cmd_choose_session_entry = {
"choose-session", NULL,
"F:t:", 0, 1,
CMD_TARGET_WINDOW_USAGE " [-F format] [template]",
0,
NULL,
NULL,
cmd_choose_tree_exec
};
const struct cmd_entry cmd_choose_window_entry = {
"choose-window", NULL,
"F:t:", 0, 1,
CMD_TARGET_WINDOW_USAGE "[-F format] [template]",
0,
NULL,
NULL,
cmd_choose_tree_exec
};
enum cmd_retval
cmd_choose_tree_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct winlink *wl, *wm;
struct session *s, *s2;
struct client *c;
struct window_choose_data *wcd = NULL;
const char *ses_template, *win_template;
char *final_win_action, *cur_win_template;
char *final_win_template_middle;
char *final_win_template_last;
const char *ses_action, *win_action;
u_int cur_win, idx_ses, win_ses, win_max;
u_int wflag, sflag;
ses_template = win_template = NULL;
ses_action = win_action = NULL;
if ((c = cmd_current_client(cmdq)) == NULL) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
if ((s = c->session) == NULL)
return (CMD_RETURN_ERROR);
if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
return (CMD_RETURN_ERROR);
if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
return (CMD_RETURN_NORMAL);
/* Sort out which command this is. */
wflag = sflag = 0;
if (self->entry == &cmd_choose_session_entry) {
sflag = 1;
if ((ses_template = args_get(args, 'F')) == NULL)
ses_template = CHOOSE_TREE_SESSION_TEMPLATE;
if (args->argc != 0)
ses_action = args->argv[0];
else
ses_action = CMD_CHOOSE_TREE_SESSION_ACTION;
} else if (self->entry == &cmd_choose_window_entry) {
wflag = 1;
if ((win_template = args_get(args, 'F')) == NULL)
win_template = CHOOSE_TREE_WINDOW_TEMPLATE;
if (args->argc != 0)
win_action = args->argv[0];
else
win_action = CMD_CHOOSE_TREE_WINDOW_ACTION;
} else {
wflag = args_has(args, 'w');
sflag = args_has(args, 's');
if ((ses_action = args_get(args, 'b')) == NULL)
ses_action = CMD_CHOOSE_TREE_SESSION_ACTION;
if ((win_action = args_get(args, 'c')) == NULL)
win_action = CMD_CHOOSE_TREE_WINDOW_ACTION;
if ((ses_template = args_get(args, 'S')) == NULL)
ses_template = CHOOSE_TREE_SESSION_TEMPLATE;
if ((win_template = args_get(args, 'W')) == NULL)
win_template = CHOOSE_TREE_WINDOW_TEMPLATE;
}
/*
* If not asking for windows and sessions, assume no "-ws" given and
* hence display the entire tree outright.
*/
if (!wflag && !sflag)
wflag = sflag = 1;
/*
* If we're drawing in tree mode, including sessions, then pad the
* window template, otherwise just render the windows as a flat list
* without any padding.
*/
if (wflag && sflag) {
xasprintf(&final_win_template_middle,
" \001tq\001> %s", win_template);
xasprintf(&final_win_template_last,
" \001mq\001> %s", win_template);
} else if (wflag) {
final_win_template_middle = xstrdup(win_template);
final_win_template_last = xstrdup(win_template);
} else
final_win_template_middle = final_win_template_last = NULL;
idx_ses = cur_win = -1;
RB_FOREACH(s2, sessions, &sessions) {
idx_ses++;
/*
* If we're just choosing windows, jump straight there. Note
* that this implies the current session, so only choose
* windows when the session matches this one.
*/
if (wflag && !sflag) {
if (s != s2)
continue;
goto windows_only;
}
wcd = window_choose_add_session(wl->window->active,
c, s2, ses_template, ses_action, idx_ses);
/* If we're just choosing sessions, skip choosing windows. */
if (sflag && !wflag) {
if (s == s2)
cur_win = idx_ses;
continue;
}
windows_only:
win_ses = win_max = -1;
RB_FOREACH(wm, winlinks, &s2->windows)
win_max++;
RB_FOREACH(wm, winlinks, &s2->windows) {
win_ses++;
if (sflag && wflag)
idx_ses++;
if (wm == s2->curw && s == s2) {
if (wflag && !sflag) {
/*
* Then we're only counting windows.
* So remember which is the current
* window in the list.
*/
cur_win = win_ses;
} else
cur_win = idx_ses;
}
xasprintf(&final_win_action, "%s %s %s",
wcd != NULL ? wcd->command : "",
wcd != NULL ? ";" : "", win_action);
if (win_ses != win_max)
cur_win_template = final_win_template_middle;
else
cur_win_template = final_win_template_last;
window_choose_add_window(wl->window->active,
c, s2, wm, cur_win_template,
final_win_action,
(wflag && !sflag) ? win_ses : idx_ses);
free(final_win_action);
}
/*
* If we're just drawing windows, don't consider moving on to
* other sessions as we only list windows in this session.
*/
if (wflag && !sflag)
break;
}
free(final_win_template_middle);
free(final_win_template_last);
window_choose_ready(wl->window->active, cur_win, NULL);
if (args_has(args, 'u'))
window_choose_expand_all(wl->window->active);
return (CMD_RETURN_NORMAL);
}

View File

@@ -1,179 +0,0 @@
/* $Id: cmd-choose-window.c,v 1.20 2009-12-04 22:14:47 tcunha Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <ctype.h>
#include "tmux.h"
/*
* Enter choice mode to choose a window.
*/
int cmd_choose_window_exec(struct cmd *, struct cmd_ctx *);
void cmd_choose_window_callback(void *, int);
void cmd_choose_window_free(void *);
const struct cmd_entry cmd_choose_window_entry = {
"choose-window", NULL,
CMD_TARGET_WINDOW_USAGE " [template]",
CMD_ARG01, "",
cmd_target_init,
cmd_target_parse,
cmd_choose_window_exec,
cmd_target_free,
cmd_target_print
};
struct cmd_choose_window_data {
struct client *client;
struct session *session;
char *template;
};
int
cmd_choose_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct cmd_choose_window_data *cdata;
struct session *s;
struct winlink *wl, *wm;
struct window *w;
u_int idx, cur;
char flag, *title;
const char *left, *right;
if (ctx->curclient == NULL) {
ctx->error(ctx, "must be run interactively");
return (-1);
}
s = ctx->curclient->session;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return (-1);
if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
return (0);
cur = idx = 0;
RB_FOREACH(wm, winlinks, &s->windows) {
w = wm->window;
if (wm == s->curw)
cur = idx;
idx++;
flag = ' ';
if (session_alert_has(s, wm, WINDOW_ACTIVITY))
flag = '#';
else if (session_alert_has(s, wm, WINDOW_BELL))
flag = '!';
else if (session_alert_has(s, wm, WINDOW_CONTENT))
flag = '+';
else if (wm == s->curw)
flag = '*';
else if (wm == TAILQ_FIRST(&s->lastw))
flag = '-';
title = w->active->screen->title;
if (wm == wl)
title = w->active->base.title;
left = " \"";
right = "\"";
if (*title == '\0')
left = right = "";
window_choose_add(wl->window->active,
wm->idx, "%3d: %s%c [%ux%u] (%u panes)%s%s%s",
wm->idx, w->name, flag, w->sx, w->sy, window_count_panes(w),
left, title, right);
}
cdata = xmalloc(sizeof *cdata);
if (data->arg != NULL)
cdata->template = xstrdup(data->arg);
else
cdata->template = xstrdup("select-window -t '%%'");
cdata->session = s;
cdata->session->references++;
cdata->client = ctx->curclient;
cdata->client->references++;
window_choose_ready(wl->window->active,
cur, cmd_choose_window_callback, cmd_choose_window_free, cdata);
return (0);
}
void
cmd_choose_window_callback(void *data, int idx)
{
struct cmd_choose_window_data *cdata = data;
struct cmd_list *cmdlist;
struct cmd_ctx ctx;
char *target, *template, *cause;
if (idx == -1)
return;
if (cdata->client->flags & CLIENT_DEAD)
return;
if (cdata->session->flags & SESSION_DEAD)
return;
if (cdata->client->session != cdata->session)
return;
xasprintf(&target, "%s:%d", cdata->session->name, idx);
template = cmd_template_replace(cdata->template, target, 1);
xfree(target);
if (cmd_string_parse(template, &cmdlist, &cause) != 0) {
if (cause != NULL) {
*cause = toupper((u_char) *cause);
status_message_set(cdata->client, "%s", cause);
xfree(cause);
}
xfree(template);
return;
}
xfree(template);
ctx.msgdata = NULL;
ctx.curclient = cdata->client;
ctx.error = key_bindings_error;
ctx.print = key_bindings_print;
ctx.info = key_bindings_info;
ctx.cmdclient = NULL;
cmd_list_exec(cmdlist, &ctx);
cmd_list_free(cmdlist);
}
void
cmd_choose_window_free(void *data)
{
struct cmd_choose_window_data *cdata = data;
cdata->session->references--;
cdata->client->references--;
xfree(cdata->template);
xfree(cdata);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-clear-history.c,v 1.8 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,32 +24,31 @@
* Clear pane history. * Clear pane history.
*/ */
int cmd_clear_history_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_clear_history_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_clear_history_entry = { const struct cmd_entry cmd_clear_history_entry = {
"clear-history", "clearhist", "clear-history", "clearhist",
"t:", 0, 0,
CMD_TARGET_PANE_USAGE, CMD_TARGET_PANE_USAGE,
0, "", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_clear_history_exec, cmd_clear_history_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_clear_history_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_clear_history_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct window_pane *wp; struct window_pane *wp;
struct grid *gd; struct grid *gd;
if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL) if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
return (-1); return (CMD_RETURN_ERROR);
gd = wp->base.grid; gd = wp->base.grid;
grid_move_lines(gd, 0, gd->hsize, gd->sy); grid_move_lines(gd, 0, gd->hsize, gd->sy);
gd->hsize = 0; gd->hsize = 0;
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-clock-mode.c,v 1.7 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,29 +24,28 @@
* Enter clock mode. * Enter clock mode.
*/ */
int cmd_clock_mode_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_clock_mode_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_clock_mode_entry = { const struct cmd_entry cmd_clock_mode_entry = {
"clock-mode", NULL, "clock-mode", NULL,
"t:", 0, 0,
CMD_TARGET_PANE_USAGE, CMD_TARGET_PANE_USAGE,
0, "", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_clock_mode_exec, cmd_clock_mode_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_clock_mode_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_clock_mode_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct window_pane *wp; struct window_pane *wp;
if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL) if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
return (-1); return (CMD_RETURN_ERROR);
window_pane_set_mode(wp, &window_clock_mode); window_pane_set_mode(wp, &window_clock_mode);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-command-prompt.c,v 1.27 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -19,7 +19,9 @@
#include <sys/types.h> #include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#include "tmux.h" #include "tmux.h"
@@ -27,34 +29,27 @@
* Prompt for command in client. * Prompt for command in client.
*/ */
void cmd_command_prompt_init(struct cmd *, int); void cmd_command_prompt_key_binding(struct cmd *, int);
int cmd_command_prompt_parse(struct cmd *, int, char **, char **); int cmd_command_prompt_check(struct args *);
int cmd_command_prompt_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_command_prompt_exec(struct cmd *, struct cmd_q *);
void cmd_command_prompt_free(struct cmd *);
size_t cmd_command_prompt_print(struct cmd *, char *, size_t);
int cmd_command_prompt_callback(void *, const char *); int cmd_command_prompt_callback(void *, const char *);
void cmd_command_prompt_cfree(void *); void cmd_command_prompt_free(void *);
const struct cmd_entry cmd_command_prompt_entry = { const struct cmd_entry cmd_command_prompt_entry = {
"command-prompt", NULL, "command-prompt", NULL,
CMD_TARGET_CLIENT_USAGE " [-p prompts] [template]", "I:p:t:", 0, 1,
0, "", "[-I inputs] [-p prompts] " CMD_TARGET_CLIENT_USAGE " [template]",
cmd_command_prompt_init, 0,
cmd_command_prompt_parse, cmd_command_prompt_key_binding,
cmd_command_prompt_exec, NULL,
cmd_command_prompt_free, cmd_command_prompt_exec
cmd_command_prompt_print
};
struct cmd_command_prompt_data {
char *prompts;
char *target;
char *template;
}; };
struct cmd_command_prompt_cdata { struct cmd_command_prompt_cdata {
struct client *c; struct client *c;
char *inputs;
char *next_input;
char *next_prompt; char *next_prompt;
char *prompts; char *prompts;
char *template; char *template;
@@ -62,145 +57,91 @@ struct cmd_command_prompt_cdata {
}; };
void void
cmd_command_prompt_init(struct cmd *self, int key) cmd_command_prompt_key_binding(struct cmd *self, int key)
{ {
struct cmd_command_prompt_data *data;
self->data = data = xmalloc(sizeof *data);
data->prompts = NULL;
data->target = NULL;
data->template = NULL;
switch (key) { switch (key) {
case '$':
self->args = args_create(1, "rename-session '%%'");
args_set(self->args, 'I', "#S");
break;
case ',': case ',':
data->template = xstrdup("rename-window '%%'"); self->args = args_create(1, "rename-window '%%'");
args_set(self->args, 'I', "#W");
break; break;
case '.': case '.':
data->template = xstrdup("move-window -t '%%'"); self->args = args_create(1, "move-window -t '%%'");
break; break;
case 'f': case 'f':
data->template = xstrdup("find-window '%%'"); self->args = args_create(1, "find-window '%%'");
break;
case '\'':
self->args = args_create(1, "select-window -t ':%%'");
args_set(self->args, 'p', "index");
break;
default:
self->args = args_create(0);
break; break;
} }
} }
int enum cmd_retval
cmd_command_prompt_parse(struct cmd *self, int argc, char **argv, char **cause) cmd_command_prompt_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_command_prompt_data *data; struct args *args = self->args;
int opt; const char *inputs, *prompts;
self->entry->init(self, KEYC_NONE);
data = self->data;
while ((opt = getopt(argc, argv, "p:t:")) != -1) {
switch (opt) {
case 'p':
if (data->prompts == NULL)
data->prompts = xstrdup(optarg);
break;
case 't':
if (data->target == NULL)
data->target = xstrdup(optarg);
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (argc != 0 && argc != 1)
goto usage;
if (argc == 1)
data->template = xstrdup(argv[0]);
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
int
cmd_command_prompt_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_command_prompt_data *data = self->data;
struct cmd_command_prompt_cdata *cdata; struct cmd_command_prompt_cdata *cdata;
struct client *c; struct client *c;
char *prompt, *ptr; char *prompt, *ptr, *input = NULL;
size_t n; size_t n;
if ((c = cmd_find_client(ctx, data->target)) == NULL) if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
if (c->prompt_string != NULL) if (c->prompt_string != NULL)
return (0); return (CMD_RETURN_NORMAL);
cdata = xmalloc(sizeof *cdata); cdata = xmalloc(sizeof *cdata);
cdata->c = c; cdata->c = c;
cdata->idx = 1; cdata->idx = 1;
cdata->inputs = NULL;
cdata->next_input = NULL;
cdata->next_prompt = NULL; cdata->next_prompt = NULL;
cdata->prompts = NULL; cdata->prompts = NULL;
cdata->template = NULL; cdata->template = NULL;
if (data->template != NULL) if (args->argc != 0)
cdata->template = xstrdup(data->template); cdata->template = xstrdup(args->argv[0]);
else else
cdata->template = xstrdup("%1"); cdata->template = xstrdup("%1");
if (data->prompts != NULL)
cdata->prompts = xstrdup(data->prompts); if ((prompts = args_get(args, 'p')) != NULL)
else if (data->template != NULL) { cdata->prompts = xstrdup(prompts);
n = strcspn(data->template, " ,"); else if (args->argc != 0) {
xasprintf(&cdata->prompts, "(%.*s) ", (int) n, data->template); n = strcspn(cdata->template, " ,");
xasprintf(&cdata->prompts, "(%.*s) ", (int) n, cdata->template);
} else } else
cdata->prompts = xstrdup(":"); cdata->prompts = xstrdup(":");
/* Get first prompt. */
cdata->next_prompt = cdata->prompts; cdata->next_prompt = cdata->prompts;
ptr = strsep(&cdata->next_prompt, ","); ptr = strsep(&cdata->next_prompt, ",");
if (data->prompts == NULL) if (prompts == NULL)
prompt = xstrdup(ptr); prompt = xstrdup(ptr);
else else
xasprintf(&prompt, "%s ", ptr); xasprintf(&prompt, "%s ", ptr);
status_prompt_set(c, prompt, cmd_command_prompt_callback,
cmd_command_prompt_cfree, cdata, 0);
xfree(prompt);
return (0); /* Get initial prompt input. */
} if ((inputs = args_get(args, 'I')) != NULL) {
cdata->inputs = xstrdup(inputs);
cdata->next_input = cdata->inputs;
input = strsep(&cdata->next_input, ",");
}
void status_prompt_set(c, prompt, input, cmd_command_prompt_callback,
cmd_command_prompt_free(struct cmd *self) cmd_command_prompt_free, cdata, 0);
{ free(prompt);
struct cmd_command_prompt_data *data = self->data;
if (data->prompts != NULL) return (CMD_RETURN_NORMAL);
xfree(data->prompts);
if (data->target != NULL)
xfree(data->target);
if (data->template != NULL)
xfree(data->template);
xfree(data);
}
size_t
cmd_command_prompt_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_command_prompt_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
if (off < len && data->prompts != NULL)
off += cmd_prarg(buf + off, len - off, " -p ", data->prompts);
if (off < len && data->target != NULL)
off += cmd_prarg(buf + off, len - off, " -t ", data->target);
if (off < len && data->template != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->template);
return (off);
} }
int int
@@ -209,43 +150,40 @@ cmd_command_prompt_callback(void *data, const char *s)
struct cmd_command_prompt_cdata *cdata = data; struct cmd_command_prompt_cdata *cdata = data;
struct client *c = cdata->c; struct client *c = cdata->c;
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
struct cmd_ctx ctx; char *cause, *new_template, *prompt, *ptr;
char *cause, *newtempl, *prompt, *ptr; char *input = NULL;
if (s == NULL) if (s == NULL)
return (0); return (0);
newtempl = cmd_template_replace(cdata->template, s, cdata->idx); new_template = cmd_template_replace(cdata->template, s, cdata->idx);
xfree(cdata->template); free(cdata->template);
cdata->template = newtempl; cdata->template = new_template;
/*
* Check if there are more prompts; if so, get its respective input
* and update the prompt data.
*/
if ((ptr = strsep(&cdata->next_prompt, ",")) != NULL) { if ((ptr = strsep(&cdata->next_prompt, ",")) != NULL) {
xasprintf(&prompt, "%s ", ptr); xasprintf(&prompt, "%s ", ptr);
status_prompt_update(c, prompt); input = strsep(&cdata->next_input, ",");
xfree(prompt); status_prompt_update(c, prompt, input);
free(prompt);
cdata->idx++; cdata->idx++;
return (1); return (1);
} }
if (cmd_string_parse(newtempl, &cmdlist, &cause) != 0) { if (cmd_string_parse(new_template, &cmdlist, NULL, 0, &cause) != 0) {
if (cause != NULL) { if (cause != NULL) {
*cause = toupper((u_char) *cause); *cause = toupper((u_char) *cause);
status_message_set(c, "%s", cause); status_message_set(c, "%s", cause);
xfree(cause); free(cause);
} }
return (0); return (0);
} }
ctx.msgdata = NULL; cmdq_run(c->cmdq, cmdlist);
ctx.curclient = c;
ctx.error = key_bindings_error;
ctx.print = key_bindings_print;
ctx.info = key_bindings_info;
ctx.cmdclient = NULL;
cmd_list_exec(cmdlist, &ctx);
cmd_list_free(cmdlist); cmd_list_free(cmdlist);
if (c->prompt_callbackfn != (void *) &cmd_command_prompt_callback) if (c->prompt_callbackfn != (void *) &cmd_command_prompt_callback)
@@ -254,13 +192,12 @@ cmd_command_prompt_callback(void *data, const char *s)
} }
void void
cmd_command_prompt_cfree(void *data) cmd_command_prompt_free(void *data)
{ {
struct cmd_command_prompt_cdata *cdata = data; struct cmd_command_prompt_cdata *cdata = data;
if (cdata->prompts != NULL) free(cdata->inputs);
xfree(cdata->prompts); free(cdata->prompts);
if (cdata->template != NULL) free(cdata->template);
xfree(cdata->template); free(cdata);
xfree(cdata);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-confirm-before.c,v 1.12 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org> * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -17,6 +17,7 @@
*/ */
#include <ctype.h> #include <ctype.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
@@ -25,112 +26,105 @@
* Asks for confirmation before executing a command. * Asks for confirmation before executing a command.
*/ */
int cmd_confirm_before_exec(struct cmd *, struct cmd_ctx *); void cmd_confirm_before_key_binding(struct cmd *, int);
void cmd_confirm_before_init(struct cmd *, int); enum cmd_retval cmd_confirm_before_exec(struct cmd *, struct cmd_q *);
int cmd_confirm_before_callback(void *, const char *); int cmd_confirm_before_callback(void *, const char *);
void cmd_confirm_before_free(void *); void cmd_confirm_before_free(void *);
const struct cmd_entry cmd_confirm_before_entry = { const struct cmd_entry cmd_confirm_before_entry = {
"confirm-before", "confirm", "confirm-before", "confirm",
CMD_TARGET_CLIENT_USAGE " command", "p:t:", 1, 1,
CMD_ARG1, "", "[-p prompt] " CMD_TARGET_CLIENT_USAGE " command",
cmd_confirm_before_init, 0,
cmd_target_parse, cmd_confirm_before_key_binding,
cmd_confirm_before_exec, NULL,
cmd_target_free, cmd_confirm_before_exec
cmd_target_print
}; };
struct cmd_confirm_before_data { struct cmd_confirm_before_data {
struct client *c;
char *cmd; char *cmd;
struct client *client;
}; };
void void
cmd_confirm_before_init(struct cmd *self, int key) cmd_confirm_before_key_binding(struct cmd *self, int key)
{ {
struct cmd_target_data *data;
cmd_target_init(self, key);
data = self->data;
switch (key) { switch (key) {
case '&': case '&':
data->arg = xstrdup("kill-window"); self->args = args_create(1, "kill-window");
args_set(self->args, 'p', "kill-window #W? (y/n)");
break; break;
case 'x': case 'x':
data->arg = xstrdup("kill-pane"); self->args = args_create(1, "kill-pane");
args_set(self->args, 'p', "kill-pane #P? (y/n)");
break;
default:
self->args = args_create(0);
break; break;
} }
} }
int enum cmd_retval
cmd_confirm_before_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_confirm_before_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct cmd_confirm_before_data *cdata; struct cmd_confirm_before_data *cdata;
struct client *c; struct client *c;
char *buf, *cmd, *ptr; char *cmd, *copy, *new_prompt, *ptr;
const char *prompt;
if (ctx->curclient == NULL) { if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
ctx->error(ctx, "must be run interactively"); return (CMD_RETURN_ERROR);
return (-1);
if ((prompt = args_get(args, 'p')) != NULL)
xasprintf(&new_prompt, "%s ", prompt);
else {
ptr = copy = xstrdup(args->argv[0]);
cmd = strsep(&ptr, " \t");
xasprintf(&new_prompt, "Confirm '%s'? (y/n) ", cmd);
free(copy);
} }
if ((c = cmd_find_client(ctx, data->target)) == NULL)
return (-1);
ptr = xstrdup(data->arg);
if ((cmd = strtok(ptr, " \t")) == NULL)
cmd = ptr;
xasprintf(&buf, "Confirm '%s'? (y/n) ", cmd);
xfree(ptr);
cdata = xmalloc(sizeof *cdata); cdata = xmalloc(sizeof *cdata);
cdata->cmd = xstrdup(data->arg); cdata->cmd = xstrdup(args->argv[0]);
cdata->c = c;
status_prompt_set(cdata->c, buf, cdata->client = c;
cdata->client->references++;
status_prompt_set(c, new_prompt, NULL,
cmd_confirm_before_callback, cmd_confirm_before_free, cdata, cmd_confirm_before_callback, cmd_confirm_before_free, cdata,
PROMPT_SINGLE); PROMPT_SINGLE);
xfree(buf); free(new_prompt);
return (1); return (CMD_RETURN_NORMAL);
} }
int int
cmd_confirm_before_callback(void *data, const char *s) cmd_confirm_before_callback(void *data, const char *s)
{ {
struct cmd_confirm_before_data *cdata = data; struct cmd_confirm_before_data *cdata = data;
struct client *c = cdata->c; struct client *c = cdata->client;
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
struct cmd_ctx ctx;
char *cause; char *cause;
if (c->flags & CLIENT_DEAD)
return (0);
if (s == NULL || *s == '\0') if (s == NULL || *s == '\0')
return (0); return (0);
if (tolower((u_char) s[0]) != 'y' || s[1] != '\0') if (tolower((u_char) s[0]) != 'y' || s[1] != '\0')
return (0); return (0);
if (cmd_string_parse(cdata->cmd, &cmdlist, &cause) != 0) { if (cmd_string_parse(cdata->cmd, &cmdlist, NULL, 0, &cause) != 0) {
if (cause != NULL) { if (cause != NULL) {
*cause = toupper((u_char) *cause); cmdq_error(c->cmdq, "%s", cause);
status_message_set(c, "%s", cause); free(cause);
xfree(cause);
} }
return (0); return (0);
} }
ctx.msgdata = NULL; cmdq_run(c->cmdq, cmdlist);
ctx.curclient = c;
ctx.error = key_bindings_error;
ctx.print = key_bindings_print;
ctx.info = key_bindings_info;
ctx.cmdclient = NULL;
cmd_list_exec(cmdlist, &ctx);
cmd_list_free(cmdlist); cmd_list_free(cmdlist);
return (0); return (0);
@@ -140,8 +134,10 @@ void
cmd_confirm_before_free(void *data) cmd_confirm_before_free(void *data)
{ {
struct cmd_confirm_before_data *cdata = data; struct cmd_confirm_before_data *cdata = data;
struct client *c = cdata->client;
if (cdata->cmd != NULL) c->references--;
xfree(cdata->cmd);
xfree(cdata); free(cdata->cmd);
free(cdata);
} }

View File

@@ -1,205 +0,0 @@
/* $Id: cmd-copy-buffer.c,v 1.7 2009-11-28 14:50:36 tcunha Exp $ */
/*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include "tmux.h"
/*
* Copies a session paste buffer to another session.
*/
int cmd_copy_buffer_parse(struct cmd *, int, char **, char **);
int cmd_copy_buffer_exec(struct cmd *, struct cmd_ctx *);
void cmd_copy_buffer_free(struct cmd *);
void cmd_copy_buffer_init(struct cmd *, int);
size_t cmd_copy_buffer_print(struct cmd *, char *, size_t);
struct cmd_copy_buffer_data {
char *dst_session;
char *src_session;
int dst_idx;
int src_idx;
};
const struct cmd_entry cmd_copy_buffer_entry = {
"copy-buffer", "copyb",
"[-a src-index] [-b dst-index] [-s src-session] [-t dst-session]",
0, "",
cmd_copy_buffer_init,
cmd_copy_buffer_parse,
cmd_copy_buffer_exec,
cmd_copy_buffer_free,
cmd_copy_buffer_print
};
/* ARGSUSED */
void
cmd_copy_buffer_init(struct cmd *self, unused int arg)
{
struct cmd_copy_buffer_data *data;
self->data = data = xmalloc(sizeof *data);
data->dst_session = NULL;
data->src_session = NULL;
data->dst_idx = -1;
data->src_idx = -1;
}
int
cmd_copy_buffer_parse(struct cmd *self, int argc, char **argv, char **cause)
{
struct cmd_copy_buffer_data *data;
const char *errstr;
int n, opt;
self->entry->init(self, KEYC_NONE);
data = self->data;
while ((opt = getopt(argc, argv, "a:b:s:t:")) != -1) {
switch (opt) {
case 'a':
if (data->src_idx == -1) {
n = strtonum(optarg, 0, INT_MAX, &errstr);
if (errstr != NULL) {
xasprintf(cause, "buffer %s", errstr);
goto error;
}
data->src_idx = n;
}
break;
case 'b':
if (data->dst_idx == -1) {
n = strtonum(optarg, 0, INT_MAX, &errstr);
if (errstr != NULL) {
xasprintf(cause, "buffer %s", errstr);
goto error;
}
data->dst_idx = n;
}
break;
case 's':
if (data->src_session == NULL)
data->src_session = xstrdup(optarg);
break;
case 't':
if (data->dst_session == NULL)
data->dst_session = xstrdup(optarg);
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
error:
self->entry->free(self);
return (-1);
}
int
cmd_copy_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_copy_buffer_data *data = self->data;
struct paste_buffer *pb;
struct paste_stack *dst_ps, *src_ps;
u_char *pdata;
struct session *dst_session, *src_session;
u_int limit;
if ((dst_session = cmd_find_session(ctx, data->dst_session)) == NULL ||
(src_session = cmd_find_session(ctx, data->src_session)) == NULL)
return (-1);
dst_ps = &dst_session->buffers;
src_ps = &src_session->buffers;
if (data->src_idx == -1) {
if ((pb = paste_get_top(src_ps)) == NULL) {
ctx->error(ctx, "no buffers");
return (-1);
}
} else {
if ((pb = paste_get_index(src_ps, data->src_idx)) == NULL) {
ctx->error(ctx, "no buffer %d", data->src_idx);
return (-1);
}
}
limit = options_get_number(&dst_session->options, "buffer-limit");
pdata = xmalloc(pb->size);
memcpy(pdata, pb->data, pb->size);
if (data->dst_idx == -1)
paste_add(dst_ps, pdata, pb->size, limit);
else if (paste_replace(dst_ps, data->dst_idx, pdata, pb->size) != 0) {
ctx->error(ctx, "no buffer %d", data->dst_idx);
xfree(pdata);
return (-1);
}
return (0);
}
void
cmd_copy_buffer_free(struct cmd *self)
{
struct cmd_copy_buffer_data *data = self->data;
if (data->dst_session != NULL)
xfree(data->dst_session);
if (data->src_session != NULL)
xfree(data->src_session);
xfree(data);
}
size_t
cmd_copy_buffer_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_copy_buffer_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
if (off < len && data->src_idx != -1) {
off += xsnprintf(buf + off, len - off, " -a %d",
data->src_idx);
}
if (off < len && data->dst_idx != -1) {
off += xsnprintf(buf + off, len - off, " -b %d",
data->dst_idx);
}
if (off < len && data->src_session != NULL) {
off += cmd_prarg(buf + off, len - off, " -s ",
data->src_session);
}
if (off < len && data->dst_session != NULL) {
off += cmd_prarg(buf + off, len - off, " -t ",
data->dst_session);
}
return (off);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-copy-mode.c,v 1.26 2010-01-05 23:50:22 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,47 +24,41 @@
* Enter copy mode. * Enter copy mode.
*/ */
void cmd_copy_mode_init(struct cmd *, int); void cmd_copy_mode_key_binding(struct cmd *, int);
int cmd_copy_mode_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_copy_mode_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_copy_mode_entry = { const struct cmd_entry cmd_copy_mode_entry = {
"copy-mode", NULL, "copy-mode", NULL,
"t:u", 0, 0,
"[-u] " CMD_TARGET_PANE_USAGE, "[-u] " CMD_TARGET_PANE_USAGE,
0, "u", 0,
cmd_copy_mode_init, cmd_copy_mode_key_binding,
cmd_target_parse, NULL,
cmd_copy_mode_exec, cmd_copy_mode_exec
cmd_target_free,
cmd_target_print
}; };
void void
cmd_copy_mode_init(struct cmd *self, int key) cmd_copy_mode_key_binding(struct cmd *self, int key)
{ {
struct cmd_target_data *data; self->args = args_create(0);
if (key == KEYC_PPAGE)
cmd_target_init(self, key); args_set(self->args, 'u', NULL);
data = self->data;
switch (key) {
case KEYC_PPAGE:
cmd_set_flag(&data->chflags, 'u');
break;
}
} }
int enum cmd_retval
cmd_copy_mode_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_copy_mode_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct window_pane *wp; struct window_pane *wp;
if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL) if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
return (-1); return (CMD_RETURN_ERROR);
window_pane_set_mode(wp, &window_copy_mode); if (window_pane_set_mode(wp, &window_copy_mode) != 0)
if (wp->mode == &window_copy_mode && cmd_check_flag(data->chflags, 'u')) return (CMD_RETURN_NORMAL);
window_copy_init_from_pane(wp);
if (wp->mode == &window_copy_mode && args_has(self->args, 'u'))
window_copy_pageup(wp); window_copy_pageup(wp);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-delete-buffer.c,v 1.8 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,34 +26,41 @@
* Delete a paste buffer. * Delete a paste buffer.
*/ */
int cmd_delete_buffer_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_delete_buffer_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_delete_buffer_entry = { const struct cmd_entry cmd_delete_buffer_entry = {
"delete-buffer", "deleteb", "delete-buffer", "deleteb",
CMD_BUFFER_SESSION_USAGE, "b:", 0, 0,
0, "", CMD_BUFFER_USAGE,
cmd_buffer_init, 0,
cmd_buffer_parse, NULL,
cmd_delete_buffer_exec, NULL,
cmd_buffer_free, cmd_delete_buffer_exec
cmd_buffer_print
}; };
int enum cmd_retval
cmd_delete_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_delete_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_buffer_data *data = self->data; struct args *args = self->args;
struct session *s; char *cause;
int buffer;
if ((s = cmd_find_session(ctx, data->target)) == NULL) if (!args_has(args, 'b')) {
return (-1); paste_free_top(&global_buffers);
return (CMD_RETURN_NORMAL);
if (data->buffer == -1)
paste_free_top(&s->buffers);
else if (paste_free_index(&s->buffers, data->buffer) != 0) {
ctx->error(ctx, "no buffer %d", data->buffer);
return (-1);
} }
return (0); buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
if (cause != NULL) {
cmdq_error(cmdq, "buffer %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
if (paste_free_index(&global_buffers, buffer) != 0) {
cmdq_error(cmdq, "no buffer %d", buffer);
return (CMD_RETURN_ERROR);
}
return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-detach-client.c,v 1.11 2010-02-08 18:27:34 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,29 +24,57 @@
* Detach a client. * Detach a client.
*/ */
int cmd_detach_client_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_detach_client_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_detach_client_entry = { const struct cmd_entry cmd_detach_client_entry = {
"detach-client", "detach", "detach-client", "detach",
CMD_TARGET_CLIENT_USAGE, "as:t:P", 0, 0,
CMD_READONLY, "", "[-P] [-a] [-s target-session] " CMD_TARGET_CLIENT_USAGE,
cmd_target_init, CMD_READONLY,
cmd_target_parse, NULL,
cmd_detach_client_exec, NULL,
cmd_target_free, cmd_detach_client_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_detach_client_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_detach_client_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct client *c; struct client *c, *c2;
struct session *s;
enum msgtype msgtype;
u_int i;
if ((c = cmd_find_client(ctx, data->target)) == NULL) if (args_has(args, 'P'))
return (-1); msgtype = MSG_DETACHKILL;
else
msgtype = MSG_DETACH;
server_write_client(c, MSG_DETACH, NULL, 0); if (args_has(args, 's')) {
s = cmd_find_session(cmdq, args_get(args, 's'), 0);
if (s == NULL)
return (CMD_RETURN_ERROR);
return (0); for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i);
if (c != NULL && c->session == s)
server_write_client(c, msgtype, NULL, 0);
}
} else {
c = cmd_find_client(cmdq, args_get(args, 't'), 0);
if (c == NULL)
return (CMD_RETURN_ERROR);
if (args_has(args, 'a')) {
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c2 = ARRAY_ITEM(&clients, i);
if (c2 == NULL || c == c2)
continue;
server_write_client(c2, msgtype, NULL, 0);
}
} else
server_write_client(c, msgtype, NULL, 0);
}
return (CMD_RETURN_STOP);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-display-message.c,v 1.7 2009-11-28 14:39:53 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org> * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <time.h> #include <time.h>
#include "tmux.h" #include "tmux.h"
@@ -26,41 +27,85 @@
* Displays a message in the status line. * Displays a message in the status line.
*/ */
int cmd_display_message_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_display_message_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_display_message_entry = { const struct cmd_entry cmd_display_message_entry = {
"display-message", "display", "display-message", "display",
"[-p] " CMD_TARGET_CLIENT_USAGE " [message]", "c:pt:F:", 0, 1,
CMD_ARG01, "p", "[-p] [-c target-client] [-F format] " CMD_TARGET_PANE_USAGE
cmd_target_init, " [message]",
cmd_target_parse, 0,
cmd_display_message_exec, NULL,
cmd_target_free, NULL,
cmd_target_print cmd_display_message_exec
}; };
int enum cmd_retval
cmd_display_message_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_display_message_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct client *c; struct client *c;
struct session *s;
struct winlink *wl;
struct window_pane *wp;
const char *template; const char *template;
char *msg; char *msg;
struct format_tree *ft;
char out[BUFSIZ];
time_t t;
size_t len;
if ((c = cmd_find_client(ctx, data->target)) == NULL) if (args_has(args, 't')) {
return (-1); wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
if (wl == NULL)
return (CMD_RETURN_ERROR);
} else {
wl = cmd_find_pane(cmdq, NULL, &s, &wp);
if (wl == NULL)
return (CMD_RETURN_ERROR);
}
if (data->arg == NULL) if (args_has(args, 'F') && args->argc != 0) {
template = "[#S] #I:#W, current pane #P - (%H:%M %d-%b-%y)"; cmdq_error(cmdq, "only one of -F or argument must be given");
else return (CMD_RETURN_ERROR);
template = data->arg; }
msg = status_replace(c, NULL, template, time(NULL), 0); if (args_has(args, 'c')) {
if (cmd_check_flag(data->chflags, 'p')) c = cmd_find_client(cmdq, args_get(args, 'c'), 0);
ctx->print(ctx, "%s", msg); if (c == NULL)
return (CMD_RETURN_ERROR);
} else {
c = cmd_current_client(cmdq);
if (c == NULL && !args_has(self->args, 'p')) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
}
template = args_get(args, 'F');
if (args->argc != 0)
template = args->argv[0];
if (template == NULL)
template = DISPLAY_MESSAGE_TEMPLATE;
ft = format_create();
if (c != NULL)
format_client(ft, c);
format_session(ft, s);
format_winlink(ft, s, wl);
format_window_pane(ft, wp);
t = time(NULL);
len = strftime(out, sizeof out, template, localtime(&t));
out[len] = '\0';
msg = format_expand(ft, out);
if (args_has(self->args, 'p'))
cmdq_print(cmdq, "%s", msg);
else else
status_message_set(c, "%s", msg); status_message_set(c, "%s", msg);
xfree(msg); free(msg);
format_free(ft);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-display-panes.c,v 1.2 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,29 +24,28 @@
* Display panes on a client. * Display panes on a client.
*/ */
int cmd_display_panes_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_display_panes_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_display_panes_entry = { const struct cmd_entry cmd_display_panes_entry = {
"display-panes", "displayp", "display-panes", "displayp",
"t:", 0, 0,
CMD_TARGET_CLIENT_USAGE, CMD_TARGET_CLIENT_USAGE,
0, "", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_display_panes_exec, cmd_display_panes_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_display_panes_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_display_panes_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct client *c; struct client *c;
if ((c = cmd_find_client(ctx, data->target)) == NULL) if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
server_set_identify(c); server_set_identify(c);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,60 +0,0 @@
/* $Id: cmd-down-pane.c,v 1.14 2010-01-05 23:52:37 tcunha Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Move down a pane.
*/
int cmd_down_pane_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_down_pane_entry = {
"down-pane", "downp",
CMD_TARGET_WINDOW_USAGE,
0, "",
cmd_target_init,
cmd_target_parse,
cmd_down_pane_exec,
cmd_target_free,
cmd_target_print
};
int
cmd_down_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct winlink *wl;
struct window *w;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return (-1);
w = wl->window;
do {
w->active = TAILQ_NEXT(w->active, entry);
if (w->active == NULL)
w->active = TAILQ_FIRST(&w->panes);
} while (!window_pane_visible(w->active));
server_status_window(wl->window);
server_redraw_window_borders(wl->window);
return (0);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-find-window.c,v 1.14 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -19,6 +19,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <fnmatch.h> #include <fnmatch.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
@@ -27,92 +28,147 @@
* Find window containing text. * Find window containing text.
*/ */
int cmd_find_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_find_window_exec(struct cmd *, struct cmd_q *);
void cmd_find_window_callback(void *, int); void cmd_find_window_callback(struct window_choose_data *);
/* Flags for determining matching behavior. */
#define CMD_FIND_WINDOW_BY_TITLE 0x1
#define CMD_FIND_WINDOW_BY_CONTENT 0x2
#define CMD_FIND_WINDOW_BY_NAME 0x4
#define CMD_FIND_WINDOW_ALL \
(CMD_FIND_WINDOW_BY_TITLE | \
CMD_FIND_WINDOW_BY_CONTENT | \
CMD_FIND_WINDOW_BY_NAME)
const struct cmd_entry cmd_find_window_entry = { const struct cmd_entry cmd_find_window_entry = {
"find-window", "findw", "find-window", "findw",
CMD_TARGET_WINDOW_USAGE " match-string", "F:CNt:T", 1, 4,
CMD_ARG1, "", "[-CNT] [-F format] " CMD_TARGET_WINDOW_USAGE " match-string",
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_find_window_exec, NULL,
cmd_target_free, cmd_find_window_exec
cmd_target_print
}; };
struct cmd_find_window_data { struct cmd_find_window_data {
u_int session; struct winlink *wl;
char *list_ctx;
u_int pane_id;
}; };
ARRAY_DECL(cmd_find_window_data_list, struct cmd_find_window_data);
int u_int cmd_find_window_match_flags(struct args *);
cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx) void cmd_find_window_match(struct cmd_find_window_data_list *, int,
struct winlink *, const char *, const char *);
u_int
cmd_find_window_match_flags(struct args *args)
{ {
struct cmd_target_data *data = self->data; u_int match_flags = 0;
struct cmd_find_window_data *cdata;
struct session *s; /* Turn on flags based on the options. */
struct winlink *wl, *wm; if (args_has(args, 'T'))
struct window *w; match_flags |= CMD_FIND_WINDOW_BY_TITLE;
if (args_has(args, 'C'))
match_flags |= CMD_FIND_WINDOW_BY_CONTENT;
if (args_has(args, 'N'))
match_flags |= CMD_FIND_WINDOW_BY_NAME;
/* If none of the flags were set, default to matching anything. */
if (match_flags == 0)
match_flags = CMD_FIND_WINDOW_ALL;
return (match_flags);
}
void
cmd_find_window_match(struct cmd_find_window_data_list *find_list,
int match_flags, struct winlink *wl, const char *str, const char *searchstr)
{
struct cmd_find_window_data find_data;
struct window_pane *wp; struct window_pane *wp;
ARRAY_DECL(, u_int) list_idx;
ARRAY_DECL(, char *) list_ctx;
char *sres, *sctx, *searchstr;
u_int i, line; u_int i, line;
char *sres;
if (ctx->curclient == NULL) { memset(&find_data, 0, sizeof find_data);
ctx->error(ctx, "must be run interactively");
return (-1);
}
s = ctx->curclient->session;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) i = 0;
return (-1); TAILQ_FOREACH(wp, &wl->window->panes, entry) {
i++;
ARRAY_INIT(&list_idx); if ((match_flags & CMD_FIND_WINDOW_BY_NAME) &&
ARRAY_INIT(&list_ctx); fnmatch(searchstr, wl->window->name, 0) == 0) {
find_data.list_ctx = xstrdup("");
break;
}
xasprintf(&searchstr, "*%s*", data->arg); if ((match_flags & CMD_FIND_WINDOW_BY_TITLE) &&
RB_FOREACH(wm, winlinks, &s->windows) { fnmatch(searchstr, wp->base.title, 0) == 0) {
i = 0; xasprintf(&find_data.list_ctx,
TAILQ_FOREACH(wp, &wm->window->panes, entry) { "pane %u title: \"%s\"", i - 1, wp->base.title);
i++; break;
}
if (fnmatch(searchstr, wm->window->name, 0) == 0) if (match_flags & CMD_FIND_WINDOW_BY_CONTENT &&
sctx = xstrdup(""); (sres = window_pane_search(wp, str, &line)) != NULL) {
else { xasprintf(&find_data.list_ctx,
sres = window_pane_search(wp, data->arg, &line); "pane %u line %u: \"%s\"", i - 1, line + 1, sres);
if (sres == NULL && free(sres);
fnmatch(searchstr, wp->base.title, 0) != 0) break;
continue;
if (sres == NULL) {
xasprintf(&sctx,
"pane %u title: \"%s\"", i - 1,
wp->base.title);
} else {
xasprintf(&sctx,
"pane %u line %u: \"%s\"", i - 1,
line + 1, sres);
xfree(sres);
}
}
ARRAY_ADD(&list_idx, wm->idx);
ARRAY_ADD(&list_ctx, sctx);
} }
} }
xfree(searchstr); if (find_data.list_ctx != NULL) {
find_data.wl = wl;
find_data.pane_id = i - 1;
ARRAY_ADD(find_list, find_data);
}
}
if (ARRAY_LENGTH(&list_idx) == 0) { enum cmd_retval
ctx->error(ctx, "no windows matching: %s", data->arg); cmd_find_window_exec(struct cmd *self, struct cmd_q *cmdq)
ARRAY_FREE(&list_idx); {
ARRAY_FREE(&list_ctx); struct args *args = self->args;
return (-1); struct client *c;
struct window_choose_data *cdata;
struct session *s;
struct winlink *wl, *wm;
struct cmd_find_window_data_list find_list;
char *str, *searchstr;
const char *template;
u_int i, match_flags;
if ((c = cmd_current_client(cmdq)) == NULL) {
cmdq_error(cmdq, "no client available");
return (CMD_RETURN_ERROR);
}
s = c->session;
if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
return (CMD_RETURN_ERROR);
if ((template = args_get(args, 'F')) == NULL)
template = FIND_WINDOW_TEMPLATE;
match_flags = cmd_find_window_match_flags(args);
str = args->argv[0];
ARRAY_INIT(&find_list);
xasprintf(&searchstr, "*%s*", str);
RB_FOREACH(wm, winlinks, &s->windows)
cmd_find_window_match (&find_list, match_flags, wm, str, searchstr);
free(searchstr);
if (ARRAY_LENGTH(&find_list) == 0) {
cmdq_error(cmdq, "no windows matching: %s", str);
ARRAY_FREE(&find_list);
return (CMD_RETURN_ERROR);
} }
if (ARRAY_LENGTH(&list_idx) == 1) { if (ARRAY_LENGTH(&find_list) == 1) {
if (session_select(s, ARRAY_FIRST(&list_idx)) == 0) if (session_select(s, ARRAY_FIRST(&find_list).wl->idx) == 0)
server_redraw_session(s); server_redraw_session(s);
recalculate_sizes(); recalculate_sizes();
goto out; goto out;
@@ -121,42 +177,52 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0) if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0)
goto out; goto out;
for (i = 0; i < ARRAY_LENGTH(&list_idx); i++) { for (i = 0; i < ARRAY_LENGTH(&find_list); i++) {
wm = winlink_find_by_index( wm = ARRAY_ITEM(&find_list, i).wl;
&s->windows, ARRAY_ITEM(&list_idx, i));
w = wm->window;
sctx = ARRAY_ITEM(&list_ctx, i); cdata = window_choose_data_create(TREE_OTHER, c, c->session);
window_choose_add(wl->window->active, cdata->idx = wm->idx;
wm->idx, "%3d: %s [%ux%u] (%u panes) %s", wm->idx, w->name, cdata->wl = wm;
w->sx, w->sy, window_count_panes(w), sctx);
xfree(sctx); cdata->ft_template = xstrdup(template);
cdata->pane_id = ARRAY_ITEM(&find_list, i).pane_id;
format_add(cdata->ft, "line", "%u", i);
format_add(cdata->ft, "window_find_matches", "%s",
ARRAY_ITEM(&find_list, i).list_ctx);
format_session(cdata->ft, s);
format_winlink(cdata->ft, s, wm);
format_window_pane(cdata->ft, wm->window->active);
window_choose_add(wl->window->active, cdata);
} }
cdata = xmalloc(sizeof *cdata); window_choose_ready(wl->window->active, 0, cmd_find_window_callback);
if (session_index(s, &cdata->session) != 0)
fatalx("session not found");
window_choose_ready(
wl->window->active, 0, cmd_find_window_callback, xfree, cdata);
out: out:
ARRAY_FREE(&list_idx); ARRAY_FREE(&find_list);
ARRAY_FREE(&list_ctx); return (CMD_RETURN_NORMAL);
return (0);
} }
void void
cmd_find_window_callback(void *data, int idx) cmd_find_window_callback(struct window_choose_data *cdata)
{ {
struct cmd_find_window_data *cdata = data; struct session *s;
struct session *s; struct window_pane *wp;
if (idx != -1 && cdata->session <= ARRAY_LENGTH(&sessions) - 1) { if (cdata == NULL)
s = ARRAY_ITEM(&sessions, cdata->session); return;
if (s != NULL && session_select(s, idx) == 0)
server_redraw_session(s); s = cdata->start_session;
if (!session_alive(s))
return;
wp = window_pane_at_index(cdata->wl->window, cdata->pane_id);
if (wp != NULL && window_pane_visible(wp))
window_set_active_pane(cdata->wl->window, wp);
if (session_select(s, cdata->idx) == 0) {
server_redraw_session(s);
recalculate_sizes(); recalculate_sizes();
} }
} }

View File

@@ -1,423 +0,0 @@
/* $Id: cmd-generic.c,v 1.38 2009-12-04 22:14:47 tcunha Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include "tmux.h"
int cmd_getopt(int, char **, const char *, const char *);
int cmd_parse_flags(int, const char *, uint64_t *);
size_t cmd_print_flags(char *, size_t, size_t, uint64_t);
int cmd_fill_argument(int, char **, char **, int, char **);
size_t
cmd_prarg(char *buf, size_t len, const char *prefix, char *arg)
{
if (strchr(arg, ' ') != NULL)
return (xsnprintf(buf, len, "%s\"%s\"", prefix, arg));
return (xsnprintf(buf, len, "%s%s", prefix, arg));
}
/* Append two flag strings together and call getopt. */
int
cmd_getopt(int argc, char **argv, const char *flagstr, const char *chflagstr)
{
char tmp[BUFSIZ];
if (strlcpy(tmp, flagstr, sizeof tmp) >= sizeof tmp)
fatalx("strlcpy overflow");
if (strlcat(tmp, chflagstr, sizeof tmp) >= sizeof tmp)
fatalx("strlcat overflow");
return (getopt(argc, argv, tmp));
}
/* Return if flag character is set. */
int
cmd_check_flag(uint64_t chflags, int flag)
{
if (flag >= 'A' && flag <= 'Z')
flag = 26 + flag - 'A';
else if (flag >= 'a' && flag <= 'z')
flag = flag - 'a';
else
return (0);
return ((chflags & (1ULL << flag)) != 0);
}
/* Set flag character. */
void
cmd_set_flag(uint64_t *chflags, int flag)
{
if (flag >= 'A' && flag <= 'Z')
flag = 26 + flag - 'A';
else if (flag >= 'a' && flag <= 'z')
flag = flag - 'a';
else
return;
(*chflags) |= (1ULL << flag);
}
/* If this option is expected, set it in chflags, otherwise return -1. */
int
cmd_parse_flags(int opt, const char *chflagstr, uint64_t *chflags)
{
if (strchr(chflagstr, opt) == NULL)
return (-1);
cmd_set_flag(chflags, opt);
return (0);
}
/* Print the flags present in chflags. */
size_t
cmd_print_flags(char *buf, size_t len, size_t off, uint64_t chflags)
{
u_char ch;
size_t boff = off;
if (chflags == 0)
return (0);
off += xsnprintf(buf + off, len - off, " -");
for (ch = 0; ch < 26; ch++) {
if (cmd_check_flag(chflags, 'a' + ch))
off += xsnprintf(buf + off, len - off, "%c", 'a' + ch);
if (cmd_check_flag(chflags, 'A' + ch))
off += xsnprintf(buf + off, len - off, "%c", 'A' + ch);
}
return (off - boff);
}
int
cmd_fill_argument(int flags, char **arg, char **arg2, int argc, char **argv)
{
*arg = NULL;
*arg2 = NULL;
if (flags & CMD_ARG1) {
if (argc != 1)
return (-1);
*arg = xstrdup(argv[0]);
return (0);
}
if (flags & CMD_ARG01) {
if (argc != 0 && argc != 1)
return (-1);
if (argc == 1)
*arg = xstrdup(argv[0]);
return (0);
}
if (flags & CMD_ARG2) {
if (argc != 2)
return (-1);
*arg = xstrdup(argv[0]);
*arg2 = xstrdup(argv[1]);
return (0);
}
if (flags & CMD_ARG12) {
if (argc != 1 && argc != 2)
return (-1);
*arg = xstrdup(argv[0]);
if (argc == 2)
*arg2 = xstrdup(argv[1]);
return (0);
}
if (argc != 0)
return (-1);
return (0);
}
/* ARGSUSED */
void
cmd_target_init(struct cmd *self, unused int key)
{
struct cmd_target_data *data;
self->data = data = xmalloc(sizeof *data);
data->chflags = 0;
data->target = NULL;
data->arg = NULL;
data->arg2 = NULL;
}
int
cmd_target_parse(struct cmd *self, int argc, char **argv, char **cause)
{
struct cmd_target_data *data;
const struct cmd_entry *entry = self->entry;
int opt;
/* Don't use the entry version since it may be dependent on key. */
cmd_target_init(self, 0);
data = self->data;
while ((opt = cmd_getopt(argc, argv, "t:", entry->chflags)) != -1) {
if (cmd_parse_flags(opt, entry->chflags, &data->chflags) == 0)
continue;
switch (opt) {
case 't':
if (data->target == NULL)
data->target = xstrdup(optarg);
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (cmd_fill_argument(
self->entry->flags, &data->arg, &data->arg2, argc, argv) != 0)
goto usage;
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
void
cmd_target_free(struct cmd *self)
{
struct cmd_target_data *data = self->data;
if (data->target != NULL)
xfree(data->target);
if (data->arg != NULL)
xfree(data->arg);
if (data->arg2 != NULL)
xfree(data->arg2);
xfree(data);
}
size_t
cmd_target_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_target_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
off += cmd_print_flags(buf, len, off, data->chflags);
if (off < len && data->target != NULL)
off += cmd_prarg(buf + off, len - off, " -t ", data->target);
if (off < len && data->arg != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->arg);
if (off < len && data->arg2 != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->arg2);
return (off);
}
/* ARGSUSED */
void
cmd_srcdst_init(struct cmd *self, unused int key)
{
struct cmd_srcdst_data *data;
self->data = data = xmalloc(sizeof *data);
data->chflags = 0;
data->src = NULL;
data->dst = NULL;
data->arg = NULL;
data->arg2 = NULL;
}
int
cmd_srcdst_parse(struct cmd *self, int argc, char **argv, char **cause)
{
struct cmd_srcdst_data *data;
const struct cmd_entry *entry = self->entry;
int opt;
cmd_srcdst_init(self, 0);
data = self->data;
while ((opt = cmd_getopt(argc, argv, "s:t:", entry->chflags)) != -1) {
if (cmd_parse_flags(opt, entry->chflags, &data->chflags) == 0)
continue;
switch (opt) {
case 's':
if (data->src == NULL)
data->src = xstrdup(optarg);
break;
case 't':
if (data->dst == NULL)
data->dst = xstrdup(optarg);
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (cmd_fill_argument(
self->entry->flags, &data->arg, &data->arg2, argc, argv) != 0)
goto usage;
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
void
cmd_srcdst_free(struct cmd *self)
{
struct cmd_srcdst_data *data = self->data;
if (data->src != NULL)
xfree(data->src);
if (data->dst != NULL)
xfree(data->dst);
if (data->arg != NULL)
xfree(data->arg);
if (data->arg2 != NULL)
xfree(data->arg2);
xfree(data);
}
size_t
cmd_srcdst_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_srcdst_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
off += cmd_print_flags(buf, len, off, data->chflags);
if (off < len && data->src != NULL)
off += xsnprintf(buf + off, len - off, " -s %s", data->src);
if (off < len && data->dst != NULL)
off += xsnprintf(buf + off, len - off, " -t %s", data->dst);
if (off < len && data->arg != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->arg);
if (off < len && data->arg2 != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->arg2);
return (off);
}
/* ARGSUSED */
void
cmd_buffer_init(struct cmd *self, unused int key)
{
struct cmd_buffer_data *data;
self->data = data = xmalloc(sizeof *data);
data->chflags = 0;
data->target = NULL;
data->buffer = -1;
data->arg = NULL;
data->arg2 = NULL;
}
int
cmd_buffer_parse(struct cmd *self, int argc, char **argv, char **cause)
{
struct cmd_buffer_data *data;
const struct cmd_entry *entry = self->entry;
int opt, n;
const char *errstr;
cmd_buffer_init(self, 0);
data = self->data;
while ((opt = cmd_getopt(argc, argv, "b:t:", entry->chflags)) != -1) {
if (cmd_parse_flags(opt, entry->chflags, &data->chflags) == 0)
continue;
switch (opt) {
case 'b':
if (data->buffer == -1) {
n = strtonum(optarg, 0, INT_MAX, &errstr);
if (errstr != NULL) {
xasprintf(cause, "buffer %s", errstr);
goto error;
}
data->buffer = n;
}
break;
case 't':
if (data->target == NULL)
data->target = xstrdup(optarg);
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (cmd_fill_argument(
self->entry->flags, &data->arg, &data->arg2, argc, argv) != 0)
goto usage;
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
error:
self->entry->free(self);
return (-1);
}
void
cmd_buffer_free(struct cmd *self)
{
struct cmd_buffer_data *data = self->data;
if (data->target != NULL)
xfree(data->target);
if (data->arg != NULL)
xfree(data->arg);
if (data->arg2 != NULL)
xfree(data->arg2);
xfree(data);
}
size_t
cmd_buffer_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_buffer_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
off += cmd_print_flags(buf, len, off, data->chflags);
if (off < len && data->buffer != -1)
off += xsnprintf(buf + off, len - off, " -b %d", data->buffer);
if (off < len && data->target != NULL)
off += cmd_prarg(buf + off, len - off, " -t ", data->target);
if (off < len && data->arg != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->arg);
if (off < len && data->arg2 != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->arg2);
return (off);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-has-session.c,v 1.15 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,26 +24,25 @@
* Cause client to report an error and exit with 1 if session doesn't exist. * Cause client to report an error and exit with 1 if session doesn't exist.
*/ */
int cmd_has_session_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_has_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_has_session_entry = { const struct cmd_entry cmd_has_session_entry = {
"has-session", "has", "has-session", "has",
"t:", 0, 0,
CMD_TARGET_SESSION_USAGE, CMD_TARGET_SESSION_USAGE,
0, "", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_has_session_exec, cmd_has_session_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_has_session_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_has_session_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
if (cmd_find_session(ctx, data->target) == NULL) if (cmd_find_session(cmdq, args_get(args, 't'), 0) == NULL)
return (-1); return (CMD_RETURN_ERROR);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-if-shell.c,v 1.8 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org> * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -20,98 +20,157 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
/* /*
* Executes a tmux command if a shell command returns true. * Executes a tmux command if a shell command returns true or false.
*/ */
int cmd_if_shell_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_if_shell_exec(struct cmd *, struct cmd_q *);
void cmd_if_shell_callback(struct job *); void cmd_if_shell_callback(struct job *);
void cmd_if_shell_done(struct cmd_q *);
void cmd_if_shell_free(void *); void cmd_if_shell_free(void *);
const struct cmd_entry cmd_if_shell_entry = { const struct cmd_entry cmd_if_shell_entry = {
"if-shell", "if", "if-shell", "if",
"shell-command command", "bt:", 2, 3,
CMD_ARG2, "", "[-b] " CMD_TARGET_PANE_USAGE " shell-command command [command]",
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_if_shell_exec, NULL,
cmd_target_free, cmd_if_shell_exec
cmd_target_print
}; };
struct cmd_if_shell_data { struct cmd_if_shell_data {
char *cmd; char *cmd_if;
struct cmd_ctx ctx; char *cmd_else;
struct cmd_q *cmdq;
int bflag;
int started;
}; };
int enum cmd_retval
cmd_if_shell_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_if_shell_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct cmd_if_shell_data *cdata; struct cmd_if_shell_data *cdata;
struct job *job; char *shellcmd;
struct client *c;
struct session *s = NULL;
struct winlink *wl = NULL;
struct window_pane *wp = NULL;
struct format_tree *ft;
if (args_has(args, 't'))
wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
else {
c = cmd_find_client(cmdq, NULL, 1);
if (c != NULL && c->session != NULL) {
s = c->session;
wl = s->curw;
wp = wl->window->active;
}
}
ft = format_create();
if (s != NULL)
format_session(ft, s);
if (s != NULL && wl != NULL)
format_winlink(ft, s, wl);
if (wp != NULL)
format_window_pane(ft, wp);
shellcmd = format_expand(ft, args->argv[0]);
format_free(ft);
cdata = xmalloc(sizeof *cdata); cdata = xmalloc(sizeof *cdata);
cdata->cmd = xstrdup(data->arg2); cdata->cmd_if = xstrdup(args->argv[1]);
memcpy(&cdata->ctx, ctx, sizeof cdata->ctx); if (args->argc == 3)
cdata->cmd_else = xstrdup(args->argv[2]);
else
cdata->cmd_else = NULL;
cdata->bflag = args_has(args, 'b');
if (ctx->cmdclient != NULL) cdata->started = 0;
ctx->cmdclient->references++; cdata->cmdq = cmdq;
if (ctx->curclient != NULL) cmdq->references++;
ctx->curclient->references++;
job = job_add(NULL, 0, NULL, job_run(shellcmd, s, cmd_if_shell_callback, cmd_if_shell_free, cdata);
data->arg, cmd_if_shell_callback, cmd_if_shell_free, cdata); free(shellcmd);
job_run(job);
return (1); /* don't let client exit */ if (cdata->bflag)
return (CMD_RETURN_NORMAL);
return (CMD_RETURN_WAIT);
} }
void void
cmd_if_shell_callback(struct job *job) cmd_if_shell_callback(struct job *job)
{ {
struct cmd_if_shell_data *cdata = job->data; struct cmd_if_shell_data *cdata = job->data;
struct cmd_ctx *ctx = &cdata->ctx; struct cmd_q *cmdq = cdata->cmdq, *cmdq1;
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
char *cause; char *cause, *cmd;
if (!WIFEXITED(job->status) || WEXITSTATUS(job->status) != 0) if (cmdq->dead)
return; return;
if (cmd_string_parse(cdata->cmd, &cmdlist, &cause) != 0) { if (!WIFEXITED(job->status) || WEXITSTATUS(job->status) != 0)
cmd = cdata->cmd_else;
else
cmd = cdata->cmd_if;
if (cmd == NULL)
return;
if (cmd_string_parse(cmd, &cmdlist, NULL, 0, &cause) != 0) {
if (cause != NULL) { if (cause != NULL) {
ctx->error(ctx, "%s", cause); cmdq_error(cmdq, "%s", cause);
xfree(cause); free(cause);
} }
return; return;
} }
if (cmd_list_exec(cmdlist, ctx) < 0) { cdata->started = 1;
cmd_list_free(cmdlist);
return;
}
cmdq1 = cmdq_new(cmdq->client);
cmdq1->emptyfn = cmd_if_shell_done;
cmdq1->data = cdata;
cmdq_run(cmdq1, cmdlist);
cmd_list_free(cmdlist); cmd_list_free(cmdlist);
} }
void
cmd_if_shell_done(struct cmd_q *cmdq1)
{
struct cmd_if_shell_data *cdata = cmdq1->data;
struct cmd_q *cmdq = cdata->cmdq;
if (!cmdq_free(cmdq) && !cdata->bflag)
cmdq_continue(cmdq);
cmdq_free(cmdq1);
free(cdata->cmd_else);
free(cdata->cmd_if);
free(cdata);
}
void void
cmd_if_shell_free(void *data) cmd_if_shell_free(void *data)
{ {
struct cmd_if_shell_data *cdata = data; struct cmd_if_shell_data *cdata = data;
struct cmd_ctx *ctx = &cdata->ctx; struct cmd_q *cmdq = cdata->cmdq;
if (ctx->cmdclient != NULL) { if (cdata->started)
ctx->cmdclient->references--; return;
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0);
}
if (ctx->curclient != NULL)
ctx->curclient->references--;
xfree(cdata->cmd); if (!cmdq_free(cmdq) && !cdata->bflag)
xfree(cdata); cmdq_continue(cmdq);
free(cdata->cmd_else);
free(cdata->cmd_if);
free(cdata);
} }

View File

@@ -1,6 +1,7 @@
/* $Id: cmd-join-pane.c,v 1.2 2010-01-08 16:34:17 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2011 George Nachman <tmux@georgester.com>
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
* *
* Permission to use, copy, modify, and distribute this software for any * Permission to use, copy, modify, and distribute this software for any
@@ -24,166 +25,117 @@
#include "tmux.h" #include "tmux.h"
/* /*
* Join a pane into another (like split/swap/kill). * Join or move a pane into another (like split/swap/kill).
*/ */
int cmd_join_pane_parse(struct cmd *, int, char **, char **); void cmd_join_pane_key_binding(struct cmd *, int);
int cmd_join_pane_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_join_pane_exec(struct cmd *, struct cmd_q *);
void cmd_join_pane_free(struct cmd *);
void cmd_join_pane_init(struct cmd *, int);
size_t cmd_join_pane_print(struct cmd *, char *, size_t);
struct cmd_join_pane_data { enum cmd_retval join_pane(struct cmd *, struct cmd_q *, int);
char *src;
char *dst;
int flag_detached;
int flag_horizontal;
int percentage;
int size;
};
const struct cmd_entry cmd_join_pane_entry = { const struct cmd_entry cmd_join_pane_entry = {
"join-pane", "joinp", "join-pane", "joinp",
"[-dhv] [-p percentage|-l size] [-t src-pane] [-t dst-pane] [command]", "bdhvp:l:s:t:", 0, 0,
0, "", "[-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane]",
cmd_join_pane_init, 0,
cmd_join_pane_parse, cmd_join_pane_key_binding,
cmd_join_pane_exec, NULL,
cmd_join_pane_free, cmd_join_pane_exec
cmd_join_pane_print };
const struct cmd_entry cmd_move_pane_entry = {
"move-pane", "movep",
"bdhvp:l:s:t:", 0, 0,
"[-bdhv] [-p percentage|-l size] [-s src-pane] [-t dst-pane]",
0,
NULL,
NULL,
cmd_join_pane_exec
}; };
void void
cmd_join_pane_init(struct cmd *self, int key) cmd_join_pane_key_binding(struct cmd *self, int key)
{ {
struct cmd_join_pane_data *data;
self->data = data = xmalloc(sizeof *data);
data->src = NULL;
data->dst = NULL;
data->flag_detached = 0;
data->flag_horizontal = 0;
data->percentage = -1;
data->size = -1;
switch (key) { switch (key) {
case '%': case '%':
data->flag_horizontal = 1; self->args = args_create(0);
args_set(self->args, 'h', NULL);
break; break;
case '"': default:
data->flag_horizontal = 0; self->args = args_create(0);
break; break;
} }
} }
int enum cmd_retval
cmd_join_pane_parse(struct cmd *self, int argc, char **argv, char **cause) cmd_join_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_join_pane_data *data; return (join_pane(self, cmdq, self->entry == &cmd_join_pane_entry));
int opt;
const char *errstr;
self->entry->init(self, KEYC_NONE);
data = self->data;
while ((opt = getopt(argc, argv, "dhl:p:s:t:v")) != -1) {
switch (opt) {
case 'd':
data->flag_detached = 1;
break;
case 'h':
data->flag_horizontal = 1;
break;
case 's':
if (data->src == NULL)
data->src = xstrdup(optarg);
break;
case 't':
if (data->dst == NULL)
data->dst = xstrdup(optarg);
break;
case 'l':
if (data->percentage != -1 || data->size != -1)
break;
data->size = strtonum(optarg, 1, INT_MAX, &errstr);
if (errstr != NULL) {
xasprintf(cause, "size %s", errstr);
goto error;
}
break;
case 'p':
if (data->size != -1 || data->percentage != -1)
break;
data->percentage = strtonum(optarg, 1, 100, &errstr);
if (errstr != NULL) {
xasprintf(cause, "percentage %s", errstr);
goto error;
}
break;
case 'v':
data->flag_horizontal = 0;
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (argc != 0)
goto usage;
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
error:
self->entry->free(self);
return (-1);
} }
int enum cmd_retval
cmd_join_pane_exec(struct cmd *self, struct cmd_ctx *ctx) join_pane(struct cmd *self, struct cmd_q *cmdq, int not_same_window)
{ {
struct cmd_join_pane_data *data = self->data; struct args *args = self->args;
struct session *dst_s; struct session *dst_s;
struct winlink *src_wl, *dst_wl; struct winlink *src_wl, *dst_wl;
struct window *src_w, *dst_w; struct window *src_w, *dst_w;
struct window_pane *src_wp, *dst_wp; struct window_pane *src_wp, *dst_wp;
int size; char *cause;
enum layout_type type; int size, percentage, dst_idx;
struct layout_cell *lc; enum layout_type type;
struct layout_cell *lc;
if ((dst_wl = cmd_find_pane(ctx, data->dst, &dst_s, &dst_wp)) == NULL) dst_wl = cmd_find_pane(cmdq, args_get(args, 't'), &dst_s, &dst_wp);
return (-1); if (dst_wl == NULL)
return (CMD_RETURN_ERROR);
dst_w = dst_wl->window; dst_w = dst_wl->window;
dst_idx = dst_wl->idx;
server_unzoom_window(dst_w);
if ((src_wl = cmd_find_pane(ctx, data->src, NULL, &src_wp)) == NULL) src_wl = cmd_find_pane(cmdq, args_get(args, 's'), NULL, &src_wp);
return (-1); if (src_wl == NULL)
return (CMD_RETURN_ERROR);
src_w = src_wl->window; src_w = src_wl->window;
server_unzoom_window(src_w);
if (src_w == dst_w) { if (not_same_window && src_w == dst_w) {
ctx->error(ctx, "can't join a pane to its own window"); cmdq_error(cmdq, "can't join a pane to its own window");
return (-1); return (CMD_RETURN_ERROR);
}
if (!not_same_window && src_wp == dst_wp) {
cmdq_error(cmdq, "source and target panes must be different");
return (CMD_RETURN_ERROR);
} }
type = LAYOUT_TOPBOTTOM; type = LAYOUT_TOPBOTTOM;
if (data->flag_horizontal) if (args_has(args, 'h'))
type = LAYOUT_LEFTRIGHT; type = LAYOUT_LEFTRIGHT;
size = -1; size = -1;
if (data->size != -1) if (args_has(args, 'l')) {
size = data->size; size = args_strtonum(args, 'l', 0, INT_MAX, &cause);
else if (data->percentage != -1) { if (cause != NULL) {
cmdq_error(cmdq, "size %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
} else if (args_has(args, 'p')) {
percentage = args_strtonum(args, 'p', 0, 100, &cause);
if (cause != NULL) {
cmdq_error(cmdq, "percentage %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
if (type == LAYOUT_TOPBOTTOM) if (type == LAYOUT_TOPBOTTOM)
size = (dst_wp->sy * data->percentage) / 100; size = (dst_wp->sy * percentage) / 100;
else else
size = (dst_wp->sx * data->percentage) / 100; size = (dst_wp->sx * percentage) / 100;
} }
lc = layout_split_pane(dst_wp, type, size, args_has(args, 'b'));
if ((lc = layout_split_pane(dst_wp, type, size)) == NULL) { if (lc == NULL) {
ctx->error(ctx, "create pane failed: pane too small"); cmdq_error(cmdq, "create pane failed: pane too small");
return (-1); return (CMD_RETURN_ERROR);
} }
layout_close_pane(src_wp); layout_close_pane(src_wp);
@@ -197,6 +149,8 @@ cmd_join_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
if (window_count_panes(src_w) == 0) if (window_count_panes(src_w) == 0)
server_kill_window(src_w); server_kill_window(src_w);
else
notify_window_layout_changed(src_w);
src_wp->window = dst_w; src_wp->window = dst_w;
TAILQ_INSERT_AFTER(&dst_w->panes, dst_wp, src_wp, entry); TAILQ_INSERT_AFTER(&dst_w->panes, dst_wp, src_wp, entry);
@@ -207,50 +161,13 @@ cmd_join_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
server_redraw_window(src_w); server_redraw_window(src_w);
server_redraw_window(dst_w); server_redraw_window(dst_w);
if (!data->flag_detached) { if (!args_has(args, 'd')) {
window_set_active_pane(dst_w, src_wp); window_set_active_pane(dst_w, src_wp);
session_select(dst_s, dst_wl->idx); session_select(dst_s, dst_idx);
server_redraw_session(dst_s); server_redraw_session(dst_s);
} else } else
server_status_session(dst_s); server_status_session(dst_s);
return (0); notify_window_layout_changed(dst_w);
} return (CMD_RETURN_NORMAL);
void
cmd_join_pane_free(struct cmd *self)
{
struct cmd_join_pane_data *data = self->data;
if (data->src != NULL)
xfree(data->src);
if (data->dst != NULL)
xfree(data->dst);
xfree(data);
}
size_t
cmd_join_pane_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_join_pane_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
if (off < len && data->flag_detached)
off += xsnprintf(buf + off, len - off, " -d");
if (off < len && data->flag_horizontal)
off += xsnprintf(buf + off, len - off, " -h");
if (off < len && data->size > 0)
off += xsnprintf(buf + off, len - off, " -l %d", data->size);
if (off < len && data->percentage > 0) {
off += xsnprintf(
buf + off, len - off, " -p %d", data->percentage);
}
if (off < len && data->src != NULL)
off += cmd_prarg(buf + off, len - off, " -s ", data->src);
if (off < len && data->dst != NULL)
off += cmd_prarg(buf + off, len - off, " -t ", data->dst);
return (off);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-kill-pane.c,v 1.15 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,45 +26,42 @@
* Kill pane. * Kill pane.
*/ */
int cmd_kill_pane_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_kill_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_kill_pane_entry = { const struct cmd_entry cmd_kill_pane_entry = {
"kill-pane", "killp", "kill-pane", "killp",
"at:", 0, 0,
"[-a] " CMD_TARGET_PANE_USAGE, "[-a] " CMD_TARGET_PANE_USAGE,
0, "a", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_kill_pane_exec, cmd_kill_pane_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_kill_pane_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_kill_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct winlink *wl;
struct window_pane *loopwp, *nextwp, *wp; struct window_pane *loopwp, *tmpwp, *wp;
if ((wl = cmd_find_pane(ctx, data->target, NULL, &wp)) == NULL) if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
server_unzoom_window(wl->window);
if (window_count_panes(wl->window) == 1) { if (window_count_panes(wl->window) == 1) {
/* Only one pane, kill the window. */ /* Only one pane, kill the window. */
server_kill_window(wl->window); server_kill_window(wl->window);
recalculate_sizes(); recalculate_sizes();
return (0); return (CMD_RETURN_NORMAL);
} }
if (cmd_check_flag(data->chflags, 'a')) { if (args_has(self->args, 'a')) {
loopwp = TAILQ_FIRST(&wl->window->panes); TAILQ_FOREACH_SAFE(loopwp, &wl->window->panes, entry, tmpwp) {
while (loopwp != NULL) { if (loopwp == wp)
nextwp = TAILQ_NEXT(loopwp, entry); continue;
if (loopwp != wp) { layout_close_pane(loopwp);
layout_close_pane(loopwp); window_remove_pane(wl->window, loopwp);
window_remove_pane(wl->window, loopwp);
}
loopwp = nextwp;
} }
} else { } else {
layout_close_pane(wp); layout_close_pane(wp);
@@ -72,5 +69,5 @@ cmd_kill_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
} }
server_redraw_window(wl->window); server_redraw_window(wl->window);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-kill-server.c,v 1.11 2009-11-28 14:50:36 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,24 +27,22 @@
* Kill the server and do nothing else. * Kill the server and do nothing else.
*/ */
int cmd_kill_server_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_kill_server_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_kill_server_entry = { const struct cmd_entry cmd_kill_server_entry = {
"kill-server", NULL, "kill-server", NULL,
"", 0, 0,
"", "",
0, "", 0,
NULL, NULL,
NULL, NULL,
cmd_kill_server_exec, cmd_kill_server_exec
NULL,
NULL
}; };
/* ARGSUSED */ enum cmd_retval
int cmd_kill_server_exec(unused struct cmd *self, unused struct cmd_q *cmdq)
cmd_kill_server_exec(unused struct cmd *self, unused struct cmd_ctx *ctx)
{ {
kill(getpid(), SIGTERM); kill(getpid(), SIGTERM);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-kill-session.c,v 1.17 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,40 +27,37 @@
* Note this deliberately has no alias to make it hard to hit by accident. * Note this deliberately has no alias to make it hard to hit by accident.
*/ */
int cmd_kill_session_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_kill_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_kill_session_entry = { const struct cmd_entry cmd_kill_session_entry = {
"kill-session", NULL, "kill-session", NULL,
CMD_TARGET_SESSION_USAGE, "at:", 0, 0,
0, "", "[-a] " CMD_TARGET_SESSION_USAGE,
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_kill_session_exec, NULL,
cmd_target_free, cmd_kill_session_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_kill_session_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_kill_session_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct session *s; struct session *s, *s2, *s3;
struct client *c;
u_int i;
if ((s = cmd_find_session(ctx, data->target)) == NULL) if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { if (args_has(args, 'a')) {
c = ARRAY_ITEM(&clients, i); RB_FOREACH_SAFE(s2, sessions, &sessions, s3) {
if (c != NULL && c->session == s) { if (s != s2) {
c->session = NULL; server_destroy_session(s2);
server_write_client(c, MSG_EXIT, NULL, 0); session_destroy(s2);
}
} }
} else {
server_destroy_session(s);
session_destroy(s);
} }
recalculate_sizes(); return (CMD_RETURN_NORMAL);
session_destroy(s);
return (0);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-kill-window.c,v 1.21 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,30 +24,36 @@
* Destroy window. * Destroy window.
*/ */
int cmd_kill_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_kill_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_kill_window_entry = { const struct cmd_entry cmd_kill_window_entry = {
"kill-window", "killw", "kill-window", "killw",
CMD_TARGET_WINDOW_USAGE, "at:", 0, 0,
0, "", "[-a] " CMD_TARGET_WINDOW_USAGE,
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_kill_window_exec, NULL,
cmd_target_free, cmd_kill_window_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_kill_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_kill_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct winlink *wl, *wl2, *wl3;
struct session *s;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
if (args_has(args, 'a')) {
RB_FOREACH_SAFE(wl2, winlinks, &s->windows, wl3) {
if (wl != wl2)
server_kill_window(wl2->window);
}
} else
server_kill_window(wl->window);
server_kill_window(wl->window);
recalculate_sizes(); recalculate_sizes();
return (CMD_RETURN_NORMAL);
return (0);
} }

View File

@@ -1,58 +0,0 @@
/* $Id: cmd-last-window.c,v 1.19 2009-11-14 17:56:39 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Move to last window.
*/
int cmd_last_window_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_last_window_entry = {
"last-window", "last",
CMD_TARGET_SESSION_USAGE,
0, "",
cmd_target_init,
cmd_target_parse,
cmd_last_window_exec,
cmd_target_free,
cmd_target_print
};
int
cmd_last_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct session *s;
if ((s = cmd_find_session(ctx, data->target)) == NULL)
return (-1);
if (session_last(s) == 0)
server_redraw_session(s);
else {
ctx->error(ctx, "no last window");
return (-1);
}
recalculate_sizes();
return (0);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-link-window.c,v 1.36 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,41 +26,40 @@
* Link a window into another session. * Link a window into another session.
*/ */
int cmd_link_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_link_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_link_window_entry = { const struct cmd_entry cmd_link_window_entry = {
"link-window", "linkw", "link-window", "linkw",
"dks:t:", 0, 0,
"[-dk] " CMD_SRCDST_WINDOW_USAGE, "[-dk] " CMD_SRCDST_WINDOW_USAGE,
0, "dk", 0,
cmd_srcdst_init, NULL,
cmd_srcdst_parse, NULL,
cmd_link_window_exec, cmd_link_window_exec
cmd_srcdst_free,
cmd_srcdst_print
}; };
int enum cmd_retval
cmd_link_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_link_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_srcdst_data *data = self->data; struct args *args = self->args;
struct session *src, *dst; struct session *src, *dst;
struct winlink *wl; struct winlink *wl;
char *cause; char *cause;
int idx, kflag, dflag; int idx, kflag, dflag;
if ((wl = cmd_find_window(ctx, data->src, &src)) == NULL) if ((wl = cmd_find_window(cmdq, args_get(args, 's'), &src)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2) if ((idx = cmd_find_index(cmdq, args_get(args, 't'), &dst)) == -2)
return (-1); return (CMD_RETURN_ERROR);
kflag = cmd_check_flag(data->chflags, 'k'); kflag = args_has(self->args, 'k');
dflag = cmd_check_flag(data->chflags, 'd'); dflag = args_has(self->args, 'd');
if (server_link_window(src, wl, dst, idx, kflag, !dflag, &cause) != 0) { if (server_link_window(src, wl, dst, idx, kflag, !dflag, &cause) != 0) {
ctx->error(ctx, "can't link window: %s", cause); cmdq_error(cmdq, "can't link window: %s", cause);
xfree(cause); free(cause);
return (-1); return (CMD_RETURN_ERROR);
} }
recalculate_sizes(); recalculate_sizes();
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-list-buffers.c,v 1.15 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
@@ -26,53 +27,43 @@
* List paste buffers. * List paste buffers.
*/ */
int cmd_list_buffers_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_list_buffers_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_list_buffers_entry = { const struct cmd_entry cmd_list_buffers_entry = {
"list-buffers", "lsb", "list-buffers", "lsb",
CMD_TARGET_SESSION_USAGE, "F:", 0, 0,
0, "", "[-F format]",
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_list_buffers_exec, NULL,
cmd_target_free, cmd_list_buffers_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_list_buffers_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_list_buffers_exec(unused struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct session *s;
struct paste_buffer *pb; struct paste_buffer *pb;
struct format_tree *ft;
u_int idx; u_int idx;
char tmp[51 * 4 + 1]; char *line;
size_t size, len; const char *template;
if ((s = cmd_find_session(ctx, data->target)) == NULL) if ((template = args_get(args, 'F')) == NULL)
return (-1); template = LIST_BUFFERS_TEMPLATE;
idx = 0; idx = 0;
while ((pb = paste_walk_stack(&s->buffers, &idx)) != NULL) { while ((pb = paste_walk_stack(&global_buffers, &idx)) != NULL) {
size = pb->size; ft = format_create();
format_add(ft, "line", "%u", idx - 1);
format_paste_buffer(ft, pb);
/* Translate the first 50 characters. */ line = format_expand(ft, template);
len = size; cmdq_print(cmdq, "%s", line);
if (len > 50) free(line);
len = 50;
strvisx(tmp, pb->data, len, VIS_OCTAL|VIS_TAB|VIS_NL);
/* format_free(ft);
* If the first 50 characters were encoded as a longer string,
* or there is definitely more data, add "...".
*/
if (size > 50 || strlen(tmp) > 50) {
tmp[50 - 3] = '\0';
strlcat(tmp, "...", sizeof tmp);
}
ctx->print(ctx, "%u: %zu bytes: \"%s\"", idx - 1, size, tmp);
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-list-clients.c,v 1.20 2009-11-28 14:50:36 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
@@ -27,40 +28,58 @@
* List all clients. * List all clients.
*/ */
int cmd_list_clients_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_list_clients_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_list_clients_entry = { const struct cmd_entry cmd_list_clients_entry = {
"list-clients", "lsc", "list-clients", "lsc",
"", "F:t:", 0, 0,
0, "", "[-F format] " CMD_TARGET_SESSION_USAGE,
CMD_READONLY,
NULL, NULL,
NULL, NULL,
cmd_list_clients_exec, cmd_list_clients_exec
NULL,
NULL
}; };
/* ARGSUSED */ enum cmd_retval
int cmd_list_clients_exec(struct cmd *self, struct cmd_q *cmdq)
cmd_list_clients_exec(unused struct cmd *self, struct cmd_ctx *ctx)
{ {
struct client *c; struct args *args = self->args;
u_int i; struct client *c;
const char *s_utf8; struct session *s;
struct format_tree *ft;
const char *template;
u_int i;
char *line;
if (args_has(args, 't')) {
s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL)
return (CMD_RETURN_ERROR);
} else
s = NULL;
if ((template = args_get(args, 'F')) == NULL)
template = LIST_CLIENTS_TEMPLATE;
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i); c = ARRAY_ITEM(&clients, i);
if (c == NULL || c->session == NULL) if (c == NULL || c->session == NULL)
continue; continue;
if (c->tty.flags & TTY_UTF8) if (s != NULL && s != c->session)
s_utf8 = " (utf8)"; continue;
else
s_utf8 = ""; ft = format_create();
ctx->print(ctx, "%s: %s [%ux%u %s]%s", c->tty.path, format_add(ft, "line", "%u", i);
c->session->name, c->tty.sx, c->tty.sy, format_session(ft, c->session);
c->tty.termname, s_utf8); format_client(ft, c);
line = format_expand(ft, template);
cmdq_print(cmdq, "%s", line);
free(line);
format_free(ft);
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-list-commands.c,v 1.7 2009-11-28 14:50:36 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,27 +24,32 @@
* List all commands with usages. * List all commands with usages.
*/ */
int cmd_list_commands_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_list_commands_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_list_commands_entry = { const struct cmd_entry cmd_list_commands_entry = {
"list-commands", "lscm", "list-commands", "lscm",
"", 0, 0,
"", "",
0, "", 0,
NULL, NULL,
NULL, NULL,
cmd_list_commands_exec, cmd_list_commands_exec
NULL,
NULL
}; };
/* ARGSUSED */ enum cmd_retval
int cmd_list_commands_exec(unused struct cmd *self, struct cmd_q *cmdq)
cmd_list_commands_exec(unused struct cmd *self, struct cmd_ctx *ctx)
{ {
const struct cmd_entry **entryp; const struct cmd_entry **entryp;
for (entryp = cmd_table; *entryp != NULL; entryp++) for (entryp = cmd_table; *entryp != NULL; entryp++) {
ctx->print(ctx, "%s %s", (*entryp)->name, (*entryp)->usage); if ((*entryp)->alias != NULL) {
cmdq_print(cmdq, "%s (%s) %s", (*entryp)->name,
(*entryp)->alias, (*entryp)->usage);
} else {
cmdq_print(cmdq, "%s %s", (*entryp)->name,
(*entryp)->usage);
}
}
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-list-keys.c,v 1.24 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,104 +26,126 @@
* List key bindings. * List key bindings.
*/ */
int cmd_list_keys_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_list_keys_exec(struct cmd *, struct cmd_q *);
enum cmd_retval cmd_list_keys_table(struct cmd *, struct cmd_q *);
int cmd_list_keys_table(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_list_keys_entry = { const struct cmd_entry cmd_list_keys_entry = {
"list-keys", "lsk", "list-keys", "lsk",
"t:", 0, 0,
"[-t key-table]", "[-t key-table]",
0, "", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_list_keys_exec, cmd_list_keys_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_list_keys_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_list_keys_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct key_binding *bd; struct key_binding *bd;
const char *key; const char *key;
char tmp[BUFSIZ]; char tmp[BUFSIZ], flags[8];
size_t used; size_t used;
int width, keywidth; int width, keywidth;
if (data->target != NULL) if (args_has(args, 't'))
return (cmd_list_keys_table(self, ctx)); return (cmd_list_keys_table(self, cmdq));
width = 0; width = 0;
SPLAY_FOREACH(bd, key_bindings, &key_bindings) {
RB_FOREACH(bd, key_bindings, &key_bindings) {
key = key_string_lookup_key(bd->key & ~KEYC_PREFIX); key = key_string_lookup_key(bd->key & ~KEYC_PREFIX);
if (key == NULL) if (key == NULL)
continue; continue;
keywidth = strlen(key) + 1; keywidth = strlen(key);
if (!(bd->key & KEYC_PREFIX)) if (!(bd->key & KEYC_PREFIX)) {
keywidth += 2; if (bd->can_repeat)
keywidth += 4;
else
keywidth += 3;
} else if (bd->can_repeat)
keywidth += 3;
if (keywidth > width) if (keywidth > width)
width = keywidth; width = keywidth;
} }
SPLAY_FOREACH(bd, key_bindings, &key_bindings) { RB_FOREACH(bd, key_bindings, &key_bindings) {
key = key_string_lookup_key(bd->key & ~KEYC_PREFIX); key = key_string_lookup_key(bd->key & ~KEYC_PREFIX);
if (key == NULL) if (key == NULL)
continue; continue;
used = xsnprintf(tmp, sizeof tmp, "%*s: ", width, key);
*flags = '\0';
if (!(bd->key & KEYC_PREFIX)) {
if (bd->can_repeat)
xsnprintf(flags, sizeof flags, "-rn ");
else
xsnprintf(flags, sizeof flags, "-n ");
} else if (bd->can_repeat)
xsnprintf(flags, sizeof flags, "-r ");
used = xsnprintf(tmp, sizeof tmp, "%s%*s ",
flags, (int) (width - strlen(flags)), key);
if (used >= sizeof tmp) if (used >= sizeof tmp)
continue; continue;
if (!(bd->key & KEYC_PREFIX)) {
used = strlcat(tmp, "(no prefix) ", sizeof tmp);
if (used >= sizeof tmp)
continue;
}
cmd_list_print(bd->cmdlist, tmp + used, (sizeof tmp) - used); cmd_list_print(bd->cmdlist, tmp + used, (sizeof tmp) - used);
ctx->print(ctx, "%s", tmp); cmdq_print(cmdq, "bind-key %s", tmp);
} }
return (0); return (CMD_RETURN_NORMAL);
} }
int enum cmd_retval
cmd_list_keys_table(struct cmd *self, struct cmd_ctx *ctx) cmd_list_keys_table(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
const char *tablename;
const struct mode_key_table *mtab; const struct mode_key_table *mtab;
struct mode_key_binding *mbind; struct mode_key_binding *mbind;
const char *key, *cmdstr, *mode; const char *key, *cmdstr, *mode;
int width, keywidth; int width, keywidth, any_mode;
if ((mtab = mode_key_findtable(data->target)) == NULL) { tablename = args_get(args, 't');
ctx->error(ctx, "unknown key table: %s", data->target); if ((mtab = mode_key_findtable(tablename)) == NULL) {
return (-1); cmdq_error(cmdq, "unknown key table: %s", tablename);
return (CMD_RETURN_ERROR);
} }
width = 0; width = 0;
SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) { any_mode = 0;
RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
key = key_string_lookup_key(mbind->key); key = key_string_lookup_key(mbind->key);
if (key == NULL) if (key == NULL)
continue; continue;
keywidth = strlen(key) + 1; if (mbind->mode != 0)
any_mode = 1;
keywidth = strlen(key);
if (keywidth > width) if (keywidth > width)
width = keywidth; width = keywidth;
} }
SPLAY_FOREACH(mbind, mode_key_tree, mtab->tree) { RB_FOREACH(mbind, mode_key_tree, mtab->tree) {
key = key_string_lookup_key(mbind->key); key = key_string_lookup_key(mbind->key);
if (key == NULL) if (key == NULL)
continue; continue;
mode = ""; mode = "";
if (mbind->mode != 0) if (mbind->mode != 0)
mode = "(command mode) "; mode = "c";
cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd); cmdstr = mode_key_tostring(mtab->cmdstr, mbind->cmd);
if (cmdstr != NULL) if (cmdstr != NULL) {
ctx->print(ctx, "%*s: %s%s", width, key, mode, cmdstr); cmdq_print(cmdq, "bind-key -%st %s%s %*s %s%s%s%s",
mode, any_mode && *mode == '\0' ? " " : "",
mtab->name, (int) width, key, cmdstr,
mbind->arg != NULL ? " \"" : "",
mbind->arg != NULL ? mbind->arg : "",
mbind->arg != NULL ? "\"": "");
}
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-list-panes.c,v 1.4 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include "tmux.h" #include "tmux.h"
@@ -26,49 +27,118 @@
* List panes on given window. * List panes on given window.
*/ */
int cmd_list_panes_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_list_panes_exec(struct cmd *, struct cmd_q *);
void cmd_list_panes_server(struct cmd *, struct cmd_q *);
void cmd_list_panes_session(
struct cmd *, struct session *, struct cmd_q *, int);
void cmd_list_panes_window(struct cmd *,
struct session *, struct winlink *, struct cmd_q *, int);
const struct cmd_entry cmd_list_panes_entry = { const struct cmd_entry cmd_list_panes_entry = {
"list-panes", "lsp", "list-panes", "lsp",
CMD_TARGET_WINDOW_USAGE, "asF:t:", 0, 0,
0, "", "[-as] [-F format] " CMD_TARGET_WINDOW_USAGE,
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_list_panes_exec, NULL,
cmd_target_free, cmd_list_panes_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_list_panes_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_list_panes_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct session *s;
struct window_pane *wp; struct winlink *wl;
struct grid *gd;
struct grid_line *gl;
u_int i, n;
unsigned long long size;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) if (args_has(args, 'a'))
return (-1); cmd_list_panes_server(self, cmdq);
else if (args_has(args, 's')) {
s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL)
return (CMD_RETURN_ERROR);
cmd_list_panes_session(self, s, cmdq, 1);
} else {
wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
if (wl == NULL)
return (CMD_RETURN_ERROR);
cmd_list_panes_window(self, s, wl, cmdq, 0);
}
return (CMD_RETURN_NORMAL);
}
void
cmd_list_panes_server(struct cmd *self, struct cmd_q *cmdq)
{
struct session *s;
RB_FOREACH(s, sessions, &sessions)
cmd_list_panes_session(self, s, cmdq, 2);
}
void
cmd_list_panes_session(
struct cmd *self, struct session *s, struct cmd_q *cmdq, int type)
{
struct winlink *wl;
RB_FOREACH(wl, winlinks, &s->windows)
cmd_list_panes_window(self, s, wl, cmdq, type);
}
void
cmd_list_panes_window(struct cmd *self,
struct session *s, struct winlink *wl, struct cmd_q *cmdq, int type)
{
struct args *args = self->args;
struct window_pane *wp;
u_int n;
struct format_tree *ft;
const char *template;
char *line;
template = args_get(args, 'F');
if (template == NULL) {
switch (type) {
case 0:
template = "#{pane_index}: "
"[#{pane_width}x#{pane_height}] [history "
"#{history_size}/#{history_limit}, "
"#{history_bytes} bytes] #{pane_id}"
"#{?pane_active, (active),}#{?pane_dead, (dead),}";
break;
case 1:
template = "#{window_index}.#{pane_index}: "
"[#{pane_width}x#{pane_height}] [history "
"#{history_size}/#{history_limit}, "
"#{history_bytes} bytes] #{pane_id}"
"#{?pane_active, (active),}#{?pane_dead, (dead),}";
break;
case 2:
template = "#{session_name}:#{window_index}.#{pane_index}: "
"[#{pane_width}x#{pane_height}] [history "
"#{history_size}/#{history_limit}, "
"#{history_bytes} bytes] #{pane_id}"
"#{?pane_active, (active),}#{?pane_dead, (dead),}";
break;
}
}
n = 0; n = 0;
TAILQ_FOREACH(wp, &wl->window->panes, entry) { TAILQ_FOREACH(wp, &wl->window->panes, entry) {
gd = wp->base.grid; ft = format_create();
format_add(ft, "line", "%u", n);
format_session(ft, s);
format_winlink(ft, s, wl);
format_window_pane(ft, wp);
size = 0; line = format_expand(ft, template);
for (i = 0; i < gd->hsize; i++) { cmdq_print(cmdq, "%s", line);
gl = &gd->linedata[i]; free(line);
size += gl->cellsize * sizeof *gl->celldata;
size += gl->utf8size * sizeof *gl->utf8data;
}
size += gd->hsize * sizeof *gd->linedata;
ctx->print(ctx, "%u: [%ux%u] [history %u/%u, %llu bytes]", format_free(ft);
n, wp->sx, wp->sy, gd->hsize, gd->hlimit, size);
n++; n++;
} }
return (0);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-list-sessions.c,v 1.25 2009-11-28 14:50:36 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
@@ -27,49 +28,44 @@
* List all sessions. * List all sessions.
*/ */
int cmd_list_sessions_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_list_sessions_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_list_sessions_entry = { const struct cmd_entry cmd_list_sessions_entry = {
"list-sessions", "ls", "", "list-sessions", "ls",
0, "", "F:", 0, 0,
"[-F format]",
0,
NULL, NULL,
NULL, NULL,
cmd_list_sessions_exec, cmd_list_sessions_exec
NULL,
NULL
}; };
/* ARGSUSED */ enum cmd_retval
int cmd_list_sessions_exec(struct cmd *self, struct cmd_q *cmdq)
cmd_list_sessions_exec(unused struct cmd *self, struct cmd_ctx *ctx)
{ {
struct args *args = self->args;
struct session *s; struct session *s;
struct session_group *sg; u_int n;
char *tim, tmp[64]; struct format_tree *ft;
u_int i, idx; const char *template;
time_t t; char *line;
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { if ((template = args_get(args, 'F')) == NULL)
s = ARRAY_ITEM(&sessions, i); template = LIST_SESSIONS_TEMPLATE;
if (s == NULL)
continue;
sg = session_group_find(s); n = 0;
if (sg == NULL) RB_FOREACH(s, sessions, &sessions) {
*tmp = '\0'; ft = format_create();
else { format_add(ft, "line", "%u", n);
idx = session_group_index(sg); format_session(ft, s);
xsnprintf(tmp, sizeof tmp, " (group %u)", idx);
}
t = s->creation_time.tv_sec; line = format_expand(ft, template);
tim = ctime(&t); cmdq_print(cmdq, "%s", line);
*strchr(tim, '\n') = '\0'; free(line);
ctx->print(ctx, "%s: %u windows (created %s) [%ux%u]%s%s", format_free(ft);
s->name, winlink_count(&s->windows), tim, s->sx, s->sy, n++;
tmp, s->flags & SESSION_UNATTACHED ? "" : " (attached)");
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-list-windows.c,v 1.42 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include "tmux.h" #include "tmux.h"
@@ -26,33 +27,85 @@
* List windows on given session. * List windows on given session.
*/ */
int cmd_list_windows_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_list_windows_exec(struct cmd *, struct cmd_q *);
void cmd_list_windows_server(struct cmd *, struct cmd_q *);
void cmd_list_windows_session(
struct cmd *, struct session *, struct cmd_q *, int);
const struct cmd_entry cmd_list_windows_entry = { const struct cmd_entry cmd_list_windows_entry = {
"list-windows", "lsw", "list-windows", "lsw",
CMD_TARGET_SESSION_USAGE, "F:at:", 0, 0,
0, "", "[-a] [-F format] " CMD_TARGET_SESSION_USAGE,
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_list_windows_exec, NULL,
cmd_target_free, cmd_list_windows_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_list_windows_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_list_windows_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct session *s; struct session *s;
struct winlink *wl;
if ((s = cmd_find_session(ctx, data->target)) == NULL) if (args_has(args, 'a'))
return (-1); cmd_list_windows_server(self, cmdq);
else {
RB_FOREACH(wl, winlinks, &s->windows) { s = cmd_find_session(cmdq, args_get(args, 't'), 0);
ctx->print(ctx, "%d: %s [%ux%u]", if (s == NULL)
wl->idx, wl->window->name, wl->window->sx, wl->window->sy); return (CMD_RETURN_ERROR);
cmd_list_windows_session(self, s, cmdq, 0);
} }
return (0); return (CMD_RETURN_NORMAL);
}
void
cmd_list_windows_server(struct cmd *self, struct cmd_q *cmdq)
{
struct session *s;
RB_FOREACH(s, sessions, &sessions)
cmd_list_windows_session(self, s, cmdq, 1);
}
void
cmd_list_windows_session(
struct cmd *self, struct session *s, struct cmd_q *cmdq, int type)
{
struct args *args = self->args;
struct winlink *wl;
u_int n;
struct format_tree *ft;
const char *template;
char *line;
template = args_get(args, 'F');
if (template == NULL) {
switch (type) {
case 0:
template = LIST_WINDOWS_TEMPLATE;
break;
case 1:
template = LIST_WINDOWS_WITH_SESSION_TEMPLATE;
break;
}
}
n = 0;
RB_FOREACH(wl, winlinks, &s->windows) {
ft = format_create();
format_add(ft, "line", "%u", n);
format_session(ft, s);
format_winlink(ft, s, wl);
format_window_pane(ft, wl->window->active);
line = format_expand(ft, template);
cmdq_print(cmdq, "%s", line);
free(line);
format_free(ft);
n++;
}
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-list.c,v 1.7 2010-02-02 23:51:04 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,104 +18,85 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
struct cmd_list * struct cmd_list *
cmd_list_parse(int argc, char **argv, char **cause) cmd_list_parse(int argc, char **argv, const char* file, u_int line,
char **cause)
{ {
struct cmd_list *cmdlist; struct cmd_list *cmdlist;
struct cmd *cmd; struct cmd *cmd;
int i, lastsplit; int i, lastsplit;
size_t arglen, new_argc; size_t arglen, new_argc;
char **new_argv; char **copy_argv, **new_argv;
cmdlist = xmalloc(sizeof *cmdlist); copy_argv = cmd_copy_argv(argc, argv);
TAILQ_INIT(cmdlist);
cmdlist = xcalloc(1, sizeof *cmdlist);
cmdlist->references = 1;
TAILQ_INIT(&cmdlist->list);
lastsplit = 0; lastsplit = 0;
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
arglen = strlen(argv[i]); arglen = strlen(copy_argv[i]);
if (arglen == 0 || argv[i][arglen - 1] != ';') if (arglen == 0 || copy_argv[i][arglen - 1] != ';')
continue; continue;
argv[i][arglen - 1] = '\0'; copy_argv[i][arglen - 1] = '\0';
if (arglen > 1 && argv[i][arglen - 2] == '\\') { if (arglen > 1 && copy_argv[i][arglen - 2] == '\\') {
argv[i][arglen - 2] = ';'; copy_argv[i][arglen - 2] = ';';
continue; continue;
} }
new_argc = i - lastsplit; new_argc = i - lastsplit;
new_argv = argv + lastsplit; new_argv = copy_argv + lastsplit;
if (arglen != 1) if (arglen != 1)
new_argc++; new_argc++;
cmd = cmd_parse(new_argc, new_argv, cause); cmd = cmd_parse(new_argc, new_argv, file, line, cause);
if (cmd == NULL) if (cmd == NULL)
goto bad; goto bad;
TAILQ_INSERT_TAIL(cmdlist, cmd, qentry); TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
lastsplit = i + 1; lastsplit = i + 1;
} }
if (lastsplit != argc) { if (lastsplit != argc) {
cmd = cmd_parse(argc - lastsplit, argv + lastsplit, cause); cmd = cmd_parse(argc - lastsplit, copy_argv + lastsplit,
file, line, cause);
if (cmd == NULL) if (cmd == NULL)
goto bad; goto bad;
TAILQ_INSERT_TAIL(cmdlist, cmd, qentry); TAILQ_INSERT_TAIL(&cmdlist->list, cmd, qentry);
} }
cmd_free_argv(argc, copy_argv);
return (cmdlist); return (cmdlist);
bad: bad:
cmd_list_free(cmdlist); cmd_list_free(cmdlist);
cmd_free_argv(argc, copy_argv);
return (NULL); return (NULL);
} }
int
cmd_list_exec(struct cmd_list *cmdlist, struct cmd_ctx *ctx)
{
struct cmd *cmd;
int n, retval;
retval = 0;
TAILQ_FOREACH(cmd, cmdlist, qentry) {
if ((n = cmd_exec(cmd, ctx)) == -1)
return (-1);
/*
* A 1 return value means the command client is being attached
* (sent MSG_READY).
*/
if (n == 1) {
retval = 1;
/*
* The command client has been attached, so mangle the
* context to treat any following commands as if they
* were called from inside.
*/
if (ctx->curclient == NULL) {
ctx->curclient = ctx->cmdclient;
ctx->cmdclient = NULL;
}
}
}
return (retval);
}
void void
cmd_list_free(struct cmd_list *cmdlist) cmd_list_free(struct cmd_list *cmdlist)
{ {
struct cmd *cmd; struct cmd *cmd, *cmd1;
while (!TAILQ_EMPTY(cmdlist)) { if (--cmdlist->references != 0)
cmd = TAILQ_FIRST(cmdlist); return;
TAILQ_REMOVE(cmdlist, cmd, qentry);
cmd_free(cmd); TAILQ_FOREACH_SAFE(cmd, &cmdlist->list, qentry, cmd1) {
TAILQ_REMOVE(&cmdlist->list, cmd, qentry);
args_free(cmd->args);
free(cmd->file);
free(cmd);
} }
xfree(cmdlist);
free(cmdlist);
} }
size_t size_t
@@ -125,7 +106,7 @@ cmd_list_print(struct cmd_list *cmdlist, char *buf, size_t len)
size_t off; size_t off;
off = 0; off = 0;
TAILQ_FOREACH(cmd, cmdlist, qentry) { TAILQ_FOREACH(cmd, &cmdlist->list, qentry) {
if (off >= len) if (off >= len)
break; break;
off += cmd_print(cmd, buf + off, len - off); off += cmd_print(cmd, buf + off, len - off);

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-load-buffer.c,v 1.15 2010-02-26 13:30:07 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org> * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -16,47 +16,88 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
#include <sys/types.h>
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include "tmux.h" #include "tmux.h"
/* /*
* Loads a session paste buffer from a file. * Loads a paste buffer from a file.
*/ */
int cmd_load_buffer_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_load_buffer_exec(struct cmd *, struct cmd_q *);
void cmd_load_buffer_callback(struct client *, int, void *);
const struct cmd_entry cmd_load_buffer_entry = { const struct cmd_entry cmd_load_buffer_entry = {
"load-buffer", "loadb", "load-buffer", "loadb",
CMD_BUFFER_SESSION_USAGE " path", "b:", 1, 1,
CMD_ARG1, "", CMD_BUFFER_USAGE " path",
cmd_buffer_init, 0,
cmd_buffer_parse, NULL,
cmd_load_buffer_exec, NULL,
cmd_buffer_free, cmd_load_buffer_exec
cmd_buffer_print
}; };
int enum cmd_retval
cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_load_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_buffer_data *data = self->data; struct args *args = self->args;
struct session *s; struct client *c = cmdq->client;
FILE *f; struct session *s;
char *pdata, *new_pdata; FILE *f;
size_t psize; const char *path, *newpath, *wd;
u_int limit; char *pdata, *new_pdata, *cause;
int ch; size_t psize;
u_int limit;
int ch, error, buffer, *buffer_ptr;
if ((s = cmd_find_session(ctx, data->target)) == NULL) if (!args_has(args, 'b'))
return (-1); buffer = -1;
else {
buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
if (cause != NULL) {
cmdq_error(cmdq, "buffer %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
}
if ((f = fopen(data->arg, "rb")) == NULL) { path = args->argv[0];
ctx->error(ctx, "%s: %s", data->arg, strerror(errno)); if (strcmp(path, "-") == 0) {
return (-1); buffer_ptr = xmalloc(sizeof *buffer_ptr);
*buffer_ptr = buffer;
error = server_set_stdin_callback (c, cmd_load_buffer_callback,
buffer_ptr, &cause);
if (error != 0) {
cmdq_error(cmdq, "%s: %s", path, cause);
free(cause);
return (CMD_RETURN_ERROR);
}
return (CMD_RETURN_WAIT);
}
if (c != NULL)
wd = c->cwd;
else if ((s = cmd_current_session(cmdq, 0)) != NULL) {
wd = options_get_string(&s->options, "default-path");
if (*wd == '\0')
wd = s->cwd;
} else
wd = NULL;
if (wd != NULL && *wd != '\0') {
newpath = get_full_path(wd, path);
if (newpath != NULL)
path = newpath;
}
if ((f = fopen(path, "rb")) == NULL) {
cmdq_error(cmdq, "%s: %s", path, strerror(errno));
return (CMD_RETURN_ERROR);
} }
pdata = NULL; pdata = NULL;
@@ -64,14 +105,14 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
while ((ch = getc(f)) != EOF) { while ((ch = getc(f)) != EOF) {
/* Do not let the server die due to memory exhaustion. */ /* Do not let the server die due to memory exhaustion. */
if ((new_pdata = realloc(pdata, psize + 2)) == NULL) { if ((new_pdata = realloc(pdata, psize + 2)) == NULL) {
ctx->error(ctx, "realloc error: %s", strerror(errno)); cmdq_error(cmdq, "realloc error: %s", strerror(errno));
goto error; goto error;
} }
pdata = new_pdata; pdata = new_pdata;
pdata[psize++] = ch; pdata[psize++] = ch;
} }
if (ferror(f)) { if (ferror(f)) {
ctx->error(ctx, "%s: read error", data->arg); cmdq_error(cmdq, "%s: read error", path);
goto error; goto error;
} }
if (pdata != NULL) if (pdata != NULL)
@@ -79,21 +120,62 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
fclose(f); fclose(f);
limit = options_get_number(&s->options, "buffer-limit"); limit = options_get_number(&global_options, "buffer-limit");
if (data->buffer == -1) { if (buffer == -1) {
paste_add(&s->buffers, pdata, psize, limit); paste_add(&global_buffers, pdata, psize, limit);
return (0); return (CMD_RETURN_NORMAL);
} }
if (paste_replace(&s->buffers, data->buffer, pdata, psize) != 0) { if (paste_replace(&global_buffers, buffer, pdata, psize) != 0) {
ctx->error(ctx, "no buffer %d", data->buffer); cmdq_error(cmdq, "no buffer %d", buffer);
goto error; free(pdata);
return (CMD_RETURN_ERROR);
} }
return (0); return (CMD_RETURN_NORMAL);
error: error:
if (pdata != NULL) free(pdata);
xfree(pdata); if (f != NULL)
fclose(f); fclose(f);
return (-1); return (CMD_RETURN_ERROR);
}
void
cmd_load_buffer_callback(struct client *c, int closed, void *data)
{
int *buffer = data;
char *pdata;
size_t psize;
u_int limit;
if (!closed)
return;
c->stdin_callback = NULL;
c->references--;
if (c->flags & CLIENT_DEAD)
return;
psize = EVBUFFER_LENGTH(c->stdin_data);
if (psize == 0 || (pdata = malloc(psize + 1)) == NULL) {
free(data);
goto out;
}
memcpy(pdata, EVBUFFER_DATA(c->stdin_data), psize);
pdata[psize] = '\0';
evbuffer_drain(c->stdin_data, psize);
limit = options_get_number(&global_options, "buffer-limit");
if (*buffer == -1)
paste_add(&global_buffers, pdata, psize, limit);
else if (paste_replace(&global_buffers, *buffer, pdata, psize) != 0) {
/* No context so can't use server_client_msg_error. */
evbuffer_add_printf(c->stderr_data, "no buffer %d\n", *buffer);
server_push_stderr(c);
}
free(data);
out:
cmdq_continue(c->cmdq);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-lock-server.c,v 1.9 2009-11-28 14:50:36 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -25,28 +25,62 @@
#include "tmux.h" #include "tmux.h"
/* /*
* Lock server. * Lock commands.
*/ */
int cmd_lock_server_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_lock_server_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_lock_server_entry = { const struct cmd_entry cmd_lock_server_entry = {
"lock-server", "lock", "lock-server", "lock",
"", 0, 0,
"", "",
0, "", 0,
NULL,
NULL,
cmd_lock_server_exec,
NULL, NULL,
NULL, NULL,
cmd_lock_server_exec
}; };
/* ARGSUSED */ const struct cmd_entry cmd_lock_session_entry = {
int "lock-session", "locks",
cmd_lock_server_exec(unused struct cmd *self, unused struct cmd_ctx *ctx) "t:", 0, 0,
CMD_TARGET_SESSION_USAGE,
0,
NULL,
NULL,
cmd_lock_server_exec
};
const struct cmd_entry cmd_lock_client_entry = {
"lock-client", "lockc",
"t:", 0, 0,
CMD_TARGET_CLIENT_USAGE,
0,
NULL,
NULL,
cmd_lock_server_exec
};
enum cmd_retval
cmd_lock_server_exec(struct cmd *self, unused struct cmd_q *cmdq)
{ {
server_lock(); struct args *args = self->args;
struct client *c;
struct session *s;
if (self->entry == &cmd_lock_server_entry)
server_lock();
else if (self->entry == &cmd_lock_session_entry) {
s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL)
return (CMD_RETURN_ERROR);
server_lock_session(s);
} else {
c = cmd_find_client(cmdq, args_get(args, 't'), 0);
if (c == NULL)
return (CMD_RETURN_ERROR);
server_lock_client(c);
}
recalculate_sizes(); recalculate_sizes();
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-move-window.c,v 1.13 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,42 +26,51 @@
* Move a window. * Move a window.
*/ */
int cmd_move_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_move_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_move_window_entry = { const struct cmd_entry cmd_move_window_entry = {
"move-window", "movew", "move-window", "movew",
"[-dk] " CMD_SRCDST_WINDOW_USAGE, "dkrs:t:", 0, 0,
0, "dk", "[-dkr] " CMD_SRCDST_WINDOW_USAGE,
cmd_srcdst_init, 0,
cmd_srcdst_parse, NULL,
cmd_move_window_exec, NULL,
cmd_srcdst_free, cmd_move_window_exec
cmd_srcdst_print
}; };
int enum cmd_retval
cmd_move_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_move_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_srcdst_data *data = self->data; struct args *args = self->args;
struct session *src, *dst; struct session *src, *dst, *s;
struct winlink *wl; struct winlink *wl;
char *cause; char *cause;
int idx, kflag, dflag; int idx, kflag, dflag;
if ((wl = cmd_find_window(ctx, data->src, &src)) == NULL) if (args_has(args, 'r')) {
return (-1); if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2) return (CMD_RETURN_ERROR);
return (-1);
kflag = cmd_check_flag(data->chflags, 'k'); session_renumber_windows(s);
dflag = cmd_check_flag(data->chflags, 'd'); recalculate_sizes();
return (CMD_RETURN_NORMAL);
}
if ((wl = cmd_find_window(cmdq, args_get(args, 's'), &src)) == NULL)
return (CMD_RETURN_ERROR);
if ((idx = cmd_find_index(cmdq, args_get(args, 't'), &dst)) == -2)
return (CMD_RETURN_ERROR);
kflag = args_has(self->args, 'k');
dflag = args_has(self->args, 'd');
if (server_link_window(src, wl, dst, idx, kflag, !dflag, &cause) != 0) { if (server_link_window(src, wl, dst, idx, kflag, !dflag, &cause) != 0) {
ctx->error(ctx, "can't move window: %s", cause); cmdq_error(cmdq, "can't move window: %s", cause);
xfree(cause); free(cause);
return (-1); return (CMD_RETURN_ERROR);
} }
server_unlink_window(src, wl); server_unlink_window(src, wl);
recalculate_sizes(); recalculate_sizes();
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-new-session.c,v 1.76 2010-02-26 13:28:15 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,8 +18,11 @@
#include <sys/types.h> #include <sys/types.h>
#include <pwd.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <termios.h> #include <termios.h>
#include <unistd.h>
#include "tmux.h" #include "tmux.h"
@@ -27,142 +30,80 @@
* Create a new session and attach to the current terminal unless -d is given. * Create a new session and attach to the current terminal unless -d is given.
*/ */
int cmd_new_session_parse(struct cmd *, int, char **, char **); enum cmd_retval cmd_new_session_check(struct args *);
int cmd_new_session_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_new_session_exec(struct cmd *, struct cmd_q *);
void cmd_new_session_free(struct cmd *);
void cmd_new_session_init(struct cmd *, int);
size_t cmd_new_session_print(struct cmd *, char *, size_t);
struct cmd_new_session_data {
char *target;
char *newname;
char *winname;
char *cmd;
int flag_detached;
};
const struct cmd_entry cmd_new_session_entry = { const struct cmd_entry cmd_new_session_entry = {
"new-session", "new", "new-session", "new",
"[-d] [-n window-name] [-s session-name] [-t target-session] [command]", "AdDF:n:Ps:t:x:y:", 0, 1,
CMD_STARTSERVER|CMD_CANTNEST|CMD_SENDENVIRON, "", "[-AdDP] [-F format] [-n window-name] [-s session-name] "
cmd_new_session_init, CMD_TARGET_SESSION_USAGE " [-x width] [-y height] [command]",
cmd_new_session_parse, CMD_STARTSERVER|CMD_CANTNEST|CMD_SENDENVIRON,
cmd_new_session_exec, NULL,
cmd_new_session_free, cmd_new_session_check,
cmd_new_session_print cmd_new_session_exec
}; };
/* ARGSUSED */ enum cmd_retval
void cmd_new_session_check(struct args *args)
cmd_new_session_init(struct cmd *self, unused int arg)
{ {
struct cmd_new_session_data *data; if (args_has(args, 't') && (args->argc != 0 || args_has(args, 'n')))
return (CMD_RETURN_ERROR);
self->data = data = xmalloc(sizeof *data); return (CMD_RETURN_NORMAL);
data->flag_detached = 0;
data->target = NULL;
data->newname = NULL;
data->winname = NULL;
data->cmd = NULL;
} }
int enum cmd_retval
cmd_new_session_parse(struct cmd *self, int argc, char **argv, char **cause) cmd_new_session_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_new_session_data *data; struct args *args = self->args;
int opt; struct client *c = cmdq->client;
struct session *s, *groupwith;
struct window *w;
struct environ env;
struct termios tio, *tiop;
struct passwd *pw;
const char *newname, *target, *update, *cwd, *errstr;
const char *template;
char *cmd, *cause, *cp;
int detached, idx;
u_int sx, sy;
int already_attached;
struct format_tree *ft;
self->entry->init(self, KEYC_NONE); newname = args_get(args, 's');
data = self->data; if (newname != NULL) {
if (!session_check_name(newname)) {
while ((opt = getopt(argc, argv, "ds:t:n:")) != -1) { cmdq_error(cmdq, "bad session name: %s", newname);
switch (opt) { return (CMD_RETURN_ERROR);
case 'd': }
data->flag_detached = 1; if (session_find(newname) != NULL) {
break; if (args_has(args, 'A')) {
case 's': return (cmd_attach_session(cmdq, newname,
if (data->newname == NULL) args_has(args, 'D'), 0));
data->newname = xstrdup(optarg); }
break; cmdq_error(cmdq, "duplicate session: %s", newname);
case 't': return (CMD_RETURN_ERROR);
if (data->target == NULL)
data->target = xstrdup(optarg);
break;
case 'n':
if (data->winname == NULL)
data->winname = xstrdup(optarg);
break;
default:
goto usage;
} }
} }
argc -= optind;
argv += optind;
if (argc != 0 && argc != 1)
goto usage;
if (data->target != NULL && (argc == 1 || data->winname != NULL)) target = args_get(args, 't');
goto usage; if (target != NULL) {
groupwith = cmd_find_session(cmdq, target, 0);
if (argc == 1) if (groupwith == NULL)
data->cmd = xstrdup(argv[0]); return (CMD_RETURN_ERROR);
} else
return (0); groupwith = NULL;
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
int
cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_new_session_data *data = self->data;
struct session *s, *groupwith;
struct window *w;
struct window_pane *wp;
struct environ env;
struct termios tio, *tiop;
const char *update;
char *overrides, *cmd, *cwd, *cause;
int detached, idx;
u_int sx, sy, i;
if (data->newname != NULL && session_find(data->newname) != NULL) {
ctx->error(ctx, "duplicate session: %s", data->newname);
return (-1);
}
groupwith = NULL;
if (data->target != NULL &&
(groupwith = cmd_find_session(ctx, data->target)) == NULL)
return (-1);
/*
* There are three cases:
*
* 1. If cmdclient is non-NULL, new-session has been called from the
* command-line - cmdclient is to become a new attached, interactive
* client. Unless -d is given, the terminal must be opened and then
* the client sent MSG_READY.
*
* 2. If cmdclient is NULL, new-session has been called from an
* existing client (such as a key binding).
*
* 3. Both are NULL, the command was in the configuration file. Treat
* this as if -d was given even if it was not.
*
* In all cases, a new additional session needs to be created and
* (unless -d) set as the current session for the client.
*/
/* Set -d if no client. */ /* Set -d if no client. */
detached = data->flag_detached; detached = args_has(args, 'd');
if (ctx->cmdclient == NULL && ctx->curclient == NULL) if (c == NULL)
detached = 1; detached = 1;
/* Is this client already attached? */
already_attached = 0;
if (c != NULL && c->session != NULL)
already_attached = 1;
/* /*
* Save the termios settings, part of which is used for new windows in * Save the termios settings, part of which is used for new windows in
* this session. * this session.
@@ -172,45 +113,54 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
* before opening the terminal as that calls tcsetattr() to prepare for * before opening the terminal as that calls tcsetattr() to prepare for
* tmux taking over. * tmux taking over.
*/ */
if (ctx->cmdclient != NULL && ctx->cmdclient->tty.fd != -1) { if (!detached && !already_attached && c->tty.fd != -1) {
if (tcgetattr(ctx->cmdclient->tty.fd, &tio) != 0) if (tcgetattr(c->tty.fd, &tio) != 0)
fatal("tcgetattr failed"); fatal("tcgetattr failed");
tiop = &tio; tiop = &tio;
} else } else
tiop = NULL; tiop = NULL;
/* Open the terminal if necessary. */ /* Open the terminal if necessary. */
if (!detached && ctx->cmdclient != NULL) { if (!detached && !already_attached) {
if (!(ctx->cmdclient->flags & CLIENT_TERMINAL)) { if (server_client_open(c, NULL, &cause) != 0) {
ctx->error(ctx, "not a terminal"); cmdq_error(cmdq, "open terminal failed: %s", cause);
return (-1); free(cause);
} return (CMD_RETURN_ERROR);
overrides =
options_get_string(&global_s_options, "terminal-overrides");
if (tty_open(&ctx->cmdclient->tty, overrides, &cause) != 0) {
ctx->error(ctx, "open terminal failed: %s", cause);
xfree(cause);
return (-1);
} }
} }
/* Get the new session working directory. */ /* Get the new session working directory. */
if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL) if (c != NULL && c->cwd != NULL)
cwd = ctx->cmdclient->cwd; cwd = c->cwd;
else else {
cwd = options_get_string(&global_s_options, "default-path"); pw = getpwuid(getuid());
if (pw->pw_dir != NULL && *pw->pw_dir != '\0')
cwd = pw->pw_dir;
else
cwd = "/";
}
/* Find new session size. */ /* Find new session size. */
if (detached) { if (c != NULL) {
sx = c->tty.sx;
sy = c->tty.sy;
} else {
sx = 80; sx = 80;
sy = 24; sy = 24;
} else if (ctx->cmdclient != NULL) { }
sx = ctx->cmdclient->tty.sx; if (detached && args_has(args, 'x')) {
sy = ctx->cmdclient->tty.sy; sx = strtonum(args_get(args, 'x'), 1, USHRT_MAX, &errstr);
} else { if (errstr != NULL) {
sx = ctx->curclient->tty.sx; cmdq_error(cmdq, "width %s", errstr);
sy = ctx->curclient->tty.sy; return (CMD_RETURN_ERROR);
}
}
if (detached && args_has(args, 'y')) {
sy = strtonum(args_get(args, 'y'), 1, USHRT_MAX, &errstr);
if (errstr != NULL) {
cmdq_error(cmdq, "height %s", errstr);
return (CMD_RETURN_ERROR);
}
} }
if (sy > 0 && options_get_number(&global_s_options, "status")) if (sy > 0 && options_get_number(&global_s_options, "status"))
sy--; sy--;
@@ -220,37 +170,33 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
sy = 1; sy = 1;
/* Figure out the command for the new window. */ /* Figure out the command for the new window. */
if (data->target != NULL) if (target != NULL)
cmd = NULL; cmd = NULL;
else if (data->cmd != NULL) else if (args->argc != 0)
cmd = data->cmd; cmd = args->argv[0];
else else
cmd = options_get_string(&global_s_options, "default-command"); cmd = options_get_string(&global_s_options, "default-command");
/* Construct the environment. */ /* Construct the environment. */
environ_init(&env); environ_init(&env);
update = options_get_string(&global_s_options, "update-environment"); update = options_get_string(&global_s_options, "update-environment");
if (ctx->cmdclient != NULL) if (c != NULL)
environ_update(update, &ctx->cmdclient->environ, &env); environ_update(update, &c->environ, &env);
/* Create the new session. */ /* Create the new session. */
idx = -1 - options_get_number(&global_s_options, "base-index"); idx = -1 - options_get_number(&global_s_options, "base-index");
s = session_create( s = session_create(newname, cmd, cwd, &env, tiop, idx, sx, sy, &cause);
data->newname, cmd, cwd, &env, tiop, idx, sx, sy, &cause);
if (s == NULL) { if (s == NULL) {
ctx->error(ctx, "create session failed: %s", cause); cmdq_error(cmdq, "create session failed: %s", cause);
xfree(cause); free(cause);
return (-1); return (CMD_RETURN_ERROR);
} }
environ_free(&env); environ_free(&env);
/* Set the initial window name if one given. */ /* Set the initial window name if one given. */
if (cmd != NULL && data->winname != NULL) { if (cmd != NULL && args_has(args, 'n')) {
w = s->curw->window; w = s->curw->window;
window_set_name(w, args_get(args, 'n'));
xfree(w->name);
w->name = xstrdup(data->winname);
options_set_number(&w->options, "automatic-rename", 0); options_set_number(&w->options, "automatic-rename", 0);
} }
@@ -269,14 +215,14 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
* taking this session and needs to get MSG_READY and stay around. * taking this session and needs to get MSG_READY and stay around.
*/ */
if (!detached) { if (!detached) {
if (ctx->cmdclient != NULL) { if (!already_attached)
server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); server_write_ready(c);
ctx->cmdclient->session = s; else if (c->session != NULL)
server_redraw_client(ctx->cmdclient); c->last_session = c->session;
} else { c->session = s;
ctx->curclient->session = s; notify_attached_session_changed(c);
server_redraw_client(ctx->curclient); session_update_activity(s);
} server_redraw_client(c);
} }
recalculate_sizes(); recalculate_sizes();
server_update_socket(); server_update_socket();
@@ -285,52 +231,27 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx)
* If there are still configuration file errors to display, put the new * If there are still configuration file errors to display, put the new
* session's current window into more mode and display them now. * session's current window into more mode and display them now.
*/ */
if (cfg_finished && !ARRAY_EMPTY(&cfg_causes)) { if (cfg_finished)
wp = s->curw->window->active; cfg_show_causes(s);
window_pane_set_mode(wp, &window_more_mode);
for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) { /* Print if requested. */
cause = ARRAY_ITEM(&cfg_causes, i); if (args_has(args, 'P')) {
window_more_add(wp, "%s", cause); if ((template = args_get(args, 'F')) == NULL)
xfree(cause); template = NEW_SESSION_TEMPLATE;
}
ARRAY_FREE(&cfg_causes); ft = format_create();
if ((c = cmd_find_client(cmdq, NULL, 1)) != NULL)
format_client(ft, c);
format_session(ft, s);
cp = format_expand(ft, template);
cmdq_print(cmdq, "%s", cp);
free(cp);
format_free(ft);
} }
return (!detached); /* 1 means don't tell command client to exit */ if (!detached)
} cmdq->client_exit = 0;
return (CMD_RETURN_NORMAL);
void
cmd_new_session_free(struct cmd *self)
{
struct cmd_new_session_data *data = self->data;
if (data->newname != NULL)
xfree(data->newname);
if (data->winname != NULL)
xfree(data->winname);
if (data->cmd != NULL)
xfree(data->cmd);
xfree(data);
}
size_t
cmd_new_session_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_new_session_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
if (off < len && data->flag_detached)
off += xsnprintf(buf + off, len - off, " -d");
if (off < len && data->winname != NULL)
off += cmd_prarg(buf + off, len - off, " -n ", data->winname);
if (off < len && data->newname != NULL)
off += cmd_prarg(buf + off, len - off, " -s ", data->newname);
if (off < len && data->target != NULL)
off += cmd_prarg(buf + off, len - off, " -t ", data->target);
if (off < len && data->cmd != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->cmd);
return (off);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-new-window.c,v 1.43 2010-01-22 17:28:34 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,180 +26,116 @@
* Create a new window. * Create a new window.
*/ */
int cmd_new_window_parse(struct cmd *, int, char **, char **); enum cmd_retval cmd_new_window_exec(struct cmd *, struct cmd_q *);
int cmd_new_window_exec(struct cmd *, struct cmd_ctx *);
void cmd_new_window_free(struct cmd *);
void cmd_new_window_init(struct cmd *, int);
size_t cmd_new_window_print(struct cmd *, char *, size_t);
struct cmd_new_window_data {
char *target;
char *name;
char *cmd;
int flag_detached;
int flag_kill;
};
const struct cmd_entry cmd_new_window_entry = { const struct cmd_entry cmd_new_window_entry = {
"new-window", "neww", "new-window", "neww",
"[-dk] [-n window-name] [-t target-window] [command]", "ac:dF:kn:Pt:", 0, 1,
0, "", "[-adkP] [-c start-directory] [-F format] [-n window-name] "
cmd_new_window_init, CMD_TARGET_WINDOW_USAGE " [command]",
cmd_new_window_parse, 0,
cmd_new_window_exec, NULL,
cmd_new_window_free, NULL,
cmd_new_window_print cmd_new_window_exec
}; };
/* ARGSUSED */ enum cmd_retval
void cmd_new_window_exec(struct cmd *self, struct cmd_q *cmdq)
cmd_new_window_init(struct cmd *self, unused int arg)
{ {
struct cmd_new_window_data *data; struct args *args = self->args;
struct session *s;
struct winlink *wl;
struct client *c;
const char *cmd, *cwd, *template;
char *cause, *cp;
int idx, last, detached;
struct format_tree *ft;
self->data = data = xmalloc(sizeof *data); if (args_has(args, 'a')) {
data->target = NULL; wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
data->name = NULL; if (wl == NULL)
data->cmd = NULL; return (CMD_RETURN_ERROR);
data->flag_detached = 0; idx = wl->idx + 1;
data->flag_kill = 0;
}
int /* Find the next free index. */
cmd_new_window_parse(struct cmd *self, int argc, char **argv, char **cause) for (last = idx; last < INT_MAX; last++) {
{ if (winlink_find_by_index(&s->windows, last) == NULL)
struct cmd_new_window_data *data; break;
int opt;
self->entry->init(self, KEYC_NONE);
data = self->data;
while ((opt = getopt(argc, argv, "dkt:n:")) != -1) {
switch (opt) {
case 'd':
data->flag_detached = 1;
break;
case 'k':
data->flag_kill = 1;
break;
case 't':
if (data->target == NULL)
data->target = xstrdup(optarg);
break;
case 'n':
if (data->name == NULL)
data->name = xstrdup(optarg);
break;
default:
goto usage;
} }
if (last == INT_MAX) {
cmdq_error(cmdq, "no free window indexes");
return (CMD_RETURN_ERROR);
}
/* Move everything from last - 1 to idx up a bit. */
for (; last > idx; last--) {
wl = winlink_find_by_index(&s->windows, last - 1);
server_link_window(s, wl, s, last, 0, 0, NULL);
server_unlink_window(s, wl);
}
} else {
if ((idx = cmd_find_index(cmdq, args_get(args, 't'), &s)) == -2)
return (CMD_RETURN_ERROR);
} }
argc -= optind; detached = args_has(args, 'd');
argv += optind;
if (argc != 0 && argc != 1)
goto usage;
if (argc == 1)
data->cmd = xstrdup(argv[0]);
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
int
cmd_new_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_new_window_data *data = self->data;
struct session *s;
struct winlink *wl;
char *cmd, *cwd, *cause;
int idx;
if (data == NULL)
return (0);
if ((idx = cmd_find_index(ctx, data->target, &s)) == -2)
return (-1);
wl = NULL; wl = NULL;
if (idx != -1) if (idx != -1)
wl = winlink_find_by_index(&s->windows, idx); wl = winlink_find_by_index(&s->windows, idx);
if (wl != NULL && data->flag_kill) { if (wl != NULL && args_has(args, 'k')) {
/* /*
* Can't use session_detach as it will destroy session if this * Can't use session_detach as it will destroy session if this
* makes it empty. * makes it empty.
*/ */
session_alert_cancel(s, wl); notify_window_unlinked(s, wl->window);
wl->flags &= ~WINLINK_ALERTFLAGS;
winlink_stack_remove(&s->lastw, wl); winlink_stack_remove(&s->lastw, wl);
winlink_remove(&s->windows, wl); winlink_remove(&s->windows, wl);
/* Force select/redraw if current. */ /* Force select/redraw if current. */
if (wl == s->curw) { if (wl == s->curw) {
data->flag_detached = 0; detached = 0;
s->curw = NULL; s->curw = NULL;
} }
} }
cmd = data->cmd; if (args->argc == 0)
if (cmd == NULL)
cmd = options_get_string(&s->options, "default-command"); cmd = options_get_string(&s->options, "default-command");
if (ctx->cmdclient == NULL || ctx->cmdclient->cwd == NULL)
cwd = options_get_string(&s->options, "default-path");
else else
cwd = ctx->cmdclient->cwd; cmd = args->argv[0];
cwd = cmd_get_default_path(cmdq, args_get(args, 'c'));
if (idx == -1) if (idx == -1)
idx = -1 - options_get_number(&s->options, "base-index"); idx = -1 - options_get_number(&s->options, "base-index");
wl = session_new(s, data->name, cmd, cwd, idx, &cause); wl = session_new(s, args_get(args, 'n'), cmd, cwd, idx, &cause);
if (wl == NULL) { if (wl == NULL) {
ctx->error(ctx, "create window failed: %s", cause); cmdq_error(cmdq, "create window failed: %s", cause);
xfree(cause); free(cause);
return (-1); return (CMD_RETURN_ERROR);
} }
if (!data->flag_detached) { if (!detached) {
session_select(s, wl->idx); session_select(s, wl->idx);
server_redraw_session_group(s); server_redraw_session_group(s);
} else } else
server_status_session_group(s); server_status_session_group(s);
return (0); if (args_has(args, 'P')) {
} if ((template = args_get(args, 'F')) == NULL)
template = NEW_WINDOW_TEMPLATE;
void
cmd_new_window_free(struct cmd *self) ft = format_create();
{ if ((c = cmd_find_client(cmdq, NULL, 1)) != NULL)
struct cmd_new_window_data *data = self->data; format_client(ft, c);
format_session(ft, s);
if (data->target != NULL) format_winlink(ft, s, wl);
xfree(data->target); format_window_pane(ft, wl->window->active);
if (data->name != NULL)
xfree(data->name); cp = format_expand(ft, template);
if (data->cmd != NULL) cmdq_print(cmdq, "%s", cp);
xfree(data->cmd); free(cp);
xfree(data);
} format_free(ft);
}
size_t
cmd_new_window_print(struct cmd *self, char *buf, size_t len) return (CMD_RETURN_NORMAL);
{
struct cmd_new_window_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
if (off < len && data->flag_detached)
off += xsnprintf(buf + off, len - off, " -d");
if (off < len && data->target != NULL)
off += cmd_prarg(buf + off, len - off, " -t ", data->target);
if (off < len && data->name != NULL)
off += cmd_prarg(buf + off, len - off, " -n ", data->name);
if (off < len && data->cmd != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->cmd);
return (off);
} }

View File

@@ -1,54 +0,0 @@
/* $Id: cmd-next-layout.c,v 1.6 2009-11-14 17:56:39 tcunha Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Switch window to next layout.
*/
int cmd_next_layout_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_next_layout_entry = {
"next-layout", "nextl",
CMD_TARGET_WINDOW_USAGE,
0, "",
cmd_target_init,
cmd_target_parse,
cmd_next_layout_exec,
cmd_target_free,
cmd_target_print
};
int
cmd_next_layout_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct winlink *wl;
u_int layout;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return (-1);
layout = layout_set_next(wl->window);
ctx->info(ctx, "arranging in: %s", layout_set_name(layout));
return (0);
}

View File

@@ -1,76 +0,0 @@
/* $Id: cmd-next-window.c,v 1.21 2009-11-14 17:56:39 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Move to next window.
*/
void cmd_next_window_init(struct cmd *, int);
int cmd_next_window_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_next_window_entry = {
"next-window", "next",
"[-a] " CMD_TARGET_SESSION_USAGE,
0, "a",
cmd_next_window_init,
cmd_target_parse,
cmd_next_window_exec,
cmd_target_free,
cmd_target_print
};
void
cmd_next_window_init(struct cmd *self, int key)
{
struct cmd_target_data *data;
cmd_target_init(self, key);
data = self->data;
if (key == ('n' | KEYC_ESCAPE))
cmd_set_flag(&data->chflags, 'a');
}
int
cmd_next_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct session *s;
int activity;
if ((s = cmd_find_session(ctx, data->target)) == NULL)
return (-1);
activity = 0;
if (cmd_check_flag(data->chflags, 'a'))
activity = 1;
if (session_next(s, activity) == 0)
server_redraw_session(s);
else {
ctx->error(ctx, "no next window");
return (-1);
}
recalculate_sizes();
return (0);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-paste-buffer.c,v 1.24 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
@@ -26,75 +27,76 @@
* Paste paste buffer if present. * Paste paste buffer if present.
*/ */
int cmd_paste_buffer_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_paste_buffer_exec(struct cmd *, struct cmd_q *);
void cmd_paste_buffer_lf2cr(struct window_pane *, const char *, size_t);
void cmd_paste_buffer_filter(struct window_pane *,
const char *, size_t, const char *, int);
const struct cmd_entry cmd_paste_buffer_entry = { const struct cmd_entry cmd_paste_buffer_entry = {
"paste-buffer", "pasteb", "paste-buffer", "pasteb",
"[-dr] " CMD_BUFFER_WINDOW_USAGE, "db:prs:t:", 0, 0,
0, "dr", "[-dpr] [-s separator] [-b buffer-index] " CMD_TARGET_PANE_USAGE,
cmd_buffer_init, 0,
cmd_buffer_parse, NULL,
cmd_paste_buffer_exec, NULL,
cmd_buffer_free, cmd_paste_buffer_exec
cmd_buffer_print
}; };
int enum cmd_retval
cmd_paste_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_paste_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_buffer_data *data = self->data; struct args *args = self->args;
struct winlink *wl;
struct window_pane *wp; struct window_pane *wp;
struct session *s; struct session *s;
struct paste_buffer *pb; struct paste_buffer *pb;
const char *sepstr;
char *cause;
int buffer;
int pflag;
if ((wl = cmd_find_window(ctx, data->target, &s)) == NULL) if (cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp) == NULL)
return (-1); return (CMD_RETURN_ERROR);
wp = wl->window->active;
if (data->buffer == -1) if (!args_has(args, 'b'))
pb = paste_get_top(&s->buffers); buffer = -1;
else { else {
if ((pb = paste_get_index(&s->buffers, data->buffer)) == NULL) { buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
ctx->error(ctx, "no buffer %d", data->buffer); if (cause != NULL) {
return (-1); cmdq_error(cmdq, "buffer %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
}
if (buffer == -1)
pb = paste_get_top(&global_buffers);
else {
pb = paste_get_index(&global_buffers, buffer);
if (pb == NULL) {
cmdq_error(cmdq, "no buffer %d", buffer);
return (CMD_RETURN_ERROR);
} }
} }
if (pb != NULL) { if (pb != NULL) {
/* -r means raw data without LF->CR conversion. */ sepstr = args_get(args, 's');
if (cmd_check_flag(data->chflags, 'r')) if (sepstr == NULL) {
bufferevent_write(wp->event, pb->data, pb->size); if (args_has(args, 'r'))
else sepstr = "\n";
cmd_paste_buffer_lf2cr(wp, pb->data, pb->size); else
sepstr = "\r";
}
pflag = (wp->screen->mode & MODE_BRACKETPASTE);
paste_send_pane(pb, wp, sepstr, args_has(args, 'p') && pflag);
} }
/* Delete the buffer if -d. */ /* Delete the buffer if -d. */
if (cmd_check_flag(data->chflags, 'd')) { if (args_has(args, 'd')) {
if (data->buffer == -1) if (buffer == -1)
paste_free_top(&s->buffers); paste_free_top(&global_buffers);
else else
paste_free_index(&s->buffers, data->buffer); paste_free_index(&global_buffers, buffer);
} }
return (0); return (CMD_RETURN_NORMAL);
}
/* Add bytes to a buffer but change every '\n' to '\r'. */
void
cmd_paste_buffer_lf2cr(struct window_pane *wp, const char *data, size_t size)
{
const char *end = data + size;
const char *lf;
while ((lf = memchr(data, '\n', end - data)) != NULL) {
if (lf != data)
bufferevent_write(wp->event, data, lf - data);
bufferevent_write(wp->event, "\r", 1);
data = lf + 1;
}
if (end != data)
bufferevent_write(wp->event, data, end - data);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-pipe-pane.c,v 1.10 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -22,6 +22,7 @@
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include "tmux.h" #include "tmux.h"
@@ -30,30 +31,32 @@
* Open pipe to redirect pane output. If already open, close first. * Open pipe to redirect pane output. If already open, close first.
*/ */
int cmd_pipe_pane_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_pipe_pane_exec(struct cmd *, struct cmd_q *);
void cmd_pipe_pane_error_callback(struct bufferevent *, short, void *); void cmd_pipe_pane_error_callback(struct bufferevent *, short, void *);
const struct cmd_entry cmd_pipe_pane_entry = { const struct cmd_entry cmd_pipe_pane_entry = {
"pipe-pane", "pipep", "pipe-pane", "pipep",
CMD_TARGET_PANE_USAGE "[-o] [command]", "ot:", 0, 1,
CMD_ARG01, "o", "[-o] " CMD_TARGET_PANE_USAGE " [command]",
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_pipe_pane_exec, NULL,
cmd_target_free, cmd_pipe_pane_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_pipe_pane_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_pipe_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct client *c;
struct window_pane *wp; struct window_pane *wp;
int old_fd, pipe_fd[2], null_fd, mode; char *command;
int old_fd, pipe_fd[2], null_fd;
if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL) if (cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp) == NULL)
return (-1); return (CMD_RETURN_ERROR);
c = cmd_find_client(cmdq, NULL, 1);
/* Destroy the old pipe. */ /* Destroy the old pipe. */
old_fd = wp->pipe_fd; old_fd = wp->pipe_fd;
@@ -64,8 +67,8 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
} }
/* If no pipe command, that is enough. */ /* If no pipe command, that is enough. */
if (data->arg == NULL || *data->arg == '\0') if (args->argc == 0 || *args->argv[0] == '\0')
return (0); return (CMD_RETURN_NORMAL);
/* /*
* With -o, only open the new pipe if there was no previous one. This * With -o, only open the new pipe if there was no previous one. This
@@ -73,24 +76,24 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
* *
* bind ^p pipep -o 'cat >>~/output' * bind ^p pipep -o 'cat >>~/output'
*/ */
if (cmd_check_flag(data->chflags, 'o') && old_fd != -1) if (args_has(self->args, 'o') && old_fd != -1)
return (0); return (CMD_RETURN_NORMAL);
/* Open the new pipe. */ /* Open the new pipe. */
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe_fd) != 0) { if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe_fd) != 0) {
ctx->error(ctx, "socketpair error: %s", strerror(errno)); cmdq_error(cmdq, "socketpair error: %s", strerror(errno));
return (-1); return (CMD_RETURN_ERROR);
} }
/* Fork the child. */ /* Fork the child. */
switch (fork()) { switch (fork()) {
case -1: case -1:
ctx->error(ctx, "fork error: %s", strerror(errno)); cmdq_error(cmdq, "fork error: %s", strerror(errno));
return (-1); return (CMD_RETURN_ERROR);
case 0: case 0:
/* Child process. */ /* Child process. */
close(pipe_fd[0]); close(pipe_fd[0]);
server_signal_clear(); clear_signals(1);
if (dup2(pipe_fd[1], STDIN_FILENO) == -1) if (dup2(pipe_fd[1], STDIN_FILENO) == -1)
_exit(1); _exit(1);
@@ -105,7 +108,11 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
if (null_fd != STDOUT_FILENO && null_fd != STDERR_FILENO) if (null_fd != STDOUT_FILENO && null_fd != STDERR_FILENO)
close(null_fd); close(null_fd);
execl(_PATH_BSHELL, "sh", "-c", data->arg, (char *) NULL); closefrom(STDERR_FILENO + 1);
command = status_replace(
c, NULL, NULL, NULL, args->argv[0], time(NULL), 0);
execl(_PATH_BSHELL, "sh", "-c", command, (char *) NULL);
_exit(1); _exit(1);
default: default:
/* Parent process. */ /* Parent process. */
@@ -118,17 +125,11 @@ cmd_pipe_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
NULL, NULL, cmd_pipe_pane_error_callback, wp); NULL, NULL, cmd_pipe_pane_error_callback, wp);
bufferevent_enable(wp->pipe_event, EV_WRITE); bufferevent_enable(wp->pipe_event, EV_WRITE);
if ((mode = fcntl(wp->pipe_fd, F_GETFL)) == -1) setblocking(wp->pipe_fd, 0);
fatal("fcntl failed"); return (CMD_RETURN_NORMAL);
if (fcntl(wp->pipe_fd, F_SETFL, mode|O_NONBLOCK) == -1)
fatal("fcntl failed");
if (fcntl(wp->pipe_fd, F_SETFD, FD_CLOEXEC) == -1)
fatal("fcntl failed");
return (0);
} }
} }
/* ARGSUSED */
void void
cmd_pipe_pane_error_callback( cmd_pipe_pane_error_callback(
unused struct bufferevent *bufev, unused short what, void *data) unused struct bufferevent *bufev, unused short what, void *data)

View File

@@ -1,54 +0,0 @@
/* $Id: cmd-previous-layout.c,v 1.6 2009-12-04 22:14:47 tcunha Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Switch window to previous layout.
*/
int cmd_previous_layout_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_previous_layout_entry = {
"previous-layout", "prevl",
CMD_TARGET_WINDOW_USAGE,
0, "",
cmd_target_init,
cmd_target_parse,
cmd_previous_layout_exec,
cmd_target_free,
cmd_target_print
};
int
cmd_previous_layout_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct winlink *wl;
u_int layout;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL)
return (-1);
layout = layout_set_previous(wl->window);
ctx->info(ctx, "arranging in: %s", layout_set_name(layout));
return (0);
}

View File

@@ -1,76 +0,0 @@
/* $Id: cmd-previous-window.c,v 1.21 2009-11-14 17:56:39 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Move to previous window.
*/
void cmd_previous_window_init(struct cmd *, int);
int cmd_previous_window_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_previous_window_entry = {
"previous-window", "prev",
"[-a] " CMD_TARGET_SESSION_USAGE,
0, "a",
cmd_previous_window_init,
cmd_target_parse,
cmd_previous_window_exec,
cmd_target_free,
cmd_target_print
};
void
cmd_previous_window_init(struct cmd *self, int key)
{
struct cmd_target_data *data;
cmd_target_init(self, key);
data = self->data;
if (key == ('p' | KEYC_ESCAPE))
cmd_set_flag(&data->chflags, 'a');
}
int
cmd_previous_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct session *s;
int activity;
if ((s = cmd_find_session(ctx, data->target)) == NULL)
return (-1);
activity = 0;
if (cmd_check_flag(data->chflags, 'a'))
activity = 1;
if (session_previous(s, activity) == 0)
server_redraw_session(s);
else {
ctx->error(ctx, "no previous window");
return (-1);
}
recalculate_sizes();
return (0);
}

282
cmd-queue.c Normal file
View File

@@ -0,0 +1,282 @@
/* $Id$ */
/*
* Copyright (c) 2013 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>
#include "tmux.h"
/* Create new command queue. */
struct cmd_q *
cmdq_new(struct client *c)
{
struct cmd_q *cmdq;
cmdq = xcalloc(1, sizeof *cmdq);
cmdq->references = 1;
cmdq->dead = 0;
cmdq->client = c;
cmdq->client_exit = 0;
TAILQ_INIT(&cmdq->queue);
cmdq->item = NULL;
cmdq->cmd = NULL;
return (cmdq);
}
/* Free command queue */
int
cmdq_free(struct cmd_q *cmdq)
{
if (--cmdq->references != 0)
return (cmdq->dead);
cmdq_flush(cmdq);
free(cmdq);
return (1);
}
/* Show message from command. */
void printflike2
cmdq_print(struct cmd_q *cmdq, const char *fmt, ...)
{
struct client *c = cmdq->client;
struct window *w;
va_list ap;
va_start(ap, fmt);
if (c == NULL)
/* nothing */;
else if (c->session == NULL || (c->flags & CLIENT_CONTROL)) {
va_start(ap, fmt);
evbuffer_add_vprintf(c->stdout_data, fmt, ap);
va_end(ap);
evbuffer_add(c->stdout_data, "\n", 1);
server_push_stdout(c);
} else {
w = c->session->curw->window;
if (w->active->mode != &window_copy_mode) {
window_pane_reset_mode(w->active);
window_pane_set_mode(w->active, &window_copy_mode);
window_copy_init_for_output(w->active);
}
window_copy_vadd(w->active, fmt, ap);
}
va_end(ap);
}
/* Show info from command. */
void printflike2
cmdq_info(struct cmd_q *cmdq, const char *fmt, ...)
{
struct client *c = cmdq->client;
va_list ap;
char *msg;
if (options_get_number(&global_options, "quiet"))
return;
va_start(ap, fmt);
if (c == NULL)
/* nothing */;
else if (c->session == NULL || (c->flags & CLIENT_CONTROL)) {
va_start(ap, fmt);
evbuffer_add_vprintf(c->stdout_data, fmt, ap);
va_end(ap);
evbuffer_add(c->stdout_data, "\n", 1);
server_push_stdout(c);
} else {
xvasprintf(&msg, fmt, ap);
*msg = toupper((u_char) *msg);
status_message_set(c, "%s", msg);
free(msg);
}
va_end(ap);
}
/* Show error from command. */
void printflike2
cmdq_error(struct cmd_q *cmdq, const char *fmt, ...)
{
struct client *c = cmdq->client;
struct cmd *cmd = cmdq->cmd;
va_list ap;
char *msg, *cause;
size_t msglen;
va_start(ap, fmt);
msglen = xvasprintf(&msg, fmt, ap);
va_end(ap);
if (c == NULL) {
xasprintf(&cause, "%s:%u: %s", cmd->file, cmd->line, msg);
ARRAY_ADD(&cfg_causes, cause);
} else if (c->session == NULL || (c->flags & CLIENT_CONTROL)) {
evbuffer_add(c->stderr_data, msg, msglen);
evbuffer_add(c->stderr_data, "\n", 1);
server_push_stderr(c);
c->retcode = 1;
} else {
*msg = toupper((u_char) *msg);
status_message_set(c, "%s", msg);
}
free(msg);
}
/* Print a guard line. */
int
cmdq_guard(struct cmd_q *cmdq, const char *guard)
{
struct client *c = cmdq->client;
if (c == NULL || c->session == NULL)
return 0;
if (!(c->flags & CLIENT_CONTROL))
return 0;
evbuffer_add_printf(c->stdout_data, "%%%s %ld %u\n", guard,
(long) cmdq->time, cmdq->number);
server_push_stdout(c);
return 1;
}
/* Add command list to queue and begin processing if needed. */
void
cmdq_run(struct cmd_q *cmdq, struct cmd_list *cmdlist)
{
cmdq_append(cmdq, cmdlist);
if (cmdq->item == NULL) {
cmdq->cmd = NULL;
cmdq_continue(cmdq);
}
}
/* Add command list to queue. */
void
cmdq_append(struct cmd_q *cmdq, struct cmd_list *cmdlist)
{
struct cmd_q_item *item;
item = xcalloc(1, sizeof *item);
item->cmdlist = cmdlist;
TAILQ_INSERT_TAIL(&cmdq->queue, item, qentry);
cmdlist->references++;
}
/* Continue processing command queue. Returns 1 if finishes empty. */
int
cmdq_continue(struct cmd_q *cmdq)
{
struct cmd_q_item *next;
enum cmd_retval retval;
int empty, guard;
char s[1024];
notify_disable();
empty = TAILQ_EMPTY(&cmdq->queue);
if (empty)
goto empty;
if (cmdq->item == NULL) {
cmdq->item = TAILQ_FIRST(&cmdq->queue);
cmdq->cmd = TAILQ_FIRST(&cmdq->item->cmdlist->list);
} else
cmdq->cmd = TAILQ_NEXT(cmdq->cmd, qentry);
do {
next = TAILQ_NEXT(cmdq->item, qentry);
while (cmdq->cmd != NULL) {
cmd_print(cmdq->cmd, s, sizeof s);
log_debug("cmdq %p: %s (client %d)", cmdq, s,
cmdq->client != NULL ? cmdq->client->ibuf.fd : -1);
cmdq->time = time(NULL);
cmdq->number++;
guard = cmdq_guard(cmdq, "begin");
retval = cmdq->cmd->entry->exec(cmdq->cmd, cmdq);
if (guard) {
if (retval == CMD_RETURN_ERROR)
cmdq_guard(cmdq, "error");
else
cmdq_guard(cmdq, "end");
}
if (retval == CMD_RETURN_ERROR)
break;
if (retval == CMD_RETURN_WAIT)
goto out;
if (retval == CMD_RETURN_STOP) {
cmdq_flush(cmdq);
goto empty;
}
cmdq->cmd = TAILQ_NEXT(cmdq->cmd, qentry);
}
TAILQ_REMOVE(&cmdq->queue, cmdq->item, qentry);
cmd_list_free(cmdq->item->cmdlist);
free(cmdq->item);
cmdq->item = next;
if (cmdq->item != NULL)
cmdq->cmd = TAILQ_FIRST(&cmdq->item->cmdlist->list);
} while (cmdq->item != NULL);
empty:
if (cmdq->client_exit)
cmdq->client->flags |= CLIENT_EXIT;
if (cmdq->emptyfn != NULL)
cmdq->emptyfn(cmdq); /* may free cmdq */
empty = 1;
out:
notify_enable();
return (empty);
}
/* Flush command queue. */
void
cmdq_flush(struct cmd_q *cmdq)
{
struct cmd_q_item *item, *item1;
TAILQ_FOREACH_SAFE(item, &cmdq->queue, qentry, item1) {
TAILQ_REMOVE(&cmdq->queue, item, qentry);
cmd_list_free(item->cmdlist);
free(item);
}
cmdq->item = NULL;
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-refresh-client.c,v 1.11 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,29 +24,54 @@
* Refresh client. * Refresh client.
*/ */
int cmd_refresh_client_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_refresh_client_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_refresh_client_entry = { const struct cmd_entry cmd_refresh_client_entry = {
"refresh-client", "refresh", "refresh-client", "refresh",
CMD_TARGET_CLIENT_USAGE, "C:St:", 0, 0,
0, "", "[-S] [-C size]" CMD_TARGET_CLIENT_USAGE,
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_refresh_client_exec, NULL,
cmd_target_free, cmd_refresh_client_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_refresh_client_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_refresh_client_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct client *c; struct client *c;
const char *size;
u_int w, h;
if ((c = cmd_find_client(ctx, data->target)) == NULL) if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
server_redraw_client(c); if (args_has(args, 'C')) {
if ((size = args_get(args, 'C')) == NULL) {
cmdq_error(cmdq, "missing size");
return (CMD_RETURN_ERROR);
}
if (sscanf(size, "%u,%u", &w, &h) != 2) {
cmdq_error(cmdq, "bad size argument");
return (CMD_RETURN_ERROR);
}
if (w < PANE_MINIMUM || w > 5000 ||
h < PANE_MINIMUM || h > 5000) {
cmdq_error(cmdq, "size too small or too big");
return (CMD_RETURN_ERROR);
}
if (!(c->flags & CLIENT_CONTROL)) {
cmdq_error(cmdq, "not a control client");
return (CMD_RETURN_ERROR);
}
if (tty_set_size(&c->tty, w, h))
recalculate_sizes();
} else if (args_has(args, 'S')) {
status_update_jobs(c);
server_status_client(c);
} else
server_redraw_client(c);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-rename-session.c,v 1.19 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,32 +26,45 @@
* Change session name. * Change session name.
*/ */
int cmd_rename_session_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_rename_session_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_rename_session_entry = { const struct cmd_entry cmd_rename_session_entry = {
"rename-session", "rename", "rename-session", "rename",
"t:", 1, 1,
CMD_TARGET_SESSION_USAGE " new-name", CMD_TARGET_SESSION_USAGE " new-name",
CMD_ARG1, "", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_rename_session_exec, cmd_rename_session_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_rename_session_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_rename_session_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct session *s; struct session *s;
const char *newname;
if ((s = cmd_find_session(ctx, data->target)) == NULL) newname = args->argv[0];
return (-1); if (!session_check_name(newname)) {
cmdq_error(cmdq, "bad session name: %s", newname);
return (CMD_RETURN_ERROR);
}
if (session_find(newname) != NULL) {
cmdq_error(cmdq, "duplicate session: %s", newname);
return (CMD_RETURN_ERROR);
}
xfree(s->name); if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
s->name = xstrdup(data->arg); return (CMD_RETURN_ERROR);
RB_REMOVE(sessions, &sessions, s);
free(s->name);
s->name = xstrdup(newname);
RB_INSERT(sessions, &sessions, s);
server_status_session(s); server_status_session(s);
notify_session_renamed(s);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-rename-window.c,v 1.31 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,34 +26,32 @@
* Rename a window. * Rename a window.
*/ */
int cmd_rename_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_rename_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_rename_window_entry = { const struct cmd_entry cmd_rename_window_entry = {
"rename-window", "renamew", "rename-window", "renamew",
"t:", 1, 1,
CMD_TARGET_WINDOW_USAGE " new-name", CMD_TARGET_WINDOW_USAGE " new-name",
CMD_ARG1, "", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_rename_window_exec, cmd_rename_window_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_rename_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_rename_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct session *s; struct session *s;
struct winlink *wl; struct winlink *wl;
if ((wl = cmd_find_window(ctx, data->target, &s)) == NULL) if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
xfree(wl->window->name); window_set_name(wl->window, args->argv[0]);
wl->window->name = xstrdup(data->arg);
options_set_number(&wl->window->options, "automatic-rename", 0); options_set_number(&wl->window->options, "automatic-rename", 0);
server_status_window(wl->window); server_status_window(wl->window);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-resize-pane.c,v 1.14 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,86 +26,132 @@
* Increase or decrease pane size. * Increase or decrease pane size.
*/ */
void cmd_resize_pane_init(struct cmd *, int); void cmd_resize_pane_key_binding(struct cmd *, int);
int cmd_resize_pane_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_resize_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_resize_pane_entry = { const struct cmd_entry cmd_resize_pane_entry = {
"resize-pane", "resizep", "resize-pane", "resizep",
"[-DLRU] " CMD_TARGET_PANE_USAGE " [adjustment]", "DLRt:Ux:y:Z", 0, 1,
CMD_ARG01, "DLRU", "[-DLRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " [adjustment]",
cmd_resize_pane_init, 0,
cmd_target_parse, cmd_resize_pane_key_binding,
cmd_resize_pane_exec, NULL,
cmd_target_free, cmd_resize_pane_exec
cmd_target_print
}; };
void void
cmd_resize_pane_init(struct cmd *self, int key) cmd_resize_pane_key_binding(struct cmd *self, int key)
{ {
struct cmd_target_data *data; switch (key) {
case KEYC_UP | KEYC_CTRL:
cmd_target_init(self, key); self->args = args_create(0);
data = self->data; args_set(self->args, 'U', NULL);
break;
if (key == (KEYC_UP | KEYC_CTRL)) case KEYC_DOWN | KEYC_CTRL:
cmd_set_flag(&data->chflags, 'U'); self->args = args_create(0);
if (key == (KEYC_DOWN | KEYC_CTRL)) args_set(self->args, 'D', NULL);
cmd_set_flag(&data->chflags, 'D'); break;
if (key == (KEYC_LEFT | KEYC_CTRL)) case KEYC_LEFT | KEYC_CTRL:
cmd_set_flag(&data->chflags, 'L'); self->args = args_create(0);
if (key == (KEYC_RIGHT | KEYC_CTRL)) args_set(self->args, 'L', NULL);
cmd_set_flag(&data->chflags, 'R'); break;
case KEYC_RIGHT | KEYC_CTRL:
if (key == (KEYC_UP | KEYC_ESCAPE)) { self->args = args_create(0);
cmd_set_flag(&data->chflags, 'U'); args_set(self->args, 'R', NULL);
data->arg = xstrdup("5"); break;
} case KEYC_UP | KEYC_ESCAPE:
if (key == (KEYC_DOWN | KEYC_ESCAPE)) { self->args = args_create(1, "5");
cmd_set_flag(&data->chflags, 'D'); args_set(self->args, 'U', NULL);
data->arg = xstrdup("5"); break;
} case KEYC_DOWN | KEYC_ESCAPE:
if (key == (KEYC_LEFT | KEYC_ESCAPE)) { self->args = args_create(1, "5");
cmd_set_flag(&data->chflags, 'L'); args_set(self->args, 'D', NULL);
data->arg = xstrdup("5"); break;
} case KEYC_LEFT | KEYC_ESCAPE:
if (key == (KEYC_RIGHT | KEYC_ESCAPE)) { self->args = args_create(1, "5");
cmd_set_flag(&data->chflags, 'R'); args_set(self->args, 'L', NULL);
data->arg = xstrdup("5"); break;
case KEYC_RIGHT | KEYC_ESCAPE:
self->args = args_create(1, "5");
args_set(self->args, 'R', NULL);
break;
case 'z':
self->args = args_create(0);
args_set(self->args, 'Z', NULL);
break;
default:
self->args = args_create(0);
break;
} }
} }
int enum cmd_retval
cmd_resize_pane_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct winlink *wl;
struct window *w;
const char *errstr; const char *errstr;
char *cause;
struct window_pane *wp; struct window_pane *wp;
u_int adjust; u_int adjust;
int x, y;
if ((wl = cmd_find_pane(ctx, data->target, NULL, &wp)) == NULL) if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
w = wl->window;
if (data->arg == NULL) if (args_has(args, 'Z')) {
if (w->flags & WINDOW_ZOOMED)
window_unzoom(w);
else
window_zoom(wp);
server_redraw_window(w);
server_status_window(w);
return (CMD_RETURN_NORMAL);
}
server_unzoom_window(w);
if (args->argc == 0)
adjust = 1; adjust = 1;
else { else {
adjust = strtonum(data->arg, 1, INT_MAX, &errstr); adjust = strtonum(args->argv[0], 1, INT_MAX, &errstr);
if (errstr != NULL) { if (errstr != NULL) {
ctx->error(ctx, "adjustment %s: %s", errstr, data->arg); cmdq_error(cmdq, "adjustment %s", errstr);
return (-1); return (CMD_RETURN_ERROR);
} }
} }
if (cmd_check_flag(data->chflags, 'L')) if (args_has(self->args, 'x')) {
x = args_strtonum(self->args, 'x', PANE_MINIMUM, INT_MAX,
&cause);
if (cause != NULL) {
cmdq_error(cmdq, "width %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
layout_resize_pane_to(wp, LAYOUT_LEFTRIGHT, x);
}
if (args_has(self->args, 'y')) {
y = args_strtonum(self->args, 'y', PANE_MINIMUM, INT_MAX,
&cause);
if (cause != NULL) {
cmdq_error(cmdq, "height %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
}
layout_resize_pane_to(wp, LAYOUT_TOPBOTTOM, y);
}
if (args_has(self->args, 'L'))
layout_resize_pane(wp, LAYOUT_LEFTRIGHT, -adjust); layout_resize_pane(wp, LAYOUT_LEFTRIGHT, -adjust);
else if (cmd_check_flag(data->chflags, 'R')) else if (args_has(self->args, 'R'))
layout_resize_pane(wp, LAYOUT_LEFTRIGHT, adjust); layout_resize_pane(wp, LAYOUT_LEFTRIGHT, adjust);
else if (cmd_check_flag(data->chflags, 'U')) else if (args_has(self->args, 'U'))
layout_resize_pane(wp, LAYOUT_TOPBOTTOM, -adjust); layout_resize_pane(wp, LAYOUT_TOPBOTTOM, -adjust);
else if (cmd_check_flag(data->chflags, 'D')) else if (args_has(self->args, 'D'))
layout_resize_pane(wp, LAYOUT_TOPBOTTOM, adjust); layout_resize_pane(wp, LAYOUT_TOPBOTTOM, adjust);
server_redraw_window(wl->window); server_redraw_window(wl->window);
return (0); return (CMD_RETURN_NORMAL);
} }

92
cmd-respawn-pane.c Normal file
View File

@@ -0,0 +1,92 @@
/* $Id$ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
* Copyright (c) 2011 Marcel P. Partap <mpartap@gmx.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include "tmux.h"
/*
* Respawn a pane (restart the command). Kill existing if -k given.
*/
enum cmd_retval cmd_respawn_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_respawn_pane_entry = {
"respawn-pane", "respawnp",
"kt:", 0, 1,
"[-k] " CMD_TARGET_PANE_USAGE " [command]",
0,
NULL,
NULL,
cmd_respawn_pane_exec
};
enum cmd_retval
cmd_respawn_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct winlink *wl;
struct window *w;
struct window_pane *wp;
struct session *s;
struct environ env;
const char *cmd;
char *cause;
u_int idx;
if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
return (CMD_RETURN_ERROR);
w = wl->window;
if (!args_has(self->args, 'k') && wp->fd != -1) {
if (window_pane_index(wp, &idx) != 0)
fatalx("index not found");
cmdq_error(cmdq, "pane still active: %s:%u.%u",
s->name, wl->idx, idx);
return (CMD_RETURN_ERROR);
}
environ_init(&env);
environ_copy(&global_environ, &env);
environ_copy(&s->environ, &env);
server_fill_environ(s, &env);
window_pane_reset_mode(wp);
screen_reinit(&wp->base);
input_init(wp);
if (args->argc != 0)
cmd = args->argv[0];
else
cmd = NULL;
if (window_pane_spawn(wp, cmd, NULL, NULL, &env, s->tio, &cause) != 0) {
cmdq_error(cmdq, "respawn pane failed: %s", cause);
free(cause);
environ_free(&env);
return (CMD_RETURN_ERROR);
}
wp->flags |= PANE_REDRAW;
server_status_window(w);
environ_free(&env);
return (CMD_RETURN_NORMAL);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-respawn-window.c,v 1.25 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,6 +18,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include "tmux.h" #include "tmux.h"
@@ -26,41 +27,41 @@
* Respawn a window (restart the command). Kill existing if -k given. * Respawn a window (restart the command). Kill existing if -k given.
*/ */
int cmd_respawn_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_respawn_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_respawn_window_entry = { const struct cmd_entry cmd_respawn_window_entry = {
"respawn-window", "respawnw", "respawn-window", "respawnw",
"kt:", 0, 1,
"[-k] " CMD_TARGET_WINDOW_USAGE " [command]", "[-k] " CMD_TARGET_WINDOW_USAGE " [command]",
CMD_ARG01, "k", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_respawn_window_exec, cmd_respawn_window_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_respawn_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_respawn_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct winlink *wl;
struct window *w; struct window *w;
struct window_pane *wp; struct window_pane *wp;
struct session *s; struct session *s;
struct environ env; struct environ env;
const char *cmd;
char *cause; char *cause;
if ((wl = cmd_find_window(ctx, data->target, &s)) == NULL) if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
w = wl->window; w = wl->window;
if (!cmd_check_flag(data->chflags, 'k')) { if (!args_has(self->args, 'k')) {
TAILQ_FOREACH(wp, &w->panes, entry) { TAILQ_FOREACH(wp, &w->panes, entry) {
if (wp->fd == -1) if (wp->fd == -1)
continue; continue;
ctx->error(ctx, cmdq_error(cmdq,
"window still active: %s:%d", s->name, wl->idx); "window still active: %s:%d", s->name, wl->idx);
return (-1); return (CMD_RETURN_ERROR);
} }
} }
@@ -75,21 +76,26 @@ cmd_respawn_window_exec(struct cmd *self, struct cmd_ctx *ctx)
window_destroy_panes(w); window_destroy_panes(w);
TAILQ_INSERT_HEAD(&w->panes, wp, entry); TAILQ_INSERT_HEAD(&w->panes, wp, entry);
window_pane_resize(wp, w->sx, w->sy); window_pane_resize(wp, w->sx, w->sy);
if (window_pane_spawn( if (args->argc != 0)
wp, data->arg, NULL, NULL, &env, s->tio, &cause) != 0) { cmd = args->argv[0];
ctx->error(ctx, "respawn window failed: %s", cause); else
xfree(cause); cmd = NULL;
if (window_pane_spawn(wp, cmd, NULL, NULL, &env, s->tio, &cause) != 0) {
cmdq_error(cmdq, "respawn window failed: %s", cause);
free(cause);
environ_free(&env); environ_free(&env);
server_destroy_pane(wp); server_destroy_pane(wp);
return (-1); return (CMD_RETURN_ERROR);
} }
layout_init(w); layout_init(w, wp);
window_pane_reset_mode(wp);
screen_reinit(&wp->base); screen_reinit(&wp->base);
input_init(wp);
window_set_active_pane(w, wp); window_set_active_pane(w, wp);
recalculate_sizes(); recalculate_sizes();
server_redraw_window(w); server_redraw_window(w);
environ_free(&env); environ_free(&env);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-rotate-window.c,v 1.10 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,47 +24,42 @@
* Rotate the panes in a window. * Rotate the panes in a window.
*/ */
void cmd_rotate_window_init(struct cmd *, int); void cmd_rotate_window_key_binding(struct cmd *, int);
int cmd_rotate_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_rotate_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_rotate_window_entry = { const struct cmd_entry cmd_rotate_window_entry = {
"rotate-window", "rotatew", "rotate-window", "rotatew",
"Dt:U", 0, 0,
"[-DU] " CMD_TARGET_WINDOW_USAGE, "[-DU] " CMD_TARGET_WINDOW_USAGE,
0, "DU", 0,
cmd_rotate_window_init, cmd_rotate_window_key_binding,
cmd_target_parse, NULL,
cmd_rotate_window_exec, cmd_rotate_window_exec
cmd_target_free,
cmd_target_print
}; };
void void
cmd_rotate_window_init(struct cmd *self, int key) cmd_rotate_window_key_binding(struct cmd *self, int key)
{ {
struct cmd_target_data *data; self->args = args_create(0);
cmd_target_init(self, key);
data = self->data;
if (key == ('o' | KEYC_ESCAPE)) if (key == ('o' | KEYC_ESCAPE))
cmd_set_flag(&data->chflags, 'D'); args_set(self->args, 'D', NULL);
} }
int enum cmd_retval
cmd_rotate_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_rotate_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct winlink *wl;
struct window *w; struct window *w;
struct window_pane *wp, *wp2; struct window_pane *wp, *wp2;
struct layout_cell *lc; struct layout_cell *lc;
u_int sx, sy, xoff, yoff; u_int sx, sy, xoff, yoff;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
w = wl->window; w = wl->window;
if (cmd_check_flag(data->chflags, 'D')) { if (args_has(self->args, 'D')) {
wp = TAILQ_LAST(&w->panes, window_panes); wp = TAILQ_LAST(&w->panes, window_panes);
TAILQ_REMOVE(&w->panes, wp, entry); TAILQ_REMOVE(&w->panes, wp, entry);
TAILQ_INSERT_HEAD(&w->panes, wp, entry); TAILQ_INSERT_HEAD(&w->panes, wp, entry);
@@ -120,5 +115,5 @@ cmd_rotate_window_exec(struct cmd *self, struct cmd_ctx *ctx)
server_redraw_window(w); server_redraw_window(w);
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-run-shell.c,v 1.6 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org> * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -20,6 +20,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
@@ -28,64 +29,115 @@
* Runs a command without a window. * Runs a command without a window.
*/ */
int cmd_run_shell_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_run_shell_exec(struct cmd *, struct cmd_q *);
void cmd_run_shell_callback(struct job *); void cmd_run_shell_callback(struct job *);
void cmd_run_shell_free(void *); void cmd_run_shell_free(void *);
void cmd_run_shell_print(struct job *, const char *);
const struct cmd_entry cmd_run_shell_entry = { const struct cmd_entry cmd_run_shell_entry = {
"run-shell", "run", "run-shell", "run",
"command", "bt:", 1, 1,
CMD_ARG1, "", "[-b] " CMD_TARGET_PANE_USAGE " shell-command",
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_run_shell_exec, NULL,
cmd_target_free, cmd_run_shell_exec
cmd_target_print
}; };
struct cmd_run_shell_data { struct cmd_run_shell_data {
char *cmd; char *cmd;
struct cmd_ctx ctx; struct cmd_q *cmdq;
int bflag;
int wp_id;
}; };
int void
cmd_run_shell_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_run_shell_print(struct job *job, const char *msg)
{ {
struct cmd_target_data *data = self->data; struct cmd_run_shell_data *cdata = job->data;
struct window_pane *wp = NULL;
if (cdata->wp_id != -1)
wp = window_pane_find_by_id(cdata->wp_id);
if (wp == NULL) {
cmdq_print(cdata->cmdq, "%s", msg);
return;
}
if (window_pane_set_mode(wp, &window_copy_mode) == 0)
window_copy_init_for_output(wp);
if (wp->mode == &window_copy_mode)
window_copy_add(wp, "%s", msg);
}
enum cmd_retval
cmd_run_shell_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct cmd_run_shell_data *cdata; struct cmd_run_shell_data *cdata;
struct job *job; char *shellcmd;
struct client *c;
struct session *s = NULL;
struct winlink *wl = NULL;
struct window_pane *wp = NULL;
struct format_tree *ft;
if (args_has(args, 't'))
wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp);
else {
c = cmd_find_client(cmdq, NULL, 1);
if (c != NULL && c->session != NULL) {
s = c->session;
wl = s->curw;
wp = wl->window->active;
}
}
ft = format_create();
if (s != NULL)
format_session(ft, s);
if (s != NULL && wl != NULL)
format_winlink(ft, s, wl);
if (wp != NULL)
format_window_pane(ft, wp);
shellcmd = format_expand(ft, args->argv[0]);
format_free(ft);
cdata = xmalloc(sizeof *cdata); cdata = xmalloc(sizeof *cdata);
cdata->cmd = xstrdup(data->arg); cdata->cmd = shellcmd;
memcpy(&cdata->ctx, ctx, sizeof cdata->ctx); cdata->bflag = args_has(args, 'b');
cdata->wp_id = wp != NULL ? (int) wp->id : -1;
if (ctx->cmdclient != NULL) cdata->cmdq = cmdq;
ctx->cmdclient->references++; cmdq->references++;
if (ctx->curclient != NULL)
ctx->curclient->references++;
job = job_add(NULL, 0, NULL, job_run(shellcmd, s, cmd_run_shell_callback, cmd_run_shell_free, cdata);
data->arg, cmd_run_shell_callback, cmd_run_shell_free, cdata);
job_run(job);
return (1); /* don't let client exit */ if (cdata->bflag)
return (CMD_RETURN_NORMAL);
return (CMD_RETURN_WAIT);
} }
void void
cmd_run_shell_callback(struct job *job) cmd_run_shell_callback(struct job *job)
{ {
struct cmd_run_shell_data *cdata = job->data; struct cmd_run_shell_data *cdata = job->data;
struct cmd_ctx *ctx = &cdata->ctx; struct cmd_q *cmdq = cdata->cmdq;
char *cmd, *msg, *line; char *cmd, *msg, *line;
size_t size; size_t size;
int retcode; int retcode;
u_int lines; u_int lines;
if (cmdq->dead)
return;
cmd = cdata->cmd;
lines = 0; lines = 0;
do { do {
if ((line = evbuffer_readline(job->event->input)) != NULL) { if ((line = evbuffer_readline(job->event->input)) != NULL) {
ctx->print(ctx, "%s", line); cmd_run_shell_print(job, line);
free(line);
lines++; lines++;
} }
} while (line != NULL); } while (line != NULL);
@@ -96,14 +148,12 @@ cmd_run_shell_callback(struct job *job)
memcpy(line, EVBUFFER_DATA(job->event->input), size); memcpy(line, EVBUFFER_DATA(job->event->input), size);
line[size] = '\0'; line[size] = '\0';
ctx->print(ctx, "%s", line); cmd_run_shell_print(job, line);
lines++; lines++;
xfree(line); free(line);
} }
cmd = cdata->cmd;
msg = NULL; msg = NULL;
if (WIFEXITED(job->status)) { if (WIFEXITED(job->status)) {
if ((retcode = WEXITSTATUS(job->status)) != 0) if ((retcode = WEXITSTATUS(job->status)) != 0)
@@ -113,11 +163,11 @@ cmd_run_shell_callback(struct job *job)
xasprintf(&msg, "'%s' terminated by signal %d", cmd, retcode); xasprintf(&msg, "'%s' terminated by signal %d", cmd, retcode);
} }
if (msg != NULL) { if (msg != NULL) {
if (lines != 0) if (lines == 0)
ctx->print(ctx, "%s", msg); cmdq_info(cmdq, "%s", msg);
else else
ctx->info(ctx, "%s", msg); cmd_run_shell_print(job, msg);
xfree(msg); free(msg);
} }
} }
@@ -125,15 +175,11 @@ void
cmd_run_shell_free(void *data) cmd_run_shell_free(void *data)
{ {
struct cmd_run_shell_data *cdata = data; struct cmd_run_shell_data *cdata = data;
struct cmd_ctx *ctx = &cdata->ctx; struct cmd_q *cmdq = cdata->cmdq;
if (ctx->cmdclient != NULL) { if (!cmdq_free(cmdq) && !cdata->bflag)
ctx->cmdclient->references--; cmdq_continue(cmdq);
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0);
}
if (ctx->curclient != NULL)
ctx->curclient->references--;
xfree(cdata->cmd); free(cdata->cmd);
xfree(cdata); free(cdata);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-save-buffer.c,v 1.10 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org> * Copyright (c) 2009 Tiago Cunha <me@tiagocunha.org>
@@ -20,69 +20,153 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
/* /*
* Saves a session paste buffer to a file. * Saves a paste buffer to a file.
*/ */
int cmd_save_buffer_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_save_buffer_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_save_buffer_entry = { const struct cmd_entry cmd_save_buffer_entry = {
"save-buffer", "saveb", "save-buffer", "saveb",
"[-a] " CMD_BUFFER_SESSION_USAGE " path", "ab:", 1, 1,
CMD_ARG1, "a", "[-a] " CMD_BUFFER_USAGE " path",
cmd_buffer_init, 0,
cmd_buffer_parse, NULL,
cmd_save_buffer_exec, NULL,
cmd_buffer_free, cmd_save_buffer_exec
cmd_buffer_print
}; };
int const struct cmd_entry cmd_show_buffer_entry = {
cmd_save_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) "show-buffer", "showb",
"b:", 0, 0,
CMD_BUFFER_USAGE,
0,
NULL,
NULL,
cmd_save_buffer_exec
};
enum cmd_retval
cmd_save_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_buffer_data *data = self->data; struct args *args = self->args;
struct session *s; struct client *c;
struct session *s;
struct paste_buffer *pb; struct paste_buffer *pb;
mode_t mask; const char *path, *newpath, *wd;
char *cause, *start, *end;
size_t size, used;
int buffer;
mode_t mask;
FILE *f; FILE *f;
char *msg;
size_t msglen;
if ((s = cmd_find_session(ctx, data->target)) == NULL) if (!args_has(args, 'b')) {
return (-1); if ((pb = paste_get_top(&global_buffers)) == NULL) {
cmdq_error(cmdq, "no buffers");
if (data->buffer == -1) { return (CMD_RETURN_ERROR);
if ((pb = paste_get_top(&s->buffers)) == NULL) {
ctx->error(ctx, "no buffers");
return (-1);
} }
} else { } else {
if ((pb = paste_get_index(&s->buffers, data->buffer)) == NULL) { buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
ctx->error(ctx, "no buffer %d", data->buffer); if (cause != NULL) {
return (-1); cmdq_error(cmdq, "buffer %s", cause);
free(cause);
return (CMD_RETURN_ERROR);
} }
pb = paste_get_index(&global_buffers, buffer);
if (pb == NULL) {
cmdq_error(cmdq, "no buffer %d", buffer);
return (CMD_RETURN_ERROR);
}
}
if (self->entry == &cmd_show_buffer_entry)
path = "-";
else
path = args->argv[0];
if (strcmp(path, "-") == 0) {
c = cmdq->client;
if (c == NULL) {
cmdq_error(cmdq, "can't write to stdout");
return (CMD_RETURN_ERROR);
}
if (c->session == NULL || (c->flags & CLIENT_CONTROL))
goto do_stdout;
goto do_print;
}
c = cmdq->client;
if (c != NULL)
wd = c->cwd;
else if ((s = cmd_current_session(cmdq, 0)) != NULL) {
wd = options_get_string(&s->options, "default-path");
if (*wd == '\0')
wd = s->cwd;
} else
wd = NULL;
if (wd != NULL && *wd != '\0') {
newpath = get_full_path(wd, path);
if (newpath != NULL)
path = newpath;
} }
mask = umask(S_IRWXG | S_IRWXO); mask = umask(S_IRWXG | S_IRWXO);
if (cmd_check_flag(data->chflags, 'a')) if (args_has(self->args, 'a'))
f = fopen(data->arg, "ab"); f = fopen(path, "ab");
else else
f = fopen(data->arg, "wb"); f = fopen(path, "wb");
umask(mask); umask(mask);
if (f == NULL) { if (f == NULL) {
ctx->error(ctx, "%s: %s", data->arg, strerror(errno)); cmdq_error(cmdq, "%s: %s", path, strerror(errno));
return (-1); return (CMD_RETURN_ERROR);
} }
if (fwrite(pb->data, 1, pb->size, f) != pb->size) { if (fwrite(pb->data, 1, pb->size, f) != pb->size) {
ctx->error(ctx, "%s: fwrite error", data->arg); cmdq_error(cmdq, "%s: fwrite error", path);
fclose(f); fclose(f);
return (-1); return (CMD_RETURN_ERROR);
} }
fclose(f); fclose(f);
return (0); return (CMD_RETURN_NORMAL);
do_stdout:
evbuffer_add(c->stdout_data, pb->data, pb->size);
server_push_stdout(c);
return (CMD_RETURN_NORMAL);
do_print:
if (pb->size > (INT_MAX / 4) - 1) {
cmdq_error(cmdq, "buffer too big");
return (CMD_RETURN_ERROR);
}
msg = NULL;
msglen = 0;
used = 0;
while (used != pb->size) {
start = pb->data + used;
end = memchr(start, '\n', pb->size - used);
if (end != NULL)
size = end - start;
else
size = pb->size - used;
msglen = size * 4 + 1;
msg = xrealloc(msg, 1, msglen);
strvisx(msg, start, size, VIS_OCTAL|VIS_TAB);
cmdq_print(cmdq, "%s", msg);
used += size + (end != NULL);
}
free(msg);
return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-select-layout.c,v 1.10 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,65 +24,112 @@
* Switch window to selected layout. * Switch window to selected layout.
*/ */
void cmd_select_layout_init(struct cmd *, int); void cmd_select_layout_key_binding(struct cmd *, int);
int cmd_select_layout_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_select_layout_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_select_layout_entry = { const struct cmd_entry cmd_select_layout_entry = {
"select-layout", "selectl", "select-layout", "selectl",
CMD_TARGET_WINDOW_USAGE " [layout-name]", "npt:", 0, 1,
CMD_ARG01, "", "[-np] " CMD_TARGET_WINDOW_USAGE " [layout-name]",
cmd_select_layout_init, 0,
cmd_target_parse, cmd_select_layout_key_binding,
cmd_select_layout_exec, NULL,
cmd_target_free, cmd_select_layout_exec
cmd_target_print };
const struct cmd_entry cmd_next_layout_entry = {
"next-layout", "nextl",
"t:", 0, 0,
CMD_TARGET_WINDOW_USAGE,
0,
NULL,
NULL,
cmd_select_layout_exec
};
const struct cmd_entry cmd_previous_layout_entry = {
"previous-layout", "prevl",
"t:", 0, 0,
CMD_TARGET_WINDOW_USAGE,
0,
NULL,
NULL,
cmd_select_layout_exec
}; };
void void
cmd_select_layout_init(struct cmd *self, int key) cmd_select_layout_key_binding(struct cmd *self, int key)
{ {
struct cmd_target_data *data;
cmd_target_init(self, key);
data = self->data;
switch (key) { switch (key) {
case ('1' | KEYC_ESCAPE): case '1' | KEYC_ESCAPE:
data->arg = xstrdup("even-horizontal"); self->args = args_create(1, "even-horizontal");
break; break;
case ('2' | KEYC_ESCAPE): case '2' | KEYC_ESCAPE:
data->arg = xstrdup("even-vertical"); self->args = args_create(1, "even-vertical");
break; break;
case ('3' | KEYC_ESCAPE): case '3' | KEYC_ESCAPE:
data->arg = xstrdup("main-horizontal"); self->args = args_create(1, "main-horizontal");
break; break;
case ('4' | KEYC_ESCAPE): case '4' | KEYC_ESCAPE:
data->arg = xstrdup("main-vertical"); self->args = args_create(1, "main-vertical");
break;
case '5' | KEYC_ESCAPE:
self->args = args_create(1, "tiled");
break;
default:
self->args = args_create(0);
break; break;
} }
} }
int enum cmd_retval
cmd_select_layout_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_select_layout_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct winlink *wl;
int layout; const char *layoutname;
int next, previous, layout;
if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
server_unzoom_window(wl->window);
if (data->arg == NULL) { next = self->entry == &cmd_next_layout_entry;
layout = wl->window->lastlayout; if (args_has(self->args, 'n'))
if (layout == -1) next = 1;
return (0); previous = self->entry == &cmd_previous_layout_entry;
} else if ((layout = layout_set_lookup(data->arg)) == -1) { if (args_has(self->args, 'p'))
ctx->error(ctx, "unknown layout or ambiguous: %s", data->arg); previous = 1;
return (-1);
if (next || previous) {
if (next)
layout = layout_set_next(wl->window);
else
layout = layout_set_previous(wl->window);
server_redraw_window(wl->window);
cmdq_info(cmdq, "arranging in: %s", layout_set_name(layout));
return (CMD_RETURN_NORMAL);
} }
layout = layout_set_select(wl->window, layout); if (args->argc == 0)
ctx->info(ctx, "arranging in: %s", layout_set_name(layout)); layout = wl->window->lastlayout;
else
layout = layout_set_lookup(args->argv[0]);
if (layout != -1) {
layout = layout_set_select(wl->window, layout);
server_redraw_window(wl->window);
cmdq_info(cmdq, "arranging in: %s", layout_set_name(layout));
return (CMD_RETURN_NORMAL);
}
return (0); if (args->argc != 0) {
layoutname = args->argv[0];
if (layout_parse(wl->window, layoutname) == -1) {
cmdq_error(cmdq, "can't set layout: %s", layoutname);
return (CMD_RETURN_ERROR);
}
server_redraw_window(wl->window);
cmdq_info(cmdq, "arranging in: %s", layoutname);
}
return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-select-pane.c,v 1.12 2010-01-05 23:52:37 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,36 +24,95 @@
* Select pane. * Select pane.
*/ */
int cmd_select_pane_exec(struct cmd *, struct cmd_ctx *); void cmd_select_pane_key_binding(struct cmd *, int);
enum cmd_retval cmd_select_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_select_pane_entry = { const struct cmd_entry cmd_select_pane_entry = {
"select-pane", "selectp", "select-pane", "selectp",
CMD_TARGET_PANE_USAGE, "lDLRt:U", 0, 0,
0, "", "[-lDLRU] " CMD_TARGET_PANE_USAGE,
cmd_target_init, 0,
cmd_target_parse, cmd_select_pane_key_binding,
cmd_select_pane_exec, NULL,
cmd_target_free, cmd_select_pane_exec
cmd_target_print
}; };
int const struct cmd_entry cmd_last_pane_entry = {
cmd_select_pane_exec(struct cmd *self, struct cmd_ctx *ctx) "last-pane", "lastp",
"t:", 0, 0,
CMD_TARGET_WINDOW_USAGE,
0,
NULL,
NULL,
cmd_select_pane_exec
};
void
cmd_select_pane_key_binding(struct cmd *self, int key)
{ {
struct cmd_target_data *data = self->data; self->args = args_create(0);
if (key == KEYC_UP)
args_set(self->args, 'U', NULL);
if (key == KEYC_DOWN)
args_set(self->args, 'D', NULL);
if (key == KEYC_LEFT)
args_set(self->args, 'L', NULL);
if (key == KEYC_RIGHT)
args_set(self->args, 'R', NULL);
if (key == 'o')
args_set(self->args, 't', ":.+");
}
enum cmd_retval
cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct winlink *wl; struct winlink *wl;
struct window_pane *wp; struct window_pane *wp;
if ((wl = cmd_find_pane(ctx, data->target, NULL, &wp)) == NULL) if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) {
return (-1); wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
if (wl == NULL)
return (CMD_RETURN_ERROR);
if (!window_pane_visible(wp)) { if (wl->window->last == NULL) {
ctx->error(ctx, "pane not visible: %s", data->target); cmdq_error(cmdq, "no last pane");
return (-1); return (CMD_RETURN_ERROR);
}
server_unzoom_window(wl->window);
window_set_active_pane(wl->window, wl->window->last);
server_status_window(wl->window);
server_redraw_window_borders(wl->window);
return (CMD_RETURN_NORMAL);
} }
if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
return (CMD_RETURN_ERROR);
server_unzoom_window(wp->window);
if (!window_pane_visible(wp)) {
cmdq_error(cmdq, "pane not visible");
return (CMD_RETURN_ERROR);
}
if (args_has(self->args, 'L'))
wp = window_pane_find_left(wp);
else if (args_has(self->args, 'R'))
wp = window_pane_find_right(wp);
else if (args_has(self->args, 'U'))
wp = window_pane_find_up(wp);
else if (args_has(self->args, 'D'))
wp = window_pane_find_down(wp);
if (wp == NULL) {
cmdq_error(cmdq, "pane not found");
return (CMD_RETURN_ERROR);
}
window_set_active_pane(wl->window, wp); window_set_active_pane(wl->window, wp);
server_status_window(wl->window); server_status_window(wl->window);
server_redraw_window_borders(wl->window); server_redraw_window_borders(wl->window);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,91 +0,0 @@
/* $Id: cmd-select-prompt.c,v 1.13 2009-11-14 17:56:39 tcunha Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include <stdlib.h>
#include "tmux.h"
/*
* Prompt for window index and select it.
*/
int cmd_select_prompt_exec(struct cmd *, struct cmd_ctx *);
int cmd_select_prompt_callback(void *, const char *);
const struct cmd_entry cmd_select_prompt_entry = {
"select-prompt", NULL,
CMD_TARGET_CLIENT_USAGE,
0, "",
cmd_target_init,
cmd_target_parse,
cmd_select_prompt_exec,
cmd_target_free,
cmd_target_print
};
int
cmd_select_prompt_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct client *c;
if ((c = cmd_find_client(ctx, data->target)) == NULL)
return (-1);
if (c->prompt_string != NULL)
return (0);
status_prompt_set(c, "index ", cmd_select_prompt_callback, NULL, c, 0);
return (0);
}
int
cmd_select_prompt_callback(void *data, const char *s)
{
struct client *c = data;
const char *errstr;
char msg[128];
u_int idx;
if (s == NULL || *s == '\0')
return (0);
idx = strtonum(s, 0, UINT_MAX, &errstr);
if (errstr != NULL) {
xsnprintf(msg, sizeof msg, "Index %s: %s", errstr, s);
status_message_set(c, "%s", msg);
return (0);
}
if (winlink_find_by_index(&c->session->windows, idx) == NULL) {
xsnprintf(msg, sizeof msg,
"Window not found: %s:%d", c->session->name, idx);
status_message_set(c, "%s", msg);
return (0);
}
if (session_select(c->session, idx) == 0)
server_redraw_session(c->session);
recalculate_sizes();
return (0);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-select-window.c,v 1.24 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,44 +26,124 @@
* Select window by index. * Select window by index.
*/ */
void cmd_select_window_init(struct cmd *, int); void cmd_select_window_key_binding(struct cmd *, int);
int cmd_select_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_select_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_select_window_entry = { const struct cmd_entry cmd_select_window_entry = {
"select-window", "selectw", "select-window", "selectw",
CMD_TARGET_WINDOW_USAGE, "lnpTt:", 0, 0,
0, "", "[-lnpT] " CMD_TARGET_WINDOW_USAGE,
cmd_select_window_init, 0,
cmd_target_parse, cmd_select_window_key_binding,
cmd_select_window_exec, NULL,
cmd_target_free, cmd_select_window_exec
cmd_target_print };
const struct cmd_entry cmd_next_window_entry = {
"next-window", "next",
"at:", 0, 0,
"[-a] " CMD_TARGET_SESSION_USAGE,
0,
cmd_select_window_key_binding,
NULL,
cmd_select_window_exec
};
const struct cmd_entry cmd_previous_window_entry = {
"previous-window", "prev",
"at:", 0, 0,
"[-a] " CMD_TARGET_SESSION_USAGE,
0,
cmd_select_window_key_binding,
NULL,
cmd_select_window_exec
};
const struct cmd_entry cmd_last_window_entry = {
"last-window", "last",
"t:", 0, 0,
CMD_TARGET_SESSION_USAGE,
0,
NULL,
NULL,
cmd_select_window_exec
}; };
void void
cmd_select_window_init(struct cmd *self, int key) cmd_select_window_key_binding(struct cmd *self, int key)
{ {
struct cmd_target_data *data; char tmp[16];
cmd_target_init(self, key); self->args = args_create(0);
data = self->data; if (key >= '0' && key <= '9') {
xsnprintf(tmp, sizeof tmp, ":%d", key - '0');
xasprintf(&data->target, ":%d", key - '0'); args_set(self->args, 't', tmp);
}
if (key == ('n' | KEYC_ESCAPE) || key == ('p' | KEYC_ESCAPE))
args_set(self->args, 'a', NULL);
} }
int enum cmd_retval
cmd_select_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_select_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct winlink *wl; struct winlink *wl;
struct session *s; struct session *s;
int next, previous, last, activity;
if ((wl = cmd_find_window(ctx, data->target, &s)) == NULL) next = self->entry == &cmd_next_window_entry;
return (-1); if (args_has(self->args, 'n'))
next = 1;
previous = self->entry == &cmd_previous_window_entry;
if (args_has(self->args, 'p'))
previous = 1;
last = self->entry == &cmd_last_window_entry;
if (args_has(self->args, 'l'))
last = 1;
if (next || previous || last) {
s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL)
return (CMD_RETURN_ERROR);
activity = args_has(self->args, 'a');
if (next) {
if (session_next(s, activity) != 0) {
cmdq_error(cmdq, "no next window");
return (CMD_RETURN_ERROR);
}
} else if (previous) {
if (session_previous(s, activity) != 0) {
cmdq_error(cmdq, "no previous window");
return (CMD_RETURN_ERROR);
}
} else {
if (session_last(s) != 0) {
cmdq_error(cmdq, "no last window");
return (CMD_RETURN_ERROR);
}
}
if (session_select(s, wl->idx) == 0)
server_redraw_session(s); server_redraw_session(s);
} else {
wl = cmd_find_window(cmdq, args_get(args, 't'), &s);
if (wl == NULL)
return (CMD_RETURN_ERROR);
/*
* If -T and select-window is invoked on same window as
* current, switch to previous window.
*/
if (args_has(self->args, 'T') && wl == s->curw) {
if (session_last(s) != 0) {
cmdq_error(cmdq, "no last window");
return (-1);
}
server_redraw_session(s);
} else if (session_select(s, wl->idx) == 0)
server_redraw_session(s);
}
recalculate_sizes(); recalculate_sizes();
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-send-keys.c,v 1.24 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -19,6 +19,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include "tmux.h" #include "tmux.h"
@@ -26,127 +27,77 @@
* Send keys to client. * Send keys to client.
*/ */
int cmd_send_keys_parse(struct cmd *, int, char **, char **); enum cmd_retval cmd_send_keys_exec(struct cmd *, struct cmd_q *);
int cmd_send_keys_exec(struct cmd *, struct cmd_ctx *);
void cmd_send_keys_free(struct cmd *);
size_t cmd_send_keys_print(struct cmd *, char *, size_t);
struct cmd_send_keys_data {
char *target;
u_int nkeys;
int *keys;
};
const struct cmd_entry cmd_send_keys_entry = { const struct cmd_entry cmd_send_keys_entry = {
"send-keys", "send", "send-keys", "send",
"[-t target-pane] key ...", "lRt:", 0, -1,
0, "", "[-lR] " CMD_TARGET_PANE_USAGE " key ...",
0,
NULL, NULL,
cmd_send_keys_parse, NULL,
cmd_send_keys_exec, cmd_send_keys_exec
cmd_send_keys_free,
cmd_send_keys_print
}; };
int const struct cmd_entry cmd_send_prefix_entry = {
cmd_send_keys_parse(struct cmd *self, int argc, char **argv, char **cause) "send-prefix", NULL,
"2t:", 0, 0,
"[-2] " CMD_TARGET_PANE_USAGE,
0,
NULL,
NULL,
cmd_send_keys_exec
};
enum cmd_retval
cmd_send_keys_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_send_keys_data *data; struct args *args = self->args;
int opt, key; struct window_pane *wp;
char *s; struct session *s;
struct input_ctx *ictx;
const char *str;
int i, key;
self->data = data = xmalloc(sizeof *data); if (cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp) == NULL)
data->target = NULL; return (CMD_RETURN_ERROR);
data->nkeys = 0;
data->keys = NULL;
while ((opt = getopt(argc, argv, "t:")) != -1) { if (self->entry == &cmd_send_prefix_entry) {
switch (opt) { if (args_has(args, '2'))
case 't': key = options_get_number(&s->options, "prefix2");
if (data->target == NULL) else
data->target = xstrdup(optarg); key = options_get_number(&s->options, "prefix");
break; window_pane_key(wp, s, key);
default: return (CMD_RETURN_NORMAL);
goto usage;
}
} }
argc -= optind;
argv += optind;
if (argc == 0)
goto usage;
while (argc-- != 0) { if (args_has(args, 'R')) {
if ((key = key_string_lookup_string(*argv)) != KEYC_NONE) { ictx = &wp->ictx;
data->keys = xrealloc(
data->keys, data->nkeys + 1, sizeof *data->keys); memcpy(&ictx->cell, &grid_default_cell, sizeof ictx->cell);
data->keys[data->nkeys++] = key; memcpy(&ictx->old_cell, &ictx->cell, sizeof ictx->old_cell);
ictx->old_cx = 0;
ictx->old_cy = 0;
if (wp->mode == NULL)
screen_write_start(&ictx->ctx, wp, &wp->base);
else
screen_write_start(&ictx->ctx, NULL, &wp->base);
screen_write_reset(&ictx->ctx);
screen_write_stop(&ictx->ctx);
}
for (i = 0; i < args->argc; i++) {
str = args->argv[i];
if (!args_has(args, 'l') &&
(key = key_string_lookup_string(str)) != KEYC_NONE) {
window_pane_key(wp, s, key);
} else { } else {
for (s = *argv; *s != '\0'; s++) { for (; *str != '\0'; str++)
data->keys = xrealloc(data->keys, window_pane_key(wp, s, *str);
data->nkeys + 1, sizeof *data->keys);
data->keys[data->nkeys++] = *s;
}
} }
argv++;
} }
return (0); return (CMD_RETURN_NORMAL);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
int
cmd_send_keys_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_send_keys_data *data = self->data;
struct window_pane *wp;
u_int i;
if (data == NULL)
return (-1);
if (cmd_find_pane(ctx, data->target, NULL, &wp) == NULL)
return (-1);
for (i = 0; i < data->nkeys; i++)
window_pane_key(wp, ctx->curclient, data->keys[i]);
return (0);
}
void
cmd_send_keys_free(struct cmd *self)
{
struct cmd_send_keys_data *data = self->data;
if (data->target != NULL)
xfree(data->target);
xfree(data);
}
size_t
cmd_send_keys_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_send_keys_data *data = self->data;
size_t off = 0;
u_int i;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
if (off < len && data->target != NULL)
off += cmd_prarg(buf + off, len - off, " -t ", data->target);
for (i = 0; i < data->nkeys; i++) {
if (off >= len)
break;
off += xsnprintf(buf + off,
len - off, " %s", key_string_lookup_key(data->keys[i]));
}
return (off);
} }

View File

@@ -1,55 +0,0 @@
/* $Id: cmd-send-prefix.c,v 1.28 2009-11-14 17:56:39 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Send prefix key as a key.
*/
int cmd_send_prefix_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_send_prefix_entry = {
"send-prefix", NULL,
CMD_TARGET_PANE_USAGE,
0, "",
cmd_target_init,
cmd_target_parse,
cmd_send_prefix_exec,
cmd_target_free,
cmd_target_print
};
int
cmd_send_prefix_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_target_data *data = self->data;
struct session *s;
struct window_pane *wp;
struct keylist *keylist;
if (cmd_find_pane(ctx, data->target, &s, &wp) == NULL)
return (-1);
keylist = options_get_data(&s->options, "prefix");
window_pane_key(wp, ctx->curclient, ARRAY_FIRST(keylist));
return (0);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-server-info.c,v 1.37 2009-12-10 16:59:02 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -30,161 +30,145 @@
* Show various information about server. * Show various information about server.
*/ */
int cmd_server_info_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_server_info_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_server_info_entry = { const struct cmd_entry cmd_server_info_entry = {
"server-info", "info", "server-info", "info",
"", 0, 0,
"", "",
0, "", 0,
NULL, NULL,
NULL, NULL,
cmd_server_info_exec, cmd_server_info_exec
NULL,
NULL
}; };
/* ARGSUSED */ enum cmd_retval
int cmd_server_info_exec(unused struct cmd *self, struct cmd_q *cmdq)
cmd_server_info_exec(unused struct cmd *self, struct cmd_ctx *ctx)
{ {
struct tty_term *term; struct tty_term *term;
struct client *c; struct client *c;
struct session *s; struct session *s;
struct winlink *wl; struct winlink *wl;
struct window *w; struct window *w;
struct window_pane *wp; struct window_pane *wp;
struct tty_code *code; struct tty_code *code;
struct tty_term_code_entry *ent; const struct tty_term_code_entry *ent;
struct utsname un; struct utsname un;
struct job *job; struct job *job;
struct grid *gd; struct grid *gd;
struct grid_line *gl; struct grid_line *gl;
u_int i, j, k; u_int i, j, k, lines;
char out[80]; size_t size;
char *tim; char out[80];
time_t t; char *tim;
u_int lines, ulines; time_t t;
size_t size, usize;
tim = ctime(&start_time); tim = ctime(&start_time);
*strchr(tim, '\n') = '\0'; *strchr(tim, '\n') = '\0';
ctx->print(ctx, cmdq_print(cmdq,
"tmux " BUILD ", pid %ld, started %s", (long) getpid(), tim); "tmux " VERSION ", pid %ld, started %s", (long) getpid(), tim);
ctx->print( cmdq_print(cmdq, "socket path %s, debug level %d", socket_path,
ctx, "socket path %s, debug level %d", socket_path, debug_level); debug_level);
if (uname(&un) == 0) { if (uname(&un) >= 0) {
ctx->print(ctx, "system is %s %s %s %s", cmdq_print(cmdq, "system is %s %s %s %s",
un.sysname, un.release, un.version, un.machine); un.sysname, un.release, un.version, un.machine);
} }
if (cfg_file != NULL) if (cfg_file != NULL)
ctx->print(ctx, "configuration file is %s", cfg_file); cmdq_print(cmdq, "configuration file is %s", cfg_file);
else else
ctx->print(ctx, "configuration file not specified"); cmdq_print(cmdq, "configuration file not specified");
ctx->print(ctx, "protocol version is %d", PROTOCOL_VERSION); cmdq_print(cmdq, "protocol version is %d", PROTOCOL_VERSION);
ctx->print(ctx, "%u clients, %u sessions", cmdq_print(cmdq, "%s", "");
ARRAY_LENGTH(&clients), ARRAY_LENGTH(&sessions));
ctx->print(ctx, "%s", "");
ctx->print(ctx, "Clients:"); cmdq_print(cmdq, "Clients:");
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i); c = ARRAY_ITEM(&clients, i);
if (c == NULL || c->session == NULL) if (c == NULL || c->session == NULL)
continue; continue;
ctx->print(ctx, "%2d: %s (%d, %d): %s [%ux%u %s] " cmdq_print(cmdq,"%2d: %s (%d, %d): %s [%ux%u %s bs=%hho "
"[flags=0x%x/0x%x, references=%u]", i, c->tty.path, "class=%u] [flags=0x%x/0x%x, references=%u]", i,
c->ibuf.fd, c->tty.fd, c->session->name, c->tty.path, c->ibuf.fd, c->tty.fd, c->session->name,
c->tty.sx, c->tty.sy, c->tty.termname, c->flags, c->tty.sx, c->tty.sy, c->tty.termname,
c->tty.flags, c->references); c->tty.tio.c_cc[VERASE], c->tty.class,
c->flags, c->tty.flags, c->references);
} }
ctx->print(ctx, "%s", ""); cmdq_print(cmdq, "%s", "");
ctx->print(ctx, "Sessions: [%zu/%zu]",
sizeof (struct grid_cell), sizeof (struct grid_utf8));
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
s = ARRAY_ITEM(&sessions, i);
if (s == NULL)
continue;
cmdq_print(cmdq, "Sessions: [%zu]", sizeof (struct grid_cell));
RB_FOREACH(s, sessions, &sessions) {
t = s->creation_time.tv_sec; t = s->creation_time.tv_sec;
tim = ctime(&t); tim = ctime(&t);
*strchr(tim, '\n') = '\0'; *strchr(tim, '\n') = '\0';
ctx->print(ctx, "%2u: %s: %u windows (created %s) [%ux%u] " cmdq_print(cmdq, "%2u: %s: %u windows (created %s) [%ux%u] "
"[flags=0x%x, references=%u]", i, s->name, "[flags=0x%x]", s->id, s->name,
winlink_count(&s->windows), tim, s->sx, s->sy, s->flags, winlink_count(&s->windows), tim, s->sx, s->sy, s->flags);
s->references);
RB_FOREACH(wl, winlinks, &s->windows) { RB_FOREACH(wl, winlinks, &s->windows) {
w = wl->window; w = wl->window;
ctx->print(ctx, "%4u: %s [%ux%u] [flags=0x%x, " cmdq_print(cmdq, "%4u: %s [%ux%u] [flags=0x%x, "
"references=%u, last layout=%d]", wl->idx, w->name, "references=%u, last layout=%d]", wl->idx, w->name,
w->sx, w->sy, w->flags, w->references, w->sx, w->sy, w->flags, w->references,
w->lastlayout); w->lastlayout);
j = 0; j = 0;
TAILQ_FOREACH(wp, &w->panes, entry) { TAILQ_FOREACH(wp, &w->panes, entry) {
lines = ulines = size = usize = 0; lines = size = 0;
gd = wp->base.grid; gd = wp->base.grid;
for (k = 0; k < gd->hsize + gd->sy; k++) { for (k = 0; k < gd->hsize + gd->sy; k++) {
gl = &gd->linedata[k]; gl = &gd->linedata[k];
if (gl->celldata != NULL) { if (gl->celldata == NULL)
lines++; continue;
size += gl->cellsize * lines++;
sizeof *gl->celldata; size += gl->cellsize *
} sizeof *gl->celldata;
if (gl->utf8data != NULL) {
ulines++;
usize += gl->utf8size *
sizeof *gl->utf8data;
}
} }
ctx->print(ctx, "%6u: %s %lu %d %u/%u, %zu " cmdq_print(cmdq,
"bytes; UTF-8 %u/%u, %zu bytes", j, "%6u: %s %lu %d %u/%u, %zu bytes", j,
wp->tty, (u_long) wp->pid, wp->fd, lines, wp->tty, (u_long) wp->pid, wp->fd, lines,
gd->hsize + gd->sy, size, ulines, gd->hsize + gd->sy, size);
gd->hsize + gd->sy, usize);
j++; j++;
} }
} }
} }
ctx->print(ctx, "%s", ""); cmdq_print(cmdq, "%s", "");
ctx->print(ctx, "Terminals:"); cmdq_print(cmdq, "Terminals:");
SLIST_FOREACH(term, &tty_terms, entry) { LIST_FOREACH(term, &tty_terms, entry) {
ctx->print(ctx, "%s [references=%u, flags=0x%x]:", cmdq_print(cmdq, "%s [references=%u, flags=0x%x]:",
term->name, term->references, term->flags); term->name, term->references, term->flags);
for (i = 0; i < NTTYCODE; i++) { for (i = 0; i < NTTYCODE; i++) {
ent = &tty_term_codes[i]; ent = &tty_term_codes[i];
code = &term->codes[ent->code]; code = &term->codes[ent->code];
switch (code->type) { switch (code->type) {
case TTYCODE_NONE: case TTYCODE_NONE:
ctx->print(ctx, "%2u: %s: [missing]", cmdq_print(cmdq, "%2u: %s: [missing]",
ent->code, ent->name); ent->code, ent->name);
break; break;
case TTYCODE_STRING: case TTYCODE_STRING:
strnvis(out, code->value.string, sizeof out, strnvis(out, code->value.string, sizeof out,
VIS_OCTAL|VIS_TAB|VIS_NL); VIS_OCTAL|VIS_TAB|VIS_NL);
ctx->print(ctx, "%2u: %s: (string) %s", cmdq_print(cmdq, "%2u: %s: (string) %s",
ent->code, ent->name, out); ent->code, ent->name, out);
break; break;
case TTYCODE_NUMBER: case TTYCODE_NUMBER:
ctx->print(ctx, "%2u: %s: (number) %d", cmdq_print(cmdq, "%2u: %s: (number) %d",
ent->code, ent->name, code->value.number); ent->code, ent->name, code->value.number);
break; break;
case TTYCODE_FLAG: case TTYCODE_FLAG:
ctx->print(ctx, "%2u: %s: (flag) %s", cmdq_print(cmdq, "%2u: %s: (flag) %s",
ent->code, ent->name, ent->code, ent->name,
code->value.flag ? "true" : "false"); code->value.flag ? "true" : "false");
break; break;
} }
} }
} }
ctx->print(ctx, "%s", ""); cmdq_print(cmdq, "%s", "");
ctx->print(ctx, "Jobs:"); cmdq_print(cmdq, "Jobs:");
SLIST_FOREACH(job, &all_jobs, lentry) { LIST_FOREACH(job, &all_jobs, lentry) {
ctx->print(ctx, "%s [fd=%d, pid=%d, status=%d, flags=0x%x]", cmdq_print(cmdq, "%s [fd=%d, pid=%d, status=%d]",
job->cmd, job->fd, job->pid, job->status, job->flags); job->cmd, job->fd, job->pid, job->status);
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-set-buffer.c,v 1.12 2009-11-28 14:54:12 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -18,51 +18,59 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "tmux.h" #include "tmux.h"
/* /*
* Add or set a session paste buffer. * Add or set a paste buffer.
*/ */
int cmd_set_buffer_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_set_buffer_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_set_buffer_entry = { const struct cmd_entry cmd_set_buffer_entry = {
"set-buffer", "setb", "set-buffer", "setb",
CMD_BUFFER_SESSION_USAGE " data", "b:", 1, 1,
CMD_ARG1, "", CMD_BUFFER_USAGE " data",
cmd_buffer_init, 0,
cmd_buffer_parse, NULL,
cmd_set_buffer_exec, NULL,
cmd_buffer_free, cmd_set_buffer_exec
cmd_buffer_print
}; };
int enum cmd_retval
cmd_set_buffer_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_set_buffer_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_buffer_data *data = self->data; struct args *args = self->args;
struct session *s; u_int limit;
u_int limit; char *pdata, *cause;
char *pdata; size_t psize;
size_t psize; int buffer;
if ((s = cmd_find_session(ctx, data->target)) == NULL) limit = options_get_number(&global_options, "buffer-limit");
return (-1);
limit = options_get_number(&s->options, "buffer-limit");
pdata = xstrdup(data->arg); pdata = xstrdup(args->argv[0]);
psize = strlen(pdata); psize = strlen(pdata);
if (data->buffer == -1) { if (!args_has(args, 'b')) {
paste_add(&s->buffers, pdata, psize, limit); paste_add(&global_buffers, pdata, psize, limit);
return (0); return (CMD_RETURN_NORMAL);
} }
if (paste_replace(&s->buffers, data->buffer, pdata, psize) != 0) {
ctx->error(ctx, "no buffer %d", data->buffer); buffer = args_strtonum(args, 'b', 0, INT_MAX, &cause);
xfree(pdata); if (cause != NULL) {
return (-1); cmdq_error(cmdq, "buffer %s", cause);
free(cause);
free(pdata);
return (CMD_RETURN_ERROR);
} }
return (0);
if (paste_replace(&global_buffers, buffer, pdata, psize) != 0) {
cmdq_error(cmdq, "no buffer %d", buffer);
free(pdata);
return (CMD_RETURN_ERROR);
}
return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-set-environment.c,v 1.3 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,62 +27,68 @@
* Set an environment variable. * Set an environment variable.
*/ */
int cmd_set_environment_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_set_environment_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_set_environment_entry = { const struct cmd_entry cmd_set_environment_entry = {
"set-environment", "setenv", "set-environment", "setenv",
"grt:u", 1, 2,
"[-gru] " CMD_TARGET_SESSION_USAGE " name [value]", "[-gru] " CMD_TARGET_SESSION_USAGE " name [value]",
CMD_ARG12, "gru", 0,
NULL, NULL,
cmd_target_parse, NULL,
cmd_set_environment_exec, cmd_set_environment_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_set_environment_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_set_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct session *s; struct session *s;
struct environ *env; struct environ *env;
const char *name, *value;
if (*data->arg == '\0') { name = args->argv[0];
ctx->error(ctx, "empty variable name"); if (*name == '\0') {
return (-1); cmdq_error(cmdq, "empty variable name");
return (CMD_RETURN_ERROR);
} }
if (strchr(data->arg, '=') != NULL) { if (strchr(name, '=') != NULL) {
ctx->error(ctx, "variable name contains ="); cmdq_error(cmdq, "variable name contains =");
return (-1); return (CMD_RETURN_ERROR);
} }
if (cmd_check_flag(data->chflags, 'g')) if (args->argc < 2)
value = NULL;
else
value = args->argv[1];
if (args_has(self->args, 'g'))
env = &global_environ; env = &global_environ;
else { else {
if ((s = cmd_find_session(ctx, data->target)) == NULL) if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
env = &s->environ; env = &s->environ;
} }
if (cmd_check_flag(data->chflags, 'u')) { if (args_has(self->args, 'u')) {
if (data->arg2 != NULL) { if (value != NULL) {
ctx->error(ctx, "can't specify a value with -u"); cmdq_error(cmdq, "can't specify a value with -u");
return (-1); return (CMD_RETURN_ERROR);
} }
environ_unset(env, data->arg); environ_unset(env, name);
} else if (cmd_check_flag(data->chflags, 'r')) { } else if (args_has(self->args, 'r')) {
if (data->arg2 != NULL) { if (value != NULL) {
ctx->error(ctx, "can't specify a value with -r"); cmdq_error(cmdq, "can't specify a value with -r");
return (-1); return (CMD_RETURN_ERROR);
} }
environ_set(env, data->arg, NULL); environ_set(env, name, NULL);
} else { } else {
if (data->arg2 == NULL) { if (value == NULL) {
ctx->error(ctx, "no value specified"); cmdq_error(cmdq, "no value specified");
return (-1); return (CMD_RETURN_ERROR);
} }
environ_set(env, data->arg, data->arg2); environ_set(env, name, value);
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-set-option.c,v 1.96 2010-02-26 13:31:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,254 +27,152 @@
* Set an option. * Set an option.
*/ */
int cmd_set_option_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_set_option_exec(struct cmd *, struct cmd_q *);
const char *cmd_set_option_print( enum cmd_retval cmd_set_option_user(struct cmd *, struct cmd_q *,
const struct set_option_entry *, struct options_entry *); const char *, const char *);
void cmd_set_option_string(struct cmd_ctx *,
struct options *, const struct set_option_entry *, char *, int); int cmd_set_option_unset(struct cmd *, struct cmd_q *,
void cmd_set_option_number(struct cmd_ctx *, const struct options_table_entry *, struct options *,
struct options *, const struct set_option_entry *, char *); const char *);
void cmd_set_option_keys(struct cmd_ctx *, int cmd_set_option_set(struct cmd *, struct cmd_q *,
struct options *, const struct set_option_entry *, char *); const struct options_table_entry *, struct options *,
void cmd_set_option_colour(struct cmd_ctx *, const char *);
struct options *, const struct set_option_entry *, char *);
void cmd_set_option_attributes(struct cmd_ctx *, struct options_entry *cmd_set_option_string(struct cmd *, struct cmd_q *,
struct options *, const struct set_option_entry *, char *); const struct options_table_entry *, struct options *,
void cmd_set_option_flag(struct cmd_ctx *, const char *);
struct options *, const struct set_option_entry *, char *); struct options_entry *cmd_set_option_number(struct cmd *, struct cmd_q *,
void cmd_set_option_choice(struct cmd_ctx *, const struct options_table_entry *, struct options *,
struct options *, const struct set_option_entry *, char *); const char *);
struct options_entry *cmd_set_option_key(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
struct options_entry *cmd_set_option_colour(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
struct options_entry *cmd_set_option_attributes(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
struct options_entry *cmd_set_option_flag(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
struct options_entry *cmd_set_option_choice(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *,
const char *);
const struct cmd_entry cmd_set_option_entry = { const struct cmd_entry cmd_set_option_entry = {
"set-option", "set", "set-option", "set",
"[-agsuw] [-t target-session|target-window] option [value]", "agoqst:uw", 1, 2,
CMD_ARG12, "agsuw", "[-agosquw] [-t target-session|target-window] option [value]",
0,
NULL, NULL,
cmd_target_parse, NULL,
cmd_set_option_exec, cmd_set_option_exec
cmd_target_free,
cmd_target_print
}; };
const char *set_option_mode_keys_list[] = { const struct cmd_entry cmd_set_window_option_entry = {
"emacs", "vi", NULL "set-window-option", "setw",
}; "agoqt:u", 1, 2,
const char *set_option_clock_mode_style_list[] = { "[-agoqu] " CMD_TARGET_WINDOW_USAGE " option [value]",
"12", "24", NULL 0,
}; NULL,
const char *set_option_status_keys_list[] = { NULL,
"emacs", "vi", NULL cmd_set_option_exec
};
const char *set_option_status_justify_list[] = {
"left", "centre", "right", NULL
};
const char *set_option_bell_action_list[] = {
"none", "any", "current", NULL
}; };
const struct set_option_entry set_option_table[] = { enum cmd_retval
{ "escape-time", SET_OPTION_NUMBER, 0, INT_MAX, NULL }, cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
{ "quiet", SET_OPTION_FLAG, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL }
};
const struct set_option_entry set_session_option_table[] = {
{ "base-index", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "bell-action", SET_OPTION_CHOICE, 0, 0, set_option_bell_action_list },
{ "buffer-limit", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
{ "default-command", SET_OPTION_STRING, 0, 0, NULL },
{ "default-path", SET_OPTION_STRING, 0, 0, NULL },
{ "default-shell", SET_OPTION_STRING, 0, 0, NULL },
{ "default-terminal", SET_OPTION_STRING, 0, 0, NULL },
{ "display-panes-colour", SET_OPTION_COLOUR, 0, 0, NULL },
{ "display-panes-active-colour", SET_OPTION_COLOUR, 0, 0, NULL },
{ "display-panes-time", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
{ "display-time", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
{ "history-limit", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "lock-after-time", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "lock-command", SET_OPTION_STRING, 0, 0, NULL },
{ "lock-server", SET_OPTION_FLAG, 0, 0, NULL },
{ "message-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
{ "message-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "message-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "message-limit", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "mouse-select-pane", SET_OPTION_FLAG, 0, 0, NULL },
{ "pane-active-border-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "pane-active-border-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "pane-border-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "pane-border-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "prefix", SET_OPTION_KEYS, 0, 0, NULL },
{ "repeat-time", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
{ "set-remain-on-exit", SET_OPTION_FLAG, 0, 0, NULL },
{ "set-titles", SET_OPTION_FLAG, 0, 0, NULL },
{ "set-titles-string", SET_OPTION_STRING, 0, 0, NULL },
{ "status", SET_OPTION_FLAG, 0, 0, NULL },
{ "status-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
{ "status-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-interval", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "status-justify",
SET_OPTION_CHOICE, 0, 0, set_option_status_justify_list },
{ "status-keys", SET_OPTION_CHOICE, 0, 0, set_option_status_keys_list },
{ "status-left", SET_OPTION_STRING, 0, 0, NULL },
{ "status-left-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
{ "status-left-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-left-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-left-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
{ "status-right", SET_OPTION_STRING, 0, 0, NULL },
{ "status-right-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
{ "status-right-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-right-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "status-right-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL },
{ "status-utf8", SET_OPTION_FLAG, 0, 0, NULL },
{ "terminal-overrides", SET_OPTION_STRING, 0, 0, NULL },
{ "update-environment", SET_OPTION_STRING, 0, 0, NULL },
{ "visual-activity", SET_OPTION_FLAG, 0, 0, NULL },
{ "visual-bell", SET_OPTION_FLAG, 0, 0, NULL },
{ "visual-content", SET_OPTION_FLAG, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL }
};
const struct set_option_entry set_window_option_table[] = {
{ "aggressive-resize", SET_OPTION_FLAG, 0, 0, NULL },
{ "alternate-screen", SET_OPTION_FLAG, 0, 0, NULL },
{ "automatic-rename", SET_OPTION_FLAG, 0, 0, NULL },
{ "clock-mode-colour", SET_OPTION_COLOUR, 0, 0, NULL },
{ "clock-mode-style",
SET_OPTION_CHOICE, 0, 0, set_option_clock_mode_style_list },
{ "force-height", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "force-width", SET_OPTION_NUMBER, 0, INT_MAX, NULL },
{ "main-pane-height", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
{ "main-pane-width", SET_OPTION_NUMBER, 1, INT_MAX, NULL },
{ "mode-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
{ "mode-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "mode-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "mode-keys", SET_OPTION_CHOICE, 0, 0, set_option_mode_keys_list },
{ "mode-mouse", SET_OPTION_FLAG, 0, 0, NULL },
{ "monitor-activity", SET_OPTION_FLAG, 0, 0, NULL },
{ "monitor-content", SET_OPTION_STRING, 0, 0, NULL },
{ "remain-on-exit", SET_OPTION_FLAG, 0, 0, NULL },
{ "synchronize-panes", SET_OPTION_FLAG, 0, 0, NULL },
{ "utf8", SET_OPTION_FLAG, 0, 0, NULL },
{ "window-status-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
{ "window-status-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "window-status-current-attr", SET_OPTION_ATTRIBUTES, 0, 0, NULL },
{ "window-status-current-bg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "window-status-current-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "window-status-current-format", SET_OPTION_STRING, 0, 0, NULL },
{ "window-status-fg", SET_OPTION_COLOUR, 0, 0, NULL },
{ "window-status-format", SET_OPTION_STRING, 0, 0, NULL },
{ "word-separators", SET_OPTION_STRING, 0, 0, NULL },
{ "xterm-keys", SET_OPTION_FLAG, 0, 0, NULL },
{ NULL, 0, 0, 0, NULL }
};
int
cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
const struct set_option_entry *table; const struct options_table_entry *table, *oe;
struct session *s; struct session *s;
struct winlink *wl; struct winlink *wl;
struct client *c; struct client *c;
struct options *oo; struct options *oo;
const struct set_option_entry *entry, *opt; struct window *w;
struct jobs *jobs; const char *optstr, *valstr;
struct job *job, *nextjob; u_int i;
u_int i;
int try_again;
if (cmd_check_flag(data->chflags, 's')) { /* Get the option name and value. */
optstr = args->argv[0];
if (*optstr == '\0') {
cmdq_error(cmdq, "invalid option");
return (CMD_RETURN_ERROR);
}
if (args->argc < 2)
valstr = NULL;
else
valstr = args->argv[1];
/* Is this a user option? */
if (*optstr == '@')
return (cmd_set_option_user(self, cmdq, optstr, valstr));
/* Find the option entry, try each table. */
table = oe = NULL;
if (options_table_find(optstr, &table, &oe) != 0) {
cmdq_error(cmdq, "ambiguous option: %s", optstr);
return (CMD_RETURN_ERROR);
}
if (oe == NULL) {
cmdq_error(cmdq, "unknown option: %s", optstr);
return (CMD_RETURN_ERROR);
}
/* Work out the tree from the table. */
if (table == server_options_table)
oo = &global_options; oo = &global_options;
table = set_option_table; else if (table == window_options_table) {
} else if (cmd_check_flag(data->chflags, 'w')) { if (args_has(self->args, 'g'))
table = set_window_option_table;
if (cmd_check_flag(data->chflags, 'g'))
oo = &global_w_options; oo = &global_w_options;
else { else {
wl = cmd_find_window(ctx, data->target, NULL); wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
if (wl == NULL) if (wl == NULL)
return (-1); return (CMD_RETURN_ERROR);
oo = &wl->window->options; oo = &wl->window->options;
} }
} else { } else if (table == session_options_table) {
table = set_session_option_table; if (args_has(self->args, 'g'))
if (cmd_check_flag(data->chflags, 'g'))
oo = &global_s_options; oo = &global_s_options;
else { else {
s = cmd_find_session(ctx, data->target); s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL) if (s == NULL)
return (-1); return (CMD_RETURN_ERROR);
oo = &s->options; oo = &s->options;
} }
}
if (*data->arg == '\0') {
ctx->error(ctx, "invalid option");
return (-1);
}
entry = NULL;
for (opt = table; opt->name != NULL; opt++) {
if (strncmp(opt->name, data->arg, strlen(data->arg)) != 0)
continue;
if (entry != NULL) {
ctx->error(ctx, "ambiguous option: %s", data->arg);
return (-1);
}
entry = opt;
/* Bail now if an exact match. */
if (strcmp(entry->name, data->arg) == 0)
break;
}
if (entry == NULL) {
ctx->error(ctx, "unknown option: %s", data->arg);
return (-1);
}
if (cmd_check_flag(data->chflags, 'u')) {
if (cmd_check_flag(data->chflags, 'g')) {
ctx->error(ctx,
"can't unset global option: %s", entry->name);
return (-1);
}
if (data->arg2 != NULL) {
ctx->error(ctx,
"value passed to unset option: %s", entry->name);
return (-1);
}
options_remove(oo, entry->name);
ctx->info(ctx, "unset option: %s", entry->name);
} else { } else {
switch (entry->type) { cmdq_error(cmdq, "unknown table");
case SET_OPTION_STRING: return (CMD_RETURN_ERROR);
cmd_set_option_string(ctx, oo, entry, }
data->arg2, cmd_check_flag(data->chflags, 'a'));
break; /* Unset or set the option. */
case SET_OPTION_NUMBER: if (args_has(args, 'u')) {
cmd_set_option_number(ctx, oo, entry, data->arg2); if (cmd_set_option_unset(self, cmdq, oe, oo, valstr) != 0)
break; return (CMD_RETURN_ERROR);
case SET_OPTION_KEYS: } else {
cmd_set_option_keys(ctx, oo, entry, data->arg2); if (args_has(args, 'o') && options_find1(oo, optstr) != NULL) {
break; if (!args_has(args, 'q'))
case SET_OPTION_COLOUR: cmdq_print(cmdq, "already set: %s", optstr);
cmd_set_option_colour(ctx, oo, entry, data->arg2); return (CMD_RETURN_NORMAL);
break; }
case SET_OPTION_ATTRIBUTES: if (cmd_set_option_set(self, cmdq, oe, oo, valstr) != 0)
cmd_set_option_attributes(ctx, oo, entry, data->arg2); return (CMD_RETURN_ERROR);
break; }
case SET_OPTION_FLAG:
cmd_set_option_flag(ctx, oo, entry, data->arg2); /* Start or stop timers when automatic-rename changed. */
break; if (strcmp (oe->name, "automatic-rename") == 0) {
case SET_OPTION_CHOICE: for (i = 0; i < ARRAY_LENGTH(&windows); i++) {
cmd_set_option_choice(ctx, oo, entry, data->arg2); if ((w = ARRAY_ITEM(&windows, i)) == NULL)
break; continue;
if (options_get_number(&w->options, "automatic-rename"))
queue_window_name(w);
else if (event_initialized(&w->name_timer))
evtimer_del(&w->name_timer);
} }
} }
/* Update sizes and redraw. May not need it but meh. */
recalculate_sizes(); recalculate_sizes();
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i); c = ARRAY_ITEM(&clients, i);
@@ -282,226 +180,234 @@ cmd_set_option_exec(struct cmd *self, struct cmd_ctx *ctx)
server_redraw_client(c); server_redraw_client(c);
} }
/* return (CMD_RETURN_NORMAL);
* Special-case: kill all persistent jobs if status-left, status-right }
* or set-titles-string have changed. Persistent jobs are only used by
* the status line at the moment so this works XXX.
*/
if (strcmp(entry->name, "status-left") == 0 ||
strcmp(entry->name, "status-right") == 0 ||
strcmp(entry->name, "set-titles-string") == 0 ||
strcmp(entry->name, "window-status-format") == 0) {
for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
c = ARRAY_ITEM(&clients, i);
if (c == NULL || c->session == NULL)
continue;
jobs = &c->status_jobs; /* Set user option. */
do { enum cmd_retval
try_again = 0; cmd_set_option_user(struct cmd *self, struct cmd_q *cmdq, const char* optstr,
job = RB_ROOT(jobs); const char *valstr)
while (job != NULL) { {
nextjob = RB_NEXT(jobs, jobs, job); struct args *args = self->args;
if (job->flags & JOB_PERSIST) { struct session *s;
job_remove(jobs, job); struct winlink *wl;
try_again = 1; struct options *oo;
break;
} if (args_has(args, 's'))
job = nextjob; oo = &global_options;
} else if (args_has(self->args, 'w') ||
} while (try_again); self->entry == &cmd_set_window_option_entry) {
server_redraw_client(c); if (args_has(self->args, 'g'))
oo = &global_w_options;
else {
wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
if (wl == NULL)
return (CMD_RETURN_ERROR);
oo = &wl->window->options;
}
} else {
if (args_has(self->args, 'g'))
oo = &global_s_options;
else {
s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL)
return (CMD_RETURN_ERROR);
oo = &s->options;
} }
} }
if (args_has(args, 'u')) {
if (options_find1(oo, optstr) == NULL) {
cmdq_error(cmdq, "unknown option: %s", optstr);
return (CMD_RETURN_ERROR);
}
if (valstr != NULL) {
cmdq_error(cmdq, "value passed to unset option: %s",
optstr);
return (CMD_RETURN_ERROR);
}
options_remove(oo, optstr);
} else {
if (valstr == NULL) {
cmdq_error(cmdq, "empty value");
return (CMD_RETURN_ERROR);
}
if (args_has(args, 'o') && options_find1(oo, optstr) != NULL) {
if (!args_has(args, 'q'))
cmdq_print(cmdq, "already set: %s", optstr);
return (CMD_RETURN_NORMAL);
}
options_set_string(oo, optstr, "%s", valstr);
if (!args_has(args, 'q')) {
cmdq_info(cmdq, "set option: %s -> %s", optstr,
valstr);
}
}
return (CMD_RETURN_NORMAL);
}
/* Unset an option. */
int
cmd_set_option_unset(struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo, const char *value)
{
struct args *args = self->args;
if (args_has(args, 'g')) {
cmdq_error(cmdq, "can't unset global option: %s", oe->name);
return (-1);
}
if (value != NULL) {
cmdq_error(cmdq, "value passed to unset option: %s", oe->name);
return (-1);
}
options_remove(oo, oe->name);
if (!args_has(args, 'q'))
cmdq_info(cmdq, "unset option: %s", oe->name);
return (0); return (0);
} }
const char * /* Set an option. */
cmd_set_option_print( int
const struct set_option_entry *entry, struct options_entry *o) cmd_set_option_set(struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo, const char *value)
{ {
static char out[BUFSIZ]; struct args *args = self->args;
const char *s; struct options_entry *o;
struct keylist *keylist; const char *s;
u_int i;
*out = '\0'; if (oe->type != OPTIONS_TABLE_FLAG && value == NULL) {
switch (entry->type) { cmdq_error(cmdq, "empty value");
case SET_OPTION_STRING: return (-1);
xsnprintf(out, sizeof out, "\"%s\"", o->str);
break;
case SET_OPTION_NUMBER:
xsnprintf(out, sizeof out, "%lld", o->num);
break;
case SET_OPTION_KEYS:
keylist = o->data;
for (i = 0; i < ARRAY_LENGTH(keylist); i++) {
strlcat(out, key_string_lookup_key(
ARRAY_ITEM(keylist, i)), sizeof out);
if (i != ARRAY_LENGTH(keylist) - 1)
strlcat(out, ",", sizeof out);
}
break;
case SET_OPTION_COLOUR:
s = colour_tostring(o->num);
xsnprintf(out, sizeof out, "%s", s);
break;
case SET_OPTION_ATTRIBUTES:
s = attributes_tostring(o->num);
xsnprintf(out, sizeof out, "%s", s);
break;
case SET_OPTION_FLAG:
if (o->num)
strlcpy(out, "on", sizeof out);
else
strlcpy(out, "off", sizeof out);
break;
case SET_OPTION_CHOICE:
s = entry->choices[o->num];
xsnprintf(out, sizeof out, "%s", s);
break;
} }
return (out);
o = NULL;
switch (oe->type) {
case OPTIONS_TABLE_STRING:
o = cmd_set_option_string(self, cmdq, oe, oo, value);
break;
case OPTIONS_TABLE_NUMBER:
o = cmd_set_option_number(self, cmdq, oe, oo, value);
break;
case OPTIONS_TABLE_KEY:
o = cmd_set_option_key(self, cmdq, oe, oo, value);
break;
case OPTIONS_TABLE_COLOUR:
o = cmd_set_option_colour(self, cmdq, oe, oo, value);
break;
case OPTIONS_TABLE_ATTRIBUTES:
o = cmd_set_option_attributes(self, cmdq, oe, oo, value);
break;
case OPTIONS_TABLE_FLAG:
o = cmd_set_option_flag(self, cmdq, oe, oo, value);
break;
case OPTIONS_TABLE_CHOICE:
o = cmd_set_option_choice(self, cmdq, oe, oo, value);
break;
}
if (o == NULL)
return (-1);
s = options_table_print_entry(oe, o, 0);
if (!args_has(args, 'q'))
cmdq_info(cmdq, "set option: %s -> %s", oe->name, s);
return (0);
} }
void /* Set a string option. */
cmd_set_option_string(struct cmd_ctx *ctx, struct options *oo, struct options_entry *
const struct set_option_entry *entry, char *value, int append) cmd_set_option_string(struct cmd *self, unused struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo, const char *value)
{ {
struct args *args = self->args;
struct options_entry *o; struct options_entry *o;
char *oldvalue, *newvalue; char *oldval, *newval;
if (value == NULL) { if (args_has(args, 'a')) {
ctx->error(ctx, "empty value"); oldval = options_get_string(oo, oe->name);
return; xasprintf(&newval, "%s%s", oldval, value);
}
if (append) {
oldvalue = options_get_string(oo, entry->name);
xasprintf(&newvalue, "%s%s", oldvalue, value);
} else } else
newvalue = value; newval = xstrdup(value);
o = options_set_string(oo, entry->name, "%s", newvalue); o = options_set_string(oo, oe->name, "%s", newval);
ctx->info(ctx,
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
if (newvalue != value) free(newval);
xfree(newvalue); return (o);
} }
void /* Set a number option. */
cmd_set_option_number(struct cmd_ctx *ctx, struct options *oo, struct options_entry *
const struct set_option_entry *entry, char *value) cmd_set_option_number(unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo, const char *value)
{ {
struct options_entry *o; long long ll;
long long number; const char *errstr;
const char *errstr;
if (value == NULL) { ll = strtonum(value, oe->minimum, oe->maximum, &errstr);
ctx->error(ctx, "empty value");
return;
}
number = strtonum(value, entry->minimum, entry->maximum, &errstr);
if (errstr != NULL) { if (errstr != NULL) {
ctx->error(ctx, "value is %s: %s", errstr, value); cmdq_error(cmdq, "value is %s: %s", errstr, value);
return; return (NULL);
} }
o = options_set_number(oo, entry->name, number); return (options_set_number(oo, oe->name, ll));
ctx->info(ctx,
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
} }
void /* Set a key option. */
cmd_set_option_keys(struct cmd_ctx *ctx, struct options *oo, struct options_entry *
const struct set_option_entry *entry, char *value) cmd_set_option_key(unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo, const char *value)
{ {
struct options_entry *o; int key;
struct keylist *keylist;
char *copyvalue, *ptr, *str;
int key;
if (value == NULL) { if ((key = key_string_lookup_string(value)) == KEYC_NONE) {
ctx->error(ctx, "empty value"); cmdq_error(cmdq, "bad key: %s", value);
return; return (NULL);
} }
keylist = xmalloc(sizeof *keylist); return (options_set_number(oo, oe->name, key));
ARRAY_INIT(keylist);
ptr = copyvalue = xstrdup(value);
while ((str = strsep(&ptr, ",")) != NULL) {
if ((key = key_string_lookup_string(str)) == KEYC_NONE) {
xfree(keylist);
ctx->error(ctx, "unknown key: %s", str);
xfree(copyvalue);
return;
}
ARRAY_ADD(keylist, key);
}
xfree(copyvalue);
o = options_set_data(oo, entry->name, keylist, xfree);
ctx->info(ctx,
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
} }
void /* Set a colour option. */
cmd_set_option_colour(struct cmd_ctx *ctx, struct options *oo, struct options_entry *
const struct set_option_entry *entry, char *value) cmd_set_option_colour(unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo, const char *value)
{ {
struct options_entry *o; int colour;
int colour;
if (value == NULL) {
ctx->error(ctx, "empty value");
return;
}
if ((colour = colour_fromstring(value)) == -1) { if ((colour = colour_fromstring(value)) == -1) {
ctx->error(ctx, "bad colour: %s", value); cmdq_error(cmdq, "bad colour: %s", value);
return; return (NULL);
} }
o = options_set_number(oo, entry->name, colour); return (options_set_number(oo, oe->name, colour));
ctx->info(ctx,
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
} }
void /* Set an attributes option. */
cmd_set_option_attributes(struct cmd_ctx *ctx, struct options *oo, struct options_entry *
const struct set_option_entry *entry, char *value) cmd_set_option_attributes(unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo, const char *value)
{ {
struct options_entry *o; int attr;
int attr;
if (value == NULL) {
ctx->error(ctx, "empty value");
return;
}
if ((attr = attributes_fromstring(value)) == -1) { if ((attr = attributes_fromstring(value)) == -1) {
ctx->error(ctx, "bad attributes: %s", value); cmdq_error(cmdq, "bad attributes: %s", value);
return; return (NULL);
} }
o = options_set_number(oo, entry->name, attr); return (options_set_number(oo, oe->name, attr));
ctx->info(ctx,
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
} }
void /* Set a flag option. */
cmd_set_option_flag(struct cmd_ctx *ctx, struct options *oo, struct options_entry *
const struct set_option_entry *entry, char *value) cmd_set_option_flag(unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo, const char *value)
{ {
struct options_entry *o; int flag;
int flag;
if (value == NULL || *value == '\0') if (value == NULL || *value == '\0')
flag = !options_get_number(oo, entry->name); flag = !options_get_number(oo, oe->name);
else { else {
if ((value[0] == '1' && value[1] == '\0') || if ((value[0] == '1' && value[1] == '\0') ||
strcasecmp(value, "on") == 0 || strcasecmp(value, "on") == 0 ||
@@ -512,47 +418,39 @@ cmd_set_option_flag(struct cmd_ctx *ctx, struct options *oo,
strcasecmp(value, "no") == 0) strcasecmp(value, "no") == 0)
flag = 0; flag = 0;
else { else {
ctx->error(ctx, "bad value: %s", value); cmdq_error(cmdq, "bad value: %s", value);
return; return (NULL);
} }
} }
o = options_set_number(oo, entry->name, flag); return (options_set_number(oo, oe->name, flag));
ctx->info(ctx,
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
} }
void /* Set a choice option. */
cmd_set_option_choice(struct cmd_ctx *ctx, struct options *oo, struct options_entry *
const struct set_option_entry *entry, char *value) cmd_set_option_choice(unused struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *oe, struct options *oo,
const char *value)
{ {
struct options_entry *o; const char **choicep;
const char **choicep; int n, choice = -1;
int n, choice = -1;
if (value == NULL) {
ctx->error(ctx, "empty value");
return;
}
n = 0; n = 0;
for (choicep = entry->choices; *choicep != NULL; choicep++) { for (choicep = oe->choices; *choicep != NULL; choicep++) {
n++; n++;
if (strncmp(*choicep, value, strlen(value)) != 0) if (strncmp(*choicep, value, strlen(value)) != 0)
continue; continue;
if (choice != -1) { if (choice != -1) {
ctx->error(ctx, "ambiguous option value: %s", value); cmdq_error(cmdq, "ambiguous value: %s", value);
return; return (NULL);
} }
choice = n - 1; choice = n - 1;
} }
if (choice == -1) { if (choice == -1) {
ctx->error(ctx, "unknown option value: %s", value); cmdq_error(cmdq, "unknown value: %s", value);
return; return (NULL);
} }
o = options_set_number(oo, entry->name, choice); return (options_set_number(oo, oe->name, choice));
ctx->info(ctx,
"set option: %s -> %s", o->name, cmd_set_option_print(entry, o));
} }

View File

@@ -1,101 +0,0 @@
/* $Id: cmd-show-buffer.c,v 1.12 2009-12-04 22:14:47 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/types.h>
#include "tmux.h"
/*
* Show a session paste buffer.
*/
int cmd_show_buffer_exec(struct cmd *, struct cmd_ctx *);
const struct cmd_entry cmd_show_buffer_entry = {
"show-buffer", "showb",
CMD_BUFFER_SESSION_USAGE,
0, "",
cmd_buffer_init,
cmd_buffer_parse,
cmd_show_buffer_exec,
cmd_buffer_free,
cmd_buffer_print
};
int
cmd_show_buffer_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_buffer_data *data = self->data;
struct session *s;
struct paste_buffer *pb;
char *in, *buf, *ptr;
size_t size, len;
u_int width;
if ((s = cmd_find_session(ctx, data->target)) == NULL)
return (-1);
if (data->buffer == -1) {
if ((pb = paste_get_top(&s->buffers)) == NULL) {
ctx->error(ctx, "no buffers");
return (-1);
}
} else if ((pb = paste_get_index(&s->buffers, data->buffer)) == NULL) {
ctx->error(ctx, "no buffer %d", data->buffer);
return (-1);
}
if (pb == NULL)
return (0);
size = pb->size;
if (size > SIZE_MAX / 4 - 1)
size = SIZE_MAX / 4 - 1;
in = xmalloc(size * 4 + 1);
strvisx(in, pb->data, size, VIS_OCTAL|VIS_TAB);
width = s->sx;
if (ctx->cmdclient != NULL)
width = ctx->cmdclient->tty.sx;
buf = xmalloc(width + 1);
len = 0;
ptr = in;
do {
buf[len++] = *ptr++;
if (len == width || buf[len - 1] == '\n') {
if (buf[len - 1] == '\n')
len--;
buf[len] = '\0';
ctx->print(ctx, "%s", buf);
len = 0;
}
} while (*ptr != '\0');
if (len != 0) {
buf[len] = '\0';
ctx->print(ctx, "%s", buf);
}
xfree(buf);
xfree(in);
return (0);
}

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-show-environment.c,v 1.2 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,41 +27,53 @@
* Show environment. * Show environment.
*/ */
int cmd_show_environment_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_show_environment_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_show_environment_entry = { const struct cmd_entry cmd_show_environment_entry = {
"show-environment", "showenv", "show-environment", "showenv",
"[-g] " CMD_TARGET_SESSION_USAGE, "gt:", 0, 1,
0, "g", "[-g] " CMD_TARGET_SESSION_USAGE " [name]",
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_show_environment_exec, NULL,
cmd_target_free, cmd_show_environment_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_show_environment_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct session *s; struct session *s;
struct environ *env; struct environ *env;
struct environ_entry *envent; struct environ_entry *envent;
if (cmd_check_flag(data->chflags, 'g')) if (args_has(self->args, 'g'))
env = &global_environ; env = &global_environ;
else { else {
if ((s = cmd_find_session(ctx, data->target)) == NULL) if ((s = cmd_find_session(cmdq, args_get(args, 't'), 0)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
env = &s->environ; env = &s->environ;
} }
if (args->argc != 0) {
envent = environ_find(env, args->argv[0]);
if (envent == NULL) {
cmdq_error(cmdq, "unknown variable: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
}
if (envent->value != NULL)
cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
else
cmdq_print(cmdq, "-%s", envent->name);
return (CMD_RETURN_NORMAL);
}
RB_FOREACH(envent, environ, env) { RB_FOREACH(envent, environ, env) {
if (envent->value != NULL) if (envent->value != NULL)
ctx->print(ctx, "%s=%s", envent->name, envent->value); cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
else else
ctx->print(ctx, "-%s", envent->name); cmdq_print(cmdq, "-%s", envent->name);
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-show-messages.c,v 1.2 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,30 +27,29 @@
* Show client message log. * Show client message log.
*/ */
int cmd_show_messages_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_show_messages_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_show_messages_entry = { const struct cmd_entry cmd_show_messages_entry = {
"show-messages", "showmsgs", "show-messages", "showmsgs",
"t:", 0, 0,
CMD_TARGET_CLIENT_USAGE, CMD_TARGET_CLIENT_USAGE,
0, "", 0,
cmd_target_init, NULL,
cmd_target_parse, NULL,
cmd_show_messages_exec, cmd_show_messages_exec
cmd_target_free,
cmd_target_print
}; };
int enum cmd_retval
cmd_show_messages_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_show_messages_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct client *c; struct client *c;
struct message_entry *msg; struct message_entry *msg;
char *tim; char *tim;
u_int i; u_int i;
if ((c = cmd_find_client(ctx, data->target)) == NULL) if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
for (i = 0; i < ARRAY_LENGTH(&c->message_log); i++) { for (i = 0; i < ARRAY_LENGTH(&c->message_log); i++) {
msg = &ARRAY_ITEM(&c->message_log, i); msg = &ARRAY_ITEM(&c->message_log, i);
@@ -58,8 +57,8 @@ cmd_show_messages_exec(struct cmd *self, struct cmd_ctx *ctx)
tim = ctime(&msg->msg_time); tim = ctime(&msg->msg_time);
*strchr(tim, '\n') = '\0'; *strchr(tim, '\n') = '\0';
ctx->print(ctx, "%s %s", tim, msg->msg); cmdq_print(cmdq, "%s %s", tim, msg->msg);
} }
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-show-options.c,v 1.21 2009-12-10 16:59:02 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,62 +27,147 @@
* Show options. * Show options.
*/ */
int cmd_show_options_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_show_options_exec(struct cmd *, struct cmd_q *);
enum cmd_retval cmd_show_options_one(struct cmd *, struct cmd_q *,
struct options *, int);
enum cmd_retval cmd_show_options_all(struct cmd *, struct cmd_q *,
const struct options_table_entry *, struct options *);
const struct cmd_entry cmd_show_options_entry = { const struct cmd_entry cmd_show_options_entry = {
"show-options", "show", "show-options", "show",
"[-gsw] [-t target-session|target-window]", "gqst:vw", 0, 1,
0, "gsw", "[-gqsvw] [-t target-session|target-window] [option]",
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_show_options_exec, NULL,
cmd_target_free, cmd_show_options_exec
cmd_target_print
}; };
int const struct cmd_entry cmd_show_window_options_entry = {
cmd_show_options_exec(struct cmd *self, struct cmd_ctx *ctx) "show-window-options", "showw",
{ "gvt:", 0, 1,
struct cmd_target_data *data = self->data; "[-gv] " CMD_TARGET_WINDOW_USAGE " [option]",
const struct set_option_entry *table; 0,
struct session *s; NULL,
struct winlink *wl; NULL,
struct options *oo; cmd_show_options_exec
struct options_entry *o; };
const struct set_option_entry *entry;
const char *optval;
if (cmd_check_flag(data->chflags, 's')) { enum cmd_retval
cmd_show_options_exec(struct cmd *self, struct cmd_q *cmdq)
{
struct args *args = self->args;
struct session *s;
struct winlink *wl;
const struct options_table_entry *table;
struct options *oo;
int quiet;
if (args_has(self->args, 's')) {
oo = &global_options; oo = &global_options;
table = set_option_table; table = server_options_table;
} else if (cmd_check_flag(data->chflags, 'w')) { } else if (args_has(self->args, 'w') ||
table = set_window_option_table; self->entry == &cmd_show_window_options_entry) {
if (cmd_check_flag(data->chflags, 'g')) table = window_options_table;
if (args_has(self->args, 'g'))
oo = &global_w_options; oo = &global_w_options;
else { else {
wl = cmd_find_window(ctx, data->target, NULL); wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
if (wl == NULL) if (wl == NULL)
return (-1); return (CMD_RETURN_ERROR);
oo = &wl->window->options; oo = &wl->window->options;
} }
} else { } else {
table = set_session_option_table; table = session_options_table;
if (cmd_check_flag(data->chflags, 'g')) if (args_has(self->args, 'g'))
oo = &global_s_options; oo = &global_s_options;
else { else {
s = cmd_find_session(ctx, data->target); s = cmd_find_session(cmdq, args_get(args, 't'), 0);
if (s == NULL) if (s == NULL)
return (-1); return (CMD_RETURN_ERROR);
oo = &s->options; oo = &s->options;
} }
} }
for (entry = table; entry->name != NULL; entry++) { quiet = args_has(self->args, 'q');
if ((o = options_find1(oo, entry->name)) == NULL) if (args->argc == 0)
continue; return (cmd_show_options_all(self, cmdq, table, oo));
optval = cmd_set_option_print(entry, o); else
ctx->print(ctx, "%s %s", entry->name, optval); return (cmd_show_options_one(self, cmdq, oo, quiet));
}
enum cmd_retval
cmd_show_options_one(struct cmd *self, struct cmd_q *cmdq,
struct options *oo, int quiet)
{
struct args *args = self->args;
const struct options_table_entry *table, *oe;
struct options_entry *o;
const char *optval;
if (*args->argv[0] == '@') {
if ((o = options_find1(oo, args->argv[0])) == NULL) {
if (quiet)
return (CMD_RETURN_NORMAL);
cmdq_error(cmdq, "unknown option: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
}
if (args_has(self->args, 'v'))
cmdq_print(cmdq, "%s", o->str);
else
cmdq_print(cmdq, "%s \"%s\"", o->name, o->str);
return (CMD_RETURN_NORMAL);
} }
return (0); table = oe = NULL;
if (options_table_find(args->argv[0], &table, &oe) != 0) {
cmdq_error(cmdq, "ambiguous option: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
}
if (oe == NULL) {
if (quiet)
return (CMD_RETURN_NORMAL);
cmdq_error(cmdq, "unknown option: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
}
if ((o = options_find1(oo, oe->name)) == NULL)
return (CMD_RETURN_NORMAL);
optval = options_table_print_entry(oe, o, args_has(self->args, 'v'));
if (args_has(self->args, 'v'))
cmdq_print(cmdq, "%s", optval);
else
cmdq_print(cmdq, "%s %s", oe->name, optval);
return (CMD_RETURN_NORMAL);
}
enum cmd_retval
cmd_show_options_all(struct cmd *self, struct cmd_q *cmdq,
const struct options_table_entry *table, struct options *oo)
{
const struct options_table_entry *oe;
struct options_entry *o;
const char *optval;
RB_FOREACH(o, options_tree, &oo->tree) {
if (*o->name == '@') {
if (args_has(self->args, 'v'))
cmdq_print(cmdq, "%s", o->str);
else
cmdq_print(cmdq, "%s \"%s\"", o->name, o->str);
}
}
for (oe = table; oe->name != NULL; oe++) {
if ((o = options_find1(oo, oe->name)) == NULL)
continue;
optval = options_table_print_entry(oe, o,
args_has(self->args, 'v'));
if (args_has(self->args, 'v'))
cmdq_print(cmdq, "%s", optval);
else
cmdq_print(cmdq, "%s %s", oe->name, optval);
}
return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-source-file.c,v 1.13 2010-02-08 18:29:32 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Tiago Cunha <me@tiagocunha.org> * Copyright (c) 2008 Tiago Cunha <me@tiagocunha.org>
@@ -18,114 +18,91 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdlib.h>
#include "tmux.h" #include "tmux.h"
/* /*
* Sources a configuration file. * Sources a configuration file.
*/ */
int cmd_source_file_parse(struct cmd *, int, char **, char **); enum cmd_retval cmd_source_file_exec(struct cmd *, struct cmd_q *);
int cmd_source_file_exec(struct cmd *, struct cmd_ctx *);
void cmd_source_file_free(struct cmd *);
void cmd_source_file_init(struct cmd *, int);
size_t cmd_source_file_print(struct cmd *, char *, size_t);
struct cmd_source_file_data { void cmd_source_file_show(struct cmd_q *);
char *path; void cmd_source_file_done(struct cmd_q *);
};
const struct cmd_entry cmd_source_file_entry = { const struct cmd_entry cmd_source_file_entry = {
"source-file", "source", "source-file", "source",
"", 1, 1,
"path", "path",
0, "", 0,
cmd_source_file_init, NULL,
cmd_source_file_parse, NULL,
cmd_source_file_exec, cmd_source_file_exec
cmd_source_file_free,
cmd_source_file_print
}; };
/* ARGSUSED */ enum cmd_retval
void cmd_source_file_exec(struct cmd *self, struct cmd_q *cmdq)
cmd_source_file_init(struct cmd *self, unused int arg)
{ {
struct cmd_source_file_data *data; struct args *args = self->args;
struct cmd_q *cmdq1;
char *cause;
self->data = data = xmalloc(sizeof *data); cmdq1 = cmdq_new(NULL);
data->path = NULL; cmdq1->emptyfn = cmd_source_file_done;
} cmdq1->data = cmdq;
int switch (load_cfg(args->argv[0], cmdq1, &cause)) {
cmd_source_file_parse(struct cmd *self, int argc, char **argv, char **cause) case -1:
{ if (cfg_references == 0) {
struct cmd_source_file_data *data; cmdq_free(cmdq1);
int opt; cmdq_error(cmdq, "%s", cause);
free(cause);
self->entry->init(self, KEYC_NONE); return (CMD_RETURN_ERROR);
data = self->data;
while ((opt = getopt(argc, argv, "")) != -1) {
switch (opt) {
default:
goto usage;
} }
} ARRAY_ADD(&cfg_causes, cause);
argc -= optind; /* FALLTHROUGH */
argv += optind; case 0:
if (argc != 1) if (cfg_references == 0)
goto usage; cmd_source_file_show(cmdq);
cmdq_free(cmdq1);
data->path = xstrdup(argv[0]); return (CMD_RETURN_NORMAL);
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
self->entry->free(self);
return (-1);
}
int
cmd_source_file_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_source_file_data *data = self->data;
struct causelist causes;
char *cause;
u_int i;
ARRAY_INIT(&causes);
if (load_cfg(data->path, ctx, &causes) != 0) {
for (i = 0; i < ARRAY_LENGTH(&causes); i++) {
cause = ARRAY_ITEM(&causes, i);
ctx->print(ctx, "%s", cause);
xfree(cause);
}
ARRAY_FREE(&causes);
} }
return (0); cmdq->references++;
cfg_references++;
cmdq_continue(cmdq1);
return (CMD_RETURN_WAIT);
} }
void void
cmd_source_file_free(struct cmd *self) cmd_source_file_show(struct cmd_q *cmdq)
{ {
struct cmd_source_file_data *data = self->data; u_int i;
char *cause;
if (data->path != NULL) for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) {
xfree(data->path); cause = ARRAY_ITEM(&cfg_causes, i);
xfree(data); cmdq_print(cmdq, "%s", cause);
free(cause);
}
ARRAY_FREE(&cfg_causes);
} }
size_t void
cmd_source_file_print(struct cmd *self, char *buf, size_t len) cmd_source_file_done(struct cmd_q *cmdq1)
{ {
struct cmd_source_file_data *data = self->data; struct cmd_q *cmdq = cmdq1->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name); cmdq_free(cmdq1);
if (data == NULL)
return (off); cfg_references--;
if (off < len && data->path != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->path); if (cmdq_free(cmdq))
return (off); return;
if (cfg_references == 0)
cmd_source_file_show(cmdq);
cmdq_continue(cmdq);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-split-window.c,v 1.34 2010-01-08 16:31:35 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,165 +27,89 @@
* Split a window (add a new pane). * Split a window (add a new pane).
*/ */
int cmd_split_window_parse(struct cmd *, int, char **, char **); void cmd_split_window_key_binding(struct cmd *, int);
int cmd_split_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_split_window_exec(struct cmd *, struct cmd_q *);
void cmd_split_window_free(struct cmd *);
void cmd_split_window_init(struct cmd *, int);
size_t cmd_split_window_print(struct cmd *, char *, size_t);
struct cmd_split_window_data {
char *target;
char *cmd;
int flag_detached;
int flag_horizontal;
int percentage;
int size;
};
const struct cmd_entry cmd_split_window_entry = { const struct cmd_entry cmd_split_window_entry = {
"split-window", "splitw", "split-window", "splitw",
"[-dhv] [-p percentage|-l size] [-t target-pane] [command]", "c:dF:l:hp:Pt:v", 0, 1,
0, "", "[-dhvP] [-c start-directory] [-F format] [-p percentage|-l size] "
cmd_split_window_init, CMD_TARGET_PANE_USAGE " [command]",
cmd_split_window_parse, 0,
cmd_split_window_exec, cmd_split_window_key_binding,
cmd_split_window_free, NULL,
cmd_split_window_print cmd_split_window_exec
}; };
void void
cmd_split_window_init(struct cmd *self, int key) cmd_split_window_key_binding(struct cmd *self, int key)
{ {
struct cmd_split_window_data *data; self->args = args_create(0);
if (key == '%')
self->data = data = xmalloc(sizeof *data); args_set(self->args, 'h', NULL);
data->target = NULL;
data->cmd = NULL;
data->flag_detached = 0;
data->flag_horizontal = 0;
data->percentage = -1;
data->size = -1;
switch (key) {
case '%':
data->flag_horizontal = 1;
break;
case '"':
data->flag_horizontal = 0;
break;
}
} }
int enum cmd_retval
cmd_split_window_parse(struct cmd *self, int argc, char **argv, char **cause) cmd_split_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_split_window_data *data; struct args *args = self->args;
int opt; struct session *s;
const char *errstr; struct winlink *wl;
struct window *w;
struct window_pane *wp, *new_wp = NULL;
struct environ env;
const char *cmd, *cwd, *shell;
char *cause, *new_cause;
u_int hlimit;
int size, percentage;
enum layout_type type;
struct layout_cell *lc;
const char *template;
struct client *c;
struct format_tree *ft;
char *cp;
self->entry->init(self, KEYC_NONE); if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), &s, &wp)) == NULL)
data = self->data; return (CMD_RETURN_ERROR);
while ((opt = getopt(argc, argv, "dhl:p:t:v")) != -1) {
switch (opt) {
case 'd':
data->flag_detached = 1;
break;
case 'h':
data->flag_horizontal = 1;
break;
case 't':
if (data->target == NULL)
data->target = xstrdup(optarg);
break;
case 'l':
if (data->percentage != -1 || data->size != -1)
break;
data->size = strtonum(optarg, 1, INT_MAX, &errstr);
if (errstr != NULL) {
xasprintf(cause, "size %s", errstr);
goto error;
}
break;
case 'p':
if (data->size != -1 || data->percentage != -1)
break;
data->percentage = strtonum(optarg, 1, 100, &errstr);
if (errstr != NULL) {
xasprintf(cause, "percentage %s", errstr);
goto error;
}
break;
case 'v':
data->flag_horizontal = 0;
break;
default:
goto usage;
}
}
argc -= optind;
argv += optind;
if (argc != 0 && argc != 1)
goto usage;
if (argc == 1)
data->cmd = xstrdup(argv[0]);
return (0);
usage:
xasprintf(cause, "usage: %s %s", self->entry->name, self->entry->usage);
error:
self->entry->free(self);
return (-1);
}
int
cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
struct cmd_split_window_data *data = self->data;
struct session *s;
struct winlink *wl;
struct window *w;
struct window_pane *wp, *new_wp = NULL;
struct environ env;
char *cmd, *cwd, *cause;
const char *shell;
u_int hlimit;
int size;
enum layout_type type;
struct layout_cell *lc;
if ((wl = cmd_find_pane(ctx, data->target, &s, &wp)) == NULL)
return (-1);
w = wl->window; w = wl->window;
server_unzoom_window(w);
environ_init(&env); environ_init(&env);
environ_copy(&global_environ, &env); environ_copy(&global_environ, &env);
environ_copy(&s->environ, &env); environ_copy(&s->environ, &env);
server_fill_environ(s, &env); server_fill_environ(s, &env);
cmd = data->cmd; if (args->argc == 0)
if (cmd == NULL)
cmd = options_get_string(&s->options, "default-command"); cmd = options_get_string(&s->options, "default-command");
if (ctx->cmdclient == NULL || ctx->cmdclient->cwd == NULL)
cwd = options_get_string(&s->options, "default-path");
else else
cwd = ctx->cmdclient->cwd; cmd = args->argv[0];
cwd = cmd_get_default_path(cmdq, args_get(args, 'c'));
type = LAYOUT_TOPBOTTOM; type = LAYOUT_TOPBOTTOM;
if (data->flag_horizontal) if (args_has(args, 'h'))
type = LAYOUT_LEFTRIGHT; type = LAYOUT_LEFTRIGHT;
size = -1; size = -1;
if (data->size != -1) if (args_has(args, 'l')) {
size = data->size; size = args_strtonum(args, 'l', 0, INT_MAX, &cause);
else if (data->percentage != -1) { if (cause != NULL) {
xasprintf(&new_cause, "size %s", cause);
free(cause);
cause = new_cause;
goto error;
}
} else if (args_has(args, 'p')) {
percentage = args_strtonum(args, 'p', 0, INT_MAX, &cause);
if (cause != NULL) {
xasprintf(&new_cause, "percentage %s", cause);
free(cause);
cause = new_cause;
goto error;
}
if (type == LAYOUT_TOPBOTTOM) if (type == LAYOUT_TOPBOTTOM)
size = (wp->sy * data->percentage) / 100; size = (wp->sy * percentage) / 100;
else else
size = (wp->sx * data->percentage) / 100; size = (wp->sx * percentage) / 100;
} }
hlimit = options_get_number(&s->options, "history-limit"); hlimit = options_get_number(&s->options, "history-limit");
@@ -193,7 +117,7 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
if (*shell == '\0' || areshell(shell)) if (*shell == '\0' || areshell(shell))
shell = _PATH_BSHELL; shell = _PATH_BSHELL;
if ((lc = layout_split_pane(wp, type, size)) == NULL) { if ((lc = layout_split_pane(wp, type, size, 0)) == NULL) {
cause = xstrdup("pane too small"); cause = xstrdup("pane too small");
goto error; goto error;
} }
@@ -205,7 +129,7 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
server_redraw_window(w); server_redraw_window(w);
if (!data->flag_detached) { if (!args_has(args, 'd')) {
window_set_active_pane(w, new_wp); window_set_active_pane(w, new_wp);
session_select(s, wl->idx); session_select(s, wl->idx);
server_redraw_session(s); server_redraw_session(s);
@@ -213,51 +137,32 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx)
server_status_session(s); server_status_session(s);
environ_free(&env); environ_free(&env);
return (0);
if (args_has(args, 'P')) {
if ((template = args_get(args, 'F')) == NULL)
template = SPLIT_WINDOW_TEMPLATE;
ft = format_create();
if ((c = cmd_find_client(cmdq, NULL, 1)) != NULL)
format_client(ft, c);
format_session(ft, s);
format_winlink(ft, s, wl);
format_window_pane(ft, new_wp);
cp = format_expand(ft, template);
cmdq_print(cmdq, "%s", cp);
free(cp);
format_free(ft);
}
notify_window_layout_changed(w);
return (CMD_RETURN_NORMAL);
error: error:
environ_free(&env); environ_free(&env);
if (new_wp != NULL) if (new_wp != NULL)
window_remove_pane(w, new_wp); window_remove_pane(w, new_wp);
ctx->error(ctx, "create pane failed: %s", cause); cmdq_error(cmdq, "create pane failed: %s", cause);
xfree(cause); free(cause);
return (-1); return (CMD_RETURN_ERROR);
}
void
cmd_split_window_free(struct cmd *self)
{
struct cmd_split_window_data *data = self->data;
if (data->target != NULL)
xfree(data->target);
if (data->cmd != NULL)
xfree(data->cmd);
xfree(data);
}
size_t
cmd_split_window_print(struct cmd *self, char *buf, size_t len)
{
struct cmd_split_window_data *data = self->data;
size_t off = 0;
off += xsnprintf(buf, len, "%s", self->entry->name);
if (data == NULL)
return (off);
if (off < len && data->flag_detached)
off += xsnprintf(buf + off, len - off, " -d");
if (off < len && data->flag_horizontal)
off += xsnprintf(buf + off, len - off, " -h");
if (off < len && data->size > 0)
off += xsnprintf(buf + off, len - off, " -l %d", data->size);
if (off < len && data->percentage > 0) {
off += xsnprintf(
buf + off, len - off, " -p %d", data->percentage);
}
if (off < len && data->target != NULL)
off += cmd_prarg(buf + off, len - off, " -t ", data->target);
if (off < len && data->cmd != NULL)
off += cmd_prarg(buf + off, len - off, " ", data->cmd);
return (off);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-start-server.c,v 1.10 2009-11-28 14:50:36 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -24,22 +24,20 @@
* Start the server and do nothing else. * Start the server and do nothing else.
*/ */
int cmd_start_server_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_start_server_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_start_server_entry = { const struct cmd_entry cmd_start_server_entry = {
"start-server", "start", "start-server", "start",
"", 0, 0,
"", "",
CMD_STARTSERVER, "", CMD_STARTSERVER,
NULL, NULL,
NULL, NULL,
cmd_start_server_exec, cmd_start_server_exec
NULL,
NULL
}; };
/* ARGSUSED */ enum cmd_retval
int cmd_start_server_exec(unused struct cmd *self, unused struct cmd_q *cmdq)
cmd_start_server_exec(unused struct cmd *self, unused struct cmd_ctx *ctx)
{ {
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-string.c,v 1.31 2010-02-26 13:27:38 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -31,11 +31,12 @@
* Parse a command from a string. * Parse a command from a string.
*/ */
int cmd_string_getc(const char *, size_t *); int cmd_string_getc(const char *, size_t *);
void cmd_string_ungetc(size_t *); void cmd_string_ungetc(size_t *);
char *cmd_string_string(const char *, size_t *, char, int); void cmd_string_copy(char **, char *, size_t *);
char *cmd_string_variable(const char *, size_t *); char *cmd_string_string(const char *, size_t *, char, int);
char *cmd_string_expand_tilde(const char *, size_t *); char *cmd_string_variable(const char *, size_t *);
char *cmd_string_expand_tilde(const char *, size_t *);
int int
cmd_string_getc(const char *s, size_t *p) cmd_string_getc(const char *s, size_t *p)
@@ -58,7 +59,8 @@ cmd_string_ungetc(size_t *p)
* string, or NULL for empty command. * string, or NULL for empty command.
*/ */
int int
cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause) cmd_string_parse(const char *s, struct cmd_list **cmdlist, const char *file,
u_int line, char **cause)
{ {
size_t p; size_t p;
int ch, i, argc, rval; int ch, i, argc, rval;
@@ -84,26 +86,17 @@ cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause)
case '\'': case '\'':
if ((t = cmd_string_string(s, &p, '\'', 0)) == NULL) if ((t = cmd_string_string(s, &p, '\'', 0)) == NULL)
goto error; goto error;
buf = xrealloc(buf, 1, len + strlen(t) + 1); cmd_string_copy(&buf, t, &len);
strlcpy(buf + len, t, strlen(t) + 1);
len += strlen(t);
xfree(t);
break; break;
case '"': case '"':
if ((t = cmd_string_string(s, &p, '"', 1)) == NULL) if ((t = cmd_string_string(s, &p, '"', 1)) == NULL)
goto error; goto error;
buf = xrealloc(buf, 1, len + strlen(t) + 1); cmd_string_copy(&buf, t, &len);
strlcpy(buf + len, t, strlen(t) + 1);
len += strlen(t);
xfree(t);
break; break;
case '$': case '$':
if ((t = cmd_string_variable(s, &p)) == NULL) if ((t = cmd_string_variable(s, &p)) == NULL)
goto error; goto error;
buf = xrealloc(buf, 1, len + strlen(t) + 1); cmd_string_copy(&buf, t, &len);
strlcpy(buf + len, t, strlen(t) + 1);
len += strlen(t);
xfree(t);
break; break;
case '#': case '#':
/* Comment: discard rest of line. */ /* Comment: discard rest of line. */
@@ -139,7 +132,7 @@ cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause)
if (argc == 0) if (argc == 0)
goto out; goto out;
*cmdlist = cmd_list_parse(argc, argv, cause); *cmdlist = cmd_list_parse(argc, argv, file, line, cause);
if (*cmdlist == NULL) if (*cmdlist == NULL)
goto out; goto out;
@@ -147,12 +140,10 @@ cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause)
goto out; goto out;
case '~': case '~':
if (buf == NULL) { if (buf == NULL) {
if ((t = cmd_string_expand_tilde(s, &p)) == NULL) t = cmd_string_expand_tilde(s, &p);
if (t == NULL)
goto error; goto error;
buf = xrealloc(buf, 1, len + strlen(t) + 1); cmd_string_copy(&buf, t, &len);
strlcpy(buf + len, t, strlen(t) + 1);
len += strlen(t);
xfree(t);
break; break;
} }
/* FALLTHROUGH */ /* FALLTHROUGH */
@@ -170,18 +161,31 @@ error:
xasprintf(cause, "invalid or unknown command: %s", s); xasprintf(cause, "invalid or unknown command: %s", s);
out: out:
if (buf != NULL) free(buf);
xfree(buf);
if (argv != NULL) { if (argv != NULL) {
for (i = 0; i < argc; i++) for (i = 0; i < argc; i++)
xfree(argv[i]); free(argv[i]);
xfree(argv); free(argv);
} }
return (rval); return (rval);
} }
void
cmd_string_copy(char **dst, char *src, size_t *len)
{
size_t srclen;
srclen = strlen(src);
*dst = xrealloc(*dst, 1, *len + srclen + 1);
strlcpy(*dst + *len, src, srclen + 1);
*len += srclen;
free(src);
}
char * char *
cmd_string_string(const char *s, size_t *p, char endch, int esc) cmd_string_string(const char *s, size_t *p, char endch, int esc)
{ {
@@ -221,10 +225,7 @@ cmd_string_string(const char *s, size_t *p, char endch, int esc)
break; break;
if ((t = cmd_string_variable(s, p)) == NULL) if ((t = cmd_string_variable(s, p)) == NULL)
goto error; goto error;
buf = xrealloc(buf, 1, len + strlen(t) + 1); cmd_string_copy(&buf, t, &len);
strlcpy(buf + len, t, strlen(t) + 1);
len += strlen(t);
xfree(t);
continue; continue;
} }
@@ -239,17 +240,17 @@ cmd_string_string(const char *s, size_t *p, char endch, int esc)
return (buf); return (buf);
error: error:
if (buf != NULL) free(buf);
xfree(buf);
return (NULL); return (NULL);
} }
char * char *
cmd_string_variable(const char *s, size_t *p) cmd_string_variable(const char *s, size_t *p)
{ {
int ch, fch; int ch, fch;
char *buf, *t; char *buf, *t;
size_t len; size_t len;
struct environ_entry *envent;
#define cmd_string_first(ch) ((ch) == '_' || \ #define cmd_string_first(ch) ((ch) == '_' || \
((ch) >= 'a' && (ch) <= 'z') || ((ch) >= 'A' && (ch) <= 'Z')) ((ch) >= 'a' && (ch) <= 'z') || ((ch) >= 'A' && (ch) <= 'Z'))
@@ -301,38 +302,38 @@ cmd_string_variable(const char *s, size_t *p)
buf = xrealloc(buf, 1, len + 1); buf = xrealloc(buf, 1, len + 1);
buf[len] = '\0'; buf[len] = '\0';
if ((t = getenv(buf)) == NULL) { envent = environ_find(&global_environ, buf);
xfree(buf); free(buf);
if (envent == NULL)
return (xstrdup("")); return (xstrdup(""));
} return (xstrdup(envent->value));
xfree(buf);
return (xstrdup(t));
error: error:
if (buf != NULL) free(buf);
xfree(buf);
return (NULL); return (NULL);
} }
char * char *
cmd_string_expand_tilde(const char *s, size_t *p) cmd_string_expand_tilde(const char *s, size_t *p)
{ {
struct passwd *pw; struct passwd *pw;
char *home, *path, *username; struct environ_entry *envent;
char *home, *path, *username;
home = NULL; home = NULL;
if (cmd_string_getc(s, p) == '/') { if (cmd_string_getc(s, p) == '/') {
if ((home = getenv("HOME")) == NULL || *home == '\0') { envent = environ_find(&global_environ, "HOME");
if ((pw = getpwuid(getuid())) != NULL) if (envent != NULL && *envent->value != '\0')
home = pw->pw_dir; home = envent->value;
} else if ((pw = getpwuid(getuid())) != NULL)
home = pw->pw_dir;
} else { } else {
cmd_string_ungetc(p); cmd_string_ungetc(p);
if ((username = cmd_string_string(s, p, '/', 0)) == NULL) if ((username = cmd_string_string(s, p, '/', 0)) == NULL)
return (NULL); return (NULL);
if ((pw = getpwnam(username)) != NULL) if ((pw = getpwnam(username)) != NULL)
home = pw->pw_dir; home = pw->pw_dir;
xfree(username); free(username);
} }
if (home == NULL) if (home == NULL)
return (NULL); return (NULL);

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-suspend-client.c,v 1.5 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,36 +27,30 @@
* Suspend client with SIGTSTP. * Suspend client with SIGTSTP.
*/ */
int cmd_suspend_client_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_suspend_client_exec(struct cmd *, struct cmd_q *);
struct cmd_suspend_client_data {
char *name;
char *target;
};
const struct cmd_entry cmd_suspend_client_entry = { const struct cmd_entry cmd_suspend_client_entry = {
"suspend-client", "suspendc", "suspend-client", "suspendc",
"[-c target-client]", "t:", 0, 0,
0, "", CMD_TARGET_CLIENT_USAGE,
cmd_target_init, 0,
cmd_target_parse, NULL,
cmd_suspend_client_exec, NULL,
cmd_target_free, cmd_suspend_client_exec
cmd_target_print
}; };
int enum cmd_retval
cmd_suspend_client_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_suspend_client_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_target_data *data = self->data; struct args *args = self->args;
struct client *c; struct client *c;
if ((c = cmd_find_client(ctx, data->target)) == NULL) if ((c = cmd_find_client(cmdq, args_get(args, 't'), 0)) == NULL)
return (-1); return (CMD_RETURN_ERROR);
tty_stop_tty(&c->tty); tty_stop_tty(&c->tty);
c->flags |= CLIENT_SUSPENDED; c->flags |= CLIENT_SUSPENDED;
server_write_client(c, MSG_SUSPEND, NULL, 0); server_write_client(c, MSG_SUSPEND, NULL, 0);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-swap-pane.c,v 1.15 2009-12-04 22:14:47 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,73 +26,67 @@
* Swap two panes. * Swap two panes.
*/ */
void cmd_swap_pane_init(struct cmd *, int); void cmd_swap_pane_key_binding(struct cmd *, int);
int cmd_swap_pane_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_swap_pane_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_swap_pane_entry = { const struct cmd_entry cmd_swap_pane_entry = {
"swap-pane", "swapp", "swap-pane", "swapp",
"dDs:t:U", 0, 0,
"[-dDU] " CMD_SRCDST_PANE_USAGE, "[-dDU] " CMD_SRCDST_PANE_USAGE,
0, "dDU", 0,
cmd_swap_pane_init, cmd_swap_pane_key_binding,
cmd_srcdst_parse, NULL,
cmd_swap_pane_exec, cmd_swap_pane_exec
cmd_srcdst_free,
cmd_srcdst_print
}; };
void void
cmd_swap_pane_init(struct cmd *self, int key) cmd_swap_pane_key_binding(struct cmd *self, int key)
{ {
struct cmd_target_data *data; self->args = args_create(0);
cmd_srcdst_init(self, key);
data = self->data;
if (key == '{') if (key == '{')
cmd_set_flag(&data->chflags, 'U'); args_set(self->args, 'U', NULL);
else if (key == '}') else if (key == '}')
cmd_set_flag(&data->chflags, 'D'); args_set(self->args, 'D', NULL);
} }
enum cmd_retval
int cmd_swap_pane_exec(struct cmd *self, struct cmd_q *cmdq)
cmd_swap_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
{ {
struct cmd_srcdst_data *data = self->data; struct args *args = self->args;
struct winlink *src_wl, *dst_wl; struct winlink *src_wl, *dst_wl;
struct window *src_w, *dst_w; struct window *src_w, *dst_w;
struct window_pane *tmp_wp, *src_wp, *dst_wp; struct window_pane *tmp_wp, *src_wp, *dst_wp;
struct layout_cell *src_lc, *dst_lc; struct layout_cell *src_lc, *dst_lc;
u_int sx, sy, xoff, yoff; u_int sx, sy, xoff, yoff;
if (data == NULL) dst_wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &dst_wp);
return (0); if (dst_wl == NULL)
return (CMD_RETURN_ERROR);
if ((dst_wl = cmd_find_pane(ctx, data->dst, NULL, &dst_wp)) == NULL)
return (-1);
dst_w = dst_wl->window; dst_w = dst_wl->window;
server_unzoom_window(dst_w);
if (data->src == NULL) { if (!args_has(args, 's')) {
src_w = dst_w; src_w = dst_w;
if (cmd_check_flag(data->chflags, 'D')) { if (args_has(self->args, 'D')) {
src_wp = TAILQ_NEXT(dst_wp, entry); src_wp = TAILQ_NEXT(dst_wp, entry);
if (src_wp == NULL) if (src_wp == NULL)
src_wp = TAILQ_FIRST(&dst_w->panes); src_wp = TAILQ_FIRST(&dst_w->panes);
} else if (cmd_check_flag(data->chflags, 'U')) { } else if (args_has(self->args, 'U')) {
src_wp = TAILQ_PREV(dst_wp, window_panes, entry); src_wp = TAILQ_PREV(dst_wp, window_panes, entry);
if (src_wp == NULL) if (src_wp == NULL)
src_wp = TAILQ_LAST(&dst_w->panes, window_panes); src_wp = TAILQ_LAST(&dst_w->panes, window_panes);
} else } else
return (0); return (CMD_RETURN_NORMAL);
} else { } else {
src_wl = cmd_find_pane(ctx, data->src, NULL, &src_wp); src_wl = cmd_find_pane(cmdq, args_get(args, 's'), NULL, &src_wp);
if (src_wl == NULL) if (src_wl == NULL)
return (-1); return (CMD_RETURN_ERROR);
src_w = src_wl->window; src_w = src_wl->window;
} }
server_unzoom_window(src_w);
if (src_wp == dst_wp) if (src_wp == dst_wp)
return (0); return (CMD_RETURN_NORMAL);
tmp_wp = TAILQ_PREV(dst_wp, window_panes, entry); tmp_wp = TAILQ_PREV(dst_wp, window_panes, entry);
TAILQ_REMOVE(&dst_w->panes, dst_wp, entry); TAILQ_REMOVE(&dst_w->panes, dst_wp, entry);
@@ -121,7 +115,7 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
dst_wp->xoff = xoff; dst_wp->yoff = yoff; dst_wp->xoff = xoff; dst_wp->yoff = yoff;
window_pane_resize(dst_wp, sx, sy); window_pane_resize(dst_wp, sx, sy);
if (!cmd_check_flag(data->chflags, 'd')) { if (!args_has(self->args, 'd')) {
if (src_w != dst_w) { if (src_w != dst_w) {
window_set_active_pane(src_w, dst_wp); window_set_active_pane(src_w, dst_wp);
window_set_active_pane(dst_w, src_wp); window_set_active_pane(dst_w, src_wp);
@@ -137,8 +131,14 @@ cmd_swap_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
if (dst_w->active == dst_wp) if (dst_w->active == dst_wp)
window_set_active_pane(dst_w, src_wp); window_set_active_pane(dst_w, src_wp);
} }
if (src_w != dst_w) {
if (src_w->last == src_wp)
src_w->last = NULL;
if (dst_w->last == dst_wp)
dst_w->last = NULL;
}
server_redraw_window(src_w); server_redraw_window(src_w);
server_redraw_window(dst_w); server_redraw_window(dst_w);
return (0); return (CMD_RETURN_NORMAL);
} }

View File

@@ -1,4 +1,4 @@
/* $Id: cmd-swap-window.c,v 1.19 2009-11-14 17:56:39 tcunha Exp $ */ /* $Id$ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -26,49 +26,51 @@
* Swap one window with another. * Swap one window with another.
*/ */
int cmd_swap_window_exec(struct cmd *, struct cmd_ctx *); enum cmd_retval cmd_swap_window_exec(struct cmd *, struct cmd_q *);
const struct cmd_entry cmd_swap_window_entry = { const struct cmd_entry cmd_swap_window_entry = {
"swap-window", "swapw", "swap-window", "swapw",
"ds:t:", 0, 0,
"[-d] " CMD_SRCDST_WINDOW_USAGE, "[-d] " CMD_SRCDST_WINDOW_USAGE,
0, "d", 0,
cmd_srcdst_init, NULL,
cmd_srcdst_parse, NULL,
cmd_swap_window_exec, cmd_swap_window_exec
cmd_srcdst_free,
cmd_srcdst_print
}; };
int enum cmd_retval
cmd_swap_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd_swap_window_exec(struct cmd *self, struct cmd_q *cmdq)
{ {
struct cmd_srcdst_data *data = self->data; struct args *args = self->args;
const char *target_src, *target_dst;
struct session *src, *dst; struct session *src, *dst;
struct session_group *sg_src, *sg_dst; struct session_group *sg_src, *sg_dst;
struct winlink *wl_src, *wl_dst; struct winlink *wl_src, *wl_dst;
struct window *w; struct window *w;
if ((wl_src = cmd_find_window(ctx, data->src, &src)) == NULL) target_src = args_get(args, 's');
return (-1); if ((wl_src = cmd_find_window(cmdq, target_src, &src)) == NULL)
if ((wl_dst = cmd_find_window(ctx, data->dst, &dst)) == NULL) return (CMD_RETURN_ERROR);
return (-1); target_dst = args_get(args, 't');
if ((wl_dst = cmd_find_window(cmdq, target_dst, &dst)) == NULL)
return (CMD_RETURN_ERROR);
sg_src = session_group_find(src); sg_src = session_group_find(src);
sg_dst = session_group_find(dst); sg_dst = session_group_find(dst);
if (src != dst && if (src != dst &&
sg_src != NULL && sg_dst != NULL && sg_src == sg_dst) { sg_src != NULL && sg_dst != NULL && sg_src == sg_dst) {
ctx->error(ctx, "can't move window, sessions are grouped"); cmdq_error(cmdq, "can't move window, sessions are grouped");
return (-1); return (CMD_RETURN_ERROR);
} }
if (wl_dst->window == wl_src->window) if (wl_dst->window == wl_src->window)
return (0); return (CMD_RETURN_NORMAL);
w = wl_dst->window; w = wl_dst->window;
wl_dst->window = wl_src->window; wl_dst->window = wl_src->window;
wl_src->window = w; wl_src->window = w;
if (!cmd_check_flag(data->chflags, 'd')) { if (!args_has(self->args, 'd')) {
session_select(dst, wl_dst->idx); session_select(dst, wl_dst->idx);
if (src != dst) if (src != dst)
session_select(src, wl_src->idx); session_select(src, wl_src->idx);
@@ -81,5 +83,5 @@ cmd_swap_window_exec(struct cmd *self, struct cmd_ctx *ctx)
} }
recalculate_sizes(); recalculate_sizes();
return (0); return (CMD_RETURN_NORMAL);
} }

Some files were not shown because too many files have changed in this diff Show More