Hi

This is what I did, not much but I didn't have a lot of time... not sure
if it'll still apply.

Let me know if you have any questions.


Index: client.c
===================================================================
RCS file: /cvsroot/tmux/tmux/client.c,v
retrieving revision 1.100
diff -u -p -r1.100 client.c
--- client.c    24 Oct 2010 19:54:41 -0000      1.100
+++ client.c    7 Dec 2010 01:17:52 -0000
@@ -175,22 +175,24 @@ client_main(int argc, char **argv, int f
        client_send_identify(flags);
 
        /* Send first command. */
-       if (msg == MSG_COMMAND) {
-               /* Fill in command line arguments. */
-               cmddata.pid = environ_pid;
-               cmddata.idx = environ_idx;
-
-               /* Prepare command for server. */
-               cmddata.argc = argc;
-               if (cmd_pack_argv(
-                   argc, argv, cmddata.argv, sizeof cmddata.argv) != 0) {
-                       log_warnx("command too long");
-                       return (1);
-               }
+       if (!(flags & IDENTIFY_CONTROL)) {
+               if (msg == MSG_COMMAND) {
+                       /* Fill in command line arguments. */
+                       cmddata.pid = environ_pid;
+                       cmddata.idx = environ_idx;
+
+                       /* Prepare command for server. */
+                       cmddata.argc = argc;
+                       if (cmd_pack_argv(argc, argv,
+                           cmddata.argv, sizeof cmddata.argv) != 0) {
+                               log_warnx("command too long");
+                               return (1);
+                       }
 
-               client_write_server(msg, &cmddata, sizeof cmddata);
-       } else if (msg == MSG_SHELL)
-               client_write_server(msg, NULL, 0);
+                       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();
@@ -220,11 +222,6 @@ client_send_identify(int flags)
            strlcpy(data.term, term, sizeof data.term) >= sizeof data.term)
                *data.term = '\0';
 
-       if ((fd = dup(STDIN_FILENO)) == -1)
-               fatal("dup failed");
-       imsg_compose(&client_ibuf,
-           MSG_IDENTIFY, PROTOCOL_VERSION, -1, fd, &data, sizeof data);
-
        if ((fd = dup(STDOUT_FILENO)) == -1)
                fatal("dup failed");
        imsg_compose(&client_ibuf,
@@ -234,6 +231,11 @@ client_send_identify(int flags)
                fatal("dup failed");
        imsg_compose(&client_ibuf,
            MSG_STDERR, PROTOCOL_VERSION, -1, fd, NULL, 0);
+
+       if ((fd = dup(STDIN_FILENO)) == -1)
+               fatal("dup failed");
+       imsg_compose(&client_ibuf,
+           MSG_IDENTIFY, PROTOCOL_VERSION, -1, fd, &data, sizeof data);
 }
 
 /* Forward entire environment to server. */
Index: cmd-new-session.c
===================================================================
RCS file: /cvsroot/tmux/tmux/cmd-new-session.c,v
retrieving revision 1.78
diff -u -p -r1.78 cmd-new-session.c
--- cmd-new-session.c   2 Jul 2010 02:49:19 -0000       1.78
+++ cmd-new-session.c   7 Dec 2010 01:17:53 -0000
@@ -165,6 +165,8 @@ cmd_new_session_exec(struct cmd *self, s
        detached = data->flag_detached;
        if (ctx->cmdclient == NULL && ctx->curclient == NULL)
                detached = 1;
+       if (ctx->cmdclient != NULL && ctx->cmdclient->flags & CLIENT_CONTROL)
+               detached = 1;
 
        /*
         * Save the termios settings, part of which is used for new windows in
Index: control.c
===================================================================
RCS file: control.c
diff -N control.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ control.c   7 Dec 2010 01:17:53 -0000
@@ -0,0 +1,133 @@
+/* $Id$ */
+
+/*
+ * Copyright (c) 2010 Nicholas Marriott <n...@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 <event.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "tmux.h"
+
+/*
+ * XXX TODO
+ *
+ * Prevent other uses of stdin/stdout fds.
+ */
+
+void   control_read_callback(struct bufferevent *, void *);
+void   control_error_callback(struct bufferevent *, short, void *);
+
+void printflike2
+control_msg_error(struct cmd_ctx *ctx, const char *fmt, ...)
+{
+       va_list ap;
+
+       va_start(ap, fmt);
+       evbuffer_add_vprintf(ctx->cmdclient->stdout_event->output, fmt, ap);
+       va_end(ap);
+
+       bufferevent_write(ctx->cmdclient->stdout_event, "\n", 1);
+}
+
+void printflike2
+control_msg_print(struct cmd_ctx *ctx, const char *fmt, ...)
+{
+       va_list ap;
+
+       va_start(ap, fmt);
+       evbuffer_add_vprintf(ctx->cmdclient->stdout_event->output, fmt, ap);
+       va_end(ap);
+
+       bufferevent_write(ctx->cmdclient->stdout_event, "\n", 1);
+}
+
+void printflike2
+control_msg_info(unused struct cmd_ctx *ctx, unused const char *fmt, ...)
+{
+}
+
+/* Control input callback. */
+void
+control_read_callback(unused struct bufferevent *bufev, void *data)
+{
+       struct client      *c = data;
+       struct bufferevent *out = c->stdout_event;
+       char               *line;
+       struct cmd_ctx      ctx;
+       struct cmd_list    *cmdlist;
+       char               *cause;
+
+       /* Read input line. */
+       line = evbuffer_readln(c->stdin_event->input, NULL, EVBUFFER_EOL_CRLF);
+       if (line == NULL)
+               return;
+
+       /* Parse command. */
+       if (*line != '%') {
+               /* This is a standard tmux command. */
+               ctx.msgdata = NULL;
+               ctx.curclient = NULL;
+
+               ctx.error = control_msg_error;
+               ctx.print = control_msg_print;
+               ctx.info = control_msg_info;
+
+               ctx.cmdclient = c;
+
+               if (cmd_string_parse(line, &cmdlist, &cause) != 0) {
+                       evbuffer_add_printf(out->output, "%s", cause);
+                       bufferevent_write(out, "\n", 1);
+                       xfree(cause);
+               } else {
+                       cmd_list_exec(cmdlist, &ctx);
+                       cmd_list_free(cmdlist);
+               }
+       } else {
+               /* This is a protocol command. */
+       }
+
+       xfree(line);
+}
+
+/* Control error callback. */
+void
+control_error_callback(
+    unused struct bufferevent *bufev, unused short what, void *data)
+{
+       struct client   *c = data;
+}
+
+/* Initialise as a control client. */
+void
+control_start(struct client *c)
+{
+       /* Enable reading from stdin. */
+       if (c->stdin_event != NULL)
+               bufferevent_free(c->stdin_event);
+       c->stdin_event = bufferevent_new(c->stdin_fd,
+           control_read_callback, NULL, control_error_callback, c);
+       if (c->stdin_event == NULL)
+               fatalx("failed to create stdin event");
+       bufferevent_enable(c->stdin_event, EV_READ);
+
+       /* Write the protocol identifier and version. */
+       evbuffer_add_printf(c->stdout_event->output,
+           "\033_tmux1\033\\%%noop tmux ready\n");
+       bufferevent_enable(c->stdout_event, EV_WRITE);
+}
Index: server-client.c
===================================================================
RCS file: /cvsroot/tmux/tmux/server-client.c,v
retrieving revision 1.45
diff -u -p -r1.45 server-client.c
--- server-client.c     24 Oct 2010 01:51:34 -0000      1.45
+++ server-client.c     7 Dec 2010 01:17:53 -0000
@@ -901,6 +901,18 @@ server_client_msg_identify(
        if (*data->cwd != '\0')
                c->cwd = xstrdup(data->cwd);
 
+       /*
+        * If this is a control client, mark the client, send the ready message
+        * and continue.
+        */
+       if (data->flags & IDENTIFY_CONTROL) {
+               c->flags |= CLIENT_CONTROL;
+
+               control_start(c);
+               server_write_client(c, MSG_READY, NULL, 0);
+               return;
+       }
+
        if (!isatty(fd))
            return;
        if ((tty_fd = dup(fd)) == -1)
Index: tmux.c
===================================================================
RCS file: /cvsroot/tmux/tmux/tmux.c,v
retrieving revision 1.224
diff -u -p -r1.224 tmux.c
--- tmux.c      6 Dec 2010 22:52:21 -0000       1.224
+++ tmux.c      7 Dec 2010 01:17:53 -0000
@@ -243,7 +243,7 @@ main(int argc, char **argv)
        quiet = flags = 0;
        label = path = NULL;
        login_shell = (**argv == '-');
-       while ((opt = getopt(argc, argv, "28c:df:lL:qS:uUv")) != -1) {
+       while ((opt = getopt(argc, argv, "28Cc:df:lL:qS:uUv")) != -1) {
                switch (opt) {
                case '2':
                        flags |= IDENTIFY_256COLOURS;
@@ -253,6 +253,9 @@ main(int argc, char **argv)
                        flags |= IDENTIFY_88COLOURS;
                        flags &= ~IDENTIFY_256COLOURS;
                        break;
+               case 'C':
+                       flags |= IDENTIFY_CONTROL;
+                       break;
                case 'c':
                        if (shell_cmd != NULL)
                                xfree(shell_cmd);
@@ -294,6 +297,8 @@ main(int argc, char **argv)
 
        if (shell_cmd != NULL && argc != 0)
                usage();
+       if ((flags & IDENTIFY_CONTROL) && (argc != 0 || shell_cmd != NULL))
+               usage();
 
        log_open_tty(debug_level);
 
Index: tmux.h
===================================================================
RCS file: /cvsroot/tmux/tmux/tmux.h,v
retrieving revision 1.585
diff -u -p -r1.585 tmux.h
--- tmux.h      6 Dec 2010 22:52:21 -0000       1.585
+++ tmux.h      7 Dec 2010 01:17:54 -0000
@@ -396,6 +396,7 @@ struct msg_identify_data {
 #define IDENTIFY_UTF8 0x1
 #define IDENTIFY_256COLOURS 0x2
 #define IDENTIFY_88COLOURS 0x4
+#define IDENTIFY_CONTROL 0x8
        int             flags;
 };
 
@@ -1131,6 +1132,7 @@ struct client {
 #define CLIENT_READONLY 0x800
 #define CLIENT_BACKOFF 0x1000
 #define CLIENT_REDRAWWINDOW 0x2000
+#define CLIENT_CONTROL 0x4000
        int              flags;
 
        struct event     identify_timer;
@@ -1608,6 +1610,9 @@ size_t    cmd_buffer_print(struct cmd *, ch
 /* client.c */
 int    client_main(int, char **, int);
 
+/* control.c */
+void   control_start(struct client *);
+
 /* key-bindings.c */
 extern struct key_bindings key_bindings;
 int     key_bindings_cmp(struct key_binding *, struct key_binding *);


On Tue, May 03, 2011 at 10:22:48AM -0700, George Nachman wrote:
> Hi Nicholas,
> 
> I've got some time coming up to work on this. Can you send me whatever
> you've done so far?
> 
> Thanks,
> George
> 
> On Wed, Mar 23, 2011 at 11:12 PM, Nicholas Marriott
> <nicholas.marri...@gmail.com> wrote:
> > Yep this is a cool idea and I am happy but that George wrote up the
> > design doc but I haven't had time up to now although I did some basic
> > work and yes if anyone is interested in carrying on then let me know and
> > I will have time to give help if necessary.
> >
> > Many of the changes are relatively simple. The key problem point is that
> > we need to be able to redirect the tmux output so that instead of or as
> > well as, for example, writing to a terminal in xterm format (dictated by
> > TERM=xterm) it can suitable format and send that output to ssh. This may
> > be as simple as added a callback hook or two into the tty code and a
> > fake tty struct instance for clients which need to do this, or it may be
> > more complex. Or possibly it might be better to do it in the screen or
> > grid code in some terminal-independent format.
> >
> > I recently had a discussion with someone about another sort of
> > long-range idea: making tmux more network aware. This had some similar
> > themes - allowing the sessions and windows in a tmux server to be
> > controlled externally, in this case by another tmux server on another
> > host. A lot of the work that was in this design would probably make that
> > easier or at least help to work out the possibilites more fully.
> >
> > Of course if there are any talented C hackers out there who want
> > something to do, there are plenty of other ideas. Recently I
> > particularly liked the one in this mail:
> >
> > http://www.mail-archive.com/tmux-users@lists.sourceforge.net/msg01248.html
> >
> > Which is quite simple but could make list-* commands so much more
> > flexible.
> >
> >
> > On Wed, Mar 23, 2011 at 05:34:05PM -0700, Joshua Keroes wrote:
> >> ? ?Imagine a reinvented terminal app.
> >> ? ?First, let's use tmux as the backend. Users would get autodetech and the
> >> ? ?safety that comes with it automatically. Session moves and dupes also 
> >> come
> >> ? ?free.?We have this functionality today if you're clever with your 
> >> startup
> >> ? ?dotfiles. This isn't new.
> >> ? ?Merging tmux and a terminal app together into one glorious zombified
> >> ? ?mutant is much more interesting.
> >> ? ?+ tmux could use app-level hotkeys without fear of stomping on someone
> >> ? ?else. Goodbye ctrl-b 4, hello ctrl-4.
> >> ? ?+ tmux would get pointy-clicky-draggy-reorderable tabs.
> >> ? ?+ tmux would get draggable pane separators.
> >> ? ?+ tmux would get moveable panes, too.
> >> ? ?+ tmux could potentially get a fancier status bar since it could now use
> >> ? ?the host's UI for bells and whistles. Growl and Gnotify come to mind.
> >> ? ?+ Right-click could do useful things too. For example, right-clicking 
> >> on a
> >> ? ?tab or pane could display its available actions. Perhaps hovering over
> >> ? ?tabs could display thumbnails.
> >> ? ?+ Mouse gestures could be leveraged too: the "zoom out" gesture could
> >> ? ?display thumbnails of all terminals just like Firefox, Chrome, or OSX.
> >> ? ?These are just off the tip of my mind - I'm sure you can imagine plenty 
> >> of
> >> ? ?other places where a left-click or a right-click could help rather than
> >> ? ?hinder.
> >> ? ?Yes, I love my keyboard. Mice do have their place and can definitely 
> >> help
> >> ? ?tmux out. Contextual help and actions would make tmux management simpler
> >> ? ?for those who don't want to open up the help page every time an 
> >> infrequent
> >> ? ?task pops up.
> >> ? ?I asked the other half of this question on the iterm2 mailing list 
> >> ("Wanna
> >> ? ?zombify iterm2's brain with tmux?). George Nachman's already started
> >> ? ?working on an API. He wrote:
> >> ? ?> This is also my dream. I wrote a design doc,
> >> ? ?here:?[1]http://tinyurl.com/6cm5pd9?[docs.google]
> >> ? ?>
> >> ? ?> The tmux maintainer expressed interest but I think he didn't have time
> >> ? ?to do all the work required.
> >> ? ?> If there are any talented C hackers out there who want to help out, 
> >> this
> >> ? ?is a big project that needs
> >> ? ?> doing, and it will earn you a place in heaven.
> >> ? ?-Joshua
> >>
> >> References
> >>
> >> ? ?Visible links
> >> ? ?1. http://tinyurl.com/6cm5pd9
> >
> >> ------------------------------------------------------------------------------
> >> Enable your software for Intel(R) Active Management Technology to meet the
> >> growing manageability and security demands of your customers. Businesses
> >> are taking advantage of Intel(R) vPro (TM) technology - will your software
> >> be a part of the solution? Download the Intel(R) Manageability Checker
> >> today! http://p.sf.net/sfu/intel-dev2devmar
> >
> >> _______________________________________________
> >> tmux-users mailing list
> >> tmux-users@lists.sourceforge.net
> >> https://lists.sourceforge.net/lists/listinfo/tmux-users
> >
> >

------------------------------------------------------------------------------
WhatsUp Gold - Download Free Network Management Software
The most intuitive, comprehensive, and cost-effective network 
management toolset available today.  Delivers lowest initial 
acquisition cost and overall TCO of any competing solution.
http://p.sf.net/sfu/whatsupgold-sd
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to