Annotation of 43BSD/contrib/emacs/src/xterm.c, revision 1.1

1.1     ! root        1: /* X Communication module for terminals which understand the X protocol.
        !             2:    Copyright (C) 1985 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU Emacs.
        !             5: 
        !             6: GNU Emacs is distributed in the hope that it will be useful,
        !             7: but WITHOUT ANY WARRANTY.  No author or distributor
        !             8: accepts responsibility to anyone for the consequences of using it
        !             9: or for whether it serves any particular purpose or works at all,
        !            10: unless he says so in writing.  Refer to the GNU Emacs General Public
        !            11: License for full details.
        !            12: 
        !            13: Everyone is granted permission to copy, modify and redistribute
        !            14: GNU Emacs, but only under the conditions described in the
        !            15: GNU Emacs General Public License.   A copy of this license is
        !            16: supposed to have been given to you along with GNU Emacs so you
        !            17: can know your rights and responsibilities.  It should be in a
        !            18: file named COPYING.  Among other things, the copyright notice
        !            19: and this notice must be preserved on all copies.  */
        !            20: 
        !            21: /* Written by Yakim Martillo.  */
        !            22: 
        !            23: /*
        !            24:  *     $Source: /u1/third_party/gnuemacs.v17/src/RCS/xterm.c,v $
        !            25:  *     $Author: rlk $
        !            26:  *     $Locker:  $
        !            27:  *     $Header: xterm.c,v 1.13 86/02/17 12:24:48 rlk Exp $
        !            28:  */
        !            29: 
        !            30: #ifndef lint
        !            31: static char *rcsid_TrmXTERM_c = "$Header: xterm.c,v 1.13 86/02/17 12:24:48 rlk Exp $";
        !            32: #endif lint
        !            33: 
        !            34: #include "config.h"
        !            35: 
        !            36: /* This includes sys/types.h, and that somehow loses
        !            37:    if this is not done before the other system files.  */
        !            38: #include "xterm.h"
        !            39: 
        !            40: #include <sys/time.h>
        !            41: #include <sys/ioctl.h>
        !            42: #include <stdio.h>
        !            43: #include <ctype.h>
        !            44: #include <errno.h>
        !            45: #include <signal.h>
        !            46: #include <strings.h>
        !            47: #include <sys/stat.h>
        !            48: 
        !            49: #include "dispextern.h"
        !            50: #include "termhooks.h"
        !            51: #include "termopts.h"
        !            52: #include "termchar.h"
        !            53: #include "sink.h"
        !            54: #include "sinkmask.h"
        !            55: /*#include <X/Xproto.h>        */
        !            56: 
        !            57: #define min(a,b) ((a)<(b) ? (a) : (b))
        !            58: #define sigunblockx(sig) sigblock (0)
        !            59: #define sigblockx(sig) sigblock (1 << ((sig) - 1))
        !            60: XREPBUFFER Xxrepbuffer;
        !            61: int pixelwidth;
        !            62: int pixelheight;
        !            63: int PendingExposure;
        !            64: int PendingIconExposure;
        !            65: #define MAXICID 80
        !            66: char iconidentity[MAXICID];
        !            67: #define ICONTAG "emacs@"
        !            68: #define METABIT 0x80
        !            69: Window XXIconWindow;
        !            70: Bitmap XXIconMask;
        !            71: 
        !            72: char *XXcurrentfont;
        !            73: char *default_window;
        !            74: int informflag;
        !            75: extern struct display_line *DesiredScreen[], *PhysScreen[];
        !            76: extern int initialized;
        !            77: int XXdebug;
        !            78: int XXpid;
        !            79: extern int screen_garbaged;
        !            80: int XXxoffset, XXyoffset;
        !            81: int IconWindow;
        !            82: 
        !            83: int WindowMapped;
        !            84: int CurHL;
        !            85: 
        !            86: static int flexlines;          /* last line affect by dellines or */
        !            87:                                /* inslines functions */
        !            88: extern int errno;
        !            89: int VisibleX, VisibleY;        /* genuine location of cursor on screen */
        !            90:                                /* if it is there */
        !            91: static int SavedX, SavedY;     /* Where the cursor was before update */
        !            92:                                /* started */
        !            93: 
        !            94: int bitblt;            /* Used to track bit blt events */
        !            95: int CursorExists;      /* during updates cursor is turned off */
        !            96: static int InUpdate;           /* many of functions here may be invoked */
        !            97:                                /* even if no update in progress, when */
        !            98:                                /* no update is in progress the action */
        !            99:                                /* can be slightly different */
        !           100: char MouseCursor[33] ="\000\000\002\000\006\000\016\000\036\000\076\000\
        !           101: \176\000\376\000\376\001\076\000\066\000\142\000\140\000\300\000\300\000\000\
        !           102: \000";
        !           103: 
        !           104: char MouseMask[33] = "\003\000\007\000\017\000\037\000\077\000\177\000\
        !           105: \377\000\377\001\377\003\377\003\177\000\367\000\363\000\340\001\340\001\
        !           106: \300\000";
        !           107: 
        !           108: Display *XXdisplay;
        !           109: FontInfo *fontinfo;
        !           110: Window XXwindow;
        !           111: Cursor EmacsCursor;
        !           112: 
        !           113: char *fore_color;      /* Variables to store colors */
        !           114: char *back_color;
        !           115: char *brdr_color;
        !           116: char *curs_color;
        !           117: char *mous_color;
        !           118: 
        !           119: int fore;
        !           120: int back;
        !           121: int brdr;
        !           122: int curs;
        !           123: int mous;
        !           124: 
        !           125: static WindowInfo windowinfo;
        !           126: WindowInfo rootwindowinfo;
        !           127: 
        !           128: 
        !           129: 
        !           130: static XEvent XXEvent;         /* as X messages are read in they are */
        !           131:                                 /* stored here */
        !           132: static XREPBUFFER XXqueue;/* Used for storing up ExposeRegion */
        !           133:                                /* replies, so that the SIGIO inter- */
        !           134:                                /* rupt serving routines do almost */
        !           135:                                /* no writes to the X socket */
        !           136: /*int CurHL;                   /* Current Highlighting actually being */
        !           137:                                /* being used for bold font right now*/
        !           138: 
        !           139: int XXborder;
        !           140: 
        !           141: 
        !           142: extern Display *XOpenDisplay ();
        !           143: extern Window XCreateWindow ();
        !           144: extern Cursor XDefineCursor ();
        !           145: extern Cursor XCreateCursor ();
        !           146: extern FontInfo *XOpenFont ();
        !           147: 
        !           148: 
        !           149: /* HLmode -- Changes the GX function for output strings.  Could be used to
        !           150:  * change font.  Check an XText library function call. 
        !           151:  */
        !           152: 
        !           153: static
        !           154: HLmode (new)
        !           155:      int new;
        !           156: {
        !           157:   CurHL =  new;
        !           158: }
        !           159: 
        !           160: 
        !           161: /* External interface to control of standout mode.
        !           162:    Call this when about to modify line at position VPOS
        !           163:    and not change whether it is highlighted.  */
        !           164: 
        !           165: XTreassert_line_highlight (highlight, vpos)
        !           166:      int highlight, vpos;
        !           167: {
        !           168:   HLmode (highlight);
        !           169: }
        !           170: 
        !           171: /* Call this when about to modify line at position VPOS
        !           172:    and change whether it is highlighted.  */
        !           173: 
        !           174: static
        !           175: XTchange_line_highlight (new_highlight, vpos, first_unused_hpos)
        !           176:      int new_highlight, vpos, first_unused_hpos;
        !           177: {
        !           178:   HLmode (new_highlight);
        !           179:   XTtopos (vpos, 0);
        !           180:   XTclear_end_of_line (0);
        !           181: }
        !           182: 
        !           183: 
        !           184: /* Used for starting or restarting (after suspension) the X window.  Puts the
        !           185:  * cursor in a known place, update does not begin with this routine but only
        !           186:  * with a call to DoDsp.  The mouse cursor is warped into the window and then
        !           187:  * the cursor is turned on.
        !           188:  */
        !           189: 
        !           190: 
        !           191: 
        !           192: static
        !           193: XTset_terminal_modes ()
        !           194: {
        !           195:   int stuffpending;
        !           196: #ifdef XDEBUG
        !           197:   fprintf (stderr, "XTset_terminal_modes\n");
        !           198: #endif
        !           199:   InUpdate = 0;
        !           200:   stuffpending = 0;
        !           201:   if (!initialized)
        !           202:     {
        !           203:       CursorExists = 0;
        !           204:       VisibleX = 0;
        !           205:       VisibleY = 0;
        !           206:     }
        !           207:   XTclear_screen ();
        !           208:   ioctl (0, FIONREAD, &stuffpending);
        !           209:   if (stuffpending)
        !           210:     kill (XXpid, SIGIO);
        !           211: }
        !           212: 
        !           213: /* XTtopos moves the cursor to the correct location and checks whether an update
        !           214:  * is in progress in order to toggle it on.
        !           215:  */
        !           216: 
        !           217: static
        !           218: XTtopos (row, col)
        !           219:      register int row, col;
        !           220: {
        !           221: #ifdef XDEBUG
        !           222:   fprintf (stderr, "XTtopos\n");
        !           223: #endif
        !           224:   cursX = col;
        !           225:   cursY = row;
        !           226:   if (InUpdate)
        !           227:     {
        !           228:       if (CursorExists)
        !           229:        {
        !           230:          CursorToggle ();
        !           231:        }
        !           232:       return;          /* Generally, XTtopos will be invoked */
        !           233:       /* when InUpdate with !CursorExists */
        !           234:       /* so that wasteful XFlush is not called */
        !           235:     }
        !           236:   if ((row == VisibleY) && (col == VisibleX))
        !           237:     {
        !           238:       if (!CursorExists)
        !           239:        {
        !           240:          CursorToggle ();
        !           241:        }
        !           242:       XFlush ();
        !           243:       return;
        !           244:     }
        !           245:   if (CursorExists) CursorToggle ();
        !           246:   VisibleX = col;
        !           247:   VisibleY = row;
        !           248:   if (!CursorExists) CursorToggle ();
        !           249:   XFlush ();
        !           250: }
        !           251: 
        !           252: /* Used to get the terminal back to a known state after resets.  Usually
        !           253:  * used when restarting suspended or waiting emacs
        !           254:  */
        !           255: 
        !           256: static
        !           257: cleanup ()
        !           258: {
        !           259:   inverse_video = 0;
        !           260:   HLmode (0);
        !           261: }
        !           262: 
        !           263: /* wipes out numcols columns starting a current column on the current line */
        !           264:   
        !           265: static
        !           266: XTclear_end_of_line (first_blank)
        !           267:      register int first_blank;
        !           268: {
        !           269:   register int numcols;
        !           270: 
        !           271: #ifdef XDEBUG
        !           272:   fprintf (stderr, "XTclear_end_of_line\n");
        !           273: 
        !           274: #endif
        !           275:   if (cursY < 0 || cursY >= screen_height)
        !           276:     return;
        !           277:   if (first_blank >= screen_width)
        !           278:     return;
        !           279: 
        !           280:   if (first_blank < 0)
        !           281:     first_blank = 0;
        !           282:   numcols = screen_width - first_blank;
        !           283:   if (cursY == VisibleY && VisibleX >= first_blank)
        !           284:     {
        !           285:       if (CursorExists) CursorToggle ();
        !           286:     }
        !           287:   XPixSet (XXwindow, 
        !           288:           first_blank * fontinfo->width, 
        !           289:           cursY * fontinfo->height, 
        !           290:           fontinfo->width * numcols,
        !           291:           fontinfo->height,
        !           292:           back);
        !           293:   XTtopos (cursY, first_blank);
        !           294: }
        !           295: 
        !           296: static
        !           297: XTreset_terminal_modes ()
        !           298: {
        !           299: #ifdef XDEBUG
        !           300:   fprintf (stderr, "XTreset_terminal_modes\n");
        !           301: #endif
        !           302:   XTclear_screen ();
        !           303: }
        !           304: 
        !           305: static
        !           306: XTclear_screen ()
        !           307: {
        !           308: #ifdef XDEBUG
        !           309:   fprintf (stderr, "XTclear_screen\n");
        !           310: #endif
        !           311:   HLmode (0);
        !           312:   CursorExists = 0;
        !           313:   
        !           314:   cursX = 0;
        !           315:   cursY = 0;
        !           316:   SavedX = 0;
        !           317:   SavedY = 0;
        !           318:   VisibleX = 0;
        !           319:   VisibleY = 0;
        !           320:   XClear (XXwindow);
        !           321:   CursorToggle ();
        !           322:   if (!InUpdate)
        !           323:     XFlush ();
        !           324: }
        !           325: 
        !           326: /* used by dumprectangle which is usually invoked upon ExposeRegion
        !           327:  * events which come from bit blt's or moving an obscuring opaque window
        !           328:  */
        !           329: 
        !           330: static
        !           331: dumpchars (ActiveScreen, numcols, tempX, tempY, tempHL)
        !           332:      register struct display_line **ActiveScreen;
        !           333:      register int numcols;
        !           334:      register int tempX, tempY, tempHL;
        !           335: {
        !           336:   if (numcols <= 0) return;
        !           337:   if (((numcols - 1) + tempX) > screen_width)
        !           338:     {
        !           339:       numcols = (screen_width - tempX) + 1;
        !           340:     }
        !           341:   if ((tempX < 0) || (tempX >= screen_width) ||
        !           342:       (tempY < 0) || (tempY >= screen_height))
        !           343:     {
        !           344:       return;
        !           345:     }
        !           346:   XText (XXwindow,
        !           347:         (tempX * fontinfo->width),
        !           348:         (tempY * fontinfo->height),
        !           349:         &ActiveScreen[tempY + 1]->body[tempX],
        !           350:         numcols,
        !           351:         fontinfo->id,
        !           352:         (tempHL ? back : fore),
        !           353:         (tempHL ? fore : back));
        !           354: }
        !           355: 
        !           356: /* When a line has been changed this function is called.  X is so fast
        !           357:  * that the actual sequence is ignore.  Rather, the new version of the
        !           358:  * line is simply output if this function is invoked while in UpDate.
        !           359:  * Sometimes writechars can be invoked when not in update if text is to
        !           360:  * be output at the end of the line.  In this case the whole line is not
        !           361:  * output.  Simply the new text at the current cursor position given
        !           362:  * by VisibleX,Y.  The cursor is moved to the end of the new text.
        !           363:  */
        !           364: static
        !           365: writechars (start, end)
        !           366:      register char *start, *end;
        !           367: {
        !           368:   register int temp_length;
        !           369: 
        !           370:   if ((cursY < 0) || (cursY >= screen_height))
        !           371:     {
        !           372:       return;
        !           373:     }
        !           374:   if (CursorExists)
        !           375:     {
        !           376:       CursorToggle ();
        !           377:     }
        !           378:   if (InUpdate)
        !           379:     {
        !           380:       if (DesiredScreen && DesiredScreen[cursY + 1])
        !           381:        {
        !           382:          temp_length = DesiredScreen[cursY + 1]->length;
        !           383:        }
        !           384:       else
        !           385:        temp_length = 0;
        !           386:       if (temp_length > 0)
        !           387:        {
        !           388:          XText (XXwindow,
        !           389:                 0,
        !           390:                 (cursY * fontinfo->height),
        !           391:                 &DesiredScreen[cursY + 1]->body[0],
        !           392:                 temp_length,
        !           393:                 fontinfo->id,
        !           394:                 (CurHL ? back : fore),
        !           395:                 (CurHL ? fore : back));
        !           396:          if (temp_length < screen_width)
        !           397:            {
        !           398:              XTclear_end_of_line (temp_length);
        !           399:            }
        !           400:          XTtopos (cursY, temp_length);
        !           401:        }
        !           402:       else
        !           403:        {
        !           404:          XTclear_end_of_line (0);
        !           405:          XTtopos (cursY, 0);
        !           406:        }
        !           407:     }
        !           408:   else
        !           409:     {
        !           410:       if ((VisibleX < 0) || (VisibleX >= screen_width))
        !           411:        {
        !           412:          return;
        !           413:        }
        !           414:       if ((VisibleY < 0) || (VisibleY >= screen_height))
        !           415:        {
        !           416:          return;
        !           417:        }
        !           418:       if (((end - start) + VisibleX) >= screen_width)
        !           419:        {
        !           420:          end = start + (screen_width - (VisibleX + 1));
        !           421:        }
        !           422:       if(end >= start)
        !           423:        {
        !           424:           XText (XXwindow,
        !           425:                 (VisibleX * fontinfo->width),
        !           426:                 (VisibleY * fontinfo->height),
        !           427:                 start,
        !           428:                 ((end - start) + 1),
        !           429:                 fontinfo->id,
        !           430:                 (CurHL ? back : fore),
        !           431:                 (CurHL ? fore : back));
        !           432:          VisibleX = VisibleX + (end - start) + 1;
        !           433:        }
        !           434:       if (!CursorExists) CursorToggle ();
        !           435:     }
        !           436: }
        !           437: 
        !           438: 
        !           439: static 
        !           440: XTwrite_chars (start, len)
        !           441:      register char *start;
        !           442:      register int len;
        !           443: {
        !           444: #ifdef XDEBUG
        !           445:   fprintf (stderr, "XTwrite_chars\n");
        !           446: #endif
        !           447:   writechars (start, start + len - 1);
        !           448: }
        !           449: 
        !           450: /* The following routine is for the deaf or for the pervert who prefers 
        !           451:  * that his terminal flashes at him rather than beep at him.
        !           452:  */
        !           453: 
        !           454: static int flashedback;
        !           455: 
        !           456: static
        !           457: XTflash ()
        !           458: {
        !           459:   struct itimerval itimer;
        !           460:   extern int flashback ();
        !           461: 
        !           462: #ifdef XDEBUG
        !           463:   fprintf (stderr, "XTflash\n");
        !           464: #endif
        !           465: 
        !           466:   signal (SIGALRM, flashback);
        !           467:   getitimer (ITIMER_REAL, &itimer);
        !           468:   itimer.it_value.tv_usec += 250000;
        !           469:   itimer.it_interval.tv_sec = 0;
        !           470:   itimer.it_interval.tv_usec = 0;
        !           471:   flashedback = 0;
        !           472:   setitimer (ITIMER_REAL, &itimer, 0);
        !           473:   XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width,
        !           474:            screen_height * fontinfo->height, WhitePixel, ClipModeClipped,
        !           475:            GXinvert, AllPlanes);
        !           476:   XFlush ();
        !           477:   while (!flashedback) pause ();
        !           478: }
        !           479: 
        !           480: static
        !           481: flashback ()
        !           482: {
        !           483:   signal (SIGALRM, SIG_IGN);
        !           484:   XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width,
        !           485:            screen_height * fontinfo->height, WhitePixel, ClipModeClipped,
        !           486:            GXinvert, AllPlanes);
        !           487:   XFlush ();
        !           488:   flashedback = 1;
        !           489: }      
        !           490: 
        !           491: /* A kludge to get a bell */
        !           492: 
        !           493: static
        !           494: XTfeep ()
        !           495: {
        !           496: #ifdef XDEBUG
        !           497:   fprintf (stderr, "XTfeep\n");
        !           498: #endif
        !           499:   XFeep (0);
        !           500: }
        !           501: 
        !           502: /* Artificially creating a cursor is hard, the actual position on the
        !           503:  * screen (either where it is or last was) is tracked with VisibleX,Y.
        !           504:  * Gnu Emacs code tends to assume a cursor exists in hardward at cursX,Y
        !           505:  * and that output text will appear there.  During updates, the cursor is
        !           506:  * supposed to be blinked out and will only reappear after the update 
        !           507:  * finishes.
        !           508:  */
        !           509: 
        !           510: CursorToggle ()
        !           511: {
        !           512:   register struct display_line **ActiveScreen;
        !           513:   if (!WindowMapped) 
        !           514:     {
        !           515:       CursorExists = 0;
        !           516:       return 0;
        !           517:     }
        !           518:   if ((VisibleX < 0) || (VisibleX >= screen_width) ||
        !           519:       (VisibleY < 0) || (VisibleY >= screen_height))
        !           520:     {                  /* Current Cursor position trash */
        !           521:       /* Not much can be done */
        !           522:       XFlush ();
        !           523:       CursorExists = 0;
        !           524:       return 0;        /* Currently the return values are not */
        !           525:       /* used, but I could anticipate using */
        !           526:       /* them in the future. */
        !           527:     }
        !           528:   /*  if(InUpdate && DesiredScreen)
        !           529:       ActiveScreen = DesiredScreen;
        !           530:       else*/
        !           531:   ActiveScreen = PhysScreen;
        !           532:   if (ActiveScreen && ActiveScreen[VisibleY + 1] &&
        !           533:       (VisibleX < ActiveScreen[VisibleY + 1]->length))
        !           534:     {
        !           535:       if (CursorExists)
        !           536:        {
        !           537:          XText (XXwindow,
        !           538:                 VisibleX * fontinfo->width,
        !           539:                 VisibleY * fontinfo->height,
        !           540:                 &ActiveScreen[VisibleY + 1]->body[VisibleX], 1, 
        !           541:                 fontinfo->id,
        !           542:                 fore, back);
        !           543:        }
        !           544:       else
        !           545:        {
        !           546:            XText (XXwindow,
        !           547:                   VisibleX * fontinfo->width,
        !           548:                   VisibleY * fontinfo->height,
        !           549:                   &ActiveScreen[VisibleY + 1]->body[VisibleX], 1, 
        !           550:                   fontinfo->id,
        !           551:                   back, curs);
        !           552:        }
        !           553:     }
        !           554:   else if (CursorExists)
        !           555:     {
        !           556:       XPixSet (XXwindow,
        !           557:               VisibleX * fontinfo->width,
        !           558:               VisibleY * fontinfo->height,
        !           559:               fontinfo->width, fontinfo->height, back);
        !           560:     }
        !           561:   else
        !           562:     {
        !           563:     XPixSet (XXwindow,
        !           564:             VisibleX * fontinfo->width,
        !           565:             VisibleY * fontinfo->height,
        !           566:             fontinfo->width, fontinfo->height, curs);
        !           567:     }
        !           568:   CursorExists = !CursorExists;/* Cursor has either been blinked in */
        !           569:      /* or out */
        !           570:   if (!InUpdate)
        !           571:     {
        !           572:       XFlush ();
        !           573:     }
        !           574:   return 1;
        !           575: }
        !           576: 
        !           577: /* This routine is used by routines which are called to paint regions */
        !           578: /* designated by ExposeRegion events.  If the cursor may be in the exposed */
        !           579: /* region, this routine makes sure it is gone so that dumprectangle can */
        !           580: /* toggle it back into existance if dumprectangle is invoked when not in */
        !           581: /* the midst of a screen update. */
        !           582: static 
        !           583: ClearCursor ()
        !           584: {
        !           585:   if (!WindowMapped)
        !           586:     {
        !           587:       CursorExists = 0;
        !           588:       return;
        !           589:     }
        !           590:   if ((VisibleX < 0) || (VisibleX >= screen_width)
        !           591:       || (VisibleY < 0) || (VisibleY >= screen_height))
        !           592:     {                  /* Current Cursor position trash */
        !           593:       /* Not much can be done */
        !           594:       CursorExists = 0;
        !           595:       return;
        !           596:     }
        !           597:   XPixSet (XXwindow,
        !           598:          VisibleX * fontinfo->width,
        !           599:          VisibleY * fontinfo->height,
        !           600:          fontinfo->width, fontinfo->height,
        !           601:          back);
        !           602:   CursorExists = 0;
        !           603: }
        !           604: 
        !           605: static
        !           606: XTupdate_begin ()
        !           607: {      
        !           608: #ifdef XDEBUG
        !           609:   fprintf (stderr, "XTupdate_begin\n");
        !           610: #endif
        !           611: 
        !           612:   InUpdate = 1;
        !           613:   if (CursorExists) 
        !           614:     {
        !           615:       CursorToggle ();
        !           616:     }
        !           617:   SavedX = cursX;              /* The initial"hardware" cursor position is */
        !           618:   /*  saved because that is where gnu emacs */
        !           619:   /*  expects the cursor to be at the end of*/
        !           620:   /* the update */
        !           621:   SavedY = cursY;
        !           622:   dumpqueue();
        !           623: }
        !           624: 
        !           625: 
        !           626: static
        !           627: XTupdate_end ()
        !           628: {      
        !           629: #ifdef XDEBUG
        !           630:   fprintf (stderr, "XTupdate_end\n");
        !           631: #endif
        !           632:   if (CursorExists)
        !           633:     CursorToggle ();
        !           634:   InUpdate = 0;
        !           635:   dumpqueue ();
        !           636:   XTtopos (SavedY, SavedX);    /* XTtopos invokes cursor toggle */
        !           637: }
        !           638: 
        !           639: /* Used for expose region and expose copy events.  Have to get the text
        !           640:  * back into the newly blank areas.
        !           641:  */
        !           642: 
        !           643: dumprectangle (top, left, rows, cols)
        !           644:      register int top, left, rows, cols;
        !           645: {
        !           646:   register struct display_line **ActiveScreen;
        !           647:   register int index;
        !           648:   int localX, localY, localHL;
        !           649:   rows += top;
        !           650:   cols += left;
        !           651:   top /= fontinfo->height;     /* Get row and col containing up and */
        !           652:   /* left borders of exposed region -- */
        !           653:   /* round down here*/
        !           654:   left /= fontinfo->width;
        !           655:   rows += (fontinfo->height - 1);
        !           656:   cols += (fontinfo->width - 1);
        !           657:   rows /= fontinfo->height;/* Get row and col containing bottom and */
        !           658:   /* right borders -- round up here */
        !           659:   rows -= top;
        !           660:   cols /= fontinfo->width;
        !           661:   cols -= left;
        !           662:   if (rows < 0) return;
        !           663:   if (cols < 0) return;
        !           664:   if (top > (screen_height - 1)) return;
        !           665:   if (left > (screen_width - 1)) return;
        !           666:   if ((VisibleX >= left) && (VisibleX < (left + cols)) &&
        !           667:       (VisibleY >= top) && (VisibleY < (top + rows)))
        !           668:     {
        !           669:       ClearCursor ();
        !           670:     }
        !           671:   if (InUpdate && DesiredScreen)
        !           672:     ActiveScreen = PhysScreen;
        !           673:   else if (PhysScreen)
        !           674:     ActiveScreen = PhysScreen;/* When cue is dumped in update this */
        !           675:   else
        !           676:     return;
        !           677:   /* should perhaps be DesiredScreen */
        !           678:   /* but PhysScreen is guaranteed to contain*/
        !           679:   /* date which was good for every line on */
        !           680:   /* screen. For desired screen only for */
        !           681:   /* lines which are changing.  Emacs does */
        !           682:   /* not consider a line within a newly */
        !           683:   /* exposed region necessarily to have */
        !           684:   /* been changed.  Emacs knows nothing */
        !           685:   /* about ExposeRegion events.*/
        !           686:   for (localY = top, index = 0;
        !           687:        (index < rows) && (localY < screen_height);
        !           688:        ++index, ++localY)
        !           689:     {
        !           690:       if ((localY < 0) || (localY >= screen_height)) continue;
        !           691:       if (!ActiveScreen[localY + 1]) continue;
        !           692:       if ((left + 1) > ActiveScreen[localY + 1]->length) continue;
        !           693:       localX = left;
        !           694:       localHL = ActiveScreen[localY + 1]->highlighted;
        !           695:       dumpchars (ActiveScreen,
        !           696:                 min (cols,
        !           697:                      ActiveScreen[localY + 1]->length
        !           698:                        - localX),
        !           699:                 localX, localY, localHL);
        !           700:     }
        !           701:   if (!InUpdate && !CursorExists) CursorToggle ();
        !           702:   /* Routine usually called */
        !           703:   /* when not in update */
        !           704: }
        !           705: 
        !           706: /* What sections of the window will be modified from the UpdateDisplay
        !           707:  * routine is totally under software control.  Any line with Y coordinate
        !           708:  * greater than flexlines will not change during an update.  This is really
        !           709:  * used only during dellines and inslines routines (scraplines and stufflines)
        !           710:  */
        !           711: static
        !           712: XTset_terminal_window (n)
        !           713:      register int n;
        !           714: {
        !           715: #ifdef XDEBUG
        !           716:   fprintf (stderr, "XTset_terminal_window\n");
        !           717: #endif
        !           718:   if ((n <= 0) || (n > screen_height))
        !           719:     flexlines = screen_height;
        !           720:   else
        !           721:     flexlines = n;
        !           722: }
        !           723: 
        !           724: XTins_del_lines (vpos, n)
        !           725:      int vpos, n;
        !           726: {
        !           727: #ifdef XDEBUG
        !           728:   fprintf (stderr, "XTins_del_lines\n");
        !           729: #endif
        !           730:   XTtopos (vpos, 0);
        !           731:   if (n >= 0) stufflines (n);
        !           732:   else scraplines (-n);
        !           733:                
        !           734: }
        !           735: 
        !           736: static 
        !           737: XTinsert_chars (start, len)
        !           738:      register char *start;
        !           739:      register int len;
        !           740: {
        !           741: #ifdef XDEBUG
        !           742:   fprintf (stderr, "XTinsert_chars\n");
        !           743: #endif
        !           744:   writechars (start, start + len - 1);
        !           745: }
        !           746: 
        !           747: static 
        !           748: XTdelete_chars (n)
        !           749:      register int n;
        !           750: {
        !           751:   char *msg = "***Delete Chars Called Outside of Update!!!***";
        !           752: #ifdef XDEBUG
        !           753:   fprintf (stderr, "XTdelete_chars\n");
        !           754: #endif
        !           755:   writechars (msg, msg + strlen (msg) - 1);
        !           756: }
        !           757: 
        !           758: static
        !           759: stufflines (n)
        !           760:      register int n;
        !           761: {
        !           762:   register int topregion, bottomregion;
        !           763:   register int length, newtop;
        !           764: 
        !           765:   if (cursY >= flexlines)
        !           766:     return;
        !           767:   
        !           768:   if (!WindowMapped)
        !           769:     {
        !           770:       bitblt = 0;
        !           771:       return;
        !           772:     }
        !           773:   if (CursorExists) CursorToggle ();
        !           774:   dumpqueue ();
        !           775:   topregion = cursY;
        !           776:   bottomregion = flexlines - (n + 1);
        !           777:   newtop = cursY + n;
        !           778:   length = (bottomregion - topregion) + 1;
        !           779:   if ((length > 0) && (newtop <= flexlines))
        !           780:     {
        !           781:       /* Should already have cleared */
        !           782:       /* queue of events associated */
        !           783:       /* with old bitblts */
        !           784:       XMoveArea (XXwindow, 0,
        !           785:                 topregion * fontinfo->height,
        !           786:                 0, newtop * fontinfo->height,
        !           787:                 screen_width * fontinfo->width,
        !           788:                 length * fontinfo->height);
        !           789:       if (WindowMapped)
        !           790:        bitblt = 1;
        !           791:       request_sigio ();
        !           792:       XFlush ();
        !           793:       while (bitblt) 
        !           794:        {
        !           795:          kill (XXpid, SIGIO);
        !           796:        }
        !           797:       unrequest_sigio ();
        !           798:       XFlush ();
        !           799:     }
        !           800:   newtop = min (newtop, (flexlines - 1));
        !           801:   length = newtop - topregion;
        !           802:   if (length > 0)
        !           803:     {
        !           804:       XPixSet (XXwindow,
        !           805:               0,
        !           806:               topregion * fontinfo->height,
        !           807:               screen_width * fontinfo->width,
        !           808:               n * fontinfo->height,
        !           809:               back);
        !           810:     }
        !           811:   /*  if (!InUpdate) CursorToggle (); */
        !           812: }
        !           813: 
        !           814: static
        !           815: scraplines (n)
        !           816:      register int n;
        !           817: {
        !           818:   if (!WindowMapped)
        !           819:     {
        !           820:       bitblt = 0;
        !           821:       return;
        !           822:     }
        !           823: 
        !           824:   if (cursY >= flexlines)
        !           825:     return;
        !           826:   if (CursorExists) CursorToggle ();
        !           827:   dumpqueue ();
        !           828:   if ((cursY + n) >= flexlines)
        !           829:     {
        !           830:       if (flexlines >= (cursY + 1))
        !           831:        {
        !           832:          XPixSet (XXwindow,
        !           833:                   0, cursY * fontinfo->height,
        !           834:                   screen_width * fontinfo->width,
        !           835:                   (flexlines - cursY) * fontinfo->height,
        !           836:                   back);
        !           837:        }
        !           838:     }
        !           839:   else
        !           840:     {
        !           841:       XMoveArea (XXwindow,
        !           842:                 0, (cursY + n) * fontinfo->height,
        !           843:                 0, cursY * fontinfo->height,
        !           844:                 screen_width * fontinfo->width,
        !           845:                 (flexlines - (cursY + n)) * fontinfo->height);
        !           846:       if (WindowMapped)
        !           847:        bitblt = 1;
        !           848:       request_sigio ();
        !           849:       XFlush ();
        !           850:       while (bitblt)
        !           851:        {
        !           852:          kill (XXpid, SIGIO);
        !           853:        }
        !           854:       unrequest_sigio ();
        !           855:       XFlush ();
        !           856:       XPixSet (XXwindow, 0, (flexlines - n) * fontinfo->height,
        !           857:               screen_width * fontinfo->width,
        !           858:               n * fontinfo->height, back);
        !           859:     }
        !           860:   /* if (!InUpdate) CursorToggle (); */
        !           861: }
        !           862:        
        !           863: /* Substitutes for standard read routine.  Under X not interested in individual
        !           864:  * bytes but rather individual packets.
        !           865:  */
        !           866: 
        !           867: XTread_socket (sd, bufp, numchars)
        !           868:      register int sd;
        !           869:      register char *bufp;
        !           870:      register int numchars;
        !           871: {
        !           872: 
        !           873:   int count;
        !           874:   int stuffpending;
        !           875:   int temp_width, temp_height;
        !           876: /*  typedef struct reply {XEvent event; struct reply *next} Reply;
        !           877:     Reply *replies = NULL;*/
        !           878: 
        !           879:   count = 0;
        !           880:   if (numchars <= 0)
        !           881:     {  /* To keep from overflowing read buffer */
        !           882:       numchars = 1;
        !           883:       --bufp;
        !           884:     }
        !           885:   while (bitblt || XPending () != 0)
        !           886:     {
        !           887:       /* while there are more events*/
        !           888:       XNextEvent (&XXEvent);
        !           889:       switch (XXEvent.type)
        !           890:        {
        !           891: /*     case X_Reply:
        !           892:        {
        !           893:        extern char *malloc();
        !           894:        Reply *reply = (Reply *) malloc (sizeof (Reply));
        !           895:        reply->next = replies;
        !           896:        reply->event = XXEvent;
        !           897:        replies = reply;
        !           898:        break;
        !           899:        }*/
        !           900:        default:
        !           901:          break;
        !           902:        case ExposeWindow:
        !           903:          if (((XExposeEvent *)&XXEvent)->window == XXIconWindow)
        !           904:            {
        !           905:              PendingIconExposure = 1;
        !           906:            }
        !           907:          else
        !           908:            PendingExposure = 1;/* No reason to repeat */
        !           909:          /* this if several */
        !           910:          /* ExposeWindow events */
        !           911:          /* come in quick succes-*/
        !           912:          /* ion */
        !           913:          break;
        !           914:        case ExposeRegion:
        !           915:          if (PendingExposure)
        !           916:            {   /* Don't bother with */
        !           917:              /* region events when */
        !           918:              /* full window event */
        !           919:              /* is pending */
        !           920:              break;
        !           921:            }
        !           922:          loadxrepbuffer (&XXEvent, &XXqueue);
        !           923:          if (XXqueue.rindex == XXqueue.windex)
        !           924:            {
        !           925:              PendingExposure = 1;
        !           926:            }
        !           927:          if ((XXqueue.rindex > XXqueue.mindex) ||
        !           928:              (XXqueue.windex > XXqueue.mindex) ||
        !           929:                (XXqueue.rindex < 0) ||
        !           930:                  (XXqueue.windex < 0))
        !           931:            {
        !           932:              PendingExposure = 1;
        !           933:            }
        !           934:          break;
        !           935:        case ExposeCopy:        /* For ExposeCopy sync */
        !           936:          /* will block all outgoing */
        !           937:          /* requests until this is */
        !           938:          /* decremented */
        !           939:          if (WindowMapped) bitblt = 0;
        !           940:          break;
        !           941:        case KeyPressed:
        !           942:          if (Input (((XKeyPressedEvent *) &XXEvent)->detail, bufp))
        !           943:            {
        !           944:              ++bufp;
        !           945:              ++count;
        !           946:              --numchars;
        !           947:            }
        !           948:          break;
        !           949:        case ButtonPressed:
        !           950:          switch (spacecheck (Xxrepbuffer.mindex, 
        !           951:                              Xxrepbuffer.rindex,
        !           952:                              Xxrepbuffer.windex, 0))
        !           953:            {
        !           954:            case 0:
        !           955:              loadxrepbuffer (&XXEvent,
        !           956:                              &Xxrepbuffer);
        !           957:              if (informflag)
        !           958:                {
        !           959:                  *bufp++ = (char) 003; /* C-c */
        !           960:                  ++count;
        !           961:                  --numchars;
        !           962:                  *bufp++ = (char) '\r';  /* C-m */
        !           963:                  ++count;
        !           964:                  --numchars;
        !           965:                }
        !           966:              break;
        !           967:            case -1:
        !           968:              break;
        !           969:            case -2:
        !           970:            default:
        !           971:              fixxrepbuffer ();
        !           972:              break;
        !           973:            }
        !           974:          break;
        !           975:        }
        !           976:     }
        !           977: /*  while (replies) {
        !           978:     Reply *reply = replies;
        !           979:     XPutBackEvent (&reply->event);
        !           980:     replies = reply->next;
        !           981:     free (reply);
        !           982:     }*/
        !           983:   if (count < 0)
        !           984:     count = 0;
        !           985:   if (CursorExists)
        !           986:     xfixscreen ();
        !           987:   return count;
        !           988: }
        !           989: 
        !           990: /* refresh bitmap kitchen sink icon */
        !           991: refreshicon ()
        !           992: {
        !           993:   if (XXIconWindow) 
        !           994:     XBitmapBitsPut (XXIconWindow, 0,  0, sink_width, sink_height,
        !           995:                    sink_bits, BlackPixel, WhitePixel, 
        !           996:                    XXIconMask, GXcopy, AllPlanes);
        !           997:   XFlush ();
        !           998: }
        !           999: 
        !          1000: XBitmapIcon () 
        !          1001: {
        !          1002:     if (!IconWindow)
        !          1003:       {
        !          1004:          XSetIconWindow (XXwindow,XXIconWindow);
        !          1005:          XSelectInput (XXIconWindow, ExposeWindow);
        !          1006:          IconWindow = !IconWindow;
        !          1007:       }
        !          1008: }
        !          1009: 
        !          1010: XTextIcon () 
        !          1011: {
        !          1012:     if (IconWindow)
        !          1013:       {
        !          1014:          XClearIconWindow (XXwindow);
        !          1015:          XSelectInput (XXIconWindow, NoEvent);
        !          1016:          IconWindow = !IconWindow;
        !          1017:       }
        !          1018: }
        !          1019: 
        !          1020: /* Interpreting incoming keycodes. Should have table modifiable as needed
        !          1021:  * from elisp.
        !          1022:  */
        !          1023: 
        !          1024: /* Exit gracefully from gnuemacs, doing an autosave and giving a status.
        !          1025:  */
        !          1026: 
        !          1027: XExitGracefully ()
        !          1028: {
        !          1029:   XAutoSave();
        !          1030:   exit(70);
        !          1031: }
        !          1032: 
        !          1033: xfixscreen ()
        !          1034: {
        !          1035:   register int temp_width, temp_height;
        !          1036:   register int (*func) ();
        !          1037:   register int temp_x, temp_y;
        !          1038:   dumpqueue ();
        !          1039:   func = signal (SIGIO, SIG_IGN);
        !          1040:   /* Check that the connection is in fact open.  This works by doing a nop */
        !          1041:   /* (well, almost) write operation.  If there is an XIOerror or a */
        !          1042:   /* SIGPIPE, exit gracefully.  This fixes the loop-on-logout bug.*/
        !          1043:   XIOErrorHandler (XExitGracefully);
        !          1044:   CursorToggle();
        !          1045:   CursorToggle();
        !          1046:   XFlush ();
        !          1047:   XIOErrorHandler (0);
        !          1048:   if (PendingIconExposure)
        !          1049:     {
        !          1050:       refreshicon ();
        !          1051:       PendingIconExposure = 0;
        !          1052:     }
        !          1053:   if (PendingExposure)
        !          1054:     {
        !          1055:       PendingExposure = 0;
        !          1056:       ClearCursor ();
        !          1057:       XXqueue.rindex = 0;
        !          1058:       XXqueue.windex = 0;
        !          1059:       XQueryWindow (XXwindow, &windowinfo); /* Dangerous to do */
        !          1060:       /* writes here but */
        !          1061:       /* otherwise would */
        !          1062:       /* have to alter */
        !          1063:       /* gnu emacs display */
        !          1064:       /* routines to query */
        !          1065:       /* when screen garbaged */
        !          1066:       temp_width = (windowinfo.width / fontinfo->width);
        !          1067:       temp_height = (windowinfo.height / fontinfo->height);
        !          1068:       if (temp_width != screen_width || temp_height != screen_height)
        !          1069:        change_screen_size (temp_height, temp_width);
        !          1070:       temp_x = windowinfo.x;
        !          1071:       temp_y = windowinfo.y;
        !          1072:       if (temp_x != XXxoffset || temp_y != XXyoffset)
        !          1073:        XSetOffset (temp_x, temp_y);
        !          1074:       dumprectangle (0, 0, screen_height * fontinfo->height,
        !          1075:                     screen_width * fontinfo->width);
        !          1076:     }
        !          1077:   if (!InUpdate)
        !          1078:     if (!CursorExists)
        !          1079:       CursorToggle ();
        !          1080:   (void) signal (SIGIO, func);
        !          1081: kill (XXpid, SIGIO);
        !          1082: }
        !          1083: 
        !          1084: 
        !          1085: static
        !          1086: Input (keycode, buffer)
        !          1087:      register int keycode;
        !          1088:      register char *buffer;
        !          1089: {
        !          1090:   register short c;
        !          1091:   register int offset;
        !          1092:   extern KeyMapEntry StdMap[];
        !          1093:   offset = KeyState (keycode); /* set SHIFT, CONTROL, META */
        !          1094:   c = StdMap [keycode & ValueMask] [offset];
        !          1095:   if ((keycode & ShiftLockMask) && (c >= 'a') && (c <= 'z'))
        !          1096:     {
        !          1097:       c += 'A' - 'a';
        !          1098:     }
        !          1099:   keycode &= ValueMask;        /* no longer need shift bits for anything */
        !          1100:   if (! (c & ~377))
        !          1101:     {
        !          1102:       *buffer = c;
        !          1103:       return 1;
        !          1104:     }
        !          1105:   switch (c)
        !          1106:     {
        !          1107: /*    case '\007':
        !          1108:       kill(XXpid, SIGINT);
        !          1109:       break;*/
        !          1110:     case KEYPAD:       
        !          1111:     case CURSOR:
        !          1112:       switch (keycode & ValueMask) 
        !          1113:        {
        !          1114:        case 0247:      /* left-arrow maps to C-B */
        !          1115:          c = 002 | ((keycode & MetaMask) ? METABIT : 0);
        !          1116:          *buffer = c;
        !          1117:          return(1);
        !          1118:        case 0250:      /* right-arrow maps to C-F */
        !          1119:          c = 006 | ((keycode & MetaMask) ? METABIT : 0);
        !          1120:          *buffer = c;
        !          1121:          return(1);
        !          1122:        case 0252:      /* up-arrow maps to C-P */
        !          1123:          c = 020 | ((keycode & MetaMask) ? METABIT : 0);
        !          1124:          *buffer = c;
        !          1125:          return(1);
        !          1126:        case 0251:      /* down-arrow maps to C-N */
        !          1127:          c = 016 | ((keycode & MetaMask) ? METABIT : 0);
        !          1128:          *buffer = c;
        !          1129:          return(1);
        !          1130:        default:
        !          1131:          return(0);
        !          1132:        }
        !          1133:     case PFX:
        !          1134:     case (short) -1:
        !          1135:     case SHFT:
        !          1136:     case CNTL:
        !          1137:     case SYMBOL:
        !          1138:     case LOCK:
        !          1139:     case FUNC1:
        !          1140:     case FUNC2:
        !          1141:     case FUNC3:
        !          1142:     case FUNC4:
        !          1143:     case FUNC5:
        !          1144:     case FUNC6:
        !          1145:     case FUNC7:
        !          1146:     case FUNC8:
        !          1147:     case FUNC9:
        !          1148:     case FUNC10:
        !          1149:     case FUNC11:
        !          1150:     case FUNC12:
        !          1151:     case FUNC13:
        !          1152:     case FUNC14:
        !          1153:     case FUNC15:
        !          1154:     case FUNC16:
        !          1155:     case FUNC17:
        !          1156:     case FUNC18:
        !          1157:     case FUNC19:
        !          1158:     case FUNC20:
        !          1159:     case E1:
        !          1160:     case E2:
        !          1161:     case E3:
        !          1162:     case E4:
        !          1163:     case E5:
        !          1164:     case E6:
        !          1165:       return 0;        
        !          1166:     default:
        !          1167:       *buffer = c;
        !          1168:       return 1;
        !          1169:     }
        !          1170: }
        !          1171: 
        !          1172: 
        !          1173: x_term_init ()
        !          1174: {
        !          1175:   register char *vardisplay;
        !          1176:   register char *colonpointer;
        !          1177:   register int status;
        !          1178:   extern char *getenv ();
        !          1179:   register int scratchindex;
        !          1180:   extern XTinterrupt_signal ();
        !          1181:   extern char *malloc ();
        !          1182: 
        !          1183:   vardisplay = getenv ("DISPLAY");
        !          1184:   if (!vardisplay)
        !          1185:     {
        !          1186:       fprintf (stderr, "DISPLAY environment variable must be set\n");
        !          1187:       exit (-200);
        !          1188:     }
        !          1189:   XXdisplay = XOpenDisplay (vardisplay);
        !          1190:   if (XXdisplay == (Display *) 0)
        !          1191:     {
        !          1192:       fprintf (stderr, "No X.\n");
        !          1193:       exit (-99);      
        !          1194:     }
        !          1195:   dup2 (dpyno (), 0);
        !          1196:   close (dpyno ());
        !          1197:   dpyno () = 0;                /* Looks a little strange? */
        !          1198:   /* check the def of the */
        !          1199:   /* macro, it is a genuine */
        !          1200:   /* lvalue */
        !          1201:   Xxrepbuffer.mindex = XREPBUFSIZE - 1;
        !          1202:   Xxrepbuffer.windex = 0;
        !          1203:   Xxrepbuffer.rindex = 0;
        !          1204:   XXqueue.mindex = XREPBUFSIZE - 1;
        !          1205:   XXqueue.windex = 0;
        !          1206:   XXqueue.rindex = 0;
        !          1207:   WindowMapped = 0;
        !          1208:   baud_rate = 9600;
        !          1209:   min_padding_speed = 10000;
        !          1210:   must_write_spaces = 1;
        !          1211:   informflag = 1;
        !          1212:   MetaFlag = 1;
        !          1213:   visible_bell = 1;
        !          1214:   interrupt_input = 1;
        !          1215:   inverse_video = 1;
        !          1216:   bitblt = 0;
        !          1217:   PendingExposure = 0;
        !          1218:   IconWindow = 0;
        !          1219: 
        !          1220:   fix_screen_hook = xfixscreen;
        !          1221:   clear_screen_hook = XTclear_screen;
        !          1222:   clear_end_of_line_hook = XTclear_end_of_line;
        !          1223:   ins_del_lines_hook = XTins_del_lines;
        !          1224:   change_line_highlight_hook = XTchange_line_highlight;
        !          1225:   insert_chars_hook = XTinsert_chars;
        !          1226:   write_chars_hook = XTwrite_chars;
        !          1227:   delete_chars_hook = XTdelete_chars;
        !          1228:   ring_bell_hook = XTfeep;
        !          1229:   reset_terminal_modes_hook = XTreset_terminal_modes;
        !          1230:   set_terminal_modes_hook = XTset_terminal_modes;
        !          1231:   update_begin_hook = XTupdate_begin;
        !          1232:   update_end_hook = XTupdate_end;
        !          1233:   set_terminal_window_hook = XTset_terminal_window;
        !          1234:   read_socket_hook = XTread_socket;
        !          1235:   topos_hook = XTtopos;
        !          1236:   /* raw_topos_hook = XTraw_topos;  */
        !          1237:   reassert_line_highlight_hook = XTreassert_line_highlight;
        !          1238:   scroll_region_ok = 1;        /* we'll scroll partial screens */
        !          1239:   char_ins_del_ok = 0;         /* just as fast to write the line */
        !          1240:   line_ins_del_ok = 1;         /* we'll just blt 'em */
        !          1241:   fast_clear_end_of_line = 1;  /* X does this well */
        !          1242:   memory_below_screen = 0;     /* we don't remember what scrolls 
        !          1243:                                   off the bottom */
        !          1244:   dont_calculate_costs = 1;
        !          1245: 
        !          1246:   fore = BlackPixel;
        !          1247:   back = WhitePixel;
        !          1248:   brdr = BlackPixel;
        !          1249:   mous = BlackPixel;
        !          1250:   curs = BlackPixel;
        !          1251: 
        !          1252:   fore_color = "black";
        !          1253:   back_color = "white";
        !          1254:   brdr_color = "black";
        !          1255:   mous_color = "black";
        !          1256:   curs_color = "black";
        !          1257: 
        !          1258:   XXpid = getpid ();
        !          1259:   XXcurrentfont = malloc (sizeof ("vtsingle") + 1);
        !          1260:   default_window = "=80x24+1+1";
        !          1261:   signal (SIGIO, XTread_socket);
        !          1262:   signal (SIGPIPE, XExitGracefully);
        !          1263:   if (XXcurrentfont == (char *) 0)
        !          1264:     {
        !          1265:       fprintf (stderr, "Memory allocation failure.\n");
        !          1266:       exit (-150);
        !          1267:     }
        !          1268:   strcpy (&XXcurrentfont[0], "vtsingle");
        !          1269:   XQueryWindow (RootWindow, &rootwindowinfo);
        !          1270:   strncpy (iconidentity, ICONTAG, MAXICID);
        !          1271:   XXborder = 1;
        !          1272:   screen_width = 80;
        !          1273:   screen_height = 66;
        !          1274:   XXxoffset = 0;
        !          1275:   XXyoffset = 0;
        !          1276:   XXdebug = 0;
        !          1277:   fontinfo = XOpenFont (&XXcurrentfont[0]);
        !          1278:   if (fontinfo == (FontInfo *) 0)
        !          1279:     {
        !          1280:       fprintf (stderr, "No font\n");
        !          1281:       exit (-98);
        !          1282:     }
        !          1283:   pixelwidth = screen_width * fontinfo->width + 1;
        !          1284:   pixelheight = screen_height * fontinfo->height + 1;
        !          1285:   XXwindow = XCreateWindow (RootWindow,
        !          1286:                            XXxoffset /* Absolute horizontal offset */,
        !          1287:                            XXyoffset /* Absolute Vertical offset */,
        !          1288:                            pixelwidth, pixelheight,
        !          1289:                            XXborder, BlackPixmap, WhitePixmap);
        !          1290:   if (!XXwindow)
        !          1291:     {
        !          1292:       fprintf (stderr, "Unable to create window.\n");
        !          1293:       exit (-97);
        !          1294:     }
        !          1295: 
        !          1296:   XXIconWindow = XCreateWindow (RootWindow, 0, 0, sink_width, sink_height,
        !          1297:                                2, WhitePixmap, (Pixmap) NULL);
        !          1298:   
        !          1299:   if (!XXIconWindow)
        !          1300:     {
        !          1301:       fprintf (stderr, "Unable to create icon window.\n");
        !          1302:       fflush (stderr);
        !          1303:       exit (-97);
        !          1304:     }
        !          1305:   XSelectInput (XXIconWindow, NoEvent);
        !          1306:   XXIconMask = XStoreBitmap(sink_mask_width, sink_mask_height, sink_mask_bits);
        !          1307: 
        !          1308:   XSelectInput (XXwindow, NoEvent);
        !          1309:   XSetResizeHint (XXwindow, fontinfo->width * 10, fontinfo->height *5, 
        !          1310:                  fontinfo->width, fontinfo->height);
        !          1311: 
        !          1312:   if (gethostname (&iconidentity[sizeof (ICONTAG) - 1],
        !          1313:                   (MAXICID - 1) - sizeof (ICONTAG)))
        !          1314:     {
        !          1315:       iconidentity[sizeof (ICONTAG) - 2] = '\0';
        !          1316:     }
        !          1317:   XStoreName (XXwindow, &iconidentity[0]);
        !          1318: 
        !          1319:   EmacsCursor = XCreateCursor (16, 16, MouseCursor, MouseMask,
        !          1320:                               0, 0, BlackPixel, WhitePixel, GXcopy);
        !          1321:   XDefineCursor (XXwindow, EmacsCursor);
        !          1322:   /* Dirty kluge so maybe things will work right */
        !          1323:   XBitmapIcon();
        !          1324:   XTextIcon();
        !          1325:   flexlines = screen_height;
        !          1326:   if (!initialized)
        !          1327:     XPopUpWindow ();
        !          1328:   setxterm ();
        !          1329: }
        !          1330: 
        !          1331: 
        !          1332: /* Process all queued ExposeRegion events. */
        !          1333: static
        !          1334: dumpqueue ()
        !          1335: {
        !          1336:   register int i;
        !          1337:   XExposeRegionEvent r;
        !          1338:   if ((XXqueue.rindex > XXqueue.mindex) ||
        !          1339:       (XXqueue.windex > XXqueue.mindex) ||
        !          1340:       (XXqueue.rindex < 0) ||
        !          1341:       (XXqueue.windex < 0))
        !          1342:     {
        !          1343:       PendingExposure = 1;
        !          1344:     }
        !          1345:   else
        !          1346:     while (XXqueue.rindex != XXqueue.windex)
        !          1347:       {
        !          1348:        if (CursorExists)
        !          1349:          CursorToggle ();
        !          1350:        unloadxrepbuffer (&r, &XXqueue);
        !          1351:        dumprectangle (r.y, r.x, r.height, r.width);
        !          1352:       }
        !          1353: }
        !          1354: 
        !          1355:                
        !          1356: 
        !          1357: XSetFlash ()
        !          1358: {
        !          1359:   ring_bell_hook = XTflash;
        !          1360: }
        !          1361: 
        !          1362: XSetFeep ()
        !          1363: {
        !          1364:   ring_bell_hook = XTfeep;
        !          1365: }
        !          1366: 
        !          1367: 
        !          1368: XNewFont (newname)
        !          1369:      register char *newname;
        !          1370: {
        !          1371:   FontInfo *temp;
        !          1372:   int (*func) ();
        !          1373:   func = signal (SIGIO, SIG_IGN);
        !          1374:   XFlush ();
        !          1375:   if (XXdebug)
        !          1376:     fprintf (stderr, "Request id is %d\n", XXdisplay->request);
        !          1377:   temp = XOpenFont (newname);
        !          1378:   if (temp == (FontInfo *) 0)
        !          1379:     {
        !          1380:       (void) signal (SIGIO, func);
        !          1381:       if (QLength () > 0)
        !          1382:        {
        !          1383:            kill (XXpid, SIGIO);
        !          1384:        }
        !          1385:       return -1;
        !          1386:     }
        !          1387:   XCloseFont (fontinfo);
        !          1388:   fontinfo = temp;
        !          1389:   (void) signal (SIGIO, func);
        !          1390:   XSetResizeHint (XXwindow, fontinfo->width * 10, fontinfo->height *5, 
        !          1391:                  fontinfo->width, fontinfo->height);
        !          1392:   XSetWindowSize (screen_height, screen_width);
        !          1393:   if (QLength () > 0)
        !          1394:     {
        !          1395:        kill (XXpid, SIGIO);
        !          1396:     }
        !          1397:   return 0;
        !          1398: }
        !          1399: 
        !          1400: XFlipColor ()
        !          1401: {
        !          1402:   Pixmap temp;
        !          1403:   int tempcolor;
        !          1404:   char *tempname;
        !          1405:   int (*func) ();
        !          1406:   Cursor temp_curs;
        !          1407:   CursorToggle ();
        !          1408:   func = signal (SIGIO, SIG_IGN);
        !          1409:   temp = XMakeTile(fore);
        !          1410:   XChangeBackground (XXwindow, temp);
        !          1411:   XFreePixmap (temp);
        !          1412:   temp = XMakeTile (back);
        !          1413:   if (XXborder)
        !          1414:     XChangeBorder (XXwindow, temp);
        !          1415:   XFreePixmap(temp);
        !          1416:   brdr = back;
        !          1417:   brdr_color = back_color;
        !          1418:   tempcolor = fore;
        !          1419:   fore = back;
        !          1420:   back = tempcolor;
        !          1421:   tempname = fore_color ;
        !          1422:   fore_color = back_color;
        !          1423:   back_color = tempname;
        !          1424: /*  XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width,
        !          1425:            screen_height * fontinfo->height, back, ClipModeClipped,
        !          1426:            GXcopy, AllPlanes);
        !          1427:   dumprectangle(0, 0, screen_height * fontinfo->height,
        !          1428:   screen_width * fontinfo -> width);*/
        !          1429:   XRedrawDisplay();
        !          1430:   if (curs == WhitePixel)
        !          1431:     {
        !          1432:        curs = BlackPixel;
        !          1433:        curs_color = "black";
        !          1434:     }
        !          1435:   else if (curs == BlackPixel)
        !          1436:     {
        !          1437:        curs = WhitePixel;
        !          1438:        curs_color = "white";
        !          1439:     }
        !          1440:   if (mous == WhitePixel)
        !          1441:     {
        !          1442:        mous = BlackPixel;
        !          1443:        mous_color = "black";
        !          1444:     }
        !          1445:   else if (mous == BlackPixel)
        !          1446:     {
        !          1447:        mous = WhitePixel;
        !          1448:        mous_color = "white";
        !          1449:     }
        !          1450:   temp_curs = XCreateCursor(16, 16, MouseCursor, MouseMask, 0, 0,
        !          1451:                            mous, back, GXcopy);
        !          1452:   XUndefineCursor (XXwindow);
        !          1453:   XDefineCursor (XXwindow, temp_curs);
        !          1454:   XFreeCursor (EmacsCursor);
        !          1455:   (void) signal (SIGIO, func);
        !          1456:   bcopy (&temp_curs, &EmacsCursor, sizeof (Cursor));
        !          1457:   CursorToggle ();
        !          1458:   XFlush ();
        !          1459: }
        !          1460: 
        !          1461: XSetOffset (xoff, yoff)
        !          1462:      register int xoff, yoff;
        !          1463: {
        !          1464:   if (xoff < 0)
        !          1465:     {
        !          1466:       XXxoffset = rootwindowinfo.width + (++xoff) - pixelwidth - 4;
        !          1467:     }
        !          1468:   else
        !          1469:     {
        !          1470:       XXxoffset = xoff;
        !          1471:     }
        !          1472:   if (yoff < 0)
        !          1473:     {
        !          1474:       XXyoffset
        !          1475:        = rootwindowinfo.height + (++yoff) - pixelheight - 4;
        !          1476:     }
        !          1477:   else
        !          1478:     {
        !          1479:       XXyoffset = yoff;
        !          1480:     }
        !          1481:   XMoveWindow (XXwindow, XXxoffset, XXyoffset);
        !          1482:   /* XWarpMouse (XXwindow, pixelwidth >> 1, pixelheight >> 1); */
        !          1483: }
        !          1484: 
        !          1485: XSetWindowSize (rows, cols)
        !          1486:      register int rows, cols;
        !          1487: {
        !          1488:   if (rows < 5) rows = 66;
        !          1489:   if (cols < 5) cols = 80;
        !          1490:   pixelwidth = cols * fontinfo->width + 1;
        !          1491:   pixelheight = rows * fontinfo->height + 1;
        !          1492:   XChangeWindow (XXwindow, pixelwidth, pixelheight);
        !          1493:   XFlush ();
        !          1494:   change_screen_size (rows, cols);
        !          1495:   PendingExposure = 0;
        !          1496: }
        !          1497: 
        !          1498: XPopUpWindow ()
        !          1499: {
        !          1500:     if (WindowMapped)
        !          1501:       return;
        !          1502:     if(!x_edges_specified)
        !          1503:       Fx_rubber_band ();
        !          1504:     bitblt = 0;
        !          1505:     CursorExists = 0;
        !          1506:     VisibleX = 0;
        !          1507:     VisibleY = 0;
        !          1508:     WindowMapped = 1;
        !          1509:     XMapWindow (XXwindow);
        !          1510:     dumprectangle (0, 0, screen_height * fontinfo->height,
        !          1511:                   screen_width * fontinfo->width);
        !          1512:     XSelectInput (XXwindow, KeyPressed | ExposeWindow |
        !          1513:                  ButtonPressed | ExposeRegion | ExposeCopy);
        !          1514:     /* XWarpMouse(XXwindow, pixelwidth >> 1, pixelheight >> 1);*/
        !          1515:     XTtopos (0, 0);
        !          1516: /*  XRedrawDisplay();*/
        !          1517:     XFlush ();
        !          1518: }
        !          1519: 
        !          1520: spacecheck (mindex, rindex, windex, minfreespace)
        !          1521:      register int mindex, rindex, windex, minfreespace;
        !          1522: {
        !          1523:   if ((rindex > mindex) || (windex > mindex))
        !          1524:     {
        !          1525:       fprintf (stderr, "Fatal Mouse Buffer Error.\n");
        !          1526:       fprintf (stderr, "%d = mindex, %d = rindex, %d = windex\n",
        !          1527:               mindex, rindex, windex);
        !          1528:       return -2;
        !          1529:     }
        !          1530:   if (windex >= rindex)
        !          1531:     {
        !          1532:       if ((mindex - (windex - rindex)) > minfreespace)
        !          1533:        return 0;
        !          1534:     }
        !          1535:   else
        !          1536:     {
        !          1537:       if (((rindex - windex) - 1) > minfreespace)
        !          1538:        return 0;
        !          1539:     }
        !          1540:   return -1;
        !          1541: }
        !          1542: 
        !          1543: loadxrepbuffer (p_xrep, p_buffer)
        !          1544:      register XEvent *p_xrep;
        !          1545:      register XREPBUFFER *p_buffer;
        !          1546: {
        !          1547:   p_buffer->xrep[p_buffer->windex] = *p_xrep;
        !          1548:   if (p_buffer->windex == p_buffer->mindex)
        !          1549:     p_buffer->windex = 0;
        !          1550:   else
        !          1551:     p_buffer->windex++;
        !          1552: }
        !          1553: 
        !          1554: unloadxrepbuffer (p_xrep, p_buffer)
        !          1555:      register XEvent *p_xrep;
        !          1556:      register XREPBUFFER *p_buffer;
        !          1557: {
        !          1558:   if (p_buffer->windex == p_buffer->rindex)
        !          1559:     return -1;
        !          1560:   *p_xrep = p_buffer->xrep[p_buffer->rindex];
        !          1561:   if (p_buffer->rindex == p_buffer->mindex)
        !          1562:     p_buffer->rindex = 0;
        !          1563:   else
        !          1564:     p_buffer->rindex++;
        !          1565:   return 0;
        !          1566: }
        !          1567: 
        !          1568: fixxrepbuffer ()
        !          1569: {
        !          1570:   Xxrepbuffer.mindex = XREPBUFSIZE - 1;
        !          1571:   Xxrepbuffer.windex = 0;
        !          1572:   Xxrepbuffer.rindex = 0;
        !          1573: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.