[comp.sources.sun] v02i012: 3270tool, Part02/03

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