📄 cmdsw_notify.c
字号:
} (void) notify_set_output_func((Notify_client)(LINT_CAST(ttysw)), NOTIFY_FUNC_NULL, tty); return (NOTIFY_DONE);}static voidttysw_reset_column(ttysw) Ttysw *ttysw;{ if ((cmdsw->sgttyb.sg_flags & XTABS) && notify_get_output_func((Notify_client)(LINT_CAST(ttysw)), ttysw->ttysw_tty) != ttysw_cr) { if (notify_set_output_func((Notify_client)(LINT_CAST(ttysw)), ttysw_cr, ttysw->ttysw_tty) == NOTIFY_FUNC_NULL) { fprintf(stderr, "cannot set output func on ttysw %x, tty fd %d\n", ttysw, ttysw->ttysw_tty); } }}/* Pkg_private */ intttysw_scan_for_completed_commands(ttysw, start_from, maybe_partial) Ttysw *ttysw; int start_from; int maybe_partial;{ register Textsw textsw = (Textsw)ttysw->ttysw_hist; register char *cp; int length = (int)textsw_get(textsw, TEXTSW_LENGTH); int use_mark = (start_from == -1); int cmd_length; if (use_mark) { if (TEXTSW_INFINITY == ( start_from = textsw_find_mark(textsw, cmdsw->user_mark) )) ERROR_RETURN(1); if (start_from == length) return(0); } cmd_length = length - start_from; /* Copy these commands into the buffer for pty */ if ((iwbp+cmd_length) < iebp) { (void) textsw_get(textsw, TEXTSW_CONTENTS, start_from, iwbp, cmd_length); if (maybe_partial) { /* Discard partial commands. */ for (cp = iwbp+cmd_length-1; cp >= iwbp; --cp) { switch (*cp) { case '\n': case '\r': goto Done; default: if (*cp == cmdsw->tchars.t_brkc) goto Done; cmd_length--; break; } } }Done: if (cmd_length > 0) { iwbp += cmd_length; cp = iwbp-1; (void)ttysw_reset_conditions(ttysw); if (*cp == '\n' || *cp == '\r') { ttysw_reset_column(ttysw); } ttysw_move_mark(textsw, &cmdsw->pty_mark, (Textsw_index)(start_from+cmd_length), TEXTSW_MARK_DEFAULTS); if (cmdsw->cmd_started) { if (start_from+cmd_length < length) { ttysw_move_mark(textsw, &cmdsw->user_mark, (Textsw_index)(start_from+cmd_length), TEXTSW_MARK_DEFAULTS); } else { cmdsw->cmd_started = 0; } if (cmdsw->append_only_log) { ttysw_move_mark(textsw, &cmdsw->read_only_mark, (Textsw_index)(start_from+cmd_length), TEXTSW_MARK_READ_ONLY); } } cmdsw->pty_owes_newline = 0; } return(0); } else { Event alert_event; (void) alert_prompt( (Frame)window_get(textsw, WIN_OWNER), &alert_event, ALERT_MESSAGE_STRINGS, "Pty cmd buffer overflow: last cmd ignored.", 0, ALERT_BUTTON_YES, "Continue", ALERT_TRIGGER, ACTION_STOP, 0); return(0); }}/* Pkg_private */ voidttysw_doing_pty_insert(textsw, commandsw, toggle) register Textsw textsw; Cmdsw *commandsw; unsigned toggle;{ unsigned notify_level = (unsigned) window_get(textsw, TEXTSW_NOTIFY_LEVEL); commandsw->doing_pty_insert = toggle; if (toggle) { window_set(textsw, TEXTSW_NOTIFY_LEVEL, notify_level & (~TEXTSW_NOTIFY_EDIT), 0); } else { window_set(textsw, TEXTSW_NOTIFY_LEVEL, notify_level | TEXTSW_NOTIFY_EDIT, 0); }}intttysw_cmd(ttysw_opaque, buf, buflen) caddr_t ttysw_opaque; char *buf; int buflen;{ Ttysw *ttysw = (Ttysw *) LINT_CAST(ttysw_opaque); if (ttysw_getopt((caddr_t)ttysw, TTYOPT_TEXT) && cmdsw->cooked_echo) { return (ttysw_cooked_echo_cmd(ttysw_opaque, buf, buflen)); } else { return (ttysw_input((caddr_t)ttysw, buf, buflen)); }}/* Pkg_private */ int ttysw_cooked_echo_cmd(ttysw_opaque, buf, buflen) caddr_t ttysw_opaque; char *buf; int buflen;{ Ttysw *ttysw = (Ttysw *) LINT_CAST(ttysw_opaque); register Textsw textsw = (Textsw)ttysw->ttysw_hist; Textsw_index insert = (Textsw_index)textsw_get(textsw, TEXTSW_INSERTION_POINT); int length = (Textsw_index)textsw_get(textsw, TEXTSW_LENGTH); Textsw_index insert_at; Textsw_mark insert_mark; if (cmdsw->append_only_log) { textsw_remove_mark(textsw, cmdsw->read_only_mark); } if (cmdsw->cmd_started) { insert_at = find_and_remove_mark(textsw, cmdsw->user_mark); if (insert_at == TEXTSW_INFINITY) ERROR_RETURN(-1); if (insert == insert_at) { insert_mark = TEXTSW_NULL_MARK; } else { insert_mark = textsw_add_mark(textsw, insert, TEXTSW_MARK_DEFAULTS); } } else { if (insert == length) (void)textsw_checkpoint_again(textsw); cmdsw->next_undo_point = textsw_checkpoint_undo(textsw, (caddr_t)TEXTSW_INFINITY); insert_at = length; } if (insert != insert_at) { (void)textsw_set(textsw, TEXTSW_INSERTION_POINT, insert_at, 0); } (void)textsw_checkpoint_undo(textsw, cmdsw->next_undo_point); /* Stop this insertion from triggering the cmd scanner! */ ttysw_doing_pty_insert(textsw, cmdsw, TRUE); (void)textsw_insert(textsw, buf, (long) buflen); ttysw_doing_pty_insert(textsw, cmdsw, FALSE); (void) ttysw_scan_for_completed_commands(ttysw, (int) insert_at, TRUE); if (cmdsw->cmd_started) { insert_at = (Textsw_index)textsw_get(textsw, TEXTSW_INSERTION_POINT); if (insert_at == TEXTSW_INFINITY) ERROR_RETURN(-1); cmdsw->user_mark = textsw_add_mark(textsw, (Textsw_index)insert_at, TEXTSW_MARK_DEFAULTS); if (cmdsw->append_only_log) { cmdsw->read_only_mark = textsw_add_mark(textsw, cmdsw->cooked_echo ? insert_at : TEXTSW_INFINITY-1, TEXTSW_MARK_READ_ONLY); } if (insert_mark != TEXTSW_NULL_MARK) { insert = find_and_remove_mark(textsw, insert_mark); if (insert == TEXTSW_INFINITY) ERROR_RETURN(-1); (void)textsw_set(textsw, TEXTSW_INSERTION_POINT, insert, 0); } } else { if (insert < length) (void)textsw_set(textsw, TEXTSW_INSERTION_POINT, insert, 0); if (cmdsw->append_only_log) { length = (int)textsw_get(textsw, TEXTSW_LENGTH); cmdsw->read_only_mark = textsw_add_mark(textsw, (Textsw_index)(cmdsw->cooked_echo ? length : TEXTSW_INFINITY-1), TEXTSW_MARK_READ_ONLY); } } return (0);}/* ARGSUSED */static voidttysw_textsw_changed_handler(textsw, insert_before, length_before, replaced_from, replaced_to, count_inserted) Textsw textsw; int insert_before; int length_before; int replaced_from; int replaced_to; int count_inserted;{ Ttysw *ttysw = (Ttysw *)LINT_CAST(textsw_get(textsw, TEXTSW_CLIENT_DATA)); char last_inserted; if (insert_before != length_before) return; if (cmdsw->cmd_started == 0) { if (cmdsw->cmd_started = (count_inserted > 0)) { (void)textsw_checkpoint_undo(textsw, cmdsw->next_undo_point); ttysw_move_mark(textsw, &cmdsw->user_mark, (Textsw_index)length_before, TEXTSW_MARK_DEFAULTS); } } if (!cmdsw->cmd_started) cmdsw->next_undo_point = (caddr_t)textsw_checkpoint_undo(textsw, (caddr_t)TEXTSW_INFINITY); if (count_inserted >= 1) { /* Get the last inserted character. */ (void)textsw_get(textsw, TEXTSW_CONTENTS, replaced_from + count_inserted - 1, &last_inserted, 1); if (last_inserted == cmdsw->ltchars.t_rprntc) {#ifndef BUFSIZE#define BUFSIZE 1024#endif BUFSIZE char buf[BUFSIZE+1]; char cr_nl[3]; int buflen = 0; Textsw_index start_from; Textsw_index length = (int)textsw_get(textsw, TEXTSW_LENGTH); cr_nl[0] = '\r'; cr_nl[1] = '\n'; cr_nl[2] = '\0'; start_from = textsw_find_mark(textsw, cmdsw->user_mark); if (start_from == (length - 1)) { *buf = '\0'; } else { (void)textsw_get(textsw, TEXTSW_CONTENTS, start_from, buf, (buflen = min(BUFSIZE, length - 1 - start_from))); } cmdsw->pty_owes_newline = 0; cmdsw->cmd_started = 0; ttysw_move_mark(textsw, &cmdsw->pty_mark, length, TEXTSW_MARK_DEFAULTS); if (cmdsw->append_only_log) { ttysw_move_mark(textsw, &cmdsw->read_only_mark, length, TEXTSW_MARK_READ_ONLY); } ttysw_output(ttysw, cr_nl, 2); if (buflen > 0) ttysw_input(ttysw, buf, buflen); } else if (last_inserted == cmdsw->ltchars.t_lnextc) { cmdsw->literal_next = TRUE; } else if (last_inserted == cmdsw->tchars.t_brkc || last_inserted == '\n' || last_inserted == '\r') { (void) ttysw_scan_for_completed_commands(ttysw, -1, 0); } }}/* Pkg_private */ intttysw_textsw_changed(textsw, attributes) Textsw textsw; Attr_avlist attributes;{ register Attr_avlist attrs; register Ttysw *ttysw; int do_default = 0; for (attrs = attributes; *attrs; attrs = attr_next(attrs)) { switch ((Textsw_action)(*attrs)) { case TEXTSW_ACTION_CAPS_LOCK: ttysw = (Ttysw *)LINT_CAST(textsw_get(textsw, TEXTSW_CLIENT_DATA)); ttysw->ttysw_capslocked = (attrs[1] != 0)? TTYSW_CAPSLOCKED: 0; (void)ttysw_display_capslock(ttysw); break; case TEXTSW_ACTION_REPLACED: if (!cmdsw->doing_pty_insert) ttysw_textsw_changed_handler(textsw, (int)attrs[1], (int)attrs[2], (int)attrs[3], (int)attrs[4], (int)attrs[5]); break; case TEXTSW_ACTION_SPLIT_VIEW: { int text_fd; ttysw = (Ttysw *) LINT_CAST(textsw_get(textsw, TEXTSW_CLIENT_DATA)); (void) notify_interpose_event_func(attrs[1], ttysw_text_event, NOTIFY_SAFE); (void) notify_interpose_destroy_func(attrs[1], ttysw_text_destroy); text_fd = (int) LINT_CAST(window_get((Textsw)(LINT_CAST(attrs[1])), WIN_FD)); (void) notify_interpose_input_func((Notify_client)attrs[1], ttysw_text_input_pending, text_fd); if ((Ttysw *) LINT_CAST(textsw_get( (Textsw)(LINT_CAST(attrs[1])), TEXTSW_CLIENT_DATA)) != ttysw) (void)textsw_set( (Textsw)(LINT_CAST(attrs[1])), TEXTSW_CLIENT_DATA, ttysw, 0); if ((int)window_get(textsw, WIN_KBD_FOCUS) && (int)window_get((Textsw)(LINT_CAST(attrs[1])), WIN_Y) > (int)window_get(textsw, WIN_Y)) (void)window_set( (Textsw)(LINT_CAST(attrs[1])), WIN_KBD_FOCUS, TRUE, 0); break; } case TEXTSW_ACTION_DESTROY_VIEW: { Textsw coalesce_with = NULL; /* * There is no way for the user to directly destroy * the current view if it is replaced by the ttysw. * Therefore, he tried to destroy the first view and * textsw decided to destroy this view instead. */ ttysw = (Ttysw *)LINT_CAST(textsw_get(textsw, TEXTSW_CLIENT_DATA)); if (! (coalesce_with = (Textsw) window_get(textsw, TEXTSW_COALESCE_WITH))) { coalesce_with = textsw_first(textsw); } if ((ttysw != NULL) && (Textsw)ttysw->ttysw_hist == textsw) { ttysw->ttysw_hist = (FILE *) LINT_CAST(coalesce_with); } if ((int)window_get(textsw, WIN_KBD_FOCUS)) { window_set(coalesce_with, WIN_KBD_FOCUS, TRUE, 0); } break; } case TEXTSW_ACTION_LOADED_FILE: { Textsw_index insert; Textsw_index length; ttysw = (Ttysw *)LINT_CAST(textsw_get(textsw, TEXTSW_CLIENT_DATA)); insert = (Textsw_index)textsw_get(textsw, TEXTSW_INSERTION_POINT); length = (Textsw_index)textsw_get(textsw, TEXTSW_LENGTH); if (length == insert+1) { (void)textsw_set(textsw, TEXTSW_INSERTION_POINT, length, 0); ttysw_reset_column(ttysw); } else if (length == 0) { ttysw_reset_column(ttysw); } if (length < textsw_find_mark(textsw, cmdsw->pty_mark)) { ttysw_move_mark(textsw, &cmdsw->pty_mark, length, TEXTSW_MARK_DEFAULTS); } if (cmdsw->append_only_log) { ttysw_move_mark(textsw, &cmdsw->read_only_mark, length, TEXTSW_MARK_READ_ONLY); } cmdsw->cmd_started = FALSE; cmdsw->pty_owes_newline = 0; } default: do_default = TRUE; break; } } if (do_default) { (void)textsw_default_notify(textsw, attributes); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -