Annotation of 43BSDReno/contrib/emacs-18.55/src/xterm.c, revision 1.1.1.1

1.1       root        1: /* X Communication module for terminals which understand the X protocol.
                      2:    Copyright (C) 1985, 1986, 1987, 1988 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, mods and things by Robert Krawitz  */
                     22: 
                     23: /*
                     24:  *     $Source: /u2/third_party/gnuemacs.chow/src/RCS/xterm.c,v $
                     25:  *     $Author: rlk $
                     26:  *     $Locker:  $
                     27:  *     $Header: xterm.c,v 1.28 86/08/27 13:30:57 rlk Exp $
                     28:  */
                     29: 
                     30: #ifndef lint
                     31: static char *rcsid_TrmXTERM_c = "$Header: xterm.c,v 1.28 86/08/27 13:30:57 rlk Exp $";
                     32: #endif lint
                     33: 
                     34: /* On 4.3 this loses if it comes after xterm.h.  */
                     35: #include <signal.h>
                     36: #include "config.h"
                     37: 
                     38: #ifdef HAVE_X_WINDOWS
                     39: 
                     40: #include "lisp.h"
                     41: #undef NULL
                     42: 
                     43: /* This may include sys/types.h, and that somehow loses
                     44:    if this is not done before the other system files.  */
                     45: #include "xterm.h"
                     46: 
                     47: /* Load sys/types.h if not already loaded.
                     48:    In some systems loading it twice is suicidal.  */
                     49: #ifndef makedev
                     50: #include <sys/types.h>
                     51: #endif
                     52: 
                     53: #if !defined(USG) || defined(IBMRTAIX)
                     54: #include <sys/time.h>
                     55: #else
                     56: #include <time.h>
                     57: #endif /* USG and not IBMRTAIX */
                     58: 
                     59: #include <sys/ioctl.h>
                     60: #include <fcntl.h>
                     61: #include <stdio.h>
                     62: #include <ctype.h>
                     63: #include <errno.h>
                     64: #ifdef BSD
                     65: #include <strings.h>
                     66: #endif
                     67: #include <sys/stat.h>
                     68: 
                     69: #include "dispextern.h"
                     70: #include "termhooks.h"
                     71: #include "termopts.h"
                     72: #include "termchar.h"
                     73: #include "sink.h"
                     74: #include "sinkmask.h"
                     75: #include <X/Xkeyboard.h>
                     76: /*#include <X/Xproto.h>        */
                     77: 
                     78: /* Allow config to specify default font.  */
                     79: #ifndef X_DEFAULT_FONT
                     80: #define X_DEFAULT_FONT "vtsingle"
                     81: #endif
                     82: 
                     83: #define min(a,b) ((a)<(b) ? (a) : (b))
                     84: #define max(a,b) ((a)>(b) ? (a) : (b))
                     85: #define sigunblockx(sig) sigblock (0)
                     86: #define sigblockx(sig) sigblock (1 << ((sig) - 1))
                     87: XREPBUFFER Xxrepbuffer;
                     88: int pixelwidth;
                     89: int pixelheight;
                     90: int PendingExposure;
                     91: int PendingIconExposure;
                     92: #define MAXICID 80
                     93: char iconidentity[MAXICID];
                     94: #define ICONTAG "emacs@"
                     95: #define METABIT 0x80
                     96: Window XXIconWindow;
                     97: Bitmap XXIconMask;
                     98: 
                     99: char *XXcurrentfont;
                    100: char *default_window;
                    101: int informflag;
                    102: extern struct display_line *DesiredScreen[], *PhysScreen[];
                    103: extern int initialized;
                    104: 
                    105: extern char *alternate_display;
                    106: 
                    107: int XXdebug;
                    108: int XXpid;
                    109: extern int screen_garbaged;
                    110: int XXxoffset, XXyoffset;
                    111: int IconWindow;
                    112: 
                    113: int WindowMapped;
                    114: int CurHL;
                    115: 
                    116: static int flexlines;          /* last line affect by dellines or */
                    117:                                /* inslines functions */
                    118: extern int errno;
                    119: int VisibleX, VisibleY;        /* genuine location of cursor on screen */
                    120:                                /* if it is there */
                    121: static int SavedX, SavedY;     /* Where the cursor was before update */
                    122:                                /* started */
                    123: 
                    124: int bitblt;            /* Used to track bit blt events */
                    125: int CursorExists;      /* during updates cursor is turned off */
                    126: static int InUpdate;           /* many of functions here may be invoked */
                    127:                                /* even if no update in progress, when */
                    128:                                /* no update is in progress the action */
                    129:                                /* can be slightly different */
                    130: 
                    131: short MouseCursor[] = {
                    132:   0x0000, 0x0008, 0x0018, 0x0038,
                    133:   0x0078, 0x00f8, 0x01f8, 0x03f8,
                    134:   0x07f8, 0x00f8, 0x00d8, 0x0188,
                    135:   0x0180, 0x0300, 0x0300, 0x0000};
                    136: 
                    137: short MouseMask[] = {
                    138:   0x000c, 0x001c, 0x003c, 0x007c,
                    139:   0x00fc, 0x01fc, 0x03fc, 0x07fc,
                    140:   0x0ffc, 0x0ffc, 0x01fc, 0x03dc,
                    141:   0x03cc, 0x0780, 0x0780, 0x0300};
                    142: 
                    143: Display *XXdisplay;
                    144: FontInfo *fontinfo;
                    145: Window XXwindow;
                    146: Cursor EmacsCursor;
                    147: 
                    148: char *fore_color;      /* Variables to store colors */
                    149: char *back_color;
                    150: char *brdr_color;
                    151: char *curs_color;
                    152: char *mous_color;
                    153: 
                    154: int fore;
                    155: int back;
                    156: int brdr;
                    157: int curs;
                    158: int mous;
                    159: 
                    160: static WindowInfo windowinfo;
                    161: WindowInfo rootwindowinfo;
                    162: 
                    163: 
                    164: 
                    165: static XKeyPressedEvent XXEvent; /* as X messages are read in they are */
                    166:                                 /* stored here */
                    167: static XREPBUFFER XXqueue;/* Used for storing up ExposeRegion */
                    168:                                /* replies, so that the SIGIO inter- */
                    169:                                /* rupt serving routines do almost */
                    170:                                /* no writes to the X socket */
                    171: /*int CurHL;                   /* Current Highlighting actually being */
                    172:                                /* being used for bold font right now*/
                    173: 
                    174: int XXborder;
                    175: int XXInternalBorder;
                    176: 
                    177: int (*handler)();
                    178: 
                    179: extern Display *XOpenDisplay ();
                    180: extern Window XCreateWindow ();
                    181: extern Cursor XDefineCursor ();
                    182: extern Cursor XCreateCursor ();
                    183: extern FontInfo *XOpenFont ();
                    184: 
                    185: static int flashback ();
                    186: 
                    187: 
                    188: /* HLmode -- Changes the GX function for output strings.  Could be used to
                    189:  * change font.  Check an XText library function call. 
                    190:  */
                    191: 
                    192: static
                    193: HLmode (new)
                    194:      int new;
                    195: {
                    196:   CurHL =  new;
                    197: }
                    198: 
                    199: 
                    200: /* External interface to control of standout mode.
                    201:    Call this when about to modify line at position VPOS
                    202:    and not change whether it is highlighted.  */
                    203: 
                    204: XTreassert_line_highlight (highlight, vpos)
                    205:      int highlight, vpos;
                    206: {
                    207:   HLmode (highlight);
                    208: }
                    209: 
                    210: /* Call this when about to modify line at position VPOS
                    211:    and change whether it is highlighted.  */
                    212: 
                    213: static
                    214: XTchange_line_highlight (new_highlight, vpos, first_unused_hpos)
                    215:      int new_highlight, vpos, first_unused_hpos;
                    216: {
                    217:   HLmode (new_highlight);
                    218:   XTtopos (vpos, 0);
                    219:   x_clear_end_of_line (0);
                    220: }
                    221: 
                    222: 
                    223: /* Used for starting or restarting (after suspension) the X window.  Puts the
                    224:  * cursor in a known place, update does not begin with this routine but only
                    225:  * with a call to DoDsp.  The mouse cursor is warped into the window and then
                    226:  * the cursor is turned on.
                    227:  */
                    228: 
                    229: 
                    230: 
                    231: static
                    232: XTset_terminal_modes ()
                    233: {
                    234:   int stuffpending;
                    235: #ifdef XDEBUG
                    236:   fprintf (stderr, "XTset_terminal_modes\n");
                    237: #endif
                    238:   InUpdate = 0;
                    239:   stuffpending = 0;
                    240:   if (!initialized)
                    241:     {
                    242:       CursorExists = 0;
                    243:       VisibleX = 0;
                    244:       VisibleY = 0;
                    245:     }
                    246:   XTclear_screen ();
                    247: #ifdef FIONREAD
                    248:   ioctl (0, FIONREAD, &stuffpending);
                    249:   if (stuffpending)
                    250:     SIGNAL_INPUT ();
                    251: #endif
                    252: }
                    253: 
                    254: /* XTtopos moves the cursor to the correct location and checks whether an update
                    255:  * is in progress in order to toggle it on.
                    256:  */
                    257: 
                    258: static
                    259: XTtopos (row, col)
                    260:      register int row, col;
                    261: {
                    262:   BLOCK_INPUT_DECLARE ()
                    263: 
                    264:   BLOCK_INPUT ();
                    265: #ifdef XDEBUG
                    266:   fprintf (stderr, "XTtopos\n");
                    267: #endif
                    268:   cursX = col;
                    269:   cursY = row;
                    270:   if (InUpdate)
                    271:     {
                    272:       if (CursorExists)
                    273:        {
                    274:          CursorToggle ();
                    275:        }
                    276:       UNBLOCK_INPUT ();
                    277:       return;          /* Generally, XTtopos will be invoked */
                    278:       /* when InUpdate with !CursorExists */
                    279:       /* so that wasteful XFlush is not called */
                    280:     }
                    281:   if ((row == VisibleY) && (col == VisibleX))
                    282:     {
                    283:       if (!CursorExists)
                    284:        {
                    285:          CursorToggle ();
                    286:        }
                    287:       XFlush ();
                    288:       UNBLOCK_INPUT ();
                    289:       return;
                    290:     }
                    291:   if (CursorExists) CursorToggle ();
                    292:   VisibleX = col;
                    293:   VisibleY = row;
                    294:   if (!CursorExists) CursorToggle ();
                    295:   XFlush ();
                    296:   UNBLOCK_INPUT ();
                    297: }
                    298: 
                    299: /* Used to get the terminal back to a known state after resets.  Usually
                    300:  * used when restarting suspended or waiting emacs
                    301:  */
                    302: 
                    303: static
                    304: cleanup ()
                    305: {
                    306:   inverse_video = 0;
                    307:   HLmode (0);
                    308: }
                    309: 
                    310: /* Erase current line from column cursX to column END.
                    311:    Leave cursor at END.  */
                    312: 
                    313: static
                    314: XTclear_end_of_line (end)
                    315:      register int end;
                    316: {
                    317:   register int numcols;
                    318: 
                    319: #ifdef XDEBUG
                    320:   fprintf (stderr, "XTclear_end_of_line\n");
                    321: 
                    322: #endif
                    323:   if (cursY < 0 || cursY >= screen_height)
                    324:     {
                    325:       return;
                    326:     }
                    327: 
                    328:   if (end >= screen_width)
                    329:     end = screen_width;
                    330:   if (end <= cursX)
                    331:     return;
                    332: 
                    333:   numcols = end - cursX;
                    334:   {
                    335:     BLOCK_INPUT_DECLARE ()
                    336: 
                    337:     BLOCK_INPUT ();
                    338:     if (cursY == VisibleY && VisibleX >= cursX && VisibleX < end)
                    339:       {
                    340:        if (CursorExists) CursorToggle ();
                    341:       }
                    342:     XPixSet (XXwindow,
                    343:             cursX * fontinfo->width + XXInternalBorder,
                    344:             cursY * fontinfo->height+XXInternalBorder,
                    345:             fontinfo->width * numcols,
                    346:             fontinfo->height,
                    347:             back);
                    348:     XTtopos (cursY, end);
                    349:     UNBLOCK_INPUT ();
                    350:   }
                    351: }
                    352: 
                    353: /* Erase current line from column START to right margin.
                    354:    Leave cursor at START.  */
                    355: 
                    356: static
                    357: x_clear_end_of_line (start)
                    358:      register int start;
                    359: {
                    360:   register int numcols;
                    361: 
                    362: #ifdef XDEBUG
                    363:   fprintf (stderr, "x_clear_end_of_line\n");
                    364: 
                    365: #endif
                    366:   if (cursY < 0 || cursY >= screen_height)
                    367:     {
                    368:       return;
                    369:     }
                    370: 
                    371:   if (start < 0)
                    372:     start = 0;
                    373:   if (start >= screen_width)
                    374:     return;
                    375: 
                    376:   numcols = screen_width - start;
                    377:   {
                    378:     BLOCK_INPUT_DECLARE ()
                    379: 
                    380:     BLOCK_INPUT ();
                    381:     if (cursY == VisibleY && VisibleX >= start)
                    382:       {
                    383:        if (CursorExists) CursorToggle ();
                    384:       }
                    385:     XPixSet (XXwindow,
                    386:             start * fontinfo->width + XXInternalBorder,
                    387:             cursY * fontinfo->height+XXInternalBorder,
                    388:             fontinfo->width * numcols,
                    389:             fontinfo->height,
                    390:             back);
                    391:     XTtopos (cursY, start);
                    392:     UNBLOCK_INPUT ();
                    393:   }
                    394: }
                    395: 
                    396: static
                    397: XTreset_terminal_modes ()
                    398: {
                    399: #ifdef XDEBUG
                    400:   fprintf (stderr, "XTreset_terminal_modes\n");
                    401: #endif
                    402:   XTclear_screen ();
                    403: }
                    404: 
                    405: static
                    406: XTclear_screen ()
                    407: {
                    408: #ifdef XDEBUG
                    409:   fprintf (stderr, "XTclear_screen\n");
                    410: #endif
                    411:   HLmode (0);
                    412:   CursorExists = 0;
                    413: 
                    414:   cursX = 0;
                    415:   cursY = 0;
                    416:   SavedX = 0;
                    417:   SavedY = 0;
                    418:   VisibleX = 0;
                    419:   VisibleY = 0;
                    420:   {
                    421:     BLOCK_INPUT_DECLARE ()
                    422: 
                    423:     BLOCK_INPUT ();
                    424:     XClear (XXwindow);
                    425:     CursorToggle ();
                    426:     if (!InUpdate)
                    427:       XFlush ();
                    428:     UNBLOCK_INPUT ();
                    429:   }
                    430: }
                    431: 
                    432: /* used by dumprectangle which is usually invoked upon ExposeRegion
                    433:  * events which come from bit blt's or moving an obscuring opaque window
                    434:  */
                    435: 
                    436: static
                    437: dumpchars (ActiveScreen, numcols, tempX, tempY, tempHL)
                    438:      register struct display_line **ActiveScreen;
                    439:      register int numcols;
                    440:      register int tempX, tempY, tempHL;
                    441: {
                    442:   if (numcols <= 0) return;
                    443:   if (((numcols - 1) + tempX) > screen_width)
                    444:     {
                    445:       numcols = (screen_width - tempX) + 1;
                    446:     }
                    447:   if ((tempX < 0) || (tempX >= screen_width) ||
                    448:       (tempY < 0) || (tempY >= screen_height))
                    449:     {
                    450:       return;
                    451:     }
                    452:   XText (XXwindow,
                    453:         (tempX * fontinfo->width+XXInternalBorder),
                    454:         (tempY * fontinfo->height+XXInternalBorder),
                    455:         &ActiveScreen[tempY + 1]->body[tempX],
                    456:         numcols,
                    457:         fontinfo->id,
                    458:         (tempHL ? back : fore),
                    459:         (tempHL ? fore : back));
                    460: }
                    461: 
                    462: /* When a line has been changed this function is called.  X is so fast
                    463:  * that the actual sequence is ignore.  Rather, the new version of the
                    464:  * line is simply output if this function is invoked while in UpDate.
                    465:  * Sometimes writechars can be invoked when not in update if text is to
                    466:  * be output at the end of the line.  In this case the whole line is not
                    467:  * output.  Simply the new text at the current cursor position given
                    468:  * by VisibleX,Y.  The cursor is moved to the end of the new text.
                    469:  */
                    470: static
                    471: writechars (start, end)
                    472:      register char *start, *end;
                    473: {
                    474:   register int temp_length;
                    475:   BLOCK_INPUT_DECLARE ()
                    476: 
                    477:   BLOCK_INPUT ();
                    478: 
                    479:   if ((cursY < 0) || (cursY >= screen_height))
                    480:     {
                    481:       UNBLOCK_INPUT ();
                    482:       return;
                    483:     }
                    484:   if (CursorExists)
                    485:     {
                    486:       CursorToggle ();
                    487:     }
                    488:   if (InUpdate)
                    489:     {
                    490:       if (end != start - 1)
                    491:        {
                    492:          XText (XXwindow,
                    493:                 (cursX * fontinfo->width+XXInternalBorder),
                    494:                 (cursY * fontinfo->height+XXInternalBorder),
                    495:                 start,
                    496:                 end + 1 - start,
                    497:                 fontinfo->id,
                    498:                 (CurHL ? back : fore),
                    499:                 (CurHL ? fore : back));
                    500:          XTtopos (cursY, cursX + end - start + 1);
                    501:        }
                    502:     }
                    503:   else
                    504:     {
                    505:       if ((VisibleX < 0) || (VisibleX >= screen_width))
                    506:        {
                    507:          UNBLOCK_INPUT ();
                    508:          return;
                    509:        }
                    510:       if ((VisibleY < 0) || (VisibleY >= screen_height))
                    511:        {
                    512:          UNBLOCK_INPUT ();
                    513:          return;
                    514:        }
                    515:       if (((end - start) + VisibleX) >= screen_width)
                    516:        {
                    517:          end = start + (screen_width - (VisibleX + 1));
                    518:        }
                    519:       if (end >= start)
                    520:        {
                    521:           XText (XXwindow,
                    522:                 (VisibleX * fontinfo->width+XXInternalBorder),
                    523:                 (VisibleY * fontinfo->height+XXInternalBorder),
                    524:                 start,
                    525:                 ((end - start) + 1),
                    526:                 fontinfo->id,
                    527:                 (CurHL ? back : fore),
                    528:                 (CurHL ? fore : back));
                    529:          VisibleX = VisibleX + (end - start) + 1;
                    530:        }
                    531:       if (!CursorExists) CursorToggle ();
                    532:     }
                    533:   UNBLOCK_INPUT ();
                    534: }
                    535: 
                    536: 
                    537: static
                    538: XTwrite_chars (start, len)
                    539:      register char *start;
                    540:      register int len;
                    541: {
                    542: #ifdef XDEBUG
                    543:   fprintf (stderr, "XTwrite_chars\n");
                    544: #endif
                    545:   writechars (start, start + len - 1);
                    546: }
                    547: 
                    548: /* The following routine is for the deaf or for the pervert who prefers
                    549:  * that his terminal flash at him rather than beep at him.
                    550:  */
                    551: 
                    552: static int flashedback;
                    553: 
                    554: static
                    555: XTflash ()
                    556: {
                    557: #ifdef ITIMER_REAL
                    558:   struct itimerval itimer;
                    559: 
                    560: #ifdef XDEBUG
                    561:   fprintf (stderr, "XTflash\n");
                    562: #endif
                    563: 
                    564:   signal (SIGALRM, flashback);
                    565:   getitimer (ITIMER_REAL, &itimer);
                    566:   itimer.it_value.tv_usec += 250000;
                    567:   itimer.it_interval.tv_sec = 0;
                    568:   itimer.it_interval.tv_usec = 0;
                    569:   flashedback = 0;
                    570:   setitimer (ITIMER_REAL, &itimer, 0);
                    571:   {
                    572:     BLOCK_INPUT_DECLARE ()
                    573: 
                    574:     BLOCK_INPUT ();
                    575:     XPixFill (XXwindow, 0, 0, screen_width*fontinfo->width+2*XXInternalBorder,
                    576:              screen_height * fontinfo->height+2*XXInternalBorder, WhitePixel,
                    577:              ClipModeClipped, GXinvert, AllPlanes);
                    578:     XFlush ();
                    579:     UNBLOCK_INPUT ();
                    580:   }
                    581:   while (!flashedback) pause ();
                    582: #endif /* have ITIMER_REAL */
                    583: }
                    584: 
                    585: static
                    586: flashback ()
                    587: {
                    588: #ifdef ITIMER_REAL
                    589: #ifdef SIGIO
                    590:   int mask = sigblock (sigmask (SIGIO) | sigmask (SIGALRM));
                    591: #else
                    592:   int mask = sigblock (sigmask (SIGALRM));
                    593: #endif
                    594:   XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width+2*XXInternalBorder,
                    595:            screen_height * fontinfo->height+2*XXInternalBorder, WhitePixel,
                    596:            ClipModeClipped, GXinvert, AllPlanes);
                    597:   XFlush ();
                    598:   flashedback = 1;
                    599:   sigsetmask (mask);
                    600: #endif /* have ITIMER_REAL */
                    601: }
                    602: 
                    603: /* A kludge to get a bell */
                    604: 
                    605: static
                    606: XTfeep ()
                    607: {
                    608:   BLOCK_INPUT_DECLARE ()
                    609: 
                    610:   BLOCK_INPUT ();
                    611: #ifdef XDEBUG
                    612:   fprintf (stderr, "XTfeep\n");
                    613: #endif
                    614:   XFeep (0);
                    615:   UNBLOCK_INPUT ();
                    616: }
                    617: 
                    618: /* Artificially creating a cursor is hard, the actual position on the
                    619:  * screen (either where it is or last was) is tracked with VisibleX,Y.
                    620:  * Gnu Emacs code tends to assume a cursor exists in hardward at cursX,Y
                    621:  * and that output text will appear there.  During updates, the cursor is
                    622:  * supposed to be blinked out and will only reappear after the update
                    623:  * finishes.
                    624:  */
                    625: 
                    626: CursorToggle ()
                    627: {
                    628:   register struct display_line **ActiveScreen;
                    629:   if (!WindowMapped)
                    630:     {
                    631:       CursorExists = 0;
                    632:       return 0;
                    633:     }
                    634:   if ((VisibleX < 0) || (VisibleX >= screen_width) ||
                    635:       (VisibleY < 0) || (VisibleY >= screen_height))
                    636:     {                  /* Current Cursor position trash */
                    637:       /* Not much can be done */
                    638:       XFlush ();
                    639:       CursorExists = 0;
                    640:       return 0;
                    641:       /* Currently the return values are not */
                    642:       /* used, but I could anticipate using */
                    643:       /* them in the future. */
                    644:     }
                    645:   /*  if (InUpdate && DesiredScreen)
                    646:       ActiveScreen = DesiredScreen;
                    647:       else*/
                    648:   ActiveScreen = PhysScreen;
                    649:   if (ActiveScreen && ActiveScreen[VisibleY + 1] &&
                    650:       (VisibleX < ActiveScreen[VisibleY + 1]->length))
                    651:     {
                    652:       if (CursorExists)
                    653:        {
                    654:          XText (XXwindow,
                    655:                 VisibleX * fontinfo->width+XXInternalBorder,
                    656:                 VisibleY * fontinfo->height+XXInternalBorder,
                    657:                 &ActiveScreen[VisibleY + 1]->body[VisibleX], 1,
                    658:                 fontinfo->id,
                    659:                 fore, back);
                    660:        }
                    661:       else
                    662:        {
                    663:          XText (XXwindow,
                    664:                 VisibleX * fontinfo->width+XXInternalBorder,
                    665:                 VisibleY * fontinfo->height+XXInternalBorder,
                    666:                 &ActiveScreen[VisibleY + 1]->body[VisibleX], 1,
                    667:                 fontinfo->id,
                    668:                 back, curs);
                    669:        }
                    670:     }
                    671:   else if (CursorExists)
                    672:     {
                    673:       XPixSet (XXwindow,
                    674:               VisibleX * fontinfo->width+XXInternalBorder,
                    675:               VisibleY * fontinfo->height+XXInternalBorder,
                    676:               fontinfo->width, fontinfo->height, back);
                    677:     }
                    678:   else
                    679:     {
                    680:       XPixSet (XXwindow,
                    681:               VisibleX * fontinfo->width+XXInternalBorder,
                    682:               VisibleY * fontinfo->height+XXInternalBorder,
                    683:               fontinfo->width, fontinfo->height, curs);
                    684:     }
                    685:   CursorExists = !CursorExists;
                    686:   /* Cursor has either been blinked in */
                    687:   /* or out */
                    688:   if (!InUpdate)
                    689:     {
                    690:       XFlush ();
                    691:     }
                    692:   return 1;
                    693: }
                    694: 
                    695: /* This routine is used by routines which are called to paint regions */
                    696: /* designated by ExposeRegion events.  If the cursor may be in the exposed */
                    697: /* region, this routine makes sure it is gone so that dumprectangle can */
                    698: /* toggle it back into existance if dumprectangle is invoked when not in */
                    699: /* the midst of a screen update. */
                    700: static
                    701: ClearCursor ()
                    702: {
                    703:   BLOCK_INPUT_DECLARE ()
                    704: 
                    705:   BLOCK_INPUT ();
                    706:   if (!WindowMapped)
                    707:     {
                    708:       CursorExists = 0;
                    709:       UNBLOCK_INPUT ();
                    710:       return;
                    711:     }
                    712:   if ((VisibleX < 0) || (VisibleX >= screen_width)
                    713:       || (VisibleY < 0) || (VisibleY >= screen_height))
                    714:     {                  /* Current Cursor position trash */
                    715:       /* Not much can be done */
                    716:       CursorExists = 0;
                    717:       UNBLOCK_INPUT ();
                    718:       return;
                    719:     }
                    720:   XPixSet (XXwindow,
                    721:          VisibleX * fontinfo->width+XXInternalBorder,
                    722:          VisibleY * fontinfo->height+XXInternalBorder,
                    723:          fontinfo->width, fontinfo->height,
                    724:          back);
                    725:   CursorExists = 0;
                    726:   UNBLOCK_INPUT ();
                    727: }
                    728: 
                    729: static
                    730: XTupdate_begin ()
                    731: {
                    732:   BLOCK_INPUT_DECLARE ()
                    733: 
                    734:   BLOCK_INPUT ();
                    735: #ifdef XDEBUG
                    736:   fprintf (stderr, "XTupdate_begin\n");
                    737: #endif
                    738: 
                    739:   InUpdate = 1;
                    740:   if (CursorExists)
                    741:     {
                    742:       CursorToggle ();
                    743:     }
                    744:   SavedX = cursX;              /* The initial"hardware" cursor position is */
                    745:   /*  saved because that is where gnu emacs */
                    746:   /*  expects the cursor to be at the end of*/
                    747:   /* the update */
                    748:   SavedY = cursY;
                    749:   dumpqueue ();
                    750:   UNBLOCK_INPUT ();
                    751: }
                    752: 
                    753: 
                    754: static
                    755: XTupdate_end ()
                    756: {
                    757:   BLOCK_INPUT_DECLARE ()
                    758: 
                    759:   BLOCK_INPUT ();
                    760: #ifdef XDEBUG
                    761:   fprintf (stderr, "XTupdate_end\n");
                    762: #endif
                    763:   if (CursorExists)
                    764:     CursorToggle ();
                    765:   InUpdate = 0;
                    766:   dumpqueue ();
                    767:   XTtopos (SavedY, SavedX);    /* XTtopos invokes cursor toggle */
                    768:   UNBLOCK_INPUT ();
                    769: }
                    770: 
                    771: /* Used for expose region and expose copy events.  Have to get the text
                    772:  * back into the newly blank areas.
                    773:  */
                    774: 
                    775: dumprectangle (top, left, rows, cols)
                    776:      register int top, left, rows, cols;
                    777: {
                    778:   register struct display_line **ActiveScreen;
                    779:   register int index;
                    780:   int localX, localY, localHL;
                    781:   rows += top;
                    782:   cols += left;
                    783:   top /= fontinfo->height;
                    784:   /* Get row and col containing up and */
                    785:   /* left borders of exposed region -- */
                    786:   /* round down here*/
                    787:   left /= fontinfo->width;
                    788:   rows += (fontinfo->height - 1);
                    789:   cols += (fontinfo->width - 1);
                    790:   rows /= fontinfo->height;
                    791:   /* Get row and col containing bottom and */
                    792:   /* right borders -- round up here */
                    793:   rows -= top;
                    794:   cols /= fontinfo->width;
                    795:   cols -= left;
                    796:   if (rows < 0) return;
                    797:   if (cols < 0) return;
                    798:   if (top > (screen_height - 1)) return;
                    799:   if (left > (screen_width - 1)) return;
                    800:   if ((VisibleX >= left) && (VisibleX < (left + cols)) &&
                    801:       (VisibleY >= top) && (VisibleY < (top + rows)))
                    802:     {
                    803:       ClearCursor ();
                    804:     }
                    805: 
                    806:   ActiveScreen = PhysScreen;
                    807:   /* should perhaps be DesiredScreen */
                    808:   /* but PhysScreen is guaranteed to contain*/
                    809:   /* date which was good for every line on */
                    810:   /* screen. For desired screen only for */
                    811:   /* lines which are changing.  Emacs does */
                    812:   /* not consider a line within a newly */
                    813:   /* exposed region necessarily to have */
                    814:   /* been changed.  Emacs knows nothing */
                    815:   /* about ExposeRegion events.*/
                    816:   for (localY = top, index = 0;
                    817:        (index < rows) && (localY < screen_height);
                    818:        ++index, ++localY)
                    819:     {
                    820:       if ((localY < 0) || (localY >= screen_height)) continue;
                    821:       if (!ActiveScreen[localY + 1]) continue;
                    822:       if ((left + 1) > ActiveScreen[localY + 1]->length) continue;
                    823:       localX = left;
                    824:       localHL = ActiveScreen[localY + 1]->highlighted;
                    825:       dumpchars (ActiveScreen,
                    826:                 min (cols,
                    827:                      ActiveScreen[localY + 1]->length
                    828:                        - localX),
                    829:                 localX, localY, localHL);
                    830:     }
                    831:   if (!InUpdate && !CursorExists) CursorToggle ();
                    832:   /* Routine usually called */
                    833:   /* when not in update */
                    834: }
                    835: 
                    836: /* What sections of the window will be modified from the UpdateDisplay
                    837:  * routine is totally under software control.  Any line with Y coordinate
                    838:  * greater than flexlines will not change during an update.  This is really
                    839:  * used only during dellines and inslines routines (scraplines and stufflines)
                    840:  */
                    841: static
                    842: XTset_terminal_window (n)
                    843:      register int n;
                    844: {
                    845: #ifdef XDEBUG
                    846:   fprintf (stderr, "XTset_terminal_window\n");
                    847: #endif
                    848:   if ((n <= 0) || (n > screen_height))
                    849:     flexlines = screen_height;
                    850:   else
                    851:     flexlines = n;
                    852: }
                    853: 
                    854: XTins_del_lines (vpos, n)
                    855:      int vpos, n;
                    856: {
                    857: #ifdef XDEBUG
                    858:   fprintf (stderr, "XTins_del_lines\n");
                    859: #endif
                    860:   XTtopos (vpos, 0);
                    861:   if (n >= 0) stufflines (n);
                    862:   else scraplines (-n);
                    863: }
                    864: 
                    865: static
                    866: XTinsert_chars (start, len)
                    867:      register char *start;
                    868:      register int len;
                    869: {
                    870: #ifdef XDEBUG
                    871:   fprintf (stderr, "XTinsert_chars\n");
                    872: #endif
                    873:   writechars (start, start + len - 1);
                    874: }
                    875: 
                    876: static
                    877: XTdelete_chars (n)
                    878:      register int n;
                    879: {
                    880:   char *msg = "***Delete Chars Called Outside of Update!!!***";
                    881: #ifdef XDEBUG
                    882:   fprintf (stderr, "XTdelete_chars\n");
                    883: #endif
                    884:   writechars (msg, msg + strlen (msg) - 1);
                    885: }
                    886: 
                    887: static
                    888: stufflines (n)
                    889:      register int n;
                    890: {
                    891:   register int topregion, bottomregion;
                    892:   register int length, newtop;
                    893:   BLOCK_INPUT_DECLARE ()
                    894: 
                    895:   if (cursY >= flexlines)
                    896:     return;
                    897: 
                    898:   if (!WindowMapped)
                    899:     {
                    900:       bitblt = 0;
                    901:       return;
                    902:     }
                    903:   BLOCK_INPUT ();
                    904:   if (CursorExists) CursorToggle ();
                    905:   dumpqueue ();
                    906:   UNBLOCK_INPUT ();
                    907:   topregion = cursY;
                    908:   bottomregion = flexlines - (n + 1);
                    909:   newtop = cursY + n;
                    910:   length = (bottomregion - topregion) + 1;
                    911:   if ((length > 0) && (newtop <= flexlines))
                    912:     {
                    913:       BLOCK_INPUT ();
                    914:       /* Should already have cleared */
                    915:       /* queue of events associated */
                    916:       /* with old bitblts */
                    917:       XMoveArea (XXwindow, XXInternalBorder,
                    918:                 topregion * fontinfo->height+XXInternalBorder,
                    919:                 XXInternalBorder, newtop * fontinfo->height+XXInternalBorder,
                    920:                 screen_width * fontinfo->width,
                    921:                 length * fontinfo->height);
                    922:       if (WindowMapped)
                    923:        bitblt = 1;
                    924:       XFlush ();
                    925:       UNBLOCK_INPUT ();
                    926:       SIGNAL_INPUT_WHILE (bitblt);
                    927:       XFlush ();
                    928:     }
                    929:   newtop = min (newtop, (flexlines - 1));
                    930:   length = newtop - topregion;
                    931:   if (length > 0)
                    932:     {
                    933:       XPixSet (XXwindow,
                    934:               XXInternalBorder,
                    935:               topregion * fontinfo->height+XXInternalBorder,
                    936:               screen_width * fontinfo->width,
                    937:               n * fontinfo->height,
                    938:               back);
                    939:     }
                    940:   /*  if (!InUpdate) CursorToggle (); */
                    941: }
                    942: 
                    943: static
                    944: scraplines (n)
                    945:      register int n;
                    946: {
                    947:   BLOCK_INPUT_DECLARE ()
                    948:   if (!WindowMapped)
                    949:     {
                    950:       bitblt = 0;
                    951:       return;
                    952:     }
                    953: 
                    954:   if (cursY >= flexlines)
                    955:     return;
                    956:   BLOCK_INPUT ();
                    957:   if (CursorExists) CursorToggle ();
                    958:   dumpqueue ();
                    959:   if ((cursY + n) >= flexlines)
                    960:     {
                    961:       if (flexlines >= (cursY + 1))
                    962:        {
                    963:          XPixSet (XXwindow,
                    964:                   XXInternalBorder, cursY * fontinfo->height+XXInternalBorder,
                    965:                   screen_width * fontinfo->width,
                    966:                   (flexlines - cursY) * fontinfo->height,
                    967:                   back);
                    968:        }
                    969:       UNBLOCK_INPUT ();
                    970:     }
                    971:   else
                    972:     {
                    973:       XMoveArea (XXwindow,
                    974:                 XXInternalBorder,
                    975:                 (cursY + n) * fontinfo->height+XXInternalBorder,
                    976:                 XXInternalBorder, cursY * fontinfo->height+XXInternalBorder,
                    977:                 screen_width * fontinfo->width,
                    978:                 (flexlines - (cursY + n)) * fontinfo->height);
                    979:       if (WindowMapped)
                    980:        bitblt = 1;
                    981:       XFlush ();
                    982:       UNBLOCK_INPUT ();
                    983:       SIGNAL_INPUT_WHILE (bitblt);
                    984:       BLOCK_INPUT ();
                    985:       XFlush ();
                    986:       XPixSet (XXwindow, XXInternalBorder,
                    987:               (flexlines - n) * fontinfo->height+XXInternalBorder,
                    988:               screen_width * fontinfo->width,
                    989:               n * fontinfo->height, back);
                    990:       UNBLOCK_INPUT ();
                    991:     }
                    992:   /* if (!InUpdate) CursorToggle (); */
                    993: }
                    994: 
                    995: /* Substitutes for standard read routine.  Under X not interested in individual
                    996:  * bytes but rather individual packets.
                    997:  */
                    998: 
                    999: XTread_socket (sd, bufp, numchars)
                   1000:      register int sd;
                   1001:      register char *bufp;
                   1002:      register int numchars;
                   1003: {
                   1004: 
                   1005:   int count;
                   1006:   char *where_mapping;
                   1007:   int nbytes;
                   1008:   int stuffpending;
                   1009:   int temp_width, temp_height;
                   1010:   BLOCK_INPUT_DECLARE ()
                   1011:   /* XKeyPressedEvent event; */
                   1012:   /*  typedef struct reply {XEvent event; struct reply *next} Reply;
                   1013:       Reply *replies = NULL;*/
                   1014: 
                   1015:   BLOCK_INPUT ();
                   1016:   count = 0;
                   1017:   if (numchars <= 0)
                   1018:     {  /* To keep from overflowing read buffer */
                   1019:       numchars = 1;
                   1020:       --bufp;
                   1021:     }
                   1022: #ifdef SIGIO
                   1023:   while (bitblt || XPending () != 0)
                   1024: #else
                   1025: #ifndef HAVE_SELECT
                   1026:   if (! (fcntl (fileno (stdin), F_GETFL, 0) & O_NDELAY))
                   1027:     {
                   1028:       extern int read_alarm_should_throw;
                   1029:       if (CursorExists)
                   1030:        xfixscreen ();
                   1031:       read_alarm_should_throw = 1;
                   1032:       XPeekEvent (&XXEvent);
                   1033:       read_alarm_should_throw = 0;
                   1034:     }
                   1035: #endif
                   1036:   while (XPending () != 0)
                   1037: #endif
                   1038:     {
                   1039:       /* while there are more events*/
                   1040:       XNextEvent (&XXEvent);
                   1041:       switch (XXEvent.type)
                   1042:        {
                   1043: /*     case X_Reply:
                   1044:        {
                   1045:        extern char *malloc ();
                   1046:        Reply *reply = (Reply *) malloc (sizeof (Reply));
                   1047:        reply->next = replies;
                   1048:        reply->event = XXEvent;
                   1049:        replies = reply;
                   1050:        break;
                   1051:        }*/
                   1052:        default:
                   1053:          break;
                   1054:        case ExposeWindow:
                   1055:          if (((XExposeEvent *)&XXEvent)->window == XXIconWindow)
                   1056:            {
                   1057:              PendingIconExposure = 1;
                   1058:            }
                   1059:          else
                   1060:            PendingExposure = 1;/* No reason to repeat */
                   1061:          /* this if several */
                   1062:          /* ExposeWindow events */
                   1063:          /* come in quick succes-*/
                   1064:          /* ion */
                   1065:          break;
                   1066:        case ExposeRegion:
                   1067:          if (PendingExposure)
                   1068:            {   /* Don't bother with */
                   1069:              /* region events when */
                   1070:              /* full window event */
                   1071:              /* is pending */
                   1072:              break;
                   1073:            }
                   1074:          loadxrepbuffer (&XXEvent, &XXqueue);
                   1075:          if (XXqueue.rindex == XXqueue.windex)
                   1076:            {
                   1077:              PendingExposure = 1;
                   1078:            }
                   1079:          if ((XXqueue.rindex > XXqueue.mindex) ||
                   1080:              (XXqueue.windex > XXqueue.mindex) ||
                   1081:                (XXqueue.rindex < 0) ||
                   1082:                  (XXqueue.windex < 0))
                   1083:            {
                   1084:              PendingExposure = 1;
                   1085:            }
                   1086:          break;
                   1087:        case ExposeCopy:        /* For ExposeCopy sync */
                   1088:          /* will block all outgoing */
                   1089:          /* requests until this is */
                   1090:          /* decremented */
                   1091:          if (WindowMapped) bitblt = 0;
                   1092:          break;
                   1093:        case KeyPressed:
                   1094:          /* bcopy (XXEvent, event, sizeof (XKeyPressedEvent)); */
                   1095:          where_mapping = XLookupMapping (&XXEvent, &nbytes);
                   1096:          /* Nasty fix for arrow keys */
                   1097:          if (!nbytes && IsCursorKey (XXEvent.detail & 0xff))
                   1098:            {
                   1099:              switch (XXEvent.detail & 0xff)
                   1100:                {
                   1101:                case KC_CURSOR_LEFT:
                   1102:                  where_mapping = "\002";
                   1103:                  break;
                   1104:                case KC_CURSOR_RIGHT:
                   1105:                  where_mapping = "\006";
                   1106:                  break;
                   1107:                case KC_CURSOR_UP:
                   1108:                  where_mapping = "\020";
                   1109:                  break;
                   1110:                case KC_CURSOR_DOWN:
                   1111:                  where_mapping = "\016";
                   1112:                  break;
                   1113:                }
                   1114:              nbytes = 1;
                   1115:            }
                   1116:          if (numchars - nbytes > 0)
                   1117:            {
                   1118:              bcopy (where_mapping, bufp, nbytes);
                   1119:              bufp += nbytes;
                   1120:              count += nbytes;
                   1121:              numchars -= nbytes;
                   1122:            }
                   1123: /*       else
                   1124:            {
                   1125:              bcopy (where_mapping, bufp, numchars);
                   1126:              bufp += numchars;
                   1127:              count += numchars;
                   1128:              numchars = 0;
                   1129:              *(bufp-1) = *(where_mapping + nbytes - 1);
                   1130:            }*/
                   1131:          break;
                   1132:        case ButtonPressed:
                   1133:        case ButtonReleased:
                   1134:          switch (spacecheck (Xxrepbuffer.mindex,
                   1135:                              Xxrepbuffer.rindex,
                   1136:                              Xxrepbuffer.windex, 0))
                   1137:            {
                   1138:            case 0:
                   1139:              loadxrepbuffer (&XXEvent,
                   1140:                              &Xxrepbuffer);
                   1141:              if (informflag && (numchars > 1))
                   1142:                {
                   1143:                  *bufp++ = (char) 'X' & 037; /* C-x */
                   1144:                  ++count;
                   1145:                  --numchars;
                   1146:                  *bufp++ = (char) 0;  /* C-@ */
                   1147:                  ++count;
                   1148:                  --numchars;
                   1149:                }
                   1150:              break;
                   1151:            case -1:
                   1152:              break;
                   1153:            case -2:
                   1154:            default:
                   1155:              fixxrepbuffer ();
                   1156:              break;
                   1157:            }
                   1158:          break;
                   1159:        }
                   1160:     }
                   1161: /*  while (replies) {
                   1162:     Reply *reply = replies;
                   1163:     XPutBackEvent (&reply->event);
                   1164:     replies = reply->next;
                   1165:     free (reply);
                   1166:     }*/
                   1167:   if (count < 0)
                   1168:     count = 0;
                   1169: #ifdef HAVE_SELECT
                   1170:   if (CursorExists
                   1171: #ifdef O_NDELAY
                   1172: #ifdef F_GETFL
                   1173:       && (! (fcntl (fileno (stdin), F_GETFL, 0) & O_NDELAY))
                   1174: #endif
                   1175: #endif
                   1176:       )
                   1177:     xfixscreen ();
                   1178: #endif
                   1179:   UNBLOCK_INPUT ();
                   1180:   return count;
                   1181: }
                   1182: 
                   1183: /* refresh bitmap kitchen sink icon */
                   1184: refreshicon ()
                   1185: {
                   1186:   BLOCK_INPUT_DECLARE ()
                   1187: 
                   1188:   BLOCK_INPUT ();
                   1189:   if (XXIconWindow)
                   1190:     XBitmapBitsPut (XXIconWindow, 0,  0, sink_width, sink_height,
                   1191:                    sink_bits, BlackPixel, WhitePixel,
                   1192:                    XXIconMask, GXcopy, AllPlanes);
                   1193:   XFlush ();
                   1194:   UNBLOCK_INPUT ();
                   1195: }
                   1196: 
                   1197: XBitmapIcon ()
                   1198: {
                   1199:   BLOCK_INPUT_DECLARE ()
                   1200: 
                   1201:   BLOCK_INPUT ();
                   1202:   if (!IconWindow)
                   1203:     {
                   1204:       XSetIconWindow (XXwindow,XXIconWindow);
                   1205:       XSelectInput (XXIconWindow, ExposeWindow);
                   1206:       IconWindow = !IconWindow;
                   1207:     }
                   1208:   UNBLOCK_INPUT ();
                   1209: }
                   1210: 
                   1211: XTextIcon ()
                   1212: {
                   1213:   BLOCK_INPUT_DECLARE ()
                   1214: 
                   1215:   BLOCK_INPUT ();
                   1216:   if (IconWindow)
                   1217:     {
                   1218:       XClearIconWindow (XXwindow);
                   1219:       XSelectInput (XXIconWindow, NoEvent);
                   1220:       IconWindow = !IconWindow;
                   1221:     }
                   1222:   UNBLOCK_INPUT ();
                   1223: }
                   1224: 
                   1225: /* Interpreting incoming keycodes. Should have table modifiable as needed
                   1226:  * from elisp.
                   1227:  */
                   1228: 
                   1229: /* Exit gracefully from gnuemacs, doing an autosave and giving a status.
                   1230:  */
                   1231: 
                   1232: XExitGracefully (disp, event)
                   1233:      Display *disp;
                   1234:      XErrorEvent *event;
                   1235: {
                   1236:   XCleanUp ();
                   1237:   exit (70);
                   1238: }
                   1239: 
                   1240: x_io_error (disp)
                   1241:      Display *disp;
                   1242: {
                   1243:   XCleanUp ();
                   1244:   exit (71);
                   1245: }
                   1246: 
                   1247: #if 0
                   1248: /* This kludge overcomes the failure to handle EAGAIN and EINTR
                   1249:    in a certain version of X for 386 running system V.  */
                   1250: 
                   1251: x_io_error (disp, a, b, c, nwrite)
                   1252:      Display *disp;
                   1253: {
                   1254:   extern _XSend ();
                   1255:   unsigned int pc = ((unsigned int *)&disp)[-1];
                   1256:   if (pc - (unsigned int)&_XSend - 100 < 100
                   1257:        && (errno == EAGAIN || errno == EINTR))
                   1258:     {
                   1259:       /* We were called by `writedata' erroneously.
                   1260:         Modify a local variable which `writedata'
                   1261:         will subtract from the number of bytes to be written.  */
                   1262:       nwrite = 0;
                   1263:       return;
                   1264:     }
                   1265:   abort ();
                   1266: }
                   1267: #endif
                   1268: 
                   1269: xfixscreen ()
                   1270: {
                   1271:   register int temp_width, temp_height;
                   1272:   BLOCK_INPUT_DECLARE ()
                   1273:   /* register int temp_x, temp_y; */
                   1274: 
                   1275:   BLOCK_INPUT ();
                   1276:   dumpqueue ();
                   1277:   /* Check that the connection is in fact open.  This works by doing a nop */
                   1278:   /* (well, almost) write operation.  If there is an XIOerror or a */
                   1279:   /* SIGPIPE, exit gracefully.  This fixes the loop-on-logout bug.*/
                   1280:   /* XIOErrorHandler (XExitGracefully); */
                   1281:   XPixFill (XXwindow, 0, 0, 1, 1, back, ClipModeClipped, GXnoop, AllPlanes);
                   1282:   XFlush ();
                   1283:   /* XIOErrorHandler (0); */
                   1284:   if (PendingIconExposure)
                   1285:     {
                   1286:       refreshicon ();
                   1287:       PendingIconExposure = 0;
                   1288:     }
                   1289:   if (PendingExposure)
                   1290:     {
                   1291:       PendingExposure = 0;
                   1292:       ClearCursor ();
                   1293:       XXqueue.rindex = 0;
                   1294:       XXqueue.windex = 0;
                   1295:       XQueryWindow (XXwindow, &windowinfo); /* Dangerous to do */
                   1296:       /* writes here but */
                   1297:       /* otherwise would */
                   1298:       /* have to alter */
                   1299:       /* gnu emacs display */
                   1300:       /* routines to query */
                   1301:       /* when screen garbaged */
                   1302:       temp_width = (windowinfo.width - 2 * XXInternalBorder) / fontinfo->width;
                   1303:       temp_height = (windowinfo.height- 2*XXInternalBorder) / fontinfo->height;
                   1304:       if (temp_width != screen_width || temp_height != screen_height)
                   1305:        change_screen_size (max (5, temp_height), max (10, temp_width));
                   1306:       XXxoffset= windowinfo.x;
                   1307:       XXyoffset = windowinfo.y;
                   1308:       /*if (temp_x != XXxoffset || temp_y != XXyoffset)
                   1309:        XSetOffset (temp_x, temp_y);*/
                   1310:       dumprectangle (0, 0,
                   1311:                     screen_height * fontinfo->height + 2 * XXInternalBorder,
                   1312:                     screen_width * fontinfo->width + 2 * XXInternalBorder);
                   1313:     }
                   1314:   if (!InUpdate)
                   1315:     if (!CursorExists)
                   1316:       CursorToggle ();
                   1317:   XFlush ();
                   1318:   UNBLOCK_INPUT ();
                   1319:   SIGNAL_INPUT ();
                   1320: }
                   1321: 
                   1322: x_term_init ()
                   1323: {
                   1324:   char *vardisplay;
                   1325:   char *temp_font;
                   1326:   register char *option;
                   1327:   extern XTinterrupt_signal ();
                   1328:   int reversevideo;
                   1329:   Color cdef;
                   1330:   char *progname;
                   1331: 
                   1332:   Fset (intern ("window-system-version"), make_number (10));
                   1333: 
                   1334:   vardisplay = (alternate_display ? alternate_display
                   1335:                : (char *) egetenv ("DISPLAY"));
                   1336:   if (!vardisplay || *vardisplay == '\0')
                   1337:     {
                   1338:       fprintf (stderr, "DISPLAY environment variable must be set\n");
                   1339:       exit (-200);
                   1340:     }
                   1341: 
                   1342:   XXdisplay = XOpenDisplay (vardisplay);
                   1343:   if (XXdisplay == (Display *) 0)
                   1344:     {
                   1345:       fprintf (stderr, "X server not responding.  Check your DISPLAY environment variable.\n");
                   1346:       exit (-200);
                   1347:     }
                   1348:   x_init_1 (1);
                   1349:   Xxrepbuffer.mindex = XREPBUFSIZE - 1;
                   1350:   Xxrepbuffer.windex = 0;
                   1351:   Xxrepbuffer.rindex = 0;
                   1352:   XXqueue.mindex = XREPBUFSIZE - 1;
                   1353:   XXqueue.windex = 0;
                   1354:   XXqueue.rindex = 0;
                   1355:   WindowMapped = 0;
                   1356:   baud_rate = 9600;
                   1357:   min_padding_speed = 10000;
                   1358:   must_write_spaces = 1;
                   1359:   informflag = 1;
                   1360:   MetaFlag = 1;
                   1361:   visible_bell = 1;
                   1362: #ifdef SIGIO
                   1363:   interrupt_input = 1;
                   1364: #endif
                   1365:   inverse_video = 1;
                   1366:   bitblt = 0;
                   1367:   PendingExposure = 0;
                   1368: 
                   1369:   fix_screen_hook = xfixscreen;
                   1370:   clear_screen_hook = XTclear_screen;
                   1371:   clear_end_of_line_hook = XTclear_end_of_line;
                   1372:   ins_del_lines_hook = XTins_del_lines;
                   1373:   change_line_highlight_hook = XTchange_line_highlight;
                   1374:   insert_chars_hook = XTinsert_chars;
                   1375:   write_chars_hook = XTwrite_chars;
                   1376:   delete_chars_hook = XTdelete_chars;
                   1377:   ring_bell_hook = XTfeep;
                   1378:   reset_terminal_modes_hook = XTreset_terminal_modes;
                   1379:   set_terminal_modes_hook = XTset_terminal_modes;
                   1380:   update_begin_hook = XTupdate_begin;
                   1381:   update_end_hook = XTupdate_end;
                   1382:   set_terminal_window_hook = XTset_terminal_window;
                   1383:   read_socket_hook = XTread_socket;
                   1384:   topos_hook = XTtopos;
                   1385:   /* raw_topos_hook = XTraw_topos;  */
                   1386:   reassert_line_highlight_hook = XTreassert_line_highlight;
                   1387:   scroll_region_ok = 1;        /* we'll scroll partial screens */
                   1388:   char_ins_del_ok = 0;         /* just as fast to write the line */
                   1389:   line_ins_del_ok = 1;         /* we'll just blt 'em */
                   1390:   fast_clear_end_of_line = 1;  /* X does this well */
                   1391:   memory_below_screen = 0;     /* we don't remember what scrolls
                   1392:                                   off the bottom */
                   1393:   dont_calculate_costs = 1;
                   1394: 
                   1395:   /* New options section */
                   1396:   IconWindow = 0;
                   1397:   XXborder = 1;
                   1398:   XXInternalBorder = 1;
                   1399:   screen_width = 80;
                   1400:   screen_height = 66;
                   1401:   reversevideo = 0;
                   1402:   XXxoffset = 0;
                   1403:   XXyoffset = 0;
                   1404:   XXdebug = 0;
                   1405: 
                   1406:   XErrorHandler (XExitGracefully);
                   1407:   XIOErrorHandler (x_io_error);
                   1408: 
                   1409:   progname = "emacs";
                   1410:   if (option = XGetDefault (progname,"ReverseVideo"))
                   1411:     if (strcmp (option,"on") == 0) reversevideo = 1;
                   1412:   if (option = XGetDefault (progname, "BitmapIcon"))
                   1413:     if (strcmp (option, "on") == 0) IconWindow = 1;
                   1414: 
                   1415:   if (option = XGetDefault (progname,"BorderWidth"))
                   1416:     XXborder = atoi (option);
                   1417:   if (option = XGetDefault (progname,"InternalBorder"))
                   1418:     XXInternalBorder = atoi (option);
                   1419: 
                   1420:   brdr_color = XGetDefault (progname,"Border");
                   1421:   if (!brdr_color) brdr_color = XGetDefault (progname, "BorderColor");
                   1422:   back_color = XGetDefault (progname,"Background");
                   1423:   fore_color = XGetDefault (progname,"Foreground");
                   1424:   mous_color = XGetDefault (progname,"Mouse");
                   1425:   curs_color = XGetDefault (progname,"Cursor");
                   1426: 
                   1427:   temp_font  = XGetDefault (progname,"BodyFont");
                   1428:   if (temp_font == 0) temp_font = X_DEFAULT_FONT;
                   1429:   XXcurrentfont = (char *) xmalloc (strlen (temp_font) + 1);
                   1430:   strcpy (XXcurrentfont, temp_font);
                   1431: 
                   1432:   /* If user has specified a special keymap for use with Emacs, use it. */
                   1433:   {
                   1434:     char *temp = XGetDefault (progname, "KeyMap");
                   1435:     if (temp) XUseKeymap (temp);
                   1436:   }
                   1437: 
                   1438:   if (DisplayCells () > 2)
                   1439:     {
                   1440: 
                   1441:       if (fore_color && XParseColor (fore_color, &cdef) &&
                   1442:          XGetHardwareColor (&cdef))
                   1443:        fore = cdef.pixel;
                   1444:       else
                   1445:        {
                   1446:          fore_color = "black";
                   1447:          fore = BlackPixel;
                   1448:        }
                   1449: 
                   1450:       if (back_color && XParseColor (back_color, &cdef) &&
                   1451:          XGetHardwareColor (&cdef))
                   1452:        back = cdef.pixel;
                   1453:       else
                   1454:        {
                   1455:          back_color = "white";
                   1456:          back = WhitePixel;
                   1457:        }
                   1458: 
                   1459:       if (curs_color && XParseColor (curs_color, &cdef) &&
                   1460:          XGetHardwareColor (&cdef))
                   1461:        curs = cdef.pixel;
                   1462:       else
                   1463:        {
                   1464:          curs_color = "black";
                   1465:          curs = BlackPixel;
                   1466:        }
                   1467: 
                   1468:       if (mous_color && XParseColor (mous_color, &cdef) &&
                   1469:          XGetHardwareColor (&cdef))
                   1470:        mous = cdef.pixel;
                   1471:       else
                   1472:        {
                   1473:          mous_color = "black";
                   1474:          mous = BlackPixel;
                   1475:        }
                   1476: 
                   1477:       if (brdr_color && XParseColor (brdr_color, &cdef) &&
                   1478:          XGetHardwareColor (&cdef))
                   1479:        brdr = cdef.pixel;
                   1480:       else
                   1481:        {
                   1482:          brdr_color = "black";
                   1483:          brdr = BlackPixel;
                   1484:        }
                   1485:     }
                   1486:   else
                   1487:     {
                   1488:       fore_color  = curs_color = mous_color = brdr_color = "black";
                   1489:       fore = curs = mous = brdr = BlackPixel;
                   1490:       back_color = "white";
                   1491:       back = WhitePixel;
                   1492:     }
                   1493: 
                   1494:   /*
                   1495:   if (fore_color && DisplayCells () > 2 &&
                   1496:       XParseColor (fore_color, &cdef) && XGetHardwareColor (&cdef))
                   1497:     fore = cdef.pixel;
                   1498:   else if (fore_color && strcmp (fore_color, "black") == 0)
                   1499:     fore = BlackPixel;
                   1500:   else if (fore_color && strcmp (fore_color, "white") == 0)
                   1501:     fore = WhitePixel;
                   1502:   else
                   1503:     {
                   1504:       fore_color = "black";
                   1505:       fore = BlackPixel;
                   1506:     }
                   1507: 
                   1508:   if (back_color && DisplayCells () > 2 &&
                   1509:       XParseColor (back_color, &cdef) && XGetHardwareColor (&cdef))
                   1510:     back = cdef.pixel;
                   1511:   else if (back_color && strcmp (back_color, "white") == 0)
                   1512:     back = WhitePixel;
                   1513:   else if (back_color && strcmp (back_color, "black") == 0)
                   1514:     back = BlackPixel;
                   1515:   else
                   1516:     {
                   1517:       back_color = "white";
                   1518:       back = WhitePixel;
                   1519:     }
                   1520: 
                   1521:   if (brdr_color && DisplayCells () > 2 &&
                   1522:       XParseColor (brdr_color, &cdef) && XGetHardwareColor (&cdef))
                   1523:     brdr = cdef.pixel;
                   1524:   else if (brdr_color && (!strcmp (brdr_color, "gray") ||
                   1525:                          !strcmp (brdr_color, "grey") ||
                   1526:                          !strcmp (brdr_color, "Gray") ||
                   1527:                          !strcmp (brdr_color, "Grey")))
                   1528:     brdr = BlackPixel;
                   1529:   else if (brdr_color && strcmp (brdr_color, "white") == 0)
                   1530:     brdr = WhitePixel;
                   1531:   else
                   1532:     {
                   1533:       brdr_color = "black";
                   1534:       brdr = BlackPixel;
                   1535:     }
                   1536: 
                   1537:   if (curs_color && DisplayCells () > 2 &&
                   1538:       XParseColor (curs_color, &cdef) && XGetHardwareColor (&cdef))
                   1539:     curs = cdef.pixel;
                   1540:   else if (curs_color && strcmp (curs_color, "black") == 0)
                   1541:     curs = BlackPixel;
                   1542:   else if (curs_color && strcmp (curs_color, "white") == 0)
                   1543:     curs = WhitePixel;
                   1544:   else
                   1545:     {
                   1546:       curs_color = "black";
                   1547:       curs = BlackPixel;
                   1548:     }
                   1549: 
                   1550:   if (mous_color && DisplayCells () > 2 &&
                   1551:       XParseColor (mous_color, &cdef) && XGetHardwareColor (&cdef))
                   1552:     mous = cdef.pixel;
                   1553:   else if (mous_color && strcmp (mous_color, "black") == 0)
                   1554:     mous = BlackPixel;
                   1555:   else if (mous_color && strcmp (mous_color, "white") == 0)
                   1556:     mous = WhitePixel;
                   1557:   else
                   1558:     {
                   1559:       mous_color = "black";
                   1560:       mous = BlackPixel;
                   1561:     }
                   1562:     */
                   1563: 
                   1564:   XXpid = getpid ();
                   1565:   if (XXcurrentfont == (char *) 0)
                   1566:     {
                   1567:       fprintf (stderr, "Memory allocation failure.\n");
                   1568:       exit (-150);
                   1569:     }
                   1570:   default_window = "=80x24+0+0";
                   1571: /* RMS: XTread_socket does not have an interface suitable
                   1572:    for being a signal handler.  In any case, the SIGIO handler is
                   1573:    set up in init_keyboard and X uses the same one as usual.  */
                   1574: /*  signal (SIGIO, XTread_socket); */
                   1575:   signal (SIGPIPE, XExitGracefully);
                   1576:   XQueryWindow (RootWindow, &rootwindowinfo);
                   1577:   strncpy (iconidentity, ICONTAG, MAXICID);
                   1578:   fontinfo = XOpenFont (XXcurrentfont);
                   1579:   if (fontinfo == (FontInfo *) 0)
                   1580:     {
                   1581:       fprintf (stderr, "No font\n");
                   1582:       exit (-98);
                   1583:     }
                   1584:   pixelwidth = screen_width * fontinfo->width + 2 * XXInternalBorder;
                   1585:   pixelheight = screen_height * fontinfo->height + 2 * XXInternalBorder;
                   1586:   XXwindow = XCreateWindow (RootWindow,
                   1587:                            XXxoffset /* Absolute horizontal offset */,
                   1588:                            XXyoffset /* Absolute Vertical offset */,
                   1589:                            pixelwidth, pixelheight,
                   1590:                            XXborder, BlackPixmap, WhitePixmap);
                   1591:   if (!XXwindow)
                   1592:     {
                   1593:       fprintf (stderr, "Unable to create window.\n");
                   1594:       exit (-97);
                   1595:     }
                   1596: 
                   1597:   XXIconWindow = XCreateWindow (RootWindow, 0, 0, sink_width, sink_height,
                   1598:                                2, WhitePixmap, (Pixmap) NULL);
                   1599: 
                   1600:   if (!XXIconWindow)
                   1601:     {
                   1602:       fprintf (stderr, "Unable to create icon window.\n");
                   1603:       fflush (stderr);
                   1604:       exit (-97);
                   1605:     }
                   1606:   XSelectInput (XXIconWindow, NoEvent);
                   1607:   XXIconMask = XStoreBitmap (sink_mask_width, sink_mask_height, sink_mask_bits);
                   1608: 
                   1609:   XSelectInput (XXwindow, NoEvent);
                   1610:   XSetResizeHint (XXwindow, 2 * XXInternalBorder, 2 * XXInternalBorder,
                   1611:                  /* fontinfo->width * 1, fontinfo->height * 1, */
                   1612:                  fontinfo->width, fontinfo->height);
                   1613: 
                   1614: #if defined (BSD) || defined (HPUX) || defined (IBMRTAIX)
                   1615:   if (gethostname (&iconidentity[sizeof (ICONTAG) - 1],
                   1616:                   (MAXICID - 1) - sizeof (ICONTAG)))
                   1617: #endif
                   1618:     {
                   1619:       iconidentity[sizeof (ICONTAG) - 2] = '\0';
                   1620:     }
                   1621:   XStoreName (XXwindow, &iconidentity[0]);
                   1622: 
                   1623:   EmacsCursor = XCreateCursor (16, 16, MouseCursor, MouseMask,
                   1624:                               0, 0, mous, back, GXcopy);
                   1625:   XDefineCursor (XXwindow, EmacsCursor);
                   1626:   flexlines = screen_height;
                   1627: #if 0
                   1628: /* Do not call XPopUpWindow here!  This is too early.
                   1629:    It is supposed ot be called via the term-setup-hook
                   1630:    and not until after lisp/term/x-win.el has had a chance
                   1631:    to process the user's switches.
                   1632:    I am not sure that there are any circumstances under which
                   1633:    this should be done here  -- RMS.  */
                   1634:   XPopUpWindow ();             /* This looks at Vxterm */
                   1635: #endif /* 0 */
                   1636:   if (reversevideo) XFlipColor ();
                   1637: }
                   1638: 
                   1639: x_init_1 (unrequest)
                   1640: {
                   1641: #ifdef F_SETOWN
                   1642:   extern int old_fcntl_owner;
                   1643: #endif
                   1644: #ifndef USG
                   1645:   extern void init_sigio (), request_sigio (), unrequest_sigio ();
                   1646: #endif
                   1647: 
                   1648:   dup2 (dpyno (), 0);
                   1649:   close (dpyno ());
                   1650:   dpyno () = 0;                        /* Looks a little strange?
                   1651:                                   check the def of the macro;
                   1652:                                   it is a genuine lvalue */
                   1653: #ifndef USG
                   1654:   init_sigio ();
                   1655:   request_sigio ();
                   1656: #endif /* USG */
                   1657: #ifdef F_SETOWN
                   1658:   old_fcntl_owner = fcntl (0, F_GETOWN, 0);
                   1659:   fcntl (0, F_SETOWN, getpid ());
                   1660: #endif
                   1661: #ifndef USG
                   1662:   if (unrequest) unrequest_sigio ();
                   1663: #endif
                   1664: }
                   1665: 
                   1666: /* Process all queued ExposeRegion events. */
                   1667: static
                   1668: dumpqueue ()
                   1669: {
                   1670:   register int i;
                   1671:   XExposeRegionEvent r;
                   1672:   if ((XXqueue.rindex > XXqueue.mindex) ||
                   1673:       (XXqueue.windex > XXqueue.mindex) ||
                   1674:       (XXqueue.rindex < 0) ||
                   1675:       (XXqueue.windex < 0))
                   1676:     {
                   1677:       PendingExposure = 1;
                   1678:     }
                   1679:   else
                   1680:     while (XXqueue.rindex != XXqueue.windex)
                   1681:       {
                   1682:        if (CursorExists)
                   1683:          CursorToggle ();
                   1684:        unloadxrepbuffer (&r, &XXqueue);
                   1685:        dumprectangle (r.y - XXInternalBorder, r.x - XXInternalBorder,
                   1686:                       r.height, r.width);
                   1687:       }
                   1688: }
                   1689: 
                   1690: XSetFlash ()
                   1691: {
                   1692:   ring_bell_hook = XTflash;
                   1693: }
                   1694: 
                   1695: XSetFeep ()
                   1696: {
                   1697:   ring_bell_hook = XTfeep;
                   1698: }
                   1699: 
                   1700: XNewFont (newname)
                   1701:      register char *newname;
                   1702: {
                   1703:   FontInfo *temp;
                   1704:   BLOCK_INPUT_DECLARE ()
                   1705: 
                   1706:   BLOCK_INPUT ();
                   1707:   XFlush ();
                   1708:   if (XXdebug)
                   1709:     fprintf (stderr, "Request id is %d\n", XXdisplay->request);
                   1710:   temp = XOpenFont (newname);
                   1711:   if (temp == (FontInfo *) 0)
                   1712:     {
                   1713:       UNBLOCK_INPUT_RESIGNAL ();
                   1714:       return -1;
                   1715:     }
                   1716:   XCloseFont (fontinfo);
                   1717:   fontinfo = temp;
                   1718:   XSetResizeHint (XXwindow, 2*XXInternalBorder, 2*XXInternalBorder,
                   1719:                  /* fontinfo->width * 1, fontinfo->height * 1, */
                   1720:                  fontinfo->width, fontinfo->height);
                   1721:   XSetWindowSize (screen_height, screen_width);
                   1722:   UNBLOCK_INPUT_RESIGNAL ();
                   1723:   return 0;
                   1724: }
                   1725: 
                   1726: XFlipColor ()
                   1727: {
                   1728:   Pixmap temp;
                   1729:   int tempcolor;
                   1730:   char *tempname;
                   1731:   Cursor temp_curs;
                   1732:   BLOCK_INPUT_DECLARE ()
                   1733: 
                   1734:   BLOCK_INPUT ();
                   1735:   CursorToggle ();
                   1736:   temp = XMakeTile (fore);
                   1737:   XChangeBackground (XXwindow, temp);
                   1738:   XFreePixmap (temp);
                   1739:   temp = XMakeTile (back);
                   1740:   if (XXborder)
                   1741:     XChangeBorder (XXwindow, temp);
                   1742:   XFreePixmap (temp);
                   1743:   brdr = back;
                   1744:   brdr_color = back_color;
                   1745:   tempcolor = fore;
                   1746:   fore = back;
                   1747:   back = tempcolor;
                   1748:   tempname = fore_color ;
                   1749:   fore_color = back_color;
                   1750:   back_color = tempname;
                   1751: /*  XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width,
                   1752:            screen_height * fontinfo->height, back, ClipModeClipped,
                   1753:            GXcopy, AllPlanes);
                   1754:   dumprectangle (0, 0, screen_height * fontinfo->height + 2 * XXInternalBorder,
                   1755:   screen_width * fontinfo -> width + 2 * XXInternalBorder);*/
                   1756:   XRedrawDisplay ();
                   1757:   if (curs == WhitePixel)
                   1758:     {
                   1759:       curs = BlackPixel;
                   1760:       curs_color = "black";
                   1761:     }
                   1762:   else if (curs == BlackPixel)
                   1763:     {
                   1764:       curs = WhitePixel;
                   1765:       curs_color = "white";
                   1766:     }
                   1767:   if (mous == WhitePixel)
                   1768:     {
                   1769:       mous = BlackPixel;
                   1770:       mous_color = "black";
                   1771:     }
                   1772:   else if (mous == BlackPixel)
                   1773:     {
                   1774:       mous = WhitePixel;
                   1775:       mous_color = "white";
                   1776:     }
                   1777:   temp_curs = XCreateCursor (16, 16, MouseCursor, MouseMask, 0, 0,
                   1778:                             mous, back, GXcopy);
                   1779:   XUndefineCursor (XXwindow);
                   1780:   XDefineCursor (XXwindow, temp_curs);
                   1781:   XFreeCursor (EmacsCursor);
                   1782:   bcopy (&temp_curs, &EmacsCursor, sizeof (Cursor));
                   1783:   CursorToggle ();
                   1784:   XFlush ();
                   1785:   UNBLOCK_INPUT ();
                   1786: }
                   1787: 
                   1788: XSetOffset (xoff, yoff)
                   1789:      register int xoff, yoff;
                   1790: {
                   1791:   BLOCK_INPUT_DECLARE ()
                   1792: 
                   1793:   BLOCK_INPUT ();
                   1794:   if (xoff < 0)
                   1795:     {
                   1796:       XXxoffset = rootwindowinfo.width + (++xoff) - pixelwidth - 4;
                   1797:     }
                   1798:   else
                   1799:     {
                   1800:       XXxoffset = xoff;
                   1801:     }
                   1802:   if (yoff < 0)
                   1803:     {
                   1804:       XXyoffset
                   1805:        = rootwindowinfo.height + (++yoff) - pixelheight - 4;
                   1806:     }
                   1807:   else
                   1808:     {
                   1809:       XXyoffset = yoff;
                   1810:     }
                   1811:   XMoveWindow (XXwindow, XXxoffset, XXyoffset);
                   1812:   UNBLOCK_INPUT ();
                   1813:   /* XWarpMouse (XXwindow, pixelwidth >> 1, pixelheight >> 1); */
                   1814: }
                   1815: 
                   1816: XSetWindowSize (rows, cols)
                   1817:      register int rows, cols;
                   1818: {
                   1819:   /* if (rows < 3) rows = 24;
                   1820:      if (cols < 1) cols = 80; */
                   1821:   pixelwidth = cols * fontinfo->width + 2 * XXInternalBorder;
                   1822:   pixelheight = rows * fontinfo->height + 2 * XXInternalBorder;
                   1823:   XChangeWindow (XXwindow, pixelwidth, pixelheight);
                   1824:   XFlush ();
                   1825:   change_screen_size (rows, cols);
                   1826:   PendingExposure = 0;
                   1827: }
                   1828: 
                   1829: XPopUpWindow ()
                   1830: {
                   1831:   BLOCK_INPUT_DECLARE ()
                   1832:   if (WindowMapped)
                   1833:     return;
                   1834:   BLOCK_INPUT ();
                   1835:   if (!x_edges_specified)
                   1836:     Fx_rubber_band ();
                   1837:   bitblt = 0;
                   1838:   CursorExists = 0;
                   1839:   VisibleX = 0;
                   1840:   VisibleY = 0;
                   1841:   WindowMapped = 1;
                   1842:   XMapWindow (XXwindow);
                   1843:   dumprectangle (0, 0,
                   1844:                 screen_height * fontinfo->height + 2 * XXInternalBorder,
                   1845:                 screen_width * fontinfo->width + 2 * XXInternalBorder);
                   1846:   XSelectInput (XXwindow, KeyPressed | ExposeWindow | ButtonPressed
                   1847:                | ButtonReleased
                   1848:                | ExposeRegion | ExposeCopy);
                   1849:   /*   XWarpMouse (XXwindow, pixelwidth >> 1, pixelheight >> 1);*/
                   1850:   XTtopos (0, 0);
                   1851:   if (IconWindow)
                   1852:     {
                   1853:       XSetIconWindow (XXwindow,XXIconWindow);
                   1854:       XSelectInput (XXIconWindow, ExposeWindow);
                   1855:     }
                   1856:   else
                   1857:     {
                   1858:       XClearIconWindow (XXwindow);
                   1859:       XSelectInput (XXIconWindow, NoEvent);
                   1860:     }
                   1861:   /*  XRedrawDisplay ();*/
                   1862:   XFlush ();
                   1863:   UNBLOCK_INPUT ();
                   1864: }
                   1865: 
                   1866: spacecheck (mindex, rindex, windex, minfreespace)
                   1867:      register int mindex, rindex, windex, minfreespace;
                   1868: {
                   1869:   if ((rindex > mindex) || (windex > mindex))
                   1870:     {
                   1871:       /* fprintf (stderr, "Fatal Mouse Buffer Error.\n");
                   1872:         fprintf (stderr, "%d = mindex, %d = rindex, %d = windex\n",
                   1873:         mindex, rindex, windex); */
                   1874:       return -2;
                   1875:     }
                   1876:   if (windex >= rindex)
                   1877:     {
                   1878:       if ((mindex - (windex - rindex)) > minfreespace)
                   1879:        return 0;
                   1880:     }
                   1881:   else
                   1882:     {
                   1883:       if (((rindex - windex) - 1) > minfreespace)
                   1884:        return 0;
                   1885:     }
                   1886:   return -1;
                   1887: }
                   1888: 
                   1889: loadxrepbuffer (p_xrep, p_buffer)
                   1890:      register XEvent *p_xrep;
                   1891:      register XREPBUFFER *p_buffer;
                   1892: {
                   1893:   p_buffer->xrep[p_buffer->windex] = *p_xrep;
                   1894:   if (p_buffer->windex == p_buffer->mindex)
                   1895:     p_buffer->windex = 0;
                   1896:   else
                   1897:     p_buffer->windex++;
                   1898: }
                   1899: 
                   1900: unloadxrepbuffer (p_xrep, p_buffer)
                   1901:      register XEvent *p_xrep;
                   1902:      register XREPBUFFER *p_buffer;
                   1903: {
                   1904:   if (p_buffer->windex == p_buffer->rindex)
                   1905:     return -1;
                   1906:   *p_xrep = p_buffer->xrep[p_buffer->rindex];
                   1907:   if (p_buffer->rindex == p_buffer->mindex)
                   1908:     p_buffer->rindex = 0;
                   1909:   else
                   1910:     p_buffer->rindex++;
                   1911:   return 0;
                   1912: }
                   1913: 
                   1914: fixxrepbuffer ()
                   1915: {
                   1916:   Xxrepbuffer.mindex = XREPBUFSIZE - 1;
                   1917:   Xxrepbuffer.windex = 0;
                   1918:   Xxrepbuffer.rindex = 0;
                   1919: }
                   1920: 
                   1921: #endif /* HAVE_X_WINDOWS */

unix.superglobalmegacorp.com

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