| --- configure.in.orig 2003-06-03 07:58:24.000000000 -0400 |
| +++ configure.in 2006-07-24 01:21:24.000000000 -0400 |
| @@ -1193,17 +1193,17 @@ |
| exit(0); /* libc version works properly. */ |
| }], AC_DEFINE(USEMEMCPY)) |
| |
| -AC_MSG_CHECKING(long file names) |
| -(echo 1 > /tmp/conftest9012345) 2>/dev/null |
| -(echo 2 > /tmp/conftest9012346) 2>/dev/null |
| -val=`cat /tmp/conftest9012345 2>/dev/null` |
| -if test -f /tmp/conftest9012345 && test "$val" = 1; then |
| -AC_MSG_RESULT(yes) |
| -else |
| -AC_MSG_RESULT(no) |
| -AC_DEFINE(NAME_MAX, 14) |
| -fi |
| -rm -f /tmp/conftest* |
| +#AC_MSG_CHECKING(long file names) |
| +#(echo 1 > /tmp/conftest9012345) 2>/dev/null |
| +#(echo 2 > /tmp/conftest9012346) 2>/dev/null |
| +#val=`cat /tmp/conftest9012345 2>/dev/null` |
| +#if test -f /tmp/conftest9012345 && test "$val" = 1; then |
| +#AC_MSG_RESULT(yes) |
| +#else |
| +#AC_MSG_RESULT(no) |
| +#AC_DEFINE(NAME_MAX, 14) |
| +#fi |
| +#rm -f /tmp/conftest* |
| |
| AC_MSG_CHECKING(for vsprintf) |
| AC_TRY_LINK(,[vsprintf(0,0,0);], AC_MSG_RESULT(yes);AC_DEFINE(USEVARARGS), AC_MSG_RESULT(no)) |
| --- Makefile.in.orig 2003-12-05 08:59:39.000000000 -0500 |
| +++ Makefile.in 2006-07-24 01:22:51.000000000 -0400 |
| @@ -46,7 +46,12 @@ |
| # -DDUMPSHADOW |
| # With shadow-pw screen would never dump core. Use this option if |
| # you still want to have a core. Use only for debugging. |
| -OPTIONS= |
| +# -DIPC_EXPORT_IMAGE |
| +# Allows an other program to get the screen content through shared mem |
| +# and ipc. This is used e.g. for braille and speech software. |
| + |
| +OPTIONS=-DIPC_EXPORT_IMAGE |
| +#OPTIONS= |
| #OPTIONS= -DDEBUG |
| |
| SHELL=/bin/sh |
| --- extern.h.orig 2003-08-22 08:27:57.000000000 -0400 |
| +++ extern.h 2006-08-09 11:35:42.000000000 -0400 |
| @@ -139,6 +139,15 @@ |
| extern void FreePseudowin __P((struct win *)); |
| #endif |
| extern void nwin_compose __P((struct NewWindow *, struct NewWindow *, struct NewWindow *)); |
| + |
| +#ifdef IPC_EXPORT_IMAGE |
| +extern void SetWinImage __P((const char *, unsigned char *)); |
| +extern void CopyWinImage __P((struct win *, unsigned char *)); |
| +extern int IsInputLayer __P((struct layer *)); |
| +extern int GetInputPosition __P((struct layer *)); |
| +extern void CopyInputLine __P((struct layer *, char *, int)); |
| +#endif /* IPC_EXPORT_IMAGE */ |
| + |
| extern int DoStartLog __P((struct win *, char *, int)); |
| extern int ReleaseAutoWritelock __P((struct display *, struct win *)); |
| extern int ObtainAutoWritelock __P((struct display *, struct win *)); |
| --- screen.h.orig 2003-08-22 08:28:43.000000000 -0400 |
| +++ screen.h 2006-07-24 02:04:06.000000000 -0400 |
| @@ -288,6 +288,10 @@ |
| int sym; /* symbol defined in ttydev.h */ |
| }; |
| |
| +#ifdef IPC_EXPORT_IMAGE |
| +extern unsigned char *shm; /* pointer to shared memory segment */ |
| +#endif |
| + |
| /* |
| * windowlist orders |
| */ |
| --- screen.c.orig 2003-09-08 10:26:41.000000000 -0400 |
| +++ screen.c 2006-07-25 10:55:24.000000000 -0400 |
| @@ -71,6 +71,14 @@ |
| #if (defined(AUX) || defined(_AUX_SOURCE)) && defined(POSIX) |
| # include <compat.h> |
| #endif |
| + |
| +#ifdef IPC_EXPORT_IMAGE |
| +# include <sys/ipc.h> |
| +# include <sys/shm.h> |
| +#endif |
| + |
| + |
| + |
| #if defined(USE_LOCALE) || defined(ENCODINGS) |
| # include <locale.h> |
| #endif |
| @@ -78,6 +86,11 @@ |
| # include <langinfo.h> |
| #endif |
| |
| +#ifdef IPC_EXPORT_IMAGE |
| +# include <sys/ipc.h> |
| +# include <sys/shm.h> |
| +#endif |
| + |
| #include "screen.h" |
| #ifdef HAVE_BRAILLE |
| # include "braille.h" |
| @@ -234,6 +247,12 @@ |
| |
| |
| |
| + |
| +#ifdef IPC_EXPORT_IMAGE |
| +unsigned char *shm; /* pointer to shared memory segment */ |
| +#endif |
| + |
| + |
| /* |
| * Do this last |
| */ |
| @@ -461,6 +480,40 @@ |
| zmodem_recvcmd = SaveStr("!!! rz -vv -b -E"); |
| #endif |
| |
| +#ifdef IPC_EXPORT_IMAGE |
| + { |
| + const char *path; |
| + key_t key; |
| + int shmid; |
| + |
| + /* allow for the header, text, attributes, and auxiliary data |
| + * (assuming no screen will be bigger than 132x66) |
| + */ |
| + size_t size = 18000; /* */ |
| + |
| + path = getenv("HOME"); |
| + if (!path || !*path) path = "/"; |
| + if ((key = ftok(path, 'b')) == -1) key = 0XBACD072F; |
| + |
| + shmid = shmget( key, size, IPC_CREAT | S_IRWXU ); |
| + if( shmid < 0 ) |
| + { |
| + Panic( errno, "shmget" ); |
| + /* NOTREACHED */ |
| + } |
| + |
| + shm = shmat( shmid, 0, 0); |
| + if ( shm == (void*)-1 ) |
| + { |
| + Panic( errno, "shmat" ); |
| + /* NOTREACHED */ |
| + } |
| + |
| + /* put valid data into the image */ |
| + SetWinImage( "screen is initializing...", shm ); |
| + } |
| +#endif |
| + |
| #ifdef COPY_PASTE |
| CompileKeys((char *)0, 0, mark_key_tab); |
| #endif |
| --- sched.c.orig 2003-09-08 10:26:36.000000000 -0400 |
| +++ sched.c 2006-07-24 01:33:39.000000000 -0400 |
| @@ -110,6 +110,10 @@ |
| return min; |
| } |
| |
| +#ifdef IPC_EXPORT_IMAGE |
| + extern struct win *windows; |
| +#endif |
| + |
| void |
| sched() |
| { |
| @@ -121,6 +125,11 @@ |
| |
| for (;;) |
| { |
| +#ifdef IPC_EXPORT_IMAGE |
| + /* export image from last used window which is on top of the list */ |
| + CopyWinImage( windows, shm ); |
| +#endif |
| + |
| if (calctimeout) |
| timeoutev = calctimo(); |
| if (timeoutev) |
| --- input.c.orig 2006-08-09 10:40:10.000000000 -0400 |
| +++ input.c 2006-08-09 11:42:39.000000000 -0400 |
| @@ -400,3 +400,49 @@ |
| return 0; |
| } |
| |
| +#ifdef IPC_EXPORT_IMAGE |
| +int |
| +IsInputLayer(l) |
| +struct layer *l; |
| +{ |
| + return l->l_layfn == &InpLf; |
| +} |
| + |
| +int |
| +GetInputPosition(l) |
| +struct layer *l; |
| +{ |
| + struct inpdata *inpdata = (struct inpdata *)l->l_data; |
| + return inpdata->inpstringlen + inpdata->inp.pos; |
| +} |
| + |
| +void |
| +CopyInputLine(l, dest, width) |
| +struct layer *l; |
| +char *dest; |
| +int width; |
| +{ |
| + struct inpdata *inpdata = (struct inpdata *)l->l_data; |
| + char *src; |
| + int len; |
| + |
| + for |
| + ( |
| + src = inpdata->inpstring, len = inpdata->inpstringlen; |
| + width && len; |
| + *dest++ = *src++, len--, width-- |
| + ); |
| + |
| + if( !(inpdata->inpmode & INP_NOECHO) ) |
| + { |
| + for |
| + ( |
| + src = inpdata->inp.buf, len = inpdata->inp.len; |
| + width && len; |
| + *dest++ = *src++, len--, width-- |
| + ); |
| + } |
| + |
| + while( width ) *dest++ = ' ', width--; |
| +} |
| +#endif /* IPC_EXPORT_IMAGE */ |
| --- window.c.orig 2003-12-05 08:45:41.000000000 -0500 |
| +++ window.c 2006-08-09 11:34:20.000000000 -0400 |
| @@ -1993,6 +1993,138 @@ |
| } |
| } |
| |
| + |
| +#ifdef IPC_EXPORT_IMAGE |
| + |
| +void |
| +SetWinImage( msg, dest ) |
| +const char *msg; |
| +unsigned char *dest; |
| +{ |
| + unsigned char *d = dest; |
| + |
| + *d++ = 80; /* screen width */ |
| + *d++ = 1; /* screen height */ |
| + *d++ = 0; /* cursor column */ |
| + *d++ = 0; /* cursor row */ |
| + |
| + { |
| + size_t count = dest[0] * dest[1]; |
| + |
| + memset( d, ' ', count ); |
| + strcpy( d, msg ); |
| + d[strlen(d)] = ' '; |
| + d += count; |
| + |
| + memset( d, 0X07, count ); |
| + d += count; |
| + } |
| + |
| + *d++ = 0; /* window number */ |
| + *d++ = 0; /* flags */ |
| +} |
| + |
| + |
| +void |
| +CopyWinImage( p, dest ) |
| +struct win *p; |
| +unsigned char *dest; |
| +{ |
| + register unsigned char *s, *d = dest, *m; |
| + register int x, y; |
| + struct display *display = p->w_lastdisp; |
| + int st = (display && D_status) ? 1 : 0; |
| + int in = IsInputLayer(p->w_savelayer) ? 1 : 0; |
| + |
| + if( p && p->w_mlines ) |
| + { |
| + *d++ = p->w_width; /* screen width */ |
| + *d++ = p->w_height + (st | in); /* screen height */ |
| + *d++ = st? D_status_len: /* cursor column */ |
| + in? GetInputPosition(p->w_savelayer): |
| + p->w_x; |
| + *d++ = (st || in)? p->w_height: p->w_y; /* cursor row */ |
| + |
| + /* copy window image to buffer */ |
| + for( y = 0; y < p->w_height; y++ ) |
| + { |
| + s = p->w_mlines[y].image; |
| + x = p->w_width; |
| + for( ; x; *d++ = *s++, x-- ); |
| + } |
| + |
| + /* copy status line to buffer */ |
| + if( st ) |
| + { |
| + s = D_status_lastmsg; |
| + x = p->w_width; |
| + for( ; *s && x; *d++ = *s++, x-- ); |
| + for( ; x; *d++ = ' ', x-- ); |
| + } |
| + else if (in) |
| + { |
| + CopyInputLine(p->w_savelayer, d, p->w_width); |
| + d += p->w_width; |
| + } |
| + |
| + /* copy attributes from window image to buffer */ |
| +#ifdef COLOR |
| + for( y = 0; y < p->w_height; y++ ) |
| + { |
| + struct mline *ml = &p->w_mlines[y]; |
| + x = 0; |
| + for( ; x<p->w_width; x++ ) |
| + { |
| + static const unsigned char tr[] = |
| + { |
| + 0X0, 0X4, 0X2, 0X6, 0X1, 0X5, 0X3, 0X7, |
| + 0X8, 0XC, 0XA, 0XE, 0X9, 0XD, 0XB, 0XF |
| + }; |
| + |
| + struct mchar mc; |
| + int fg; |
| + int bg; |
| + |
| + copy_mline2mchar( &mc, ml, x ); |
| + fg = rend_getfg(&mc); |
| + bg = rend_getbg(&mc); |
| + |
| + fg = fg? tr[coli2e(fg) & 0XF]: 0X7; |
| + bg = bg? tr[coli2e(bg) & 0XF]: 0X0; |
| + *d++ = fg | (bg << 4); |
| + } |
| + } |
| + |
| + if( st || in ) |
| + { |
| + memset(d, (st ? 0X70 : 0X07), p->w_width); |
| + d += p->w_width; |
| + } |
| +#else /* COLOR */ |
| + { |
| + int count = dest[0] * dest[1]; |
| + memset(d, 0X07, count); |
| + d += count; |
| + } |
| +#endif /* COLOR */ |
| + |
| + *d++ = p->w_number; /* window number */ |
| + |
| + *d = 0; /* flags */ |
| + if (p->w_cursorkeys) *d |= 0X01; /* cursor keys are in application mode */ |
| + if (p->w_keypad) *d |= 0X02; /* keypad is in application mode */ |
| + d++; |
| + } |
| + else |
| + { |
| + /* no window pointer */ |
| + SetWinImage( "no active scren", dest ); |
| + } |
| +} |
| + |
| +#endif /* IPC_EXPORT_IMAGE */ |
| + |
| + |
| #ifdef ZMODEM |
| |
| static int |