📄 textsw_once.c
字号:
#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 + -