Update of /cvsroot/tmux/tmux
In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv18557

Modified Files:
        cmd-switch-client.c key-bindings.c session.c tmux.1 tmux.h 
Log Message:
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".


Index: cmd-switch-client.c
===================================================================
RCS file: /cvsroot/tmux/tmux/cmd-switch-client.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- cmd-switch-client.c 25 Jan 2010 17:12:44 -0000      1.19
+++ cmd-switch-client.c 10 Sep 2010 13:36:17 -0000      1.20
@@ -27,6 +27,7 @@
  * Switch client to a different session.
  */
 
+void   cmd_switch_client_init(struct cmd *, int);
 int    cmd_switch_client_parse(struct cmd *, int, char **, char **);
 int    cmd_switch_client_exec(struct cmd *, struct cmd_ctx *);
 void   cmd_switch_client_free(struct cmd *);
@@ -35,28 +36,50 @@
 struct cmd_switch_client_data {
        char    *name;
        char    *target;
+       int      flag_next;
+       int      flag_previous;
 };
 
 const struct cmd_entry cmd_switch_client_entry = {
        "switch-client", "switchc",
-       "[-c target-client] [-t target-session]",
+       "[-np] [-c target-client] [-t target-session]",
        0, "",
-       NULL,
+       cmd_switch_client_init,
        cmd_switch_client_parse,
        cmd_switch_client_exec,
        cmd_switch_client_free,
        cmd_switch_client_print
 };
 
-int
-cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause)
+void
+cmd_switch_client_init(struct cmd *self, int key)
 {
        struct cmd_switch_client_data   *data;
-       int                              opt;
 
        self->data = data = xmalloc(sizeof *data);
        data->name = NULL;
        data->target = NULL;
+       data->flag_next = 0;
+       data->flag_previous = 0;
+
+       switch (key) {
+       case '(':
+               data->flag_previous = 1;
+               break;
+       case ')':
+               data->flag_next = 1;
+               break;
+       }
+}
+
+int
+cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause)
+{
+       struct cmd_switch_client_data   *data;
+       int                              opt;
+
+       self->entry->init(self, KEYC_NONE);
+       data = self->data;
 
        while ((opt = getopt(argc, argv, "c:t:")) != -1) {
                switch (opt) {
@@ -65,9 +88,21 @@
                                data->name = xstrdup(optarg);
                        break;
                case 't':
+                       if (data->flag_next || data->flag_previous)
+                               goto usage;
                        if (data->target == NULL)
                                data->target = xstrdup(optarg);
                        break;
+               case 'n':
+                       if (data->flag_previous || data->target != NULL)
+                               goto usage;
+                       data->flag_next = 1;
+                       break;
+               case 'p':
+                       if (data->flag_next || data->target != NULL)
+                               goto usage;
+                       data->flag_next = 1;
+                       break;
                default:
                        goto usage;
                }
@@ -98,9 +133,22 @@
 
        if ((c = cmd_find_client(ctx, data->name)) == NULL)
                return (-1);
-       if ((s = cmd_find_session(ctx, data->target)) == NULL)
-               return (-1);
 
+       if (data->flag_next) {
+               if ((s = session_next_session(c->session)) == NULL) {
+                       ctx->error(ctx, "can't find next session");
+                       return (-1);
+               }
+       } else if (data->flag_previous) {
+               if ((s = session_previous_session(c->session)) == NULL) {
+                       ctx->error(ctx, "can't find previous session");
+                       return (-1);
+               }
+       } else
+               s = cmd_find_session(ctx, data->target);
+
+       if (s == NULL)
+               return (-1);
        c->session = s;
 
        recalculate_sizes();
@@ -130,6 +178,10 @@
        off += xsnprintf(buf, len, "%s", self->entry->name);
        if (data == NULL)
                return (off);
+       if (off < len && data->flag_next)
+               off += xsnprintf(buf + off, len - off, "%s", " -n");
+       if (off < len && data->flag_previous)
+               off += xsnprintf(buf + off, len - off, "%s", " -p");
        if (off < len && data->name != NULL)
                off += cmd_prarg(buf + off, len - off, " -c ", data->name);
        if (off < len && data->target != NULL)

Index: key-bindings.c
===================================================================
RCS file: /cvsroot/tmux/tmux/key-bindings.c,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -d -r1.94 -r1.95
--- key-bindings.c      2 Jul 2010 02:43:01 -0000       1.94
+++ key-bindings.c      10 Sep 2010 13:36:17 -0000      1.95
@@ -108,6 +108,8 @@
                { '#',                    0, &cmd_list_buffers_entry },
                { '%',                    0, &cmd_split_window_entry },
                { '&',                    0, &cmd_confirm_before_entry },
+               { '(',                    0, &cmd_switch_client_entry },
+               { ')',                    0, &cmd_switch_client_entry },
                { ',',                    0, &cmd_command_prompt_entry },
                { '-',                    0, &cmd_delete_buffer_entry },
                { '.',                    0, &cmd_command_prompt_entry },

Index: session.c
===================================================================
RCS file: /cvsroot/tmux/tmux/session.c,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -d -r1.77 -r1.78
--- session.c   2 Jul 2010 02:49:19 -0000       1.77
+++ session.c   10 Sep 2010 13:36:17 -0000      1.78
@@ -168,6 +168,48 @@
        return (-1);
 }
 
+/* Find the next usable session. */
+struct session *
+session_next_session(struct session *s)
+{
+       struct session *s2;
+       u_int           i;
+
+       if (ARRAY_LENGTH(&sessions) == 0 || session_index(s, &i) != 0)
+               return (NULL);
+
+       do {
+               if (i == ARRAY_LENGTH(&sessions) - 1)
+                       i = 0;
+               else
+                       i++;
+               s2 = ARRAY_ITEM(&sessions, i);
+       } while (s2 == NULL || s2->flags & SESSION_DEAD);
+
+       return (s2);
+}
+
+/* Find the previous usable session. */
+struct session *
+session_previous_session(struct session *s)
+{
+       struct session *s2;
+       u_int           i;
+
+       if (ARRAY_LENGTH(&sessions) == 0 || session_index(s, &i) != 0)
+               return (NULL);
+
+       do {
+               if (i == 0)
+                       i = ARRAY_LENGTH(&sessions) - 1;
+               else
+                       i--;
+               s2 = ARRAY_ITEM(&sessions, i);
+       } while (s2 == NULL || s2->flags & SESSION_DEAD);
+
+       return (s2);
+}
+
 /* Create a new window on a session. */
 struct winlink *
 session_new(struct session *s,

Index: tmux.h
===================================================================
RCS file: /cvsroot/tmux/tmux/tmux.h,v
retrieving revision 1.575
retrieving revision 1.576
diff -u -d -r1.575 -r1.576
--- tmux.h      7 Sep 2010 19:32:58 -0000       1.575
+++ tmux.h      10 Sep 2010 13:36:17 -0000      1.576
@@ -1963,6 +1963,8 @@
                     char **);
 void            session_destroy(struct session *);
 int             session_index(struct session *, u_int *);
+struct session *session_next_session(struct session *);
+struct session *session_previous_session(struct session *);
 struct winlink *session_new(struct session *,
                     const char *, const char *, const char *, int, char **);
 struct winlink *session_attach(

Index: tmux.1
===================================================================
RCS file: /cvsroot/tmux/tmux/tmux.1,v
retrieving revision 1.264
retrieving revision 1.265
diff -u -d -r1.264 -r1.265
--- tmux.1      17 Jul 2010 14:39:01 -0000      1.264
+++ tmux.1      10 Sep 2010 13:36:17 -0000      1.265
@@ -14,7 +14,7 @@
 .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: July 15 2010 $
+.Dd $Mdocdate: September 8 2010 $
 .Dt TMUX 1
 .Os
 .Sh NAME
@@ -660,6 +660,7 @@
 .Dv SIGTSTP
 (tty stop).
 .It Xo Ic switch-client
+.Op Fl np
 .Op Fl c Ar target-client
 .Op Fl t Ar target-session
 .Xc
@@ -668,6 +669,11 @@
 .Ar target-client
 to
 .Ar target-session .
+If
+.Fl n
+or
+.Fl p
+is used, the client is moved to the next or previous session respectively.
 .El
 .Sh WINDOWS AND PANES
 A


------------------------------------------------------------------------------
Automate Storage Tiering Simply
Optimize IT performance and efficiency through flexible, powerful, 
automated storage tiering capabilities. View this brief to learn how
you can reduce costs and improve performance. 
http://p.sf.net/sfu/dell-sfdev2dev
_______________________________________________
tmux-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-cvs

Reply via email to