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

📄 textsw_once.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
#ifndef lint#ifdef sccsstatic  char sccsid[] = "@(#)textsw_once.c 1.1 92/07/30 Copyright 1988 Sun Micro";#endif#endif/* * Copyright (c) 1986 by Sun Microsystems, Inc. *//* * Initialization and finalization of text subwindows. */#include <suntool/primal.h>#include <suntool/textsw_impl.h>#include <fcntl.h>#include <varargs.h>#include <sys/dir.h>#include <signal.h>#include <pixrect/pr_util.h>#include <pixrect/memvar.h>#include <pixrect/pixfont.h>#include <sunwindow/rect.h>#include <sunwindow/win_cursor.h>#include <sunwindow/win_struct.h>#include <sunwindow/win_notify.h>#include <suntool/alert.h>#include <suntool/frame.h>#include <suntool/window.h>#include <suntool/walkmenu.h>#include <sunwindow/defaults.h>#include "sunwindow/sv_malloc.h"#ifdef KEYMAP_DEBUG#include "../../libsunwindow/win/win_keymap.h"#else#include <sunwindow/win_keymap.h>#endifextern Textsw_status	textsw_set();pkg_private void	textsw_add_scrollbar_to_view();pkg_private void	textsw_destroy_esh(), textsw_notify_replaced();pkg_private Es_status	textsw_checkpoint();static void		textsw_set_our_scrollbar_attrs();extern Es_handle	ps_create(),			es_mem_create(),			textsw_create_mem_ps(),			textsw_create_file_ps();extern Ei_handle	ei_plain_text_create();extern Ev_chain		ev_create_chain(), ev_destroy_chain_and_views();extern Ev_status	ev_set();extern Es_index		textsw_set_insert();extern int		gettimeofday();extern Ev_handle	ev_create_view();extern Attr_avlist	attr_find();extern Scrollbar	scrollbar_create();#define MAXPATHLEN 1028Textsw_folio	textsw_head;	/* = 0; implicit for cc -A-R */DEFINE_CURSOR(textsw_cursor, 0, 0, PIX_SRC|PIX_DST,	0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xF000,	0xD800, 0x9800, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0300);/* VARARGS1 */Textswtextsw_init(windowfd, va_alist)	int		  windowfd;	va_dcl{	static Textsw_view	 textsw_init_internal();	caddr_t			 attr_argv[ATTR_STANDARD_SIZE], *attrs;	Textsw_view              view = NEW(struct textsw_view_object);	Textsw_folio		 textsw;	Textsw_status		 dummy_status;	Textsw_status		*status = &dummy_status;	va_list			 args;	va_start(args);	(void) attr_make(attr_argv, ATTR_STANDARD_SIZE, args);	va_end(args);	for (attrs = attr_argv; *attrs; attrs = attr_next(attrs)) {	    switch ((Textsw_attribute)(*attrs)) {	      case TEXTSW_STATUS:		status = (Textsw_status *)LINT_CAST(attrs[1]);		break;	    }	}	if (view == 0) {	    *status = TEXTSW_STATUS_CANNOT_ALLOCATE;	} else {	    view->magic = TEXTSW_VIEW_MAGIC;	    view->window_fd = windowfd;	    view = textsw_init_internal(view, status, (int (*)())0, attr_argv);	    if (view) {		textsw = FOLIO_FOR_VIEW(view);		textsw->tool = (caddr_t)0;	    }	}	return(VIEW_REP_TO_ABS(view));}pkg_private voidtextsw_init_again(folio, count)	register Textsw_folio	 folio;	int			 count;{	register int		 i;	register int		 old_count = folio->again_count;	register string_t	*old_again = folio->again;	VALIDATE_FOLIO(folio);	folio->again_first = folio->again_last_plus_one = ES_INFINITY;	folio->again_insert_length = 0;	folio->again_count = count;	folio->again = (string_t *)LINT_CAST(sv_malloc(				(folio->again_count+1) *				(sizeof(folio->again[0])+1)));	for (i = 0; i < folio->again_count; i++) {	    folio->again[i] = (i < old_count) ? old_again[i] : null_string;	}	for (i = folio->again_count; i < old_count; i++) {	    textsw_free_again(folio, &old_again[i]);	}	if (old_again)	    free((char *)old_again);}pkg_private voidtextsw_init_undo(folio, count)	register Textsw_folio	 folio;	int			 count;{	register int		 i;	register int		 old_count = folio->undo_count;	register caddr_t	*old_undo = folio->undo;	VALIDATE_FOLIO(folio);	folio->undo_count = count;	folio->undo = (caddr_t *)LINT_CAST(sv_malloc((folio->undo_count+1) *					   (sizeof(folio->undo[0])+1)));	for (i = 0; i < folio->undo_count; i++) {	    folio->undo[i] =		(i < old_count) ? old_undo[i] : ES_NULL_UNDO_MARK;	}	/* old_undo[ [folio->undo_count..old_count) ] are 32-bit	 * quantities, and thus don't need to be deallocated.	 */        /*-----------------------------------------------------------          ... but old_undo itself is a 260 byte quantity that should          be deallocated to avoid a noticeable memory leak.          This is a fix for bug 1020222.  -- Mick .        -----------------------------------------------------------*/        if(old_undo)          free((char *)old_undo);	if (old_count == 0)	    folio->undo[0] = es_get(folio->views->esh, ES_UNDO_MARK);}static inttextsw_view_chain_notify(folio, attributes)	register Textsw_folio	 folio;	Attr_avlist	 	 attributes;{	pkg_private Textsw_view	 textsw_view_for_entity_view();	register Ev_handle	 e_view;	register Textsw_view	 view = 0;	register Attr_avlist	 attrs;	Rect			*from_rect, *rect, *to_rect;	for (attrs = attributes; *attrs; attrs = attr_next(attrs)) {	    switch ((Ev_notify_action)(*attrs)) {	      /* BUG ALERT: following need to be fleshed out. */	      case EV_ACTION_VIEW:		e_view = (Ev_handle)LINT_CAST(attrs[1]);		view = textsw_view_for_entity_view(folio, e_view);		break;	      case EV_ACTION_EDIT:		if (view && (folio->notify_level & TEXTSW_NOTIFY_EDIT)) {		    textsw_notify_replaced((Textsw_opaque)view, 				  (Es_index)attrs[1], (Es_index)attrs[2],				  (Es_index)attrs[3], (Es_index)attrs[4],				  (Es_index)attrs[5]);		}		textsw_checkpoint(folio);		break;	      case EV_ACTION_PAINT:		if (view && (folio->notify_level & TEXTSW_NOTIFY_PAINT)) {		    rect = (Rect *)LINT_CAST(attrs[1]);		    textsw_notify(view, TEXTSW_ACTION_PAINTED, rect, 0);		}		break;	      case EV_ACTION_SCROLL:		if (view && (folio->notify_level & TEXTSW_NOTIFY_SCROLL)) {		    from_rect = (Rect *)LINT_CAST(attrs[1]);		    to_rect = (Rect *)LINT_CAST(attrs[2]);		    textsw_notify(view,				  TEXTSW_ACTION_SCROLLED, from_rect, to_rect,				  0);		}		break;	      default:		LINT_IGNORE(ASSERT(0));		break;	    }	}}static inttextsw_read_defaults(textsw, defaults, font)	register Textsw_folio	textsw;	register Attr_avlist	defaults;	caddr_t			font;{	char			*def_str;   /* Strings owned by defaults. */#ifndef lint	register caddr_t	attr;#endif	def_str = defaults_get_string("/Text/Edit_back_char", "\177", NULL);	textsw->edit_bk_char = def_str[0];	def_str = defaults_get_string("/Text/Edit_back_word", "\027", NULL);	textsw->edit_bk_word = def_str[0];	def_str = defaults_get_string("/Text/Edit_back_line", "\025", NULL);	textsw->edit_bk_line = def_str[0];	textsw->es_mem_maximum = defaults_get_integer_check("/Text/Memory_Maximum", 20000, 0, TEXTSW_INFINITY+1, NULL);#ifndef lint	if (textsw_get(TEXTSW, TEXTSW_ADJUST_IS_PENDING_DELETE))	    textsw->state |= TXTSW_ADJUST_IS_PD;	else		    textsw->state &= ~TXTSW_ADJUST_IS_PD;	if (textsw_get(TEXTSW, TEXTSW_AUTO_INDENT))	    textsw->state |= TXTSW_AUTO_INDENT;	else		    textsw->state &= ~TXTSW_AUTO_INDENT;	if (textsw_get(TEXTSW, TEXTSW_BLINK_CARET))	    textsw->caret_state |= TXTSW_CARET_FLASHING;	else		    textsw->caret_state &= ~TXTSW_CARET_FLASHING;	if (textsw_get(TEXTSW, TEXTSW_CONFIRM_OVERWRITE))	    textsw->state |= TXTSW_CONFIRM_OVERWRITE;	else		    textsw->state &= ~TXTSW_CONFIRM_OVERWRITE;	if (textsw_get(TEXTSW, TEXTSW_STORE_CHANGES_FILE))	    textsw->state |= TXTSW_STORE_CHANGES_FILE;	else		    textsw->state &= ~TXTSW_STORE_CHANGES_FILE;	if (textsw_get(TEXTSW, TEXTSW_STORE_SELF_IS_SAVE))	    textsw->state |= TXTSW_STORE_SELF_IS_SAVE;	else		    textsw->state &= ~TXTSW_STORE_SELF_IS_SAVE;#endif	if (defaults_get_boolean("/Text/Retained", False, NULL))	    textsw->state |= TXTSW_RETAINED;	else		    textsw->state &= ~TXTSW_RETAINED;#ifndef lint	textsw->multi_click_space =	    (int)textsw_get(TEXTSW, TEXTSW_MULTI_CLICK_SPACE);	textsw->multi_click_timeout =	    (int)textsw_get(TEXTSW, TEXTSW_MULTI_CLICK_TIMEOUT);	textsw->insert_makes_visible =	    (Textsw_enum)textsw_get(TEXTSW, TEXTSW_INSERT_MAKES_VISIBLE);#endif	/*	 * The following go through the standard textsw_set mechanism	 * (eventually) because they rely on all of the side-effects that	 * accompany textsw_set calls.	 */#ifndef lint	*defaults++ = attr = (caddr_t)TEXTSW_AGAIN_LIMIT;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_HISTORY_LIMIT;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_AUTO_SCROLL_BY;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_LOWER_CONTEXT;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_UPPER_CONTEXT;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_FONT;	*defaults++ = (font) ? font : textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_LINE_BREAK_ACTION;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_LEFT_MARGIN;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_RIGHT_MARGIN;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_TAB_WIDTH;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_LOAD_DIR_IS_CD;	*defaults++ = textsw_get(TEXTSW, attr);	*defaults++ = attr = (caddr_t)TEXTSW_CONTROL_CHARS_USE_FONT;	*defaults++ = textsw_get(TEXTSW, attr);#endif	def_str = defaults_get_string("/Text/Contents", "", NULL);	if (def_str && (strlen(def_str) > 0)) {	    *defaults++ = (caddr_t)TEXTSW_CONTENTS;	    *defaults++ = strdup(def_str);	}	*defaults++ = (caddr_t)WIN_VERTICAL_SCROLLBAR;	if (defaults_get_boolean("/Text/Scrollable", True, NULL))	    *defaults++ = TEXTSW_DEFAULT_SCROLLBAR;	else	    *defaults++ = NULL;	*defaults = 0;}static int stdmasks[] = { 0, -1 };static int ctrlmasks[] = { CTRLMASK, -1 };static int stdshiftmasks[] = { SHIFTMASK, -1 };static int ctrlshiftmasks[] = { CTRLMASK|SHIFTMASK, -1 };static int stdmetamasks[] = { META_SHIFT_MASK, -1 };static int ctrlmetamasks[] = { CTRLMASK|META_SHIFT_MASK, -1 };static int stdshiftmetamasks[] = { META_SHIFT_MASK|SHIFTMASK, -1 };static int ctrlshiftmetamasks[] = { META_SHIFT_MASK|CTRLMASK|SHIFTMASK, -1 };#define needctrlmask(c)		((0<=(c) && (c)<=31) || (128<=(c) && (c)<=159))#define needmetamask(c)		(128<=(c) && (c)<=255)static intsetmask(c)    char c;{    register int i = (int) c;    if (needmetamask(i)) {        if (needctrlmask(i)) return CTRLMASK|META_SHIFT_MASK;        else return META_SHIFT_MASK;    } else {        if (needctrlmask(i)) return CTRLMASK;        else return 0;    }}static int *setshiftmasklist(c)    char c;{    register int i = (int) c;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -