Actually, move-pane is fine as a new command, forget about making it a flag to join-pane.
The join-pane changes and move-pane command can go in together as one diff. On Mon, Jan 23, 2012 at 01:53:09PM +0000, Nicholas Marriott wrote: > Hi > > On Sun, Jan 22, 2012 at 12:13:20PM -0800, George Nachman wrote: > > This document describes in text the changes made and their > > motivations. At the end, I make recommendations on how to split this > > up into multiple smaller commits. > > > > New Files > > -------------- > > There are four new files: > > 1. control.c > > ? Handles basic I/O with control clients, including: > > ? - Queuing spontaneous message notifications > > ? - Sending spontaneous messages > > Spontaneous messages are tmux-originated messages that tell the client > > that something changed: the number of sessions changed, the number of > > windows changed, a window's layout changed, a pty produced output, > > etc. Because notifications may arrive while a command is being > > executed, notifications are queued and then processed when no command > > is running. > > ? - Managing the key-value store > > The key-value store is a client-owned dictionary. It's used to > > remember window coordinates and which tmux windows appear as tabs in > > the same native window, for example. > > > > 2. cmd-control.c > > ? The one command used by control clients for all nonstandard functions. > > ? - control -e -t pane-id > > ? ?Prints a list of key-value pairs describing the internal state of > > tmux's vt100 emulator so that the client can sync up. > > ? - control -h -t pane-id -l num-lines [-a] > > ? Outputs up to "num-lines" lines of history including the current > > screen contents. If -a is given then the alternate screen is output. > > See below for a description of the encoding of history output. > > ? - control -k key > > ? Returns the value associated with "key" in the key-value store, or > > empty string. > > ? - control -s width,height > > ? Sets the size of the client. Windows cannot exceed this size. > > ? - control -s ready > > ? Marks the client as ready to receive spontaneous messages. > > ? - control -s set key=value > > ? Set the key "key" equal to the value "value" in the key-value store. > > I'll have a closer look at these, not sure about the API. Might be nicer > to have subcommands rather than flags. > > > > > 3. cmd-move-pane.c > > ? Like join-pane but doesn't mandate that the panes be in separate > > windows. Necessary to support dragging and dropping of panes. > > This could go in separately but can it be a flag to join-pane instead? > > > > > 4. dstring.c > > ? Dynamic-length strings. This simplifies various other bits of code. > > I looked at this before, not sure I'm wild about it but let's worry > about it the first diff that needs it. > > > > > History > > ---------- > > The control -h command outputs a pane's history. The goals here were > > compactness, 7-bit cleanliness, and simplicity. The encoding is: > > > > HISTORY ::= CONTEXT REPEATED_LINES > > REPEATED_LINES ::= HISTORY_LINE "\n" | HISTORY_LINE "\n" REPEATED_LINES > > HISTORY_LINE ::= CELLS | CELLS CONTEXT HISTORY_LINE > > CONTEXT ::= ":" HEX "," HEX "," HEX "," HEX > > CELLS ::= CELLVALUE | CELLVALUE CELLS > > CELLVALUE ::= HEX | "[" REPEATED_HEX "]" > > REPEATED_HEX ::= HEX | HEX REPEATED_HEX > > HEX := [0-9A-F]{2} > > > > The CONTEXT's values are cell attributes, a subset of cell flags > > (FG256, BG256, and PADDING), foreground color, and background color. > > > > The idea is to output the cell's attributes (color, etc.) once and > > then as many character values as possible. Character values are either > > ASCII, held in one byte represented as a 2-digit hex value, or a UTF-8 > > char which is a string of 2-digit hex values inside square brackets. > > > > > > Changes to Existing Files > > ------------------------------------- > > > > client.c > > -------- > > Ensures that a TTY is attached and turns off echo. If echo can't be > > disabled then the protocol won't work because the client's echo will > > be intermingled with server output. > > > > Sends MSG_IDENTIFY after STDOUT and STDERR so that it can send the escape > > code. > > > > Outputs %exit instead of the standard exit messages for control clients. > > > > When a control client quits not by issuing the detach command (e.g., > > the server dies or the last pty dies), sleep for a bit and read all > > available input. The client may have sent some not-yet-received > > commands before getting the %exit message, and we don't want those to > > go to the shell--who knows what they would do!--so read and discard > > all available input for a few seconds. The side effect of this is that > > a short delay is introduced to try to wait for the input to arrive, > > but it doesn't happen in the common case of detaching cleanly. > > > > I'd prefer for tmux to wait for acknowledgment of %exit, but because > > the server may or may not be dead, it's very hard to do this cleanly > > (it might still be reading the file descriptor). > > > > cmd-attach-session > > --------------------------- > > Performs handshake and sends session-change notifications. Various > > tweaks to terminal usage to avoid stepping on control clients. > > > > cmd-break-pane > > ---------------------- > > Change assignments to window->name to window_set_name(). > > > This can probably go in separately. > > > > > cmd-join-pane > > -------------------- > > Gains the -b flag to join a pane in before the target (left of or > > above). Adds various notifications. Refactored, gaining an argument > > that controls whether the different-window requirement is in > > force--this will serve as the meat of the new move-pane command. > > This can go in separately from the rest. > > > > > cmd-link-window > > ----------------------- > > Don't allow a window to be linked twice to the same session with the > > link-window command. I think this is undesirable, but I'm not totally > > sure? It certainly makes it harder to write a sane control mode > > client. > > No, this has to be allowed in general. Control clients will have to work > around it somehow, even if it means just drawing that windows as blank > or something. > > > > > cmd-list-windows > > ------------------------ > > Takes a -I argument specifying which window to list by window ID. > > Control clients use this command frequently, and if the user has a > > huge number of windows, it's much faster this way. > > I don't like this, it should be part of the things matched for -t like > pane ids, not a separate argument. Or are you saying it is faster than > -t? > > > > > cmd-list > > ----------- > > For control clients, wrap output in %begin?%end to make it parseable. > > Spontaneous messages are disabled while a command is running. They are > > queued and output after the command finishes. > > > > cmd-new-session > > ------------------------ > > Add handshake, remove check for tty (which is done in the client). > > > > cmd-new-window > > ------------------------ > > Add some notifications and a -I option which outputs a window ID. > > I wonder if this should instead be a -F argument to specify a format for > -P, so you would do: > > tmux neww -PF '#{window_id}' > > Likewise for splitw. > > > > > cmd-rename-session > > ----------------------------- > > Add a notification. > > > > cmd-rename-window > > ----------------------------- > > Use window_set_name > > > > cmd-resize-pane > > ----------------------- > > For control clients, output session layouts. > > > > cmd-send-keys > > --------------------- > > Add a -h option, which expects 2-char hex values for keys. This avoids > > problems with sending newlines or dealing with encoding issues on the > > wire. > > Probably separate diff as well. > > > > > cmd-split-window > > ----------------------- > > Add notifications, pass extra arg to layout_split_pane. > > > > cmd.c > > -------- > > Support looking up windows and window panes by ID (see IDs below). > > > > format.c > > ----------- > > Gains window_id and window_layout_ex formats. window_layout_ex (a > > window layout including the window pane id) > > I think the layout description should be extended to always include the > pane ids, even if it not used by select-layout. > > > > > input.c > > --------- > > Keeps track of input received after leaving the ground state so that > > if a control client attaches in the middle of receiving an escape > > code, it can know what has been received but not reflected in any > > other state. > > > > Added a call to rebroadcast output received from a pty. > > > > layout-custom.c > > --------------------- > > Added layout that includes window pane ids and notifications. > > > > layout.c > > ------------- > > Added notifications and the ability for layout_split_pane() to insert > > before (left of or on top of) a pane rather than always right/below. > > Probably separate. > > > > > names.c > > ---------- > > window_set_name refactor. > > > > resize.c > > ------------- > > Don't include status line in calculation of available space for > > control clients. Add notification. > > > > server-client.c > > ------------------- > > Avoid changing the tty for control clients. Set CLIENT_CONTROL flag on > > client when IDENTIFY_CONTROL message is recvd and don't set > > CLIENT_TERMINAL for control clients. > > > > server-fn.c > > -------------- > > Don't do server_lock_client() for control clients. It's not supported. > > Add notifications. > > > > server-window.c > > ---------------------- > > Don't ring the bell for control clients (let the client handle it). > > > > server.c > > ---------- > > Initialize control module > > > > session.c > > ------------ > > assign session IDs. Add notifications. > > > > tmux.c > > --------- > > Add -C argument. > > > > tty.c > > ----- > > Move setting tty size into tty_set_size() > > Separate as well. > > > > > window.c > > ----------- > > Add window IDs. Add window_set_name(). > > > > IDs > > ---- > > Windows had no race-free identifier. I defined window IDs as a > > monotonically increasing integer assigned at window creation time, and > > referenced with an @ sign. For instance "unlink window -t @1". > > > > Sessions had no unique identifier. Add a monotonically increasing > > session ID assigned at creation time. > > > > Window panes had no race-free identifier. I defined pane IDs as a > > monotonically increasing integer assigned at creation time, and > > referenced with a % sign. For instance "break-pane -t %1". > > These are both fine. > > > > > > > Flags > > -------- > > The client flag CLIENT_TERMINAL will be false for control clients. > > Although they must have tty's as far as client.c is concerned, the > > server should never manipulate the tty. > > > > > > Recommendations > > --------------------------- > > Based on the dependency graph, these changes can be split into a few > > smaller patches. This is approximate, but with minor changes I think > > this can be split into 5 checkins. > > They should be split into the following probably: > > - add window/session ids and related bits; > - window_set_name changes; > - add tty_set_size; > - join-pane changes; > - new-window changes that aren't notifications; > - send-keys changes; > - layout changes; > - control mode (ie, the rest). > > > > > 1. Files with very limited dependencies. > > tty.c > > window.c > > names.c > > cmd-send-keys.c > > cmd-link-window.c > > control.c > > dstring.c > > > > 2. Files that depend only on flags & control.c > > resize.c > > server-client.c > > server-window.c > > > > 3. Files that depend only on window.c: > > cmd-break-pane.c > > cmd-rename-window.c > > cmd-list-windows.c > > > > 4. File that depend on control.c, flags, and window.c: > > cmd-list.c > > cmd-attach-session.c > > cmd-rename-session.c > > input.c > > server.c > > session.c > > cmd-control.c > > cmd-new-session.c > > server-fn.c > > cmd-new-window.c > > cmd-resize-pane.c > > layout-custom.c > > > > 5. Everything else > > cmd-move-pane.c > > cmd-join-pane.c > > cmd.c > > cmd-split-window.c > > layout.c > > format.c > > tmux.c ------------------------------------------------------------------------------ Try before you buy = See our experts in action! The most comprehensive online learning library for Microsoft developers is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, Metro Style Apps, more. Free future releases when you subscribe now! http://p.sf.net/sfu/learndevnow-dev2 _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users