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