richb@Aus.Sun.COM (Rich Burridge) (01/16/90)
Posting-number: Volume 10, Issue 9 Submitted-by: richb@Aus.Sun.COM (Rich Burridge) Archive-name: calctool24/part04 ---- Cut Here and unpack ---- #!/bin/sh # this is part 4 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file news.c continued # CurArch=4 if test ! -r s2_seq_.tmp then echo "Please unpack part 1 first!" exit 1; fi ( read Scheck if test "$Scheck" != $CurArch then echo "Please unpack part $Scheck next!" exit 1; else exit 0; fi ) < s2_seq_.tmp || exit 1 echo "x - Continuing file news.c" sed 's/^X//' << 'SHAR_EOF' >> news.c X for (i = 0; i < MAXREGS; i++) X { X switch (mtype) X { X case M_ACC : /* Accuracies. */ X case M_EXCH : /* Register exchange. */ X case M_LSHIFT : /* Left shift. */ X case M_RCL : /* Register recall. */ X case M_RSHIFT : /* Right shift. */ X case M_STO : /* Register store. */ X FPRINTF(PostScript, "(%s)", num_names[i]) ; X break ; X case M_CON : /* Constants. */ X FPRINTF(PostScript, "(%s)", con_names[i]) ; X break ; X case M_FUN : /* Functions. */ X FPRINTF(PostScript, "(%s)", fun_names[i]) ; X break ; X } X FPRINTF(PostScript, " { %1d typedprint }\n", (int) mtype) ; X } X FPRINTF(PostScript, "] /new DefaultMenu send def\n") ; X FFLUSH(PostScript) ; X} X X Xdestroy_frame() X{ X exit(0) ; X} X X Xdo_menu(mtype) /* Popup appropriate menu and get value. */ Xenum menu_type mtype ; X{ X int mval ; X X FPRINTF(PostScript, "{ /ParentMenu Menu%1d def } ClientMenu send\n", X (int) mtype) ; X FFLUSH(PostScript) ; X pscanf(PostScriptInput, "%d", &mval) ; X return(mval) ; X} X X Xdrawline(x1, y1, x2, y2) Xint x1, y1, x2, y2 ; X{ X FPRINTF(PostScript, "%d %d %d %d PSDrawLine\n", x1, x2, y1, y2) ; X FFLUSH(PostScript) ; X} X X Xdraw_regs() X{ X FPRINTF(PostScript, "PSDrawRegs\n") ; X FFLUSH(PostScript) ; X} X X Xdrawtext(x, y, window, fontno, color, str) Xenum can_type window ; Xenum font_type fontno ; Xint x, y, color ; Xchar *str ; X{ X int i ; X char font, fonttype[6], line[MAXLINE] ; X X if (fontno == SFONT) STRCPY(fonttype, "SFont") ; X else if (fontno == NFONT) STRCPY(fonttype, "NFont") ; X else if (fontno == BFONT) STRCPY(fonttype, "BFont") ; X if (window == KEYCANVAS) font = 'K' ; X else if (window == REGCANVAS) font = 'R' ; X line[0] = '\0' ; X for (i = 0; i < strlen(str); i++) X switch (str[i]) X { X case '\\' : STRCAT(line,"\\\\") ; X break ; X case '(' : STRCAT(line,"\\(") ; X break ; X case ')' : STRCAT(line,"\\)") ; X break ; X default : STRNCAT(line, &str[i], 1) ; X } X FPRINTF(PostScript, "(%s) %d %cCHeight %d ", line, x, font, y) ; X FPRINTF(PostScript, "%s %d %cC PSMakeText\n", fonttype, color, font) ; X FFLUSH(PostScript) ; X} X X Xget_display() /* GET function key was pressed. */ X{ X} X X Xget_next_event() X{ X int type ; X X FFLUSH(PostScript) ; X if (pscanf(PostScriptInput, "%d", &type) == EOF) destroy_frame() ; X switch (type) X { X case KEYBOARD : pscanf(PostScriptInput, "%d", &cur_ch) ; X case LEFT_DOWN : X case MIDDLE_DOWN : X case LEFT_UP : X case MIDDLE_UP : pscanf(PostScriptInput, "%d%d", &curx, &cury) ; X } X return(type) ; X} X X Xhandle_selection() /* Handle the GET function key being pressed. */ X{ X} X X Xinit_fonts() X{ X FPRINTF(PostScript, "PSInitFonts\n") ; X FFLUSH(PostScript) ; X nfont_width = 9 ; X} X X Xinit_ws_type() X{ X gtype = NEWS ; X if (ps_open_PostScript() < 0) return -1 ; X if (send_ps_file(NEWSFILE) == -1) X { X FCLOSE(PostScript) ; X return(-1) ; X } X FFLUSH(PostScript) ; X if (ferror(PostScript)) X { X FCLOSE(PostScript) ; X return(-1) ; X } X FPRINTF(PostScript, "PSIsColor\n") ; X FFLUSH(PostScript) ; X pscanf(PostScriptInput, "%d", &iscolor) ; X FPRINTF(PostScript, "PSInitialise\n") ; X FFLUSH(PostScript) ; X return(0) ; X} X X Xload_colors() /* Create and load calctool color map. */ X{ X u_char red[CALC_COLORSIZE], green[CALC_COLORSIZE], blue[CALC_COLORSIZE] ; X int i ; X X calc_colorsetup(red, green, blue) ; X FPRINTF(PostScript, "%d PSMakeColorTable\n", CALC_COLORSIZE) ; X for (i = 0; i < CALC_COLORSIZE; i++) X FPRINTF(PostScript, "%d %d %d %d PSLoadColor\n", X i, blue[i], green[i], red[i]) ; X FFLUSH(PostScript) ; X} X X X/*ARGSUSED*/ Xmake_frames(argc, argv) Xint argc ; Xchar *argv[] ; X{ X FPRINTF(PostScript, "%d %d %d %d %d %d %d PSMakeFrames\n", X wx, wy, TWIDTH, DISPLAY+THEIGHT, X ix, iy, iconic) ; X FFLUSH(PostScript) ; X} X X Xmake_icon() X{ X int depth, i, j, k, n ; X char line[MAXLINE], name[MAXLINE], v[16][5] ; X FILE *fin ; X X if (iscolor) STRCPY(name, "calctool.color.icon") ; X else STRCPY(name, "calctool.icon") ; X if ((fin = fopen(name, "r")) == NULL) X { X FPRINTF(stderr, "%s: can't open %s.\n", progname, name) ; X exit(1) ; X } X depth = (iscolor) ? 8 : 1 ; X FPRINTF(PostScript, "/calctoolIcon %d %d %1d { } { <\n", X ICONWIDTH, ICONHEIGHT, depth) ; X FGETS(line, MAXLINE, fin) ; X FGETS(line, MAXLINE, fin) ; X if (iscolor) X { X for (i = 0; i < 64; i++) X for (j = 0; j < 4; j++) X { X FGETS(line, MAXLINE, fin) ; X for (k = 0; k < 16; k++) X { X if (!(k % 2)) STRNCPY(v[k], &line[(k/2)*7+3], 2) ; X else STRNCPY(v[k], &line[(k/2)*7+5], 2) ; X v[k][2] = '\0' ; X } X if (j == 0 || j == 1) n = 16 ; X else if (j == 2) n = 10 ; X if (j != 3) X { X for (k = 0; k < n; k++) X FPRINTF(PostScript, "%.2s ", v[k]) ; X FPRINTF(PostScript, "\n") ; X } X } X } X else X { X for (i = 0; i < 32; i++) X { X FGETS(line, MAXLINE, fin) ; X for (j = 0; j < 8; j++) X { X STRNCPY(v[j], &line[j*7+3], 4) ; X v[j][4] = '\0' ; X } X FPRINTF(PostScript, "%.4s %.4s %.4s %.4s %.4s %.4s\n", X v[0], v[1], v[2], v[4], v[5], v[6]) ; X } X } X FPRINTF(PostScript, "> } buildimage def\n") ; X FFLUSH(PostScript) ; X FCLOSE(fin) ; X} X X Xmake_items() /* Null routine. */ X{} X X Xmake_subframes() /* Null routine. */ X{} X X Xsend_ps_file(fname) Xchar *fname ; X{ X FILE *stream ; X int c ; X X if ((stream = fopen(fname,"r")) == NULL) return -1 ; X while ((c = getc(stream)) != EOF) PUTC(c, PostScript) ; X FCLOSE(stream) ; X return 0 ; X} X X Xset_cursor(type) Xint type ; X{ X FPRINTF(PostScript, "%d PSSetCursor\n", type) ; X FFLUSH(PostScript) ; X} X X Xstart_tool() X{ X while (1) X process_event(get_next_event()) ; X} X X Xtoggle_reg_canvas() X X{ X rstate = !rstate ; X FPRINTF(PostScript, "%d PSToggleRegCanvas\n", rstate) ; X FFLUSH(PostScript) ; X} SHAR_EOF echo "File news.c is complete" chmod 0444 news.c || echo "restore of news.c fails" set `wc -c news.c`;Sum=$1 if test "$Sum" != "8102" then echo original size 8102, current size $Sum;fi echo "x - extracting sunview.c (Text)" sed 's/^X//' << 'SHAR_EOF' > sunview.c && X X/* @(#)sunview.c 1.13 89/12/21 X * X * These are the SunView dependent graphics routines used by calctool. X * X * Copyright (c) Rich Burridge. X * Sun Microsystems, Australia - All rights reserved. X * X * Permission is given to distribute these sources, as long as the X * copyright messages are not removed, and no monies are exchanged. X * X * No responsibility is taken for any errors or inaccuracies inherent X * either to the comments or the code of this program, but if X * reported to me then an attempt will be made to fix them. X */ X X#include "calctool.h" X#include "color.h" X#include "extern.h" X#include <suntool/sunview.h> X#include <suntool/canvas.h> X#include <suntool/selection_svc.h> X#include <suntool/selection_attributes.h> X X#define ICON_SET (void) icon_set X#define MENU_SET (void) menu_set X#define NOTIFY_INTERPOSE_DESTROY_FUNC (void) notify_interpose_destroy_func X#define PW_SETCMSNAME (void) pw_setcmsname X#define PW_PUTCOLORMAP (void) pw_putcolormap X#define PW_TTEXT (void) pw_ttext X#define PW_VECTOR (void) pw_vector X#define PW_WRITEBACKGROUND (void) pw_writebackground X#define SELN_QUERY (void) seln_query X#define WINDOW_DONE (void) window_done X#define WINDOW_SET (void) window_set X X#define SMALLFONT "/usr/lib/fonts/fixedwidthfonts/screen.r.7" X#define NORMALFONT "/usr/lib/fonts/fixedwidthfonts/screen.b.14" X#define BIGFONT "/usr/lib/fonts/fixedwidthfonts/gallant.r.19" X Xvoid func_key_proc() ; X XCanvas kcanvas, rcanvas ; XCursor help_cursor, main_cursor ; XEvent *cur_event ; XFrame frame, rframe ; XIcon calctool_icon ; XMenu menus[MAXMENUS] ; XNotify_value destroy_proc() ; XPixfont *font, *sfont, *nfont, *bfont ; XPixwin *pw, *cpw, *rcpw ; XSeln_client sel_client ; XSeln_holder holder ; XSeln_rank rank = SELN_PRIMARY ; XSeln_result get_proc(), reply_proc() ; X Xshort help_cursor_array[16] = { X#include "help.cursor" X} ; Xmpr_static(help_cursor_pr, 16, 16, 1, help_cursor_array) ; X Xunsigned short icon_image[] = { X#include "calctool.icon" X} ; Xmpr_static(icon_pr, 64, 64, 1, icon_image) ; X Xshort cicon_image[] = { X#include "calctool.color.icon" X} ; Xmpr_static(cicon_pr, 64, 64, 8, cicon_image) ; X X X/*ARGSUSED*/ Xvoid Xcanvas_proc(canvas, event, arg) XCanvas canvas ; XEvent *event ; Xcaddr_t arg ; X{ X cur_event = event ; X process_event(get_next_event(event)) ; X} X X Xclear_canvas(window, color) Xenum can_type window ; Xint color ; X{ X int height, width ; X Canvas ctype ; X X if (window == KEYCANVAS) X { X pw = cpw ; X ctype = frame ; X } X else if (window == REGCANVAS) X { X pw = rcpw ; X ctype = rframe ; X } X height = (int) window_get(ctype, WIN_HEIGHT) ; X width = (int) window_get(ctype, WIN_WIDTH) ; X PW_WRITEBACKGROUND(pw, 0, 0, width, height, PIX_SRC | PIX_COLOR(color)) ; X} X X Xclose_frame() X{ X if ((int) window_get(rframe, WIN_SHOW) == TRUE) X WINDOW_SET(rframe, WIN_SHOW, FALSE, 0) ; X WINDOW_SET(frame, FRAME_CLOSED, TRUE, 0) ; X rstate = 0 ; X} X X Xcolor_area(x, y, width, height, color) Xint x, y, width, height, color ; X{ X PW_WRITEBACKGROUND(cpw, x, y, width, height, PIX_SRC | PIX_COLOR(color)) ; X} X X Xcreate_menu(mtype) /* Create popup menu for right button press. */ Xenum menu_type mtype ; X{ X int i ; X X menus[(int) mtype] = menu_create(MENU_FONT, nfont, 0) ; X for (i = 0; i < MAXREGS; i++) X { X switch (mtype) X { X case M_ACC : /* Accuracies. */ X case M_EXCH : /* Register exchange. */ X case M_LSHIFT : /* Left shift. */ X case M_RCL : /* Register recall. */ X case M_RSHIFT : /* Right shift. */ X case M_STO : MENU_SET(menus[(int) mtype], /* Register store. */ X MENU_STRING_ITEM, num_names[i], i+1, 0) ; X break ; X case M_CON : if (strlen(con_names[i])) /* Constants. */ X MENU_SET(menus[(int) mtype], X MENU_STRING_ITEM, con_names[i], i+1, 0) ; X break ; X case M_FUN : if (strlen(fun_names[i])) /* Functions. */ X MENU_SET(menus[(int) mtype], X MENU_STRING_ITEM, fun_names[i], i+1, 0) ; X } X } X} X X Xdestroy_frame() X{ X WINDOW_DONE(frame) ; X exit(0) ; X} X X Xdestroy_rframe(frame) XFrame frame ; X{ X rstate = 0 ; X WINDOW_SET(frame, WIN_SHOW, FALSE, 0) ; X} X X X/*ARGSUSED*/ XNotify_value Xdestroy_proc(client, status) XNotify_client client ; XDestroy_status status ; X{ X exit(0) ; X} X X Xdo_menu(mtype) /* Popup appropriate menu and get value. */ Xenum menu_type mtype ; X{ X return ((int) menu_show(menus[(int) mtype], kcanvas, X canvas_window_event(kcanvas, cur_event), 0)) ; X} X X Xdrawline(x1, y1, x2, y2) Xint x1, y1, x2, y2 ; X{ X PW_VECTOR(cpw, x1, y1, x2, y2, PIX_SET, 0) ; X} X X Xdraw_regs() X{ X make_registers() ; X WINDOW_SET(rframe, WIN_SHOW, TRUE, 0) ; X} X X Xdrawtext(x, y, window, fontno, color, str) Xenum font_type fontno ; Xenum can_type window ; Xint x, y, color ; Xchar *str ; X{ X if (fontno == SFONT) font = sfont ; X else if (fontno == NFONT) font = nfont ; X else if (fontno == BFONT) font = bfont ; X if (window == KEYCANVAS) pw = cpw ; X else if (window == REGCANVAS) pw = rcpw ; X PW_TTEXT(pw, x, y, PIX_SRC | PIX_COLOR(color), font, str) ; X} X X X/*ARGSUSED*/ Xvoid Xfunc_key_proc(client_data, args) Xchar *client_data ; XSeln_function_buffer *args ; X{ X get_display() ; X} X X Xget_display() /* The GET function key has been pressed. */ X{ X if (seln_acquire(sel_client, SELN_SHELF) == SELN_SHELF) X { X if (shelf != NULL) free(shelf) ; X shelf = malloc((unsigned) strlen(display)) ; X STRCPY(shelf, display) ; /* Safely keep copy of display. */ X } X} X X XPixfont * Xget_font(name) Xchar *name ; X{ X Pixfont *font ; X X font = pf_open(name) ; X if (font == NULL) font = pf_default() ; X if (font == NULL) X { X perror("couldn't get the default font.") ; X exit(1) ; X } X return font ; X} X X Xget_next_event(event) XEvent *event ; X{ X static char eb[4] ; /* Event buffer. */ X int i ; X X#ifdef SUN4_KEYBOARD X char *rpad = "\000\000\000=/*789456123" ; X char *akeys = "8264" ; X char *sun4keys = "\000\000\000+-\000\0000\000." ; X#else X char *rpad = "\000\000\00078945612301=" ; X char *akeys = "5.31" ; X#endif /*SUN4_KEYBOARD*/ X X nextc = event_id(event) ; X curx = event_x(event) ; X cury = event_y(event) ; X X if (event_is_button(event)) X if (event_is_down(event) && nextc == MS_LEFT) return(LEFT_DOWN) ; X else if (event_is_down(event) && nextc == MS_MIDDLE) return(MIDDLE_DOWN) ; X else if (event_is_down(event) && nextc == MS_RIGHT) return(RIGHT_DOWN) ; X else if (event_is_up(event) && nextc == MS_LEFT) return(LEFT_UP) ; X else if (event_is_up(event) && nextc == MS_MIDDLE) return(MIDDLE_UP) ; X else if (event_is_up(event) && nextc == MS_RIGHT) return(RIGHT_UP) ; X X/* The following code attempts to handle a numeric keypad using the right X * function keys. This pad differs on the Sun3 and Sun4 keyboards. There X * is a compile-time define which determines which keyboard setup is X * looked for. X */ X X if (event_is_ascii(event)) X { X X/* If the last two events were escape and left square bracket.. */ X X if (eb[0] && eb[1]) X { X switch (nextc) X { X X/* Interpret the arrow keys (if they are set). X * R8 = ^[A R14 = ^[B R12 = ^[C R10 = ^[B X */ X X case 'A' : X case 'B' : X case 'C' : X case 'D' : cur_ch = akeys[nextc - 'A'] ; X eb[0] = eb[1] = '\0' ; X return(KEYBOARD) ; X X/* Interpret the extra keys found on Sun4 keyboards. X * These have codes of the form: ^[<int>z where <int> is a number X * between 247 and 255. We're only interested in 4 of these keys. X * These are: X * ^[253z = + ^[254z = - ^[257z = 0 ^[259z = . X */ X#ifdef SUN4_KEYBOARD X case '2' : eb[2] = '2' ; X break ; X X case '5' : if (eb[0] && eb[1] && eb[2]) X { X eb[3] = '5' ; X break ; X } X else X X/* Clear event_buf and treat as normal ascii char. */ X X { X eb[0] = eb[1] = '\0' ; X cur_ch = nextc ; X return(KEYBOARD) ; X } X X case '3' : X case '4' : X case '7' : X case '9' : if (eb[0] && eb[1] && eb[2] && eb[3]) X { X cur_ch = sun4keys[nextc - '0'] ; X eb[0] = eb[1] = eb[2] = eb[3] = '\0' ; X return(KEYBOARD) ; X } X else if (eb[0] && eb[1] && eb[2] && nextc == '4') X { X eb[3] = nextc ; X break ; X } X else X X/* Clear event_buf and treat as normal ascii char. */ X X { X eb[0] = eb[1] = '\0' ; X cur_ch = nextc ; X return(KEYBOARD) ; X } X#endif /*SUN4_KEYBOARD*/ X X default : eb[0] = eb[1] = eb[2] = eb[3] = '\0' ; X } X } X X/* If previous events are ^[[ : set buffer */ X X else if (nextc == '[' && eb[0]) /* Check for left square bracket. */ X eb[1] = '[' ; X else if (nextc == '\033') /* Check for escape char. */ X eb[0] = '\033' ; X else X { X X/* All the rest of the ASCII characters. */ X X eb[0] = eb[1] = '\0' ; X cur_ch = nextc ; X return(KEYBOARD) ; X } X } X X if (event_is_key_right(event) && event_is_up(event)) X { X for (i = 1; i < 16; i++) X if (nextc == KEY_RIGHT(i)) X { X cur_ch = rpad[i-1] ; X return(KEYBOARD) ; X } X } X if (nextc == KBD_DONE && down) return(EXIT_WINDOW) ; X if (nextc == LOC_WINEXIT || nextc == LOC_RGNEXIT) return(EXIT_WINDOW) ; X if (nextc == LOC_WINENTER || nextc == LOC_RGNENTER) return(ENTER_WINDOW) ; X if (nextc == WIN_REPAINT) return(CFRAME_REPAINT) ; X if ((nextc == KEY_LEFT(6)) & event_is_up(event)) return(PUT_ON_SHELF) ; X if ((nextc == KEY_LEFT(8)) && event_is_up(event)) return(TAKE_FROM_SHELF) ; X return(LASTEVENTPLUSONE) ; X} X X XSeln_result Xget_proc(buffer) XSeln_request *buffer ; X{ X issel = 0 ; X if (*buffer->requester.context == 0) X { X if (buffer == (Seln_request *) NULL || X *((Seln_attribute *) buffer->data) != SELN_REQ_CONTENTS_ASCII) X return ; X selection = buffer->data + sizeof(Seln_attribute) ; X *buffer->requester.context = 1 ; X } X else selection = buffer->data ; X issel = 1 ; X} X X Xhandle_selection() /* Handle the GET function key being pressed. */ X{ X char context = 0 ; X X holder = seln_inquire(rank) ; X if (holder.state == SELN_NONE) return ; X SELN_QUERY(&holder, get_proc, &context, SELN_REQ_CONTENTS_ASCII, 0, 0) ; X} X X Xinit_fonts() X{ X bfont = get_font(BIGFONT) ; X nfont = get_font(NORMALFONT) ; X nfont_width = nfont->pf_defaultsize.x ; X sfont = get_font(SMALLFONT) ; X} X X Xinit_ws_type() X{ X if (getenv("WINDOW_PARENT") == NULL) X { X FPRINTF(stderr,"%s: Not a native SunView window\n", progname) ; X return -1 ; X } X gtype = SVIEW ; X return 0 ; X} X X Xload_colors() /* Create and load calctool color map. */ X{ X Pixwin *frame_pw ; X char colorname[CMS_NAMESIZE] ; X u_char red[CALC_COLORSIZE], green[CALC_COLORSIZE], blue[CALC_COLORSIZE] ; X X iscolor = (cpw->pw_pixrect->pr_depth == 8) ? 1 : 0 ; X SPRINTF(colorname, "%s%D", CALC_COLOR, getpid()) ; X PW_SETCMSNAME(cpw, colorname) ; X X calc_colorsetup(red, green, blue) ; X PW_PUTCOLORMAP(cpw, 0, CALC_COLORSIZE, red, green, blue) ; X if (inv_video) pw_reversevideo(cpw, 0, CALC_COLORSIZE) ; X X if (iscolor) X { X frame_pw = (Pixwin *) window_get(frame, WIN_PIXWIN, 0) ; X PW_SETCMSNAME(frame_pw, colorname) ; X PW_PUTCOLORMAP(frame_pw, 0, CALC_COLORSIZE, red, green, blue) ; X } X} X X Xmake_frames(argc, argv) Xint argc ; Xchar *argv[] ; X{ X frame = window_create((Window) 0, FRAME, X FRAME_ICON, calctool_icon, X FRAME_SHOW_LABEL, FALSE, X FRAME_NO_CONFIRM, TRUE, X FRAME_ARGS, argc, argv, X 0) ; X sel_client = seln_create(func_key_proc, reply_proc, (char *) 0) ; X NOTIFY_INTERPOSE_DESTROY_FUNC(frame, destroy_proc) ; X rframe = window_create(frame, FRAME, X FRAME_SHOW_LABEL, FALSE, X FRAME_NO_CONFIRM, TRUE, X FRAME_DONE_PROC, destroy_rframe, X WIN_X, TWIDTH+15, X WIN_Y, 0, X WIN_SHOW, FALSE, X WIN_WIDTH, TWIDTH, X WIN_HEIGHT, 200, X WIN_FONT, nfont, X 0) ; X X} X X Xmake_icon() X{ X calctool_icon = icon_create(ICON_WIDTH, ICONWIDTH, X ICON_IMAGE, &icon_pr, X 0) ; X} X X Xmake_items() X{ X main_cursor = window_get(kcanvas, WIN_CURSOR) ; X X if (iscolor) X { X calctool_icon = (Icon) window_get(frame, FRAME_ICON) ; X ICON_SET(calctool_icon, ICON_IMAGE, &cicon_pr, 0) ; X WINDOW_SET(frame, FRAME_ICON, calctool_icon, 0) ; X } X X help_cursor = cursor_create(CURSOR_XHOT, 0, X CURSOR_YHOT, 0, X CURSOR_OP, PIX_SRC | PIX_DST, X CURSOR_IMAGE, &help_cursor_pr, 0) ; X window_fit(frame) ; X} X X Xmake_subframes() X{ X rcanvas = window_create(rframe, CANVAS, 0) ; X kcanvas = window_create(frame, CANVAS, X CANVAS_RETAINED, FALSE, X WIN_EVENT_PROC, canvas_proc, X WIN_WIDTH, TWIDTH, X WIN_HEIGHT, THEIGHT + DISPLAY, X WIN_FONT, nfont, X 0) ; X X WINDOW_SET(kcanvas, WIN_CONSUME_KBD_EVENTS, WIN_ASCII_EVENTS, X WIN_LEFT_KEYS, WIN_TOP_KEYS, WIN_RIGHT_KEYS, X WIN_UP_EVENTS, 0, 0) ; X WINDOW_SET(kcanvas, WIN_IGNORE_PICK_EVENT, LOC_MOVE, 0) ; X cpw = canvas_pixwin(kcanvas) ; X rcpw = canvas_pixwin(rcanvas) ; X} X X X/*ARGSUSED*/ XSeln_result Xreply_proc(item, context, length) XSeln_attribute item ; XSeln_replier_data *context ; Xint length ; X{ X int size ; X char *destp ; X X switch (item) X { X case SELN_REQ_CONTENTS_ASCII : X X if (context->context == NULL) X { X if (shelf == NULL) return(SELN_DIDNT_HAVE) ; X context->context = shelf ; X } X size = strlen(context->context) ; X destp = (char *) context->response_pointer ; X STRCPY(destp, context->context) ; X destp += size ; X while ((int) destp % 4 != 0) *destp++ = '\0' ; X context->response_pointer = (char **) destp ; X *context->response_pointer++ = 0 ; X return(SELN_SUCCESS) ; X X case SELN_REQ_YIELD : X X *context->response_pointer++ = (char *) SELN_SUCCESS ; X return(SELN_SUCCESS) ; X X case SELN_REQ_BYTESIZE : X X if (shelf == NULL) return(SELN_DIDNT_HAVE) ; X *context->response_pointer++ = (char *) strlen(shelf) ; X return(SELN_SUCCESS) ; X X case SELN_REQ_END_REQUEST : return(SELN_SUCCESS) ; X X default : return(SELN_UNRECOGNIZED) ; X } X} X X Xset_cursor(type) Xint type ; X{ X switch (type) X { X case HELPCURSOR : WINDOW_SET(kcanvas, WIN_CURSOR, help_cursor, 0) ; X break ; X case MAINCURSOR : WINDOW_SET(kcanvas, WIN_CURSOR, main_cursor, 0) ; X } X} X X Xstart_tool() X{ X window_main_loop(frame) ; X} X X Xtoggle_reg_canvas() X{ X rstate = !rstate ; X if (rstate) draw_regs() ; X else WINDOW_SET(rframe, WIN_SHOW, FALSE, 0) ; X} SHAR_EOF chmod 0444 sunview.c || echo "restore of sunview.c fails" set `wc -c sunview.c`;Sum=$1 if test "$Sum" != "16635" then echo original size 16635, current size $Sum;fi echo "x - extracting tty.c (Text)" sed 's/^X//' << 'SHAR_EOF' > tty.c && X X/* @(#)tty.c 1.12 89/12/21 X * X * These are the dumb tty dependent graphics routines used by calctool. X * X * Copyright (c) Rich Burridge. X * Sun Microsystems, Australia - All rights reserved. X * X * Permission is given to distribute these sources, as long as the X * copyright messages are not removed, and no monies are exchanged. X * X * No responsibility is taken for any errors or inaccuracies inherent X * either to the comments or the code of this program, but if X * reported to me then an attempt will be made to fix them. X */ X X#include "calctool.h" X#include "color.h" X#include "extern.h" X Xchar *CE, *CL, *CM, *SE, *SO ; X Xchar *getenv(), *tgetstr(), *tgoto() ; Xint destroy_frame(), outc() ; X X#ifdef NO_4_3SELECT Xint fullmask ; /* Full mask of file descriptors to check on. */ Xint readmask ; /* Readmask used in select call. */ X#else Xfd_set fullmask ; /* Full mask of file descriptors to check on. */ Xfd_set readmask ; /* Read mask used in select call. */ X#endif /*NO_4_3SELECT*/ X Xstruct sgttyb in_new, in_old ; X X XSIGRET Xcleanup() X{ X destroy_frame() ; X} X X X/*ARGSUSED*/ Xclear_canvas(canvas, color) Xenum can_type canvas ; Xint color ; X{ X int i,j ; X X if (canvas == REGCANVAS) X for (i = 0; i < 24; i++) X { X tputs(tgoto(CM, i, 43), 1, outc) ; X do_move(43, i) ; X do_clr_eol() ; X } X else for (i = 0; i < 24; i++) X { X do_move(0, i) ; X for (j = 0; j < 42; j++) outc(' ') ; X } X do_move(41, 1) ; X} X X Xclose_frame() {} /* This option does nothing with termcap. */ X X X/*ARGSUSED*/ Xcolor_area(x, y, width, height, color) /* Color an area - null routine. */ Xint x, y, width, height, color ; X{} X X X/*ARGSUSED*/ Xcreate_menu(mtype) /* Create popup menu - null routine. */ Xenum menu_type mtype ; X{} X X Xdestroy_frame() X{ X int i ; X X tputs(CL, 1, outc) ; X for (i = 0; i < 24; i++) X { X do_move(0, i) ; X do_clr_eol() ; X } X do_move(0, 0) ; X SIGNAL(SIGINT, SIG_IGN) ; X IOCTL(0, TIOCSETP, &in_old) ; X exit(0) ; X} X X Xdo_clr_eol() /* Clear to the end of the line. */ X{ X tputs(CE, 1, outc) ; X} X X X/*ARGSUSED*/ Xdo_menu(mtype) /* Popup appropriate menu (null routine). */ Xenum menu_type mtype ; X{} X X Xdo_move(x, y) /* Move to character position (x, y). */ Xint x, y ; X{ X tputs(tgoto(CM, x, y), 1, outc) ; X} X X Xdo_standend() /* Finish inverted area. */ X{ X tputs(SE, 1, outc) ; X} X X Xdo_standout() /* Start inverted area. */ X{ X tputs(SO, 1, outc) ; X} X X Xdrawline(x1, y1, x2, y2) Xint x1, y1, x2, y2 ; X{ X double dx ; X int i, offset, x, y ; X X if (x1) X { X dx = (float) (x1 - BBORDER) / (BWIDTH + BGAP) ; X if (dx == (int) dx) offset = 1 ; X else offset = 6 ; X X x = ((x1 - BBORDER) / (BWIDTH + BGAP) * 7) + offset ; X y = ((y1 - BBORDER) / (BHEIGHT + BGAP) * 3) + 5 ; X do_move(x, y) ; X if (x1 == x2) X { X if ((y2 - y1) != BHEIGHT) return ; X outc('+') ; X for (i = 0; i < 2; i++) X { X do_move(x, y+i+1) ; X outc('|') ; X } X do_move(x, y+3) ; X outc('+') ; X } X else X { X if ((x2 - x1) != BWIDTH) return ; X outc('+') ; X for (i = 0; i < 4; i++) X { X do_move(x+i+1, y) ; X outc('-') ; X } X do_move(x+5, y) ; X outc('+') ; X } X } X else X { X do_move(0, 4) ; X for (i = 0; i < 42; i++) outc('-') ; X } X} X X Xdraw_regs() X{ X} X X X/*ARGSUSED*/ Xdrawtext(tx, ty, window, fontno, color, str) Xenum can_type window ; Xenum font_type fontno ; Xint tx, ty, color ; Xchar *str ; X{ X char key[5] ; X int i, invert, sps ; X X invert = 0 ; X if (window == REGCANVAS) /* Register window. */ X { X tx = 45 ; X ty = ((ty / 15 - 1) * 2) + 1 ; X } X else if (window == KEYCANVAS && tx == 5) /* Help screen. */ X { X tx = 1 ; X ty = ty / 15 ; X } X else if (window == KEYCANVAS && ty < DISPLAY) X { X if (color == WHITE) X for (i = 0; i < strlen(str); i++) str[i] = ' ' ; X X if (ty == (DISPLAY-3)) /* Base, trig and op items. */ X { X tx = tx * 42 / (TWIDTH) + 1 ; X ty = 3 ; X } X else /* Display item. */ X { X tx = 41 - strlen(str) ; X ty = 1 ; X } X } X else /* Button values. */ X { X tx = ((tx - BBORDER) / (BWIDTH + BGAP) * 7) + 2 ; X for (sps = 0, i = 0; i < 4; i++) X if (str[i] == ' ') sps++ ; X ty = (ty - 34) / 30 ; X ty = (ty - (ty % 2)) * 3 / 2 + 6 + (ty % 2) ; X switch (sps) X { X case 0 : X case 1 : X case 4 : STRCPY(key, str) ; X break ; X case 2 : X case 3 : key[0] = ' ' ; X STRNCPY(&key[1], str, 3) ; X } X key[5] = '\0' ; X STRCPY(str, key) ; X if (ty % 3) invert = 1 ; X } X do_move(tx, ty) ; X if (window == REGCANVAS) do_clr_eol() ; X if (invert) do_standout() ; X outstr(str) ; X if (invert) do_standend() ; X do_move(41, 1) ; X} X X Xget_display() /* No GET key; null routine. */ X{} X X Xget_next_event() /* Only events possible are keyboard ones. */ X{ X char c ; X int reply ; X X for (;;) X { X readmask = fullmask ; X#ifdef NO_4_3SELECT X reply = select(32, &readmask, 0, 0, (struct timeval *) 0) ; X if (reply == -1) /* do nothing. */ X else if (readmask && (1 << 0)) X#else X reply = select(FD_SETSIZE, &readmask, (fd_set *) 0, (fd_set *) 0, X (struct timeval *) 0) ; X if (reply == -1) /* do nothing. */ ; X else if (FD_ISSET(0, &readmask)) X#endif /*NO_4_3SELECT*/ X { X READ(0, &c, 1) ; X cur_ch = c ; X return(KEYBOARD) ; X } X } X} X X Xhandle_selection() /* There is no PUT function key with termcap. */ X{} X X Xinit_fonts() /* No fonts with the termcap version. */ X{ X nfont_width = 8 ; X} X X Xinit_ws_type() /* Check if terminal capable of termcap output. */ X{ X char bp[1024], termtype[MAXLINE] ; X int i ; X static char buf[100] ; X char *area = buf ; X X if (getenv("TERM") != NULL) STRCPY(termtype, getenv("TERM")) ; X if (tgetent(bp, termtype) != 1) return 1 ; X if ((CL = tgetstr("cl", &area)) == (char *) 0) return 1 ; X if ((CM = tgetstr("cm", &area)) == (char *) 0) return 1 ; X if ((CE = tgetstr("ce", &area)) == (char *) 0) return 1 ; X if ((SO = tgetstr("so", &area)) == (char *) 0) return 1 ; X if ((SE = tgetstr("se", &area)) == (char *) 0) return 1 ; X for (i = 0; i < 24; i++) X { X do_move(0, i) ; X do_clr_eol() ; X } X gtype = TTY ; X return 0 ; X} X X Xload_colors() X{ X iscolor = 0 ; /* No colors in the termcap implementation. */ X} X X X/*ARGSUSED*/ Xmake_frames(argc, argv) Xint argc ; Xchar *argv[] ; X{ X int i ; X X SIGNAL(SIGINT, cleanup) ; X X#ifdef NO_4_3SELECT X fullmask = 1 ; /* Set mask for fd #0. */ X#else X FD_ZERO(&fullmask) ; X FD_SET(0, &fullmask) ; X#endif /*NO_4_3SELECT*/ X X IOCTL(0, TIOCGETP, &in_old) ; /* Setup standard input. */ X in_new = in_old ; X in_new.sg_flags |= RAW ; X in_new.sg_flags &= ~(ECHO | CRMOD) ; X IOCTL(0, TIOCSETP, &in_new) ; X X setbuf(stdout, (char *) NULL) ; X X tputs(CL, 1, outc) ; X do_move(0, 4) ; X for (i = 0; i < 41; i++) outc('-') ; X for (i = 0; i < 24; i++) X { X do_move(42, i) ; X if (i == 4) outc('+') ; X else outc('|') ; X } X} X X Xmake_icon() {} /* There is no icon with termcap. */ X X Xmake_items() X{ X do_repaint() ; /* Redraw the calctool canvas[es]. */ X} X X Xmake_subframes() {} /* There are no subframes with termcap. */ X X Xoutc(c) /* Output the next character to the screen. */ Xint c ; X{ X PUTC(c, stdout) ; X} X X Xoutstr(str) Xchar *str ; X{ X int i ; X X for (i = 0; i < strlen(str); i++) PUTC(str[i], stdout) ; X} X X X/*ARGSUSED*/ Xset_cursor(type) /* There are no cursors with termcap. */ Xint type ; X{} X X Xstart_tool() X{ X while (1) X process_event(get_next_event()) ; X} X X Xtoggle_reg_canvas() /* Show or clear memory register area. */ X{ X rstate = !rstate ; X clear_canvas(REGCANVAS, WHITE) ; X if (rstate) make_registers() ; X} SHAR_EOF chmod 0444 tty.c || echo "restore of tty.c fails" set `wc -c tty.c`;Sum=$1 if test "$Sum" != "8330" then echo original size 8330, current size $Sum;fi echo "x - extracting x11.c (Text)" sed 's/^X//' << 'SHAR_EOF' > x11.c && X X/* @(#)x11.c 1.14 89/12/21 X * X * These are the X11 dependent graphics routines used by calctool. X * X * Copyright (c) Rich Burridge. X * Sun Microsystems, Australia - All rights reserved. X * X * Permission is given to distribute these sources, as long as the X * copyright messages are not removed, and no monies are exchanged. X * X * No responsibility is taken for any errors or inaccuracies inherent X * either to the comments or the code of this program, but if X * reported to me then an attempt will be made to fix them. X */ X X#include "calctool.h" X#include "color.h" X#include "extern.h" X#include <X11/Xlib.h> X#include <X11/Xutil.h> X#include <X11/Xatom.h> X#include <X11/cursorfont.h> X X#define XGETSIZEHINTS (void) XGetSizeHints X X#define BIGFONT "helvetica-bold-14" X#define DEFFONT "fixed" X#define NORMALFONT "fixed" X#define SMALLFONT "6x10" X X#define CALCTOOL_BORDER_WIDTH 2 X X#define FRAME_MASK (ButtonPressMask | ButtonReleaseMask | KeyPressMask | \ X EnterWindowMask | LeaveWindowMask | ExposureMask) X Xshort help_cursor_array[16] = { X#include "help.cursor" X} ; X Xshort icon_image[] = { X#include "calctool.icon" X} ; X Xshort cicon_image[] = { X#include "calctool.color.icon" X} ; X XAtom protocol_atom, kill_atom ; XCursor help_cursor, main_cursor ; XDisplay *dpy ; XGC gc ; XPixmap calctool_icon, help_pixmap ; XPixmap load_icon() ; XWindow frame, rframe ; XXColor BGcolor, FGcolor, current_col ; XXEvent event ; XXFontStruct *bfont, *font, *nfont, *sfont ; XXGCValues gc_val ; XXSizeHints size ; XXWMHints wm_hints ; X Xunsigned long gc_mask ; Xint screen ; Xunsigned int scr_depth ; Xunsigned long backgnd, foregnd ; Xunsigned long palette[CALC_COLORSIZE] ; X X Xclear_canvas(ctype, color) Xenum can_type ctype ; Xint color ; X{ X XSizeHints hints ; X Window window ; X X if (ctype == KEYCANVAS) window = frame ; X else if (ctype == REGCANVAS) window = rframe ; X XGETSIZEHINTS(dpy, window, &hints, XA_WM_NORMAL_HINTS) ; X if (iscolor) gc_val.foreground = palette[color] ; X else X { X if (color == WHITE) gc_val.foreground = backgnd ; X else gc_val.foreground = foregnd ; X } X gc_val.function = GXcopy ; X XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ; X XFillRectangle(dpy, window, gc, 0, 0, hints.width, hints.height) ; X} X X Xclose_frame() X{ X iconic = 1 ; X rstate = 0 ; X XIconifyWindow(dpy, frame, screen) ; X} X X Xcolor_area(x, y, width, height, color) Xint x, y, width, height, color ; X{ X if (iscolor) gc_val.foreground = palette[color] ; X else X { X if (color == WHITE) gc_val.foreground = backgnd ; X else gc_val.foreground = foregnd ; X } X gc_val.function = GXcopy ; X XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ; X XFillRectangle(dpy, frame, gc, x, y, X (unsigned int) width, (unsigned int) height) ; X} X X Xcreate_menu(mtype) /* Create popup menu for right button press. */ Xenum menu_type mtype ; X{ X} X X Xdestroy_frame() X{ X XDestroyWindow(dpy, frame) ; X XDestroyWindow(dpy, rframe) ; X exit(0) ; X} X X Xdo_menu(mtype) /* Popup appropriate menu and get value. */ Xenum menu_type mtype ; X{ X} X X Xdrawline(x1, y1, x2, y2) Xint x1, y1, x2, y2 ; X{ X if (iscolor) gc_val.foreground = palette[BLACK] ; X else gc_val.foreground = foregnd ; X gc_val.function = GXcopy ; X XChangeGC(dpy, gc, GCForeground | GCFunction, &gc_val) ; X XDrawLine(dpy, frame, gc, x1, y1, x2, y2) ; X} X X Xdraw_regs() X{ X XMapWindow(dpy, rframe) ; X} X X Xdrawtext(x, y, ctype, fontno, color, str) Xenum font_type fontno ; Xenum can_type ctype ; Xint x, y, color ; Xchar *str ; X{ X Window window ; X X if (fontno == SFONT) font = sfont ; X else if (fontno == NFONT) font = nfont ; X else if (fontno == BFONT) font = bfont ; X if (ctype == KEYCANVAS) window = frame ; X else if (ctype == REGCANVAS) window = rframe ; X X if (ctype == KEYCANVAS && y == items[DISPLAYITEM].y) x += 100 ; X if (iscolor) gc_val.foreground = palette[color] ; X else X { X if (color == WHITE) gc_val.foreground = backgnd ; X else gc_val.foreground = foregnd ; X } X gc_val.font = font->fid ; X gc_val.function = GXcopy ; X XChangeGC(dpy, gc, GCFont | GCForeground | GCFunction, &gc_val) ; X XDrawString(dpy, window, gc, x, y, str, strlen(str)) ; X} X X Xget_display() /* GET function key was pressed. */ X{ X} X X XXFontStruct * Xget_font(name) Xchar *name ; X{ X XFontStruct *font ; X X if (!(font = XLoadQueryFont(dpy, name))) X if (!(font = XLoadQueryFont(dpy, DEFFONT))) X { X perror("couldn't get the default font.") ; X exit(1) ; X } X return(font) ; X} X X Xget_next_event() X{ X XClientMessageEvent *ev ; X XKeyPressedEvent *key_event ; X char chs[2] ; X X if (!XCheckMaskEvent(dpy, ExposureMask, &event)) X XNextEvent(dpy, &event) ; X X switch (event.type) X { X case ClientMessage : /* Catch ICCCM kill from WM. */ X X ev = (XClientMessageEvent *) &event ; X if (ev->message_type == protocol_atom && X ev->data.l[0] == kill_atom) X exit(0) ; X return(LASTEVENTPLUSONE) ; X X case Expose : return(process_expose(&event)) ; X X case EnterNotify : return(ENTER_WINDOW) ; X X case LeaveNotify : return(EXIT_WINDOW) ; X X case KeyPress : key_event = (XKeyPressedEvent *) &event ; X curx = key_event->x ; X cury = key_event->y ; X (void) XLookupString(key_event, chs, 1, X (KeySym *) NULL, X (XComposeStatus *) NULL) ; X cur_ch = chs[0] ; X return(KEYBOARD) ; X X case ButtonPress : curx = event.xbutton.x ; X cury = event.xbutton.y ; X if (event.xbutton.button == Button1) X return(LEFT_DOWN) ; X else if (event.xbutton.button == Button2) X return(MIDDLE_DOWN) ; X else if (event.xbutton.button == Button3) X return(RIGHT_DOWN) ; X X case ButtonRelease : curx = event.xbutton.x ; X cury = event.xbutton.y ; X if (event.xbutton.button == Button1) X return(LEFT_UP) ; X else if (event.xbutton.button == Button2) X return(MIDDLE_UP) ; X else if (event.xbutton.button == Button3) X return(RIGHT_UP) ; X X default : return(LASTEVENTPLUSONE) ; X } X/*NOTREACHED*/ X} X X Xhandle_selection() X{ X} X X Xinit_fonts() X{ X bfont = get_font(BIGFONT) ; X nfont = get_font(NORMALFONT) ; X nfont_width = 6 ; X sfont = get_font(SMALLFONT) ; X} X X Xinit_ws_type() X{ X if ((dpy = XOpenDisplay(x11_display)) == NULL) X { X FPRINTF(stderr,"%s: Couldn't open display %s\n", progname, X (getenv ("DISPLAY") ? getenv("DISPLAY") : x11_display)) ; X exit(1) ; X } X X screen = DefaultScreen(dpy) ; X X if (!geometry) X STRCPY(geometry, XGetDefault(dpy, progname, "Geometry")) ; X X foregnd = BlackPixel(dpy, screen) ; X backgnd = WhitePixel(dpy, screen) ; X scr_depth = DefaultDepth(dpy, screen) ; X gtype = X11 ; X return 0 ; X} X X Xload_colors() /* Create and load calctool color map. */ X{ X u_char red[CALC_COLORSIZE], green[CALC_COLORSIZE], blue[CALC_COLORSIZE] ; X int i, numcolors ; X X iscolor = 0 ; X if (DisplayCells(dpy, screen) > 2) X { X calc_colorsetup(red, green, blue) ; X iscolor = 1 ; X numcolors = 0 ; X for (i = 0; i < CALC_COLORSIZE; i++) X { X current_col.flags = DoRed | DoGreen | DoBlue ; X current_col.red = (unsigned short) (red[i] << 8) ; X current_col.green = (unsigned short) (green[i] << 8) ; X current_col.blue = (unsigned short) (blue[i] << 8) ; X if (XAllocColor(dpy, DefaultColormap(dpy, screen), ¤t_col) == True) X palette[numcolors++] = current_col.pixel ; X } X if (numcolors < 2) X { X FPRINTF(stderr, "%s: cannot allocate colors.\n", progname) ; X exit(1) ; X } X } X} X X XCursor Xload_cursor(sbuf) Xshort sbuf[16] ; X{ X char cbuf[32] ; X int i ; X X for (i = 0; i < 16; i++) X { X cbuf[i*2+0] = revtable[(sbuf[i] >> 8) & 0xFF] ; X cbuf[i*2+1] = revtable[sbuf[i] & 0xFF] ; X } X help_pixmap = XCreatePixmapFromBitmapData(dpy, RootWindow(dpy, screen), cbuf, X 16, 16, foregnd, backgnd, 1) ; X return(XCreatePixmapCursor(dpy, help_pixmap, help_pixmap, X &FGcolor, &BGcolor, 0, 0)) ; X} X X XPixmap Xload_icon(sbuf) Xshort sbuf[] ; X{ X GC pix_gc ; X Pixmap pixmap ; X XImage *image ; X char cbuf[512*8] ; X int i ; X X if (iscolor) X { X for (i = 0; i < (256*8); i++) X { X cbuf[i*2+0] = palette[(sbuf[i] >> 8) & 0xFF] ; X cbuf[i*2+1] = palette[sbuf[i] & 0xFF] ; X } X pix_gc = DefaultGC(dpy, screen) ; X image = XCreateImage(dpy, DefaultVisual(dpy, screen), X scr_depth, ZPixmap, 0, cbuf, 64, 64, 8, 64) ; X pixmap = XCreatePixmap(dpy, RootWindow(dpy, screen), X ICONWIDTH, (unsigned) image->height, scr_depth) ; X XPutImage(dpy, pixmap, pix_gc, image, 0, 0, 0, 0, X ICONWIDTH, (unsigned) image->height) ; X } X else X { X for (i = 0; i < 256; i++) X { X cbuf[i*2+0] = revtable[(sbuf[i] >> 8) & 0xFF] ; X cbuf[i*2+1] = revtable[sbuf[i] & 0xFF] ; X } X pixmap = XCreatePixmapFromBitmapData(dpy, RootWindow(dpy, screen), cbuf, X 64, 64, foregnd, backgnd, scr_depth) ; X } X return(pixmap) ; X} X X Xmake_frames(argc, argv) Xint argc ; Xchar *argv[] ; X{ X unsigned int h, w ; /* Window dimensions. */ X int flags ; X int x, y ; /* Window position. */ SHAR_EOF echo "End of part 4" echo "File x11.c is continued in part 5" echo "5" > s2_seq_.tmp exit 0