mirror of
https://github.com/tmux/tmux.git
synced 2024-11-10 13:48:48 +00:00
Permit panes to be referred to as "top", "bottom", "top-left" etc, if the right
pane can be identified.
This commit is contained in:
parent
796eb522ac
commit
6311bd119e
2
Makefile
2
Makefile
@ -32,7 +32,7 @@ SRCS= attributes.c cfg.c client.c clock.c \
|
||||
cmd-pipe-pane.c cmd-capture-pane.c cmd.c \
|
||||
colour.c environ.c grid-view.c grid-utf8.c grid.c input-keys.c \
|
||||
imsg.c imsg-buffer.c input.c key-bindings.c key-string.c \
|
||||
layout-set.c layout.c log.c job.c \
|
||||
layout-set.c layout-string.c layout.c log.c job.c \
|
||||
mode-key.c names.c options.c paste.c procname.c \
|
||||
resize.c screen-redraw.c screen-write.c screen.c session.c status.c \
|
||||
server-fn.c server.c server-client.c server-window.c \
|
||||
|
33
cmd.c
33
cmd.c
@ -858,9 +858,9 @@ cmd_find_pane(struct cmd_ctx *ctx,
|
||||
{
|
||||
struct session *s;
|
||||
struct winlink *wl;
|
||||
const char *period;
|
||||
struct layout_cell *lc;
|
||||
const char *period, *errstr;
|
||||
char *winptr, *paneptr;
|
||||
const char *errstr;
|
||||
u_int idx;
|
||||
|
||||
/* Get the current session. */
|
||||
@ -895,20 +895,27 @@ cmd_find_pane(struct cmd_ctx *ctx,
|
||||
*wpp = wl->window->active;
|
||||
else {
|
||||
idx = strtonum(paneptr, 0, INT_MAX, &errstr);
|
||||
if (errstr != NULL) {
|
||||
ctx->error(ctx, "pane %s: %s", errstr, paneptr);
|
||||
goto error;
|
||||
}
|
||||
if (errstr != NULL)
|
||||
goto lookup_string;
|
||||
*wpp = window_pane_at_index(wl->window, idx);
|
||||
if (*wpp == NULL) {
|
||||
ctx->error(ctx, "no such pane: %u", idx);
|
||||
goto error;
|
||||
}
|
||||
if (*wpp == NULL)
|
||||
goto lookup_string;
|
||||
}
|
||||
|
||||
xfree(winptr);
|
||||
return (wl);
|
||||
|
||||
lookup_string:
|
||||
/* Try pane string description. */
|
||||
if ((lc = layout_find_string(s->curw->window, paneptr)) == NULL) {
|
||||
ctx->error(ctx, "can't find pane: %s", paneptr);
|
||||
goto error;
|
||||
}
|
||||
*wpp = lc->wp;
|
||||
|
||||
xfree(winptr);
|
||||
return (s->curw);
|
||||
|
||||
no_period:
|
||||
/* Try as a pane number alone. */
|
||||
idx = strtonum(arg, 0, INT_MAX, &errstr);
|
||||
@ -922,6 +929,12 @@ no_period:
|
||||
return (s->curw);
|
||||
|
||||
lookup_window:
|
||||
/* Try pane string description. */
|
||||
if ((lc = layout_find_string(s->curw->window, arg)) != NULL) {
|
||||
*wpp = lc->wp;
|
||||
return (s->curw);
|
||||
}
|
||||
|
||||
/* Try as a window and use the active pane. */
|
||||
if ((wl = cmd_find_window(ctx, arg, sp)) != NULL)
|
||||
*wpp = wl->window->active;
|
||||
|
167
layout-string.c
Normal file
167
layout-string.c
Normal file
@ -0,0 +1,167 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* 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 <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "tmux.h"
|
||||
|
||||
/*
|
||||
* Figure out the pane position based on a description. Fairly simple right
|
||||
* now, just understands a set of strings: left, right, top, bottom, top-left
|
||||
* top-right, bottom-left, bottom-right.
|
||||
*/
|
||||
|
||||
struct layout_cell *layout_find_top(struct layout_cell *);
|
||||
struct layout_cell *layout_find_bottom(struct layout_cell *);
|
||||
struct layout_cell *layout_find_left(struct layout_cell *);
|
||||
struct layout_cell *layout_find_right(struct layout_cell *);
|
||||
struct layout_cell *layout_find_topleft(struct layout_cell *);
|
||||
struct layout_cell *layout_find_topright(struct layout_cell *);
|
||||
struct layout_cell *layout_find_bottomleft(struct layout_cell *);
|
||||
struct layout_cell *layout_find_bottomright(struct layout_cell *);
|
||||
|
||||
/* Find the cell; returns NULL if string not understood. */
|
||||
struct layout_cell *
|
||||
layout_find_string(struct window *w, const char *s)
|
||||
{
|
||||
struct layout_cell *lc = w->layout_root;
|
||||
|
||||
if (strcasecmp(s, "top") == 0)
|
||||
lc = layout_find_top(lc);
|
||||
else if (strcasecmp(s, "bottom") == 0)
|
||||
lc = layout_find_bottom(lc);
|
||||
else if (strcasecmp(s, "left") == 0)
|
||||
lc = layout_find_left(lc);
|
||||
else if (strcasecmp(s, "right") == 0)
|
||||
lc = layout_find_right(lc);
|
||||
else if (strcasecmp(s, "top-left") == 0)
|
||||
lc = layout_find_topleft(lc);
|
||||
else if (strcasecmp(s, "top-right") == 0)
|
||||
lc = layout_find_topright(lc);
|
||||
else if (strcasecmp(s, "bottom-left") == 0)
|
||||
lc = layout_find_bottomleft(lc);
|
||||
else if (strcasecmp(s, "bottom-right") == 0)
|
||||
lc = layout_find_bottomright(lc);
|
||||
|
||||
if (lc == NULL || lc->type != LAYOUT_WINDOWPANE)
|
||||
return (NULL);
|
||||
return (lc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the top cell. Because splits in the same direction are stored as a
|
||||
* list, this is just the first in the list. Return NULL if no topmost cell.
|
||||
* For an unnested cell (not split), the top cell is always itself.
|
||||
*/
|
||||
struct layout_cell *
|
||||
layout_find_top(struct layout_cell *lc)
|
||||
{
|
||||
if (lc->type == LAYOUT_WINDOWPANE)
|
||||
return (lc);
|
||||
else if (lc->type == LAYOUT_TOPBOTTOM)
|
||||
return (TAILQ_FIRST(&lc->cells));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the bottom cell. Similarly to the top cell, this is just the last in
|
||||
* the list.
|
||||
*/
|
||||
struct layout_cell *
|
||||
layout_find_bottom(struct layout_cell *lc)
|
||||
{
|
||||
if (lc->type == LAYOUT_WINDOWPANE)
|
||||
return (lc);
|
||||
else if (lc->type == LAYOUT_TOPBOTTOM)
|
||||
return (TAILQ_LAST(&lc->cells, layout_cells));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Find the left cell. */
|
||||
struct layout_cell *
|
||||
layout_find_left(struct layout_cell *lc)
|
||||
{
|
||||
if (lc->type == LAYOUT_WINDOWPANE)
|
||||
return (lc);
|
||||
else if (lc->type == LAYOUT_LEFTRIGHT)
|
||||
return (TAILQ_FIRST(&lc->cells));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Find the right cell. */
|
||||
struct layout_cell *
|
||||
layout_find_right(struct layout_cell *lc)
|
||||
{
|
||||
if (lc->type == LAYOUT_WINDOWPANE)
|
||||
return (lc);
|
||||
else if (lc->type == LAYOUT_LEFTRIGHT)
|
||||
return (TAILQ_LAST(&lc->cells, layout_cells));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the top-left cell. This means recursing until there are no more moves
|
||||
* to be made.
|
||||
*/
|
||||
struct layout_cell *
|
||||
layout_find_topleft(struct layout_cell *lc)
|
||||
{
|
||||
if (lc->type == LAYOUT_WINDOWPANE)
|
||||
return (lc);
|
||||
lc = TAILQ_FIRST(&lc->cells);
|
||||
return (layout_find_topleft(lc));
|
||||
}
|
||||
|
||||
/* Find the top-right cell. */
|
||||
struct layout_cell *
|
||||
layout_find_topright(struct layout_cell *lc)
|
||||
{
|
||||
if (lc->type == LAYOUT_WINDOWPANE)
|
||||
return (lc);
|
||||
if (lc->type == LAYOUT_LEFTRIGHT)
|
||||
lc = TAILQ_LAST(&lc->cells, layout_cells);
|
||||
else
|
||||
lc = TAILQ_FIRST(&lc->cells);
|
||||
return (layout_find_topright(lc));
|
||||
}
|
||||
|
||||
/* Find the bottom-left cell. */
|
||||
struct layout_cell *
|
||||
layout_find_bottomleft(struct layout_cell *lc)
|
||||
{
|
||||
if (lc->type == LAYOUT_WINDOWPANE)
|
||||
return (lc);
|
||||
if (lc->type == LAYOUT_LEFTRIGHT)
|
||||
lc = TAILQ_FIRST(&lc->cells);
|
||||
else
|
||||
lc = TAILQ_LAST(&lc->cells, layout_cells);
|
||||
return (layout_find_bottomleft(lc));
|
||||
}
|
||||
|
||||
/* Find the bottom-right cell. */
|
||||
struct layout_cell *
|
||||
layout_find_bottomright(struct layout_cell *lc)
|
||||
{
|
||||
if (lc->type == LAYOUT_WINDOWPANE)
|
||||
return (lc);
|
||||
lc = TAILQ_LAST(&lc->cells, layout_cells);
|
||||
return (layout_find_bottomright(lc));
|
||||
}
|
10
tmux.1
10
tmux.1
@ -323,6 +323,16 @@ If neither a colon nor period appears,
|
||||
first attempts to use the argument as a pane index; if that fails, it is looked
|
||||
up as for
|
||||
.Ar target-window .
|
||||
One of the strings
|
||||
.Em top ,
|
||||
.Em bottom ,
|
||||
.Em left ,
|
||||
.Em right ,
|
||||
.Em top-left ,
|
||||
.Em top-right ,
|
||||
.Em bottom-left or
|
||||
.Em bottom-right
|
||||
may be used instead of a pane index.
|
||||
.Pp
|
||||
Multiple commands may be specified together as part of a
|
||||
.Em command sequence .
|
||||
|
3
tmux.h
3
tmux.h
@ -1844,6 +1844,9 @@ u_int layout_set_next(struct window *);
|
||||
u_int layout_set_previous(struct window *);
|
||||
void layout_set_active_changed(struct window *);
|
||||
|
||||
/* layout-string.c */
|
||||
struct layout_cell *layout_find_string(struct window *, const char *);
|
||||
|
||||
/* window-clock.c */
|
||||
extern const struct window_mode window_clock_mode;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user