⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmdsw_notify.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    (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 + -