From 2ec2837daa428def7116848a17355f3423bf038e Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 22 Jul 2009 18:02:23 +0000 Subject: [PATCH] enum tty_cmd is only used as an index into the array of command function pointers, so remove it and use the function pointers directly to represent themselves. --- screen-write.c | 38 ++++++++-------- tmux.h | 120 +++++++++++++++++++++++-------------------------- tty-write.c | 19 ++++---- tty.c | 46 ++----------------- 4 files changed, 89 insertions(+), 134 deletions(-) diff --git a/screen-write.c b/screen-write.c index b8ec57ea..2f41ae55 100644 --- a/screen-write.c +++ b/screen-write.c @@ -327,7 +327,7 @@ screen_write_alignmenttest(struct screen_write_ctx *ctx) s->rupper = 0; s->rlower = screen_size_y(s) - 1; - tty_write0(ctx->wp, TTY_ALIGNMENTTEST); + tty_write0(ctx->wp, tty_cmd_alignmenttest); } /* Insert nx characters. */ @@ -349,7 +349,7 @@ screen_write_insertcharacter(struct screen_write_ctx *ctx, u_int nx) if (s->cx <= screen_size_x(s) - 1) grid_view_insert_cells(s->grid, s->cx, s->cy, nx); - tty_writenum(ctx->wp, TTY_INSERTCHARACTER, nx); + tty_writenum(ctx->wp, tty_cmd_insertcharacter, nx); } /* Delete nx characters. */ @@ -371,7 +371,7 @@ screen_write_deletecharacter(struct screen_write_ctx *ctx, u_int nx) if (s->cx <= screen_size_x(s) - 1) grid_view_delete_cells(s->grid, s->cx, s->cy, nx); - tty_writenum(ctx->wp, TTY_DELETECHARACTER, nx); + tty_writenum(ctx->wp, tty_cmd_deletecharacter, nx); } /* Insert ny lines. */ @@ -393,7 +393,7 @@ screen_write_insertline(struct screen_write_ctx *ctx, u_int ny) grid_view_insert_lines(s->grid, s->cy, ny); - tty_writenum(ctx->wp, TTY_INSERTLINE, ny); + tty_writenum(ctx->wp, tty_cmd_insertline, ny); return; } @@ -409,7 +409,7 @@ screen_write_insertline(struct screen_write_ctx *ctx, u_int ny) else grid_view_insert_lines_region(s->grid, s->rlower, s->cy, ny); - tty_writenum(ctx->wp, TTY_INSERTLINE, ny); + tty_writenum(ctx->wp, tty_cmd_insertline, ny); } /* Delete ny lines. */ @@ -431,7 +431,7 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny) grid_view_delete_lines(s->grid, s->cy, ny); - tty_writenum(ctx->wp, TTY_DELETELINE, ny); + tty_writenum(ctx->wp, tty_cmd_deleteline, ny); return; } @@ -447,7 +447,7 @@ screen_write_deleteline(struct screen_write_ctx *ctx, u_int ny) else grid_view_delete_lines_region(s->grid, s->rlower, s->cy, ny); - tty_writenum(ctx->wp, TTY_DELETELINE, ny); + tty_writenum(ctx->wp, tty_cmd_deleteline, ny); } /* Clear line at cursor. */ @@ -460,7 +460,7 @@ screen_write_clearline(struct screen_write_ctx *ctx) grid_view_clear(s->grid, 0, s->cy, screen_size_x(s), 1); - tty_writenum(ctx->wp, TTY_CLEARLINE, 0); + tty_write0(ctx->wp, tty_cmd_clearline); } /* Clear to end of line from cursor. */ @@ -477,7 +477,7 @@ screen_write_clearendofline(struct screen_write_ctx *ctx) if (s->cx <= sx - 1) grid_view_clear(s->grid, s->cx, s->cy, sx - s->cx, 1); - tty_writenum(ctx->wp, TTY_CLEARENDOFLINE, 0); + tty_write0(ctx->wp, tty_cmd_clearendofline); } /* Clear to start of line from cursor. */ @@ -496,7 +496,7 @@ screen_write_clearstartofline(struct screen_write_ctx *ctx) else grid_view_clear(s->grid, 0, s->cy, s->cx + 1, 1); - tty_writenum(ctx->wp, TTY_CLEARSTARTOFLINE, 0); + tty_write0(ctx->wp, tty_cmd_clearstartofline); } /* Move cursor to px,py. */ @@ -539,7 +539,7 @@ screen_write_reverseindex(struct screen_write_ctx *ctx) else if (s->cy > 0) s->cy--; - tty_writenum(ctx->wp, TTY_REVERSEINDEX, 0); + tty_write0(ctx->wp, tty_cmd_reverseindex); } /* Set scroll region. */ @@ -601,7 +601,7 @@ screen_write_linefeed(struct screen_write_ctx *ctx) else if (s->cy < screen_size_y(s) - 1) s->cy++; - tty_writenum(ctx->wp, TTY_LINEFEED, 0); + tty_write0(ctx->wp, tty_cmd_linefeed); } /* Carriage return (cursor to start of line). */ @@ -653,7 +653,7 @@ screen_write_clearendofscreen(struct screen_write_ctx *ctx) grid_view_clear(s->grid, s->cx, s->cy, sx - s->cx, 1); grid_view_clear(s->grid, 0, s->cy + 1, sx, sy - (s->cy + 1)); - tty_writenum(ctx->wp, TTY_CLEARENDOFSCREEN, 0); + tty_write0(ctx->wp, tty_cmd_clearendofscreen); } /* Clear to start of screen. */ @@ -674,7 +674,7 @@ screen_write_clearstartofscreen(struct screen_write_ctx *ctx) else grid_view_clear(s->grid, 0, s->cy, s->cx + 1, 1); - tty_writenum(ctx->wp, TTY_CLEARSTARTOFSCREEN, 0); + tty_write0(ctx->wp, tty_cmd_clearstartofscreen); } /* Clear entire screen. */ @@ -687,7 +687,7 @@ screen_write_clearscreen(struct screen_write_ctx *ctx) grid_view_clear(s->grid, 0, 0, screen_size_x(s), screen_size_y(s)); - tty_writenum(ctx->wp, TTY_CLEARSCREEN, 0); + tty_write0(ctx->wp, tty_cmd_clearscreen); } /* Write cell data. */ @@ -737,7 +737,7 @@ screen_write_cell( memcpy(tmp_gu->data + i, udata, UTF8_SIZE - i); /* Assume the previous character has just been input. */ - tty_writeptr(ctx->wp, TTY_UTF8CHARACTER, udata); + tty_writeptr(ctx->wp, tty_cmd_utf8character, udata); return; } @@ -790,16 +790,16 @@ screen_write_cell( /* Draw to the screen if necessary. */ if (insert) - tty_writenum(ctx->wp, TTY_INSERTCHARACTER, width); + tty_writenum(ctx->wp, tty_cmd_insertcharacter, width); ttyctx.wp = ctx->wp; ttyctx.utf8 = &gu; if (screen_check_selection(s, s->cx - width, s->cy)) { s->sel.cell.data = gc->data; ttyctx.cell = &s->sel.cell; - tty_write_cmd(TTY_CELL, &ttyctx); + tty_write(tty_cmd_cell, &ttyctx); } else { ttyctx.cell = gc; - tty_write_cmd(TTY_CELL, &ttyctx); + tty_write(tty_cmd_cell, &ttyctx); } } diff --git a/tmux.h b/tmux.h index 2062dfff..bcf0f8a8 100644 --- a/tmux.h +++ b/tmux.h @@ -273,35 +273,6 @@ struct tty_term_code_entry { const char *name; }; -/* Output commands. */ -enum tty_cmd { - TTY_ALIGNMENTTEST, - TTY_CELL, - TTY_CLEARENDOFLINE, - TTY_CLEARENDOFSCREEN, - TTY_CLEARLINE, - TTY_CLEARSCREEN, - TTY_CLEARSTARTOFLINE, - TTY_CLEARSTARTOFSCREEN, - TTY_DELETECHARACTER, - TTY_DELETELINE, - TTY_INSERTCHARACTER, - TTY_INSERTLINE, - TTY_LINEFEED, - TTY_UTF8CHARACTER, - TTY_REVERSEINDEX, -}; - -struct tty_ctx { - struct window_pane *wp; - - const struct grid_cell *cell; - const struct grid_utf8 *utf8; - - u_int num; - void *ptr; -}; - /* Message codes. */ enum hdrtype { MSG_COMMAND, @@ -805,6 +776,18 @@ struct tty { RB_HEAD(tty_keys, tty_key) ktree; }; +/* TTY command context and function pointer. */ +struct tty_ctx { + struct window_pane *wp; + + const struct grid_cell *cell; + const struct grid_utf8 *utf8; + + u_int num; + void *ptr; +}; +typedef void tty_cmd_func(struct tty *, struct tty_ctx *); + /* Client connection. */ struct client { int fd; @@ -1032,33 +1015,42 @@ void options_set_number(struct options *, const char *, long long); long long options_get_number(struct options *, const char *); /* tty.c */ -u_char tty_get_acs(struct tty *, u_char); -void tty_emulate_repeat(struct tty *, - enum tty_code_code, enum tty_code_code, u_int); -void tty_reset(struct tty *); -void tty_region(struct tty *, u_int, u_int, u_int); -void tty_cursor(struct tty *, u_int, u_int, u_int, u_int); -void tty_cell(struct tty *, - const struct grid_cell *, const struct grid_utf8 *); -void tty_putcode(struct tty *, enum tty_code_code); -void tty_putcode1(struct tty *, enum tty_code_code, int); -void tty_putcode2(struct tty *, enum tty_code_code, int, int); -void tty_puts(struct tty *, const char *); -void tty_putc(struct tty *, u_char); -void tty_pututf8(struct tty *, const struct grid_utf8 *); -void tty_init(struct tty *, char *, char *); -void tty_start_tty(struct tty *); -void tty_stop_tty(struct tty *); -void tty_detect_utf8(struct tty *); -void tty_set_title(struct tty *, const char *); -void tty_update_mode(struct tty *, int); -void tty_draw_line( - struct tty *, struct screen *, u_int, u_int, u_int); -void tty_redraw_region(struct tty *, struct window_pane *); -int tty_open(struct tty *, char **); -void tty_close(struct tty *, int); -void tty_free(struct tty *, int); -void tty_write(struct tty *, enum tty_cmd, struct tty_ctx *); +u_char tty_get_acs(struct tty *, u_char); +void tty_reset(struct tty *); +void tty_region(struct tty *, u_int, u_int, u_int); +void tty_cursor(struct tty *, u_int, u_int, u_int, u_int); +void tty_putcode(struct tty *, enum tty_code_code); +void tty_putcode1(struct tty *, enum tty_code_code, int); +void tty_putcode2(struct tty *, enum tty_code_code, int, int); +void tty_puts(struct tty *, const char *); +void tty_putc(struct tty *, u_char); +void tty_pututf8(struct tty *, const struct grid_utf8 *); +void tty_init(struct tty *, char *, char *); +void tty_start_tty(struct tty *); +void tty_stop_tty(struct tty *); +void tty_detect_utf8(struct tty *); +void tty_set_title(struct tty *, const char *); +void tty_update_mode(struct tty *, int); +void tty_draw_line(struct tty *, struct screen *, u_int, u_int, u_int); +void tty_redraw_region(struct tty *, struct window_pane *); +int tty_open(struct tty *, char **); +void tty_close(struct tty *, int); +void tty_free(struct tty *, int); +void tty_cmd_alignmenttest(struct tty *, struct tty_ctx *); +void tty_cmd_cell(struct tty *, struct tty_ctx *); +void tty_cmd_clearendofline(struct tty *, struct tty_ctx *); +void tty_cmd_clearendofscreen(struct tty *, struct tty_ctx *); +void tty_cmd_clearline(struct tty *, struct tty_ctx *); +void tty_cmd_clearscreen(struct tty *, struct tty_ctx *); +void tty_cmd_clearstartofline(struct tty *, struct tty_ctx *); +void tty_cmd_clearstartofscreen(struct tty *, struct tty_ctx *); +void tty_cmd_deletecharacter(struct tty *, struct tty_ctx *); +void tty_cmd_deleteline(struct tty *, struct tty_ctx *); +void tty_cmd_insertcharacter(struct tty *, struct tty_ctx *); +void tty_cmd_insertline(struct tty *, struct tty_ctx *); +void tty_cmd_linefeed(struct tty *, struct tty_ctx *); +void tty_cmd_utf8character(struct tty *, struct tty_ctx *); +void tty_cmd_reverseindex(struct tty *, struct tty_ctx *); /* tty-term.c */ extern struct tty_terms tty_terms; @@ -1074,17 +1066,17 @@ int tty_term_number(struct tty_term *, enum tty_code_code); int tty_term_flag(struct tty_term *, enum tty_code_code); /* tty-keys.c */ -int tty_keys_cmp(struct tty_key *, struct tty_key *); +int tty_keys_cmp(struct tty_key *, struct tty_key *); RB_PROTOTYPE(tty_keys, tty_key, entry, tty_keys_cmp); -void tty_keys_init(struct tty *); -void tty_keys_free(struct tty *); -int tty_keys_next(struct tty *, int *, u_char *); +void tty_keys_init(struct tty *); +void tty_keys_free(struct tty *); +int tty_keys_next(struct tty *, int *, u_char *); /* tty-write.c */ -void tty_write0(struct window_pane *, enum tty_cmd); -void tty_writenum(struct window_pane *, enum tty_cmd, u_int); -void tty_writeptr(struct window_pane *, enum tty_cmd, void *); -void tty_write_cmd(enum tty_cmd, struct tty_ctx *); +void tty_write0(struct window_pane *, tty_cmd_func *); +void tty_writenum(struct window_pane *, tty_cmd_func *, u_int); +void tty_writeptr(struct window_pane *, tty_cmd_func *, void *); +void tty_write(tty_cmd_func *, struct tty_ctx *); /* options-cmd.c */ void set_option_string(struct cmd_ctx *, diff --git a/tty-write.c b/tty-write.c index b8e39837..c9bc534e 100644 --- a/tty-write.c +++ b/tty-write.c @@ -23,39 +23,39 @@ #include "tmux.h" void -tty_write0(struct window_pane *wp, enum tty_cmd cmd) +tty_write0(struct window_pane *wp, tty_cmd_func *cmdfn) { struct tty_ctx ctx; memset(&ctx, 0, sizeof ctx); ctx.wp = wp; - tty_write_cmd(cmd, &ctx); + tty_write(cmdfn, &ctx); } void -tty_writenum(struct window_pane *wp, enum tty_cmd cmd, u_int num) +tty_writenum(struct window_pane *wp, tty_cmd_func *cmdfn, u_int num) { struct tty_ctx ctx; memset(&ctx, 0, sizeof ctx); ctx.wp = wp; ctx.num = num; - tty_write_cmd(cmd, &ctx); + tty_write(cmdfn, &ctx); } void -tty_writeptr(struct window_pane *wp, enum tty_cmd cmd, void *ptr) +tty_writeptr(struct window_pane *wp, tty_cmd_func *cmdfn, void *ptr) { struct tty_ctx ctx; memset(&ctx, 0, sizeof ctx); ctx.wp = wp; ctx.ptr = ptr; - tty_write_cmd(cmd, &ctx); + tty_write(cmdfn, &ctx); } void -tty_write_cmd(enum tty_cmd cmd, struct tty_ctx *ctx) +tty_write(tty_cmd_func *cmdfn, struct tty_ctx *ctx) { struct window_pane *wp = ctx->wp; struct client *c; @@ -77,9 +77,10 @@ tty_write_cmd(enum tty_cmd cmd, struct tty_ctx *ctx) continue; if (c->session->curw->window == wp->window) { + if (c->tty.flags & TTY_FREEZE || c->tty.term == NULL) + continue; tty_update_mode(&c->tty, c->tty.mode & ~MODE_CURSOR); - - tty_write(&c->tty, cmd, ctx); + cmdfn(&c->tty, ctx); } } } diff --git a/tty.c b/tty.c index dfa36a5e..c09fe6c4 100644 --- a/tty.c +++ b/tty.c @@ -38,39 +38,10 @@ void tty_attributes(struct tty *, const struct grid_cell *); void tty_attributes_fg(struct tty *, const struct grid_cell *); void tty_attributes_bg(struct tty *, const struct grid_cell *); -void tty_cmd_alignmenttest(struct tty *, struct tty_ctx *); -void tty_cmd_cell(struct tty *, struct tty_ctx *); -void tty_cmd_clearendofline(struct tty *, struct tty_ctx *); -void tty_cmd_clearendofscreen(struct tty *, struct tty_ctx *); -void tty_cmd_clearline(struct tty *, struct tty_ctx *); -void tty_cmd_clearscreen(struct tty *, struct tty_ctx *); -void tty_cmd_clearstartofline(struct tty *, struct tty_ctx *); -void tty_cmd_clearstartofscreen(struct tty *, struct tty_ctx *); -void tty_cmd_deletecharacter(struct tty *, struct tty_ctx *); -void tty_cmd_deleteline(struct tty *, struct tty_ctx *); -void tty_cmd_insertcharacter(struct tty *, struct tty_ctx *); -void tty_cmd_insertline(struct tty *, struct tty_ctx *); -void tty_cmd_linefeed(struct tty *, struct tty_ctx *); -void tty_cmd_utf8character(struct tty *, struct tty_ctx *); -void tty_cmd_reverseindex(struct tty *, struct tty_ctx *); - -void (*tty_cmds[])(struct tty *, struct tty_ctx *) = { - tty_cmd_alignmenttest, - tty_cmd_cell, - tty_cmd_clearendofline, - tty_cmd_clearendofscreen, - tty_cmd_clearline, - tty_cmd_clearscreen, - tty_cmd_clearstartofline, - tty_cmd_clearstartofscreen, - tty_cmd_deletecharacter, - tty_cmd_deleteline, - tty_cmd_insertcharacter, - tty_cmd_insertline, - tty_cmd_linefeed, - tty_cmd_utf8character, - tty_cmd_reverseindex, -}; +void tty_emulate_repeat( + struct tty *, enum tty_code_code, enum tty_code_code, u_int); +void tty_cell(struct tty *, + const struct grid_cell *, const struct grid_utf8 *); void tty_init(struct tty *tty, char *path, char *term) @@ -544,15 +515,6 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int py, u_int ox, u_int oy) } } -void -tty_write(struct tty *tty, enum tty_cmd cmd, struct tty_ctx *ctx) -{ - if (tty->flags & TTY_FREEZE || tty->term == NULL) - return; - if (tty_cmds[cmd] != NULL) - tty_cmds[cmd](tty, ctx); -} - void tty_cmd_insertcharacter(struct tty *tty, struct tty_ctx *ctx) {