home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume17
/
mgr
/
part61
< prev
next >
Wrap
Text File
|
1989-01-19
|
48KB
|
1,335 lines
Subject: v17i062: MGR, Bellcore window manager, Part61/61
Newsgroups: comp.sources.unix
Approved: rsalz@uunet.UU.NET
Submitted-by: Stephen A. Uhler <sau@bellcore.com>
Posting-number: Volume 17, Issue 62
Archive-name: mgr/part61
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 61 (of 61)."
# Contents: src/put_window.c
# Wrapped by rsalz@papaya.bbn.com on Thu Nov 17 21:06:09 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'src/put_window.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/put_window.c'\"
else
echo shar: Extracting \"'src/put_window.c'\" \(44878 characters\)
sed "s/^X//" >'src/put_window.c' <<'END_OF_FILE'
X/* Copyright (c) 1987 Bellcore
X * All Rights Reserved
X * Permission is granted to copy or use this program, EXCEPT that it
X * may not be sold for profit, the copyright notice must be reproduced
X * on copies, and credit should be given to Bellcore where it is due.
X * BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
X */
X/* $Header: put_window.c,v 4.4 88/08/16 07:25:54 sau Exp $
X $Source: /tmp/mgrsrc/src/RCS/put_window.c,v $
X*/
Xstatic char RCSid_[] = "$Source: /tmp/mgrsrc/src/RCS/put_window.c,v $$Revision: 4.4 $";
X
X/* Very simple terminal emulator (this is an old comment) */
X
X#include <sys/time.h> /* experimental */
X#include "bitmap.h"
X#include "font.h"
X#include "defs.h"
X#include "menu.h"
X#include "event.h"
X#include <stdio.h>
X#include "window.h"
X#include "clip.h"
X
X/* macros for putting a character on a window */
X
X#define DO_CHAR(font,c) \
X ((font)->glyph[c])
X
X#ifdef COLOR
X#define PUT_CHAR(dest,x,y,font,op,c) \
X bit_blit(dest,x,y-fsizehigh,fsizewide,fsizehigh, \
X BIT_SRC | (W(background)&~NOCOLOR),BIT_NULL,0,0), \
X bit_blit(dest,x,y-fsizehigh,fsizewide,fsizehigh, \
X (op & NOCOLOR)^BIT_DST | (op ^ W(background))&~NOCOLOR, \
X DO_CHAR(font,c),0,0)
X
X/* fix the border color */
X
X#define BORDER(win) \
X ((win==active) ? border(win,SUM_BDR-1,1) : border(win,BLK_BDR,WH_BDR))
X
X#else NOCOLOR
X
X#define PUT_CHAR(dest,x,y,font,op,c) \
X bit_blit(dest,x,y-fsizehigh,fsizewide,fsizehigh, \
X op,DO_CHAR(font,c),0,0)
X#define BORDER(win)
X
X#endif
X#define Abs(x) ((x)>0?(x):-(x))
X
X/* flseep is experimental */
X
X#define fsleep() \
X { \
X struct timeval time; \
X time.tv_sec = 0; \
X time.tv_usec = 330000; \
X select(0,0,0,0,&time); \
X }
X
Xrect clip; /* clipping rectangle */
X
X/* send a string to a window, interpret ESC's
X * return # of chars actually processed
X */
X
Xint
Xput_window(win,buff,buff_count)
Xregister WINDOW *win; /* window to update */
Xregister char *buff; /* ptr to update text */
Xint buff_count; /* # of characters */
X {
X register BITMAP *window; /* bitmap to update */
X register BITMAP *text = (BITMAP *) 0; /* current text region */
X register int indx; /* index into buff */
X register int cnt; /* # of esc. numbers */
X register char c; /* current char */
X register int done=0; /* set to 1 to exit */
X int bell=0; /* 1 if screen flashed once */
X int sub_window = 0; /* sub window created */
X int fsizehigh, fsizewide; /* variables to save deref. */
X struct font *Get_font();
X char *malloc(), *binary();
X struct menu_state *do_menu();
X char *trans();
X
X /* set up environment */
X
X if (W(flags)&W_ACTIVE) {
X window = W(window);
X }
X else {
X window = bit_create(W(save),SUM_BDR,SUM_BDR,
X BIT_WIDE(W(window)),BIT_HIGH(W(window)));
X sub_window++;
X }
X
X if (window==(BITMAP *) 0) { /* never! */
X perror("Bit_create failed for window");
X return(0);
X }
X
X /* avoid repeated dereferencing of pointers */
X
X fsizehigh = FSIZE(high);
X fsizewide = FSIZE(wide);
X
X if (Do_clip()) {
X Set_clipall();
X Set_cliplow(W(x)+W(text).x,W(y)+W(text).y-fsizehigh);
X }
X
X if (W(text.wide))
X text = bit_create(window,W(text.x),W(text.y),W(text.wide),W(text.high));
X if (text == (BITMAP *) 0)
X text = window;
X
X if (W(flags)&W_ACTIVE && mousein(mousex,mousey,win,0)) {
X MOUSE_OFF(mousex,mousey);
X }
X
X if (win==active)
X cursor_off();
X
X /* do each character */
X
X for(indx=0;c= *buff++, indx<buff_count && !done; indx++)
X switch (W(flags)&W_STATE) {
X
X /* download and process text strings */
X
X case W_TEXT: /* down load a text string */
X cnt = W(esc_cnt);
X W(snarf[W(esc)[TEXT_COUNT]++]) = c;
X if (W(esc)[TEXT_COUNT] >= W(esc)[cnt]) {
X W(snarf)[W(esc)[TEXT_COUNT]] = '\0';
X W(flags) &= ~W_TEXT;
X if (W(snarf) && W(code)!=T_BITMAP && W(code)!=T_GRUNCH)
X (void) trans(W(snarf));
X down_load(win,window,text);
X done++;
X }
X break;
X
X /**********************************************************************
X * Handle escape codes
X */
X
X case W_ESCAPE: /* process an escape code */
X W(flags) &= ~(W_ESCAPE);
X cnt = W(esc_cnt);
X switch(c&=0177) {
X case ESC : /* turn on escape mode */
X W(flags) |= W_ESCAPE;
X W(esc_cnt) = 0;
X W(esc[0]) = 0;
X break;
X
X case '0': case '1': case '2': case '3': case '4':
X case '5': case '6': case '7': case '8': case '9':
X W(esc)[W(esc_cnt)] = W(esc)[W(esc_cnt)]*10 + c-'0';
X W(flags) |= W_ESCAPE;
X if (W(flags)&W_MINUS && W(esc)[W(esc_cnt)] > 0) {
X W(esc)[W(esc_cnt)] = -(W(esc)[W(esc_cnt)]);
X W(flags) &= ~(W_MINUS);
X }
X break;
X
X case E_SEP1: /* primary field separator */
X case E_SEP2: /* secondary field separator */
X if (W(esc_cnt)+1 < MAXESC)
X W(esc_cnt)++;
X W(esc)[W(esc_cnt)] = 0;
X W(flags) &= ~(W_MINUS);
X W(flags) |= W_ESCAPE;
X break;
X
X case E_MINUS: /* set the MINUS flag */
X W(flags) |= (W_ESCAPE|W_MINUS);
X break;
X
X case E_NULL: /* do nothing */
X done++;
X break;
X
X case E_ADDLINE: /* add a new line */
X if (*W(esc)) {
X register int count = *W(esc);
X scroll(win,text,W(y)-fsizehigh,T_HIGH,- count*(fsizehigh),
X W(background));
X }
X else {
X scroll(win,text,W(y)-fsizehigh,T_HIGH,-(fsizehigh),
X W(background));
X bit_blit(text,0,HIGH-fsizehigh,T_WIDE,
X fsizehigh,W(background),NULL_DATA,0,0);
X }
X done++;
X break;
X
X case E_ADDCHAR: /* insert a character */
X {
X register int wide = fsizewide*(*W(esc)?*W(esc):1);
X if (wide+W(x)>T_WIDE)
X wide = T_WIDE-W(x);
X bit_blit(text,W(x)+wide,W(y)-fsizehigh,
X T_WIDE-W(x)-wide, fsizehigh,BIT_SRC,
X text,W(x),W(y)-fsizehigh);
X bit_blit(text,W(x),W(y)-fsizehigh,wide,
X fsizehigh,W(background),0,0,0);
X }
X break;
X
X case E_DELETELINE: /* delete a line */
X if (*W(esc)) {
X register int count = *W(esc);
X scroll(win,text,W(y)-fsizehigh,T_HIGH,count*fsizehigh,
X W(background));
X }
X else {
X scroll(win,text,W(y)-fsizehigh,T_HIGH,fsizehigh,
X W(background));
X }
X done++;
X break;
X
X case E_DELETECHAR: /* delete a character */
X {
X register int wide = fsizewide*(*W(esc)?*W(esc):1);
X if (wide+W(x)>T_WIDE)
X wide = T_WIDE-W(x);
X bit_blit(text,W(x),W(y)-fsizehigh,
X T_WIDE-W(x)-wide, fsizehigh,BIT_SRC,
X text,W(x)+wide,W(y)-fsizehigh);
X bit_blit(text,T_WIDE-wide,W(y)-fsizehigh,wide,
X fsizehigh,W(background),0,0,0);
X }
X break;
X
X case E_UPLINE: /* up 1 line */
X#ifdef FRACCHAR
X if (cnt>0) { /* move up fractions of a character line */
X int div = W(esc)[1] == 0 ? 1 : W(esc)[1];
X int n = W(esc)[0] * fsizehigh / div;
X if (W(y)>n) {
X W(y) -= n;
X if (Do_clip())
X Set_cliplow(10000,W(y)+W(text).y-fsizehigh);
X }
X break;
X }
X#endif
X if (W(y)>fsizehigh) W(y) -= fsizehigh;
X if (Do_clip())
X Set_cliplow(10000,W(y)+W(text).y-fsizehigh);
X break;
X
X case E_RIGHT: /* right 1 line */
X#ifdef FRACCHAR
X if (cnt>0) { /* move right/left a fraction of a character */
X int div = W(esc)[1] == 0 ? 1 : W(esc)[1];
X int n = W(esc)[0] * fsizewide / div;
X W(x) += n;
X if (W(x) < 0)
X W(x) = 0;
X break;
X }
X#endif
X W(x) += fsizewide;
X break;
X
X case E_DOWN: /* down 1 line */
X#ifdef FRACCHAR
X if (cnt>0) { /* move down a fraction of a character */
X int div = W(esc)[1] == 0 ? 1 : W(esc)[1];
X int n = W(esc)[0] * fsizehigh / div;
X if (W(y)+n > T_HIGH) {
X scroll(win,text,0,T_HIGH,n,W(background));
X done++;
X }
X else {
X W(y) += n;
X if (Do_clip())
X Set_cliphigh(0,W(y)+W(text).y);
X }
X break;
X }
X#endif
X if (W(y)+fsizehigh > T_HIGH) {
X scroll(win,text,0,T_HIGH,fsizehigh,W(background));
X done++;
X }
X else {
X W(y) += fsizehigh;
X if (Do_clip())
X Set_cliphigh(0,W(y)+W(text).y);
X }
X break;
X
X case E_FCOLOR: /* set forground color */
X W(style) = (W(style)&NOCOLOR) | GETCOLOR(*W(esc));
X BORDER(win);
X break;
X
X case E_BCOLOR: /* set background color */
X W(background) = (W(background)&NOCOLOR) | GETCOLOR(*W(esc));
X BORDER(win);
X break;
X
X case E_STANDOUT: /* inverse video (characters) */
X standout( win );
X break;
X
X case E_STANDEND: /* normal video (characters) */
X standend( win );
X break;
X
X case E_CLEAREOL: /* clear to end of line */
X bit_blit(text,W(x),W(y)-fsizehigh,T_WIDE-W(x),
X fsizehigh,W(background),0,0,0);
X if (Do_clip())
X Set_cliphigh(BIT_WIDE(W(window)),0);
X break;
X
X case E_CLEAREOS: /* clear to end of window */
X bit_blit(text,W(x),W(y)-fsizehigh,T_WIDE-W(x),
X fsizehigh,W(background),0,0,0);
X bit_blit(text,0,W(y),T_WIDE,T_HIGH-W(y),W(background),0,0,0);
X if (Do_clip())
X Set_cliphigh(BIT_WIDE(W(window)),BIT_HIGH(window));
X break;
X
X case E_SETCURSOR: /* set the character cursor */
X W(curs_type) = *W(esc);
X break;
X case E_BLEEP: /* highlight a section of the screen */
X if (cnt>2) {
X register int *p = W(esc);
X if (p[0]<0 || p[1]<0 )
X break;
X p[2] = BETWEEN(1,p[2],BIT_WIDE(screen)-1);
X p[3] = BETWEEN(1,p[3],BIT_WIDE(screen)-1);
X bit_blit(screen,p[0],p[1],p[2],p[3],BIT_NOT(BIT_DST),NULL_DATA,0,0);
X fsleep();
X bit_blit(screen,p[0],p[1],p[2],p[3],BIT_NOT(BIT_DST),NULL_DATA,0,0);
X done++;
X }
X break;
X
X case E_FONT: /* pick a new font */
X#ifdef CUT
X W(flags) &= ~W_SNARFABLE;
X#endif
X if (cnt > 0) {
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>0 && (W(snarf)=malloc(W(esc)[cnt]+1)) != (char *)0)
X W(flags) |= W_TEXT;
X W(code) = T_FONT;
X break;
X }
X
X {
X int font_count = W(esc)[cnt];
X int baseline = FSIZE(baseline);
X
X W(font)=Get_font(font_count);
X fsizehigh = FSIZE(high);
X fsizewide = FSIZE(wide);
X W(y) += FSIZE(baseline)-baseline;
X if (W(y) < fsizehigh) {
X scroll(win,text,W(y)-fsizehigh,T_HIGH,
X W(y)-fsizehigh,W(background));
X W(y)=fsizehigh;
X done++;
X }
X }
X break;
X
X case E_MOUSE: /* testing -- move the mouse */
X MOUSE_OFF(mousex,mousey);
X if (W(esc_cnt) < 1) {
X mousex = W(x0) + W(x);
X mousey = W(y0) + W(y);
X }
X else {
X mousex = W(esc)[cnt-1];
X mousey = W(esc)[cnt];
X mousex = BETWEEN(0,mousex,BIT_WIDE(screen)-1);
X mousey = BETWEEN(0,mousey,BIT_HIGH(screen)-1);
X }
X if (!(W(flags)&W_ACTIVE && mousein(mousex,mousey,win,0)))
X MOUSE_ON(mousex,mousey);
X break;
X
X case E_SIZE: /* reshape window: cols, rows */
X if (!W(flags)&W_ACTIVE) break;
X if (cnt >= 1) {
X int cols = W(esc)[cnt-1];
X int lines = W(esc)[cnt];
X int x = W(x0), y = W(y0);
X
X MOUSE_OFF(mousex,mousey);
X
X if (cnt>=3) {
X x = W(esc)[0];
X y = W(esc)[1];
X }
X
X if (win!=active)
X cursor_off();
X ACTIVE_OFF();
X expose(win);
X shape(x, y,
X cols?cols*fsizewide+2*SUM_BDR:
X 2*SUM_BDR + WIDE,
X lines?lines*fsizehigh+2*SUM_BDR:
X 2*SUM_BDR + HIGH);
X ACTIVE_ON();
X if (!(W(flags)&W_ACTIVE && mousein(mousex,mousey,win,0)))
X MOUSE_ON(mousex,mousey);
X done++;
X }
X break;
X
X case E_PUTSNARF: /* put the snarf buffer */
X if (snarf)
X Write(W(to_fd),snarf,strlen(snarf));
X#ifdef DEBUG
X dprintf(y)(stderr,"%s: sending yank buffer [%s]\n",W(tty),
X snarf?snarf:"EMPTY");
X#endif
X break;
X
X case E_GIMME: /* snarf text into input queue */
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>0 && W(esc)[cnt]<MAXSHELL &&
X (W(snarf)=malloc(W(esc)[cnt]+1)) != (char *)0)
X W(flags) |= W_TEXT;
X W(code) = T_GIMME;
X break;
X
X case E_GMAP: /* read a bitmap from a file */
X#ifdef DEBUG
X dprintf(*)(stderr,"%s: fetching bitmap %d\r\n",
X W(tty),*W(esc)-1);
X#endif
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>0 && W(esc)[cnt]<MAX_PATH &&
X (W(snarf)=malloc(W(esc)[cnt]+1)) != (char *)0)
X W(flags) |= W_TEXT;
X W(code) = T_GMAP;
X break;
X
X case E_SMAP: /* save a bitmap on a file */
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>0 && W(esc)[cnt]<MAX_PATH &&
X (W(snarf)=malloc(W(esc)[cnt]+1)) != (char *)0) {
X W(flags) |= W_TEXT;
X#ifdef DEBUG
X dprintf(*)(stderr,"%s: saving bitmap %d\r\n",
X W(tty),*W(esc)-1);
X#endif
X }
X W(code) = T_SMAP;
X break;
X
X case E_SNARF: /* snarf text into the snarf buffer */
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>=0 && /*** was just > */
X (W(snarf)=malloc(W(esc)[cnt]+1)) != (char *)0)
X W(flags) |= W_TEXT;
X W(code) = T_YANK;
X break;
X
X case E_STRING: /* write text into the offscreen bitmap */
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>0 && /* W(bitmaps)[*W(esc)-1] && */
X (W(snarf)=malloc(W(esc)[cnt]+1)) != (char *)0)
X W(flags) |= W_TEXT;
X W(code) = T_STRING;
X break;
X
X case E_GRUNCH: /* graphics scrunch mode (experimental) */
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>=0 && /*** was just > */
X (W(snarf)=malloc(W(esc)[cnt]+1)) != (char *)0)
X W(flags) |= W_TEXT;
X W(code) = T_GRUNCH;
X break;
X
X#ifdef XMENU
X case E_XMENU: /* extended menu stuff */
X /* ^[3X remove menu 3 from window */
X /* ^[3,4X select item 4 of menu 3 */
X /* ^[1,2,3X display menu 3 at 1,2 */
X /* ^[1,2,3,4Xhighlight menu 3 item 4 at 1,2 */
X {
X register int *p = W(esc);
X register struct menu_state *menu;
X switch(cnt) {
X case 0: /* remove menu from display */
X if (p[0]>=0 && p[0]<MAXMENU && (menu=W(menus[p[0]])))
X menu_remove(menu);
X case 1: /* select active item */
X if (p[0]>=0 && p[0]<MAXMENU && (menu=W(menus[p[0]])))
X menu->current = p[1];
X break;
X case 2: /* display menu on window */
X if (p[2]>=0 && p[2]<MAXMENU && (menu=W(menus[p[2]])))
X menu_setup(menu,window,Scalex(p[0]),Scaley(p[1]),-1);
X break;
X case 3: /* highlight menu item on window */
X if (p[2]>=0 && p[2]<MAXMENU &&
X (menu=W(menus[p[2]])) && menu->menu) {
X bit_blit(window, Scalex(p[0])+MENU_BORDER,
X Scaley(p[1])+(p[3]-1)*menu->bar_sizey+
X MENU_BORDER,
X menu->bar_sizex, menu->bar_sizey,
X BIT_NOT(BIT_DST), NULL_DATA, 0, 0);
X }
X break;
X }
X }
X break;
X#endif
X case E_MENU: /* get a menu */
X { /* should be split into several cases */
X register int b = (W(esc)[0]<0); /* which button */
X register int n = Abs(W(esc)[0]); /* menu number */
X
X /* setup menu pointer */
X
X if (cnt > 2) {
X int parent = n; /* parent menu # */
X int child = W(esc[2]); /* child menu number */
X int item = W(esc[1]); /* item # of parent */
X int flags = W(esc[3]); /* menu flags */
X
X if (parent<0 || parent >= MAXMENU || child >= MAXMENU ||
X W(menus[parent])==(struct menu_state*)0)
X break;
X
X#ifdef DEBUG
X dprintf(M)(stderr,"Linking menu %d to parent %d at item %d\n",
X child,parent,item);
X#endif
X
X if (item<0) /* page link */
X W(menus[parent])->next = child;
X else if (item < W(menus[parent])->count) /* slide lnk */
X menu_setnext(W(menus[parent]),item) = child;
X
X /* menu flags */
X
X if (flags > 0)
X W(menus[parent])->flags = flags;
X
X break;
X }
X
X /* download a menu */
X
X if (cnt > 0) {
X W(esc)[TEXT_COUNT] = 0;
X if (W(menus)[n]) {
X menu_destroy(W(menus)[n]);
X W(menus)[n] = (struct menu_state *) 0;
X if (W(menu[0])== n)
X W(menu[0]) = -1;
X if (W(menu[1])== n)
X W(menu[1]) = -1;
X }
X if (W(esc)[cnt]>0 && (W(snarf)=malloc(W(esc)[cnt]+1))
X != (char *)0) {
X W(flags) |= W_TEXT;
X W(code) = T_MENU;
X }
X#ifdef DEBUG
X dprintf(M)(stderr,"downloading menu %d\n",n);
X#endif
X }
X
X /* select menu number */
X
X else if (n < MAXMENU && W(menus)[n]) {
X int last_menu = W(menu[b]);
X
X#ifdef DEBUG
X dprintf(M)(stderr,"selecting menu %d on button %d\n",n,b);
X#endif
X W(menu[b]) = n;
X if (last_menu<0 && button_state==(b?BUTTON_1:BUTTON_2))
X go_menu(b);
X }
X else
X W(menu[b]) = -1;
X }
X break;
X
X case E_EVENT: /* get an event */
X switch(cnt) {
X case 2: /* append to an event */
X case 1: /* set an event */
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>0 && (W(snarf)=malloc(W(esc)[cnt]+1))
X != (char *)0) {
X W(flags) |= W_TEXT;
X W(code) = T_EVENT;
X }
X break;
X case 0:
X cnt = W(esc)[0];
X if( !CHK_EVENT(cnt) )
X break;
X EVENT_CLEAR_MASK(win,cnt);
X if (W(events)[GET_EVENT(cnt)]) {
X free (W(events)[GET_EVENT(cnt)]);
X W(events)[GET_EVENT(cnt)] = (char *) 0;
X }
X break;
X }
X break;
X
X case E_SEND: /* send a message */
X W(esc)[TEXT_COUNT] = 0;
X if (W(esc)[cnt]>0 && (W(snarf)=malloc(W(esc)[cnt]+1))
X != (char *)0) {
X W(flags) |= W_TEXT;
X W(code) = T_SEND;
X }
X break;
X
X case E_BITGET: /* upload a bitmap (temporary)*/
X {
X int offset = W(esc)[2];
X int which = *W(esc);
X int size = W(esc)[1];
X BITMAP *m = W(bitmaps)[which-1];
X
X if (cnt>1 && which>0 && which < MAXBITMAPS &&
X m != (BITMAP *) 0 &&
X size+offset<BIT_SIZE(m))
X write(W(to_fd),BIT_DATA(m)+offset,size);
X }
X break;
X case E_BITCRT: /* create/destroy a bitmap */
X switch(cnt) {
X case 0:
X if (W(esc)[0] && W(esc[0]<=MAXBITMAPS) &&
X W(bitmaps)[W(esc)[0]-1] != (BITMAP *) 0) {
X bit_destroy(W(bitmaps)[W(esc)[0]-1]);
X W(bitmaps)[W(esc)[0]-1] = (BITMAP *) 0;
X#ifdef DEBUG
X dprintf(B)(stderr,"%s: Destroyed bitmap %d\r\n",
X W(tty),*W(esc)-1);
X#endif
X }
X break;
X case 2: /* create a new bitmap */
X if (W(esc)[0] && W(esc[0]<=MAXBITMAPS) &&
X W(bitmaps)[W(esc)[0]-1] == (BITMAP *) 0) {
X W(bitmaps)[W(esc)[0]-1] =
X bit_alloc(Scalex(W(esc)[1]),Scalex(W(esc)[2]),
X NULL_DATA,DEPTH);
X#ifdef DEBUG
X dprintf(B)(stderr,"%s: created bitmap %d (%d,%d)\r\n",
X W(tty),*W(esc),W(esc)[1],W(esc)[2]);
X#endif
X }
X break;
X }
X break;
X
X case E_BITLOAD: /* download a bitmap */
X if (cnt >=2) {
X W(esc)[TEXT_COUNT] = 0;
X W(bitmap) = bit_alloc(W(esc[0]),W(esc[1]),NULL_DATA,DEPTH);
X if (W(bitmap) != (BITMAP *) 0) {
X W(flags) |= W_TEXT;
X W(snarf) = (char *) BIT_DATA(W(bitmap));
X }
X W(code) = T_BITMAP;
X }
X break;
X
X case E_SHAPE: /* reshape window, make it active */
X
X MOUSE_OFF(mousex,mousey);
X
X ACTIVE_OFF();
X if (win!=active) {
X cursor_off();
X expose(win);
X }
X
X if (cnt >= 3)
X shape(W(esc)[cnt-3], W(esc)[cnt-2],
X W(esc)[cnt-1], W(esc)[cnt]);
X else if (cnt == 1)
X shape(W(esc)[cnt-1], W(esc)[cnt],
X BIT_WIDE(W(border)),
X BIT_HIGH(W(border)));
X
X ACTIVE_ON();
X if (!(W(flags)&W_ACTIVE && mousein(mousex,mousey,win,0)))
X MOUSE_ON(mousex,mousey);
X
X done++;
X break;
X
X case E_BITBLT: /* do a bit blit */
X win_rop(win,window);
X done++;
X break;
X
X case E_CIRCLE: /* Plot a circle (or ellipse) */
X circle_plot(win,window);
X break;
X
X case E_LINE: /* Plot a line */
X win_plot(win,window);
X break;
X
X case E_GO: /* Go; move graphics pointer */
X win_go(win);
X break;
X
X case E_MOVE: /* move to x,y pixels */
X#ifdef CUT
X W(flags) &= ~W_SNARFABLE;
X#endif
X if (Do_clip())
X Set_cliphigh(W(x)+W(text).x+fsizewide,W(y)+W(text).y);
X if (cnt>0) {
X W(x) = Scalex(*W(esc));
X W(y) = Scaley(W(esc)[1]);
X }
X else {
X W(x) += Scalex(*W(esc));
X }
X if (W(x)+fsizewide > WIDE && !(W(flags)&W_NOWRAP))
X W(x) = WIDE-fsizewide;
X if (W(y) > HIGH)
X W(y) = HIGH - fsizehigh;
X if (Do_clip())
X Set_cliplow(W(x)+W(text).x,W(y)+W(text).y-fsizehigh);
X break;
X
X case E_CUP: /* move to col,row (zero based) */
X if (cnt < 1) break;
X {
X register int x = W(esc)[cnt-1] * fsizewide;
X register int y = W(esc)[cnt] * fsizehigh;
X if (x == BETWEEN(-1,x,T_WIDE-fsizewide) &&
X y == BETWEEN(-1,y,T_HIGH)) {
X if (Do_clip())
X Set_cliphigh(W(x)+W(text).x+fsizewide,W(y)+W(text).y);
X W(y) = y+fsizehigh;
X W(x) = x;
X if (Do_clip())
X Set_cliplow(W(x)+W(text).x,W(y)+W(text).y-fsizehigh);
X }
X }
X break;
X
X case E_VI: /* turn on vi hack */
X W(flags) |= W_VI;
X break;
X
X case E_NOVI: /* turn off vi hack */
X W(flags) &= ~W_VI;
X break;
X
X case E_PUSH: /* push environment */
X win_push(win,*W(esc));
X break;
X
X case E_POP: /* pop old environment */
X MOUSE_OFF(mousex,mousey);
X win_pop(win);
X if (!(W(flags)&W_ACTIVE && mousein(mousex,mousey,win,0)))
X MOUSE_ON(mousex,mousey);
X done++;
X break;
X
X case E_TEXTREGION: /* setup text region */
X switch (cnt) {
X case 1: /* setup scrolling region (~aka vt100) */
X if (W(esc)[0] >=0 && W(esc)[1] >= W(esc)[0] &&
X W(esc)[1]*fsizehigh < BIT_HIGH(W(window))) {
X W(text.x) = 0;
X W(text.wide) = BIT_WIDE(W(window));
X W(text.y) = fsizehigh*W(esc[0]);
X W(text.high) = fsizehigh*(1+W(esc[1])) - W(text.y);
X if (W(y) < W(text.y)+fsizehigh)
X W(y) = W(text.y) + fsizehigh;
X if (W(y) > W(text.high))
X W(y) = W(text.high);
X }
X break;
X case 3: /* set up entire region */
X W(text.wide) = Scalex(W(esc[2]));
X W(text.high) = Scaley(W(esc[3]));
X W(text.x) = Scalex(W(esc[0]));
X W(text.y) = Scaley(W(esc[1]));
X if (W(text.high) >= fsizehigh*MIN_Y &&
X W(text.wide) >= fsizewide*MIN_X) {
X W(x) = 0;
X W(y) = fsizehigh;
X#ifdef CUT
X W(flags) &= ~W_SNARFABLE;
X#endif
X break;
X }
X W(text.x) = 0;
X W(text.y) = 0;
X W(text.wide) = 0;
X W(text.high) = 0;
X break;
X case 4: /* set up entire region (use rows, cols) */
X W(text.x) = W(esc[0]) * fsizewide;
X W(text.y) = W(esc[1]) * fsizehigh;
X W(text.wide) = W(esc[2]) * fsizewide;
X W(text.high) = W(esc[3]) * fsizehigh;
X if (W(text.high) >= fsizehigh*MIN_Y &&
X W(text.wide) >= fsizewide*MIN_X) {
X W(x) = 0;
X W(y) = fsizehigh;
X break;
X }
X break;
X case 0: /* clear text region */
X#ifdef CUT
X if (W(text.x)%fsizewide!= 0 || W(text.y)%fsizehigh!=0)
X W(flags) &= ~W_SNARFABLE;
X#endif
X W(text.x) = 0;
X W(text.y) = 0;
X W(text.wide) = 0;
X W(text.high) = 0;
X break;
X }
X done++;
X break;
X
X case E_SETMODE: /* set a window mode */
X#ifdef DEBUG
X dprintf(E)(stderr,"%s: setting mode %d\r\n",W(tty),*W(esc));
X#endif
X switch(W(esc)[0]) {
X case M_STANDOUT:
X standout(win);
X break;
X case M_BACKGROUND: /* enable background writes */
X W(flags) |= W_BACKGROUND;
X break;
X case M_NOINPUT: /* disable keyboard input */
X W(flags) |= W_NOINPUT;
X break;
X case M_AUTOEXPOSE: /* auto expose upon write */
X W(flags) |= W_EXPOSE;
X break;
X case M_WOB: /* set white on black */
X if (W(flags)&W_REVERSE)
X break;
X#ifdef COLOR
X W(style) = W(style)&NOCOLOR |
X (~W(style))&~NOCOLOR;
X W(background) = W(background)&NOCOLOR |
X (~W(background))&~NOCOLOR;
X CLEAR(window,W(background));
X BORDER(win);
X#else
X W(background) = BIT_SET;
X W(flags)|= W_REVERSE;
X if (W(flags)&W_OVER)
X W(style) = ROP_INVERT(W(style));
X else
X W(style)= W(flags)&W_STANDOUT ?
X BIT_SRC : BIT_NOT(BIT_SRC);
X CLEAR(window,BIT_NOT(BIT_DST));
X#endif
X if (Do_clip())
X Set_all();
X break;
X case M_NOWRAP: /* turn on no-wrap */
X W(flags) |= W_NOWRAP;
X break;
X case M_OVERSTRIKE: /* turn on overstrike */
X W(style) = W(style)&~NOCOLOR | W(op)&NOCOLOR;
X W(flags) |= W_OVER;
X break;
X case M_ABS: /* set absolute coordinate mode */
X W(flags) |= W_ABSCOORDS;
X break;
X case M_DUPKEY: /* duplicate esc char from keyboard */
X W(flags) |= W_DUPKEY;;
X if (cnt > 0)
X W(dup) = W(esc[1])&0xff;
X else
X W(dup) = DUP_CHAR;
X break;
X case M_NOBUCKEY: /* set no buckey interpretation mode */
X W(flags) |= W_NOBUCKEY;
X break;
X#ifndef NOSTACK
X case M_STACK: /* enable event stacking */
X EVENT_SET_MASK(win,EVENT_STACK);
X break;
X#endif
X
X#ifdef CUT
X case M_SNARFLINES: /* only cut lines */
X W(flags) |= W_SNARFLINES;
X break;
X case M_SNARFTABS: /* change spaces to tabs */
X W(flags) |= W_SNARFTABS;
X break;
X case M_SNARFHARD: /* snarf even if errors */
X W(flags) |= W_SNARFHARD;
X break;
X#endif
X case M_ACTIVATE: /* activate the window */
X if (win == active)
X break;
X
X MOUSE_OFF(mousex,mousey);
X
X cursor_off();
X ACTIVE_OFF();
X expose(win);
X ACTIVE_ON();
X cursor_on();
X done++;
X
X if (!(W(flags)&W_ACTIVE && mousein(mousex,mousey,win,0)))
X MOUSE_ON(mousex,mousey);
X break;
X }
X break;
X
X case E_CLEARMODE: /* clear a window mode */
X#ifdef DEBUG
X dprintf(E)(stderr,"%s: clearing mode %d\r\n",W(tty),*W(esc));
X#endif
X switch(W(esc)[0]) {
X case M_STANDOUT:
X standend(win);
X break;
X case M_BACKGROUND: /* don't permit background writes */
X W(flags) &= ~W_BACKGROUND;
X break;
X case M_NOINPUT: /* permit keyboard input */
X W(flags) &= ~W_NOINPUT;
X break;
X case M_AUTOEXPOSE: /* don't auto expose */
X W(flags) &= ~W_EXPOSE;
X break;
X case M_WOB: /* set black-on-white */
X if (!(W(flags)&W_REVERSE))
X break;
X#ifdef COLOR
X W(style) = W(style)&NOCOLOR |
X (~W(style))&~NOCOLOR;
X W(background) = W(background)&NOCOLOR |
X (~W(background))&~NOCOLOR;
X CLEAR(window,W(background));
X BORDER(win);
X#else
X W(background) = BIT_CLR;
X W(flags)&= ~W_REVERSE;
X if(W(flags)&W_OVER)
X W(style) = ROP_INVERT(W(style));
X else
X W(style)= W(flags)&W_STANDOUT ?
X BIT_NOT(BIT_SRC) : BIT_SRC;
X CLEAR(window,BIT_NOT(BIT_DST));
X#endif
X if (Do_clip())
X Set_all();
X break;
X case M_NOWRAP: /* turn off no-wrap */
X W(flags) &= ~W_NOWRAP;
X break;
X case M_OVERSTRIKE: /* turn off overstrike */
X if ( !(W(flags)&W_STANDOUT) ^ !(W(flags)&W_REVERSE))
X#ifdef COLOR
X W(style) = BIT_SRC | ~NOCOLOR & W(background);
X else
X W(style) = BIT_SRC | ~NOCOLOR & W(style);
X#else
X W(style) = BIT_NOT(BIT_SRC);
X else
X W(style) = BIT_SRC;
X#endif
X W(flags) &= ~W_OVER;
X break;
X case M_ABS: /* set relative coordinate mode */
X W(flags) &= ~W_ABSCOORDS;
X break;
X case M_DUPKEY: /* reset keyboard dup-ky mode */
X W(flags) &= ~W_DUPKEY;
X break;
X case M_NOBUCKEY: /* reset no buckey interpretation mode
X */
X W(flags) &= ~W_NOBUCKEY;
X break;
X#ifndef NOSTACK
X case M_STACK: /* enable event stacking */
X EVENT_CLEAR_MASK(win,EVENT_STACK);
X break;
X#endif
X#ifdef CUT
X case M_SNARFLINES: /* only cut lines */
X W(flags) &= ~W_SNARFLINES;
X break;
X case M_SNARFTABS: /* change spaces to tabs */
X W(flags) &= ~W_SNARFTABS;
X break;
X case M_SNARFHARD: /* snarf even if errors */
X W(flags) &= ~W_SNARFHARD;
X break;
X#endif
X case M_ACTIVATE: /* hide the window */
X if (!(W(flags)&W_ACTIVE) || next_window==1)
X break;
X MOUSE_OFF(mousex,mousey);
X if (win!=active)
X cursor_off();
X ACTIVE_OFF();
X hide(win);
X ACTIVE_ON();
X if (win!=active)
X cursor_on();
X if (!(W(flags)&W_ACTIVE && mousein(mousex,mousey,win,0)))
X MOUSE_ON(mousex,mousey);
X
X done++;
X break;
X }
X break;
X
X case E_GETINFO: /* send window info back to shell */
X get_info(win,window,text);
X break;
X
X case E_MAKEWIN: /* make or goto a new window */
X MOUSE_OFF(mousex,mousey);
X win_make(win,indx);
X done++;
X break;
X
X case E_HALFWIN: /* make a 1/2 window */
X {
X register int *p = W(esc);
X char *tty = NULL;
X char *half_window();
X
X if (cnt < 3 || cnt > 4)
X break;
X MOUSE_OFF(mousex,mousey);
X if (win!=active)
X cursor_off();
X ACTIVE_OFF();
X
X switch (cnt) {
X case 4:
X tty = half_window(p[0],p[1],p[2],p[3],p[4]);
X break;
X case 3:
X tty = half_window(p[0],p[1],p[2],p[3],-1);
X break;
X }
X if (tty) {
X write(W(to_fd),tty,strlen(tty));
X ACTIVE_ON();
X }
X if (win!=active)
X cursor_on();
X write(W(to_fd),"\r",1);
X done++;
X }
X break;
X case E_CURSOR: /* set the mouse cursor */
X {
X BITMAP *map = W(bitmaps[*W(esc)]);
X int x0=0,y0=0;
X
X if (cnt > 0)
X x0 = W(esc[1]);
X if (cnt > 0)
X y0 = W(esc[2]);
X
X if (W(cursor)) {
X bit_destroy(W(cursor));
X W(cursor) = BIT_NULL;
X SETMOUSEICON(&mouse_arrow);
X }
X
X if ( cursor_ok(map,x0,y0) && (W(cursor) =
X bit_alloc(16,32,0,1)))
X bit_blit(W(cursor),0,0,16,32,BIT_SRC,map,x0,y0);
X else
X W(cursor) = BIT_NULL;
X }
X break;
X
X default: /* not implemented */
X break;
X }
X if (!(W(flags)&W_ESCAPE))
X W(flags) &= ~W_MINUS;
X break;
X
X /****************************************************************************
X * Normal characters
X */
X
X default:
X switch(c&=0177) {
X case ESC : /* turn on escape mode */
X W(flags) |= W_ESCAPE;
X W(flags) &= ~(W_MINUS);
X W(esc_cnt) = 0;
X W(esc[0]) = 0;
X break;
X
X case C_NULL: /* null character -- ignore */
X break;
X
X case C_BS: /* back space */
X if (Do_clip()) {
X Set_cliphigh(W(x)+W(text).x + fsizewide,0);
X }
X W(x) -= fsizewide;
X if (W(x) < 0)
X W(x) = 0;
X if (Do_clip()) {
X Set_cliplow(W(x)+W(text).x,10000);
X }
X break;
X
X case C_FF: /* form feed */
X CLEAR(text,W(background));
X W(x)=0;
X W(y)=fsizehigh;
X#ifdef CUT
X W(flags) |= W_SNARFABLE;
X#endif
X if (Do_clip())
X Set_all();
X done++;
X break;
X
X case C_BELL: /* ring the bell */
X bell_on();
X if (!bell++) {
X CLEAR(W(window),BIT_NOT(BIT_DST));
X CLEAR(W(window),BIT_NOT(BIT_DST));
X }
X break;
X
X case C_TAB: /* tab */
X W(x) = ((W(x)/fsizewide +8)& ~ 7) * fsizewide;
X if (W(x)+fsizewide >= T_WIDE) {
X W(x)=0;
X if (W(y)+fsizehigh > T_HIGH) {
X scroll(win,text,0,T_HIGH,fsizehigh,W(background));
X done++;
X }
X else
X W(y) += fsizehigh;
X }
X break;
X
X case C_RETURN: /* return */
X if (Do_clip()) {
X Set_cliphigh(W(x)+W(text).x + fsizewide,0);
X Set_cliplow(W(text).x,10000);
X }
X W(x)=0;
X break;
X
X case C_NL: /* line feed */
X if (W(y)+fsizehigh > T_HIGH) {
X scroll(win,text,0,T_HIGH,fsizehigh,W(background));
X done++;
X }
X else
X W(y) += fsizehigh;
X break;
X default: /* print a character */
X/*
X while (W(y) > T_HIGH) {
X W(y) -= fsizehigh;
X scroll(win,text,0,T_HIGH,fsizehigh,W(background));
X done++;
X }
X*/
X PUT_CHAR(text,W(x),W(y),W(font),W(style),c);
X
X W(x) += fsizewide;
X if (W(x)+fsizewide > T_WIDE && !(W(flags)&W_NOWRAP)) {
X if (Do_clip()) {
X Set_cliphigh(W(x)+W(text).x + fsizewide,0);
X Set_cliplow(W(text).x,10000);
X }
X W(x)=0;
X W(y) += fsizehigh;
X if (W(y) > T_HIGH) {
X W(y) -= fsizehigh;
X scroll(win,text,0,T_HIGH,fsizehigh,W(background));
X done++;
X }
X }
X break;
X }
X break;
X }
X
X if (Do_clip())
X Set_cliphigh(W(x)+W(text).x+fsizewide,W(y)+W(text).y);
X
X cursor_on();
X
X MOUSE_ON(mousex,mousey);
X
X if (text != window) /* this is probably wrong */
X bit_destroy(text);
X if (sub_window) {
X bit_destroy(window);
X }
X
X if (W(flags)&W_BACKGROUND && !(W(flags)&W_ACTIVE))
X update(win, &clip);
X return(indx);
X }
X
X
Xstatic
Xstandout( win )
Xregister WINDOW *win;
X{
X int cnt;
X
X if (W(flags)&W_STANDOUT)
X return;
X#ifdef COLOR
X cnt = W(style);
X W(style) = W(background);
X W(background) = cnt;
X#else
X
X if (W(flags)&W_OVER)
X W(style) = ROP_INVERT(W(style));
X else
X W(style) = W(flags)&W_REVERSE ? BIT_SRC : BIT_NOT(BIT_SRC);
X#endif
X W(flags) |= W_STANDOUT;
X}
X
X
Xstatic
Xstandend( win )
Xregister WINDOW *win;
X{
X int cnt;
X
X if (!(W(flags)&W_STANDOUT))
X return;
X#ifdef COLOR
X cnt = W(style);
X W(style) = W(background);
X W(background) = cnt;
X#else
X
X if (W(flags)&W_OVER)
X W(style) = ROP_INVERT(W(style));
X else
X W(style) = W(flags)&W_REVERSE ? BIT_NOT(BIT_SRC) : BIT_SRC;
X#endif
X W(flags) &= ~ W_STANDOUT;
X}
END_OF_FILE
# end of 'src/put_window.c'
fi
echo shar: End of archive 61 \(of 61\).
cp /dev/null ark61isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 \
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 \
55 56 57 58 59 60 61 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 61 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0