mleisher@NMSU.Edu (05/11/91)
Submitted-by: mleisher@NMSU.Edu Posting-number: Volume 12, Issue 96 Archive-name: kterm/part15 #!/bin/sh # this is kt412.15 (part 15 of kterm-4.1.2) # do not concatenate these parts, unpack them in order with /bin/sh # file kterm-4.1.2/menu.c continued # if test ! -r _shar_seq_.tmp; then echo 'Please unpack part 1 first!' exit 1 fi (read Scheck if test "$Scheck" != 15; then echo Please unpack part "$Scheck" next! exit 1 else exit 0 fi ) < _shar_seq_.tmp || exit 1 if test ! -f _shar_wnt_.tmp; then echo 'x - still skipping kterm-4.1.2/menu.c' else echo 'x - continuing file kterm-4.1.2/menu.c' sed 's/^X//' << 'SHAR_EOF' >> 'kterm-4.1.2/menu.c' && X String *params; X Cardinal *param_count; { X do_quit(w, NULL, NULL); } X void HandleScrollbar(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_scrollbar, (int) term->screen.scrollbar, X params, *param_count, w, NULL, NULL); } X void HandleJumpscroll(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_jumpscroll, (int) term->screen.jumpscroll, X params, *param_count, w, NULL, NULL); } X void HandleReverseVideo(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_reversevideo, (int) (term->flags & REVERSE_VIDEO), X params, *param_count, w, NULL, NULL); } X void HandleAutoWrap(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_autowrap, (int) (term->flags & WRAPAROUND), X params, *param_count, w, NULL, NULL); } X void HandleReverseWrap(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_reversewrap, (int) (term->flags & REVERSEWRAP), X params, *param_count, w, NULL, NULL); } X void HandleAutoLineFeed(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_autolinefeed, (int) (term->flags & LINEFEED), X params, *param_count, w, NULL, NULL); } X void HandleAppCursor(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_appcursor, (int) (term->keyboard.flags & CURSOR_APL), X params, *param_count, w, NULL, NULL); } X void HandleAppKeypad(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_appkeypad, (int) (term->keyboard.flags & KYPD_APL), X params, *param_count, w, NULL, NULL); } X void HandleScrollKey(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_scrollkey, (int) term->screen.scrollkey, X params, *param_count, w, NULL, NULL); } X void HandleScrollTtyOutput(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_scrollttyoutput, (int) term->screen.scrollttyoutput, X params, *param_count, w, NULL, NULL); } X void HandleAllow132(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_allow132, (int) term->screen.c132, X params, *param_count, w, NULL, NULL); } X void HandleCursesEmul(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_cursesemul, (int) term->screen.curses, X params, *param_count, w, NULL, NULL); } X void HandleMarginBell(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X handle_toggle (do_marginbell, (int) term->screen.marginbell, X params, *param_count, w, NULL, NULL); } X void HandleAltScreen(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X /* eventually want to see if sensitive or not */ X handle_toggle (do_altscreen, (int) term->screen.alternate, X params, *param_count, w, NULL, NULL); } X void HandleSoftReset(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X do_softreset(w, NULL, NULL); } X void HandleHardReset(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X do_hardreset(w, NULL, NULL); } X void HandleSetTerminalType(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X if (*param_count == 1) { X switch (params[0][0]) { X case 'v': case 'V': X if (term->screen.TekEmu) do_vtmode (w, NULL, NULL); X break; X case 't': case 'T': X if (!term->screen.TekEmu) do_tekmode (w, NULL, NULL); X break; X default: X Bell(); X } X } else { X Bell(); X } } X void HandleVisibility(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X if (*param_count == 2) { X switch (params[0][0]) { X case 'v': case 'V': X handle_toggle (do_vtonoff, (int) term->screen.Vshow, X params+1, (*param_count) - 1, w, NULL, NULL); X break; X case 't': case 'T': X handle_toggle (do_tekonoff, (int) term->screen.Tshow, X params+1, (*param_count) - 1, w, NULL, NULL); X break; X default: X Bell(); X } X } else { X Bell(); X } } X void HandleSetTekText(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X void (*proc)() = NULL; X X switch (*param_count) { X case 0: X proc = do_tektextlarge; X break; X case 1: X switch (params[0][0]) { X case 'l': case 'L': proc = do_tektextlarge; break; X case '2': proc = do_tektext2; break; X case '3': proc = do_tektext3; break; X case 's': case 'S': proc = do_tektextsmall; break; X } X break; X } X if (proc) (*proc) (w, NULL, NULL); X else Bell(); } X void HandleTekPage(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X do_tekpage(w, NULL, NULL); } X void HandleTekReset(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X do_tekreset(w, NULL, NULL); } X void HandleTekCopy(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X do_tekcopy(w, NULL, NULL); } X X #ifdef STATUSLINE void HandleStatusLine(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X /* eventually want to see if sensitive or not */ X handle_toggle (do_statusline, (int) term->screen.statusline, X params, *param_count, w, NULL, NULL); } X void HandleStatusReverse(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X /* eventually want to see if sensitive or not */ X handle_toggle (do_reversestatus, (int) term->screen.reversestatus, X params, *param_count, w, NULL, NULL); } #endif /* STATUSLINE */ #ifdef KTERM_KANJI void HandleSetKanjiMode(w, event, params, param_count) X Widget w; X XEvent *event; X String *params; X Cardinal *param_count; { X char lang = term->misc.lang[0]; X X if (!lang) X lang = 'j'; X X /* eventually want to see if sensitive or not */ X handle_toggle (do_reversestatus, (int) term->screen.reversestatus, X params, *param_count, w, NULL, NULL); X if (*param_count == 1) { #if defined(KTERM_HANZI) || defined(KTERM_HANGUL) X switch (params[0][0]) { X case 'j': case 'J': X do_jismode (w, NULL, NULL); X break; X case 'e': case 'E': case 'x': case 'X': case 'u': case 'U': X term->flags &= ~EUC_KANJI; X do_eucmode (w, NULL, NULL); X break; X case 'g': case 'G': X term->flags &= ~GUOBIAO_HANZI; X do_gbmode (w, NULL, NULL); X break; X case 's': case 'S': case 'm': case 'M': X switch(lang) { X case 'c': case 'C': X term->flags &= ~SGB_HANZI; X do_sgbmode (w, NULL, NULL); X break; X default: X term->flags &= ~SJIS_KANJI; X do_sjismode (w, NULL, NULL); X break; X } X break; X case 'b': case 'B': X term->flags &= ~BIG5_HANZI; X do_big5mode (w, NULL, NULL); X break; X case 'k': case 'K': X term->flags &= ~KS_HANGUL; X do_ksmode(w, NULL, NULL); X break; X case 'n': case 'N': X term->flags &= ~NBYTE_HANGUL; X do_nbmode(w, NULL, NULL); X break; #else /* !KTERM_HANZI || !KTERM_HANGUL */ X switch (params[0][0]) { X case 'j': case 'J': X do_jismode (w, NULL, NULL); X break; X case 'e': case 'E': case 'x': case 'X': case 'u': case 'U': X term->flags &= ~EUC_KANJI; X do_eucmode (w, NULL, NULL); X break; X case 's': case 'S': case 'm': case 'M': X term->flags &= ~SJIS_KANJI; X do_sjismode (w, NULL, NULL); X break; #endif /* KTERM_HANZI || KTERM_HANGUL */ X default: X Bell(); X } X } else { X Bell(); X } } #endif /* KTERM_KANJI */ SHAR_EOF echo 'File kterm-4.1.2/menu.c is complete' && chmod 0664 kterm-4.1.2/menu.c || echo 'restore of kterm-4.1.2/menu.c failed' Wc_c="`wc -c < 'kterm-4.1.2/menu.c'`" test 36692 -eq "$Wc_c" || echo 'kterm-4.1.2/menu.c: original size 36692, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= kterm-4.1.2/menu.h ============== if test -f 'kterm-4.1.2/menu.h' -a X"$1" != X"-c"; then echo 'x - skipping kterm-4.1.2/menu.h (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting kterm-4.1.2/menu.h (Text)' sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/menu.h' && /* Copyright 1989 Massachusetts Institute of Technology */ /* X * $Kagotani: /usr/src.yoshi/X/KTerm/4.1.0/RCS/menu.h,v 1.1 90/06/27 09:39:23 kagotani Rel $ X * X * $Header: /usr/local/src/X11/contrib/clients/kterm-4.1.2/RCS/menu.h,v 1.4 1991/01/30 00:10:54 mleisher Exp $ X */ X /* X * Modified for Hanzi support: X * Mark Leisher mleisher@nmsu.edu Fri Nov 9 09:22:33 1990 X */ X typedef struct _MenuEntry { X char *name; X void (*function)(); X Widget widget; } MenuEntry; X extern MenuEntry mainMenuEntries[], vtMenuEntries[], tekMenuEntries[]; extern MenuEntry fontMenuEntries[]; extern Arg menuArgs[]; X extern void HandleAllowSends(), HandleVisualBell(), X HandleLogging(), HandleRedraw(), HandleSendSignal(), X HandleQuit(), HandleScrollbar(), HandleJumpscroll(), HandleReverseVideo(), X HandleAutoWrap(), HandleReverseWrap(), HandleAutoLineFeed(), X HandleAppCursor(), HandleAppKeypad(), HandleScrollKey(), X HandleScrollTtyOutput(), HandleAllow132(), HandleCursesEmul(), X HandleMarginBell(), HandleAltScreen(), HandleSoftReset(), X HandleHardReset(), HandleSetTerminalType(), HandleVisibility(), X HandleSetTekText(), HandleTekPage(), HandleTekReset(), HandleTekCopy(); #ifdef STATUSLINE extern void HandleStatusLine(), HandleStatusReverse(); #endif /* STATUSLINE */ #ifdef KTERM_KANJI extern void HandleSetKanjiMode(); #endif /* KTERM_KANJI */ X X X /* X * The following definitions MUST match the order of entries given in X * the mainMenuEntries, vtMenuEntries, and tekMenuEntries arrays in menu.c. X */ X /* X * items in primary menu X */ #define mainMenu_securekbd 0 #define mainMenu_allowsends 1 #define mainMenu_logging 2 #define mainMenu_redraw 3 #define mainMenu_line1 4 #define mainMenu_suspend 5 #define mainMenu_continue 6 #define mainMenu_interrupt 7 #define mainMenu_hangup 8 #define mainMenu_terminate 9 #define mainMenu_kill 10 #define mainMenu_line2 11 #define mainMenu_quit 12 X X /* X * items in vt100 mode menu X */ #define vtMenu_scrollbar 0 #define vtMenu_jumpscroll 1 #define vtMenu_reversevideo 2 #define vtMenu_autowrap 3 #define vtMenu_reversewrap 4 #define vtMenu_autolinefeed 5 #define vtMenu_appcursor 6 #define vtMenu_appkeypad 7 #define vtMenu_scrollkey 8 #define vtMenu_scrollttyoutput 9 #define vtMenu_allow132 10 #define vtMenu_cursesemul 11 #define vtMenu_visualbell 12 #define vtMenu_marginbell 13 #define vtMenu_altscreen 14 #define vtMenu_line1 15 #define vtMenu_softreset 16 #define vtMenu_hardreset 17 #define vtMenu_line2 18 #define vtMenu_tekshow 19 #define vtMenu_tekmode 20 #define vtMenu_vthide 21 #if defined(STATUSLINE) || defined(KTERM_KANJI) # define vtMenu_line3 22 #endif /* STATUSLINE || KTERM_KANJI */ #ifdef STATUSLINE # define vtMenu_statusline (vtMenu_line3+1) # define vtMenu_reversestatus (vtMenu_statusline+1) #endif /* STATUSLINE */ #ifdef KTERM_KANJI # ifdef STATUSLINE # define vtMenu_eucmode (vtMenu_reversestatus+1) # define vtMenu_sjismode (vtMenu_eucmode+1) # else # define vtMenu_eucmode (vtMenu_line3+1) # define vtMenu_sjismode (vtMenu_eucmode+1) # endif #define vtMenu_jmodestart vtMenu_eucmode #define vtMenu_jmodeend vtMenu_sjismode #endif /* KTERM_KANJI */ X #ifdef KTERM_HANZI #define vtMenu_hzmodestart (vtMenu_sjismode+1) #define vtMenu_sgbmode vtMenu_hzmodestart #define vtMenu_big5mode (vtMenu_sgbmode+1) #define vtMenu_hzmodeend vtMenu_big5mode #endif /* KTERM_HANZI */ X #ifdef KTERM_HANGUL # ifdef KTERM_HANZI #define vtMenu_hgmodestart (vtMenu_big5mode+1) #define vtMenu_ksmode vtMenu_hgmodestart # else /* !KTERM_HANZI */ #define vtMenu_hgmodestart (vtMenu_sjismode+1) #define vtMenu_ksmode vtMenu_hgmodestart # endif /* KTERM_HANZI */ #define vtMenu_nbmode (vtMenu_ksmode+1) #define vtMenu_hgmodeend vtMenu_nbmode #endif /* KTERM_HANGUL */ X /* X * items in vt100 font menu X */ #define fontMenu_fontdefault 0 #define fontMenu_font1 1 #define fontMenu_font2 2 #define fontMenu_font3 3 #define fontMenu_font4 4 #define fontMenu_fontescape 5 #define fontMenu_fontsel 6 /* number of non-line items should match NMENUFONTS in ptyx.h */ X X /* X * items in tek4014 mode menu X */ #define tekMenu_tektextlarge 0 #define tekMenu_tektext2 1 #define tekMenu_tektext3 2 #define tekMenu_tektextsmall 3 #define tekMenu_line1 4 #define tekMenu_tekpage 5 #define tekMenu_tekreset 6 #define tekMenu_tekcopy 7 #define tekMenu_line2 8 #define tekMenu_vtshow 9 #define tekMenu_vtmode 10 #define tekMenu_tekhide 11 X X /* X * macros for updating menus X */ X #define update_menu_item(w,mi,val) { if (mi) { \ X menuArgs[0].value = (XtArgVal) ((val) ? term->screen.menu_item_bitmap \ X : None); \ X XtSetValues (mi, menuArgs, (Cardinal) 1); }} X X #define set_sensitivity(w,mi,val) { if (mi) { \ X menuArgs[1].value = (XtArgVal) (val); \ X XtSetValues (mi, menuArgs+1, (Cardinal) 1); }} X X X /* X * there should be one of each of the following for each checkable item X */ X X #define update_securekbd() \ X update_menu_item (term->screen.mainMenu, \ X mainMenuEntries[mainMenu_securekbd].widget, \ X term->screen.grabbedKbd) X #define update_allowsends() \ X update_menu_item (term->screen.mainMenu, \ X mainMenuEntries[mainMenu_allowsends].widget, \ X term->screen.allowSendEvents) X #define update_logging() \ X update_menu_item (term->screen.mainMenu, \ X mainMenuEntries[mainMenu_logging].widget, \ X term->screen.logging) X #define update_scrollbar() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_scrollbar].widget, \ X term->screen.scrollbar) X #define update_jumpscroll() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_jumpscroll].widget, \ X term->screen.jumpscroll) X #define update_reversevideo() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_reversevideo].widget, \ X (term->flags & REVERSE_VIDEO)) X #define update_autowrap() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_autowrap].widget, \ X (term->flags & WRAPAROUND)) X #define update_reversewrap() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_reversewrap].widget, \ X (term->flags & REVERSEWRAP)) X #define update_autolinefeed() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_autolinefeed].widget, \ X (term->flags & LINEFEED)) X #define update_appcursor() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_appcursor].widget, \ X (term->keyboard.flags & CURSOR_APL)) X #define update_appkeypad() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_appkeypad].widget, \ X (term->keyboard.flags & KYPD_APL)) X #define update_scrollkey() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_scrollkey].widget, \ X term->screen.scrollkey) X #define update_scrollttyoutput() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_scrollttyoutput].widget, \ X term->screen.scrollttyoutput) X #define update_allow132() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_allow132].widget, \ X term->screen.c132) X #define update_cursesemul() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_cursesemul].widget, \ X term->screen.curses) X #define update_visualbell() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_visualbell].widget, \ X term->screen.visualbell) X #define update_marginbell() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_marginbell].widget, \ X term->screen.marginbell) X #define update_altscreen() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_altscreen].widget, \ X term->screen.alternate) X #define update_tekshow() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_tekshow].widget, \ X term->screen.Tshow) X #define update_vttekmode() { \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_tekmode].widget, \ X term->screen.TekEmu) \ X update_menu_item (term->screen.tekMenu, \ X tekMenuEntries[tekMenu_vtmode].widget, \ X !term->screen.TekEmu) } X #define update_vtshow() \ X update_menu_item (term->screen.tekMenu, \ X tekMenuEntries[tekMenu_vtshow].widget, \ X term->screen.Vshow) #ifdef STATUSLINE #define update_statusline() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_statusline].widget, \ X term->screen.statusline) #define update_reversestatus() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_reversestatus].widget, \ X term->screen.reversestatus) #endif /* STATUSLINE */ #ifdef KTERM_KANJI #define update_eucmode() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_eucmode].widget, \ X term->flags & EUC_KANJI) X #define update_sjismode() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_sjismode].widget, \ X term->flags & SJIS_KANJI) X #endif /* KTERM_KANJI */ #ifdef KTERM_HANZI #define update_sgbmode() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_sgbmode].widget, \ X term->flags & SGB_HANZI) X #define update_big5mode() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_big5mode].widget, \ X term->flags & BIG5_HANZI) #endif /* KTERM_HANZI */ #ifdef KTERM_HANGUL #define update_ksmode() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_ksmode].widget, \ X term->flags & KS_HANGUL) X #define update_nbmode() \ X update_menu_item (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_nbmode].widget, \ X term->flags & NBYTE_HANGUL) #endif /* KTERM_HANGUL */ X X #define set_vthide_sensitivity() \ X set_sensitivity (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_vthide].widget, \ X term->screen.Tshow) X #define set_tekhide_sensitivity() \ X set_sensitivity (term->screen.tekMenu, \ X tekMenuEntries[tekMenu_tekhide].widget, \ X term->screen.Vshow) X #define set_altscreen_sensitivity(val) \ X set_sensitivity (term->screen.vtMenu,\ X vtMenuEntries[vtMenu_altscreen].widget, (val)) #ifdef STATUSLINE #define set_reversestatus_sensitivity() \ X set_sensitivity (term->screen.vtMenu, \ X vtMenuEntries[vtMenu_reversestatus].widget, \ X term->screen.statusline) #endif /* STATUSLINE */ X X /* X * macros for mapping font size to tekMenu placement X */ #define FS2MI(n) (n) /* font_size_to_menu_item */ #define MI2FS(n) (n) /* menu_item_to_font_size */ X #define set_tekfont_menu_item(n,val) \ X update_menu_item (term->screen.tekMenu, \ X tekMenuEntries[FS2MI(n)].widget, \ X (val)) X #define set_menu_font(val) \ X update_menu_item (term->screen.fontMenu, \ X fontMenuEntries[term->screen.menu_font_number].widget, \ X (val)) SHAR_EOF chmod 0664 kterm-4.1.2/menu.h || echo 'restore of kterm-4.1.2/menu.h failed' Wc_c="`wc -c < 'kterm-4.1.2/menu.h'`" test 10856 -eq "$Wc_c" || echo 'kterm-4.1.2/menu.h: original size 10856, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= kterm-4.1.2/misc.c ============== if test -f 'kterm-4.1.2/misc.c' -a X"$1" != X"-c"; then echo 'x - skipping kterm-4.1.2/misc.c (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting kterm-4.1.2/misc.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/misc.c' && /* X * $XConsortium: misc.c,v 1.65 90/03/12 10:30:17 jim Exp $ X */ X X #include <X11/copyright.h> X /* X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. X * X * All Rights Reserved X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation, and that the name of Digital Equipment X * Corporation not be used in advertising or publicity pertaining to X * distribution of the software without specific, written prior permission. X * X * X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS X * SOFTWARE. X */ X #include "ptyx.h" /* X headers included here. */ X #include <stdio.h> #include <X11/Xos.h> #include <setjmp.h> #include <ctype.h> #include <pwd.h> X #include <X11/Xatom.h> #include <X11/cursorfont.h> X #include <X11/Shell.h> #include <X11/Xmu/Error.h> #include <X11/Xmu/SysUtil.h> #include <X11/Xmu/WinUtil.h> X #include "data.h" #include "error.h" #include "menu.h" X extern char *malloc(); extern char *mktemp(); extern void exit(); extern void perror(); extern void abort(); X static void DoSpecialEnterNotify(); static void DoSpecialLeaveNotify(); X #ifndef lint static char rcs_id[] = "$XConsortium: misc.c,v 1.65 90/03/12 10:30:17 jim Exp $"; #endif /* lint */ X xevents() { X XEvent event; X register TScreen *screen = &term->screen; X X if(screen->scroll_amt) X FlushScroll(screen); X XPending (screen->display); X do { X if (waitingForTrackInfo) X return; X XNextEvent (screen->display, &event); X /* X * Hack to get around problems with the toolkit throwing away X * eventing during the exclusive grab of the menu popup. By X * looking at the event ourselves we make sure that we can X * do the right thing. X */ X if (event.type == EnterNotify && X (event.xcrossing.window == XtWindow(XtParent(term))) || X (tekWidget && X event.xcrossing.window == XtWindow(XtParent(tekWidget)))) X DoSpecialEnterNotify (&event); X else X if (event.type == LeaveNotify && X (event.xcrossing.window == XtWindow(XtParent(term))) || X (tekWidget && X event.xcrossing.window == XtWindow(XtParent(tekWidget)))) X DoSpecialLeaveNotify (&event); X X if (!event.xany.send_event || X screen->allowSendEvents || X ((event.xany.type != KeyPress) && X (event.xany.type != KeyRelease) && X (event.xany.type != ButtonPress) && X (event.xany.type != ButtonRelease))) X XtDispatchEvent(&event); X } while (QLength(screen->display) > 0); } X X Cursor make_colored_cursor (cursorindex, fg, bg) X int cursorindex; /* index into font */ X unsigned long fg, bg; /* pixel value */ { X register TScreen *screen = &term->screen; X Cursor c; X register Display *dpy = screen->display; X X c = XCreateFontCursor (dpy, cursorindex); X if (c == (Cursor) 0) return (c); X X recolor_cursor (c, fg, bg); X return (c); } X /* ARGSUSED */ void HandleKeyPressed(w, event, params, nparams) X Widget w; X XEvent *event; X String *params; X Cardinal *nparams; { X register TScreen *screen = &term->screen; X #ifdef ACTIVEWINDOWINPUTONLY X if (w == (screen->TekEmu ? (Widget)tekWidget : (Widget)term)) #endif X Input (&term->keyboard, screen, event, False); } /* ARGSUSED */ void HandleEightBitKeyPressed(w, event, params, nparams) X Widget w; X XEvent *event; X String *params; X Cardinal *nparams; { X register TScreen *screen = &term->screen; X #ifdef ACTIVEWINDOWINPUTONLY X if (w == (screen->TekEmu ? (Widget)tekWidget : (Widget)term)) #endif X Input (&term->keyboard, screen, event, True); } X /* ARGSUSED */ void HandleStringEvent(w, event, params, nparams) X Widget w; X XEvent *event; X String *params; X Cardinal *nparams; { X register TScreen *screen = &term->screen; X #ifdef ACTIVEWINDOWINPUTONLY X if (w != (screen->TekEmu ? (Widget)tekWidget : (Widget)term)) return; #endif X X if (*nparams != 1) return; X X if ((*params)[0] == '0' && (*params)[1] == 'x' && (*params)[2] != '\0') { X char c, *p, hexval[2]; X hexval[0] = hexval[1] = 0; X for (p = *params+2; (c = *p); p++) { X hexval[0] *= 16; X if (isupper(c)) c = tolower(c); X if (c >= '0' && c <= '9') X hexval[0] += c - '0'; X else if (c >= 'a' && c <= 'f') X hexval[0] += c - 'a' + 10; X else break; X } X if (c == '\0') X StringInput (screen, hexval); X } X else { X StringInput (screen, *params); X } } X static void DoSpecialEnterNotify (ev) X register XEnterWindowEvent *ev; { X register TScreen *screen = &term->screen; X #ifdef ACTIVEWINDOWINPUTONLY X if (ev->window == XtWindow(XtParent(screen->TekEmu ? X (Widget)tekWidget : (Widget)term))) #endif X if (((ev->detail) != NotifyInferior) && X ev->focus && X !(screen->select & FOCUS)) X selectwindow(screen, INWINDOW); } X /*ARGSUSED*/ void HandleEnterWindow(w, eventdata, event) Widget w; register XEnterWindowEvent *event; caddr_t eventdata; { X /* NOP since we handled it above */ } X X static void DoSpecialLeaveNotify (ev) X register XEnterWindowEvent *ev; { X register TScreen *screen = &term->screen; X #ifdef ACTIVEWINDOWINPUTONLY X if (ev->window == XtWindow(XtParent(screen->TekEmu ? X (Widget)tekWidget : (Widget)term))) #endif X if (((ev->detail) != NotifyInferior) && X ev->focus && X !(screen->select & FOCUS)) X unselectwindow(screen, INWINDOW); } X X /*ARGSUSED*/ void HandleLeaveWindow(w, eventdata, event) Widget w; register XEnterWindowEvent *event; caddr_t eventdata; { X /* NOP since we handled it above */ } X X /*ARGSUSED*/ void HandleFocusChange(w, eventdata, event) Widget w; register XFocusChangeEvent *event; caddr_t eventdata; { X register TScreen *screen = &term->screen; X X if(event->type == FocusIn) X selectwindow(screen, X (event->detail == NotifyPointer) ? INWINDOW : X FOCUS); X else { X unselectwindow(screen, X (event->detail == NotifyPointer) ? INWINDOW : X FOCUS); X if (screen->grabbedKbd && (event->mode == NotifyUngrab)) { X screen->grabbedKbd = FALSE; X ReverseVideo(term); X XBell(screen->display, 100); X } X } } X X X selectwindow(screen, flag) register TScreen *screen; register int flag; { X if(screen->TekEmu) { X if(!Ttoggled) X TCursorToggle(TOGGLE); X screen->select |= flag; X if(!Ttoggled) X TCursorToggle(TOGGLE); X return; X } else { X if(screen->cursor_state && X (screen->cursor_col != screen->cur_col || X screen->cursor_row != screen->cur_row)) X HideCursor(); X screen->select |= flag; X if(screen->cursor_state) X ShowCursor(); X return; X } } X unselectwindow(screen, flag) register TScreen *screen; register int flag; { X if (screen->always_highlight) return; X X if(screen->TekEmu) { X if(!Ttoggled) TCursorToggle(TOGGLE); X screen->select &= ~flag; X if(!Ttoggled) TCursorToggle(TOGGLE); X } else { X screen->select &= ~flag; X if(screen->cursor_state && X (screen->cursor_col != screen->cur_col || X screen->cursor_row != screen->cur_row)) X HideCursor(); X if(screen->cursor_state) X ShowCursor(); X } } X X Bell() { X extern XtermWidget term; X register TScreen *screen = &term->screen; X register Pixel xorPixel = screen->foreground ^ term->core.background_pixel; X XGCValues gcval; X GC visualGC; X X if(screen->visualbell) { X gcval.function = GXxor; X gcval.foreground = xorPixel; X visualGC = XtGetGC((Widget)term, GCFunction+GCForeground, &gcval); X if(screen->TekEmu) { X XFillRectangle( X screen->display, X TWindow(screen), X visualGC, X 0, 0, X (unsigned) TFullWidth(screen), X (unsigned) TFullHeight(screen)); X XFlush(screen->display); X XFillRectangle( X screen->display, X TWindow(screen), X visualGC, X 0, 0, X (unsigned) TFullWidth(screen), X (unsigned) TFullHeight(screen)); X } else { X XFillRectangle( X screen->display, X VWindow(screen), X visualGC, X 0, 0, X (unsigned) FullWidth(screen), X (unsigned) FullHeight(screen)); X XFlush(screen->display); X XFillRectangle( X screen->display, X VWindow(screen), X visualGC, X 0, 0, X (unsigned) FullWidth(screen), X (unsigned) FullHeight(screen)); X } X } else X XBell(screen->display, 0); } X Redraw() { X extern XtermWidget term; X register TScreen *screen = &term->screen; X XExposeEvent event; X X event.type = Expose; X event.display = screen->display; X event.x = 0; X event.y = 0; X event.count = 0; X X if(VWindow(screen)) { X event.window = VWindow(screen); X event.width = term->core.width; X event.height = term->core.height; X (*term->core.widget_class->core_class.expose)(term, &event, NULL); X if(screen->scrollbar) X (*screen->scrollWidget->core.widget_class->core_class.expose)(screen->scrollWidget, &event, NULL); X } X X if(TWindow(screen) && screen->Tshow) { X event.window = TWindow(screen); X event.width = tekWidget->core.width; X event.height = tekWidget->core.height; X TekExpose (tekWidget, &event, NULL); X } } X StartLog(screen) register TScreen *screen; { X register char *cp; X register int i; X static char *log_default; X char *malloc(), *rindex(); #ifdef ALLOWLOGFILEEXEC X void logpipe(); #ifdef SYSV X /* SYSV has another pointer which should be part of the X ** FILE structure but is actually a separate array. X */ X unsigned char *old_bufend; #endif /* SYSV */ #endif /* ALLOWLOGFILEEXEC */ X X if(screen->logging || (screen->inhibit & I_LOG)) X return; X if(screen->logfile == NULL || *screen->logfile == 0) { X if(screen->logfile) X free(screen->logfile); X if(log_default == NULL) X mktemp(log_default = log_def_name); X if((screen->logfile = malloc((unsigned)strlen(log_default) + 1)) == NULL) X return; X strcpy(screen->logfile, log_default); X } X if(*screen->logfile == '|') { /* exec command */ #ifdef ALLOWLOGFILEEXEC X /* X * Warning, enabling this "feature" allows arbitrary programs X * to be run. If ALLOWLOGFILECHANGES is enabled, this can be X * done through escape sequences.... You have been warned. X */ X int p[2]; X static char *shell; X X if(pipe(p) < 0 || (i = fork()) < 0) X return; X if(i == 0) { /* child */ X close(p[1]); X dup2(p[0], 0); X close(p[0]); X dup2(fileno(stderr), 1); X dup2(fileno(stderr), 2); #ifdef SYSV X old_bufend = _bufend(stderr); #endif /* SYSV */ X close(fileno(stderr)); X fileno(stderr) = 2; #ifdef SYSV X _bufend(stderr) = old_bufend; #endif /* SYSV */ X close(screen->display->fd); X close(screen->respond); X if(!shell) { X register struct passwd *pw; X char *getenv(), *malloc(); X struct passwd *getpwuid(); X X if(((cp = getenv("SHELL")) == NULL || *cp == 0) X && ((pw = getpwuid(screen->uid)) == NULL || X *(cp = pw->pw_shell) == 0) || X (shell = malloc((unsigned) strlen(cp) + 1)) == NULL) X shell = "/bin/sh"; X else X strcpy(shell, cp); X } X signal(SIGHUP, SIG_DFL); X signal(SIGCHLD, SIG_DFL); X setgid(screen->gid); X setuid(screen->uid); X execl(shell, shell, "-c", &screen->logfile[1], 0); X fprintf(stderr, "%s: Can't exec `%s'\n", xterm_name, X &screen->logfile[1]); X exit(ERROR_LOGEXEC); X } X close(p[0]); X screen->logfd = p[1]; X signal(SIGPIPE, logpipe); #else X Bell(); X Bell(); X return; #endif X } else { X if(access(screen->logfile, F_OK) == 0) { X if(access(screen->logfile, W_OK) < 0) X return; X } else if(cp = rindex(screen->logfile, '/')) { X *cp = 0; X i = access(screen->logfile, W_OK); X *cp = '/'; X if(i < 0) X return; X } else if(access(".", W_OK) < 0) X return; X if((screen->logfd = open(screen->logfile, O_WRONLY | O_APPEND | X O_CREAT, 0644)) < 0) X return; X chown(screen->logfile, screen->uid, screen->gid); X X } X screen->logstart = screen->TekEmu ? Tbptr : bptr; X screen->logging = TRUE; X update_logging(); } X CloseLog(screen) register TScreen *screen; { X if(!screen->logging || (screen->inhibit & I_LOG)) X return; X FlushLog(screen); X close(screen->logfd); X screen->logging = FALSE; X update_logging(); } X FlushLog(screen) register TScreen *screen; { X register Char *cp; X register int i; X X cp = screen->TekEmu ? Tbptr : bptr; X if((i = cp - screen->logstart) > 0) X write(screen->logfd, screen->logstart, i); X screen->logstart = screen->TekEmu ? Tbuffer : buffer; } X #ifdef ALLOWLOGFILEEXEC void logpipe() { X register TScreen *screen = &term->screen; X #ifdef SYSV X (void) signal(SIGPIPE, SIG_IGN); #endif /* SYSV */ X if(screen->logging) X CloseLog(screen); } #endif /* ALLOWLOGFILEEXEC */ X X do_osc(func) int (*func)(); { X register TScreen *screen = &term->screen; X register int mode, c; X register char *cp; X char buf[512]; X char *bufend = &buf[(sizeof buf) - 1]; /* leave room for null */ X extern char *malloc(); X Bool okay = True; X X /* X * lines should be of the form <ESC> ] number ; string <BEL> X * X * where number is one of 0, 1, 2, or 46 X */ X mode = 0; X while(isdigit(c = (*func)())) X mode = 10 * mode + (c - '0'); X if (c != ';') okay = False; X cp = buf; X while(isprint((c = (*func)()) & 0x7f) && cp < bufend) X *cp++ = c; X if (c != 7) okay = False; X *cp = 0; X if (okay) switch(mode) { X case 0: /* new icon name and title*/ X Changename(buf); X Changetitle(buf); X break; X X case 1: /* new icon name only */ X Changename(buf); X break; X X case 2: /* new title only */ X Changetitle(buf); X break; X X case 46: /* new log file */ #ifdef ALLOWLOGFILECHANGES X /* X * Warning, enabling this feature allows people to overwrite X * arbitrary files accessible to the person running xterm. X */ X if((cp = malloc((unsigned)strlen(buf) + 1)) == NULL) X break; X strcpy(cp, buf); X if(screen->logfile) X free(screen->logfile); X screen->logfile = cp; #else X Bell(); X Bell(); #endif X break; X X case 50: X SetVTFont (fontMenu_fontescape, True, buf, NULL); X break; X X /* X * One could write code to send back the display and host names, X * but that could potentially open a fairly nasty security hole. X */ X } } X static ChangeGroup(attribute, value) X String attribute; X XtArgVal value; { X extern Widget toplevel; X Arg args[1]; X X XtSetArg( args[0], attribute, value ); X XtSetValues( toplevel, args, 1 ); } X Changename(name) register char *name; { X ChangeGroup( XtNiconName, (XtArgVal)name ); } X Changetitle(name) register char *name; { X ChangeGroup( XtNtitle, (XtArgVal)name ); } X #ifndef DEBUG /* ARGSUSED */ #endif Panic(s, a) char *s; int a; { #ifdef DEBUG X if(debug) { X fprintf(stderr, "%s: PANIC! ", xterm_name); X fprintf(stderr, s, a); X fputs("\r\n", stderr); X fflush(stderr); X } #endif /* DEBUG */ } X char *SysErrorMsg (n) X int n; { X extern char *sys_errlist[]; X extern int sys_nerr; X X return ((n >= 0 && n < sys_nerr) ? sys_errlist[n] : "unknown error"); } X X SysError (i) int i; { X int oerrno; X X oerrno = errno; X /* perror(3) write(2)s to file descriptor 2 */ X fprintf (stderr, "%s: Error %d, errno %d: ", xterm_name, i, oerrno); X fprintf (stderr, "%s\n", SysErrorMsg (oerrno)); X Cleanup(i); } X Error (i) int i; { X fprintf (stderr, "%s: Error %d\n", xterm_name, i); X Cleanup(i); } X X /* X * cleanup by sending SIGHUP to client processes X */ Cleanup (code) int code; { X extern XtermWidget term; X register TScreen *screen; X X screen = &term->screen; X if (screen->pid > 1) { X (void) killpg (screen->pid, SIGHUP); X } X Exit (code); } X /* X * sets the value of var to be arg in the Unix 4.2 BSD environment env. X * Var should end with '=' (bindings are of the form "var=value"). X * This procedure assumes the memory for the first level of environ X * was allocated using calloc, with enough extra room at the end so not X * to have to do a realloc(). X */ Setenv (var, value) register char *var, *value; { X extern char **environ; X register int index = 0; X register int len = strlen(var); X X while (environ [index] != NULL) { X if (strncmp (environ [index], var, len) == 0) { X /* found it */ X environ[index] = (char *)malloc ((unsigned)len + strlen (value) + 1); X strcpy (environ [index], var); X strcat (environ [index], value); X return; X } X index ++; X } X #ifdef DEBUG X if (debug) fputs ("expanding env\n", stderr); #endif /* DEBUG */ X X environ [index] = (char *) malloc ((unsigned)len + strlen (value) + 1); X (void) strcpy (environ [index], var); X strcat (environ [index], value); X environ [++index] = NULL; } X /* X * returns a pointer to the first occurrence of s2 in s1, X * or NULL if there are none. X */ char *strindex (s1, s2) register char *s1, *s2; { X register char *s3; X char *index(); X int s2len = strlen (s2); X X while ((s3=index(s1, *s2)) != NULL) { X if (strncmp(s3, s2, s2len) == 0) X return (s3); X s1 = ++s3; X } X return (NULL); } X /*ARGSUSED*/ xerror(d, ev) Display *d; register XErrorEvent *ev; { X fprintf (stderr, "%s: warning, error event receieved:\n", xterm_name); X (void) XmuPrintDefaultErrorMessage (d, ev, stderr); X Exit (ERROR_XERROR); } X /*ARGSUSED*/ xioerror(dpy) Display *dpy; { X (void) fprintf (stderr, X "%s: fatal IO error %d (%s) or KillClient on X server \"%s\"\r\n", X xterm_name, errno, SysErrorMsg (errno), X DisplayString (dpy)); X X Exit(ERROR_XIOERROR); } X XXStrCmp(s1, s2) char *s1, *s2; { X if (s1 && s2) return(strcmp(s1, s2)); X if (s1 && *s1) return(1); X if (s2 && *s2) return(-1); X return(0); } X static void withdraw_window (dpy, w, scr) X Display *dpy; X Window w; X int scr; { X (void) XmuUpdateMapHints (dpy, w, NULL); X XWithdrawWindow (dpy, w, scr); X return; } X X void set_vt_visibility (on) X Boolean on; { X register TScreen *screen = &term->screen; X X if (on) { X if (!screen->Vshow && term) { X VTInit (); X XtMapWidget (term->core.parent); X screen->Vshow = TRUE; X } X } else { X if (screen->Vshow && term) { X withdraw_window (XtDisplay (term), X XtWindow(XtParent(term)), X XScreenNumberOfScreen(XtScreen(term))); X screen->Vshow = FALSE; X } X } X set_vthide_sensitivity(); X set_tekhide_sensitivity(); X update_vttekmode(); X update_tekshow(); X update_vtshow(); X return; } X void set_tek_visibility (on) X Boolean on; { X register TScreen *screen = &term->screen; X X if (on) { X if (!screen->Tshow && (tekWidget || TekInit())) { X XtRealizeWidget (tekWidget->core.parent); X XtMapWidget (tekWidget->core.parent); X screen->Tshow = TRUE; X } X } else { X if (screen->Tshow && tekWidget) { X withdraw_window (XtDisplay (tekWidget), X XtWindow(XtParent(tekWidget)), X XScreenNumberOfScreen(XtScreen(tekWidget))); X screen->Tshow = FALSE; X } X } X set_tekhide_sensitivity(); X set_vthide_sensitivity(); X update_vtshow(); X update_tekshow(); X update_vttekmode(); X return; } X void end_tek_mode () { X register TScreen *screen = &term->screen; X X if (screen->TekEmu) { X if (screen->logging) { X FlushLog (screen); X screen->logstart = buffer; X } X longjmp(Tekend, 1); X } X return; } X void end_vt_mode () { X register TScreen *screen = &term->screen; X X if (!screen->TekEmu) { X if(screen->logging) { X FlushLog(screen); X screen->logstart = Tbuffer; X } X screen->TekEmu = TRUE; X longjmp(VTend, 1); X } X return; } SHAR_EOF chmod 0664 kterm-4.1.2/misc.c || echo 'restore of kterm-4.1.2/misc.c failed' Wc_c="`wc -c < 'kterm-4.1.2/misc.c'`" test 19514 -eq "$Wc_c" || echo 'kterm-4.1.2/misc.c: original size 19514, current size' "$Wc_c" rm -f _shar_wnt_.tmp fi # ============= kterm-4.1.2/n2ks ============== if test -f 'kterm-4.1.2/n2ks' -a X"$1" != X"-c"; then echo 'x - skipping kterm-4.1.2/n2ks (File already exists)' rm -f _shar_wnt_.tmp else > _shar_wnt_.tmp echo 'x - extracting kterm-4.1.2/n2ks (Text)' sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/n2ks' && xbtoa Begin EhoC,UnVq+Uh-@"7AQkoUo@duYmPKHZ;IF(FJQ<DUpag0[s+XX=/<A6A#-\^Uq:lI]QU*aB;E7WUq^ iD^^=eO_,$lDC8AadUr7DO`DEAMBV`ZU9;KX"Urc<+b'Bf+DPYKKUs2Z1c3cn6cXN]sD5>QRUsa(Td rK6.TlP(UZO1_eYe5!PYekEqYf1X%Ygd]9YhX7qYip+@YjDd<9<e858?o"39X1X=H*O\rDR$]l9!Q? U:9htLE^I%UEal<'Ec&)5E_WgtEbr#?;JWQ*;K&i:$;tTDV,D'6W)@T?Z;PhN\5H//^/AXM^J[_1ap M$;ZHlEBZI2WrZIi&mZIr,JZK"hXZKG+PZL/&t@^>T'D6ie3CpTjWCU:$^DmR&sBsYa!C9u%iF)\J; F*4hIF&94-F(hoGF%`k5F%iq:F*Y-e$?L*lWH1\=Z?&dJZu\R@[<#fa\oV_q^iN5WbR/E-[*N<![+T #/[-M:;[.IpE[.S!L[A@GW[B9jJ:pmW@BXP6Z9=;WJ8@?EJ9XVoPH*tn.DRIasAP0A]APTYcAO<fYA R`(*ASnj:APKT$ASedD$:Sa<qaGG3VaY@/YXNN>]L?tO`C4IKa$iY0bR-d0[a%<8[a.B[[a@N=[b+# 8[b4)d[bjMJ[c[udCpr\BCUWhHDmuEPBt(*SC:CBYE4<AiFgo0oAl,tZAn\[!AkTVaAk]\fApLlEAo >*@AkKQ$$>*&BnRb+snn)@?q.=KRULn>PY$l+U[UF*a`<p$f\BeSu\C4l*\DCY:\E@9s\F3j>\F<p" \G?P@9Xt(1H+Be\DRlfV9"DK@::\)I6Fjj>@_'>_@;WQq@;NKuEGN,<EGrDOEG;uSEGE&XEH&La$?: 4"X`71K[W,ul\8b0Q_/W#W`,SJ^`c6:8bR/?-]$>:f]%_4"]&%En]&.L:]&[jJ]'=9O]($,)CV'F@D nDuGBtLZJC:glNE4`h]Fh>FdBY2:l;,"UI;0fe";/X"n;.@/i;/Nr!;/El%FDJMO$?U3uolOo[rcCr KW,udeX`SNp]QA;/`H4qhc3eZ,][Cmp]\R[#]]+$,]]aH_]^BlZ]_6G>]qc!W:;*NH6G9IB@_K-jD8 !N&Cq[_cCVA"mDnXd1<,0,*<,fP9<+ru5<(jq!<(O_"<(t"(<-c3R$<1oWV,U($XAhs/Y#Ia%Y>fAQ Z;aQ4\l<L[^'\Cd^;a]%^=Hh/^>EHs^?T6D^@#NN^S,1\^SqQN:qsPOBYV>n9>A_^8AE_d9Y]@nH,& ENDSPNFA4jW1A59o=A4")0A7E?XA8T,lA50k[A8K'*$?p:$g37JNkBCXUn97[DpNLAfqKHnpVK[1!X pTAL_6nK#_7"P\_8:Ce_8pgo_97%J_:!OF_:As;9#9G0:;Pq66G_]+@_q>RD8GXaCr,gHCVlnT=)Ys [=)#O^=),Ub=)c$q=*;C#=(oIm=%gEY$<Kd8elPP^fN2t-hH*=dj]=dckZ;61kuV`=l3^U/_X:oL_Y 7PY_k^dV_l[E`_m<il_n9K%_o)ml:rC=`BZ%u&9>f1f9Z,FkH,JHJDSt@A9#Kg!@nsr+@m\*!@q*@H @r9-X@r0)WH>CI"H>ga.$@6F)]R">2^Nsk;aa/*Jd<\X-fm7>Mg3QE1iX1!&`9;M@`9MYo`9_ef`9h kC`:\FO`;+^G`;9mf@`>0iD8iK#CrNW'CW3f.DoKS<BuS8?C;nF)G]:XRG]h!_GYlB=G\G(WGY?$CG Y#gBGYH*G$@$j8oQY8mols*JrHM)WTm/oDU3L.eWH`:"XpTDJ`j^2/`k6J1`l*%=`mAmC`n>NM`nPZ U`oIJMFiNck:r`*MBZBdi9?3`L9ZNoOH,lb)DTAaaG"Tf^G!a6XG%/M(G&>:9G&54>B5>Q6B5biC$> 4(niFcoGj(E>Olt:I]oOh"@rF]fbUM!6@XU8]3aKoMQaLGl.aM2A*aM_^`aNS9laO+WeaOU]2@`[D= D91gO9uuj;Crl?kCN?YREbfa#UN1-]YbVVHCM'fIEbe1LVK-HHYbuMW@Bc\NCN6SXEbe%HWcDlsYcA +OCK.O>Ebf3iX`A3$Yc`"^A$E.WCO!(fEbfj&Z#XVmYd+UVDfW(hEc6$'[;p1tYdSRj@Bd4]DfN"kE c6'(\T2UfYdt0^De-)aEbTQu]lIh.YeG-lB!B$jBlpSpEbT'g_/`=mYepfg:M-iLEb]X!`c>g8YfCd !A['6rC1a]lEb\=Qb&V6*YfdAoC2pK%Eb]^#c#RPuYg.9(A?aC#C3Qo/Eb]j'd;iuFYgNl!C1jd"Ec ?*(eT,V@Yh!i6@Be@(E,i,7Ec?-)flD%2YhBG)E+H3-EclE,h/[X9YhjDCF0OPBF_.f8EckuuiGs'L Yi6"1F`FYGEclK.jDoBBYiTnJA?b3:Fa1.RE_ph]l#KU4Yj)R9:iW`*E_pk^luHc[YjQOFF0P+RBP" F;EbK'hnT&;;Yjr-ABMPf'EbIqHoQ"VRYk<$MENo.WBQUKQEbK!fpi:%lYk\WH96.96E_CJXr,PGBY l/T89sFV;94>*!E_CDWU2inKZ(hYH94Y<'E_(8VVK,4>Z);V5ENuH_85ujnE_'`GWcCdRZ)e:Q9QRJ @E_L)MY&[3EZ*/1AENu`g9Q[PEE_L#KZ>t53Z*XjYH"O=hEd;Z0[W6Y8Z+"akEj</qDKE(oEc,Hn]5 he$Z+LEaDF^tFEc+UV^2e*\Z+k<s@BmUgDK2qtEc-!(_K'O)Z,6ohDKiA(E_:AW`c=[mZ,^lWB!KEt 8lW(;E_9lIb&U7!Z-3Pq6?9?VE^FiPcZ2?aZ-[MX@Bn4#6?09YE^FlQdrJo=Z.02%@V2mrEc#j%fQ( hMZ.X/7A[0s0D.^'-Ec"=Ogi@7?Z/#b-D/li;Ec#p'hf<REZ/BY=Ej=YFCiclBEbo<lj`50LZ/uC6C e_1tEbo0hk]1KZZ0?:FFKt+OCh0g:Ebos)luHocZ0_lrCN?]K;JT18n5=%CZ11_-B!Lo)CJD)*;JT^ GoMTIEZ1SH%CNQiT;JT7:pJPd;Z1q44Gd7'BDfW,[;K$W]r).HFZ2G#-DdfpM;K$Q\Ti,fNZD(68<3 i8sDe-/L;JC0WVG_,?ZDS%-C3$VZ;JK+8W`!SQZE$l<B!SL9C14EM;JL3WY#9"VZEFU5C/hLC;JKaJ Yu5O]ZEmGJF0`/NE+-&[;K-``[Sh'TZF:0=F`Xk!;KZTW\l*ZmZFa"W<3j/7Fa14*;J:*V^f"ieZG? lGBLoGG;J9[J_bt/VZG]XSEO*P]BQUQ";J9UHa&6SpZH*ANBOe?i;G2&9b>LuFZHQ3><3jbH94Y?R; Fki6cr*DFZI'"W9QRMg;G:].e5AtKZIMiHEO+.n9OtH\;JpN\g/;g0ZJ,^aDJ$30;Jnt0h,8-!ZJJJ sEO+J"DKN2B;Jp$NiDOQ;ZJl3h8nPBi;G'ooj\e]]ZK>%[EjFn,:33`*;GLi0l;CAcZKhiq:3!T+;G L2sm8?8lZL:[XB!Uo(6=I1i;F5B/nks=FZLnQ&D0*#V;Jet1pJPj?ZM7=79sXRmD+:i-;JfjJqbh9N ZMY&-D03)^;JfsMr_dTXZ_:95EjMN=CicqY;J]sOV,D,<Z_e(-CiQeZ;J^H]W)@GBZ`/"]EjMffCJq L?F),j'X`J8hZ`XXVCM'oVF)+:PY]FSSZa"Re@C*7\CN6\eF),m(Zu^"^ZaC-]CLjc[F)-!+[rZ=pZ ab'lGdFr%CM0ubF)Q**]Q8"4Zb6]eDe?>iF)PKn^N4=5ZbUX#FL/f)DcF'[F)PTq_fKO4Zc*8mBlgW #F(o6ma)bs'ZcI3%A@'C!C3$Z(F)"X[b]@N?ZcrhuC1aftF)"FUcZ<heZd<c.@C+@&C2pT.F)#g'dr T8'Zd]>'C1O[$F)#?oeoPeNZe0><F0jP@E+ZH1F)YQogN.=RZePn/E-/GBF)Y*bhK*XHZeohHEjO_G F`XnKF*2*$j)]?OZfDI7F`FbLF*1Hgk&YZUZfcCPHF)gV:iiu.F(fU#luQi]ZgA*@BP+U=F(e:SmrN /NZg`$LEO51VBQUTOF(f*jo5eSgZh+TGBP4[EF%^S\pN&u>ZhST7<3uCA9QRQ;F%g2Pr,YP?Zi(5P9 Q@E<F%g\_TlYL"[%h\fF0q`aH"OF[F*Vc4VK7$)[&47PH"=:\F)H$*WcN'![&\7cA[JO[DJ$8XF)GE nY&eK#[''gXDKN7iF)GNqZ#`N:['Og?F0rAs6>!U6F$a<B\8suV[(-Nb@WJifF(/ag]Q7Oj[(UNiEO <H$@Uuj\F)>s)_/jI7[)*/kD.^/mF)=FS`,fci[)I*'@C4$qD/lr'F)?$+aE)3/[)iYrD0NA0F)?*- bB$C![*<YdB!fj)CiZo0F)5p)d;s,9[*f;&Ce_:cF)59le8oGG[+056FL9V?Ch0p)F)6$,fO\i=[+Y juCJqOoASZ@oggt84[,#;/B!gE+CIbbhASY#Ii+6[i[,D@'CIY\jASY_]j(3"G[,be6FL:.@CK.\'A SYh`k@JFQ[-.j.CLaa9ASYqcl=FmS[-V@BF0t=GDe?BEAT)"amq$EW[."E6DfiAVAT(PTnmu`M[.@j DEjYOOC/VG5ASQ:npgn2O[.t&?C1ajLASOrHqdjM.[/=KM@C5uEC2pW[ASQ=pTk.tL[A"">C1FZHAS QCrUh+Lc[AIMSF1%oWE+ZMVAT2(cWF^$g[AjRFE-/LgAT1VVXCZ?][B4"_F1&2_F_8%cAT^t[Z"8&g [B^-N:ij%OAS?+l[Uj,n[C9^\A[T$ZBP+Z_AS=fG\n,PM[CZcWBOS<]AS?(k]k(l![D$3cA@90`BOe HcAS?=r_.?8\[DN>_94kTMAOoe.`aqhb[E)oQB!o`l9OY?OAP@*Ob@O@h[EJthDK</2ASuRsct.*,[ F&Q'@C=NpDK3)5ASuUte7EN.[FGUq8lW4MAPQdDfk!Kk[G,7ZB!pE*6?0EhAO:LHhIT#a[GM=&@WSs 9AR]8ZialS-[Gth-A@:K0D0!&HASlLrk@JLA[HIs/D.^3?ASk/Ll=Fg@[HhC@EOG.ED032QASktcmU ^3T[IFT8Cid#TASbqco4;`M[Ie$H@C>c>CiQlVAScIrpLS/?[J1)?Ch0sLAScRuqF,1?[JWI/F1(s8 CM(!R7;H>?Tg`a:[\=*tCNR"[7;Gl2Ud]'0[\ZE.B==[+DfW:b7;m7UWC:`;[]0['Ddg)T7;m1SX@7 &L[]Mu:<48quDe-;[7;?kOYsiDK[^$6/C1ao\7;>Q*Zpe^q[^AP=@CEU5C2p\k7;?qQ\4(.3[^c`6C 1Oca7;?JD]1$[Z[_5+KF1/eOE+ZPn7;u\D^dW3^[_W;>E-/P*7;u57_aSNT[_tUW<49e8BQCQ&7;-b Na[KlT[`SqGBOnQp78%7$bsb<I[a7H\EjjCbDKE887;c_Ge4"7E[ab^RDIL!)7;cYEf0r#I[b=/:B" $G_6=I=X77)"&h*jY@[b_?[D0!)C7;[+SiC.Tp[c0_mB"$_gD.0m67;[%Qj[F$.[cRoc9lmc,787C& ks\<T[d$:UEOP1%Cid&P7;QSEmR:r#[dOPlCiQoQ7;R(SnO78)[dn$GEjkUPCNHrWAnu"ep1A)K[eC ,@CN6fXAnuLsq.=DA[eaTOA@DAICNm5bAnuRurFThX[f-VGDfW=]AoDb"ULnFV\"mVS@CN(FDfN7`A oDe#Ve0jH\#9XGDe->VAnc:pX(H'e\#a1UFLSAaBk4]UAnl@qY\%Wk\$69PC1ar\Ankb`ZY!rl\$Ta ^FLSYiC/h[NAnkkc[q9Af\$ucWE,rG!AoMh#]4Q"o\%H<l@CNp^E,iA$AoMk$^LhFq\%i>_F`Ot.Ap &1(_e+%'\&;m$@CO3fF`Fn1Ap&4)a(BHn\&\ngF_%u'Al*QXb@XRj\'/G\FLTM,BQCT.AnZ7pct6s' \'YOpBOSBuAnZ1ndq398\(##'A@L*$967SoAkQ[DfOdZR\(M+#9QR\tAkZgGgh'5g\(tXiEOXe:9Q[ c$AkZaEi+@7U\)Ia,H"OPGApJC*jCW[Z\)h4IA@L]5DK<5MAo;\!l"4gF\*=<4DIL$?Ao;Utlt1-W\ *[dFA@Lu=8lW:hAjUOIo4C=1\+C#>6>!_"AjTq8p1?X5\+aK$A@M>G@WJsSAn#hjqds;L\,6SF@UZb EAn#bhraoV]\=mMDA@S@GD0!.^Ao2V!V.ORV\>BUFD.0rPAo2OtW+Kmg\>a(WA@SXOD0NLjAo2e&XC c<m\?-*MCi[%hAo)OuY\%]`\?TX^@CWUTCiQtkAo)S!Zt=,b\?uZPCN?qo@;Bqo\7'/D\@H$`A[o<[ CM()g@;ABC]O>SM\@i5XCLO`e@;Bkm^L:o"\A2NgA@THaCNm;*@;C+t_dR=n\AS__DfWA-@;g4sa'i mu\B&)s@CXEfDfN;0@;g7tb@,<g\BG:gDe-B&@;gA"c=(F-\BnYuB"65sBk4a%@;9hme7!*5\CCppC 1b!,@;8NHf3rE&\Cb5)EOa\1C36u>@;9>_gL4i@\D.F"C1k'4@;p7shdLJF\DUe7B"6f.E+-99@;p4 rj'cnK\E"!*E)a@/@;obek$`CQ\EI@DF1CICF_8/K@<H\%lX=p8\EjQ2F_&#L@<H(imU9dL\FF!@;n 2C,BQL]T@;'8_oO2E-\Fg2;BOSFE@;'YjpL.`W\G0KGA@VGD967W?@7sS0r*`6/\GZbC9QRb<@8(:D U1$`8\YES,FLe2U9Ot]1@<lq)VdXj_\YojDH#^Bo@<lt*WaTdc\ZB4W;Rro<DKE@k@;]YeY@2<\\Zc ELDF_7B@;\fMZ=.WZ\[,^^EOiGbDKNFs@;]Vd[UF&u\[MoSDJ-Mi@7kUO\m\3C\[u9BEOi_j8p%VW@ 7#%G^gTQA\\SV]@WT)t@:EiZ`*m+`\]%udFLfD"D0*8/@;TVea^K$p\]P7fD03>3@;Ktpc!bF0\^"W "A\$,qChC6)@;JZKd:$j"\^CgnCiR#7@;L%re7!/m\^b,)A@^9"Ch($-@;L2!fPt\I\_7C1CJq^tEG JL`gi7+N\_V7@A\$Z;CM(-7EGJ(Ti,NO,\`!m8CI,MjEGK!nj)JjS\`@aGFLgLQCLk!<EGKg0kAbE\ \`jH@Df`JSEGoI"lZ$iO\a4<SEOkIVDfiPXEGngemr<8V\aTrGDg8h_EG9I(o5SJc\b'lUEOka^C3$ lZEGBR*pi1%[\bQSPC1b$QEGA4Yqf-@Z\bpG^EOl$fC37#cEGB$qTlFgk\tTOOE,rOcEH$!1V/^Hc\ u'IdB"Fm[E+->VEH#p/WGum!\uH*WE)aELEH#I"XDrB'\up$qF1SPpF_84hEHQ94Z#Oo.]!;Z_F]>r YEHPg'ZuL55]!ZNSF1Si#BQC\pEG/7]\oDD)]"8;hBP+igEG/dl]l@_*]"W/tFLo5,BOn]iED(Aa_J r4J]#+kp86!1>ED1Daa)Odo]#\kbB"H*(9OYNTED1A`bAhfK]$1S%DK<>7EGfj/cuEr7]$YM8B"HE1 DF_:eEGeL^e8]A7]%%.-DK38=EGfm0f5Y\=]%D"?Ge2RJDK`VFECsiSgi5qc]%m^56?9ZqEC+`XiGh 1r]&I]rA@gf@@WT-BEFNOkk&Fj=]&sE?@W]3FEFNIil#CQ\]'F?QF1U^XD.^BHEG]-qmW!)`]'fuGD 03AYEGT[,no8Je](9oXB"IVSCe_M6EGT'pp2Ong](ZPOCim8`EGT0sq/L4p])$D_A%MP7CN@#b;/:6 ar_[HC]:fR/CJDF8;/9UPUJYfH];/;>FM"AHCK.pC;/9^SVbq5B];Q'6DfWIi;/^NfX&3eI]<"kJ@C rX=DfNCl;/^QgY>K4;]<DW>De-Jb;/('_ZVbFF]<kFMEkAbWC3."r;/0[S\5@!Q]=A8GC14`c;/13b ]2<<B]=_!UA@oNPE+HSq;0?ok_,5>`]>=nPF`G%2;0?um`)1YV]>[WiA@oiYBQC`+;.t$_a\c_`]?1 SHAR_EOF true || echo 'restore of kterm-4.1.2/n2ks failed' fi echo 'End of kterm-4.1.2 part 15' echo 'File kterm-4.1.2/n2ks is continued in part 16' echo 16 > _shar_seq_.tmp exit 0 ----------------------------------------------------------------------------- mleisher@nmsu.edu "I laughed. Mark Leisher I cried. Computing Research Lab I fell down. New Mexico State University It changed my life." Las Cruces, NM - Rich [Cowboy Feng's Space Bar and Grille] -- Dan Heller O'Reilly && Associates Z-Code Software Comp-sources-x: Senior Writer President comp-sources.x@uunet.uu.net argv@ora.com argv@zipcode.com