home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1989 Southwest Research Institute
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Southwest Research Institute. The name of Southwest Research
- * Institute may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
- #ifndef lint
- static char sccsid[] = "@(#)dgtool.c 1.9 6/29/89 Copyright (c) 1989\
- by Southwest Research Institute, San Antonio, Texas";
- #endif
-
- /*
- * path name for `dg' - this is system dependent
- */
-
-
- #define DG "/usr/local/bin/dg"
-
- #include <stdio.h>
- #include <strings.h>
- #include <suntool/sunview.h>
- #include <suntool/panel.h>
- #include <suntool/canvas.h>
- #include <sunwindow/win_cursor.h>
- #include <suntool/tty.h>
- #include <sundev/kbio.h>
- #include <sundev/kbd.h>
- #include <sgtty.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
-
- #define NUM_KEYS_TO_SAVE 8
-
- Frame base_frame;
- Tty tty_win;
- static void input_proc();
- static Notify_value my_tty_interposer();
- static Notify_value my_destroy_interposer();
- static int kb_fd;
-
- static struct kiockey save_keys[NUM_KEYS_TO_SAVE] = {
- {0, 0x45, 0, ""}, /* up arrow */
- {0, 0x5d, 0, ""}, /* right arrow */
- {0, 0x5b, 0, ""}, /*left arrow */
- {0, 0x71, 0, ""}, /*down arrow */
- {SHIFTMASK, 0x45, 0, ""}, /* up arrow */
- {SHIFTMASK, 0x5d, 0, ""}, /* right arrow */
- {SHIFTMASK, 0x5b, 0, ""}, /*left arrow */
- {SHIFTMASK, 0x71, 0, ""}, /*down arrow */
- };
-
- static void get_keys();
- static void fix_keys();
- static void reset_keys();
- static void do_key();
- static void check_baud();
- static void do_c_key();
-
- /* support an icon */
- static short icon_image[] = {
- #include "dgtool.icon"
- };
-
- DEFINE_ICON_FROM_IMAGE(dgtool_icon, icon_image);
-
- struct baud_tab {
- char *baud_string;
- int baud_rate;
- } baud_tab[] = {
- "50", B50,
- "75", B75,
- "110", B110,
- "134", B134,
- "150", B150,
- "200", B200,
- "300", B300,
- "600", B600,
- "1200", B1200,
- "1800", B1800,
- "2400", B2400,
- "4800", B4800,
- "9600", B9600,
- "19200", EXTA,
- NULL, 0
- };
-
- main(argc, argv)
- int argc;
- char **argv;
- {
- int test_fd;
-
- kb_fd = open("/dev/kbd", 2);
- if (kb_fd < 0) {
- fprintf(stderr, "dgtool: keyboard open failed\n");
- exit(1);
- }
-
- base_frame = window_create(0, FRAME,
- WIN_ROWS, 25,
- WIN_COLUMNS, 80,
- FRAME_LABEL, "dgtool",
- FRAME_ICON, &dgtool_icon,
- FRAME_ARGC_PTR_ARGV, &argc, argv,
- 0);
-
- if ((argc > 3) || (argc < 2)) {
- fprintf(stderr, "dgtool /dev/tty?|host [baud] [window args]\n");
- exit(1);
- }
-
- if ( ((test_fd = open(argv[1], 2)) < 0 ) && (gethostbyname(argv[0]) != NULL) ) {
- fprintf(stderr, "dgtool: can't open the line to the DG or find a host\n");
- exit(1);
- } else {
- if (test_fd >= 0)
- close(test_fd);
- }
- if (argc == 3) {
- check_baud(argv[2]);
- }
-
- argv[0] = DG;
-
- tty_win = window_create(base_frame, TTY, TTY_ARGV, argv, 0);
-
- window_set(tty_win, WIN_CONSUME_KBD_EVENTS,
- WIN_ASCII_EVENTS,
- WIN_RIGHT_KEYS,
- WIN_TOP_KEYS,
- 0,
- 0);
- window_set(tty_win, WIN_IGNORE_KBD_EVENT, WIN_UP_EVENTS, 0);
-
- notify_interpose_destroy_func(base_frame, my_destroy_interposer);
- notify_interpose_event_func(tty_win, my_tty_interposer, NOTIFY_SAFE);
-
- window_main_loop(base_frame);
- exit(0);
- }
-
-
-
- static void
- get_keys()
- {
- register int i;
-
- for( i = 0; i < NUM_KEYS_TO_SAVE; i++) {
- if (ioctl(kb_fd, KIOCGETKEY, &save_keys[i]) < 0) {
- fprintf(stderr, "dgtool: getkeys - kb ioctl failed\n");
- exit(1);
- }
- }
- }
-
- static void
- reset_keys()
- {
- register int i;
-
- for( i = 0; i < NUM_KEYS_TO_SAVE; i++) {
- if (ioctl(kb_fd, KIOCSETKEY, &save_keys[i]) < 0) {
- fprintf(stderr, "dgtool: reset_keys - kb ioctl failed\n");
- exit(1);
- }
- }
- }
-
- static void
- fix_keys()
- {
- struct kiockey tmp_key;
-
- tmp_key = save_keys[0]; /* up arrow */
- tmp_key.kio_entry = 027;
- if (ioctl(kb_fd, KIOCSETKEY, &tmp_key) < 0) {
- fprintf(stderr, "dgtool: kb ioctl failed\n");
- exit(1);
- }
-
- tmp_key = save_keys[4]; /* shifted up arrow */
- strcpy(tmp_key.kio_string, "\036\027");
- if (ioctl(kb_fd, KIOCSETKEY, &tmp_key) < 0) {
- fprintf(stderr, "dgtool: kb ioctl failed\n");
- exit(1);
- }
-
- tmp_key = save_keys[1]; /* right arrow */
- tmp_key.kio_entry = 030;
- if (ioctl(kb_fd, KIOCSETKEY, &tmp_key) < 0) {
- fprintf(stderr, "dgtool: kb ioctl failed\n");
- exit(1);
- }
- tmp_key = save_keys[5]; /* shifted right arrow */
- strcpy(tmp_key.kio_string, "\036\030");
- if (ioctl(kb_fd, KIOCSETKEY, &tmp_key) < 0) {
- fprintf(stderr, "dgtool: kb ioctl failed\n");
- exit(1);
- }
-
- tmp_key = save_keys[2]; /* left arrow */
- tmp_key.kio_entry = 031;
- if (ioctl(kb_fd, KIOCSETKEY, &tmp_key) < 0) {
- fprintf(stderr, "dgtool: kb ioctl failed\n");
- exit(1);
- }
- tmp_key = save_keys[6]; /* shifted left arrow */
- strcpy(tmp_key.kio_string, "\036\031");
- if (ioctl(kb_fd, KIOCSETKEY, &tmp_key) < 0) {
- fprintf(stderr, "dgtool: kb ioctl failed\n");
- exit(1);
- }
-
- tmp_key = save_keys[3]; /* down arrow */
- tmp_key.kio_entry = 032;
- if (ioctl(kb_fd, KIOCSETKEY, &tmp_key) < 0) {
- fprintf(stderr, "dgtool: kb ioctl failed\n");
- exit(1);
- }
- tmp_key = save_keys[7]; /* shifted down arrow */
- strcpy(tmp_key.kio_string, "\036\032");
- if (ioctl(kb_fd, KIOCSETKEY, &tmp_key) < 0) {
- fprintf(stderr, "dgtool: kb ioctl failed\n");
- exit(1);
- }
-
- }
-
- static Notify_value
- my_destroy_interposer(frame, status)
- Frame frame;
- Destroy_status status;
- {
- if (status == DESTROY_CLEANUP) {
- reset_keys();
- }
- return(notify_next_destroy_func(frame, status));
- }
-
- static Notify_value
- my_tty_interposer(frame, event, arg, type)
- Frame frame;
- Event *event;
- Notify_arg arg;
- Notify_event_type type;
- {
- register int input;
- register int shift, ctrl;
- char baby_buffer; /* for arrow keys */
- Notify_value value;
-
- input = event_id(event);
-
- if (input == KBD_USE) {
- get_keys();
- fix_keys();
- }
-
- if (input == KBD_DONE) {
- reset_keys();
- }
-
- if ((event_is_key_top(event)) || (event_is_key_right(event)) ) {
-
- if ( event_ctrl_is_down(event)) {
- ctrl = 1;
- } else {
- ctrl = 0;
- }
-
- if ( event_shift_is_down(event)) {
- shift = 1;
- } else {
- shift = 0;
- }
-
- switch(input) {
- /*
- * function keys
- */
- case KEY_RIGHT(6):
- do_key(0160, shift, ctrl);
- break;
- case KEY_TOP(1):
- do_key(0161, shift, ctrl);
- break;
- case KEY_TOP(2):
- do_key(0162, shift, ctrl);
- break;
- case KEY_TOP(3):
- do_key(0163, shift, ctrl);
- break;
- case KEY_TOP(4):
- do_key(0164, shift, ctrl);
- break;
- case KEY_TOP(5):
- do_key(0165, shift, ctrl);
- break;
- case KEY_TOP(6):
- do_key(0166, shift, ctrl);
- break;
- case KEY_TOP(7):
- do_key(0167, shift, ctrl);
- break;
- case KEY_TOP(8):
- do_key(0170, shift, ctrl);
- break;
- case KEY_TOP(9):
- do_key(0171, shift, ctrl);
- break;
- case KEY_RIGHT(1):
- do_key(0172, shift, ctrl);
- break;
- case KEY_RIGHT(2):
- do_key(0173, shift, ctrl);
- break;
- case KEY_RIGHT(3):
- do_key(0174, shift, ctrl);
- break;
- case KEY_RIGHT(4):
- do_key(0175, shift, ctrl);
- break;
- case KEY_RIGHT(5):
- do_key(0176, shift, ctrl);
- break;
- /*
- * home
- */
- case KEY_RIGHT(11):
- baby_buffer = 010;
- ttysw_input(tty_win, &baby_buffer, 1);
- break;
- /*
- * "c" keys
- */
- case KEY_RIGHT(7):
- do_c_key(0134, shift);
- break;
- case KEY_RIGHT(9):
- do_c_key(0135, shift);
- break;
- case KEY_RIGHT(13):
- do_c_key(0136, shift);
- break;
- case KEY_RIGHT(15):
- do_c_key(0137, shift);
- break;
- default:
- break;
- }
- return(NOTIFY_DONE);
- }
- value = notify_next_event_func(frame, event, arg, type);
- return(value);
- }
-
- static void
- do_key(code, shift, ctrl)
- int code, shift, ctrl;
- {
- register char out_code;
- static char buffer[2] = "\036";
-
-
- if (shift && ctrl) {
- out_code = code - 0120;
- } else if (shift) {
- out_code = code - 020;
- } else if (ctrl) {
- out_code = code - 0100;
- } else {
- out_code = code;
- }
- buffer[1] = out_code;
- ttysw_input(tty_win, buffer, 2);
- }
-
- static void
- check_baud(string)
- char *string;
- {
- struct baud_tab *btp;
-
- btp = baud_tab;
-
- while(btp->baud_string != NULL) {
- if (strcmp (string, btp->baud_string) == 0)
- return;
- btp++;
- }
- fprintf(stderr, "dgtool: unknown baud rate\n");
- fprintf(stderr, "known baud rates are:\n");
-
- btp = baud_tab;
- while(btp->baud_string != NULL) {
- fprintf(stderr, "\t%s\n", btp->baud_string);
- btp++;
- }
- exit(1);
- }
-
- static void
- do_c_key(code, shift)
- int code, shift;
- {
- register char out_code;
- static char buffer[2] = "\036";
-
-
- if (shift) {
- out_code = code - 04;
- } else {
- out_code = code;
- }
- buffer[1] = out_code;
- ttysw_input(tty_win, buffer, 2);
- }
-