home *** CD-ROM | disk | FTP | other *** search
- 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
-