📄 ttysw_init.c
字号:
#ifndef lint#ifdef sccsstatic char sccsid[] = "@(#)ttysw_init.c 1.1 92/07/30";#endif#endif/* * Copyright (c) 1989 by Sun Microsystems, Inc. *//* * Ttysw initialization, destruction and error procedures */#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <sys/file.h>#include <sys/syscall.h>#include <sgtty.h>#include <signal.h>#include <stdio.h>#include <utmp.h>#include <pwd.h>#include <ctype.h>/* #include <fcntl.h> */#include <sunwindow/sun.h>#include <sunwindow/window_hs.h>#include <sunwindow/win_cursor.h>#include <sunwindow/win_input.h>#include <sunwindow/defaults.h>#include <suntool/scrollbar.h>#include <suntool/ttysw.h>#include <suntool/ttysw_impl.h>#include <suntool/charscreen.h>#ifdef KEYMAP_DEBUG#include "../../libsunwindow/win/win_keymap.h"#else#include <sunwindow/win_keymap.h>#endif#define TTYSLOT_NOTFOUND(n) ((n)<=0) /* BSD returns 0; S5 returns -1 */#ifdef WITH_3X_LIBC/* 3.x - 4.0 libc transition code; old (pre-4.0) code must define the symbol */#define jcsetpgrp(p) syscall(SYS_setpgrp,0,(p))#endifextern char * mktemp();extern char * strncpy();extern char * strcpy();extern long lseek();Textsw_status textsw_set();char *textsw_checkpoint_undo();#ifndef TIOCUCNTL#define TIOCUCNTL _IOW(t, 102, int) /* pty: set/clr usr cntl mode */#endif TIOCUCNTL#ifndef TIOCTCNTL#define TIOCTCNTL _IOW(t, 32, int) /* pty: set/clr intercept ioctl mode */#endif TIOCTCNTLstatic Cmdsw cmdsw_tg;Cmdsw *cmdsw = &cmdsw_tg;char *getenv();extern Menu ttysw_walkmenu();extern int ttysel_use_seln_service;struct ttysubwindow *_ttysw; /* kludge, for routines not fully converted */int wfd; /* ditto */Textsw ttysw_cmdsw; /* ditto, see ttysw.h */struct ttysw_createoptions { int becomeconsole; /* be the console */ char **argv; /* args to be used in exec */ char *args[4]; /* scratch array if need to build argv */};/* * The tty subwindow cursor. */static short ttysw_data[16] = { 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 0xFC00, 0xFE00, 0xF000, 0xD800, 0x9800, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0300};static mpr_static(ttysw_mpr, 16, 16, 1, ttysw_data);struct cursor ttysw_cursor = {0, 0, PIX_SRC|PIX_DST, &ttysw_mpr};static Defaults_pairs bold_style[] = { "None", TTYSW_BOLD_NONE, "Offset_X", TTYSW_BOLD_OFFSET_X, "Offset_Y", TTYSW_BOLD_OFFSET_Y, "Offset_X_and_Y", TTYSW_BOLD_OFFSET_X | TTYSW_BOLD_OFFSET_Y, "Offset_XY", TTYSW_BOLD_OFFSET_XY, "Offset_X_and_XY", TTYSW_BOLD_OFFSET_X | TTYSW_BOLD_OFFSET_XY, "Offset_Y_and_XY", TTYSW_BOLD_OFFSET_Y | TTYSW_BOLD_OFFSET_XY, "Offset_X_and_Y_and_XY",TTYSW_BOLD_OFFSET_X | TTYSW_BOLD_OFFSET_Y | TTYSW_BOLD_OFFSET_XY, "Invert", TTYSW_BOLD_INVERT, NULL, -1};static Defaults_pairs inverse_and_underline_mode[] = { "Enabled", TTYSW_ENABLE, "Disabled", TTYSW_DISABLE, "Same_as_bold", TTYSW_SAME_AS_BOLD, NULL, -1};typedef enum { IF_AUTO_SCROLL = 0, ALWAYS = 1, INSERT_SAME_AS_TEXT = 2} insert_makes_visible_flags;static Defaults_pairs insert_makes_visible_pairs[] = { "If_auto_scroll", (int)IF_AUTO_SCROLL, "Always", (int)ALWAYS, "Same_as_for_text", (int)INSERT_SAME_AS_TEXT, NULL, (int)INSERT_SAME_AS_TEXT};typedef enum { DO_NOT_USE_FONT = 0, DO_USE_FONT = 1, USE_FONT_SAME_AS_TEXT = 2} control_chars_use_font_flags;static Defaults_pairs control_chars_use_font_pairs[] = { "False", (int)DO_NOT_USE_FONT, "True", (int)DO_USE_FONT, "Same_as_for_text", (int)USE_FONT_SAME_AS_TEXT, NULL, (int)USE_FONT_SAME_AS_TEXT};typedef enum { DO_NOT_AUTO_INDENT = 0, DO_AUTO_INDENT = 1, AUTO_INDENT_SAME_AS_TEXT = 2} auto_indent_flags;static Defaults_pairs auto_indent_pairs[] = { "False", (int)DO_NOT_AUTO_INDENT, "True", (int)DO_AUTO_INDENT, "Same_as_for_text", (int)AUTO_INDENT_SAME_AS_TEXT, NULL, (int)AUTO_INDENT_SAME_AS_TEXT};ttysw_lookup_boldstyle(str) char *str;{ int bstyle; if (str && isdigit(*str)) { bstyle = atoi(str); if (bstyle < TTYSW_BOLD_NONE || bstyle > TTYSW_BOLD_MAX) bstyle = -1; return bstyle; } else { return defaults_lookup(str, bold_style); }}ttysw_print_bold_options(){ Defaults_pairs *pbold; (void) fprintf(stderr, "Options for boldface are %d to %d or:\n", TTYSW_BOLD_NONE, TTYSW_BOLD_MAX); for (pbold = bold_style; pbold->name; pbold++) { (void) fprintf(stderr, "%s\n", pbold->name); }}/* * Ttysw initialization. */caddr_tttysw_init(windowfd) int windowfd;{ struct ttysubwindow *ttysw; extern ttysw_eventstd();/* #ifdef CMDSW */ Textsw textsw; int tmpfile_fd; char tmpfile_name[100]; Textsw_index length;/* #endif CMDSW */ ttysw = (struct ttysubwindow *) LINT_CAST(calloc(1, sizeof (struct ttysubwindow))); if (ttysw == 0) return ((caddr_t) NULL); ttysw->ttysw_wfd = wfd = windowfd; /* ttysw only, begin */ ttysw->ttysw_eventop = ttysw_eventstd; (void) ttysw_setboldstyle( defaults_lookup( (char *)defaults_get_string("/Tty/Bold_style", "Invert", (int *)0), bold_style)); (void) ttysw_set_inverse_mode( defaults_lookup( (char *)defaults_get_string("/Tty/Inverse_mode", "Enabled", (int *)0), inverse_and_underline_mode)); (void) ttysw_set_underline_mode( defaults_lookup( (char *)defaults_get_string("/Tty/Underline_mode", "Enabled", (int *)0), inverse_and_underline_mode)); /* ttysw only, end */ ttysw->ttysw_ibuf.cb_rbp = ttysw->ttysw_ibuf.cb_buf; ttysw->ttysw_ibuf.cb_wbp = ttysw->ttysw_ibuf.cb_buf; ttysw->ttysw_ibuf.cb_ebp = &ttysw->ttysw_ibuf.cb_buf[sizeof (ttysw->ttysw_ibuf.cb_buf)]; ttysw->ttysw_obuf.cb_rbp = ttysw->ttysw_obuf.cb_buf; ttysw->ttysw_obuf.cb_wbp = ttysw->ttysw_obuf.cb_buf; ttysw->ttysw_obuf.cb_ebp = &ttysw->ttysw_obuf.cb_buf[sizeof (ttysw->ttysw_obuf.cb_buf)]; ttysw->ttysw_kmtp = ttysw->ttysw_kmt; ttysw->ttysw_helpdata = "sunview:ttysw"; if (_ttysw == (struct ttysubwindow *) NULL) _ttysw = ttysw; (void)ttysw_readrc(ttysw); if (ttysw_cmdsw) { extern int ttysw_textsw_changed(); unsigned status; int ttymargin = 0; /* Cannot use ttysw_setopt because not all the way set up yet. */ ttysw->ttysw_opt |= 1 << TTYOPT_TEXT; ttysw->ttysw_hist = (FILE *)LINT_CAST(ttysw_cmdsw); textsw = (Textsw)ttysw->ttysw_hist; (void) strcpy(tmpfile_name, "/tmp/tty.txt.XXXXXX"); (void) mktemp(tmpfile_name); if ((tmpfile_fd = open(tmpfile_name, O_CREAT|O_RDWR|O_EXCL, 0600)) < 0) return ((caddr_t)NULL); (void) close(tmpfile_fd); (void)textsw_set((Textsw) ttysw->ttysw_hist, TEXTSW_STATUS, &status, TEXTSW_CLIENT_DATA, ttysw, TEXTSW_NOTIFY_LEVEL, TEXTSW_NOTIFY_STANDARD| TEXTSW_NOTIFY_EDIT| TEXTSW_NOTIFY_DESTROY_VIEW| TEXTSW_NOTIFY_SPLIT_VIEW, TEXTSW_NOTIFY_PROC, ttysw_textsw_changed, 0); if (status != 0) return ((caddr_t)NULL); cmdsw->next_undo_point = (caddr_t)textsw_checkpoint_undo(textsw, (caddr_t)TEXTSW_INFINITY); cmdsw->erase_line = (char)textsw_get(textsw, TEXTSW_EDIT_BACK_LINE); cmdsw->erase_word = (char)textsw_get(textsw, TEXTSW_EDIT_BACK_WORD); cmdsw->erase_char = (char)textsw_get(textsw, TEXTSW_EDIT_BACK_CHAR); cmdsw->pty_eot = -1; cmdsw->cooked_echo = TRUE; cmdsw->ttysw_resized = FALSE; cmdsw->enable_scroll_stay_on = FALSE; ttymargin = (int)scrollbar_get( textsw_get(textsw, TEXTSW_SCROLLBAR), SCROLL_THICKNESS); ttymargin += (int)textsw_get(textsw, TEXTSW_LEFT_MARGIN); ttymargin += (int)textsw_get(textsw, TEXTSW_RIGHT_MARGIN); (void)ttysw_setleftmargin(ttymargin); /* windowfd = wfd = ttysw_wfd is fd of tty subwindow. Save it. */ (void)ttysw_mapsetim(ttysw); /* stash textsw window fd in ttysw_wfd. */ ttysw->ttysw_wfd = (int)(LINT_CAST( window_get((Window)(LINT_CAST(textsw)), WIN_FD))); } /* Now windowfd is the tty subwindow fd */ if (ttyinit((Ttysubwindow)(LINT_CAST(ttysw))) == -1) { free((char *) ttysw); _ttysw = (struct ttysubwindow *) NULL; perror("ttysw_init"); return ((caddr_t) NULL); } if (ttysw_getopt((caddr_t)ttysw, TTYOPT_TEXT)) { char *def_str; (void)textsw_set(textsw, TEXTSW_FILE, tmpfile_name, 0); (void)textsw_set(textsw, TEXTSW_TEMP_FILENAME, tmpfile_name, 0); length = (int)textsw_get(textsw, TEXTSW_LENGTH); cmdsw->cmd_started = cmdsw->pty_owes_newline = 0; cmdsw->user_mark = textsw_add_mark(textsw, length, TEXTSW_MARK_DEFAULTS); cmdsw->pty_mark = textsw_add_mark(textsw, length, TEXTSW_MARK_DEFAULTS); cmdsw->append_only_log = (int)defaults_get_boolean("/Tty/Append_only_log", (Bool)TRUE, (int *)NULL); if (cmdsw->append_only_log) /* Note that read_only_mark is not TEXTSW_MOVE_AT_INSERT. * Thus, as soon as it quits being moved by pty inserts, * it will equal the user_mark. */ cmdsw->read_only_mark = textsw_add_mark(textsw, cmdsw->cooked_echo ? length : TEXTSW_INFINITY-1, TEXTSW_MARK_READ_ONLY); def_str = defaults_get_string("/Tty/Auto_indent", "False", (int *)NULL); switch(defaults_lookup(def_str, auto_indent_pairs)) { case DO_NOT_AUTO_INDENT: (void)textsw_set(textsw, TEXTSW_AUTO_INDENT, 0, 0); break; case DO_AUTO_INDENT: (void)textsw_set(textsw, TEXTSW_AUTO_INDENT, TRUE, 0); break; /* default: do nothing */ } def_str = defaults_get_string("/Tty/Control_chars_use_font", "Same_as_for_text", (int *)NULL); switch(defaults_lookup(def_str, control_chars_use_font_pairs)) { case DO_NOT_USE_FONT: (void)textsw_set(textsw, TEXTSW_CONTROL_CHARS_USE_FONT, 0, 0); break; case DO_USE_FONT: (void)textsw_set(textsw, TEXTSW_CONTROL_CHARS_USE_FONT, TRUE, 0); break; /* default: do nothing */ } def_str = defaults_get_string("/Tty/Insert_makes_caret_visible", (char *) NULL, (int *)NULL); switch(defaults_lookup(def_str, insert_makes_visible_pairs)) { case IF_AUTO_SCROLL: (void)textsw_set(textsw, TEXTSW_INSERT_MAKES_VISIBLE, TEXTSW_IF_AUTO_SCROLL, 0); break; case ALWAYS: (void)textsw_set(textsw, TEXTSW_INSERT_MAKES_VISIBLE, TEXTSW_ALWAYS, 0); break; /* default: do nothing */ } /* Must come *after* setting append_only_log to get string * correct in the append_only_log toggle item. */ (void)ttysw_set_menu(textsw); } (void)ansiinit(ttysw); if (imageinit(windowfd) == 0) { free((char *) ttysw); _ttysw = (struct ttysubwindow *) NULL; return ((caddr_t) NULL); } (void)win_setcursor(windowfd, &ttysw_cursor); /* ttysw only, begin */ /* initialize selection service code */ (void)ttysw_setopt((caddr_t)ttysw, TTYOPT_SELSVC, ttysel_use_seln_service); if (ttysw_getopt((caddr_t)ttysw, TTYOPT_SELSVC)) { ttysel_init_client(ttysw); } /* setup the walking menu */ ttysw->ttysw_menu = ttysw_walkmenu(ttysw); /* ttysw only, end */ return ((caddr_t) ttysw);}intttysw_add_FNDELAY(fd) int fd;{ int fdflags; if ((fdflags = fcntl(fd, F_GETFL, 0)) == -1) return (-1); fdflags |= FNDELAY; if (fcntl(fd, F_SETFL, fdflags) == -1) return (-1); return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -