aboutsummaryrefslogtreecommitdiff
path: root/screen-write.c
diff options
context:
space:
mode:
authornicm <nicm>2017-05-30 21:44:59 +0000
committernicm <nicm>2017-05-30 21:44:59 +0000
commitaad4e4ddb194cba9c01b0ddd696fb7b214e1a7eb (patch)
tree8a8a273bb54a7b4010b48b64a59aa5d3c3c96b55 /screen-write.c
parentbd39fcbeea1930a2b36e98a622d864e2e27e5d14 (diff)
downloadrtmux-aad4e4ddb194cba9c01b0ddd696fb7b214e1a7eb.tar.gz
rtmux-aad4e4ddb194cba9c01b0ddd696fb7b214e1a7eb.tar.bz2
rtmux-aad4e4ddb194cba9c01b0ddd696fb7b214e1a7eb.zip
Rewrite of choose mode, both to simplify and tidy the code and to add
some modern features. Now the common code is in mode-tree.c, which provides an API used by the three modes now separated into window-{buffer,client,tree}.c. Buffer mode shows buffers, client mode clients and tree mode a tree of sessions, windows and panes. Each mode has a common set of key bindings plus a few that are specific to the mode. Other changes are: - each mode has a preview pane: for buffers this is the buffer content (very useful), for others it is a preview of the pane; - items may be sorted in different ways ('O' key); - multiple items may be tagged and an operation applied to all of them (for example, to delete multiple buffers at once); - in tree mode a command may be run on the selected item (session, window, pane) or on tagged items (key ':'); - displayed items may be filtered in tree mode by using a format (this is used to implement find-window) (key 'f'); - the custom format (-F) for the display is no longer available; - shortcut keys change from 0-9, a-z, A-Z which was always a bit weird with keys used for other uses to 0-9, M-a to M-z. Now that the code is simpler, other improvements will come later. Primary key bindings for each mode are documented under the commands in the man page (choose-buffer, choose-client, choose-tree). Parts written by Thomas Adam.
Diffstat (limited to 'screen-write.c')
-rw-r--r--screen-write.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/screen-write.c b/screen-write.c
index 1af623b1..9f684bb3 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -362,6 +362,9 @@ screen_write_copy(struct screen_write_ctx *ctx, struct screen *src, u_int px,
struct grid_cell gc;
u_int xx, yy, cx, cy, b;
+ if (nx == 0 || ny == 0)
+ return;
+
cx = s->cx;
cy = s->cy;
@@ -384,6 +387,121 @@ screen_write_copy(struct screen_write_ctx *ctx, struct screen *src, u_int px,
}
}
+/* Draw a line on screen. */
+void
+screen_write_line(struct screen_write_ctx *ctx, u_int nx, int left, int right)
+{
+ struct screen *s = ctx->s;
+ struct grid_cell gc;
+ u_int cx, cy, i;
+
+ cx = s->cx;
+ cy = s->cy;
+
+ memcpy(&gc, &grid_default_cell, sizeof gc);
+ gc.attr |= GRID_ATTR_CHARSET;
+
+ screen_write_putc(ctx, &gc, left ? 't' : 'q');
+ for (i = 1; i < nx - 1; i++)
+ screen_write_putc(ctx, &gc, 'q');
+ screen_write_putc(ctx, &gc, right ? 'u' : 'q');
+
+ screen_write_cursormove(ctx, cx, cy);
+}
+
+/* Draw a box on screen. */
+void
+screen_write_box(struct screen_write_ctx *ctx, u_int nx, u_int ny)
+{
+ struct screen *s = ctx->s;
+ struct grid_cell gc;
+ u_int cx, cy, i;
+
+ cx = s->cx;
+ cy = s->cy;
+
+ memcpy(&gc, &grid_default_cell, sizeof gc);
+ gc.attr |= GRID_ATTR_CHARSET;
+
+ screen_write_putc(ctx, &gc, 'l');
+ for (i = 1; i < nx - 1; i++)
+ screen_write_putc(ctx, &gc, 'q');
+ screen_write_putc(ctx, &gc, 'k');
+
+ screen_write_cursormove(ctx, cx, cy + ny - 1);
+ screen_write_putc(ctx, &gc, 'm');
+ for (i = 1; i < nx - 1; i++)
+ screen_write_putc(ctx, &gc, 'q');
+ screen_write_putc(ctx, &gc, 'j');
+
+ for (i = 1; i < ny - 1; i++) {
+ screen_write_cursormove(ctx, cx, cy + i);
+ screen_write_putc(ctx, &gc, 'x');
+ }
+ for (i = 1; i < ny - 1; i++) {
+ screen_write_cursormove(ctx, cx + nx - 1, cy + i);
+ screen_write_putc(ctx, &gc, 'x');
+ }
+
+ screen_write_cursormove(ctx, cx, cy);
+}
+
+/* Write a preview version of a window. */
+void
+screen_write_preview(struct screen_write_ctx *ctx, struct screen *src, u_int nx,
+ u_int ny)
+{
+ struct screen *s = ctx->s;
+ struct grid_cell gc;
+ u_int cx, cy, px, py;
+
+ cx = s->cx;
+ cy = s->cy;
+
+ /*
+ * If the cursor is on, pick the area around the cursor, otherwise use
+ * the top left.
+ */
+ if (src->mode & MODE_CURSOR) {
+ px = src->cx;
+ if (px < nx / 3)
+ px = 0;
+ else
+ px = px - nx / 3;
+ if (px + nx > screen_size_x(src)) {
+ if (nx > screen_size_x(src))
+ px = 0;
+ else
+ px = screen_size_x(src) - nx;
+ }
+ py = src->cy;
+ if (py < ny / 3)
+ py = 0;
+ else
+ py = py - ny / 3;
+ if (py + ny > screen_size_y(src)) {
+ if (ny > screen_size_y(src))
+ py = 0;
+ else
+ py = screen_size_y(src) - ny;
+ }
+ } else {
+ px = 0;
+ py = 0;
+ }
+
+ screen_write_copy(ctx, src, px, src->grid->hsize + py, nx, ny, NULL,
+ NULL);
+
+ if (src->mode & MODE_CURSOR) {
+ grid_view_get_cell(src->grid, src->cx, src->cy, &gc);
+ gc.attr |= GRID_ATTR_REVERSE;
+ screen_write_cursormove(ctx, cx + (src->cx - px),
+ cy + (src->cy - py));
+ screen_write_cell(ctx, &gc);
+ }
+}
+
/* Set up context for TTY command. */
static void
screen_write_initctx(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx)