mcgrew@dartagnan.rutgers.edu (Charles Mcgrew) (05/30/90)
Submitted-by: robert%shangri-la@gatech.edu (Robert Viduya) Posting-number: Volume 2, Issue 12 Archive-name: 3270tool/part02 ---cut here--- #! /bin/sh # Run the following text with /bin/sh to create: # File keypanel.c (16573 bytes) # File 3270.font.uu (13444 bytes) # File telnet.c (7794 bytes) # File 3270_enc.h (6207 bytes) # File selection.c (5912 bytes) # File 3270.h (4709 bytes) # File BtnEnter (541 bytes) if test -f 'keypanel.c' then echo "`basename $0`: can't extract" 'keypanel.c' "- file exists" 1>&2 else sed 's/^X//' << '--End_of_keypanel.c--' > 'keypanel.c' X/* X * Copyright 1989 by Georgia Tech Research Corporation, Atlanta, GA. X * Copyright 1988, 1989 by Robert Viduya. X * X * All Rights Reserved X */ X X/* X * keypanel.c X * This module handles the special 3270 keys using a panel X * of buttons. All the PF keys as well as the PA1, PA2, X * Clear, Enter and SysReq keys are on the panel. Only X * 12 PF keys are displayed at a time; the other 12 are X * accessed by hitting the button labelled "Shift" (which X * is NOT the same as the Shift-key on the keyboard). X */ X X#include <suntool/sunview.h> X#include <suntool/panel.h> X#include <suntool/canvas.h> X#include <stdio.h> X X#define SPACING 2 X X#define ITEM_COORD(n) (((n) * 32) + ((n) * SPACING) + SPACING) X Xstatic unsigned short BtnClear_image[] = { X#include "BtnClear" X}; Xmpr_static (BtnClear_pixrect, 32, 32, 1, BtnClear_image); X Xstatic unsigned short BtnEnter_image[] = { X#include "BtnEnter" X}; Xmpr_static (BtnEnter_pixrect, 32, 32, 1, BtnEnter_image); X Xstatic unsigned short BtnPA1_image[] = { X#include "BtnPA1" X}; Xmpr_static (BtnPA1_pixrect, 32, 32, 1, BtnPA1_image); X Xstatic unsigned short BtnPA2_image[] = { X#include "BtnPA2" X}; Xmpr_static (BtnPA2_pixrect, 32, 32, 1, BtnPA2_image); X Xstatic unsigned short BtnPF01_image[] = { X#include "BtnPF01" X}; Xmpr_static (BtnPF01_pixrect, 32, 32, 1, BtnPF01_image); X Xstatic unsigned short BtnPF02_image[] = { X#include "BtnPF02" X}; Xmpr_static (BtnPF02_pixrect, 32, 32, 1, BtnPF02_image); X Xstatic unsigned short BtnPF03_image[] = { X#include "BtnPF03" X}; Xmpr_static (BtnPF03_pixrect, 32, 32, 1, BtnPF03_image); X Xstatic unsigned short BtnPF04_image[] = { X#include "BtnPF04" X}; Xmpr_static (BtnPF04_pixrect, 32, 32, 1, BtnPF04_image); X Xstatic unsigned short BtnPF05_image[] = { X#include "BtnPF05" X}; Xmpr_static (BtnPF05_pixrect, 32, 32, 1, BtnPF05_image); X Xstatic unsigned short BtnPF06_image[] = { X#include "BtnPF06" X}; Xmpr_static (BtnPF06_pixrect, 32, 32, 1, BtnPF06_image); X Xstatic unsigned short BtnPF07_image[] = { X#include "BtnPF07" X}; Xmpr_static (BtnPF07_pixrect, 32, 32, 1, BtnPF07_image); X Xstatic unsigned short BtnPF08_image[] = { X#include "BtnPF08" X}; Xmpr_static (BtnPF08_pixrect, 32, 32, 1, BtnPF08_image); X Xstatic unsigned short BtnPF09_image[] = { X#include "BtnPF09" X}; Xmpr_static (BtnPF09_pixrect, 32, 32, 1, BtnPF09_image); X Xstatic unsigned short BtnPF10_image[] = { X#include "BtnPF10" X}; Xmpr_static (BtnPF10_pixrect, 32, 32, 1, BtnPF10_image); X Xstatic unsigned short BtnPF11_image[] = { X#include "BtnPF11" X}; Xmpr_static (BtnPF11_pixrect, 32, 32, 1, BtnPF11_image); X Xstatic unsigned short BtnPF12_image[] = { X#include "BtnPF12" X}; Xmpr_static (BtnPF12_pixrect, 32, 32, 1, BtnPF12_image); X Xstatic unsigned short BtnPF13_image[] = { X#include "BtnPF13" X}; Xmpr_static (BtnPF13_pixrect, 32, 32, 1, BtnPF13_image); X Xstatic unsigned short BtnPF14_image[] = { X#include "BtnPF14" X}; Xmpr_static (BtnPF14_pixrect, 32, 32, 1, BtnPF14_image); X Xstatic unsigned short BtnPF15_image[] = { X#include "BtnPF15" X}; Xmpr_static (BtnPF15_pixrect, 32, 32, 1, BtnPF15_image); X Xstatic unsigned short BtnPF16_image[] = { X#include "BtnPF16" X}; Xmpr_static (BtnPF16_pixrect, 32, 32, 1, BtnPF16_image); X Xstatic unsigned short BtnPF17_image[] = { X#include "BtnPF17" X}; Xmpr_static (BtnPF17_pixrect, 32, 32, 1, BtnPF17_image); X Xstatic unsigned short BtnPF18_image[] = { X#include "BtnPF18" X}; Xmpr_static (BtnPF18_pixrect, 32, 32, 1, BtnPF18_image); X Xstatic unsigned short BtnPF19_image[] = { X#include "BtnPF19" X}; Xmpr_static (BtnPF19_pixrect, 32, 32, 1, BtnPF19_image); X Xstatic unsigned short BtnPF20_image[] = { X#include "BtnPF20" X}; Xmpr_static (BtnPF20_pixrect, 32, 32, 1, BtnPF20_image); X Xstatic unsigned short BtnPF21_image[] = { X#include "BtnPF21" X}; Xmpr_static (BtnPF21_pixrect, 32, 32, 1, BtnPF21_image); X Xstatic unsigned short BtnPF22_image[] = { X#include "BtnPF22" X}; Xmpr_static (BtnPF22_pixrect, 32, 32, 1, BtnPF22_image); X Xstatic unsigned short BtnPF23_image[] = { X#include "BtnPF23" X}; Xmpr_static (BtnPF23_pixrect, 32, 32, 1, BtnPF23_image); X Xstatic unsigned short BtnPF24_image[] = { X#include "BtnPF24" X}; Xmpr_static (BtnPF24_pixrect, 32, 32, 1, BtnPF24_image); X Xstatic unsigned short BtnSysReq_image[] = { X#include "BtnSysReq" X}; Xmpr_static (BtnSysReq_pixrect, 32, 32, 1, BtnSysReq_image); X Xstatic unsigned short BtnShift_image[] = { X#include "BtnShift" X}; Xmpr_static (BtnShift_pixrect, 32, 32, 1, BtnShift_image); X Xextern Frame frame; Xextern Canvas canvas; XFrame key_frame; XPanel key_panel; XPanel_item BtnPA1, BtnPA2, BtnClear, X BtnPF01, BtnPF02, BtnPF03, X BtnPF04, BtnPF05, BtnPF06, X BtnPF07, BtnPF08, BtnPF09, X BtnPF10, BtnPF11, BtnPF12, X BtnPF13, BtnPF14, BtnPF15, X BtnPF16, BtnPF17, BtnPF18, X BtnPF19, BtnPF20, BtnPF21, X BtnPF22, BtnPF23, BtnPF24, X BtnSysReq, BtnEnter, BtnShift; Xbool panel_shifted = FALSE, panel_showing = FALSE; X Xextern int key_PA1 (), key_PA2 (), key_Clear (), X key_PF1 (), key_PF2 (), key_PF3 (), X key_PF4 (), key_PF5 (), key_PF6 (), X key_PF7 (), key_PF8 (), key_PF9 (), X key_PF10 (), key_PF11 (), key_PF12 (), X key_PF13 (), key_PF14 (), key_PF15 (), X key_PF16 (), key_PF17 (), key_PF18 (), X key_PF19 (), key_PF20 (), key_PF21 (), X key_PF22 (), key_PF23 (), key_PF24 (), X key_SysReq (), key_Enter (); X X/* X * Shift button hit, hide the currently showing 12 PF keys and show the X * 12 that are hiding. X */ Xkey_PFShift () X{ X if (panel_shifted) { X panel_shifted = FALSE; X panel_set (BtnPF13, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF14, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF15, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF16, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF17, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF18, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF19, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF20, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF21, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF22, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF23, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF24, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF01, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF02, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF03, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF04, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF05, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF06, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF07, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF08, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF09, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF10, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF11, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF12, PANEL_SHOW_ITEM, TRUE, 0); X } X else { X panel_shifted = TRUE; X panel_set (BtnPF01, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF02, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF03, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF04, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF05, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF06, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF07, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF08, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF09, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF10, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF11, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF12, PANEL_SHOW_ITEM, FALSE, 0); X panel_set (BtnPF13, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF14, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF15, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF16, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF17, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF18, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF19, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF20, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF21, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF22, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF23, PANEL_SHOW_ITEM, TRUE, 0); X panel_set (BtnPF24, PANEL_SHOW_ITEM, TRUE, 0); X } X} X X X/* X * Toggle whether the key panel is showing or not. X */ Xkey_panel_toggle () X{ X panel_showing = !((bool) window_get (key_frame, WIN_SHOW)); X window_set (key_frame, WIN_SHOW, panel_showing, 0); X} X X X/* X * Catch open/close events on the main frame so that if the key panel frame X * is visible, we can hide and display it as necessary. This makes the X * key panel frame seem to track the open/close events on the main frame. X */ Xstatic Notify_value Xframe_interposer (frame, event, arg, type) XFrame frame; XEvent *event; XNotify_arg arg; XNotify_event_type type; X{ X int init_closed, current_closed; X Notify_value value; X X init_closed = (int) window_get (frame, FRAME_CLOSED); X value = notify_next_event_func (frame, event, arg, type); X current_closed = (int) window_get (frame, FRAME_CLOSED); X if (init_closed != current_closed && panel_showing) X window_set (key_frame, WIN_SHOW, !current_closed, 0); X return (value); X} X X X/* X * Build the key panel from ground up. Should only be called once. X */ Xkey_panel_init () X{ X int input_designee; X X input_designee = (int) window_get (canvas, WIN_DEVICE_NUMBER); X key_frame = window_create ( X frame, FRAME, X FRAME_SHOW_LABEL, FALSE, X FRAME_SHOW_SHADOW, FALSE, /* SunOS 4.0 only, ok to delete */ X WIN_SHOW, FALSE, X 0 X ); X panel_showing = FALSE; X key_panel = window_create ( X key_frame, PANEL, X PANEL_ITEM_X_GAP, SPACING, X PANEL_ITEM_Y_GAP, SPACING, X WIN_TOP_MARGIN, SPACING, X WIN_BOTTOM_MARGIN, SPACING, X WIN_LEFT_MARGIN, SPACING, X WIN_RIGHT_MARGIN, SPACING, X WIN_ROW_GAP, SPACING, X WIN_COLUMN_GAP, SPACING, X WIN_IGNORE_KBD_EVENTS, WIN_ASCII_EVENTS, X WIN_LEFT_KEYS, X WIN_RIGHT_KEYS, X WIN_TOP_KEYS, X 0, X WIN_INPUT_DESIGNEE, input_designee, X 0 X ); X BtnPA1 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (0), X PANEL_LABEL_IMAGE, &BtnPA1_pixrect, X PANEL_NOTIFY_PROC, key_PA1, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPA2 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (0), X PANEL_LABEL_IMAGE, &BtnPA2_pixrect, X PANEL_NOTIFY_PROC, key_PA2, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnClear = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (0), X PANEL_LABEL_IMAGE, &BtnClear_pixrect, X PANEL_NOTIFY_PROC, key_Clear, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF01 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (1), X PANEL_LABEL_IMAGE, &BtnPF01_pixrect, X PANEL_NOTIFY_PROC, key_PF1, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF02 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (1), X PANEL_LABEL_IMAGE, &BtnPF02_pixrect, X PANEL_NOTIFY_PROC, key_PF2, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF03 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (1), X PANEL_LABEL_IMAGE, &BtnPF03_pixrect, X PANEL_NOTIFY_PROC, key_PF3, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF04 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (2), X PANEL_LABEL_IMAGE, &BtnPF04_pixrect, X PANEL_NOTIFY_PROC, key_PF4, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF05 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (2), X PANEL_LABEL_IMAGE, &BtnPF05_pixrect, X PANEL_NOTIFY_PROC, key_PF5, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF06 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (2), X PANEL_LABEL_IMAGE, &BtnPF06_pixrect, X PANEL_NOTIFY_PROC, key_PF6, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF07 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (3), X PANEL_LABEL_IMAGE, &BtnPF07_pixrect, X PANEL_NOTIFY_PROC, key_PF7, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF08 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (3), X PANEL_LABEL_IMAGE, &BtnPF08_pixrect, X PANEL_NOTIFY_PROC, key_PF8, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF09 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (3), X PANEL_LABEL_IMAGE, &BtnPF09_pixrect, X PANEL_NOTIFY_PROC, key_PF9, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF10 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (4), X PANEL_LABEL_IMAGE, &BtnPF10_pixrect, X PANEL_NOTIFY_PROC, key_PF10, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF11 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (4), X PANEL_LABEL_IMAGE, &BtnPF11_pixrect, X PANEL_NOTIFY_PROC, key_PF11, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF12 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (4), X PANEL_LABEL_IMAGE, &BtnPF12_pixrect, X PANEL_NOTIFY_PROC, key_PF12, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnPF13 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (1), X PANEL_LABEL_IMAGE, &BtnPF13_pixrect, X PANEL_NOTIFY_PROC, key_PF13, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF14 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (1), X PANEL_LABEL_IMAGE, &BtnPF14_pixrect, X PANEL_NOTIFY_PROC, key_PF14, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF15 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (1), X PANEL_LABEL_IMAGE, &BtnPF15_pixrect, X PANEL_NOTIFY_PROC, key_PF15, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF16 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (2), X PANEL_LABEL_IMAGE, &BtnPF16_pixrect, X PANEL_NOTIFY_PROC, key_PF16, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF17 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (2), X PANEL_LABEL_IMAGE, &BtnPF17_pixrect, X PANEL_NOTIFY_PROC, key_PF17, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF18 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (2), X PANEL_LABEL_IMAGE, &BtnPF18_pixrect, X PANEL_NOTIFY_PROC, key_PF18, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF19 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (3), X PANEL_LABEL_IMAGE, &BtnPF19_pixrect, X PANEL_NOTIFY_PROC, key_PF19, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF20 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (3), X PANEL_LABEL_IMAGE, &BtnPF20_pixrect, X PANEL_NOTIFY_PROC, key_PF20, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF21 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (3), X PANEL_LABEL_IMAGE, &BtnPF21_pixrect, X PANEL_NOTIFY_PROC, key_PF21, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF22 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (4), X PANEL_LABEL_IMAGE, &BtnPF22_pixrect, X PANEL_NOTIFY_PROC, key_PF22, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF23 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (4), X PANEL_LABEL_IMAGE, &BtnPF23_pixrect, X PANEL_NOTIFY_PROC, key_PF23, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnPF24 = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (4), X PANEL_LABEL_IMAGE, &BtnPF24_pixrect, X PANEL_NOTIFY_PROC, key_PF24, X PANEL_SHOW_ITEM, FALSE, X 0 X ); X BtnSysReq = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (0), X PANEL_ITEM_Y, ITEM_COORD (5), X PANEL_LABEL_IMAGE, &BtnSysReq_pixrect, X PANEL_NOTIFY_PROC, key_SysReq, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnEnter = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (1), X PANEL_ITEM_Y, ITEM_COORD (5), X PANEL_LABEL_IMAGE, &BtnEnter_pixrect, X PANEL_NOTIFY_PROC, key_Enter, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X BtnShift = panel_create_item ( X key_panel, PANEL_BUTTON, X PANEL_ITEM_X, ITEM_COORD (2), X PANEL_ITEM_Y, ITEM_COORD (5), X PANEL_LABEL_IMAGE, &BtnShift_pixrect, X PANEL_NOTIFY_PROC, key_PFShift, X PANEL_SHOW_ITEM, TRUE, X 0 X ); X panel_shifted = FALSE; X window_fit (key_panel); X window_fit (key_frame); X X /* interpose base frame on opens and close so that we can mimic them on X * the key panel frame. X */ X (void) notify_interpose_event_func (frame, frame_interposer, NOTIFY_SAFE); X} --End_of_keypanel.c-- if test 16573 -ne `wc -c < 'keypanel.c'` then echo "`basename $0`: error in" 'keypanel.c' ": sent 16573 chars, received `wc -c < 'keypanel.c'`" 1>&2 fi fi if test -f '3270.font.uu' then echo "`basename $0`: can't extract" '3270.font.uu' "- file exists" 1>&2 else sed 's/^X//' << '--End_of_3270.font.uu--' > '3270.font.uu' Xbegin 664 3270.font XM 1X< ) ! " ,! ) D ( @# 0 "0 ) $ ( P$ D "0!@ " , XM! ) D @ @# 0 "0 ) * ( P$ D "0# " ,! ) D X @# 0 "0 ) XM 0 ( P$ D "0$@ " ,! ) D!0 @# 0 "0 ) 6 ( P$ D "0& " , XM! ) D!H @# 0 "0 ) < ( P$ D "0'@ " ,! ) D" @# 0 "0 ) XM B ( P$ D "0) " ,! ) D"8 @# 0 "0 ) H ( P$ D "0*@ " , XM! ) D"P @# 0 "0 ) N ( P$ D "0, " ,! ) D#( @# 0 "0 ) XM T ( P$ D "0-@ " ,! ) D#@ @# 0 "0 ) Z ( P$ D "0/ " , XM! ) D#X @# 0 "0 )! ( P$ D "00@ " ,! ) D$0 @# 0 "0 ) XM!& ( P$ D "02 " ,! ) D$H @# 0 "0 )!, ( P$ D "03@ " , XM! ) D% @# 0 "0 )!2 ( P$ D "05 " ,! ) D%8 @# 0 "0 ) XM!8 ( P$ D "06@ " ,! ) D%P @# 0 "0 )!> ( P$ D "08 " , XM! ) D&( @# 0 "0 )!D ( P$ D "09@ " ,! ) D&@ @# 0 "0 ) XM!J ( P$ D "0; " ,! ) D&X @# 0 "0 )!P ( P$ D "0<@ " , XM! ) D'0 @# 0 "0 )!V ( P$ D "0> " ,! ) D'H @# 0 "0 ) XM!\ ( P$ D "0?@ " ,! ) D( @# 0 "0 )"" ( P$ D "0A " , XM! ) D(8 @# 0 "0 )"( ( P$ D "0B@ " ,! ) D(P @# 0 "0 ) XM". ( P$ D "0D " ,! ) D)( @# 0 "0 )"4 ( P$ D "0E@ " , XM! ) D)@ @# 0 "0 )": ( P$ D "0G " ,! ) D)X @# 0 "0 ) XM"@ ( P$ D "0H@ " ,! ) D*0 @# 0 "0 )"F ( P$ D "0J " , XM! ) D*H @# 0 "0 )"L ( P$ D "0K@ " ,! ) D+ @# 0 "0 ) XM"R ( P$ D "0M " ,! ) D+8 @# 0 "0 )"X ( P$ D "0N@ " , XM! ) D+P @# 0 "0 )"^ ( P$ D "0P " ,! ) D,( @# 0 "0 ) XM#$ ( P$ D "0Q@ " ,! ) D,@ @# 0 "0 )#* ( P$ D "0S " , XM! ) D,X @# 0 "0 )#0 ( P$ D "0T@ " ,! ) D-0 @# 0 "0 ) XM#6 ( P$ D "0V " ,! ) D-H @# 0 "0 )#< ( P$ D "0W@ " , XM! ) D. @# 0 "0 )#B ( P$ D "0Y " ,! ) D.8 @# 0 "0 ) XM#H ( P$ D "0Z@ " ,! ) D.P @# 0 "0 )#N ( P$ D "0\ " , XM! ) D/( @# 0 "0 )#T ( P$ D "0]@ " ,! ) D/@ @# 0 "0 ) XM#Z ( P$ D "0_ " ,! ) D/X @# 0 "0 )$ ( P$ D "1 @ " , XM! ) D00 @# 0 "0 )$& ( P$ D "1" " ,! ) D0H @# 0 "0 ) XM$, ( P$ D "1#@ " ,! ) D1 @# 0 "0 )$2 ( P$ D "1% " , XM! ) D18 @# 0 "0 )$8 ( P$ D "1&@ " ,! ) D1P @# 0 "0 ) XM$> ( P$ D "1( " ,! ) D2( @# 0 "0 )$D ( P$ D "1)@ " , XM! ) D2@ @# 0 "0 )$J ( P$ D "1+ " ,! ) D2X @# 0 "0 ) XM$P ( P$ D "1,@ " ,! ) D30 @# 0 "0 )$V ( P$ D "1. " , XM! ) D3H @# 0 "0 )$\ ( P$ D "1/@ " ,! ) D4 @# 0 "0 ) XM%" ( P$ D "11 " ,! ) D48 @# 0 "0 )%( ( P$ D "12@ " , XM! ) D4P @# 0 "0 )%. ( P$ D "14 " ,! ) D5( @# 0 "0 ) XM%4 ( P$ D "15@ " ,! ) D5@ @# 0 "0 )%: ( P$ D "17 " , XM! ) D5X @# 0 "0 )%@ ( P$ D "18@ " ,! ) D60 @# 0 "0 ) XM%F ( P$ D "1: " ,! ) D6H @# 0 "0 )%L ( P$ D "1;@ " , XM! ) D7 @# 0 "0 )%R ( P$ D "1= " ,! ) D78 @# 0 "0 ) XM%X ( P$ D "1>@ " ,! ) D7P @# 0 "0 )%^ ( P$ D "0 XM XM XM XM 8 @# 0 "0 )&" ( P$ D "1A " , XM! ) D88 @# 0 "0 )&( ( P$ D "1B@ " ,! ) D8P @# 0 "0 ) XM&. ( P$ D "1D " ,! ) D9( @# 0 "0 )&4 ( P$ D "1E@ " , XM! ) D9@ @# 0 "0 )&: ( P$ D "1G " ,! ) D9X @# 0 "0 ) XM XM XM XM !H " ,! ) D:( @# 0 "0 ) XM&D ( P$ D "1I@ " ,! ) D:@ @# 0 "0 )&J ( P$ D "1K " , XM! ) D:X @# 0 "0 )&P ( P$ D "1L@ " ,! ) D;0 @# 0 "0 ) XM&V ( P$ D "1N " ,! ) D;H @# 0 "0 )&\ ( P$ D "1O@ " , XM! ) D 50 ' B "( (@ B !P !5 XM ( !@ " ( @ " %4 !@ ) $ @ $ \ XM 50 ?@ $ P @!" #P XM !5 4 "0 1 !^ 0 ! %4 'X 0 !\ XM ( @!\ 50 ( ! %P 8@!" #P XM !5 !^ 0 " ( ! $ ( 0 XM @ ! " 0 " 0 " " 0 " 0 " $ ( 0 XM @ < ! $ 0 ! $ 0 ! $ 0 !P XM !P ! $ 0 ! $ 0 ! $ 0 ' 0 @ ! $ 0 XM! $ @ $ 0 " 0 ! $ 0 ! " $ XM # " ( @ " $ @ " ( @ , # 0 ! XM$ 0 " $ 0 ! $ , XM '\ '\ XM" ( @ D "0 ) XM ! ( ! ( ! ( ! XM $ ( 0 @ ! " $ " ( @ " ( XM @ " ( @ " ( @ " @ " ( @ " " ( @ XM" ( '@ A "$ @ $ @ " " ( XM @ " ( @ " ( ( @ " _ $@ 2 ^ D XM"0!^ @ " " ( #X 2 !( $@ /@ ( @ XM , !( $ 0 'P $ 0 ! <0!N $$ (@ 4 @ XM?P ( @ ?P ( @ > !$ $0 1 !X $ 1 !. $0 1 $ XM $$ (@ < "( (@ B !P (@!! !P XM(@!! $$ 20!) $$ 00 B !P " 8 "@ " ( @ " ( XM @ " > "$ 00 ! ( ! ( ! ( !_ XM #\ 0 " 0 # " $ 0!" #P !@ * !( (@!" XM $( ?P " ( @ !_ $ 0 !\ ( 0 ! $ @!\ XM ! ( ! $ 7 !B $$ 00 B !P ?P ! XM ( ! ( ! $ 0 ! $ < "( (@ B !P (@!! $$ XM(@ < !X (0!! $, 10 Y $ 0 ! ( XM & D $0 2 !$ $( 00!! %$ 3@ < " ( !0 $@ XM1 B !( "@ $ 0 . ) !^ "0 ) !^ "0 XM /@!! $$ 30!5 %X 0 ! $ /P @ % XM(0 " 0 " 0 " 0@ % ( XM ?P P $@ 2 !( # 40!* $0 .@ ! XM /@ XM 8 !@ P # 8 # XM !@ & & 8 ( XM @ " !_ @ " ( !_ $ 0 XM !_ XM !@ ) D !@ (@ 4 @ XM ( !0 (@ XM # 20 & 8P!C XM 0 @ ! XM 0 " 0 XM @ " ( # ( 0 @ \ ( @ ^ XM $( 0@ _ @ ! " #P 0@!" 'X 0 ! #X XM ! " $ ( @ " ( @ " ( 0 @ \ XM $( 0@!" $( 0@ \ @ ! " $( 0@!" $( 0@!" #T XM &0 F / " ( /@!" $( /P R XM $P \ $( 0@!" $( 0@ \ "0 $( 0@!" $( XM(@ 4 @ $ @ $ " $ ( / " ( /@!" $( /P XM ( 0 @ \ $( 0@!^ $ 0 ^ " 0 " #P XM0@!" 'X 0 ! #X ! " $ ( @ " ( @ " XM ( 0 @ \ $( 0@!" $( 0@ \ @ ! XM" $( 0@!" $( 0@!" #T ) 0@!" $( 0@!" XM $( /0 > " 0 ! $ ( > @ . XM "0 #P @ " #X 0@!" #\ ) / !" XM $( ?@! $ /@ B ( @ " ( @ " ( XM "0 #P 0@!" $( 0@!" #P ) XM 0@!" $( 0@!" $( /0 ( !0 \ ( @ ^ $( XM0@ _ @ % #P 0@!" 'X 0 ! #X XM " 4 ( @ " ( @ " ( !0 < "( XM(@ B "( (@ < ! * $0 1 !$ $0 1 !$ #H XM ( ! ( / " ( /@!" $( /P @ $ @ XM \ $( 0@!^ $ 0 ^ $ @ $ " ( @ " ( XM @ 0 " 0 / !" $( 0@!" $( / XM! ( ! !" $( 0@!" $( 0@ ] !D )@ %X (0 A XM "$ (0 A "$ @ ! " @ % B $$ ?P!! $$ 00 XM ( 0 @ ?P! $ ? ! $ 0 !_ 0 @ ! XM !P " ( @ " ( !P " $ ( #X 00!! $$ 00!! $$ XM/@ ( 0 @ 00!! $$ 00!! $$ 00 ^ XM !D )@ @ % B $$ ?P!! $$ !D )@ ^ $$ 00!! $$ XM00!! $$ /@ $$ (@ 4 @ " ( @ " ( XM " 4 "( 00!! '\ 00!! $$ !_ $ XM0 ! 'P 0 ! $ ?P '\ 0 ! $ ? ! $ 0 !_ XM ' ( @ " ( @ " ( !P XM ^ $$ 00!! $$ 00!! $$ /@ $$ 00!! $$ 00!! XM $$ 00 ^ 00 B !0 " ( @ " ( @ XM . !$ ( ! $ 0 @ !$ #@ (@ @ % B XM $$ 00!_ $$ 00!! B ?P! $ 0 !\ $ 0 ! '\ XM "( < @ " ( @ " ( @ ' (@ XM #X 00!! $$ 00!! $$ 00 ^ B 00!! $$ 00!! $$ XM00!! #X @ % @ % B $$ ?P!! $$ 00 XM " 4 ?P! $ 0 !\ $ 0 !_ ( !0 < @ XM" ( @ " ( !P @ % #X 00!! $$ 00!! $$ /@ XM " 4 00!! $$ 00!! $$ 00 ^ ( ! XM( ( !0 (@!! '\ 00!! $$ ( ! ( '\ 0 ! $ ? ! XM $ ?P ! ( ! < @ " ( @ " < XM " 0 " ^ $$ 00!! $$ 00!! #X ( ! ( $$ 00!! XM $$ 00!! $$ /@ 9 "8 !! &$ 40!) $4 0P!! XM #P @ " #X 0@!" #\ 0 ! XM $ > !$ $( 0@!" $0 > > " 0 ! $ XM( > ( @ " !X (@!" $( 0@ B !X XM / !" $( ?@! $ /@ . ! $ !\ ! XM$ 0 ! $ 0 !X (0!! $$ (P = $ (0 > XM 0 ! $ 7 !B $( 0@!" $( 0@ ( XM ( @ " ( @ " ( ( ( @ " ( @ " XM ( (@ < ( @ " (@ D "@ , H "0 (@ XM ( @ " ( @ " ( @ " , #8 20!) XM $D 20!) $D 7@ A "$ (0 A "$ (0 XM \ $( 0@!" $( 0@ \ XM '@ 1 !" $( 0@!$ '@ 0 ! $ '@ B $( 0@ B !X XM @ " , !. #$ ( @ " ( @ XM #P 0@ @ !@ ! !" #P " ( @ /@ ( @ XM" ( @ " !" $( 0@!" $( 0@ ] XM $$ 00 B "( % 4 @ XM00!! $$ 20!) %4 (@ !! "( % ( !0 (@!! XM $( 0@!" $( (@ 4 @ $ @ $ XM ?P " 0 " 0 " ?P !V D &0 O XM $@ 2 W !T (@ F "H ,@ B %P XM ' < / " ( /@!" $( /P > XM " 0 ! $ ( > @ . '\ ?P P # # , !@ XM, ?P!_ " !) "H % J $D " XM @ % B $$ 00!_ $$ 00!! ? B "$ (@ \ "( XM(0 B 'P . !$ ( ! $ 0 @ !$ #@ XM 'P (@ A "$ (0 A "$ (@!\ ?P! $ XM0 !\ $ 0 ! '\ !_ $ 0 ! 'X 0 ! $ 0 XM !P (@! $ 0 !/ $( (@ > XM00!! $$ 00!_ $$ 00!! $$ < @ " ( @ " ( XM @ ' X ! $ 0 ! $ $0 1 X XM 00!" $0 2 !0 &@ 1 !" $$ ! $ 0 ! XM $ 0 ! $ ?P $$ 8P!5 $D 20!! $$ 00!! XM 00!A %$ 20!% $, 00!! $$ ^ XM $$ 00!! $$ 00!! $$ /@ 'P 0@!! $$ 0@!\ $ XM0 ! ' B $$ 00!! $$ 20 J !P @ ! XM !^ $$ 00!! 'X 2 !$ $( 00 #X 00! # XM" & $ 00 ^ ?P ( @ " ( @ " ( @ XM !! $$ 00!! $$ 00!! $$ /@ $$ XM00 B "( (@ 4 !0 " ( 00!! $$ 00!) $D 20!5 XM "( !! $$ (@ 4 @ % B $$ 00 XM $$ (@ 4 @ " ( @ " ( ?P ! ( ! ( XM ! ( ! '\ / !0 ) !$ $< ? !$ $0 1P XM #X 00!# $4 20!1 &$ 00 ^ < !P " 4 XM "( 00!! '\ 00!! $$ . !$ ( ! $ 0 @ !$ XM#@ $ #P P # # , !@ , XM " !) "H % J $D " !\ $( 00!! $( XM? ! $ 0 #X 00! # " & $ 00 ^ XM @ % B "( /@ B "( _X" @(" _X XM" < #X =P#C@,& @( #P $@ 2 !P $@ 2 #P /^ @(" XM@/^ _X" @)" H("@@*R LH"B@)R @(#_@ " XM, X #P /@ ^ #\ /@ \ #@ , @ #_@(" @(" XM@/^ 0 !@#_ 8 ! XM @ # & _X"X@)R CH#_@ , 8 @ ( !0 (@!! XM '< % 4 !0 % 4 !P !P % < @ ?P ( @ % B $$ XM #P $@ 2 !P $@ 2 #P #_@ < XM !0 % 4 !0 % !W $$ (@ 4 @ #_@(" G("B@** @H"$@(B XMB(" @(B @(#_@ /^ _X#_@/^ _X#_@/^ _X#_@/^ _X#_@/^ XM " , X !P #@ _X . < X !@ " XM #_@ /P " 0 " ?X XM #_@ $ XM" " @$$ 0 ! "$ 0 ( $ ( "@ 0 " 0 XM @ @ @(#!@.. ]X!_ #X /@!_ /> XX#!@(" XM /^ _X#_@/^ _X $ P XM '^ , 0 " , 8 #_@/^ _X#_@/^ P !@ " XM . !$ $8 1 X XM #_@!V '8 !@ /^ @("$@(R E("D@+Z XMA("$@(" _X ( !0 (@ B #X (@ B _X XM /^ @(" @(" _X" @/^ _X" @)R E("<@(B X2_X"(@(B E("B@,& _X X Xend --End_of_3270.font.uu-- if test 13444 -ne `wc -c < '3270.font.uu'` then echo "`basename $0`: error in" '3270.font.uu' ": sent 13444 chars, received `wc -c < '3270.font.uu'`" 1>&2 fi uudecode 3270.font.uu fi if test -f 'telnet.c' then echo "`basename $0`: can't extract" 'telnet.c' "- file exists" 1>&2 else sed 's/^X//' << '--End_of_telnet.c--' > 'telnet.c' X/* X * Copyright 1989 by Georgia Tech Research Corporation, Atlanta, GA. X * Copyright 1988, 1989 by Robert Viduya. X * X * All Rights Reserved X */ X X/* X * telnet.c X * This module initializes and manages a telnet socket to X * the given IBM host. X */ X X#include <sys/types.h> X#include <sys/socket.h> X#include <sys/ioctl.h> X#include <netinet/in.h> X#include <arpa/telnet.h> X#include <netdb.h> X#include <fcntl.h> X#include <suntool/sunview.h> X#include <errno.h> X#include <stdio.h> X X#define BUFSZ 4096 X Xu_char myopts[256], hisopts[256]; /* telnet option flags */ Xu_char ibuf[4*BUFSZ], *ibptr; /* 3270 input buffer */ Xu_char obuf[4*BUFSZ], *obptr; /* 3270 output buffer */ Xu_char netrbuf[BUFSZ]; /* network input buffer */ Xu_char sbbuf[1024], *sbptr; /* telnet sub-option buffer */ X X/* telnet states */ X#define TNS_DATA 0 /* receiving data */ X#define TNS_IAC 1 /* got an IAC */ X#define TNS_WILL 2 /* got an IAC WILL */ X#define TNS_WONT 3 /* got an IAC WONT */ X#define TNS_DO 4 /* got an IAC DO */ X#define TNS_DONT 5 /* got an IAC DONT */ X#define TNS_SB 6 /* got an IAC SB */ X#define TNS_SB_IAC 7 /* got an IAC after an IAC SB */ Xstatic u_char telnet_state; X X/* telnet predefined messages */ Xstatic u_char do_opt[] = { IAC, DO, '_' }; Xstatic u_char dont_opt[] = { IAC, DONT, '_' }; Xstatic u_char will_opt[] = { IAC, WILL, '_' }; Xstatic u_char wont_opt[] = { IAC, WONT, '_' }; Xstatic u_char ttype_opt[] = { IAC, SB, TELOPT_TTYPE, TELQUAL_IS, X 'I', 'B', 'M', '-', '3', '2', '7', '8', '-', '2', X IAC, SE }; X Xextern Frame frame; Xextern u_long inet_addr (); X X X/* X * connect_net X * Establish a telnet socket to the given host passed as an argument. X * Called only once and is responsible for setting up the telnet X * variables. Returns the file descriptor of the connected socket. X */ Xint Xconnect_net (host) Xchar *host; X{ X struct servent *sp; X struct hostent *hp; X struct sockaddr_in sin; X int net, i; X X /* initialize the telnet variables */ X bzero ((char *) myopts, sizeof (myopts)); X bzero ((char *) hisopts, sizeof (hisopts)); X telnet_state = TNS_DATA; X ibptr = &ibuf[0]; X sbptr = &sbbuf[0]; X X /* get the tcp/ip service (telnet) */ X if ((sp = getservbyname ("telnet", "tcp")) == (struct servent *) 0) { X (void) fprintf (stderr, "3270tool: telnet/tcp - unknown service\n"); X exit (1); X } X X /* fill in the socket address of the given host */ X bzero ((char *) &sin, sizeof (sin)); X if ((hp = gethostbyname (host)) == (struct hostent *) 0) { X sin.sin_family = AF_INET; X sin.sin_addr.s_addr = inet_addr (host); X if (sin.sin_addr.s_addr == -1) { X (void) fprintf (stderr, "3270tool: unknown host (%s)\n", host); X exit (1); X } X } X else { X sin.sin_family = hp->h_addrtype; X bcopy ((char *) hp->h_addr, (char *) &sin.sin_addr, hp->h_length); X } X sin.sin_port = sp->s_port; X X /* create and establish a connection on the socket */ X if ((net = socket (AF_INET, SOCK_STREAM, 0)) == -1) { X perror ("3270tool: socket"); X exit (1); X } X if (connect (net, (struct sockaddr *) &sin, sizeof (sin)) == -1) { X perror ("3270tool: connect"); X exit (1); X } X X /* set the socket to be asynchronous and non-delaying */ X i = FNDELAY | FASYNC; X if (fcntl (net, F_SETFL, i) == -1) { X perror ("3270tool: fcntl"); X exit (1); X } X i = -getpid (); X if (ioctl (net, SIOCSPGRP, &i) == -1) { X perror ("3270tool: ioctl"); X exit (1); X } X X /* all done */ X return (net); X} X X X/* X * net_input X * Called by the notifier whenever there is input available on the X * socket. Reads the data, processes the special telnet commands X * and calls net_process to process the 3270 data stream. X */ X/*ARGSUSED*/ XNotify_value Xnet_input (client, fd) XNotify_client client; Xint fd; X{ X register u_char *cp; X int nr; X int br; X X br = 0; X do { /* until no more data available */ X nr = read (fd, (char *) netrbuf, BUFSZ); X if (nr > 0) { X br += nr; X for (cp = netrbuf; cp < (netrbuf + nr); cp++) { X switch (telnet_state) { X case TNS_DATA: /* normal data processing */ X if (*cp == IAC) /* got a telnet command */ X telnet_state = TNS_IAC; X else X *ibptr++ = *cp; X break; X case TNS_IAC: /* process a telnet command */ X switch (*cp) { X case IAC: /* escaped IAC, insert it */ X *ibptr++ = *cp; X telnet_state = TNS_DATA; X break; X case EOR: /* eor, process accumulated input */ X net_process (ibuf, ibptr - ibuf); X ibptr = ibuf; X telnet_state = TNS_DATA; X break; X case WILL: X telnet_state = TNS_WILL; X break; X case WONT: X telnet_state = TNS_WONT; X break; X case DO: X telnet_state = TNS_DO; X break; X case DONT: X telnet_state = TNS_DONT; X break; X case SB: X telnet_state = TNS_SB; X sbptr = sbbuf; X break; X } X break; X case TNS_WILL: /* telnet WILL DO OPTION command */ X switch (*cp) { X case TELOPT_BINARY: X case TELOPT_EOR: X case TELOPT_TTYPE: X if (!hisopts[*cp]) { X hisopts[*cp] = 1; X do_opt[2] = *cp; X (void) write (fd, (char *) do_opt, sizeof (do_opt)); X } X break; X default: X dont_opt[2] = *cp; X (void) write (fd, (char *) dont_opt, sizeof (dont_opt)); X break; X } X telnet_state = TNS_DATA; X break; X case TNS_WONT: /* telnet WONT DO OPTION command */ X switch (*cp) { X case TELOPT_BINARY: X case TELOPT_EOR: X case TELOPT_TTYPE: X (void) fprintf (stderr, "3270tool: Remote host won't do option 0%03o.\n", *cp); X (void) fprintf (stderr, "3270tool: Are you sure it's an IBM?\n"); X window_done (frame); X break; X default: X hisopts[*cp] = 0; X break; X } X telnet_state = TNS_DATA; X break; X case TNS_DO: /* telnet PLEASE DO OPTION command */ X switch (*cp) { X case TELOPT_BINARY: X case TELOPT_EOR: X case TELOPT_TTYPE: X if (!myopts[*cp]) { X myopts[*cp] = 1; X will_opt[2] = *cp; X (void) write (fd, (char *) will_opt, sizeof (will_opt)); X } X break; X default: X wont_opt[2] = *cp; X (void) write (fd, (char *) wont_opt, sizeof (wont_opt)); X break; X } X telnet_state = TNS_DATA; X break; X case TNS_DONT: /* telnet PLEASE DON'T DO OPTION command */ X switch (*cp) { X case TELOPT_BINARY: X case TELOPT_EOR: X case TELOPT_TTYPE: X (void) fprintf (stderr, "3270tool: Remote host says don't do option 0%03o.\n", *cp); X (void) fprintf (stderr, "3270tool: Are you sure it's an IBM?\n"); X window_done (frame); X break; X default: X myopts[*cp] = 0; X break; X } X telnet_state = TNS_DATA; X break; X case TNS_SB: /* telnet sub-option string command */ X if (*cp == IAC) X telnet_state = TNS_SB_IAC; X else X *sbptr++ = *cp; X break; X case TNS_SB_IAC: /* telnet sub-option string command */ X if (*cp == SE) { X telnet_state = TNS_DATA; X if (sbbuf[0] == TELOPT_TTYPE && sbbuf[1] == TELQUAL_SEND) { X (void) write (fd, (char *) ttype_opt, sizeof (ttype_opt)); X } X } X else { X *sbptr = *cp; /* just stuff it */ X telnet_state = TNS_SB; X } X break; X } X } X } X else if (nr < 0 && errno != EWOULDBLOCK) { /* got an error */ X perror ("3270tool: read(net)"); X window_done (frame); X } X } while (nr > 0); X if (br == 0) X window_done (frame); X return (NOTIFY_DONE); X} X X X/* X * net_output X * Called to send output over the network. Tacks on the necessary X * telnet end-of-record command before doing a standard write. X */ Xnet_output (buf, buflen) Xu_char buf[]; Xint buflen; X{ X extern int net_sock; X X buf[buflen++] = IAC; X buf[buflen++] = EOR; X if (write (net_sock, (char *) buf, buflen) != buflen) { X perror ("3270tool: write(net)"); X window_done (frame); X } X} --End_of_telnet.c-- if test 7794 -ne `wc -c < 'telnet.c'` then echo "`basename $0`: error in" 'telnet.c' ": sent 7794 chars, received `wc -c < 'telnet.c'`" 1>&2 fi fi if test -f '3270_enc.h' then echo "`basename $0`: can't extract" '3270_enc.h' "- file exists" 1>&2 else sed 's/^X//' << '--End_of_3270_enc.h--' > '3270_enc.h' X/* X * Copyright 1989 by Georgia Tech Research Corporation, Atlanta, GA. X * Copyright 1988, 1989 by Robert Viduya. X * X * All Rights Reserved X */ X X/* X * 3270_enc.h X * X * Header file for 3270tool. Contains the character encoding X * of the 3270.font vfont. X */ X X#define CG_NULLBLANK 0x00 X#define CG_OVERBAR1 0x01 X#define CG_OVERBAR2 0x02 X#define CG_OVERBAR3 0x03 X#define CG_OVERBAR4 0x04 X#define CG_OVERBAR5 0x05 X#define CG_OVERBAR6 0x06 X#define CG_OVERBAR7 0x07 X#define CG_GREATER 0x08 X#define CG_LESS 0x09 X#define CG_LBRACKET 0x0A X#define CG_RBRACKET 0x0B X#define CG_RPAREN 0x0C X#define CG_LPAREN 0x0D X#define CG_RBRACE 0x0E X#define CG_LBRACE 0x0F X#define CG_BLANK 0x10 X#define CG_EQUAL 0x11 X#define CG_SQUOTE 0x12 X#define CG_DQUOTE 0x13 X#define CG_FSLASH 0x14 X#define CG_BSLASH 0x15 X#define CG_SOLIDBAR 0x16 X#define CG_BROKENBAR 0x17 X#define CG_QUESTION 0x18 X#define CG_EXCLAMATION 0x19 X#define CG_DOLLAR 0x1A X#define CG_CENT 0x1B X#define CG_POUND 0x1C X#define CG_YEN 0x1D X#define CG_PT 0x1E X#define CG_CURRENCY 0x1F X#define CG_ZERO 0x20 X#define CG_ONE 0x21 X#define CG_TWO 0x22 X#define CG_THREE 0x23 X#define CG_FOUR 0x24 X#define CG_FIVE 0x25 X#define CG_SIX 0x26 X#define CG_SEVEN 0x27 X#define CG_EIGHT 0x28 X#define CG_NINE 0x29 X#define CG_SHARPS 0x2A X#define CG_SECTION 0x2B X#define CG_NUMBER 0x2C X#define CG_AT 0x2D X#define CG_PERCENT 0x2E X#define CG_UNDERSCORE 0x2F X#define CG_AMPERSAND 0x30 X#define CG_MINUS 0x31 X#define CG_PERIOD 0x32 X#define CG_COMMA 0x33 X#define CG_COLON 0x34 X#define CG_PLUS 0x35 X#define CG_NOT 0x36 X#define CG_OVERSCORE 0x37 X#define CG_DEGREE 0x38 X#define CG_BREVE 0x39 X#define CG_CIRCUMFLEX 0x3A X#define CG_TILDE 0x3B X#define CG_DIAERESIS 0x3C X#define CG_GRAVE 0x3D X#define CG_ACUTE 0x3E X#define CG_CEDILLA 0x3F X#define CG_LAACUTE1 0x40 X#define CG_LEACUTE1 0x41 X#define CG_LIACUTE1 0x42 X#define CG_LOACUTE1 0x43 X#define CG_LUACUTE1 0x44 X#define CG_LATILDE 0x45 X#define CG_LOTILDE 0x46 X#define CG_LYDIAERESIS 0x47 X#define CG_LAACUTE2 0x48 X#define CG_LEACUTE2 0x49 X#define CG_LEGRAVE1 0x4A X#define CG_LIACUTE2 0x4B X#define CG_LOACUTE2 0x4C X#define CG_LUACUTE2 0x4D X#define CG_LUDIAERESIS1 0x4E X#define CG_LCCEDILLA1 0x4F X#define CG_LADIAERESIS 0x50 X#define CG_LEDIAERESIS 0x51 X#define CG_LIDIAERESIS 0x52 X#define CG_LODIAERESIS 0x53 X#define CG_LUDIAERESIS2 0x54 X#define CG_LACIRCUMFLEX 0x55 X#define CG_LECIRCUMFLEX 0x56 X#define CG_LICIRCUMFLEX 0x57 X#define CG_LOCIRCUMFLEX 0x58 X#define CG_LUCIRCUMFLEX 0x59 X#define CG_LAGRAVE 0x5A X#define CG_LEGRAVE2 0x5B X#define CG_LIGRAVE 0x5C X#define CG_LOGRAVE 0x5D X#define CG_LUGRAVE 0x5E X#define CG_LNTILDE 0x5F X#define CG_CAACUTE 0x60 X#define CG_CEACUTE 0x61 X#define CG_CIACUTE 0x62 X#define CG_COACUTE 0x63 X#define CG_CUACUTE 0x64 X#define CG_CATILDE 0x65 X#define CG_COTILDE 0x66 X#define CG_CY1 0x67 X#define CG_CA1 0x68 X#define CG_CE1 0x69 X#define CG_CE2 0x6A X#define CG_CI1 0x6B X#define CG_CO1 0x6C X#define CG_CU1 0x6D X#define CG_CY2 0x6E X#define CG_CC1 0x6F X#define CG_CADIAERESIS 0x70 X#define CG_CEDIAERESIS 0x71 X#define CG_CIDIAERESIS 0x72 X#define CG_CODIAERESIS 0x73 X#define CG_CUDIAERESIS 0x74 X#define CG_CACIRCUMFLEX 0x75 X#define CG_CECIRCUMFLEX 0x76 X#define CG_CICIRCUMFLEX 0x77 X#define CG_COCIRCUMFLEX 0x78 X#define CG_CUCIRCUMFLEX 0x79 X#define CG_CAGRAVE 0x7A X#define CG_CEGRAVE 0x7B X#define CG_CIGRAVE 0x7C X#define CG_COGRAVE 0x7D X#define CG_CUGRAVE 0x7E X#define CG_CNTILDE 0x7F X#define CG_LA 0x80 X#define CG_LB 0x81 X#define CG_LC 0x82 X#define CG_LD 0x83 X#define CG_LE 0x84 X#define CG_LF 0x85 X#define CG_LG 0x86 X#define CG_LH 0x87 X#define CG_LI 0x88 X#define CG_LJ 0x89 X#define CG_LK 0x8A X#define CG_LL 0x8B X#define CG_LM 0x8C X#define CG_LN 0x8D X#define CG_LO 0x8E X#define CG_LP 0x8F X#define CG_LQ 0x90 X#define CG_LR 0x91 X#define CG_LS 0x92 X#define CG_LT 0x93 X#define CG_LU 0x94 X#define CG_LV 0x95 X#define CG_LW 0x96 X#define CG_LX 0x97 X#define CG_LY 0x98 X#define CG_LZ 0x99 X#define CG_LAE 0x9A X#define CG_SSLASH0 0x9B X#define CG_LADOT 0x9C X#define CG_LCCEDILLA2 0x9D X#define CG_FM 0x9E X#define CG_DUP 0x9F X#define CG_CA 0xA0 X#define CG_CB 0xA1 X#define CG_CC 0xA2 X#define CG_CD 0xA3 X#define CG_CE 0xA4 X#define CG_CF 0xA5 X#define CG_CG 0xA6 X#define CG_CH 0xA7 X#define CG_CI 0xA8 X#define CG_CJ 0xA9 X#define CG_CK 0xAA X#define CG_CL 0xAB X#define CG_CM 0xAC X#define CG_CN 0xAD X#define CG_CO 0xAE X#define CG_CP 0xAF X#define CG_CQ 0xB0 X#define CG_CR 0xB1 X#define CG_CS 0xB2 X#define CG_CT 0xB3 X#define CG_CU 0xB4 X#define CG_CV 0xB5 X#define CG_CW 0xB6 X#define CG_CX 0xB7 X#define CG_CY 0xB8 X#define CG_CZ 0xB9 X#define CG_CAE 0xBA X#define CG_BSLASH0 0xBB X#define CG_CADOT 0xBC X#define CG_CCCEDILLA 0xBD X#define CG_SEMICOLON 0xBE X#define CG_ASTERISK 0xBF X#define CG_0xC0 0xC0 X#define CG_0xC1 0xC1 X#define CG_0xC2 0xC2 X#define CG_0xC3 0xC3 X#define CG_0xC4 0xC4 X#define CG_0xC5 0xC5 X#define CG_0xC6 0xC6 X#define CG_0xC7 0xC7 X#define CG_0xC8 0xC8 X#define CG_0xC9 0xC9 X#define CG_0xCA 0xCA X#define CG_0xCB 0xCB X#define CG_0xCC 0xCC X#define CG_0xCD 0xCD X#define CG_0xCE 0xCE X#define CG_0xCF 0xCF X#define CG_PSP 0xD0 X#define CG_PSS 0xD1 X#define CG_BLOCKA 0xD2 X#define CG_INSERT 0xD3 X#define CG_BLOCKB 0xD4 X#define CG_BOX6 0xD5 X#define CG_RIGHTTRI 0xD6 X#define CG_STATION 0xD7 X#define CG_RIGHTARROW 0xD8 X#define CG_BADSTATION 0xD9 X#define CG_UPSHIFT 0xDA X#define CG_HUMAN 0xDB X#define CG_UNDERB 0xDC X#define CG_DOWNSHIFT 0xDD X#define CG_BOXQUESTION 0xDE X#define CG_BOXSOLID 0xDF X#define CG_0xE0 0xE0 X#define CG_0xE1 0xE1 X#define CG_0xE2 0xE2 X#define CG_0xE3 0xE3 X#define CG_0xE4 0xE4 X#define CG_0xE5 0xE5 X#define CG_0xE6 0xE6 X#define CG_0xE7 0xE7 X#define CG_0xE8 0xE8 X#define CG_0xE9 0xE9 X#define CG_0xEA 0xEA X#define CG_0xEB 0xEB X#define CG_0xEC 0xEC X#define CG_0xED 0xED X#define CG_0xEE 0xEE X#define CG_0xEF 0xEF X#define CG_BADCOMMHI 0xF0 X#define CG_COMMHI 0xF1 X#define CG_COMMJAG 0xF2 X#define CG_COMMLO 0xF3 X#define CG_CLOCKLEFT 0xF4 X#define CG_CLOCKRIGHT 0xF5 X#define CG_LOCK 0xF6 X#define CG_BUSYSTATION 0xF7 X#define CG_LEFTARROW 0xF8 X#define CG_BADBUSYSTATION 0xF9 X#define CG_KEYLEFT 0xFA X#define CG_KEYRIGHT 0xFB X#define CG_BOX4 0xFC X#define CG_UNDERA 0xFD X#define CG_MAGCARD 0xFE X#define CG_BOXHUMAN 0xFF --End_of_3270_enc.h-- if test 6207 -ne `wc -c < '3270_enc.h'` then echo "`basename $0`: error in" '3270_enc.h' ": sent 6207 chars, received `wc -c < '3270_enc.h'`" 1>&2 fi fi if test -f 'selection.c' then echo "`basename $0`: can't extract" 'selection.c' "- file exists" 1>&2 else sed 's/^X//' << '--End_of_selection.c--' > 'selection.c' X/* X * Copyright 1989 by Georgia Tech Research Corporation, Atlanta, GA. X * Copyright 1988, 1989 by Robert Viduya. X * X * All Rights Reserved X */ X X/* X * selection.c X * This module handles putting and getting the selection. X * Selections in the window are done in a block-mode fashion X * instead of the expected line-by-line. This seems more X * appropriate for the displays produced by most IBM software. X */ X X#include <suntool/sunview.h> X#include <suntool/canvas.h> X#include <suntool/seln.h> X#include <stdio.h> X#include "3270.h" X#include "3270_enc.h" X Xbool seln_isset; Xint row_start, row_end, col_start, col_end; /* selection area */ XSeln_client s_client; Xu_char prim_seln[ROWS * COLS + ROWS + 1];/* enough for screen + eols */ Xint prim_size = 0; Xu_char shelf_seln[ROWS * COLS + ROWS + 1]; Xint shelf_size = 0; Xextern u_char asc2cg[128], cg2asc[256]; Xextern u_char screen_buf[ROWS * COLS]; Xextern Pixwin *pixwin; Xextern Pixfont *ibmfont; Xextern int char_width, char_height, char_base; X X XSeln_result Xread_seln (buffer) XSeln_request *buffer; X{ X register char *cp; X char *reply; X int cgcode; X Event event; X X if (*buffer->requester.context == 0) { X if (buffer == (Seln_request *) NULL X || *((Seln_attribute *) buffer->data) != SELN_REQ_CONTENTS_ASCII) { X fprintf (stderr, "Selection holder error -- unknown request (in read_seln)\n"); X return (SELN_FAILED); X } X else { X reply = buffer->data + sizeof (Seln_attribute); X *buffer->requester.context = 1; X } X } X else X reply = buffer->data; X bzero (&event, sizeof (event)); X for (cp = reply; *cp; cp++) { X /* code copied out of canvas_event_proc in kybd.c */ X if ((*cp >= ' ' && *cp <= '~') || (*cp == 0x1B)) { X cgcode = asc2cg[*cp]; X if (cgcode != CG_NULLBLANK) X (void) key_Character (cgcode); X } X } X return (SELN_SUCCESS); X} X X Xstuff_seln () X{ X Seln_holder holder; X char context = 0; X X holder = seln_inquire (SELN_PRIMARY); X if (holder.state == SELN_NONE) /* no selection */ X return; X seln_query (&holder, read_seln, &context, SELN_REQ_CONTENTS_ASCII, 0, 0); X} X X Xkey_seln (client_data, args) Xchar *client_data; XSeln_function_buffer *args; X{ X Seln_holder *holder; X char context = 0; X X switch (seln_figure_response (args, &holder)) { X case SELN_REQUEST: /* GET */ X seln_query (holder, read_seln, &context, SELN_REQ_CONTENTS_ASCII, 0, 0); X break; X case SELN_SHELVE: /* PUT */ X if (seln_acquire (s_client, SELN_SHELF) != SELN_SHELF) X fprintf (stderr, "can't acquire shelf selection!\n"); X else { X shelf_size = prim_size; X bcopy (prim_seln, shelf_seln, shelf_size); X } X default: /* ignore the rest */ X break; X } X} X X XSeln_result Xreply_seln (item, context, length) XSeln_attribute item; XSeln_replier_data *context; Xint length; X{ X u_char *seln, *destp; X int size, needed; X X switch (item) { X case SELN_REQ_BYTESIZE: X if (context->rank == SELN_PRIMARY) { X *context->response_pointer++ = (char *) prim_size; X return (SELN_SUCCESS); X } X else if (context->rank == SELN_SHELF) { X *context->response_pointer++ = (char *) shelf_size; X return (SELN_SUCCESS); X } X else X return (SELN_DIDNT_HAVE); X case SELN_REQ_YIELD: X if (context->rank == SELN_PRIMARY) { X clear_seln (); X return (SELN_SUCCESS); X } X else if (context->rank == SELN_SHELF) { X shelf_size = 0; X return (SELN_SUCCESS); X } X else X return (SELN_DIDNT_HAVE); X case SELN_REQ_CONTENTS_ASCII: X if (context->rank == SELN_PRIMARY) X seln = prim_seln; X else if (context->rank == SELN_SHELF) X seln = shelf_seln; X else X return (SELN_DIDNT_HAVE); X if (context->context == NULL) X context->context = (char *) seln; X size = strlen (context->context); X destp = (u_char *) context->response_pointer; X needed = size + 4; X if (size % 4 != 0) X needed += 4 - size % 4; X if (needed <= length) { /* everything fits */ X strcpy (destp, context->context); X destp += size; X while ((int) destp % 4 != 0) X *destp++ = '\0'; X context->response_pointer = (char **) destp; X *context->response_pointer++ = 0; X return (SELN_SUCCESS); X } X else { X strncpy (destp, context->context, length); X destp += length; X context->response_pointer = (char **) destp; X context->context += length; X return (SELN_CONTINUED); X } X break; X case SELN_REQ_END_REQUEST: X return (SELN_SUCCESS); X default: X return (SELN_UNRECOGNIZED); X } X} X X Xset_seln (sbaddr, ebaddr) Xint sbaddr, ebaddr; X{ X register u_char *cp; X int r, c; X X cursor_off (); /* also clears selection, if any */ X /* make sure order is correct */ X if (ebaddr < sbaddr) { X r = ebaddr; X ebaddr = sbaddr; X sbaddr = r; X } X col_start = BA_TO_COL (sbaddr); X row_start = BA_TO_ROW (sbaddr); X col_end = BA_TO_COL (ebaddr); X row_end = BA_TO_ROW (ebaddr); X pw_writebackground ( X pixwin, X COL_TO_X (col_start), ROW_TO_Y (row_start), X COL_TO_X (col_end - col_start + 1), ROW_TO_Y (row_end - row_start + 1), X PIX_SET ^ PIX_DST X ); X cp = prim_seln; X for (r = row_start; r <= row_end; r++) { X for (c = col_start; c <= col_end; c++) X *cp++ = cg2asc[screen_buf[ROWCOL_TO_BA(r,c)]]; X *cp++ = '\n'; X } X *cp = '\0'; X prim_size = cp - prim_seln; X cursor_on (); X seln_isset = TRUE; X if (seln_acquire (s_client, SELN_PRIMARY) != SELN_PRIMARY) X fprintf (stderr, "can't acquire primary selection!\n"); X} X X Xclear_seln () X{ X if (!seln_isset) X return; X prim_size = 0; X pw_writebackground ( X pixwin, X COL_TO_X (col_start), ROW_TO_Y (row_start), X COL_TO_X (col_end - col_start + 1), ROW_TO_Y (row_end - row_start + 1), X PIX_SET ^ PIX_DST X ); X seln_isset = FALSE; X seln_done (s_client, SELN_PRIMARY); X} X X Xselection_init () X{ X s_client = seln_create (key_seln, reply_seln, (char *) 0); X seln_isset = FALSE; X} X X Xselection_exit () X{ X seln_destroy (s_client); X} --End_of_selection.c-- if test 5912 -ne `wc -c < 'selection.c'` then echo "`basename $0`: error in" 'selection.c' ": sent 5912 chars, received `wc -c < 'selection.c'`" 1>&2 fi fi if test -f '3270.h' then echo "`basename $0`: can't extract" '3270.h' "- file exists" 1>&2 else sed 's/^X//' << '--End_of_3270.h--' > '3270.h' X/* X * Copyright 1989 by Georgia Tech Research Corporation, Atlanta, GA. X * Copyright 1988, 1989 by Robert Viduya. X * X * All Rights Reserved X */ X X/* X * 3270.h X * X * Header file for 3270tool. Contains a number of constants X * and macros that shouldn't be changed unless you know what X * you're doing. X */ X X/* 3270 commands */ X#define CMD_EAU 0x0F /* erase all unprotected */ X#define CMD_EW 0x05 /* erase/write */ X#define CMD_EWA 0x0D /* erase/write alternate */ X#define CMD_RB 0x02 /* read buffer */ X#define CMD_RM 0x06 /* read modified */ X#define CMD_W 0x01 /* write */ X#define CMD_NOP 0x03 /* no-op */ X X/* 3270 orders */ X#define ORDER_SF 0x1D /* start field */ X#define ORDER_SFE 0x29 /* start field extended */ X#define ORDER_SBA 0x11 /* set buffer address */ X#define ORDER_SA 0x28 /* set attribute */ X#define ORDER_MF 0x2C /* modify field */ X#define ORDER_IC 0x13 /* insert cursor */ X#define ORDER_PT 0x05 /* program tab */ X#define ORDER_RA 0x3C /* repeat to address */ X#define ORDER_EUA 0x12 /* erase unprotected to address */ X#define ORDER_GE 0x08 /* graphic escape */ X#define ORDER_YALE 0x2B /* Yale sub command */ X X/* screen dimensions */ X#define COLS 80 X#define ROWS 24 X X#define CHAR_WIDTH (ibmfont->pf_char[0x10].pc_pr->pr_size.x) X#define CHAR_HEIGHT (ibmfont->pf_char[0x10].pc_pr->pr_size.y) X#define CHAR_BASE (ibmfont->pf_char[0x10].pc_home.y) X#define X_TO_COL(x_pos) ((x_pos) / char_width) X#define Y_TO_ROW(y_pos) ((y_pos) / char_height) X#define COL_TO_X(col) ((col) * char_width) X#define ROW_TO_Y(row) ((row) * char_height) X#define ROW_TO_YC(row) ((row) * char_height - char_base) X X#define BA_TO_ROW(ba) ((ba) / COLS) X#define BA_TO_COL(ba) ((ba) % COLS) X#define ROWCOL_TO_BA(r,c) (((r) * COLS) + c) X#define INC_BA(ba) \ X { \ X if (++ba >= (COLS * ROWS)) \ X ba = 0; \ X } X X#define DEC_BA(ba) \ X { \ X if (--ba < 0) \ X ba = (COLS * ROWS) - 1; \ X } X X X#define PW_CHAR(pw,xcoord,ycoord,op,char) \ X pw_rop ( \ X pw, xcoord, ycoord, \ X char_width, char_height, \ X op, ibmfont->pf_char[(char ? char : 0x10)].pc_pr, 0, 0 \ X ) X X X/* field attribute definitions X * The font used (3270.font) in ibmfont is based on the 3270 character X * generator font found on page 12-2 in the IBM 3270 Information Display X * System Character Set Reference. Characters 0xC0 through 0xCF and X * 0xE0 through 0xEF (inclusive) are purposely left blank and are used X * to represent field attributes as follows: X * X * 11x0xxxx X * | |||| X * | ||++--- 00 normal intensity/non-selectable X * | || 01 normal intensity/selectable X * | || 10 high intensity/selectable X * | || 11 zero intensity/non-selectable X * | |+----- unprotected(0)/protected(1) X * | +------ alphanumeric(0)/numeric(1) X * +-------- unmodified(0)/modified(1) X */ X#define FA_BASE 0xC0 X#define FA_MASK 0xD0 X#define FA_MODIFY 0x20 X#define FA_NUMERIC 0x08 X#define FA_PROTECT 0x04 X#define FA_INTENSITY 0x03 X X#define FA_INT_NORM_NSEL 0x00 X#define FA_INT_NORM_SEL 0x01 X#define FA_INT_HIGH_SEL 0x02 X#define FA_INT_ZERO_NSEL 0x03 X X#define IS_FA(c) (((c) & FA_MASK) == FA_BASE) X X#define FA_IS_MODIFIED(c) ((c) & FA_MODIFY) X#define FA_IS_NUMERIC(c) ((c) & FA_NUMERIC) X#define FA_IS_PROTECTED(c) ((c) & FA_PROTECT) X X#define FA_IS_ZERO(c) \ X (((c) & FA_INTENSITY) == FA_INT_ZERO_NSEL) X#define FA_IS_HIGH(c) \ X (((c) & FA_INTENSITY) == FA_INT_HIGH_SEL) X#define FA_IS_NORMAL(c) \ X ( \ X ((c) & FA_INTENSITY) == FA_INT_NORM_NSEL \ X || \ X ((c) & FA_INTENSITY) == FA_INT_NORM_SEL \ X ) X#define FA_IS_SELECTABLE(c) \ X ( \ X ((c) & FA_INTENSITY) == FA_INT_NORM_SEL \ X || \ X ((c) & FA_INTENSITY) == FA_INT_HIGH_SEL \ X ) X X X/* WCC definitions */ X#define WCC_START_PRINTER(c) ((c) & 0x08) X#define WCC_SOUND_ALARM(c) ((c) & 0x04) X#define WCC_KEYBOARD_RESTORE(c) ((c) & 0x02) X#define WCC_RESET_MDT(c) ((c) & 0x01) X X/* AIDs */ X#define AID_NO 0x60 /* no AID generated */ X#define AID_ENTER 0x7D X#define AID_PF1 0xF1 X#define AID_PF2 0xF2 X#define AID_PF3 0xF3 X#define AID_PF4 0xF4 X#define AID_PF5 0xF5 X#define AID_PF6 0xF6 X#define AID_PF7 0xF7 X#define AID_PF8 0xF8 X#define AID_PF9 0xF9 X#define AID_PF10 0x7A X#define AID_PF11 0x7B X#define AID_PF12 0x7C X#define AID_PF13 0xC1 X#define AID_PF14 0xC2 X#define AID_PF15 0xC3 X#define AID_PF16 0xC4 X#define AID_PF17 0xC5 X#define AID_PF18 0xC6 X#define AID_PF19 0xC7 X#define AID_PF20 0xC8 X#define AID_PF21 0xC9 X#define AID_PF22 0x4A X#define AID_PF23 0x4B X#define AID_PF24 0x4C X#define AID_OICR 0xE6 X#define AID_MSR_MHS 0xE7 X#define AID_SELECT 0x7E X#define AID_PA1 0x6C X#define AID_PA2 0x6E X#define AID_PA3 0x6B X#define AID_CLEAR 0x6D X#define AID_SYSREQ 0xF0 --End_of_3270.h-- if test 4709 -ne `wc -c < '3270.h'` then echo "`basename $0`: error in" '3270.h' ": sent 4709 chars, received `wc -c < '3270.h'`" 1>&2 fi fi if test -f 'BtnEnter' then echo "`basename $0`: can't extract" 'BtnEnter' "- file exists" 1>&2 else sed 's/^X//' << '--End_of_BtnEnter--' > 'BtnEnter' X/* Format_version=1, Width=32, Height=32, Depth=1, Valid_bits_per_item=16 X */ X 0xFFFF,0xFFFF,0x8000,0x0001,0x8000,0x0001,0x8000,0x0001, X 0x8000,0x0001,0x8000,0x0001,0x8000,0x0001,0x8000,0x0001, X 0x8000,0x0001,0x8000,0x0001,0x8000,0x0001,0x8000,0x0001, X 0xBC01,0x0001,0xA0A3,0xC629,0xB8D1,0x0935,0xA091,0x0E21, X 0xA091,0x0821,0xBC90,0xC721,0x8000,0x0001,0x8000,0x0001, X 0x8000,0x0001,0x8000,0x0001,0x8000,0x0001,0x8000,0x0001, X 0x8000,0x0001,0x8000,0x0001,0x8000,0x0001,0x8000,0x0001, X 0x8000,0x0001,0x8000,0x0001,0x8000,0x0001,0xFFFF,0xFFFF --End_of_BtnEnter-- if test 541 -ne `wc -c < 'BtnEnter'` then echo "`basename $0`: error in" 'BtnEnter' ": sent 541 chars, received `wc -c < 'BtnEnter'`" 1>&2 fi fi exit 0 -- Robert Viduya robert@shangri-la.gatech.edu Office of Computing Services Georgia Institute of Technology (404) 894-6296 Atlanta, Georgia 30332-0275