diff --git a/cmd-load-buffer.c b/cmd-load-buffer.c index 4acbab5e..6540aedc 100644 --- a/cmd-load-buffer.c +++ b/cmd-load-buffer.c @@ -72,7 +72,7 @@ cmd_load_buffer_exec(struct cmd *self, struct cmd_q *cmdq) buffer_ptr = xmalloc(sizeof *buffer_ptr); *buffer_ptr = buffer; - error = server_set_stdin_callback (c, cmd_load_buffer_callback, + error = server_set_stdin_callback(c, cmd_load_buffer_callback, buffer_ptr, &cause); if (error != 0) { cmdq_error(cmdq, "%s: %s", path, cause); diff --git a/cmd-set-option.c b/cmd-set-option.c index b760b045..15b14f08 100644 --- a/cmd-set-option.c +++ b/cmd-set-option.c @@ -172,7 +172,7 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq) } /* Start or stop timers when automatic-rename changed. */ - if (strcmp (oe->name, "automatic-rename") == 0) { + if (strcmp(oe->name, "automatic-rename") == 0) { for (i = 0; i < ARRAY_LENGTH(&windows); i++) { if ((w = ARRAY_ITEM(&windows, i)) == NULL) continue; diff --git a/cmd-show-messages.c b/cmd-show-messages.c index 0905c32e..551966ed 100644 --- a/cmd-show-messages.c +++ b/cmd-show-messages.c @@ -48,12 +48,12 @@ const struct cmd_entry cmd_server_info_entry = { cmd_show_messages_exec }; -void cmd_show_messages_server (struct cmd_q *); -void cmd_show_messages_terminals (struct cmd_q *); -void cmd_show_messages_jobs (struct cmd_q *); +void cmd_show_messages_server(struct cmd_q *); +void cmd_show_messages_terminals(struct cmd_q *); +void cmd_show_messages_jobs(struct cmd_q *); void -cmd_show_messages_server (struct cmd_q *cmdq) +cmd_show_messages_server(struct cmd_q *cmdq) { char *tim; @@ -67,7 +67,7 @@ cmd_show_messages_server (struct cmd_q *cmdq) } void -cmd_show_messages_terminals (struct cmd_q *cmdq) +cmd_show_messages_terminals(struct cmd_q *cmdq) { struct tty_term *term; const struct tty_term_code_entry *ent; @@ -110,7 +110,7 @@ cmd_show_messages_terminals (struct cmd_q *cmdq) } void -cmd_show_messages_jobs (struct cmd_q *cmdq) +cmd_show_messages_jobs(struct cmd_q *cmdq) { struct job *job; u_int n; @@ -135,20 +135,20 @@ cmd_show_messages_exec(struct cmd *self, struct cmd_q *cmdq) int done; done = 0; - if (args_has (args, 'I') || self->entry == &cmd_server_info_entry) { - cmd_show_messages_server (cmdq); + if (args_has(args, 'I') || self->entry == &cmd_server_info_entry) { + cmd_show_messages_server(cmdq); done = 1; } - if (args_has (args, 'T') || self->entry == &cmd_server_info_entry) { + if (args_has(args, 'T') || self->entry == &cmd_server_info_entry) { if (done) - cmdq_print (cmdq, "%s", ""); - cmd_show_messages_terminals (cmdq); + cmdq_print(cmdq, "%s", ""); + cmd_show_messages_terminals(cmdq); done = 1; } - if (args_has (args, 'J') || self->entry == &cmd_server_info_entry) { + if (args_has(args, 'J') || self->entry == &cmd_server_info_entry) { if (done) - cmdq_print (cmdq, "%s", ""); - cmd_show_messages_jobs (cmdq); + cmdq_print(cmdq, "%s", ""); + cmd_show_messages_jobs(cmdq); done = 1; } if (done) diff --git a/cmd-switch-client.c b/cmd-switch-client.c index 3d97c5b7..d8f7346f 100644 --- a/cmd-switch-client.c +++ b/cmd-switch-client.c @@ -61,7 +61,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_q *cmdq) { struct args *args = self->args; struct client *c; - struct session *s; + struct session *s = NULL; struct winlink *wl = NULL; struct window *w = NULL; struct window_pane *wp = NULL; diff --git a/grid.c b/grid.c index 07bd1a7e..52d6f6bc 100644 --- a/grid.c +++ b/grid.c @@ -749,7 +749,7 @@ grid_reflow_split(struct grid *dst, u_int *py, struct grid_line *src_gl, dst_gl->flags |= GRID_LINE_WRAPPED; /* Copy the data. */ - memcpy (&dst_gl->celldata[0], &src_gl->celldata[offset], + memcpy(&dst_gl->celldata[0], &src_gl->celldata[offset], to_copy * sizeof dst_gl->celldata[0]); /* Move offset and reduce old line size. */ diff --git a/mode-key.c b/mode-key.c index dfa3fb28..95fad285 100644 --- a/mode-key.c +++ b/mode-key.c @@ -153,6 +153,7 @@ const struct mode_key_entry mode_key_vi_edit[] = { { '\025' /* C-u */, 0, MODEKEYEDIT_DELETELINE }, { '\027' /* C-w */, 0, MODEKEYEDIT_DELETEWORD }, { '\033' /* Escape */, 0, MODEKEYEDIT_SWITCHMODE }, + { '\n', 0, MODEKEYEDIT_ENTER }, { '\r', 0, MODEKEYEDIT_ENTER }, { KEYC_BSPACE, 0, MODEKEYEDIT_BACKSPACE }, { KEYC_DC, 0, MODEKEYEDIT_DELETE }, @@ -176,6 +177,7 @@ const struct mode_key_entry mode_key_vi_edit[] = { { 'X', 1, MODEKEYEDIT_BACKSPACE }, { '\003' /* C-c */, 1, MODEKEYEDIT_CANCEL }, { '\010' /* C-h */, 1, MODEKEYEDIT_BACKSPACE }, + { '\n', 1, MODEKEYEDIT_ENTER }, { '\r', 1, MODEKEYEDIT_ENTER }, { '^', 1, MODEKEYEDIT_STARTOFLINE }, { 'a', 1, MODEKEYEDIT_SWITCHMODEAPPEND }, @@ -219,6 +221,7 @@ const struct mode_key_entry mode_key_vi_choice[] = { { '\005' /* C-e */, 0, MODEKEYCHOICE_SCROLLDOWN }, { '\006' /* C-f */, 0, MODEKEYCHOICE_PAGEDOWN }, { '\031' /* C-y */, 0, MODEKEYCHOICE_SCROLLUP }, + { '\n', 0, MODEKEYCHOICE_CHOOSE }, { '\r', 0, MODEKEYCHOICE_CHOOSE }, { 'j', 0, MODEKEYCHOICE_DOWN }, { 'k', 0, MODEKEYCHOICE_UP }, @@ -281,6 +284,7 @@ const struct mode_key_entry mode_key_vi_copy[] = { { '\025' /* C-u */, 0, MODEKEYCOPY_HALFPAGEUP }, { '\031' /* C-y */, 0, MODEKEYCOPY_SCROLLUP }, { '\033' /* Escape */, 0, MODEKEYCOPY_CLEARSELECTION }, + { '\n', 0, MODEKEYCOPY_COPYSELECTION }, { '\r', 0, MODEKEYCOPY_COPYSELECTION }, { '^', 0, MODEKEYCOPY_BACKTOINDENTATION }, { 'b', 0, MODEKEYCOPY_PREVIOUSWORD }, @@ -329,6 +333,7 @@ const struct mode_key_entry mode_key_emacs_edit[] = { { '\027' /* C-w */, 0, MODEKEYEDIT_DELETEWORD }, { '\031' /* C-y */, 0, MODEKEYEDIT_PASTE }, { '\033' /* Escape */, 0, MODEKEYEDIT_CANCEL }, + { '\n', 0, MODEKEYEDIT_ENTER }, { '\r', 0, MODEKEYEDIT_ENTER }, { 'b' | KEYC_ESCAPE, 0, MODEKEYEDIT_PREVIOUSWORD }, { 'f' | KEYC_ESCAPE, 0, MODEKEYEDIT_NEXTWORDEND }, @@ -363,6 +368,7 @@ const struct mode_key_entry mode_key_emacs_choice[] = { { '\020' /* C-p */, 0, MODEKEYCHOICE_UP }, { '\026' /* C-v */, 0, MODEKEYCHOICE_PAGEDOWN }, { '\033' /* Escape */, 0, MODEKEYCHOICE_CANCEL }, + { '\n', 0, MODEKEYCHOICE_CHOOSE }, { '\r', 0, MODEKEYCHOICE_CHOOSE }, { 'q', 0, MODEKEYCHOICE_CANCEL }, { 'v' | KEYC_ESCAPE, 0, MODEKEYCHOICE_PAGEUP }, diff --git a/server-client.c b/server-client.c index ce1074a2..3630a672 100644 --- a/server-client.c +++ b/server-client.c @@ -67,9 +67,9 @@ server_client_create(int fd) c->cmdq = cmdq_new(c); c->cmdq->client_exit = 1; - c->stdin_data = evbuffer_new (); - c->stdout_data = evbuffer_new (); - c->stderr_data = evbuffer_new (); + c->stdin_data = evbuffer_new(); + c->stdout_data = evbuffer_new(); + c->stderr_data = evbuffer_new(); c->tty.fd = -1; c->title = NULL; @@ -122,7 +122,7 @@ server_client_open(struct client *c, struct session *s, char **cause) return (0); if (!(c->flags & CLIENT_TERMINAL)) { - *cause = xstrdup ("not a terminal"); + *cause = xstrdup("not a terminal"); return (-1); } @@ -173,7 +173,7 @@ server_client_lost(struct client *c) evtimer_del(&c->identify_timer); free(c->message_string); - if (event_initialized (&c->message_timer)) + if (event_initialized(&c->message_timer)) evtimer_del(&c->message_timer); for (i = 0; i < ARRAY_LENGTH(&c->message_log); i++) { msg = &ARRAY_ITEM(&c->message_log, i); @@ -279,7 +279,7 @@ server_client_status_timer(void) interval = options_get_number(&s->options, "status-interval"); difference = tv.tv_sec - c->status_timer.tv_sec; - if (difference >= interval) { + if (interval != 0 && difference >= interval) { status_update_jobs(c); c->flags |= CLIENT_STATUS; } diff --git a/server-fn.c b/server-fn.c index 4fc4eb5c..a00cadbd 100644 --- a/server-fn.c +++ b/server-fn.c @@ -454,7 +454,7 @@ server_destroy_session(struct session *s) } void -server_check_unattached (void) +server_check_unattached(void) { struct session *s; @@ -480,7 +480,7 @@ server_set_identify(struct client *c) tv.tv_sec = delay / 1000; tv.tv_usec = (delay % 1000) * 1000L; - if (event_initialized (&c->identify_timer)) + if (event_initialized(&c->identify_timer)) evtimer_del(&c->identify_timer); evtimer_set(&c->identify_timer, server_callback_identify, c); evtimer_add(&c->identify_timer, &tv); @@ -592,7 +592,7 @@ server_set_stdin_callback(struct client *c, void (*cb)(struct client *, int, c->references++; if (c->stdin_closed) - c->stdin_callback (c, 1, c->stdin_callback_data); + c->stdin_callback(c, 1, c->stdin_callback_data); server_write_client(c, MSG_STDIN, NULL, 0); diff --git a/server-window.c b/server-window.c index 4f5a5504..687d4239 100644 --- a/server-window.c +++ b/server-window.c @@ -76,7 +76,7 @@ server_window_check_bell(struct session *s, struct winlink *wl) wl->flags |= WINLINK_BELL; if (s->flags & SESSION_UNATTACHED) return (0); - if (s->curw->window == wl->window) + if (s->curw->window == w) w->flags &= ~WINDOW_BELL; visual = options_get_number(&s->options, "visual-bell"); @@ -93,10 +93,8 @@ server_window_check_bell(struct session *s, struct winlink *wl) } if (c->session->curw->window == w) status_message_set(c, "Bell in current window"); - else if (action == BELL_ANY) { - status_message_set(c, "Bell in window %u", - winlink_find_by_window(&s->windows, w)->idx); - } + else if (action == BELL_ANY) + status_message_set(c, "Bell in window %u", wl->idx); } return (1); @@ -110,7 +108,7 @@ server_window_check_activity(struct session *s, struct winlink *wl) struct window *w = wl->window; u_int i; - if (s->curw->window == wl->window) + if (s->curw->window == w) w->flags &= ~WINDOW_ACTIVITY; if (!(w->flags & WINDOW_ACTIVITY) || wl->flags & WINLINK_ACTIVITY) @@ -130,8 +128,7 @@ server_window_check_activity(struct session *s, struct winlink *wl) c = ARRAY_ITEM(&clients, i); if (c == NULL || c->session != s) continue; - status_message_set(c, "Activity in window %u", - winlink_find_by_window(&s->windows, w)->idx); + status_message_set(c, "Activity in window %u", wl->idx); } } @@ -182,8 +179,7 @@ server_window_check_silence(struct session *s, struct winlink *wl) c = ARRAY_ITEM(&clients, i); if (c == NULL || c->session != s) continue; - status_message_set(c, "Silence in window %u", - winlink_find_by_window(&s->windows, w)->idx); + status_message_set(c, "Silence in window %u", wl->idx); } } @@ -225,8 +221,7 @@ server_window_check_content( c = ARRAY_ITEM(&clients, i); if (c == NULL || c->session != s) continue; - status_message_set(c, "Content in window %u", - winlink_find_by_window(&s->windows, w)->idx); + status_message_set(c, "Content in window %u", wl->idx); } } diff --git a/status.c b/status.c index ffc66ad5..9967dc68 100644 --- a/status.c +++ b/status.c @@ -445,11 +445,11 @@ status_replace(struct client *c, struct session *s, struct winlink *wl, if (fmt == NULL) return (xstrdup("")); - if (s == NULL) + if (s == NULL && c != NULL) s = c->session; - if (wl == NULL) + if (wl == NULL && s != NULL) wl = s->curw; - if (wp == NULL) + if (wp == NULL && wl != NULL) wp = wl->window->active; len = strftime(in, sizeof in, fmt, localtime(&t)); @@ -472,10 +472,14 @@ status_replace(struct client *c, struct session *s, struct winlink *wl, *optr = '\0'; ft = format_create(); - format_client(ft, c); - format_session(ft, s); - format_winlink(ft, s, wl); - format_window_pane(ft, wp); + if (c != NULL) + format_client(ft, c); + if (s != NULL) + format_session(ft, s); + if (s != NULL && wl != NULL) + format_winlink(ft, s, wl); + if (wp != NULL) + format_window_pane(ft, wp); expanded = format_expand(ft, out); format_free(ft); return (expanded); @@ -686,7 +690,7 @@ status_message_set(struct client *c, const char *fmt, ...) tv.tv_sec = delay / 1000; tv.tv_usec = (delay % 1000) * 1000L; - if (event_initialized (&c->message_timer)) + if (event_initialized(&c->message_timer)) evtimer_del(&c->message_timer); evtimer_set(&c->message_timer, status_message_callback, c); evtimer_add(&c->message_timer, &tv); diff --git a/tmux.1 b/tmux.1 index cff5204e..aa3e11ce 100644 --- a/tmux.1 +++ b/tmux.1 @@ -787,7 +787,7 @@ With .Fl t , display the log for .Ar target-client . -.Fl I, +.Fl I , .Fl J and .Fl T @@ -2503,7 +2503,7 @@ Display will be passed through .Xr strftime 3 and formats (see -.Sx FORMATS Ns ) +.Sx FORMATS ) will be expanded. It may also contain any of the following special character sequences: .Bl -column "Character pair" "Replaced with" -offset indent @@ -2641,9 +2641,9 @@ The terminal entry value is passed through before interpretation. The default value forcibly corrects the .Ql colors -entry for terminals which support 88 or 256 colours: +entry for terminals which support 256 colours: .Bd -literal -offset indent -"*88col*:colors=88,*256col*:colors=256,xterm*:XT" +"*256col*:colors=256,xterm*:XT" .Ed .It Ic update-environment Ar variables Set a space-separated string containing a list of environment variables to be diff --git a/tty-keys.c b/tty-keys.c index 595ad6e1..7fb91a84 100644 --- a/tty-keys.c +++ b/tty-keys.c @@ -479,6 +479,15 @@ tty_keys_next(struct tty *tty) goto partial_key; } + /* Look for matching key string and return if found. */ + tk = tty_keys_find(tty, buf, len, &size); + if (tk != NULL) { + if (tk->next != NULL) + goto partial_key; + key = tk->key; + goto complete_key; + } + /* Try to parse a key with an xterm-style modifier. */ switch (xterm_keys_find(buf, len, &size, &key)) { case 0: /* found */ @@ -489,15 +498,6 @@ tty_keys_next(struct tty *tty) goto partial_key; } - /* Look for matching key string and return if found. */ - tk = tty_keys_find(tty, buf, len, &size); - if (tk != NULL) { - if (tk->next != NULL) - goto partial_key; - key = tk->key; - goto complete_key; - } - first_key: /* Is this a meta key? */ if (len >= 2 && buf[0] == '\033') { diff --git a/tty.c b/tty.c index 675af024..eb2511c9 100644 --- a/tty.c +++ b/tty.c @@ -1581,13 +1581,29 @@ tty_try_256(struct tty *tty, u_char colour, const char *type) { char s[32]; - if (!(tty->term->flags & TERM_256COLOURS) && - !(tty->term_flags & TERM_256COLOURS)) - return (-1); + /* + * If the terminfo entry has 256 colours, assume that setaf and setab + * work correctly. + */ + if (tty->term->flags & TERM_256COLOURS) { + if (*type == '3') + tty_putcode1(tty, TTYC_SETAF, colour); + else + tty_putcode1(tty, TTYC_SETAB, colour); + return (0); + } - xsnprintf(s, sizeof s, "\033[%s;5;%hhum", type, colour); - tty_puts(tty, s); - return (0); + /* + * If the user has specified -2 to the client, setaf and setab may not + * work, so send the usual sequence. + */ + if (tty->term_flags & TERM_256COLOURS) { + xsnprintf(s, sizeof s, "\033[%s;5;%hhum", type, colour); + tty_puts(tty, s); + return (0); + } + + return (-1); } void diff --git a/xterm-keys.c b/xterm-keys.c index 6916552f..af3f1e76 100644 --- a/xterm-keys.c +++ b/xterm-keys.c @@ -131,7 +131,9 @@ xterm_keys_match(const char *template, const char *buf, size_t len) pos = 0; do { - if (*template != '_' && buf[pos] != *template) + if (*template == '_' && buf[pos] >= '1' && buf[pos] <= '8') + continue; + if (buf[pos] != *template) return (-1); } while (*++template != '\0' && ++pos != len);