mirror of
https://github.com/tmux/tmux.git
synced 2025-03-31 03:58:48 +00:00
Merge branch 'obsd-master' into master
This commit is contained in:
commit
264fe7fc2a
@ -52,9 +52,10 @@ const struct cmd_entry cmd_display_popup_entry = {
|
|||||||
.name = "display-popup",
|
.name = "display-popup",
|
||||||
.alias = "popup",
|
.alias = "popup",
|
||||||
|
|
||||||
.args = { "BCc:d:e:Eh:t:w:x:y:", 0, -1, NULL },
|
.args = { "Bb:Cc:d:e:Eh:t:w:x:y:", 0, -1, NULL },
|
||||||
.usage = "[-BCE] [-c target-client] [-d start-directory] "
|
.usage = "[-BCE] [-b border-lines] [-c target-client] "
|
||||||
"[-e environment] [-h height] " CMD_TARGET_PANE_USAGE " "
|
"[-d start-directory] [-e environment] [-h height] "
|
||||||
|
CMD_TARGET_PANE_USAGE " "
|
||||||
"[-w width] [-x position] [-y position] [shell-command]",
|
"[-w width] [-x position] [-y position] [shell-command]",
|
||||||
|
|
||||||
.target = { 't', CMD_FIND_PANE, 0 },
|
.target = { 't', CMD_FIND_PANE, 0 },
|
||||||
@ -353,11 +354,14 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
struct client *tc = cmdq_get_target_client(item);
|
struct client *tc = cmdq_get_target_client(item);
|
||||||
struct tty *tty = &tc->tty;
|
struct tty *tty = &tc->tty;
|
||||||
const char *value, *shell, *shellcmd = NULL;
|
const char *value, *shell, *shellcmd = NULL;
|
||||||
char *cwd, *cause, **argv = NULL;
|
char *cwd, *cause = NULL, **argv = NULL;
|
||||||
int flags = 0, argc = 0;
|
int flags = 0, argc = 0;
|
||||||
|
enum box_lines lines = BOX_LINES_DEFAULT;
|
||||||
u_int px, py, w, h, count = args_count(args);
|
u_int px, py, w, h, count = args_count(args);
|
||||||
struct args_value *av;
|
struct args_value *av;
|
||||||
struct environ *env = NULL;
|
struct environ *env = NULL;
|
||||||
|
struct options *o = s->curw->window->options;
|
||||||
|
struct options_entry *oe;
|
||||||
|
|
||||||
if (args_has(args, 'C')) {
|
if (args_has(args, 'C')) {
|
||||||
server_client_clear_overlay(tc);
|
server_client_clear_overlay(tc);
|
||||||
@ -393,6 +397,20 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
if (!cmd_display_menu_get_position(tc, item, args, &px, &py, w, h))
|
if (!cmd_display_menu_get_position(tc, item, args, &px, &py, w, h))
|
||||||
return (CMD_RETURN_NORMAL);
|
return (CMD_RETURN_NORMAL);
|
||||||
|
|
||||||
|
value = args_get(args, 'b');
|
||||||
|
if (args_has(args, 'B'))
|
||||||
|
lines = BOX_LINES_NONE;
|
||||||
|
else if (value != NULL) {
|
||||||
|
oe = options_get(o, "popup-border-lines");
|
||||||
|
lines = options_find_choice(options_table_entry(oe), value,
|
||||||
|
&cause);
|
||||||
|
if (cause != NULL) {
|
||||||
|
cmdq_error(item, "popup-border-lines %s", cause);
|
||||||
|
free(cause);
|
||||||
|
return (CMD_RETURN_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
value = args_get(args, 'd');
|
value = args_get(args, 'd');
|
||||||
if (value != NULL)
|
if (value != NULL)
|
||||||
cwd = format_single_from_target(item, value);
|
cwd = format_single_from_target(item, value);
|
||||||
@ -424,10 +442,8 @@ cmd_display_popup_exec(struct cmd *self, struct cmdq_item *item)
|
|||||||
flags |= POPUP_CLOSEEXITZERO;
|
flags |= POPUP_CLOSEEXITZERO;
|
||||||
else if (args_has(args, 'E'))
|
else if (args_has(args, 'E'))
|
||||||
flags |= POPUP_CLOSEEXIT;
|
flags |= POPUP_CLOSEEXIT;
|
||||||
if (args_has(args, 'B'))
|
if (popup_display(flags, lines, item, px, py, w, h, env, shellcmd, argc,
|
||||||
flags |= POPUP_NOBORDER;
|
argv, cwd, tc, s, NULL, NULL) != 0) {
|
||||||
if (popup_display(flags, item, px, py, w, h, env, shellcmd, argc, argv,
|
|
||||||
cwd, tc, s, NULL, NULL) != 0) {
|
|
||||||
cmd_free_argv(argc, argv);
|
cmd_free_argv(argc, argv);
|
||||||
if (env != NULL)
|
if (env != NULL)
|
||||||
environ_free(env);
|
environ_free(env);
|
||||||
|
@ -747,7 +747,7 @@ mode_tree_draw(struct mode_tree_data *mtd)
|
|||||||
mti = mti->parent;
|
mti = mti->parent;
|
||||||
|
|
||||||
screen_write_cursormove(&ctx, 0, h, 0);
|
screen_write_cursormove(&ctx, 0, h, 0);
|
||||||
screen_write_box(&ctx, w, sy - h, NULL);
|
screen_write_box(&ctx, w, sy - h, BOX_LINES_DEFAULT, NULL);
|
||||||
|
|
||||||
if (mtd->sort_list != NULL) {
|
if (mtd->sort_list != NULL) {
|
||||||
xasprintf(&text, " %s (sort: %s%s)", mti->name,
|
xasprintf(&text, " %s (sort: %s%s)", mti->name,
|
||||||
|
@ -59,9 +59,12 @@ static const char *options_table_visual_bell_list[] = {
|
|||||||
static const char *options_table_pane_status_list[] = {
|
static const char *options_table_pane_status_list[] = {
|
||||||
"off", "top", "bottom", NULL
|
"off", "top", "bottom", NULL
|
||||||
};
|
};
|
||||||
static const char *options_table_pane_lines_list[] = {
|
static const char *options_table_pane_border_lines_list[] = {
|
||||||
"single", "double", "heavy", "simple", "number", NULL
|
"single", "double", "heavy", "simple", "number", NULL
|
||||||
};
|
};
|
||||||
|
static const char *options_table_popup_border_lines_list[] = {
|
||||||
|
"single", "double", "heavy", "simple", "rounded", "padded", "none", NULL
|
||||||
|
};
|
||||||
static const char *options_table_set_clipboard_list[] = {
|
static const char *options_table_set_clipboard_list[] = {
|
||||||
"off", "external", "on", NULL
|
"off", "external", "on", NULL
|
||||||
};
|
};
|
||||||
@ -950,7 +953,7 @@ const struct options_table_entry options_table[] = {
|
|||||||
{ .name = "pane-border-lines",
|
{ .name = "pane-border-lines",
|
||||||
.type = OPTIONS_TABLE_CHOICE,
|
.type = OPTIONS_TABLE_CHOICE,
|
||||||
.scope = OPTIONS_TABLE_WINDOW,
|
.scope = OPTIONS_TABLE_WINDOW,
|
||||||
.choices = options_table_pane_lines_list,
|
.choices = options_table_pane_border_lines_list,
|
||||||
.default_num = PANE_LINES_SINGLE,
|
.default_num = PANE_LINES_SINGLE,
|
||||||
.text = "Type of characters used to draw pane border lines. Some of "
|
.text = "Type of characters used to draw pane border lines. Some of "
|
||||||
"these are only supported on terminals with UTF-8 support."
|
"these are only supported on terminals with UTF-8 support."
|
||||||
@ -999,6 +1002,15 @@ const struct options_table_entry options_table[] = {
|
|||||||
.text = "Default style of popup borders."
|
.text = "Default style of popup borders."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{ .name = "popup-border-lines",
|
||||||
|
.type = OPTIONS_TABLE_CHOICE,
|
||||||
|
.scope = OPTIONS_TABLE_WINDOW,
|
||||||
|
.choices = options_table_popup_border_lines_list,
|
||||||
|
.default_num = BOX_LINES_SINGLE,
|
||||||
|
.text = "Type of characters used to draw popup border lines. Some of "
|
||||||
|
"these are only supported on terminals with UTF-8 support."
|
||||||
|
},
|
||||||
|
|
||||||
{ .name = "remain-on-exit",
|
{ .name = "remain-on-exit",
|
||||||
.type = OPTIONS_TABLE_CHOICE,
|
.type = OPTIONS_TABLE_CHOICE,
|
||||||
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
|
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
|
||||||
|
31
options.c
31
options.c
@ -989,19 +989,13 @@ options_from_string_flag(struct options *oo, const char *name,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
options_from_string_choice(const struct options_table_entry *oe,
|
options_find_choice(const struct options_table_entry *oe, const char *value,
|
||||||
struct options *oo, const char *name, const char *value, char **cause)
|
char **cause)
|
||||||
{
|
{
|
||||||
const char **cp;
|
const char **cp;
|
||||||
int n, choice = -1;
|
int n = 0, choice = -1;
|
||||||
|
|
||||||
if (value == NULL) {
|
|
||||||
choice = options_get_number(oo, name);
|
|
||||||
if (choice < 2)
|
|
||||||
choice = !choice;
|
|
||||||
} else {
|
|
||||||
n = 0;
|
|
||||||
for (cp = oe->choices; *cp != NULL; cp++) {
|
for (cp = oe->choices; *cp != NULL; cp++) {
|
||||||
if (strcmp(*cp, value) == 0)
|
if (strcmp(*cp, value) == 0)
|
||||||
choice = n;
|
choice = n;
|
||||||
@ -1011,6 +1005,23 @@ options_from_string_choice(const struct options_table_entry *oe,
|
|||||||
xasprintf(cause, "unknown value: %s", value);
|
xasprintf(cause, "unknown value: %s", value);
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
return (choice);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
options_from_string_choice(const struct options_table_entry *oe,
|
||||||
|
struct options *oo, const char *name, const char *value, char **cause)
|
||||||
|
{
|
||||||
|
int choice = -1;
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
choice = options_get_number(oo, name);
|
||||||
|
if (choice < 2)
|
||||||
|
choice = !choice;
|
||||||
|
} else {
|
||||||
|
choice = options_find_choice(oe, value, cause);
|
||||||
|
if (choice < 0)
|
||||||
|
return (-1);
|
||||||
}
|
}
|
||||||
options_set_number(oo, name, choice);
|
options_set_number(oo, name, choice);
|
||||||
return (0);
|
return (0);
|
||||||
|
44
popup.c
44
popup.c
@ -30,6 +30,7 @@ struct popup_data {
|
|||||||
struct client *c;
|
struct client *c;
|
||||||
struct cmdq_item *item;
|
struct cmdq_item *item;
|
||||||
int flags;
|
int flags;
|
||||||
|
enum box_lines lines;
|
||||||
|
|
||||||
struct screen s;
|
struct screen s;
|
||||||
struct colour_palette palette;
|
struct colour_palette palette;
|
||||||
@ -116,7 +117,7 @@ popup_set_client_cb(struct tty_ctx *ttyctx, struct client *c)
|
|||||||
ttyctx->wsx = c->tty.sx;
|
ttyctx->wsx = c->tty.sx;
|
||||||
ttyctx->wsy = c->tty.sy;
|
ttyctx->wsy = c->tty.sy;
|
||||||
|
|
||||||
if (pd->flags & POPUP_NOBORDER) {
|
if (pd->lines == BOX_LINES_NONE) {
|
||||||
ttyctx->xoff = ttyctx->rxoff = pd->px;
|
ttyctx->xoff = ttyctx->rxoff = pd->px;
|
||||||
ttyctx->yoff = ttyctx->ryoff = pd->py;
|
ttyctx->yoff = ttyctx->ryoff = pd->py;
|
||||||
} else {
|
} else {
|
||||||
@ -146,7 +147,7 @@ popup_mode_cb(__unused struct client *c, void *data, u_int *cx, u_int *cy)
|
|||||||
if (pd->md != NULL)
|
if (pd->md != NULL)
|
||||||
return (menu_mode_cb(c, pd->md, cx, cy));
|
return (menu_mode_cb(c, pd->md, cx, cy));
|
||||||
|
|
||||||
if (pd->flags & POPUP_NOBORDER) {
|
if (pd->lines == BOX_LINES_NONE) {
|
||||||
*cx = pd->px + pd->s.cx;
|
*cx = pd->px + pd->s.cx;
|
||||||
*cy = pd->py + pd->s.cy;
|
*cy = pd->py + pd->s.cy;
|
||||||
} else {
|
} else {
|
||||||
@ -219,14 +220,15 @@ popup_draw_cb(struct client *c, void *data, struct screen_redraw_ctx *rctx)
|
|||||||
screen_write_clearscreen(&ctx, 8);
|
screen_write_clearscreen(&ctx, 8);
|
||||||
|
|
||||||
memcpy(&bgc, &grid_default_cell, sizeof bgc);
|
memcpy(&bgc, &grid_default_cell, sizeof bgc);
|
||||||
|
bgc.attr = 0;
|
||||||
style_apply(&bgc, o, "popup-border-style", NULL);
|
style_apply(&bgc, o, "popup-border-style", NULL);
|
||||||
bgc.attr = 0;
|
bgc.attr = 0;
|
||||||
|
|
||||||
if (pd->flags & POPUP_NOBORDER) {
|
if (pd->lines == BOX_LINES_NONE) {
|
||||||
screen_write_cursormove(&ctx, 0, 0, 0);
|
screen_write_cursormove(&ctx, 0, 0, 0);
|
||||||
screen_write_fast_copy(&ctx, &pd->s, 0, 0, pd->sx, pd->sy);
|
screen_write_fast_copy(&ctx, &pd->s, 0, 0, pd->sx, pd->sy);
|
||||||
} else if (pd->sx > 2 && pd->sy > 2) {
|
} else if (pd->sx > 2 && pd->sy > 2) {
|
||||||
screen_write_box(&ctx, pd->sx, pd->sy, &bgc);
|
screen_write_box(&ctx, pd->sx, pd->sy, pd->lines, &bgc);
|
||||||
screen_write_cursormove(&ctx, 1, 1, 0);
|
screen_write_cursormove(&ctx, 1, 1, 0);
|
||||||
screen_write_fast_copy(&ctx, &pd->s, 0, 0, pd->sx - 2,
|
screen_write_fast_copy(&ctx, &pd->s, 0, 0, pd->sx - 2,
|
||||||
pd->sy - 2);
|
pd->sy - 2);
|
||||||
@ -317,7 +319,7 @@ popup_resize_cb(__unused struct client *c, void *data)
|
|||||||
pd->px = pd->ppx;
|
pd->px = pd->ppx;
|
||||||
|
|
||||||
/* Avoid zero size screens. */
|
/* Avoid zero size screens. */
|
||||||
if (pd->flags & POPUP_NOBORDER) {
|
if (pd->lines == BOX_LINES_NONE) {
|
||||||
screen_resize(&pd->s, pd->sx, pd->sy, 0);
|
screen_resize(&pd->s, pd->sx, pd->sy, 0);
|
||||||
if (pd->job != NULL)
|
if (pd->job != NULL)
|
||||||
job_resize(pd->job, pd->sx, pd->sy );
|
job_resize(pd->job, pd->sx, pd->sy );
|
||||||
@ -443,7 +445,7 @@ popup_handle_drag(struct client *c, struct popup_data *pd,
|
|||||||
pd->ppy = py;
|
pd->ppy = py;
|
||||||
server_redraw_client(c);
|
server_redraw_client(c);
|
||||||
} else if (pd->dragging == SIZE) {
|
} else if (pd->dragging == SIZE) {
|
||||||
if (pd->flags & POPUP_NOBORDER) {
|
if (pd->lines == BOX_LINES_NONE) {
|
||||||
if (m->x < pd->px + 1)
|
if (m->x < pd->px + 1)
|
||||||
return;
|
return;
|
||||||
if (m->y < pd->py + 1)
|
if (m->y < pd->py + 1)
|
||||||
@ -459,7 +461,7 @@ popup_handle_drag(struct client *c, struct popup_data *pd,
|
|||||||
pd->psx = pd->sx;
|
pd->psx = pd->sx;
|
||||||
pd->psy = pd->sy;
|
pd->psy = pd->sy;
|
||||||
|
|
||||||
if (pd->flags & POPUP_NOBORDER) {
|
if (pd->lines == BOX_LINES_NONE) {
|
||||||
screen_resize(&pd->s, pd->sx, pd->sy, 0);
|
screen_resize(&pd->s, pd->sx, pd->sy, 0);
|
||||||
if (pd->job != NULL)
|
if (pd->job != NULL)
|
||||||
job_resize(pd->job, pd->sx, pd->sy);
|
job_resize(pd->job, pd->sx, pd->sy);
|
||||||
@ -507,7 +509,7 @@ popup_key_cb(struct client *c, void *data, struct key_event *event)
|
|||||||
goto menu;
|
goto menu;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
if (~pd->flags & POPUP_NOBORDER) {
|
if (pd->lines != BOX_LINES_NONE) {
|
||||||
if (m->x == pd->px)
|
if (m->x == pd->px)
|
||||||
border = LEFT;
|
border = LEFT;
|
||||||
else if (m->x == pd->px + pd->sx - 1)
|
else if (m->x == pd->px + pd->sx - 1)
|
||||||
@ -541,7 +543,7 @@ popup_key_cb(struct client *c, void *data, struct key_event *event)
|
|||||||
if (pd->job != NULL) {
|
if (pd->job != NULL) {
|
||||||
if (KEYC_IS_MOUSE(event->key)) {
|
if (KEYC_IS_MOUSE(event->key)) {
|
||||||
/* Must be inside, checked already. */
|
/* Must be inside, checked already. */
|
||||||
if (pd->flags & POPUP_NOBORDER) {
|
if (pd->lines == BOX_LINES_NONE) {
|
||||||
px = m->x - pd->px;
|
px = m->x - pd->px;
|
||||||
py = m->y - pd->py;
|
py = m->y - pd->py;
|
||||||
} else {
|
} else {
|
||||||
@ -627,15 +629,23 @@ popup_job_complete_cb(struct job *job)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
popup_display(int flags, struct cmdq_item *item, u_int px, u_int py, u_int sx,
|
popup_display(int flags, enum box_lines lines, struct cmdq_item *item, u_int px,
|
||||||
u_int sy, struct environ *env, const char *shellcmd, int argc, char **argv,
|
u_int py, u_int sx, u_int sy, struct environ *env, const char *shellcmd,
|
||||||
const char *cwd, struct client *c, struct session *s, popup_close_cb cb,
|
int argc, char **argv, const char *cwd, struct client *c, struct session *s,
|
||||||
void *arg)
|
popup_close_cb cb, void *arg)
|
||||||
{
|
{
|
||||||
struct popup_data *pd;
|
struct popup_data *pd;
|
||||||
u_int jx, jy;
|
u_int jx, jy;
|
||||||
|
struct options *o;
|
||||||
|
|
||||||
if (flags & POPUP_NOBORDER) {
|
if (lines == BOX_LINES_DEFAULT) {
|
||||||
|
if (s != NULL)
|
||||||
|
o = s->curw->window->options;
|
||||||
|
else
|
||||||
|
o = c->session->curw->window->options;
|
||||||
|
lines = options_get_number(o, "popup-border-lines");
|
||||||
|
}
|
||||||
|
if (lines == BOX_LINES_NONE) {
|
||||||
if (sx < 1 || sy < 1)
|
if (sx < 1 || sy < 1)
|
||||||
return (-1);
|
return (-1);
|
||||||
jx = sx;
|
jx = sx;
|
||||||
@ -652,6 +662,7 @@ popup_display(int flags, struct cmdq_item *item, u_int px, u_int py, u_int sx,
|
|||||||
pd = xcalloc(1, sizeof *pd);
|
pd = xcalloc(1, sizeof *pd);
|
||||||
pd->item = item;
|
pd->item = item;
|
||||||
pd->flags = flags;
|
pd->flags = flags;
|
||||||
|
pd->lines = lines;
|
||||||
|
|
||||||
pd->c = c;
|
pd->c = c;
|
||||||
pd->c->references++;
|
pd->c->references++;
|
||||||
@ -763,8 +774,9 @@ popup_editor(struct client *c, const char *buf, size_t len,
|
|||||||
py = (c->tty.sy / 2) - (sy / 2);
|
py = (c->tty.sy / 2) - (sy / 2);
|
||||||
|
|
||||||
xasprintf(&cmd, "%s %s", editor, path);
|
xasprintf(&cmd, "%s %s", editor, path);
|
||||||
if (popup_display(POPUP_INTERNAL|POPUP_CLOSEEXIT, NULL, px, py, sx, sy,
|
if (popup_display(POPUP_INTERNAL|POPUP_CLOSEEXIT, BOX_LINES_DEFAULT,
|
||||||
NULL, cmd, 0, NULL, _PATH_TMP, c, NULL, popup_editor_close_cb, pe) != 0) {
|
NULL, px, py, sx, sy, NULL, cmd, 0, NULL, _PATH_TMP, c, NULL,
|
||||||
|
popup_editor_close_cb, pe) != 0) {
|
||||||
popup_editor_free(pe);
|
popup_editor_free(pe);
|
||||||
free(cmd);
|
free(cmd);
|
||||||
return (-1);
|
return (-1);
|
||||||
|
@ -31,57 +31,9 @@ static void screen_redraw_draw_pane(struct screen_redraw_ctx *,
|
|||||||
static void screen_redraw_set_context(struct client *,
|
static void screen_redraw_set_context(struct client *,
|
||||||
struct screen_redraw_ctx *);
|
struct screen_redraw_ctx *);
|
||||||
|
|
||||||
#define CELL_INSIDE 0
|
|
||||||
#define CELL_TOPBOTTOM 1
|
|
||||||
#define CELL_LEFTRIGHT 2
|
|
||||||
#define CELL_TOPLEFT 3
|
|
||||||
#define CELL_TOPRIGHT 4
|
|
||||||
#define CELL_BOTTOMLEFT 5
|
|
||||||
#define CELL_BOTTOMRIGHT 6
|
|
||||||
#define CELL_TOPJOIN 7
|
|
||||||
#define CELL_BOTTOMJOIN 8
|
|
||||||
#define CELL_LEFTJOIN 9
|
|
||||||
#define CELL_RIGHTJOIN 10
|
|
||||||
#define CELL_JOIN 11
|
|
||||||
#define CELL_OUTSIDE 12
|
|
||||||
|
|
||||||
#define CELL_BORDERS " xqlkmjwvtun~"
|
|
||||||
|
|
||||||
#define START_ISOLATE "\342\201\246"
|
#define START_ISOLATE "\342\201\246"
|
||||||
#define END_ISOLATE "\342\201\251"
|
#define END_ISOLATE "\342\201\251"
|
||||||
|
|
||||||
static const struct utf8_data screen_redraw_double_borders[] = {
|
|
||||||
{ "", 0, 0, 0 },
|
|
||||||
{ "\342\225\221", 0, 3, 1 }, /* U+2551 */
|
|
||||||
{ "\342\225\220", 0, 3, 1 }, /* U+2550 */
|
|
||||||
{ "\342\225\224", 0, 3, 1 }, /* U+2554 */
|
|
||||||
{ "\342\225\227", 0, 3, 1 }, /* U+2557 */
|
|
||||||
{ "\342\225\232", 0, 3, 1 }, /* U+255A */
|
|
||||||
{ "\342\225\235", 0, 3, 1 }, /* U+255D */
|
|
||||||
{ "\342\225\246", 0, 3, 1 }, /* U+2566 */
|
|
||||||
{ "\342\225\251", 0, 3, 1 }, /* U+2569 */
|
|
||||||
{ "\342\225\240", 0, 3, 1 }, /* U+2560 */
|
|
||||||
{ "\342\225\243", 0, 3, 1 }, /* U+2563 */
|
|
||||||
{ "\342\225\254", 0, 3, 1 }, /* U+256C */
|
|
||||||
{ "\302\267", 0, 2, 1 } /* U+00B7 */
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct utf8_data screen_redraw_heavy_borders[] = {
|
|
||||||
{ "", 0, 0, 0 },
|
|
||||||
{ "\342\224\203", 0, 3, 1 }, /* U+2503 */
|
|
||||||
{ "\342\224\201", 0, 3, 1 }, /* U+2501 */
|
|
||||||
{ "\342\224\223", 0, 3, 1 }, /* U+2513 */
|
|
||||||
{ "\342\224\217", 0, 3, 1 }, /* U+250F */
|
|
||||||
{ "\342\224\227", 0, 3, 1 }, /* U+2517 */
|
|
||||||
{ "\342\224\233", 0, 3, 1 }, /* U+251B */
|
|
||||||
{ "\342\224\263", 0, 3, 1 }, /* U+2533 */
|
|
||||||
{ "\342\224\273", 0, 3, 1 }, /* U+253B */
|
|
||||||
{ "\342\224\243", 0, 3, 1 }, /* U+2523 */
|
|
||||||
{ "\342\224\253", 0, 3, 1 }, /* U+252B */
|
|
||||||
{ "\342\225\213", 0, 3, 1 }, /* U+254B */
|
|
||||||
{ "\302\267", 0, 2, 1 } /* U+00B7 */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum screen_redraw_border_type {
|
enum screen_redraw_border_type {
|
||||||
SCREEN_REDRAW_OUTSIDE,
|
SCREEN_REDRAW_OUTSIDE,
|
||||||
SCREEN_REDRAW_INSIDE,
|
SCREEN_REDRAW_INSIDE,
|
||||||
@ -90,8 +42,8 @@ enum screen_redraw_border_type {
|
|||||||
|
|
||||||
/* Get cell border character. */
|
/* Get cell border character. */
|
||||||
static void
|
static void
|
||||||
screen_redraw_border_set(struct window_pane *wp, int pane_lines, int cell_type,
|
screen_redraw_border_set(struct window_pane *wp, enum pane_lines pane_lines,
|
||||||
struct grid_cell *gc)
|
int cell_type, struct grid_cell *gc)
|
||||||
{
|
{
|
||||||
u_int idx;
|
u_int idx;
|
||||||
|
|
||||||
@ -110,15 +62,15 @@ screen_redraw_border_set(struct window_pane *wp, int pane_lines, int cell_type,
|
|||||||
break;
|
break;
|
||||||
case PANE_LINES_DOUBLE:
|
case PANE_LINES_DOUBLE:
|
||||||
gc->attr &= ~GRID_ATTR_CHARSET;
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
utf8_copy(&gc->data, &screen_redraw_double_borders[cell_type]);
|
utf8_copy(&gc->data, tty_acs_double_borders(cell_type));
|
||||||
break;
|
break;
|
||||||
case PANE_LINES_HEAVY:
|
case PANE_LINES_HEAVY:
|
||||||
gc->attr &= ~GRID_ATTR_CHARSET;
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
utf8_copy(&gc->data, &screen_redraw_heavy_borders[cell_type]);
|
utf8_copy(&gc->data, tty_acs_heavy_borders(cell_type));
|
||||||
break;
|
break;
|
||||||
case PANE_LINES_SIMPLE:
|
case PANE_LINES_SIMPLE:
|
||||||
gc->attr &= ~GRID_ATTR_CHARSET;
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
utf8_set(&gc->data, " |-+++++++++."[cell_type]);
|
utf8_set(&gc->data, SIMPLE_BORDERS[cell_type]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
gc->attr |= GRID_ATTR_CHARSET;
|
gc->attr |= GRID_ATTR_CHARSET;
|
||||||
@ -402,7 +354,7 @@ screen_redraw_check_is(u_int px, u_int py, int pane_status,
|
|||||||
/* Update pane status. */
|
/* Update pane status. */
|
||||||
static int
|
static int
|
||||||
screen_redraw_make_pane_status(struct client *c, struct window_pane *wp,
|
screen_redraw_make_pane_status(struct client *c, struct window_pane *wp,
|
||||||
struct screen_redraw_ctx *rctx, int pane_lines)
|
struct screen_redraw_ctx *rctx, enum pane_lines pane_lines)
|
||||||
{
|
{
|
||||||
struct window *w = wp->window;
|
struct window *w = wp->window;
|
||||||
struct grid_cell gc;
|
struct grid_cell gc;
|
||||||
@ -530,7 +482,8 @@ screen_redraw_update(struct client *c, int flags)
|
|||||||
struct window *w = c->session->curw->window;
|
struct window *w = c->session->curw->window;
|
||||||
struct window_pane *wp;
|
struct window_pane *wp;
|
||||||
struct options *wo = w->options;
|
struct options *wo = w->options;
|
||||||
int redraw, lines;
|
int redraw;
|
||||||
|
enum pane_lines lines;
|
||||||
struct screen_redraw_ctx ctx;
|
struct screen_redraw_ctx ctx;
|
||||||
|
|
||||||
if (c->message_string != NULL)
|
if (c->message_string != NULL)
|
||||||
|
@ -645,7 +645,8 @@ screen_write_menu(struct screen_write_ctx *ctx, struct menu *menu,
|
|||||||
|
|
||||||
memcpy(&default_gc, &grid_default_cell, sizeof default_gc);
|
memcpy(&default_gc, &grid_default_cell, sizeof default_gc);
|
||||||
|
|
||||||
screen_write_box(ctx, menu->width + 4, menu->count + 2, NULL);
|
screen_write_box(ctx, menu->width + 4, menu->count + 2,
|
||||||
|
BOX_LINES_DEFAULT, NULL);
|
||||||
screen_write_cursormove(ctx, cx + 2, cy, 0);
|
screen_write_cursormove(ctx, cx + 2, cy, 0);
|
||||||
format_draw(ctx, &default_gc, menu->width, menu->title, NULL);
|
format_draw(ctx, &default_gc, menu->width, menu->title, NULL);
|
||||||
|
|
||||||
@ -675,10 +676,45 @@ screen_write_menu(struct screen_write_ctx *ctx, struct menu *menu,
|
|||||||
screen_write_set_cursor(ctx, cx, cy);
|
screen_write_set_cursor(ctx, cx, cy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
screen_write_box_border_set(enum box_lines box_lines, int cell_type,
|
||||||
|
struct grid_cell *gc)
|
||||||
|
{
|
||||||
|
switch (box_lines) {
|
||||||
|
case BOX_LINES_NONE:
|
||||||
|
break;
|
||||||
|
case BOX_LINES_DOUBLE:
|
||||||
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
|
utf8_copy(&gc->data, tty_acs_double_borders(cell_type));
|
||||||
|
break;
|
||||||
|
case BOX_LINES_HEAVY:
|
||||||
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
|
utf8_copy(&gc->data, tty_acs_heavy_borders(cell_type));
|
||||||
|
break;
|
||||||
|
case BOX_LINES_ROUNDED:
|
||||||
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
|
utf8_copy(&gc->data, tty_acs_rounded_borders(cell_type));
|
||||||
|
break;
|
||||||
|
case BOX_LINES_SIMPLE:
|
||||||
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
|
utf8_set(&gc->data, SIMPLE_BORDERS[cell_type]);
|
||||||
|
break;
|
||||||
|
case BOX_LINES_PADDED:
|
||||||
|
gc->attr &= ~GRID_ATTR_CHARSET;
|
||||||
|
utf8_set(&gc->data, PADDED_BORDERS[cell_type]);
|
||||||
|
break;
|
||||||
|
case BOX_LINES_SINGLE:
|
||||||
|
case BOX_LINES_DEFAULT:
|
||||||
|
gc->attr |= GRID_ATTR_CHARSET;
|
||||||
|
utf8_set(&gc->data, CELL_BORDERS[cell_type]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Draw a box on screen. */
|
/* Draw a box on screen. */
|
||||||
void
|
void
|
||||||
screen_write_box(struct screen_write_ctx *ctx, u_int nx, u_int ny,
|
screen_write_box(struct screen_write_ctx *ctx, u_int nx, u_int ny,
|
||||||
const struct grid_cell *gcp)
|
enum box_lines l, const struct grid_cell *gcp)
|
||||||
{
|
{
|
||||||
struct screen *s = ctx->s;
|
struct screen *s = ctx->s;
|
||||||
struct grid_cell gc;
|
struct grid_cell gc;
|
||||||
@ -694,24 +730,34 @@ screen_write_box(struct screen_write_ctx *ctx, u_int nx, u_int ny,
|
|||||||
gc.attr |= GRID_ATTR_CHARSET;
|
gc.attr |= GRID_ATTR_CHARSET;
|
||||||
gc.flags |= GRID_FLAG_NOPALETTE;
|
gc.flags |= GRID_FLAG_NOPALETTE;
|
||||||
|
|
||||||
screen_write_putc(ctx, &gc, 'l');
|
/* Draw top border */
|
||||||
|
screen_write_box_border_set(l, CELL_TOPLEFT, &gc);
|
||||||
|
screen_write_cell(ctx, &gc);
|
||||||
|
screen_write_box_border_set(l, CELL_LEFTRIGHT, &gc);
|
||||||
for (i = 1; i < nx - 1; i++)
|
for (i = 1; i < nx - 1; i++)
|
||||||
screen_write_putc(ctx, &gc, 'q');
|
screen_write_cell(ctx, &gc);
|
||||||
screen_write_putc(ctx, &gc, 'k');
|
screen_write_box_border_set(l, CELL_TOPRIGHT, &gc);
|
||||||
|
screen_write_cell(ctx, &gc);
|
||||||
|
|
||||||
|
/* Draw bottom border */
|
||||||
screen_write_set_cursor(ctx, cx, cy + ny - 1);
|
screen_write_set_cursor(ctx, cx, cy + ny - 1);
|
||||||
screen_write_putc(ctx, &gc, 'm');
|
screen_write_box_border_set(l, CELL_BOTTOMLEFT, &gc);
|
||||||
|
screen_write_cell(ctx, &gc);
|
||||||
|
screen_write_box_border_set(l, CELL_LEFTRIGHT, &gc);
|
||||||
for (i = 1; i < nx - 1; i++)
|
for (i = 1; i < nx - 1; i++)
|
||||||
screen_write_putc(ctx, &gc, 'q');
|
screen_write_cell(ctx, &gc);
|
||||||
screen_write_putc(ctx, &gc, 'j');
|
screen_write_box_border_set(l, CELL_BOTTOMRIGHT, &gc);
|
||||||
|
screen_write_cell(ctx, &gc);
|
||||||
|
|
||||||
|
/* Draw sides */
|
||||||
|
screen_write_box_border_set(l, CELL_TOPBOTTOM, &gc);
|
||||||
for (i = 1; i < ny - 1; i++) {
|
for (i = 1; i < ny - 1; i++) {
|
||||||
|
/* left side */
|
||||||
screen_write_set_cursor(ctx, cx, cy + i);
|
screen_write_set_cursor(ctx, cx, cy + i);
|
||||||
screen_write_putc(ctx, &gc, 'x');
|
screen_write_cell(ctx, &gc);
|
||||||
}
|
/* right side */
|
||||||
for (i = 1; i < ny - 1; i++) {
|
|
||||||
screen_write_set_cursor(ctx, cx + nx - 1, cy + i);
|
screen_write_set_cursor(ctx, cx + nx - 1, cy + i);
|
||||||
screen_write_putc(ctx, &gc, 'x');
|
screen_write_cell(ctx, &gc);
|
||||||
}
|
}
|
||||||
|
|
||||||
screen_write_set_cursor(ctx, cx, cy);
|
screen_write_set_cursor(ctx, cx, cy);
|
||||||
|
58
tmux.1
58
tmux.1
@ -4276,6 +4276,50 @@ see the
|
|||||||
section.
|
section.
|
||||||
Attributes are ignored.
|
Attributes are ignored.
|
||||||
.Pp
|
.Pp
|
||||||
|
.It Ic popup-style Ar style
|
||||||
|
Set the popup style.
|
||||||
|
For how to specify
|
||||||
|
.Ar style ,
|
||||||
|
see the
|
||||||
|
.Sx STYLES
|
||||||
|
section.
|
||||||
|
Attributes are ignored.
|
||||||
|
.Pp
|
||||||
|
.It Ic popup-border-style Ar style
|
||||||
|
Set the popup border style.
|
||||||
|
For how to specify
|
||||||
|
.Ar style ,
|
||||||
|
see the
|
||||||
|
.Sx STYLES
|
||||||
|
section.
|
||||||
|
Attributes are ignored.
|
||||||
|
.Pp
|
||||||
|
.It Ic popup-border-lines Ar type
|
||||||
|
Set the type of characters used for drawing popup borders.
|
||||||
|
.Ar type
|
||||||
|
may be one of:
|
||||||
|
.Bl -tag -width Ds
|
||||||
|
.It single
|
||||||
|
single lines using ACS or UTF-8 characters (default)
|
||||||
|
.It rounded
|
||||||
|
variation of single with rounded corners using UTF-8 characters
|
||||||
|
.It double
|
||||||
|
double lines using UTF-8 characters
|
||||||
|
.It heavy
|
||||||
|
heavy lines using UTF-8 characters
|
||||||
|
.It simple
|
||||||
|
simple ASCII characters
|
||||||
|
.It padded
|
||||||
|
simple ASCII space character
|
||||||
|
.It none
|
||||||
|
no border
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
.Ql double
|
||||||
|
and
|
||||||
|
.Ql heavy
|
||||||
|
will fall back to standard ACS line drawing when UTF-8 is not supported.
|
||||||
|
.Pp
|
||||||
.It Ic window-status-activity-style Ar style
|
.It Ic window-status-activity-style Ar style
|
||||||
Set status line style for windows with an activity alert.
|
Set status line style for windows with an activity alert.
|
||||||
For how to specify
|
For how to specify
|
||||||
@ -5769,6 +5813,7 @@ forwards any input read from stdin to the empty pane given by
|
|||||||
.Tg popup
|
.Tg popup
|
||||||
.It Xo Ic display-popup
|
.It Xo Ic display-popup
|
||||||
.Op Fl BCE
|
.Op Fl BCE
|
||||||
|
.Op Fl b Ar border-lines
|
||||||
.Op Fl c Ar target-client
|
.Op Fl c Ar target-client
|
||||||
.Op Fl d Ar start-directory
|
.Op Fl d Ar start-directory
|
||||||
.Op Fl e Ar environment
|
.Op Fl e Ar environment
|
||||||
@ -5809,9 +5854,22 @@ and
|
|||||||
give the width and height - both may be a percentage (followed by
|
give the width and height - both may be a percentage (followed by
|
||||||
.Ql % ) .
|
.Ql % ) .
|
||||||
If omitted, half of the terminal size is used.
|
If omitted, half of the terminal size is used.
|
||||||
|
.Pp
|
||||||
.Fl B
|
.Fl B
|
||||||
does not surround the popup by a border.
|
does not surround the popup by a border.
|
||||||
.Pp
|
.Pp
|
||||||
|
.Fl b
|
||||||
|
sets the type of border line for the popup.
|
||||||
|
When
|
||||||
|
.Fl B
|
||||||
|
is specified the
|
||||||
|
.Fl b
|
||||||
|
option is ignored.
|
||||||
|
See
|
||||||
|
.Ic popup-border-lines
|
||||||
|
for possible values for
|
||||||
|
.Ar border-lines .
|
||||||
|
.Pp
|
||||||
.Fl e
|
.Fl e
|
||||||
takes the form
|
takes the form
|
||||||
.Ql VARIABLE=value
|
.Ql VARIABLE=value
|
||||||
|
64
tmux.h
64
tmux.h
@ -614,6 +614,24 @@ struct colour_palette {
|
|||||||
#define GRID_LINE_EXTENDED 0x2
|
#define GRID_LINE_EXTENDED 0x2
|
||||||
#define GRID_LINE_DEAD 0x4
|
#define GRID_LINE_DEAD 0x4
|
||||||
|
|
||||||
|
#define CELL_INSIDE 0
|
||||||
|
#define CELL_TOPBOTTOM 1
|
||||||
|
#define CELL_LEFTRIGHT 2
|
||||||
|
#define CELL_TOPLEFT 3
|
||||||
|
#define CELL_TOPRIGHT 4
|
||||||
|
#define CELL_BOTTOMLEFT 5
|
||||||
|
#define CELL_BOTTOMRIGHT 6
|
||||||
|
#define CELL_TOPJOIN 7
|
||||||
|
#define CELL_BOTTOMJOIN 8
|
||||||
|
#define CELL_LEFTJOIN 9
|
||||||
|
#define CELL_RIGHTJOIN 10
|
||||||
|
#define CELL_JOIN 11
|
||||||
|
#define CELL_OUTSIDE 12
|
||||||
|
|
||||||
|
#define CELL_BORDERS " xqlkmjwvtun~"
|
||||||
|
#define SIMPLE_BORDERS " |-+++++++++."
|
||||||
|
#define PADDED_BORDERS " "
|
||||||
|
|
||||||
/* Grid cell data. */
|
/* Grid cell data. */
|
||||||
struct grid_cell {
|
struct grid_cell {
|
||||||
struct utf8_data data;
|
struct utf8_data data;
|
||||||
@ -800,6 +818,27 @@ struct screen_write_ctx {
|
|||||||
u_int bg;
|
u_int bg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Box border lines option. */
|
||||||
|
enum box_lines {
|
||||||
|
BOX_LINES_DEFAULT = -1,
|
||||||
|
BOX_LINES_SINGLE,
|
||||||
|
BOX_LINES_DOUBLE,
|
||||||
|
BOX_LINES_HEAVY,
|
||||||
|
BOX_LINES_SIMPLE,
|
||||||
|
BOX_LINES_ROUNDED,
|
||||||
|
BOX_LINES_PADDED,
|
||||||
|
BOX_LINES_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Pane border lines option. */
|
||||||
|
enum pane_lines {
|
||||||
|
PANE_LINES_SINGLE,
|
||||||
|
PANE_LINES_DOUBLE,
|
||||||
|
PANE_LINES_HEAVY,
|
||||||
|
PANE_LINES_SIMPLE,
|
||||||
|
PANE_LINES_NUMBER
|
||||||
|
};
|
||||||
|
|
||||||
/* Screen redraw context. */
|
/* Screen redraw context. */
|
||||||
struct screen_redraw_ctx {
|
struct screen_redraw_ctx {
|
||||||
struct client *c;
|
struct client *c;
|
||||||
@ -808,7 +847,7 @@ struct screen_redraw_ctx {
|
|||||||
int statustop;
|
int statustop;
|
||||||
|
|
||||||
int pane_status;
|
int pane_status;
|
||||||
int pane_lines;
|
enum pane_lines pane_lines;
|
||||||
|
|
||||||
struct grid_cell no_pane_gc;
|
struct grid_cell no_pane_gc;
|
||||||
int no_pane_gc_set;
|
int no_pane_gc_set;
|
||||||
@ -1062,13 +1101,6 @@ TAILQ_HEAD(winlink_stack, winlink);
|
|||||||
#define PANE_STATUS_TOP 1
|
#define PANE_STATUS_TOP 1
|
||||||
#define PANE_STATUS_BOTTOM 2
|
#define PANE_STATUS_BOTTOM 2
|
||||||
|
|
||||||
/* Pane border lines option. */
|
|
||||||
#define PANE_LINES_SINGLE 0
|
|
||||||
#define PANE_LINES_DOUBLE 1
|
|
||||||
#define PANE_LINES_HEAVY 2
|
|
||||||
#define PANE_LINES_SIMPLE 3
|
|
||||||
#define PANE_LINES_NUMBER 4
|
|
||||||
|
|
||||||
/* Layout direction. */
|
/* Layout direction. */
|
||||||
enum layout_type {
|
enum layout_type {
|
||||||
LAYOUT_LEFTRIGHT,
|
LAYOUT_LEFTRIGHT,
|
||||||
@ -2067,6 +2099,8 @@ struct style *options_string_to_style(struct options *, const char *,
|
|||||||
int options_from_string(struct options *,
|
int options_from_string(struct options *,
|
||||||
const struct options_table_entry *, const char *,
|
const struct options_table_entry *, const char *,
|
||||||
const char *, int, char **);
|
const char *, int, char **);
|
||||||
|
int options_find_choice(const struct options_table_entry *,
|
||||||
|
const char *, char **);
|
||||||
void options_push_changes(const char *);
|
void options_push_changes(const char *);
|
||||||
int options_remove_or_default(struct options_entry *, int,
|
int options_remove_or_default(struct options_entry *, int,
|
||||||
char **);
|
char **);
|
||||||
@ -2217,6 +2251,9 @@ void tty_default_features(int *, const char *, u_int);
|
|||||||
int tty_acs_needed(struct tty *);
|
int tty_acs_needed(struct tty *);
|
||||||
const char *tty_acs_get(struct tty *, u_char);
|
const char *tty_acs_get(struct tty *, u_char);
|
||||||
int tty_acs_reverse_get(struct tty *, const char *, size_t);
|
int tty_acs_reverse_get(struct tty *, const char *, size_t);
|
||||||
|
const struct utf8_data *tty_acs_double_borders(int);
|
||||||
|
const struct utf8_data *tty_acs_heavy_borders(int);
|
||||||
|
const struct utf8_data *tty_acs_rounded_borders(int);
|
||||||
|
|
||||||
/* tty-keys.c */
|
/* tty-keys.c */
|
||||||
void tty_keys_build(struct tty *);
|
void tty_keys_build(struct tty *);
|
||||||
@ -2700,8 +2737,8 @@ void screen_write_hline(struct screen_write_ctx *, u_int, int, int);
|
|||||||
void screen_write_vline(struct screen_write_ctx *, u_int, int, int);
|
void screen_write_vline(struct screen_write_ctx *, u_int, int, int);
|
||||||
void screen_write_menu(struct screen_write_ctx *, struct menu *, int,
|
void screen_write_menu(struct screen_write_ctx *, struct menu *, int,
|
||||||
const struct grid_cell *);
|
const struct grid_cell *);
|
||||||
void screen_write_box(struct screen_write_ctx *, u_int, u_int,
|
void screen_write_box(struct screen_write_ctx *, u_int, u_int, int,
|
||||||
const struct grid_cell *gc);
|
const struct grid_cell *);
|
||||||
void screen_write_preview(struct screen_write_ctx *, struct screen *, u_int,
|
void screen_write_preview(struct screen_write_ctx *, struct screen *, u_int,
|
||||||
u_int);
|
u_int);
|
||||||
void screen_write_backspace(struct screen_write_ctx *);
|
void screen_write_backspace(struct screen_write_ctx *);
|
||||||
@ -3114,12 +3151,11 @@ int menu_key_cb(struct client *, void *, struct key_event *);
|
|||||||
/* popup.c */
|
/* popup.c */
|
||||||
#define POPUP_CLOSEEXIT 0x1
|
#define POPUP_CLOSEEXIT 0x1
|
||||||
#define POPUP_CLOSEEXITZERO 0x2
|
#define POPUP_CLOSEEXITZERO 0x2
|
||||||
#define POPUP_NOBORDER 0x4
|
#define POPUP_INTERNAL 0x4
|
||||||
#define POPUP_INTERNAL 0x8
|
|
||||||
typedef void (*popup_close_cb)(int, void *);
|
typedef void (*popup_close_cb)(int, void *);
|
||||||
typedef void (*popup_finish_edit_cb)(char *, size_t, void *);
|
typedef void (*popup_finish_edit_cb)(char *, size_t, void *);
|
||||||
int popup_display(int, struct cmdq_item *, u_int, u_int, u_int,
|
int popup_display(int, int, struct cmdq_item *, u_int, u_int,
|
||||||
u_int, struct environ *, const char *, int, char **,
|
u_int, u_int, struct environ *, const char *, int, char **,
|
||||||
const char *, struct client *, struct session *,
|
const char *, struct client *, struct session *,
|
||||||
popup_close_cb, void *);
|
popup_close_cb, void *);
|
||||||
int popup_editor(struct client *, const char *, size_t,
|
int popup_editor(struct client *, const char *, size_t,
|
||||||
|
72
tty-acs.c
72
tty-acs.c
@ -110,6 +110,78 @@ static const struct tty_acs_reverse_entry tty_acs_reverse3[] = {
|
|||||||
{ "\342\225\254", 'n' },
|
{ "\342\225\254", 'n' },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* UTF-8 double borders. */
|
||||||
|
static const struct utf8_data tty_acs_double_borders_list[] = {
|
||||||
|
{ "", 0, 0, 0 },
|
||||||
|
{ "\342\225\221", 0, 3, 1 }, /* U+2551 */
|
||||||
|
{ "\342\225\220", 0, 3, 1 }, /* U+2550 */
|
||||||
|
{ "\342\225\224", 0, 3, 1 }, /* U+2554 */
|
||||||
|
{ "\342\225\227", 0, 3, 1 }, /* U+2557 */
|
||||||
|
{ "\342\225\232", 0, 3, 1 }, /* U+255A */
|
||||||
|
{ "\342\225\235", 0, 3, 1 }, /* U+255D */
|
||||||
|
{ "\342\225\246", 0, 3, 1 }, /* U+2566 */
|
||||||
|
{ "\342\225\251", 0, 3, 1 }, /* U+2569 */
|
||||||
|
{ "\342\225\240", 0, 3, 1 }, /* U+2560 */
|
||||||
|
{ "\342\225\243", 0, 3, 1 }, /* U+2563 */
|
||||||
|
{ "\342\225\254", 0, 3, 1 }, /* U+256C */
|
||||||
|
{ "\302\267", 0, 2, 1 } /* U+00B7 */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* UTF-8 heavy borders. */
|
||||||
|
static const struct utf8_data tty_acs_heavy_borders_list[] = {
|
||||||
|
{ "", 0, 0, 0 },
|
||||||
|
{ "\342\224\203", 0, 3, 1 }, /* U+2503 */
|
||||||
|
{ "\342\224\201", 0, 3, 1 }, /* U+2501 */
|
||||||
|
{ "\342\224\217", 0, 3, 1 }, /* U+250F */
|
||||||
|
{ "\342\224\223", 0, 3, 1 }, /* U+2513 */
|
||||||
|
{ "\342\224\227", 0, 3, 1 }, /* U+2517 */
|
||||||
|
{ "\342\224\233", 0, 3, 1 }, /* U+251B */
|
||||||
|
{ "\342\224\263", 0, 3, 1 }, /* U+2533 */
|
||||||
|
{ "\342\224\273", 0, 3, 1 }, /* U+253B */
|
||||||
|
{ "\342\224\243", 0, 3, 1 }, /* U+2523 */
|
||||||
|
{ "\342\224\253", 0, 3, 1 }, /* U+252B */
|
||||||
|
{ "\342\225\213", 0, 3, 1 }, /* U+254B */
|
||||||
|
{ "\302\267", 0, 2, 1 } /* U+00B7 */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* UTF-8 rounded borders. */
|
||||||
|
static const struct utf8_data tty_acs_rounded_borders_list[] = {
|
||||||
|
{ "", 0, 0, 0 },
|
||||||
|
{ "\342\224\202", 0, 3, 1 }, /* U+2502 */
|
||||||
|
{ "\342\224\200", 0, 3, 1 }, /* U+2500 */
|
||||||
|
{ "\342\225\255", 0, 3, 1 }, /* U+256D */
|
||||||
|
{ "\342\225\256", 0, 3, 1 }, /* U+256E */
|
||||||
|
{ "\342\225\260", 0, 3, 1 }, /* U+2570 */
|
||||||
|
{ "\342\225\257", 0, 3, 1 }, /* U+256F */
|
||||||
|
{ "\342\224\263", 0, 3, 1 }, /* U+2533 */
|
||||||
|
{ "\342\224\273", 0, 3, 1 }, /* U+253B */
|
||||||
|
{ "\342\224\243", 0, 3, 1 }, /* U+2523 */
|
||||||
|
{ "\342\224\253", 0, 3, 1 }, /* U+252B */
|
||||||
|
{ "\342\225\213", 0, 3, 1 }, /* U+254B */
|
||||||
|
{ "\302\267", 0, 2, 1 } /* U+00B7 */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Get cell border character for double style. */
|
||||||
|
const struct utf8_data *
|
||||||
|
tty_acs_double_borders(int cell_type)
|
||||||
|
{
|
||||||
|
return (&tty_acs_double_borders_list[cell_type]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get cell border character for heavy style. */
|
||||||
|
const struct utf8_data *
|
||||||
|
tty_acs_heavy_borders(int cell_type)
|
||||||
|
{
|
||||||
|
return (&tty_acs_heavy_borders_list[cell_type]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get cell border character for rounded style. */
|
||||||
|
const struct utf8_data *
|
||||||
|
tty_acs_rounded_borders(int cell_type)
|
||||||
|
{
|
||||||
|
return (&tty_acs_rounded_borders_list[cell_type]);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tty_acs_cmp(const void *key, const void *value)
|
tty_acs_cmp(const void *key, const void *value)
|
||||||
{
|
{
|
||||||
|
@ -519,7 +519,7 @@ window_tree_draw_label(struct screen_write_ctx *ctx, u_int px, u_int py,
|
|||||||
|
|
||||||
if (ox > 1 && ox + len < sx - 1 && sy >= 3) {
|
if (ox > 1 && ox + len < sx - 1 && sy >= 3) {
|
||||||
screen_write_cursormove(ctx, px + ox - 1, py + oy - 1, 0);
|
screen_write_cursormove(ctx, px + ox - 1, py + oy - 1, 0);
|
||||||
screen_write_box(ctx, len + 2, 3, NULL);
|
screen_write_box(ctx, len + 2, 3, BOX_LINES_DEFAULT, NULL);
|
||||||
}
|
}
|
||||||
screen_write_cursormove(ctx, px + ox, py + oy, 0);
|
screen_write_cursormove(ctx, px + ox, py + oy, 0);
|
||||||
screen_write_puts(ctx, gc, "%s", label);
|
screen_write_puts(ctx, gc, "%s", label);
|
||||||
|
Loading…
Reference in New Issue
Block a user