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

📄 ttysw_mapkey.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic  char sccsid[] = "@(#)ttysw_mapkey.c 1.1 92/07/30  Copyr 1985 Sun Micro";#endif#endif/* * Copyright (c) 1985 by Sun Microsystems, Inc. */#include <stdio.h>#include <ctype.h>#include <sys/file.h>#include <sys/types.h>#include <sys/time.h>#include <sundev/kbd.h>#ifdef KEYMAP_DEBUG#include <sys/types.h>#include <sys/time.h>#include "sunwindow/sv_malloc.h"#include "../../libsunwindow/win/win_input.h"#include "../../libsunwindow/win/win_keymap.h"#else#include <sunwindow/win_keymap.h>#endif#include <suntool/tool_hs.h>#include <suntool/selection_svc.h>#include <suntool/ttysw.h>#include <suntool/ttysw_impl.h>#include <suntool/ttytlsw_impl.h>extern	char	* strcpy();extern	char	* strcat();extern  char	* tool_get_attribute();/*	static routines	*/static char	*str_index(),		*savestr(),		*tdecode();void	 	ttysw_display_capslock();static void	 ttysw_add_caps();static void	 ttysw_remove_caps();/* * Read rc file. */ttysw_readrc(ttysw)    struct ttysubwindow *ttysw;{    char               *p;    extern char        *getlogindir();    char                rc[1025];    FILE               *fp;    char                line[1025], *av[4];    int                 i, lineno = 0;    if ((p = getlogindir()) == (char *) NULL)	return;    (void) strcpy(rc, p);    (void) strcat(rc, "/.ttyswrc");    if ((fp = fopen(rc, "r")) == (FILE *) NULL)		return;		    while (fgets(line, sizeof(line), fp)) {		register char *t;				lineno++;		if (line[strlen(line)-1] != '\n') {			register char c;						(void)printf("%s: line %d longer than 1024 characters\n", rc, lineno);			while ((c = fgetc(fp)) != '\n' && c != EOF);			continue;		}		for (t = line; isspace(*t); t++);		if (*t == '#' || *t == '\0')	    	continue;	    			for (i = 0; i < 2; i++) {			av[i] = t;			while (!isspace(*t) && *t) t++;			if (!*t)				break;			else				*t++ = '\0';			while (isspace(*t) && *t) t++;			if (!*t) break;		}		if (*t) {			i = 2;			av[2] = t;			av[2][strlen(av[2])-1] = '\0';		}					if (i == 2 && strcmp(av[0], "mapi") == 0)	 		(void)ttysw_mapkey(ttysw, av[1], av[2], 0);		else if (i == 2 && strcmp(av[0], "mapo") == 0)	   		(void)ttysw_mapkey(ttysw, av[1], av[2], 1);		else if (i == 1 && strcmp(av[0], "set") == 0)	   		(void)ttysw_doset(ttysw, av[1]);		else	   		(void)printf("%s: unknown command on line %d\n", rc, lineno);    }    (void) fclose(fp);}ttysw_doset(ttysw, var)    struct ttysubwindow *ttysw;    char               *var;{    /* XXX - for now */    if (strcmp(var, "pagemode") == 0)	(void)ttysw_setopt((caddr_t) ttysw, TTYOPT_PAGEMODE, 1);#ifdef TTYHIST    else if (strcmp(var, "history") == 0)	(void)ttysw_setopt(ttysw, TTYOPT_DOHIST, 1);#endif}ttysw_mapkey(ttysw, key, to, output)    struct ttysubwindow *ttysw;    char               *key, *to;    int                 output;{    int                 k;    if ((k = ttysw_strtokey(key)) == -1)	return (-1);    ttysw->ttysw_kmtp->kmt_key = k;    ttysw->ttysw_kmtp->kmt_output = output;    ttysw->ttysw_kmtp->kmt_to = savestr(tdecode(to, to));    ttysw->ttysw_kmtp++;    return (k);}ttysw_mapsetim(ttysw)    struct ttysubwindow *ttysw;{    struct keymaptab   *kmt;    struct inputmask    imask, *m;    int fd = ttysw->ttysw_wfd;    /*  Update kbd input mask */    (void)win_get_kbd_mask(ttysw->ttysw_wfd, &imask);    /*  Added user defined mappings to kbd mask.  Note: this wouldn't always     *  be the right thing for escape sequence generated events like TOP.     */    for (kmt = ttysw->ttysw_kmt; kmt < ttysw->ttysw_kmtp; kmt++)		win_setinputcodebit(&imask, kmt->kmt_key);    /*  Add in the keyboark related standard function keys.     *  Note these are overridden by any user-defined mappings of these keys.     */    win_keymap_set_smask(fd, KEY_PUT);    win_keymap_set_smask(fd, KEY_GET);    win_keymap_set_smask(fd, ACTION_FIND_FORWARD);    win_keymap_set_smask(fd, ACTION_FIND_BACKWARD);    win_keymap_set_smask(fd, KEY_DELETE);    win_keymap_set_smask(fd, KEY_CAPS);    win_keymap_set_imask_from_std_bind(&imask, KEY_PUT);    win_keymap_set_imask_from_std_bind(&imask, KEY_GET);    win_keymap_set_imask_from_std_bind(&imask, KEY_FIND);    win_keymap_set_imask_from_std_bind(&imask, KEY_DELETE);    win_keymap_set_imask_from_std_bind(&imask, KEY_CAPS);    imask.im_flags |= IM_NEGEVENT;    (void)win_set_kbd_mask(ttysw->ttysw_wfd, &imask);        /* Set the keymap kernel mask not to map euc/meta events for cmdtool */    m = (Inputmask *)sv_malloc(sizeof(Inputmask));    input_imnull(m);    m->im_flags |= IM_NEGEVENT | IM_EUC;        win_keymap_set_imask_from_std_bind(&imask, ACTION_FRONT);    win_keymap_set_imask_from_std_bind(&imask, ACTION_OPEN);    win_keymap_set_imask_from_std_bind(&imask, ACTION_HELP);    bcopy((caddr_t)imask.im_inputcode, (caddr_t)m->im_inputcode,            sizeof(imask.im_inputcode));    /*  Update pick input mask */    (void)win_get_pick_mask(ttysw->ttysw_wfd, &imask);    win_keymap_set_smask(fd, ACTION_FRONT);    win_keymap_set_smask(fd, ACTION_BACK);    win_keymap_set_smask(fd, ACTION_OPEN);    win_keymap_set_smask(fd, ACTION_CLOSE);    win_keymap_set_smask(fd, ACTION_HELP);    win_keymap_set_imask_from_std_bind(&imask, ACTION_HELP);    win_keymap_set_imask_from_std_bind(&imask, ACTION_FRONT);    win_keymap_set_imask_from_std_bind(&imask, ACTION_OPEN);    imask.im_flags |= IM_NEGEVENT;    (void)win_set_pick_mask(ttysw->ttysw_wfd, &imask);}ttysw_domap(ttysw, ie)    struct ttysubwindow  *ttysw;    struct inputevent    *ie;{    unsigned short	key = event_action(ie);    unsigned short	unmapped_key = event_id(ie);    struct keymaptab     *kmt;    int                   len;    extern Notify_value		tool_input();    struct ttytoolsubwindow	*ttytlsw;    /*     * The following switch is required to enforce the portion of the default     * user interface that MUST coordinate with Selection Service.      */    /*     * Note: The switch below gives precedence to keymapped events in the     * switch before .ttyswrc mappings.  After the switch .ttyswrc mappings     * are checked with the .ttyswrc T1 mapping having precedence over the     * CAPS_LOCK keymapped event.  This fixes an alpha4 bug.     */    switch (key) {      case ACTION_CUT:      case ACTION_FIND_FORWARD:      case ACTION_FIND_BACKWARD:      case ACTION_PASTE:      case ACTION_COPY:	if (win_inputposevent(ie) && key == KEY_GET) {	    ttysw->ttysw_caret.sel_made = FALSE;    /* backstop: be sure  */	    ttysel_acquire(ttysw, SELN_CARET);	    /* to go to service  */	}	if (ttysw->ttysw_seln_client != (char *) NULL) {	    seln_report_event(ttysw->ttysw_seln_client, ie);	}	return TTY_DONE;      case ACTION_OPEN:      case ACTION_CLOSE:      case ACTION_FRONT:      case ACTION_BACK:        ttytlsw = (struct ttytoolsubwindow *) LINT_CAST(ttysw->ttysw_client);        (void)tool_input(ttytlsw->tool, ie, (Notify_arg)0, NOTIFY_SAFE);	return TTY_DONE;      case ACTION_HELP:	if (win_inputposevent(ie))	    help_request(ttysw, ttysw->ttysw_helpdata, ie);	return TTY_DONE;      default:	break;    }    if (win_inputposevent(ie)) {	for (kmt = ttysw->ttysw_kmt; kmt < ttysw->ttysw_kmtp; kmt++) {	    if (kmt->kmt_key == unmapped_key) {		len = strlen(kmt->kmt_to);		if (kmt->kmt_output)		    (void) ttysw_output((Ttysubwindow)(LINT_CAST(		    	ttysw)), kmt->kmt_to, len);		else		    (void) ttysw_input((caddr_t) ttysw, kmt->kmt_to, len);		return (TTY_DONE);	    }	}	if (key == KEY_CAPS) {	    ttysw->ttysw_capslocked =		(ttysw->ttysw_capslocked & TTYSW_CAPSLOCKED)? 0: TTYSW_CAPSLOCKED;	    ttysw_display_capslock(ttysw);	    return (TTY_DONE);	}    }    return TTY_OK;}ttysw_strtokey(s)	char *s;{	int i;	if (strcmp(s, "LEFT") == 0)		return (KEY_BOTTOMLEFT);	else if (strcmp(s, "RIGHT") == 0)		return (KEY_BOTTOMRIGHT);	else if (isdigit(s[1])) {		i = atoi(&s[1]);		if (i < 1 || i > 16)			return (-1);		switch (s[0]) {		case 'L':			if (i == 1 || (i > 4 && i < 11)) {				(void) fprintf(stderr,					".ttyswrc error: %s cannot be mapped.\n",					s);				return (-1);			} else				return (KEY_LEFT(i));		case 'R':			return (KEY_RIGHT(i));		case 'T':		case 'F':			return (KEY_TOP(i));		}	}	return (-1);}static char *savestr(s)	char *s;{	char *p;	extern char *malloc();	p = malloc((unsigned) (strlen(s) + 1));	if (p == (char *)NULL) {		(void) fprintf(stderr, "Out of memory for key strings\n");		return ((char *)NULL);	}	(void) strcpy(p, s);	return (p);}/* * Interpret escape sequences in src, * while copying to dst.  Stolen from * termcap. */static char *tdecode(src, dst)	register char *src;	char *dst;{	register char *cp;	register int c;	register char *dp;	int i;	cp = dst;	while (c = *src++) {		switch (c) {		case '^':			c = *src++ & 037;			break;		case '\\':			dp = "E\033^^\\\\::n\nr\rt\tb\bf\f";			c = *src++;nextc:			if (*dp++ == c) {				c = *dp++;				break;			}			dp++;			if (*dp)				goto nextc;			if (isdigit(c)) {				c -= '0', i = 2;				do					c <<= 3, c |= *src++ - '0';				while (--i && isdigit(*src));			}			break;		}		*cp++ = c;	}	*cp++ = 0;	return (dst);}/*	These next routines do stuff that's supposed to be private *	to the ttytlsw module -- but since that's basically write-only, *	fuck it. */voidttysw_display_capslock(ttysw)    struct ttysubwindow *ttysw;{    struct tool         *tool;    struct ttytoolsubwindow *ttytlsw;    char                 label[1024];    char                *label_ptr;    ttytlsw = (struct ttytoolsubwindow *) LINT_CAST(ttysw->ttysw_client);    if (ttytlsw == NULL || ttytlsw->tool == NULL)	return;    tool = ttytlsw->tool;    label_ptr = tool_get_attribute(tool, (int)(LINT_CAST(WIN_LABEL)));    if (label_ptr == (char *) NULL)	return;    if (ttysw->ttysw_capslocked & TTYSW_CAPSLOCKED) {	ttysw_add_caps(label, label_ptr);    } else {	ttysw_remove_caps(label, label_ptr);    }    (void)tool_set_attributes(tool, WIN_LABEL, label, 0);    (void)tool_free_attribute((int)(LINT_CAST(WIN_LABEL)), label_ptr);}#define CAPS_STRING	"[CAPS] "static char         *caps_flag = CAPS_STRING;#define CAPS_FLAG_LEN	(strlen(CAPS_STRING))static char *str_index(domain, pat)    char               *domain;    char               *pat;{    register int        i, patlen;    patlen = strlen(pat);    while (*domain != '\0') {	for (i = 0; i <= patlen; i++) {	    if (pat[i] == '\0')		/* exhausted pattern: win	 */		return domain;	    if (domain[i] == '\0')	/* exhausted domain: lose: 	 */		return (char *) NULL;	    if (pat[i] == domain[i])	/* partial match continues	 */		continue;	    break;			/* partial match failed	 */	}	domain++;    }    return (char *) NULL;}static voidttysw_add_caps(label, label_ptr)    char               *label;    char               *label_ptr;{    if (str_index(label_ptr, caps_flag) == (char *) NULL) {	bcopy(caps_flag, label, CAPS_FLAG_LEN);	label += CAPS_FLAG_LEN;    }    (void) strcpy(label, label_ptr);}static voidttysw_remove_caps(label, label_ptr)    char               *label;    char               *label_ptr;{    char               *flag_ptr;    register int        len;    if ((flag_ptr = str_index(label_ptr, caps_flag)) != (char *) NULL) {	len = flag_ptr - label_ptr;	    bcopy(label_ptr, label, len);	label_ptr = flag_ptr + CAPS_FLAG_LEN;	label += len;    }    (void) strcpy(label, label_ptr);}

⌨️ 快捷键说明

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