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

📄 input_from_defaults.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic char sccsid[] = "@(#)input_from_defaults.c 1.1 92/07/30";#endif#endif/* * Copyright (c) 1986 by Sun Microsystems, Inc. * * input_from_defaults.c	modify keyboard and mouse behavior */#include <ctype.h>#include <stdio.h>#include <strings.h>#include <sys/file.h>#include <sys/ioctl.h>#include <sys/file.h>#include <sunwindow/sun.h>#include "setkey_tables.h"Bool	defaults_get_boolean();typedef struct {    u_int           arrow_keys;    u_int           sunview_keys;    u_int           left_handed;    Ms_parms        ms_parms;    Ws_scale_list   scaling;}	Options;static int            debug_setinput = FALSE;static Keybd_type     get_type();static int            setkey_local();static void           get_default_options(),		      get_key_info(),		      get_options_scaling(),		      lose(),		      set_keyboard(),		      set_mouse();/* 	Keyboard String Table 	This defines the strings sent by various keys (as selected in the	tables above).	The first byte of each string is its length, the rest is data.*/#define	kstescinit(c)	{'\033', '[', 'c', '\0'}static char keystringtab[16][KTAB_STRLEN] = {	kstescinit(H) /*home*/,	kstescinit(A) /*up*/,	kstescinit(B) /*down*/,	kstescinit(D) /*left*/,	kstescinit(C) /*right*/,};#ifdef STANDALONEmain(argc, argv)#elseinput_from_defaults_main(argc, argv)#endif    int             argc;    char          **argv;{    int             keyboard, mouse, win0;    Options         options;    Key_info       *info_ptr;    Keybd_type      keybd_type;    if (argc-- > 1) {	if (strcmp(*(++argv), "-d") == 0)	    debug_setinput = TRUE;	else {	    (void)fprintf(stderr, "usage: input_from_defaults [-d]\n");	    exit(1);	}    }    if ((keyboard = open("/dev/kbd", O_RDONLY, 0)) < 0) {	(void)fprintf(stderr, "Couldn't open /dev/kbd\n");	lose(1);    }    if ((mouse = open("/dev/mouse", O_RDONLY, 0)) < 0) {	(void)fprintf(stderr, "Couldn't open /dev/mouse\n");	lose(1);    }    if ((win0 = open("/dev/win0", O_RDONLY, 0)) < 0) {	(void)fprintf(stderr, "Couldn't open /dev/win0\n");	lose(1);    }    keybd_type = get_type(keyboard);    get_default_options(&options);    get_key_info(keybd_type, &options, &info_ptr);    set_keyboard(keybd_type, keyboard, info_ptr);    set_mouse(mouse, win0, &options);    exit(0);}static voidget_default_options(options)    Options        *options;{    options->arrow_keys =	(int)defaults_get_boolean("/Input/Arrow_Keys", (Bool)TRUE, (int *)NULL);    options->sunview_keys =	(int)defaults_get_boolean("/Input/SunView_Keys", (Bool)TRUE, (int *)NULL);    options->left_handed =	(int)defaults_get_boolean("/Input/Left_Handed", (Bool)FALSE, (int *)NULL);    options->ms_parms.jitter_thresh =	(int)defaults_get_boolean("/Input/Jitter_Filter", (Bool)FALSE, (int *)NULL);    options->ms_parms.speed_law =	(int)defaults_get_boolean("/Input/Speed_Enforced", (Bool)FALSE, (int *)NULL);    options->ms_parms.speed_limit =	defaults_get_integer("/Input/Speed_Limit", 48, (int *)NULL);    get_options_scaling(&options->scaling);}static voidget_key_info(type, options, info_ptr)    Keybd_type      type;    Options        *options;    Key_info      **info_ptr;{    register Keybd_info *kbd_ptr;    if (!options->sunview_keys) {	if (type != Sun2_kbd && type != Sun3_kbd && type != Sun4_kbd) {	    (void)fprintf(stderr,		    "No-SunView is valid only on Sun2, Type 3, or Type 4 keyboards\n");	    exit(4);	}	if (options->left_handed)	    (void)fprintf(stderr, "Left-handedness ignored on No-SunView keyboard\n");	if (options->arrow_keys)	    *info_ptr = ktbl_no_sunview_info.standard;	else	    *info_ptr = ktbl_no_sunview_info.standard_noarrow;	return;    }    switch (type) {      case Klunker_kbd:	kbd_ptr = &ktbl_klunker_info;	break;      case Sun1_kbd:	kbd_ptr = &ktbl_sun1_info;	break;      case Sun2_kbd:	kbd_ptr = &ktbl_sun2_info;	break;      case Sun3_kbd:	kbd_ptr = &ktbl_sun3_info;	break;      case Sun4_kbd:	kbd_ptr = &ktbl_sun4_info;	break;      default:	(void)fprintf(stderr, "unknown keyboard type\n");	exit(2);    }    if (options->left_handed) {	if (options->arrow_keys)	    *info_ptr = kbd_ptr->lefty;	else	    *info_ptr = kbd_ptr->lefty_noarrow;    } else {	if (options->arrow_keys)	    *info_ptr = kbd_ptr->standard;	else	    *info_ptr = kbd_ptr->standard_noarrow;    }}static voidget_options_scaling(scale_list)    Ws_scale_list	*scale_list;{    scale_list->scales[0].ceiling = 	defaults_get_integer("/Input/1st_ceiling", 65535, (int *)NULL);    scale_list->scales[0].factor = 	defaults_get_integer("/Input/1st_factor", 2, (int *)NULL);    scale_list->scales[1].ceiling = 	defaults_get_integer("/Input/2nd_ceiling", 0, (int *)NULL);    scale_list->scales[1].factor = 	defaults_get_integer("/Input/2nd_factor", 0, (int *)NULL);    scale_list->scales[2].ceiling = 	defaults_get_integer("/Input/3rd_ceiling", 0, (int *)NULL);    scale_list->scales[2].factor = 	defaults_get_integer("/Input/3rd_factor", 0, (int *)NULL);    scale_list->scales[3].ceiling = 	defaults_get_integer("/Input/4th_ceiling", 0, (int *)NULL);    scale_list->scales[3].factor = 	defaults_get_integer("/Input/4th_factor", 0, (int *)NULL);}static Keybd_typeget_type(kbd)    int             kbd;{    int             type;    if (ioctl(kbd, KIOCTYPE, &type) == -1) {	lose(1);    }    switch (type) {      case KB_KLUNK:	return Klunker_kbd;      case KB_VT100:	return Sun1_kbd;      case KB_SUN2:	return Sun2_kbd;      case KB_SUN3:	return Sun3_kbd;      case KB_SUN4:	return Sun4_kbd;      case KB_ASCII:      case -1:      default:	return Unknown_kbd;    }}static voidlose(code)    int             code;{    perror("input_from_defaults");    exit(code);}static voidset_mouse(mouse, win0, options)    int		     mouse, win0;    Options	    *options;{    int		    err;    if (debug_setinput) {	(void)printf("Set button order to %s.\n",		(options->left_handed) ? "RML" : "LMR");	(void)printf("Set jitter filter %s.\n",		(options->ms_parms.jitter_thresh) ? "on" : "off");	(void)printf("Speed law is %s enforced.\n",		(options->ms_parms.speed_law) ? "" : "not");	(void)printf("Speed limit is %d.\n", options->ms_parms.speed_limit);	(void)printf("Scaling ceiling / factor pairs are:\n");	(void)printf("    %5d : %3d\n",		options->scaling.scales[0].ceiling,		options->scaling.scales[0].factor);	(void)printf("    %5d : %3d\n",		options->scaling.scales[1].ceiling,		options->scaling.scales[1].factor);	(void)printf("    %5d : %3d\n",		options->scaling.scales[2].ceiling,		options->scaling.scales[2].factor);	(void)printf("    %5d : %3d\n",		options->scaling.scales[3].ceiling,		options->scaling.scales[3].factor);	return;    }    err = ioctl(mouse, MSIOSETPARMS, &options->ms_parms);    if (err) {	(void)fprintf(stderr, "Set mouse parms failed");	lose(2);    }    err = win_set_button_order(win0, (options->left_handed) ?					WS_ORDER_RML : WS_ORDER_LMR);    if (err) {	(void)fprintf(stderr, "Set mouse button-order failed");	lose(2);    }    err = win_set_scaling(win0, &options->scaling);    if (err) {	(void)fprintf(stderr, "Set mouse scaling failed");	lose(2);    }}static voidset_keyboard(type, keyboard, info_ptr)    Keybd_type      type;    int             keyboard;    Key_info       *info_ptr;{    register int    count;    register Pair  *pairs;    pairs = info_ptr->down_only;    count = info_ptr->count_downs;    while (count-- > 0) {	if (setkey_local(keyboard, 0, pairs[count].key,		   pairs[count].code) == -1)	    lose(3);	if (setkey_local(keyboard, CTRLMASK, pairs[count].key,		   pairs[count].code) == -1)	    lose(3);	if (setkey_local(keyboard, SHIFTMASK, pairs[count].key,		   pairs[count].code) == -1)	    lose(3);	if (setkey_local(keyboard, CAPSMASK, pairs[count].key,		   pairs[count].code) == -1)	    lose(3);	if (type == Sun4_kbd) {	    if (setkey_local(keyboard, ALTGRAPHMASK, pairs[count].key,		   pairs[count].code) == -1)		lose(3);	}    }    pairs = info_ptr->ups;    count = info_ptr->count_ups;    while (count-- > 0) {	if (setkey_local(keyboard, UPMASK, pairs[count].key,		   pairs[count].code) == -1)	    lose(3);    }}static intsetkey_local(keyboard, table, position, code)    int                keyboard, table, position, code;{    struct kiockeymap  key;    if (code >= STRING && code <= STRING + 15)	(void)strcpy(key.kio_string, keystringtab[code - STRING]);    else	key.kio_string[0] = '\0';    if (debug_setinput) {	(void)printf("Set station %d in %s table to %d.\n",	       position,	       ((table == 0)	 	 ? "base"	 :		(table == CAPSMASK)	 ? "caps-locked" :		(table == SHIFTMASK) 	 ? "shifted"	 :		(table == CTRLMASK)	 ? "controlled"	 :		(table == ALTGRAPHMASK)	 ? "alt-graphed" :		(table == UPMASK)	 ? "key-up"	 :  "unknown"),	       code);	if (code >= STRING && code <= STRING + 15) {	    (void)printf("\t(string[%d]: \"%s\")\n", code - STRING, key.kio_string);	} 	return 0;    } else {	key.kio_tablemask = table;	key.kio_station = position;	key.kio_entry = code;	return ((ioctl((keyboard), KIOCSKEY, &key)));    }}

⌨️ 快捷键说明

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