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

1.1       root        1: /* X Communication module for terminals which understand the X protocol.
                      2:    Copyright (C) 1988 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU Emacs.
                      5: 
                      6: GNU Emacs is distributed in the hope that it will be useful,
                      7: but WITHOUT ANY WARRANTY.  No author or distributor
                      8: accepts responsibility to anyone for the consequences of using it
                      9: or for whether it serves any particular purpose or works at all,
                     10: unless he says so in writing.  Refer to the GNU Emacs General Public
                     11: License for full details.
                     12: 
                     13: Everyone is granted permission to copy, modify and redistribute
                     14: GNU Emacs, but only under the conditions described in the
                     15: GNU Emacs General Public License.   A copy of this license is
                     16: supposed to have been given to you along with GNU Emacs so you
                     17: can know your rights and responsibilities.  It should be in a
                     18: file named COPYING.  Among other things, the copyright notice
                     19: and this notice must be preserved on all copies.  */
                     20: 
                     21: /* Written by Yakim Martillo, mods and things by Robert Krawitz  */
                     22: /* Redone for X11 by Robert French */
                     23: /* Thanks to Mark Biggers for all of the Window Manager support */
                     24: 
                     25: /*
                     26:  *     $Source: /mit/emacs/src/RCS/11xterm.c,v $
                     27:  *     $Author: rfrench $
                     28:  *     $Locker:  $
                     29:  *     $Header: x11term.c,v 1.12 88/02/29 14:11:07 rfrench Exp $
                     30:  */
                     31: 
                     32: #ifndef lint
                     33: static char *rcsid_xterm_c = "$Header: x11term.c,v 1.12 88/02/29 14:11:07 rfrench Exp $";
                     34: #endif lint
                     35: 
                     36: /* On 4.3 this loses if it comes after x11term.h.
                     37:    On hp-ux it loses if it comes after config.h.  */
                     38: #include <signal.h>
                     39: #include <sys/ioctl.h>
                     40: 
                     41: /* Load sys/types.h if not already loaded.
                     42:    In some systems loading it twice is suicidal.  */
                     43: #ifndef makedev
                     44: #include <sys/types.h>
                     45: #endif
                     46: 
                     47: #include "config.h"
                     48: 
                     49: #ifdef HAVE_X_WINDOWS
                     50: /*#define LK201 */ /* DecStation Keyboards (EVM) */
                     51: 
                     52: #include "lisp.h"
                     53: #undef NULL
                     54: 
                     55: /* Allow m- file to inhibit use of interrupt-driven input.  */
                     56: #ifdef BROKEN_FIONREAD
                     57: #undef FIONREAD
                     58: #endif
                     59: 
                     60: /* We are unable to use interrupts if FIONREAD is not available,
                     61:    so flush SIGIO so we won't try.  */
                     62: #ifndef FIONREAD
                     63: #ifdef SIGIO
                     64: #undef SIGIO
                     65: #endif
                     66: #endif
                     67: 
                     68: /* This may include sys/types.h, and that somehow loses
                     69:    if this is not done before the other system files.
                     70:    However, perhaps the problem has been avoided by loading types.h above.  */
                     71: 
                     72: #include "x11term.h"
                     73: 
                     74: #ifdef USG
                     75: #ifdef IRIS_4D
                     76: #include <sys/time.h>
                     77: #else
                     78: #include <time.h>
                     79: #endif
                     80: #else
                     81: #include <sys/time.h>
                     82: #endif
                     83: 
                     84: #ifdef AIX
                     85: #include <sys/time.h>   /* In addition to time.h.  */
                     86: #endif
                     87: 
                     88: #include <fcntl.h>
                     89: #include <stdio.h>
                     90: #include <ctype.h>
                     91: #include <errno.h>
                     92: #ifdef BSD
                     93: #include <strings.h>
                     94: #endif
                     95: #include <sys/stat.h>
                     96: 
                     97: #include "dispextern.h"
                     98: #include "termhooks.h"
                     99: #include "termopts.h"
                    100: #include "termchar.h"
                    101: 
                    102: #include "sink11.h"
                    103: #include "sink11mask.h"
                    104: 
                    105: #define min(a,b) ((a)<(b) ? (a) : (b))
                    106: #define max(a,b) ((a)>(b) ? (a) : (b))
                    107:        
                    108: extern int errno;
                    109: 
                    110: #define sigunblockx(sig) sigblock (0)
                    111: #define sigblockx(sig) sigblock (1 << ((sig) - 1))
                    112: 
                    113: #define METABIT 0200
                    114: #define MINWIDTH 12    /* In pixels */
                    115: #define MINHEIGHT 5    /* In pixels */
                    116: #define MAXHEIGHT 300  /* In lines */
                    117: 
                    118: int pixelwidth,pixelheight;
                    119: char *progname;
                    120: 
                    121: XEvent *XXm_queue[XMOUSEBUFSIZE];
                    122: int XXm_queue_num, XXm_queue_in, XXm_queue_out;
                    123: 
                    124: char *XXcurrentfont;
                    125: XFontStruct *fontinfo;
                    126: Font XXfid;
                    127: int XXfontw, XXfonth, XXbase, XXisColor;
                    128: 
                    129: Colormap XXColorMap;
                    130: char *default_window;
                    131: int configure_pending;
                    132: extern struct display_line *DesiredScreen[], *PhysScreen[];
                    133: extern int initialized;
                    134: extern int screen_width, screen_height;
                    135: 
                    136: /* Function for init_keyboard to call with no args (if nonzero).  */
                    137: extern void (*keyboard_init_hook) ();
                    138: 
                    139: extern char *alternate_display;
                    140: extern int xargc;
                    141: extern char **xargv;
                    142: 
                    143: int XXdebug;
                    144: int XXpid;
                    145: 
                    146: int WindowMapped;
                    147: 
                    148: char  *XXidentity;     /* Resource name of this invocation of Emacs */
                    149: static char  *XXicon_name;     /* user-supplied icon info */
                    150: static int   XXicon_usebitmap; /* Use bitmap or not */
                    151: static char  *XXheader;                /* user-supplied window header info */
                    152: 
                    153: static int flexlines;                  /* last line affected by dellines or
                    154:                                 * inslines functions */
                    155: int VisibleX, VisibleY;                /* genuine location of cursor on screen
                    156:                                 * if it is there */
                    157: 
                    158: static int SavedX, SavedY;     /* Where the cursor was before update
                    159:                                 * started */
                    160: 
                    161: 
                    162: int CursorExists;              /* during updates cursor is turned off */
                    163: int CursorOutline;             /* when the pointer is not in the Emacs
                    164:                                 * widow the cursor should be drawn in
                    165:                                 * outline form a la xterm */
                    166: static int InUpdate;           /* many of functions here may be invoked
                    167:                                 * even if no update in progress; when
                    168:                                 * no update is in progress the action
                    169:                                 * can be slightly different */
                    170: 
                    171: Display *XXdisplay;
                    172: int XXscreen;
                    173: Window XXwindow;
                    174: GC XXgc_norm,XXgc_rev,XXgc_curs,XXgc_temp;
                    175: XGCValues XXgcv;
                    176: Cursor EmacsCursor;
                    177: Pixmap SinkPixmap, SinkMaskPixmap;
                    178: 
                    179: char *fore_color;      /* Variables to store color names */
                    180: char *back_color;
                    181: char *brdr_color;
                    182: char *curs_color;
                    183: char *mous_color;
                    184: 
                    185: unsigned long fore;    /* Variables to store pixel values */
                    186: unsigned long back;
                    187: unsigned long brdr;
                    188: unsigned long curs;
                    189: 
                    190: char *desiredwindow;
                    191: 
                    192: int CurHL;                     /* Current Highlighting (ala mode line) */
                    193: 
                    194: int XXborder;                  /* Window border width */
                    195: int XXInternalBorder;          /* Internal border width */
                    196: int updated[MAXHEIGHT];
                    197: 
                    198: static char  *temp_font;                /* needed because of loading hacks */
                    199: static char  *temp_reverseVideo;
                    200: static char  *temp_borderWidth;
                    201: static char  *temp_internalBorder;
                    202: 
                    203: struct _xdeftab 
                    204: {
                    205:   char *iname;                 /* instance name */
                    206:   char *cname;                 /* class name (fake it) */
                    207:   char **varp;                 /* variable to set */
                    208: };
                    209: 
                    210: static struct _xdeftab xDefaultsValueTable[]
                    211:  = {
                    212:      { "reverseVideo", "ReverseVideo",         &temp_reverseVideo },
                    213:      { "borderWidth",  "BorderWidth",          &temp_borderWidth },
                    214:      { "internalBorder","BorderWidth",         &temp_internalBorder },
                    215:      { "borderColor",  "BorderColor",          &brdr_color },
                    216:      { "background",   "Background",           &back_color },
                    217:      { "foreground",   "Foreground",           &fore_color },
                    218:      { "pointerColor", "Foreground",           &mous_color },
                    219:      { "cursorColor",  "Foreground",           &curs_color },
                    220:      { "font",         "Font",                 &temp_font },
                    221:      { "geometry",     "Geometry",             &desiredwindow },
                    222:      { "title",                "Title",                &XXheader },
                    223:      { "iconName",     "Title",                &XXicon_name },
                    224:      { NULL,           NULL,                   NULL }
                    225:    };
                    226: 
                    227: 
                    228: int (*handler)();
                    229: 
                    230: static void x_init_1 ();
                    231: 
                    232: char *rindex();
                    233: 
                    234: /* HLmode -- Changes the GX function for output strings.  Could be used to
                    235:  * change font.  Check an XText library function call.
                    236:  */
                    237: 
                    238: HLmode (new)
                    239:      int new;
                    240: {
                    241:        extern Lisp_Object inverse_video;
                    242:        
                    243:        CurHL = new;
                    244: }
                    245: 
                    246: /* External interface to control of standout mode.
                    247:    Call this when about to modify line at position VPOS
                    248:    and not change whether it is highlighted.  */
                    249: 
                    250: XTreassert_line_highlight (highlight, vpos)
                    251:      int highlight, vpos;
                    252: {
                    253:        HLmode (highlight);
                    254: }
                    255: 
                    256: /* Call this when about to modify line at position VPOS
                    257:    and change whether it is highlighted.  */
                    258: 
                    259: XTchange_line_highlight (new_highlight, vpos, first_unused_hpos)
                    260:      int new_highlight, vpos, first_unused_hpos;
                    261: {
                    262:        HLmode (new_highlight);
                    263:        XTtopos (vpos, 0);
                    264:        x_clear_end_of_line (0);
                    265: }
                    266: 
                    267: 
                    268: /* Used for starting or restarting (after suspension) the X window.  Puts the
                    269:  * cursor in a known place, update does not begin with this routine but only
                    270:  * with a call to DoDsp.
                    271:  */
                    272: 
                    273: XTset_terminal_modes ()
                    274: {
                    275:        int stuffpending;
                    276: #ifdef XDEBUG
                    277:        fprintf (stderr, "XTset_terminal_modes\n");
                    278: #endif
                    279: 
                    280:        InUpdate = 0;
                    281:        stuffpending = 0;
                    282:        if (!initialized) {
                    283:                CursorExists = 0;
                    284:                CursorOutline = 1;
                    285:                VisibleX = 0;
                    286:                VisibleY = 0;
                    287:        }
                    288:        XTclear_screen ();
                    289: }
                    290: 
                    291: /* XTtopos moves the cursor to the correct location and checks whether an
                    292:  * update is in progress in order to toggle it on.
                    293:  */
                    294: 
                    295: XTtopos (row, col)
                    296:      register int row, col;
                    297: {
                    298:        BLOCK_INPUT_DECLARE ();
                    299: #ifdef XDEBUG
                    300:        fprintf (stderr, "XTtopos (X %d, Y %d)\n",col,row);
                    301: #endif
                    302: 
                    303:        BLOCK_INPUT ();
                    304:        cursX = col;
                    305:        cursY = row;
                    306: 
                    307:        if (InUpdate) {
                    308:                if (CursorExists)
                    309:                        CursorToggle ();
                    310:                UNBLOCK_INPUT ();
                    311:                return;
                    312:                /* Generally, XTtopos will be invoked */
                    313:                /* when InUpdate with !CursorExists */
                    314:                /* so that wasteful XFlush is not called */
                    315:        }
                    316:        if ((row == VisibleY) && (col == VisibleX)) {
                    317:                if (!CursorExists)
                    318:                        CursorToggle ();
                    319:                XFlush (XXdisplay);
                    320:                UNBLOCK_INPUT ();
                    321:                return;
                    322:        }
                    323:        if (CursorExists)
                    324:                CursorToggle ();
                    325:        VisibleX = col;
                    326:        VisibleY = row;
                    327:        if (!CursorExists)
                    328:                CursorToggle ();
                    329:        XFlush (XXdisplay);
                    330:        UNBLOCK_INPUT ();
                    331: }
                    332: 
                    333: /* Used to get the terminal back to a known state after resets.  Usually
                    334:  * used when restarting suspended or waiting emacs
                    335:  */
                    336: 
                    337: cleanup ()
                    338: {
                    339:        inverse_video = 0;
                    340:        HLmode (0);
                    341: }
                    342: 
                    343: /* Erase current line from current column to column END.
                    344:    Leave cursor at END.  */
                    345: 
                    346: XTclear_end_of_line (end)
                    347:      register int end;
                    348: {
                    349:   register int numcols;
                    350:   BLOCK_INPUT_DECLARE ();
                    351: 
                    352: #ifdef XDEBUG
                    353:   fprintf (stderr, "XTclear_end_of_line (to %d)\n",end);
                    354: #endif
                    355: 
                    356:   if (cursY < 0 || cursY >= screen_height)
                    357:     return;
                    358: 
                    359:   if (end <= cursX)
                    360:     return;
                    361:   if (end >= screen_width)
                    362:     end = screen_width;
                    363: 
                    364:   numcols = end - cursX;
                    365:   BLOCK_INPUT ();
                    366:   if (cursY == VisibleY && VisibleX >= cursX && VisibleX < end)
                    367:     if (CursorExists) CursorToggle ();
                    368:   if (CurHL)
                    369:     XFillRectangle (XXdisplay, XXwindow, XXgc_norm,
                    370:                    cursX*XXfontw+XXInternalBorder,
                    371:                    cursY*XXfonth+XXInternalBorder,
                    372:                    XXfontw*numcols,
                    373:                    XXfonth);
                    374:   else
                    375:     XClearArea (XXdisplay, XXwindow,
                    376:                cursX*XXfontw+XXInternalBorder,
                    377:                cursY*XXfonth+XXInternalBorder,
                    378:                XXfontw*numcols,
                    379:                XXfonth,
                    380:                0);
                    381:   XTtopos (cursY, end);
                    382:   UNBLOCK_INPUT ();
                    383: }
                    384: 
                    385: /* Erase current line from column START to right margin.
                    386:    Leave cursor at START.  */
                    387: 
                    388: x_clear_end_of_line (start)
                    389:      register int start;
                    390: {
                    391:   register int numcols;
                    392:   BLOCK_INPUT_DECLARE ();
                    393: 
                    394: #ifdef XDEBUG
                    395:   fprintf (stderr, "x_clear_end_of_line (start %d)\n",first_blank);
                    396: #endif
                    397: 
                    398:   if (cursY < 0 || cursY >= screen_height)
                    399:     return;
                    400: 
                    401:   if (start >= screen_width)
                    402:     return;
                    403:   if (start < 0)
                    404:     start = 0;
                    405: 
                    406:   numcols = screen_width - start;
                    407:   BLOCK_INPUT ();
                    408:   if (cursY == VisibleY && VisibleX >= start)
                    409:     if (CursorExists) CursorToggle ();
                    410:   if (CurHL)
                    411:     XFillRectangle (XXdisplay, XXwindow, XXgc_norm,
                    412:                    start*XXfontw+XXInternalBorder,
                    413:                    cursY*XXfonth+XXInternalBorder,
                    414:                    XXfontw*numcols,
                    415:                    XXfonth);
                    416:   else
                    417:     XClearArea (XXdisplay, XXwindow,
                    418:                start*XXfontw+XXInternalBorder,
                    419:                cursY*XXfonth+XXInternalBorder,
                    420:                XXfontw*numcols,
                    421:                XXfonth,
                    422:                0);
                    423:   XTtopos (cursY, start);
                    424:   UNBLOCK_INPUT ();
                    425: }
                    426: 
                    427: XTreset_terminal_modes ()
                    428: {
                    429: #ifdef XDEBUG
                    430:        fprintf (stderr, "XTreset_terminal_modes\n");
                    431: #endif
                    432: 
                    433:        XTclear_screen ();
                    434: }
                    435: 
                    436: XTclear_screen ()
                    437: {
                    438:        BLOCK_INPUT_DECLARE ();
                    439: 
                    440: #ifdef XDEBUG
                    441:        fprintf (stderr, "XTclear_screen\n");
                    442: #endif
                    443: 
                    444:        BLOCK_INPUT ();
                    445:        HLmode (0);
                    446:        CursorExists = 0;
                    447: 
                    448:        cursX = 0;
                    449:        cursY = 0;
                    450:        SavedX = 0;
                    451:        SavedY = 0;
                    452:        VisibleX = 0;
                    453:        VisibleY = 0;
                    454:        XClearWindow(XXdisplay, XXwindow);
                    455:        CursorToggle ();
                    456:        if (!InUpdate)
                    457:                XFlush (XXdisplay);
                    458:        UNBLOCK_INPUT ();
                    459: }
                    460: 
                    461: /* used by dumprectangle which is usually invoked upon Expose
                    462:  * events which come from bit blt's or moving an obscuring opaque window
                    463:  */
                    464: 
                    465: dumpchars (ActiveScreen, numcols, tempX, tempY, tempHL)
                    466:      register struct display_line **ActiveScreen;
                    467:      register int numcols;
                    468:      register int tempX, tempY, tempHL;
                    469: {
                    470:        if (numcols <= 0)
                    471:                return;
                    472: 
                    473:        if (numcols-1+tempX > screen_width)
                    474:                numcols = screen_width-tempX+1;
                    475: 
                    476:        if (tempX < 0 || tempX >= screen_width ||
                    477:            tempY < 0 || tempY >= screen_height)
                    478:                return;
                    479: 
                    480:        XDrawImageString(XXdisplay, XXwindow, tempHL ? XXgc_rev : XXgc_norm,
                    481:                         tempX*XXfontw+XXInternalBorder,
                    482:                         tempY*XXfonth+XXInternalBorder+XXbase,
                    483:                         &ActiveScreen[tempY+1]->body[tempX],
                    484:                         numcols);
                    485: }
                    486: 
                    487: /* When a line has been changed this function is called.  Due to various
                    488:  * bits of braindamage on the parts of both X11 and Emacs, the new
                    489:  * version of the line is simply output if this function is invoked while
                    490:  * in UpDate.  Sometimes writechars can be invoked when not in update if
                    491:  * text is to be output at the end of the line.  In this case the whole
                    492:  * line is not output.  Simply the new text at the current cursor
                    493:  * position given by VisibleX,Y.  The cursor is moved to the end of the
                    494:  * new text.
                    495:  */
                    496: 
                    497: updateline (first)
                    498:        int first;
                    499: {
                    500:        register int temp_length;
                    501:        BLOCK_INPUT_DECLARE ();
                    502: 
                    503: #ifdef XDEBUG
                    504:        fprintf(stderr, "updateline\n");
                    505: #endif XDEBUG
                    506: 
                    507:        BLOCK_INPUT ();
                    508:        if ((cursY < 0) || (cursY >= screen_height)
                    509:            || updated[cursY]) {
                    510:                UNBLOCK_INPUT ();
                    511:                return;
                    512:        }
                    513:        if (!first)
                    514:                updated[cursY] = 1;
                    515:        if (CursorExists)
                    516:                CursorToggle ();
                    517:        if (DesiredScreen && DesiredScreen[cursY + 1])
                    518:                temp_length = DesiredScreen[cursY + 1]->length-first;
                    519:        else
                    520:                temp_length = 0;
                    521:        if (temp_length > 0) {
                    522:                XDrawImageString (XXdisplay, XXwindow,
                    523:                                  CurHL ? XXgc_rev : XXgc_norm,
                    524:                                  first*XXfontw+XXInternalBorder,
                    525:                                  cursY*XXfonth+XXInternalBorder+XXbase,
                    526:                                  &DesiredScreen[cursY + 1]->body[first],
                    527:                                  temp_length);
                    528:                if (temp_length < screen_width)
                    529:                        x_clear_end_of_line (temp_length);
                    530:                XTtopos (cursY, temp_length);
                    531:        }
                    532:        else {
                    533:                x_clear_end_of_line (0);
                    534:                XTtopos (cursY, 0);
                    535:        }
                    536:        UNBLOCK_INPUT ();
                    537: }
                    538: 
                    539: writechars (start, end)
                    540:        register char *start, *end;
                    541: {
                    542:   BLOCK_INPUT_DECLARE ();
                    543: 
                    544: #ifdef XDEBUG
                    545:   fprintf(stderr, "writechars (cursX %d temp_len %d InUpd %d)\n",
                    546:          cursX, end-start+1, InUpdate);
                    547: #endif XDEBUG
                    548: 
                    549:   BLOCK_INPUT ();
                    550: 
                    551:   if ((cursY < 0) || (cursY >= screen_height))
                    552:     {
                    553:       UNBLOCK_INPUT ();
                    554:       return;
                    555:     }
                    556: 
                    557:   if (CursorExists)
                    558:     CursorToggle ();
                    559: 
                    560: 
                    561:   if (InUpdate)
                    562:     {
                    563:       XDrawImageString (XXdisplay, XXwindow,
                    564:                        CurHL ? XXgc_rev : XXgc_norm,
                    565:                        cursX*XXfontw+XXInternalBorder,
                    566:                        cursY*XXfonth+XXInternalBorder+XXbase,
                    567:                        start,
                    568:                        (end - start) + 1);
                    569:       XTtopos (cursY, (end - start) + 1);
                    570: 
                    571:       UNBLOCK_INPUT ();
                    572:       return;
                    573:     }
                    574: 
                    575:   if ((VisibleX < 0) || (VisibleX >= screen_width)) {
                    576:     UNBLOCK_INPUT ();
                    577:     return;
                    578:   }
                    579:   if ((VisibleY < 0) || (VisibleY >= screen_height)) {
                    580:     UNBLOCK_INPUT ();
                    581:     return;
                    582:   }
                    583:   if (((end - start) + VisibleX) >= screen_width)
                    584:     end = start + (screen_width - (VisibleX + 1));
                    585:   if (end >= start) {
                    586:     XDrawImageString (XXdisplay, XXwindow,
                    587:                      CurHL ? XXgc_rev : XXgc_norm,
                    588:                      (VisibleX * XXfontw+XXInternalBorder),
                    589:                      VisibleY * XXfonth+XXInternalBorder+XXbase,
                    590:                      start,
                    591:                      ((end - start) + 1));
                    592:     VisibleX = VisibleX + (end - start) + 1;
                    593:   }
                    594:   if (!CursorExists)
                    595:     CursorToggle ();
                    596:   UNBLOCK_INPUT ();
                    597: }
                    598: 
                    599: static
                    600: XTwrite_chars (start, len)
                    601:      register char *start;
                    602:      register int len;
                    603: {
                    604: #ifdef XDEBUG
                    605:        fprintf (stderr, "XTwrite_chars (len %d)\n",len);
                    606: #endif
                    607: 
                    608:        writechars (start, start+len-1);
                    609: }
                    610: 
                    611: XTflash ()
                    612: {
                    613:        XGCValues gcv_temp;
                    614:        struct timeval to;
                    615:        BLOCK_INPUT_DECLARE ();
                    616: 
                    617: #ifdef XDEBUG
                    618:        fprintf (stderr, "XTflash\n");
                    619: #endif
                    620: 
                    621:        BLOCK_INPUT ();
                    622:        XXgc_temp = XCreateGC(XXdisplay, XXwindow, 0, &gcv_temp);
                    623:        XSetState(XXdisplay, XXgc_temp, WhitePixel (XXdisplay, XXscreen),
                    624:                  BlackPixel(XXdisplay, XXscreen), GXinvert,
                    625:                  AllPlanes);
                    626: 
                    627:        XFillRectangle (XXdisplay, XXwindow, XXgc_temp, 0, 0,
                    628:                        screen_width*XXfontw+2*XXInternalBorder,
                    629:                        screen_height*XXfonth+2*XXInternalBorder);
                    630:        XFlush (XXdisplay);
                    631: 
                    632:        UNBLOCK_INPUT ();
                    633: 
                    634:        to.tv_sec = 0;
                    635:        to.tv_usec = 250000;
                    636:        
                    637:        select(0, 0, 0, 0, &to);
                    638:        
                    639:        BLOCK_INPUT ();
                    640: 
                    641:        XFillRectangle (XXdisplay, XXwindow, XXgc_temp, 0, 0,
                    642:                        screen_width*XXfontw+2*XXInternalBorder,
                    643:                        screen_height*XXfonth+2*XXInternalBorder);
                    644: 
                    645:        XFreeGC(XXdisplay, XXgc_temp);
                    646:        XFlush (XXdisplay);
                    647: 
                    648:        UNBLOCK_INPUT ();
                    649: }      
                    650: 
                    651: XTfeep ()
                    652: {
                    653:        BLOCK_INPUT_DECLARE ();
                    654: #ifdef XDEBUG
                    655:        fprintf (stderr, "XTfeep\n");
                    656: #endif
                    657:        BLOCK_INPUT ();
                    658:        XBell (XXdisplay,50);
                    659:        UNBLOCK_INPUT ();
                    660: }
                    661: 
                    662: /* Artificially creating a cursor is hard, the actual position on the
                    663:  * screen (either where it is or last was) is tracked with VisibleX,Y.
                    664:  * Gnu Emacs code tends to assume a cursor exists in hardward at cursX,Y
                    665:  * and that output text will appear there.  During updates, the cursor is
                    666:  * supposed to be blinked out and will only reappear after the update
                    667:  * finishes.
                    668:  */
                    669: 
                    670: CursorToggle ()
                    671: {
                    672:        register struct display_line **ActiveScreen;
                    673: 
                    674:        if (!WindowMapped) {
                    675:                CursorExists = 0;
                    676:                CursorOutline = 1;
                    677:                return 0;
                    678:                /* Currently the return values are not */
                    679:                /* used, but I could anticipate using */
                    680:                /* them in the future. */
                    681:        }
                    682:        
                    683:        if (VisibleX < 0 || VisibleX >= screen_width ||
                    684:            VisibleY < 0 || VisibleY >= screen_height) {
                    685:                /* Not much can be done */
                    686:                XFlush (XXdisplay);
                    687:                CursorExists = 0;
                    688:                return 0;
                    689:        }
                    690: 
                    691:        ActiveScreen = PhysScreen;
                    692: 
                    693:        if (ActiveScreen && ActiveScreen[VisibleY+1] &&
                    694:            VisibleX < ActiveScreen[VisibleY+1]->length) {
                    695:                if (CursorExists)
                    696:                        XDrawImageString(XXdisplay, XXwindow, XXgc_norm,
                    697:                                    VisibleX*XXfontw+XXInternalBorder,
                    698:                                    VisibleY*XXfonth+XXInternalBorder+XXbase,
                    699:                                    &ActiveScreen[VisibleY+1]->body[VisibleX],
                    700:                                    1);
                    701:                else if (CursorOutline) {
                    702:                        XDrawImageString(XXdisplay, XXwindow, XXgc_norm,
                    703:                                    VisibleX*XXfontw+XXInternalBorder,
                    704:                                    VisibleY*XXfonth+XXInternalBorder+XXbase,
                    705:                                    &ActiveScreen[VisibleY+1]->body[VisibleX],
                    706:                                    1);
                    707:                        XDrawRectangle (XXdisplay, XXwindow, XXgc_norm,
                    708:                                        VisibleX*XXfontw+XXInternalBorder,
                    709:                                        VisibleY*XXfonth+XXInternalBorder,
                    710:                                        XXfontw - 1, XXfonth - 1);
                    711:                } else
                    712:                        XDrawImageString(XXdisplay, XXwindow, XXgc_curs,
                    713:                                    VisibleX*XXfontw+XXInternalBorder,
                    714:                                    VisibleY*XXfonth+XXInternalBorder+XXbase,
                    715:                                    &ActiveScreen[VisibleY+1]->body[VisibleX],
                    716:                                    1);
                    717:              }
                    718:        else {
                    719:                if (CursorExists)
                    720:                        XClearArea (XXdisplay, XXwindow,
                    721:                                    VisibleX*XXfontw+XXInternalBorder,
                    722:                                    VisibleY*XXfonth+XXInternalBorder,
                    723:                                    XXfontw, XXfonth, 0);
                    724:                else if (CursorOutline)
                    725:                        XDrawRectangle (XXdisplay, XXwindow, XXgc_norm,
                    726:                                        VisibleX*XXfontw+XXInternalBorder,
                    727:                                        VisibleY*XXfonth+XXInternalBorder,
                    728:                                        XXfontw - 1, XXfonth - 1);
                    729:                else
                    730:                        XDrawImageString(XXdisplay, XXwindow, XXgc_curs,
                    731:                                    VisibleX*XXfontw+XXInternalBorder,
                    732:                                    VisibleY*XXfonth+XXInternalBorder+XXbase,
                    733:                                    " ", 1);
                    734:              }
                    735: 
                    736:        CursorExists = !CursorExists;
                    737: 
                    738:        if (!InUpdate)
                    739:                XFlush (XXdisplay);
                    740: 
                    741:        return 1;
                    742: }
                    743: 
                    744: /* This routine is used by routines which are called to paint regions */
                    745: /* designated by Expose events.  If the cursor may be in the exposed */
                    746: /* region, this routine makes sure it is gone so that dumprectangle can */
                    747: /* toggle it back into existance if dumprectangle is invoked when not in */
                    748: /* the midst of a screen update. */
                    749: 
                    750: static
                    751: ClearCursor ()
                    752: {
                    753:        BLOCK_INPUT_DECLARE ();
                    754: 
                    755:        BLOCK_INPUT ();
                    756:        if (!WindowMapped) {
                    757:                CursorExists = 0;
                    758:                CursorOutline = 1;
                    759:                UNBLOCK_INPUT ();
                    760:                return;
                    761:        }
                    762:        
                    763:        if (VisibleX < 0 || VisibleX >= screen_width ||
                    764:            VisibleY < 0 || VisibleY >= screen_height) {
                    765:                /* Not much can be done */
                    766:                CursorExists = 0;
                    767:                UNBLOCK_INPUT ();
                    768:                return;
                    769:        }
                    770: 
                    771:        XClearArea (XXdisplay, XXwindow,
                    772:                    VisibleX*XXfontw+XXInternalBorder,
                    773:                    VisibleY*XXfonth+XXInternalBorder,
                    774:                    XXfontw, XXfonth, 0);
                    775: 
                    776:        CursorExists = 0;
                    777:        UNBLOCK_INPUT ();
                    778: }
                    779: 
                    780: XTupdate_begin ()
                    781: {
                    782:        BLOCK_INPUT_DECLARE ();
                    783:        register int i;
                    784:        
                    785: #ifdef XDEBUG
                    786:        fprintf (stderr, "XTupdate_begin\n");
                    787: #endif
                    788: 
                    789:        BLOCK_INPUT ();
                    790:        InUpdate = 1;
                    791:        if (CursorExists)
                    792:                CursorToggle ();
                    793: 
                    794:        for (i=0;i<MAXHEIGHT;i++)
                    795:                updated[i] = 0;
                    796:        
                    797:        SavedX = cursX;
                    798:        SavedY = cursY;
                    799:        /* Thw initial "hardware" cursor position is */
                    800:        /* saved because that is where gnu emacs */
                    801:        /* expects the cursor to be at the end of */
                    802:        /* the update */
                    803: 
                    804:        UNBLOCK_INPUT ();
                    805: }
                    806: 
                    807: XTupdate_end ()
                    808: {      
                    809:        BLOCK_INPUT_DECLARE ();
                    810: 
                    811: #ifdef XDEBUG
                    812:        fprintf (stderr, "XTupdate_end\n");
                    813: #endif
                    814: 
                    815:        BLOCK_INPUT ();
                    816:        if (CursorExists)
                    817:                CursorToggle ();
                    818: 
                    819:        InUpdate = 0;
                    820:        XTtopos (SavedY, SavedX); /* XTtopos invokes cursor toggle */
                    821:        XFlush (XXdisplay);
                    822:        UNBLOCK_INPUT ();
                    823: }
                    824: 
                    825: /* Used for Expose events.  Have to get the text
                    826:  * back into the newly blank areas.
                    827:  */
                    828: 
                    829: dumprectangle (top, left, rows, cols)
                    830:      register int top, left, rows, cols;
                    831: {
                    832:        register struct display_line **ActiveScreen;
                    833:        register int ourindex;
                    834:        int localX, localY, localHL;
                    835: 
                    836:        if (top < 0)
                    837:                top = 0;
                    838:        if (left < 0)
                    839:                left = 0;
                    840:        rows += top;
                    841:        cols += left;
                    842:        top /= XXfonth;
                    843:        /* Get row and col containing up and */
                    844:        /* left borders of exposed region -- */
                    845:        /* round down here*/
                    846:        left /= XXfontw;
                    847:        rows += XXfonth-1;
                    848:        cols += XXfontw-1;
                    849:        rows /= XXfonth;
                    850:        /* Get row and col containing bottom and */
                    851:        /* right borders -- round up here */
                    852:        rows -= top;
                    853:        cols /= XXfontw;
                    854:        cols -= left;
                    855: 
                    856:        if (rows < 0)
                    857:                return;
                    858:        if (cols < 0)
                    859:                return;
                    860:        if (top > screen_height - 1)
                    861:                return;
                    862:        if (left > screen_width - 1)
                    863:                return;
                    864:        if (VisibleX >= left && VisibleX < left + cols &&
                    865:            VisibleY >= top && VisibleY < top + rows)
                    866:                ClearCursor ();
                    867: 
                    868:        if (InUpdate && DesiredScreen)
                    869:                ActiveScreen = DesiredScreen;
                    870:        else
                    871:                if (PhysScreen)
                    872:                        /* When queue is dumped in update this */
                    873:                        ActiveScreen = PhysScreen;
                    874:        else
                    875:                return;
                    876: 
                    877:        /* should perhaps be DesiredScreen */
                    878:        /* but PhysScreen is guaranteed to contain */
                    879:        /* data which was good for every line on */
                    880:        /* screen. For desired screen only for */
                    881:        /* lines which are changing.  Emacs does */
                    882:        /* not consider a line within a newly */
                    883:        /* exposed region necessarily to have */
                    884:        /* been changed.  Emacs knows nothing */
                    885:        /* about Expose events. */
                    886:        
                    887:        for (localY = top, ourindex = 0;
                    888:             ourindex < rows && localY < screen_height;
                    889:             ++ourindex, ++localY) {
                    890:                if (localY < 0 || localY >= screen_height ||
                    891:                    !ActiveScreen[localY+1] ||
                    892:                    left+1 > ActiveScreen[localY+1]->length)
                    893:                        continue;
                    894:                localX = left;
                    895:                localHL = ActiveScreen[localY+1]->highlighted;
                    896:                dumpchars (ActiveScreen,
                    897:                           min (cols,
                    898:                                ActiveScreen[localY+1]->length-localX),
                    899:                           localX, localY, localHL);
                    900:        }
                    901:        if (!InUpdate && !CursorExists)
                    902:                CursorToggle ();
                    903:        /* Routine usually called */
                    904:        /* when not in update */
                    905: }
                    906: 
                    907: /* What sections of the window will be modified from the UpdateDisplay
                    908:  * routine is totally under software control.  Any line with Y coordinate
                    909:  * greater than flexlines will not change during an update.  This is really
                    910:  * used only during dellines and inslines routines (scraplines and stufflines)
                    911:  */
                    912: 
                    913: XTset_terminal_window (n)
                    914:      register int n;
                    915: {
                    916: #ifdef XDEBUG
                    917:        fprintf (stderr, "XTset_terminal_window\n");
                    918: #endif
                    919: 
                    920:        if (n <= 0 || n > screen_height)
                    921:                flexlines = screen_height;
                    922:        else
                    923:                flexlines = n;
                    924: }
                    925: 
                    926: XTins_del_lines (vpos, n)
                    927:      int vpos, n;
                    928: {
                    929: #ifdef XDEBUG
                    930:        fprintf (stderr, "XTins_del_lines\n");
                    931: #endif
                    932: 
                    933:        XTtopos (vpos, 0);
                    934:        if (n >= 0)
                    935:                stufflines (n);
                    936:        else
                    937:                scraplines (-n);
                    938: }
                    939: 
                    940: static
                    941: XTinsert_chars (start, len)
                    942:      register char *start;
                    943:      register int len;
                    944: {
                    945: #ifdef XDEBUG
                    946:        fprintf (stderr, "XTinsert_chars\n");
                    947: #endif
                    948: 
                    949:        updateline (0);
                    950: }
                    951: 
                    952: static
                    953: XTdelete_chars (n)
                    954:      register int n;
                    955: {
                    956:        char *msg = "Major foobars!  This shouldn't show up!";
                    957:        
                    958: #ifdef XDEBUG
                    959:        fprintf (stderr, "XTdelete_chars (num %d cursX %d)\n",n,cursX);
                    960: #endif
                    961: 
                    962:        updateline (0);
                    963: }
                    964: 
                    965: stufflines (n)
                    966:      register int n;
                    967: {
                    968:        register int topregion, bottomregion;
                    969:        register int length, newtop;
                    970:        BLOCK_INPUT_DECLARE ();
                    971: 
                    972:        if (cursY >= flexlines)
                    973:                return;
                    974: 
                    975:        BLOCK_INPUT ();
                    976: 
                    977:        if (CursorExists)
                    978:                CursorToggle ();
                    979: 
                    980:        topregion = cursY;
                    981:        bottomregion = flexlines-(n+1);
                    982:        newtop = cursY+n;
                    983:        length = bottomregion-topregion+1;
                    984: 
                    985:        if (length > 0 && newtop <= flexlines) {
                    986:                XCopyArea (XXdisplay, XXwindow, XXwindow, XXgc_norm,
                    987:                           XXInternalBorder,
                    988:                           topregion*XXfonth+XXInternalBorder,
                    989:                           screen_width*XXfontw,
                    990:                           length*XXfonth,
                    991:                           XXInternalBorder, newtop*XXfonth+XXInternalBorder);
                    992:        }
                    993: 
                    994:        newtop = min (newtop, flexlines-1);
                    995:        length = newtop-topregion;
                    996:        if (length > 0)
                    997:                XClearArea (XXdisplay, XXwindow,
                    998:                            XXInternalBorder,
                    999:                            topregion*XXfonth+XXInternalBorder,
                   1000:                            screen_width*XXfontw,
                   1001:                            n*XXfonth, 0);
                   1002:        UNBLOCK_INPUT ();
                   1003: }
                   1004: 
                   1005: scraplines (n)
                   1006:      register int n;
                   1007: {
                   1008:        BLOCK_INPUT_DECLARE ();
                   1009: 
                   1010:        if (cursY >= flexlines)
                   1011:                return;
                   1012: 
                   1013:        BLOCK_INPUT ();
                   1014: 
                   1015:        if (CursorExists)
                   1016:                CursorToggle ();
                   1017: 
                   1018:        if (cursY+n >= flexlines) {
                   1019:                if (flexlines >= (cursY + 1))
                   1020:                        XClearArea (XXdisplay, XXwindow,
                   1021:                                    XXInternalBorder,
                   1022:                                    cursY*XXfonth+XXInternalBorder,
                   1023:                                    screen_width*XXfontw,
                   1024:                                    (flexlines-cursY) * XXfonth,
                   1025:                                    0);
                   1026:                UNBLOCK_INPUT ();
                   1027:        }
                   1028:        else {
                   1029:                XCopyArea (XXdisplay, XXwindow, XXwindow, XXgc_norm,
                   1030:                           XXInternalBorder,
                   1031:                           (cursY+n)*XXfonth+XXInternalBorder,
                   1032:                           screen_width*XXfontw,
                   1033:                           (flexlines-cursY-n)*XXfonth,
                   1034:                           XXInternalBorder, cursY*XXfonth+XXInternalBorder);
                   1035: 
                   1036:                XClearArea (XXdisplay, XXwindow, XXInternalBorder,
                   1037:                            (flexlines-n)*XXfonth+XXInternalBorder,
                   1038:                            screen_width*XXfontw,
                   1039:                            n*XXfonth, 0);
                   1040:                UNBLOCK_INPUT ();
                   1041:        }
                   1042: }
                   1043:        
                   1044: /* Substitutes for standard read routine.  Under X not interested in individual
                   1045:  * bytes but rather individual packets.
                   1046:  */
                   1047: 
                   1048: XTread_socket (sd, bufp, numchars)
                   1049:      register int sd;
                   1050:      register char *bufp;
                   1051:      register int numchars;
                   1052: {
                   1053: #ifdef XDEBUG
                   1054:        fprintf(stderr,"XTread_socket\n");
                   1055: #endif
                   1056: 
                   1057:        return (internal_socket_read (bufp, numchars));
                   1058: }
                   1059: 
                   1060: /*
                   1061:  * Interpreting incoming keycodes. Should have table modifiable as needed
                   1062:  * from elisp.
                   1063:  */
                   1064: 
                   1065: #ifdef sun
                   1066: char *stringFuncVal(keycode)
                   1067:        KeySym keycode;
                   1068: {
                   1069:        switch (keycode) {
                   1070:        case XK_L1:
                   1071:                return("192");
                   1072:        case XK_L2:
                   1073:                return("193");
                   1074:        case XK_L3:
                   1075:                return("194");
                   1076:        case XK_L4:
                   1077:                return("195");
                   1078:        case XK_L5:
                   1079:                return("196");
                   1080:        case XK_L6:
                   1081:                return("197");
                   1082:        case XK_L7:
                   1083:                return("198");
                   1084:        case XK_L8:
                   1085:                return("199");
                   1086:        case XK_L9:
                   1087:                return("200");
                   1088:        case XK_L10:
                   1089:                return("201");
                   1090: 
                   1091:        case XK_R1:
                   1092:                return("208");
                   1093:        case XK_R2:
                   1094:                return("209");
                   1095:        case XK_R3:
                   1096:                return("210");
                   1097:        case XK_R4:
                   1098:                return("211");
                   1099:        case XK_R5:
                   1100:                return("212");
                   1101:        case XK_R6:
                   1102:                return("213");
                   1103:        case XK_R7:
                   1104:                return("214");
                   1105:        case XK_R8:
                   1106:                return("215");
                   1107:        case XK_R9:
                   1108:                return("216");
                   1109:        case XK_R10:
                   1110:                return("217");
                   1111:        case XK_R11:
                   1112:                return("218");
                   1113:        case XK_R12:
                   1114:                return("219");
                   1115:        case XK_R13:
                   1116:                return("220");
                   1117:        case XK_R14:
                   1118:                return("221");
                   1119:        case XK_R15:
                   1120:                return("222");
                   1121: 
                   1122:        case XK_Break:                  /* Sun3 "Alternate" key */
                   1123:                return("223");
                   1124: 
                   1125:        case XK_F1:
                   1126:                return("224");
                   1127:        case XK_F2:
                   1128:                return("225");
                   1129:        case XK_F3:
                   1130:                return("226");
                   1131:        case XK_F4:
                   1132:                return("227");
                   1133:        case XK_F5:
                   1134:                return("228");
                   1135:        case XK_F6:
                   1136:                return("229");
                   1137:        case XK_F7:
                   1138:                return("230");
                   1139:        case XK_F8:
                   1140:                return("231");
                   1141:        case XK_F9:
                   1142:                return("232");
                   1143: 
                   1144:        default:
                   1145:                return("-1");
                   1146:        }
                   1147: }
                   1148: #else
                   1149: char *stringFuncVal(keycode)
                   1150:        KeySym keycode;
                   1151: {
                   1152:        switch (keycode) {
                   1153:        case XK_F1:
                   1154:                return("11");
                   1155:        case XK_F2:
                   1156:                return("12");
                   1157:        case XK_F3:
                   1158:                return("13");
                   1159:        case XK_F4:
                   1160:                return("14");
                   1161:        case XK_F5:
                   1162:                return("15");
                   1163:        case XK_F6:
                   1164:                return("17");
                   1165:        case XK_F7:
                   1166:                return("18");
                   1167:        case XK_F8:
                   1168:                return("19");
                   1169:        case XK_F9:
                   1170:                return("20");
                   1171:        case XK_F10:
                   1172:                return("21");
                   1173:        case XK_F11:
                   1174:                return("23");
                   1175:        case XK_F12:
                   1176:                return("24");
                   1177:        case XK_F13:
                   1178:                return("25");
                   1179:        case XK_F14:
                   1180:                return("26");
                   1181:        case XK_F15:
                   1182:                return("28");
                   1183:        case XK_Help:
                   1184:                return("28");
                   1185:        case XK_F16:
                   1186:                return("29");
                   1187:        case XK_Menu:
                   1188:                return("29");
                   1189:        case XK_F17:
                   1190:                return("31");
                   1191:        case XK_F18:
                   1192:                return("32");
                   1193:        case XK_F19:
                   1194:                return("33");
                   1195:        case XK_F20:
                   1196:                return("34");
                   1197:        
                   1198:        case XK_Find :
                   1199:                return("1");
                   1200:        case XK_Insert:
                   1201:                return("2");
                   1202:        case XK_Delete:
                   1203:                return("3");
                   1204:        case XK_Select:
                   1205:                return("4");
                   1206:        case XK_Prior:
                   1207:                return("5");
                   1208:        case XK_Next:
                   1209:                return("6");
                   1210:        default:
                   1211:                return("-1");
                   1212:        }
                   1213: }
                   1214: 
                   1215: #ifdef LK201
                   1216: char *stringFuncVal_Shifted(keycode)   /* LK201 Function keys - shifted */
                   1217:        KeySym keycode;
                   1218: {
                   1219:        switch (keycode) {
                   1220:        case XK_F1:
                   1221:                return("41");
                   1222:        case XK_F2:
                   1223:                return("42");
                   1224:        case XK_F3:
                   1225:                return("43");
                   1226:        case XK_F4:
                   1227:                return("44");
                   1228:        case XK_F5:
                   1229:                return("45");
                   1230:        case XK_F6:
                   1231:                return("47");
                   1232:        case XK_F7:
                   1233:                return("48");
                   1234:        case XK_F8:
                   1235:                return("49");
                   1236:        case XK_F9:
                   1237:                return("50");
                   1238:        case XK_F10:
                   1239:                return("51");
                   1240:        case XK_F11:
                   1241:                return("53");
                   1242:        case XK_F12:
                   1243:                return("54");
                   1244:        case XK_F13:
                   1245:                return("55");
                   1246:        case XK_F14:
                   1247:                return("56");
                   1248:        case XK_F15:
                   1249:                return("58");
                   1250:        case XK_Help:
                   1251:                return("58");
                   1252:        case XK_F16:
                   1253:                return("59");
                   1254:        case XK_Menu:
                   1255:                return("59");
                   1256:        case XK_F17:
                   1257:                return("61");
                   1258:        case XK_F18:
                   1259:                return("62");
                   1260:        case XK_F19:
                   1261:                return("63");
                   1262:        case XK_F20:
                   1263:                return("64");
                   1264:        default:
                   1265:                return("-1");
                   1266:        }
                   1267: }
                   1268: 
                   1269: char *stringFuncVal_KP(keycode)        /* LK201 keypad keys */
                   1270:        KeySym keycode;
                   1271: {
                   1272:        switch (keycode) {
                   1273:        case XK_KP_F1:
                   1274:                return("\033OP");
                   1275:        case XK_KP_F2:
                   1276:                return("\033OQ");
                   1277:        case XK_KP_F3:
                   1278:                return("\033OR");
                   1279:        case XK_KP_F4:
                   1280:                return("\033OS");
                   1281: 
                   1282:        case XK_KP_Subtract:            /* Minus */
                   1283:                return("\033Om");
                   1284:        case XK_KP_Separator:           /* Comma */
                   1285:                return("\033Ol");
                   1286:        case XK_KP_Decimal:             /* Period */
                   1287:                return("\033On");
                   1288:        case XK_KP_Enter:
                   1289:                return("\033OM");
                   1290: 
                   1291:        case XK_KP_0:
                   1292:                return("\033Op");
                   1293:        case XK_KP_1:
                   1294:                return("\033Oq");
                   1295:        case XK_KP_2:
                   1296:                return("\033Or");
                   1297:        case XK_KP_3:
                   1298:                return("\033Os");
                   1299:        case XK_KP_4:
                   1300:                return("\033Ot");
                   1301:        case XK_KP_5:
                   1302:                return("\033Ou");
                   1303:        case XK_KP_6:
                   1304:                return("\033Ov");
                   1305:        case XK_KP_7:
                   1306:                return("\033Ow");
                   1307:        case XK_KP_8:
                   1308:                return("\033Ox");
                   1309:        case XK_KP_9:
                   1310:                return("\033Oy");
                   1311: 
                   1312:        default:
                   1313:                return("-1");
                   1314:        }
                   1315: }
                   1316: #endif        /* LK201 */
                   1317: #endif /* not sun */
                   1318:        
                   1319: internal_socket_read(bufp, numchars)
                   1320:        register unsigned char *bufp;
                   1321:        register int numchars;
                   1322: {
                   1323:   /* Number of keyboard chars we have produced so far.  */
                   1324:   int count = 0;
                   1325:   int nbytes,rows,cols;
                   1326:   char mapping_buf[20];
                   1327:   BLOCK_INPUT_DECLARE ();
                   1328:   XEvent event;
                   1329:   XComposeStatus status;
                   1330:   KeySym keysym;
                   1331: 
                   1332:   BLOCK_INPUT ();
                   1333: #ifndef HAVE_SELECT
                   1334:   if (! (fcntl (fileno (stdin), F_GETFL, 0) & O_NDELAY))
                   1335:     {
                   1336:       extern int read_alarm_should_throw;
                   1337:       read_alarm_should_throw = 1;
                   1338:       XPeekEvent (XXdisplay,&event);
                   1339:       read_alarm_should_throw = 0;
                   1340:     }
                   1341: #endif
                   1342:   while (XPending (XXdisplay)) {
                   1343:     XNextEvent (XXdisplay,&event);
                   1344:     event.type &= 0177;                /* Mask out XSendEvent indication */
                   1345: 
                   1346:     switch (event.type) {
                   1347: 
                   1348:     default:
                   1349:       break;
                   1350: 
                   1351:     case MappingNotify:
                   1352:       XRefreshKeyboardMapping(&event);
                   1353:       break;
                   1354: 
                   1355:     case MapNotify:
                   1356:       WindowMapped = 1;
                   1357:       break;
                   1358: 
                   1359:     case UnmapNotify:
                   1360:       WindowMapped = 0;
                   1361:       break;
                   1362:                        
                   1363:     case ConfigureNotify:
                   1364:       if (abs(pixelheight-event.xconfigure.height) <
                   1365:          XXfonth &&
                   1366:          abs(pixelwidth-event.xconfigure.width) <
                   1367:          XXfontw)
                   1368:        break;
                   1369: 
                   1370:       configure_pending = 1;
                   1371: 
                   1372:       rows = (event.xconfigure.height-2*XXInternalBorder)/
                   1373:        XXfonth;
                   1374:       cols = (event.xconfigure.width-2*XXInternalBorder)/
                   1375:        XXfontw;
                   1376:       pixelwidth = cols*XXfontw+2*XXInternalBorder;
                   1377:       pixelheight = rows*XXfonth+2*XXInternalBorder;
                   1378: 
                   1379:       break;
                   1380: 
                   1381:     case Expose:
                   1382:       if (configure_pending) {
                   1383:        int width, height;
                   1384:        if (event.xexpose.count)
                   1385:          break;
                   1386:        /* This is absolutely, amazingly gross.
                   1387:         * However, without it, emacs will core
                   1388:         * dump if the window gets too small.  And
                   1389:         * uwm is too brain-damaged to handle
                   1390:         * large minimum size windows. */
                   1391:        width = (pixelwidth-2*XXInternalBorder)/XXfontw;
                   1392:        height = (pixelheight-2*XXInternalBorder)/XXfonth;
                   1393:        if (width > 11 && height > 4)
                   1394:                change_screen_size (height, width, 0);
                   1395:        dumprectangle (0,0,pixelheight,pixelwidth);
                   1396:        configure_pending = 0;
                   1397:        break;
                   1398:       }
                   1399:       dumprectangle (event.xexpose.y-XXInternalBorder,
                   1400:                     event.xexpose.x-XXInternalBorder,
                   1401:                     event.xexpose.height,
                   1402:                     event.xexpose.width);
                   1403:       break;
                   1404: 
                   1405:     case GraphicsExpose:
                   1406:       dumprectangle (event.xgraphicsexpose.y-XXInternalBorder,
                   1407:                     event.xgraphicsexpose.x-XXInternalBorder,
                   1408:                     event.xgraphicsexpose.height,
                   1409:                     event.xgraphicsexpose.width);
                   1410:       break;
                   1411: 
                   1412:     case NoExpose:
                   1413:       break;
                   1414:                        
                   1415:       /*
                   1416:        * NOTE: No 'Focus' management is being done yet. If
                   1417:        * some other window has grabbed the focus, emacs will
                   1418:        * still show a filled cursor whenever the pointer
                   1419:        * enters the emacs window.
                   1420:        */
                   1421:     case EnterNotify:
                   1422:       CursorToggle ();
                   1423:       CursorOutline = 0;
                   1424:       CursorToggle ();
                   1425:       break;
                   1426: 
                   1427:     case LeaveNotify:
                   1428:       CursorToggle ();
                   1429:       CursorOutline = 1;
                   1430:       CursorToggle ();
                   1431:       break;
                   1432:                        
                   1433:     case KeyPress:
                   1434:       nbytes = XLookupString (&event,
                   1435:                              mapping_buf, 20, &keysym,
                   1436:                              0);
                   1437:       /* Someday this will be unnecessary as we will
                   1438:         be able to use XRebindKeysym so XLookupString
                   1439:         will have already given us the string we want. */
                   1440:       if (IsFunctionKey(keysym) ||
                   1441:          IsMiscFunctionKey(keysym)) {
                   1442:        strcpy(mapping_buf,"[");
                   1443: #ifdef LK201
                   1444:       if (event.xkey.state & ShiftMask)
                   1445:         strcat(mapping_buf,stringFuncVal_Shifted(keysym));
                   1446:       else
                   1447: #endif
                   1448: 
                   1449:        strcat(mapping_buf,stringFuncVal(keysym));
                   1450: #ifdef sun
                   1451:        strcat(mapping_buf,"z");
                   1452: #else
                   1453:        strcat(mapping_buf,"~");
                   1454: #endif /* sun */
                   1455:        nbytes = strlen(mapping_buf);
                   1456:       }
                   1457: #ifdef LK201
                   1458:       else if (IsKeypadKey(keysym) || IsPFKey(keysym)) {
                   1459:       strcpy(mapping_buf,stringFuncVal_KP(keysym));
                   1460:       nbytes = strlen(mapping_buf);
                   1461:       }
                   1462: #endif
                   1463: 
                   1464:       else {
                   1465:        switch (keysym) {
                   1466:        case XK_Left:
                   1467:          strcpy(mapping_buf,"\002");
                   1468:          nbytes = 1;
                   1469:          break;
                   1470:        case XK_Right:
                   1471:          strcpy(mapping_buf,"\006");
                   1472:          nbytes = 1;
                   1473:          break;
                   1474:        case XK_Up:
                   1475:          strcpy(mapping_buf,"\020");
                   1476:          nbytes = 1;
                   1477:          break;
                   1478:        case XK_Down:
                   1479:          strcpy(mapping_buf,"\016");
                   1480:          nbytes = 1;
                   1481:          break;
                   1482: #ifdef LK201
                   1483:       case XK_Next:
                   1484:         strcpy(mapping_buf,"\033[6~");
                   1485:         nbytes = 4;
                   1486:         break;
                   1487:       case XK_Prior:
                   1488:         strcpy(mapping_buf,"\033[5~");
                   1489:         nbytes = 4;
                   1490:         break;
                   1491:       case DXK_Remove:
                   1492:         strcpy(mapping_buf,"\033[3~");
                   1493: #endif        /* LK201 */
                   1494: 
                   1495:        }
                   1496:       }
                   1497:       if (nbytes) {
                   1498:        if (event.xkey.state & Mod1Mask)
                   1499:          *mapping_buf |= METABIT;
                   1500:        if (numchars-nbytes > 0) {
                   1501:          bcopy (mapping_buf, bufp, nbytes);
                   1502:          bufp += nbytes;
                   1503:          count += nbytes;
                   1504:          numchars -= nbytes;
                   1505:        }
                   1506:       }
                   1507:       break;
                   1508: 
                   1509:     case ButtonPress:
                   1510:     case ButtonRelease:
                   1511:       *bufp++ = (char) 'X' & 037;
                   1512:       ++count;
                   1513:       --numchars;
                   1514:       *bufp++ = (char) '@' & 037;
                   1515:       ++count;
                   1516:       --numchars;
                   1517:       if (XXm_queue_num == XMOUSEBUFSIZE)
                   1518:        break;
                   1519:       XXm_queue[XXm_queue_in] = (XEvent *) malloc (sizeof(XEvent));
                   1520:       *XXm_queue[XXm_queue_in] = event;
                   1521:       XXm_queue_num++;
                   1522:       XXm_queue_in = (XXm_queue_in + 1) % XMOUSEBUFSIZE;
                   1523:       break;
                   1524:     }
                   1525:   }
                   1526: 
                   1527:   if (CursorExists)
                   1528:     xfixscreen ();
                   1529: 
                   1530:   UNBLOCK_INPUT ();
                   1531:   return count;
                   1532: }
                   1533: 
                   1534: /* Exit gracefully from gnuemacs, doing an autosave and giving a status.
                   1535:  */
                   1536: 
                   1537: XExitGracefully ()
                   1538: {
                   1539:        XCleanUp();
                   1540:        exit (70);
                   1541: }
                   1542: 
                   1543: XIgnoreError ()
                   1544: {
                   1545:        return 0;
                   1546: }
                   1547: 
                   1548: xfixscreen ()
                   1549: {
                   1550:        static int server_ping_timer;
                   1551:        BLOCK_INPUT_DECLARE ();
                   1552: 
                   1553:        if (server_ping_timer > 0)
                   1554:          server_ping_timer--;
                   1555:        else
                   1556:          {
                   1557:            server_ping_timer = 100;
                   1558: 
                   1559:            /* Yes, this is really what I mean -- Check to see if we've
                   1560:             * lost our connection */
                   1561: 
                   1562:            BLOCK_INPUT ();
                   1563:            XSetErrorHandler(0);
                   1564:            XSetIOErrorHandler(0);
                   1565:            XNoOp (XXdisplay);
                   1566:            XFlush (XXdisplay);
                   1567:            XSetErrorHandler(handler);
                   1568:            XSetIOErrorHandler(handler);
                   1569:            if (!InUpdate && !CursorExists)
                   1570:                    CursorToggle ();
                   1571: 
                   1572:            UNBLOCK_INPUT ();
                   1573:          }
                   1574: }
                   1575:        
                   1576: 
                   1577: /* ------------------------------------------------------------
                   1578:  */
                   1579: static int  reversevideo;
                   1580: 
                   1581: static int
                   1582: XT_GetDefaults (class)
                   1583:     char *class;
                   1584: {
                   1585:   register char  *option;
                   1586:   register struct _xdeftab *entry;
                   1587: 
                   1588:   /*
                   1589:    * Walk the table reading in the resources.  Instance names supersede
                   1590:    * class names.
                   1591:    */
                   1592: 
                   1593:   for (entry = xDefaultsValueTable; entry->iname; entry++)
                   1594:     {
                   1595:       if (!(option = XGetDefault (XXdisplay, class, entry->iname)))
                   1596:        option = XGetDefault (XXdisplay, class, entry->cname);
                   1597:       if (option && entry->varp)
                   1598:        *entry->varp = option;
                   1599:     }
                   1600: 
                   1601:   /*
                   1602:    * Now set global variables that aren't character strings; yes it would
                   1603:    * be nice to do this automatically as part of the scanning step, but this
                   1604:    * is less likely to screw up.  The real answer is to use the resource
                   1605:    * manager.
                   1606:    */
                   1607: 
                   1608:   if (temp_reverseVideo)
                   1609:     {
                   1610:       if (strcmp (temp_reverseVideo, "on") == 0)
                   1611:        reversevideo = 1;
                   1612:       else if (strcmp (temp_reverseVideo, "off") == 0)
                   1613:        reversevideo = 0;
                   1614:     }
                   1615: 
                   1616:   if (temp_borderWidth) 
                   1617:     XXborder = atoi (temp_borderWidth);
                   1618: 
                   1619:   if (temp_internalBorder)
                   1620:     XXInternalBorder = atoi (temp_internalBorder);
                   1621: 
                   1622:   return 0;
                   1623: }
                   1624: 
                   1625: x_error_handler (disp, event)
                   1626:      Display *disp;
                   1627:      XErrorEvent *event;
                   1628: {
                   1629:   char msg[200];
                   1630:   XGetErrorText (disp, event->error_code, msg, 200);
                   1631:   fprintf (stderr, "Fatal X-windows error: %s\n", msg);
                   1632:   Fkill_emacs (make_number (70));
                   1633: }
                   1634: 
                   1635: x_io_error_handler ()
                   1636: {
                   1637:   Fdo_auto_save ();
                   1638:   perror ("Fatal X-windows I/O error");
                   1639:   Fkill_emacs (make_number (70));
                   1640: }
                   1641: 
                   1642: x_term_init ()
                   1643: {
                   1644:        register char *vardisplay;
                   1645:        register int xxargc;
                   1646:        register char **xxargv;
                   1647:        char *ptr;
                   1648:        XColor cdef;
                   1649: 
                   1650:        extern char *getenv ();
                   1651:        extern XTinterrupt_signal ();
                   1652:        extern char *malloc ();
                   1653:        extern Lisp_Object Vxterm, Vxterm1, Qt;
                   1654:        extern int XIgnoreError();
                   1655:        int  ix;
                   1656:        
                   1657: 
                   1658:        vardisplay = (alternate_display ? alternate_display : "");
                   1659:        if (!vardisplay) {
                   1660:                fprintf (stderr, "DISPLAY environment variable must be set\n");
                   1661:                exit (-200);
                   1662:        }
                   1663: 
                   1664:        XXdisplay = XOpenDisplay (vardisplay);
                   1665:        if (XXdisplay == (Display *) 0) {
                   1666:                fprintf (stderr, "X server not responding.  Check your DISPLAY environment variable.\n");
                   1667:                exit (-99);     
                   1668:        }
                   1669: 
                   1670:        XXscreen = DefaultScreen (XXdisplay);
                   1671:        XXisColor = DisplayCells (XXdisplay, XXscreen) > 2;
                   1672:        XXColorMap = DefaultColormap (XXdisplay, XXscreen);
                   1673: 
                   1674:        XSetErrorHandler (x_error_handler);
                   1675:        XSetIOErrorHandler (x_io_error_handler);
                   1676:        signal (SIGPIPE, x_io_error_handler);
                   1677: 
                   1678:        WindowMapped = 0;
                   1679:        baud_rate = 9600;
                   1680:        min_padding_speed = 10000;
                   1681:        must_write_spaces = 1;
                   1682:        MetaFlag = 1;
                   1683:        visible_bell = 1;
                   1684:        inverse_video = 0;
                   1685:        configure_pending = 0;
                   1686:        
                   1687:        fix_screen_hook = xfixscreen;
                   1688:        clear_screen_hook = XTclear_screen;
                   1689:        clear_end_of_line_hook = XTclear_end_of_line;
                   1690:        ins_del_lines_hook = XTins_del_lines;
                   1691:        change_line_highlight_hook = XTchange_line_highlight;
                   1692:        insert_chars_hook = XTinsert_chars;
                   1693:        write_chars_hook = XTwrite_chars;
                   1694:        delete_chars_hook = XTdelete_chars;
                   1695:        ring_bell_hook = XTfeep;
                   1696:        reset_terminal_modes_hook = XTreset_terminal_modes;
                   1697:        set_terminal_modes_hook = XTset_terminal_modes;
                   1698:        update_begin_hook = XTupdate_begin;
                   1699:        update_end_hook = XTupdate_end;
                   1700:        set_terminal_window_hook = XTset_terminal_window;
                   1701:        read_socket_hook = XTread_socket;
                   1702:        topos_hook = XTtopos;
                   1703:        reassert_line_highlight_hook = XTreassert_line_highlight;
                   1704:        scroll_region_ok = 1;   /* we'll scroll partial screens */
                   1705:        char_ins_del_ok = 0;
                   1706:        line_ins_del_ok = 1;    /* we'll just blt 'em */
                   1707:        fast_clear_end_of_line = 1; /* X does this well */
                   1708:        memory_below_screen = 0; /* we don't remember what scrolls
                   1709:                                  *             off the bottom */
                   1710:        dont_calculate_costs = 1;
                   1711: 
                   1712:        /* New options section */
                   1713:        XXborder = 1;
                   1714:        XXInternalBorder = 1;
                   1715:        screen_width = 80;
                   1716:        screen_height = 66;
                   1717:        
                   1718:        reversevideo = 0;
                   1719: 
                   1720:        XXdebug = 0;
                   1721:        XXm_queue_num = 0;
                   1722:        XXm_queue_in = 0;
                   1723:        XXm_queue_out = 0;
                   1724: 
                   1725:        handler = XIgnoreError;
                   1726:        XSetErrorHandler (handler);
                   1727:        XSetIOErrorHandler (handler);
                   1728: 
                   1729:        desiredwindow =
                   1730:        XXcurrentfont =
                   1731:        XXidentity =
                   1732:        XXicon_name =
                   1733:        XXheader = (char *) NULL;
                   1734: 
                   1735:        XXicon_usebitmap = 0;
                   1736:        
                   1737:        temp_font = "fixed";
                   1738:        progname = xargv[0];
                   1739:        if (ptr = rindex(progname, '/'))
                   1740:          progname = ptr+1;
                   1741:        XXpid = getpid ();
                   1742:        default_window = "=80x24+0+0";
                   1743: 
                   1744:        handler = XIgnoreError;
                   1745:        XSetErrorHandler (handler);
                   1746:        XSetIOErrorHandler (handler);
                   1747: 
                   1748: 
                   1749:        /*  Get resource name and its defaults, it it exists...
                   1750:         */
                   1751:        for (ix = 1; ix < xargc && xargv[ix][0] == '-'; ix++)
                   1752:        {
                   1753:            int  valx;
                   1754:        
                   1755:            if (strcmp(xargv[ix], "-rn") == 0 &&
                   1756:                (valx = ix + 1) < xargc)
                   1757:            {
                   1758:                XXidentity = (char *) xmalloc( strlen(xargv[valx]) + 1 );
                   1759:                (void) strcpy(XXidentity, xargv[valx]);
                   1760: 
                   1761:                break;
                   1762:            }
                   1763:        }
                   1764: 
                   1765:        if (!XXidentity)
                   1766:        {
                   1767:            char  *t;
                   1768: 
                   1769:            if ( (t = getenv("WM_RES_NAME")) != (char *) NULL )
                   1770:                XXidentity = t;
                   1771: 
                   1772:            if (!XXidentity && strcmp(CLASS, progname) != 0)
                   1773:            {
                   1774:                XXidentity = progname;
                   1775:            }
                   1776:        }
                   1777: 
                   1778:        if (XXidentity)
                   1779:            XT_GetDefaults(XXidentity);
                   1780:        else
                   1781:            XT_GetDefaults(CLASS);
                   1782: 
                   1783:        XXpid = getpid ();
                   1784:        default_window = "=80x24+0+0";
                   1785: 
                   1786:        /* Process X command line args...*/
                   1787:        xxargc = xargc;
                   1788:        xxargv = xargv;
                   1789:        xxargv++;
                   1790:        xxargc--;
                   1791:        while (xxargc) {
                   1792:                int sargc;
                   1793:                sargc = xxargc;
                   1794:                if (xxargc && !strcmp (*xxargv, "-r")) {
                   1795:                        reversevideo = !reversevideo;
                   1796:                        xxargc--;
                   1797:                        xxargv++;
                   1798:                }
                   1799:                if ((xxargc > 1) && (!strcmp (*xxargv, "-font") ||
                   1800:                                     !strcmp (*xxargv, "-fn"))) {
                   1801:                        xxargc--;
                   1802:                        xxargv++;
                   1803:                        if (XXcurrentfont != NULL)
                   1804:                                free(XXcurrentfont);
                   1805:                        XXcurrentfont = (char *) xmalloc (strlen (*xxargv)+1);
                   1806:                        strcpy (XXcurrentfont, *xxargv);
                   1807:                        xxargc--;
                   1808:                        xxargv++;
                   1809:                }
                   1810:                if ((xxargc > 1) && !strcmp (*xxargv, "-wn")) {
                   1811:                        xxargc--;
                   1812:                        xxargv++;
                   1813:                        XXheader = (char *) xmalloc (strlen (*xxargv)+1);
                   1814:                        strcpy (XXheader, *xxargv);
                   1815:                        xxargc--;
                   1816:                        xxargv++;
                   1817:                }
                   1818:                if ((xxargc > 1) && !strcmp (*xxargv, "-in")) {
                   1819:                        xxargc--;
                   1820:                        xxargv++;
                   1821:                        XXicon_name = (char *) xmalloc (strlen (*xxargv)+1);
                   1822:                        strcpy (XXicon_name, *xxargv);
                   1823:                        xxargc--;
                   1824:                        xxargv++;
                   1825:                }
                   1826:                if (xxargc && !strcmp (*xxargv, "-i")) {
                   1827:                        xxargc--;
                   1828:                        xxargv++;
                   1829:                        XXicon_usebitmap = 1;
                   1830:                }
                   1831:                if ((xxargc > 1) && !strcmp (*xxargv, "-b")) {
                   1832:                        xxargc--;
                   1833:                        xxargv++;
                   1834:                        XXborder = atoi (*xxargv);
                   1835:                        xxargc--;
                   1836:                        xxargv++;
                   1837:                }
                   1838:                if ((xxargc > 1) && !strcmp (*xxargv, "-ib")) {
                   1839:                        xxargc--;
                   1840:                        xxargv++;
                   1841:                        XXInternalBorder = atoi (*xxargv);
                   1842:                        xxargc--;
                   1843:                        xxargv++;
                   1844:                }
                   1845:                if ((xxargc > 1) && (!strcmp (*xxargv, "-w") ||
                   1846:                                     !strcmp (*xxargv, "-geometry"))) {
                   1847:                        xxargc--;
                   1848:                        xxargv++;
                   1849:                        desiredwindow = (char *) xmalloc (strlen (*xxargv)+1);
                   1850:                        strcpy (desiredwindow, *xxargv);
                   1851:                        xxargc--;
                   1852:                        xxargv++;
                   1853:                }
                   1854:                if (XXisColor) {
                   1855:                        if ((xxargc > 1 && !strcmp (*xxargv, "-fg"))) {
                   1856:                                xxargc--;
                   1857:                                xxargv++;
                   1858: 
                   1859:                                fore_color =
                   1860:                                    (char *) xmalloc (strlen (*xxargv)+1);
                   1861:                                strcpy (fore_color, *xxargv);
                   1862: 
                   1863:                                xxargc--;
                   1864:                                xxargv++;
                   1865:                        }
                   1866:                        if ((xxargc > 1 && !strcmp (*xxargv, "-bg"))) {
                   1867:                                xxargc--;
                   1868:                                xxargv++;
                   1869: 
                   1870:                                back_color =
                   1871:                                    (char *) xmalloc (strlen (*xxargv)+1);
                   1872:                                strcpy (back_color, *xxargv);
                   1873: 
                   1874:                                xxargc--;
                   1875:                                xxargv++;
                   1876:                        }
                   1877:                        if ((xxargc > 1 && !strcmp (*xxargv, "-bd"))) {
                   1878:                                xxargc--;
                   1879:                                xxargv++;
                   1880: 
                   1881:                                brdr_color =
                   1882:                                    (char *) xmalloc (strlen (*xxargv)+1);
                   1883:                                strcpy (brdr_color, *xxargv);
                   1884: 
                   1885:                                xxargc--;
                   1886:                                xxargv++;
                   1887:                        }
                   1888:                        if ((xxargc > 1 && !strcmp (*xxargv, "-cr"))) {
                   1889:                                xxargc--;
                   1890:                                xxargv++;
                   1891: 
                   1892:                                curs_color =
                   1893:                                    (char *) xmalloc (strlen (*xxargv)+1);
                   1894:                                strcpy (curs_color, *xxargv);
                   1895: 
                   1896:                                xxargc--;
                   1897:                                xxargv++;
                   1898:                        }
                   1899:                        if ((xxargc > 1 && !strcmp (*xxargv, "-ms"))) {
                   1900:                                xxargc--;
                   1901:                                xxargv++;
                   1902: 
                   1903:                                mous_color =
                   1904:                                    (char *) xmalloc (strlen (*xxargv)+1);
                   1905:                                strcpy (mous_color, *xxargv);
                   1906: 
                   1907:                                xxargc--;
                   1908:                                xxargv++;
                   1909:                        }
                   1910:                }
                   1911:                if (sargc == xxargc) {
                   1912:                        xxargc--;
                   1913:                        xxargv++;
                   1914:                }
                   1915:        }
                   1916: 
                   1917:        /*  Now, actually Parse and Set colors...
                   1918:         */
                   1919:        if (XXisColor) {
                   1920:          if (fore_color || back_color)
                   1921:            reversevideo = 0;
                   1922:          if (fore_color &&
                   1923:              XParseColor (XXdisplay, XXColorMap, fore_color, &cdef) &&
                   1924:              XAllocColor (XXdisplay, XXColorMap, &cdef))
                   1925:            fore = cdef.pixel;
                   1926:          else {
                   1927:            fore_color = "black";
                   1928:            fore = BlackPixel (XXdisplay, XXscreen);
                   1929:          }
                   1930: 
                   1931:          if (back_color &&
                   1932:              XParseColor (XXdisplay, XXColorMap, back_color, &cdef) &&
                   1933:              XAllocColor (XXdisplay, XXColorMap, &cdef))
                   1934:            back = cdef.pixel;
                   1935:          else {
                   1936:            back_color = "white";
                   1937:            back = WhitePixel (XXdisplay, XXscreen);
                   1938:          }
                   1939: 
                   1940:          if (curs_color &&
                   1941:              XParseColor (XXdisplay, XXColorMap, curs_color, &cdef) &&
                   1942:              XAllocColor (XXdisplay, XXColorMap, &cdef))
                   1943:            curs = cdef.pixel;
                   1944:          else {
                   1945:            curs_color = "black";
                   1946:            curs = BlackPixel (XXdisplay, XXscreen);
                   1947:          }
                   1948: 
                   1949:          if (mous_color &&
                   1950:              XParseColor (XXdisplay, XXColorMap, mous_color, &cdef) &&
                   1951:              XAllocColor (XXdisplay, XXColorMap, &cdef))
                   1952:            ;
                   1953:          else mous_color = "black";
                   1954: 
                   1955:          if (brdr_color &&
                   1956:              XParseColor (XXdisplay, XXColorMap, brdr_color, &cdef) &&
                   1957:              XAllocColor (XXdisplay, XXColorMap, &cdef))
                   1958:            brdr = cdef.pixel;
                   1959:          else {
                   1960:            brdr_color = "black";
                   1961:            brdr = BlackPixel (XXdisplay, XXscreen);
                   1962:          }
                   1963:        }
                   1964:        else {
                   1965:                fore_color  = curs_color = mous_color = brdr_color = "black";
                   1966:                fore = curs = brdr = BlackPixel (XXdisplay, XXscreen);
                   1967:                back_color = "white";
                   1968:                back = WhitePixel (XXdisplay, XXscreen);
                   1969:        }
                   1970: 
                   1971: 
                   1972:        if (reversevideo) {
                   1973:                int tempcolor;
                   1974:                char *tempname;
                   1975:                brdr = back;
                   1976:                brdr_color = back_color;
                   1977:                tempcolor = fore;
                   1978:                fore = back;
                   1979:                back = tempcolor;
                   1980:                tempname = fore_color;
                   1981:                fore_color = back_color;
                   1982:                back_color = tempname;
                   1983:                if (curs == WhitePixel (XXdisplay, XXscreen)) {
                   1984:                        curs = BlackPixel (XXdisplay, XXscreen);
                   1985:                        curs_color = "black";
                   1986:                }
                   1987:                else if (curs == BlackPixel (XXdisplay, XXscreen)) {
                   1988:                        curs = WhitePixel (XXdisplay, XXscreen);
                   1989:                        curs_color = "white";
                   1990:                }
                   1991:                if (!strcmp (mous_color, "white"))
                   1992:                        mous_color = "black";
                   1993:                else if (!strcmp (mous_color, "black"))
                   1994:                        mous_color = "white";
                   1995:        }
                   1996: 
                   1997: 
                   1998:        if (!XXcurrentfont)
                   1999:        {
                   2000:            XXcurrentfont = (char *) xmalloc (strlen (temp_font) + 1);
                   2001:        
                   2002:            if (!XXcurrentfont) {
                   2003:                fprintf (stderr, "Memory allocation failure.\n");
                   2004:                exit (-150);
                   2005:            }
                   2006: 
                   2007:            strcpy (XXcurrentfont, temp_font);
                   2008:        }
                   2009:        
                   2010: 
                   2011: 
                   2012:        signal (SIGPIPE, XExitGracefully);
                   2013: 
                   2014: #ifndef CANNOT_DUMP
                   2015:        if (initialized)
                   2016: #endif /* CANNOT_DUMP */
                   2017:                Vxterm = Qt;
                   2018: 
                   2019:        Fset (intern ("window-system-version"), make_number (11));
                   2020: 
                   2021:        XInitWindow ();
                   2022: 
                   2023:        keyboard_init_hook = x_init_1;
                   2024: }
                   2025: 
                   2026: /* Initialize for keyboard input using X.
                   2027:    This is called by init_keyboard via keyboard_init_hook.  */
                   2028: 
                   2029: static void
                   2030: x_init_1 ()
                   2031: {
                   2032: #ifdef F_SETOWN
                   2033:        extern int old_fcntl_owner;
                   2034: #endif
                   2035: 
                   2036:        dup2 (ConnectionNumber(XXdisplay), 0);
                   2037:        close (ConnectionNumber(XXdisplay));
                   2038:        ConnectionNumber(XXdisplay) = 0;        /* Looks a little strange?
                   2039:                                                 * check the def of the macro;
                   2040:                                                 * it is a genuine lvalue */
                   2041:        setpgrp (0,getpid());
                   2042:        
                   2043: #ifdef F_SETOWN
                   2044:        old_fcntl_owner = fcntl (0, F_GETOWN, 0);
                   2045:        fcntl (0, F_SETOWN, getpid ());
                   2046: #endif
                   2047: 
                   2048:        /* Enable interrupt_input because otherwise we cannot asynchronously
                   2049:           detect C-g sent as a keystroke event from the X server.  */
                   2050:        Fset_input_mode (Qt, Qnil);
                   2051: }
                   2052: 
                   2053: XSetFlash ()
                   2054: {
                   2055:        ring_bell_hook = XTflash;
                   2056: }
                   2057: 
                   2058: XSetFeep ()
                   2059: {
                   2060:        ring_bell_hook = XTfeep;
                   2061: }
                   2062: 
                   2063: 
                   2064: /* ------------------------------------------------------------
                   2065:  *  Load a font by name.  Return the font pointer, or NULL if
                   2066:  *  it can't be loaded.  Do all appropriate calculations.
                   2067:  */
                   2068: static XFontStruct *
                   2069: XT_CalcForFont(fontname)
                   2070:     char  *fontname;
                   2071: {
                   2072:     XFontStruct  *fontp;
                   2073: 
                   2074: 
                   2075:     if ( (fontp = XLoadQueryFont(XXdisplay, fontname)) == (XFontStruct *) 0 )
                   2076:     {
                   2077:        return  (XFontStruct *) NULL;
                   2078:     }
                   2079: 
                   2080:     XXfid = fontp->fid;
                   2081:     XXfonth = fontp->ascent + fontp->descent;
                   2082:     XXfontw = fontp->max_bounds.width;
                   2083:     XXbase = fontp->ascent;
                   2084: 
                   2085:     return  fontp;
                   2086: }
                   2087: 
                   2088: 
                   2089: /* ------------------------------------------------------------
                   2090:  */
                   2091: XNewFont (newname)
                   2092:      register char *newname;
                   2093: {
                   2094:        XFontStruct *temp;
                   2095:        BLOCK_INPUT_DECLARE ();
                   2096: 
                   2097:        BLOCK_INPUT ();
                   2098:        XFlush (XXdisplay);
                   2099: 
                   2100: 
                   2101:        temp = XT_CalcForFont(newname);
                   2102: 
                   2103:        if (temp == (XFontStruct *) NULL)
                   2104:        {
                   2105:            UNBLOCK_INPUT ();
                   2106:            return  -1;
                   2107:        }
                   2108: 
                   2109:        XSetFont (XXdisplay, XXgc_norm, XXfid);
                   2110:        XSetFont (XXdisplay, XXgc_rev, XXfid);
                   2111:        XSetFont (XXdisplay, XXgc_curs, XXfid);
                   2112: 
                   2113:        XFreeFont (XXdisplay, fontinfo);
                   2114:        fontinfo = temp;
                   2115: 
                   2116: 
                   2117:        XSetWindowSize(screen_height, screen_width);
                   2118: 
                   2119: 
                   2120:        UNBLOCK_INPUT ();
                   2121:        return 0;
                   2122: }
                   2123: 
                   2124: /* Flip foreground/background colors */
                   2125: 
                   2126: XFlipColor ()
                   2127: {
                   2128:        int tempcolor;
                   2129:        char *tempname;
                   2130:        XColor forec, backc;
                   2131:        BLOCK_INPUT_DECLARE ();
                   2132: 
                   2133:        BLOCK_INPUT ();
                   2134:        CursorToggle ();
                   2135:        XSetWindowBackground(XXdisplay, XXwindow, fore);
                   2136:        if (XXborder)
                   2137:                XSetWindowBorder(XXdisplay, XXwindow, back);
                   2138: 
                   2139:        brdr = back;
                   2140:        brdr_color = back_color;
                   2141:        tempcolor = fore;
                   2142:        fore = back;
                   2143:        back = tempcolor;
                   2144:        tempname = fore_color ;
                   2145:        fore_color = back_color;
                   2146:        back_color = tempname;
                   2147:        XClearArea (XXdisplay, XXwindow, 0, 0,
                   2148:                    screen_width*XXfontw+2*XXInternalBorder,
                   2149:                    screen_height*XXfonth+2*XXInternalBorder, 0);
                   2150: 
                   2151:        XXgc_temp = XXgc_norm;
                   2152:        XXgc_norm = XXgc_rev;
                   2153:        XXgc_rev = XXgc_temp;
                   2154: 
                   2155:        if (!strcmp (mous_color, "white"))
                   2156:          mous_color = "black";
                   2157:        else if (!strcmp (mous_color, "black"))
                   2158:          mous_color = "white";
                   2159: 
                   2160:        x_set_cursor_colors ();
                   2161: 
                   2162:        XRedrawDisplay ();
                   2163:        if (curs == WhitePixel (XXdisplay, XXscreen)) {
                   2164:                curs = BlackPixel (XXdisplay, XXscreen);
                   2165:                curs_color = "black";
                   2166:        }
                   2167:        else
                   2168:                if (curs == BlackPixel (XXdisplay, XXscreen)) {
                   2169:                        curs = WhitePixel (XXdisplay, XXscreen);
                   2170:                        curs_color = "white";
                   2171:                }
                   2172:        XSetState (XXdisplay, XXgc_curs, back, curs, GXinvert, AllPlanes);
                   2173: 
                   2174:        CursorToggle ();
                   2175:        XFlush (XXdisplay);
                   2176:        UNBLOCK_INPUT ();
                   2177: }
                   2178: 
                   2179: /* ------------------------------------------------------------
                   2180:  */
                   2181: 
                   2182: #define NO_MANAGER  1
                   2183: 
                   2184: 
                   2185: /* ------------------------------------------------------------
                   2186:  */
                   2187: static XClassHint  class_hint;
                   2188: 
                   2189: 
                   2190: static int
                   2191: XT_Set_Class_Hints(w)
                   2192:     Window  w;
                   2193: {
                   2194:     extern char  *getenv();
                   2195: 
                   2196: 
                   2197:     if (XXidentity == (char *) NULL)
                   2198:        XXidentity = "";        /* XSCH() doesn't like NULL pointers! */
                   2199: 
                   2200:     class_hint.res_name = XXidentity;
                   2201:     class_hint.res_class = CLASS;
                   2202: 
                   2203:        
                   2204:     XSetClassHint(XXdisplay, w, &class_hint);
                   2205: }
                   2206: 
                   2207: 
                   2208: /* ------------------------------------------------------------
                   2209:  */
                   2210: static int
                   2211: XT_Set_Command_Line(w)
                   2212:     Window  w;
                   2213: {
                   2214: 
                   2215:     XSetCommand(XXdisplay, w, xargv, xargc);
                   2216: }
                   2217: 
                   2218: 
                   2219: /* ------------------------------------------------------------
                   2220:  */
                   2221: static char  hostname[100];
                   2222: 
                   2223: static int
                   2224: XT_Set_Host(w)
                   2225:     Window  w;
                   2226: {
                   2227: 
                   2228:     gethostname(hostname, 100);
                   2229:     hostname[99] = '\0';
                   2230: 
                   2231:     XChangeProperty(XXdisplay, w, XA_WM_CLIENT_MACHINE, XA_STRING, 8,
                   2232:                    PropModeReplace, hostname, strlen(hostname));
                   2233: }
                   2234: 
                   2235: 
                   2236: /* ------------------------------------------------------------
                   2237:  *  Set header title to window-name (from '-wn'), or if none,
                   2238:  *  "optional-id: class-of-appl @ host"
                   2239:  */
                   2240: static int
                   2241: XT_Set_Title(w)
                   2242:     Window  w;
                   2243: {
                   2244:     char  header_info[200];
                   2245: 
                   2246: 
                   2247:     if (XXheader != (char *) NULL)
                   2248:     {
                   2249:            strcpy(header_info, XXheader);
                   2250:     }
                   2251:     else
                   2252:     {
                   2253:        char  *next;
                   2254: 
                   2255:        next = header_info;
                   2256:        
                   2257:        if (strlen(class_hint.res_name) != 0)
                   2258:        {
                   2259:            sprintf(header_info, "%s: ",
                   2260:                    class_hint.res_name);
                   2261:        
                   2262:            next += strlen(header_info);
                   2263:        }
                   2264:        
                   2265:        sprintf(next, "%s @ %s",
                   2266:                class_hint.res_class,
                   2267:                hostname);
                   2268:     }
                   2269: 
                   2270: 
                   2271:     XStoreName(XXdisplay, w, header_info);
                   2272: }
                   2273: 
                   2274: 
                   2275: /* ------------------------------------------------------------
                   2276:  *  Set icon title to icon-name (from '-in'),
                   2277:  *  or if none, to "invocation-or-class @ host".
                   2278:  *
                   2279:  */
                   2280: static int
                   2281: XT_Set_Icon_Title(w)
                   2282:     Window  w;
                   2283: {
                   2284:     char  title_info[100];
                   2285: 
                   2286:     if (XXicon_name != (char *) NULL)
                   2287:     {
                   2288:            strcpy(title_info, XXicon_name);
                   2289:     }
                   2290:     else
                   2291:     {
                   2292:        if (strlen(class_hint.res_name) != 0)
                   2293:        {
                   2294:            sprintf(title_info, "%s@", class_hint.res_name);
                   2295:        }
                   2296:        else
                   2297:        {
                   2298:            sprintf(title_info, "%s@", class_hint.res_class);
                   2299:        }
                   2300: 
                   2301:        strcat(title_info, hostname);
                   2302:     }
                   2303: 
                   2304: 
                   2305:     XChangeProperty(XXdisplay, w, XA_WM_ICON_NAME, XA_STRING, 8,
                   2306:                    PropModeReplace, title_info, strlen(title_info));
                   2307: }
                   2308: 
                   2309: 
                   2310: /* Arg PR carries value returned by XGeometry at startup, or 0.  */
                   2311: 
                   2312: static int
                   2313: XT_Set_Size_Hints(w, x, y, width, height, do_resize, pr)
                   2314:     int  x, y;                 /* only used at Startup: do_resize == FALSE */
                   2315:     int  width, height;
                   2316:     Window  w;
                   2317:     Bool  do_resize;
                   2318:     int pr;
                   2319: {
                   2320:     XSizeHints  sizehints;
                   2321: 
                   2322:     sizehints.flags = (pr & (WidthValue | HeightValue)) ? USSize : PSize;
                   2323: 
                   2324:     if (!do_resize)
                   2325:       sizehints.flags |= (pr & (XValue | YValue)) ? USPosition : PPosition;
                   2326: 
                   2327:     sizehints.flags |= PResizeInc|PMinSize;
                   2328: 
                   2329: 
                   2330:     sizehints.x = x;
                   2331:     sizehints.y = y;
                   2332:     sizehints.width = width*XXfontw+2*XXInternalBorder;
                   2333:     sizehints.height = height*XXfonth+2*XXInternalBorder;
                   2334: 
                   2335:     pixelwidth = sizehints.width;
                   2336:     pixelheight = sizehints.height;
                   2337:     flexlines = height;
                   2338: 
                   2339: 
                   2340:     change_screen_size (height, width, 0 - (do_resize == False));
                   2341: 
                   2342:     if (do_resize)
                   2343:     {
                   2344:        XResizeWindow(XXdisplay, XXwindow, pixelwidth, pixelheight);
                   2345:        XFlush(XXdisplay);
                   2346:     }
                   2347: 
                   2348: 
                   2349:     sizehints.width_inc = XXfontw;
                   2350:     sizehints.height_inc = XXfonth;
                   2351: 
                   2352:     sizehints.min_width = XXfontw*MINWIDTH+2*XXInternalBorder;
                   2353:     sizehints.min_height = XXfonth*MINHEIGHT+2*XXInternalBorder;
                   2354: 
                   2355:     /*
                   2356:      * Until the new X Inter-Client Communications Conventions are adopted,
                   2357:      * the minimum sizes are really the base sizes.
                   2358:      */
                   2359: #ifdef XICCC
                   2360:     sizehints.base_width = 2 * XXInternalBorder;
                   2361:     sizehints.base_height = 2 * XXInternalBorder;
                   2362:     sizehints.min_width = XXfontw * MINWIDTH + sizehints.base_width;
                   2363:     sizehints.min_height = XXfonth * MINHEIGHT + sizehints.base_height;
                   2364:     sizehints.flags |= PBaseSize;
                   2365: #else
                   2366:     /* old, broken versions */
                   2367:     sizehints.min_width = 2 * XXInternalBorder;
                   2368:     sizehints.min_height = 2 * XXInternalBorder;
                   2369: #endif
                   2370: 
                   2371:     XSetNormalHints(XXdisplay, w, &sizehints);
                   2372: }
                   2373: 
                   2374: 
                   2375: /* ------------------------------------------------------------
                   2376:  */
                   2377: /*ARGSUSED*/
                   2378: static int
                   2379: XT_Set_Zoom_Sizes(w)
                   2380:     Window  w;
                   2381: {
                   2382: }
                   2383: 
                   2384: 
                   2385: /* ------------------------------------------------------------
                   2386:  *  Set our state and icon parameters.
                   2387:  */
                   2388: static int
                   2389: XT_Set_WM_Hints(w)
                   2390:     Window  w;
                   2391: {
                   2392:     XWMHints  wmhints;
                   2393: 
                   2394:     wmhints.flags = InputHint | StateHint;
                   2395:     if (XXicon_usebitmap)
                   2396:            wmhints.flags |= IconPixmapHint | IconMaskHint;
                   2397: 
                   2398:     wmhints.input = True;
                   2399:     wmhints.initial_state = NormalState;
                   2400: 
                   2401:     SinkPixmap = XCreateBitmapFromData (XXdisplay, w,
                   2402:                                        sink_bits, sink_width,
                   2403:                                        sink_height);
                   2404: 
                   2405:     SinkMaskPixmap = XCreateBitmapFromData (XXdisplay, w,
                   2406:                                            sink_mask_bits,
                   2407:                                            sink_mask_width,
                   2408:                                            sink_mask_height);
                   2409: 
                   2410:     if (XXicon_usebitmap) {
                   2411:            wmhints.icon_pixmap = SinkPixmap;
                   2412:            wmhints.icon_mask = SinkMaskPixmap;
                   2413:     }
                   2414:     else {
                   2415:            wmhints.icon_pixmap = 0;
                   2416:            wmhints.icon_mask = 0;
                   2417:     }
                   2418: 
                   2419:     XSetWMHints(XXdisplay, w, &wmhints);
                   2420: }
                   2421: 
                   2422: 
                   2423: /* ------------------------------------------------------------
                   2424:  *  Change just the size of the window.
                   2425:  */
                   2426: XSetWindowSize(rows, cols)
                   2427:     int rows, cols;
                   2428: {
                   2429:     XT_Set_Size_Hints(XXwindow, 0, 0, cols, rows, NO_MANAGER, 0);
                   2430: }
                   2431: 
                   2432: 
                   2433: /* ------------------------------------------------------------
                   2434:  */
                   2435: static int
                   2436: XInitWindow ()
                   2437: {
                   2438:     extern int xargc;
                   2439:     extern char **xargv;
                   2440:     int x, y, width, height, pr;
                   2441:     char  *dp;
                   2442:     Window  desktop;
                   2443:     XColor forec, backc;
                   2444: 
                   2445: 
                   2446:     if ( (fontinfo = XT_CalcForFont(XXcurrentfont))
                   2447:        == (XFontStruct *) NULL)
                   2448:       fatal ("X server unable to find requested font `%s'.\n",
                   2449:             (XXcurrentfont == NULL) ? "(null)" :  XXcurrentfont);
                   2450: 
                   2451:     pr = XGeometry (XXdisplay, 0, desiredwindow, default_window,
                   2452:                    XXborder, XXfontw, XXfonth,
                   2453:                    XXInternalBorder*2, XXInternalBorder*2,
                   2454:                    &x, &y, &width, &height);
                   2455: 
                   2456:     /*  Which desktop do we start up on?
                   2457:      */
                   2458:     if ( (dp = getenv("WM_DESKTOP")) != (char *) NULL )
                   2459:     {
                   2460:        desktop = atoi(dp);
                   2461:     }
                   2462:     else
                   2463:     {
                   2464:        desktop = RootWindow(XXdisplay, DefaultScreen(XXdisplay));
                   2465:     }
                   2466: 
                   2467:     XXwindow = XCreateSimpleWindow(XXdisplay, desktop,
                   2468:                                   x, y,
                   2469:                                   width*XXfontw + 2*XXInternalBorder,
                   2470:                                   height*XXfonth + 2*XXInternalBorder,
                   2471:                                   XXborder, brdr, back);
                   2472:     if (!XXwindow)
                   2473:     {
                   2474:        fprintf (stderr, "Could not create X window!\n");
                   2475:        fflush (stderr);
                   2476:        exit (-97);
                   2477:     }
                   2478: 
                   2479:     XXgcv.font = XXfid;
                   2480:     XXgcv.foreground = fore;
                   2481:     XXgcv.background = back;
                   2482:     XXgc_norm = XCreateGC(XXdisplay, XXwindow,
                   2483:                          GCFont|GCForeground|GCBackground,
                   2484:                          &XXgcv);
                   2485:     XXgcv.foreground = back;
                   2486:     XXgcv.background = fore;
                   2487:     XXgc_rev = XCreateGC(XXdisplay, XXwindow,
                   2488:                         GCFont|GCForeground|GCBackground,
                   2489:                         &XXgcv);
                   2490:     XXgcv.foreground = back;
                   2491:     XXgcv.background = curs;
                   2492:     XXgc_curs = XCreateGC(XXdisplay, XXwindow,
                   2493:                          GCFont|GCForeground|GCBackground,
                   2494:                          &XXgcv);
                   2495: 
                   2496:     EmacsCursor = XCreateFontCursor(XXdisplay, XC_left_ptr);
                   2497: 
                   2498:     x_set_cursor_colors ();
                   2499: 
                   2500:     XDefineCursor (XXdisplay, XXwindow, EmacsCursor);
                   2501: 
                   2502:     CursorExists = 0;
                   2503:     CursorOutline = 1;
                   2504:     VisibleX = 0;
                   2505:     VisibleY = 0;
                   2506: 
                   2507: 
                   2508:     XT_Set_Class_Hints(XXwindow);
                   2509:     XT_Set_Command_Line(XXwindow);
                   2510:     XT_Set_Host(XXwindow);
                   2511:     XT_Set_Title(XXwindow);
                   2512:     XT_Set_Icon_Title(XXwindow);
                   2513:     XT_Set_Size_Hints(XXwindow, x, y, width, height, False, pr);
                   2514:     XT_Set_Zoom_Sizes(XXwindow);
                   2515:     XT_Set_WM_Hints(XXwindow);
                   2516: 
                   2517:     XSelectInput(XXdisplay, XXwindow, KeyPressMask |
                   2518:                 ExposureMask | ButtonPressMask | ButtonReleaseMask |
                   2519:                 EnterWindowMask | LeaveWindowMask |
                   2520:                 StructureNotifyMask);
                   2521: 
                   2522:     XMapWindow (XXdisplay, XXwindow);
                   2523:     XFlush (XXdisplay);
                   2524: }
                   2525: 
                   2526: #endif /* HAVE_X_WINDOWS */
                   2527: 
                   2528: /*#include "xundebug.h"*/

unix.superglobalmegacorp.com

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