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

1.1       root        1: /* Functions for the X window system.
                      2:    Copyright (C) 1985, 1986, 1987 Free Software Foundation.
                      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; rearranged by Richard Stallman.  */
                     22: /* Color and other features added by Robert Krawitz*/
                     23: 
                     24: /*#include <stdio.h>*/
                     25: #include <signal.h>
                     26: #include "config.h"
                     27: #include "lisp.h"
                     28: #include "window.h"
                     29: #include "xterm.h"
                     30: #include "dispextern.h"
                     31: #include "termchar.h"
                     32: #include <fcntl.h>
                     33: #include <setjmp.h>
                     34: 
                     35: #ifdef HAVE_TIMEVAL
                     36: #ifndef USG
                     37: #include <sys/time.h>
                     38: #else
                     39: #include <time.h>
                     40: #endif /* USG */
                     41: #endif
                     42: 
                     43: #ifdef HAVE_X_WINDOWS
                     44: 
                     45: #define abs(x) ((x < 0) ? ((x)) : (x))
                     46: #define sgn(x) ((x < 0) ? (-1) : (1))
                     47: #define min(a,b) ((a) < (b) ? (a) : (b))
                     48: #define max(a,b) ((a) > (b) ? (a) : (b))
                     49:   
                     50: #define CROSS_WIDTH 16
                     51: #define CROSS_HEIGHT 16
                     52: 
                     53: static short cross_bits[] =
                     54:   {
                     55:     0x0000, 0x0180, 0x0180, 0x0180,
                     56:     0x0180, 0x0180, 0x0180, 0x7ffe,
                     57:     0x7ffe, 0x0180, 0x0180, 0x0180,
                     58:     0x0180, 0x0180, 0x0180, 0x0000,
                     59:   };
                     60: 
                     61: static short gray_bits[] = {
                     62:     0xaaaa, 0x5555, 0xaaaa, 0x5555,
                     63:     0xaaaa, 0x5555, 0xaaaa, 0x5555,
                     64:     0xaaaa, 0x5555, 0xaaaa, 0x5555,
                     65:     0xaaaa, 0x5555, 0xaaaa, 0x5555};
                     66: 
                     67: #define CROSS_MASK_WIDTH 16
                     68: #define CROSS_MASK_HEIGHT 16
                     69: static short cross_mask_bits[] =
                     70:   {
                     71:     0x03c0, 0x03c0, 0x03c0, 0x03c0,
                     72:     0x03c0, 0x03c0, 0xffff, 0xffff,
                     73:     0xffff, 0xffff, 0x03c0, 0x03c0,
                     74:     0x03c0, 0x03c0, 0x03c0, 0x03c0,
                     75:   };
                     76: 
                     77: extern short sink_bits[];
                     78: extern short sink_mask_bits[];
                     79: #define sink_width 48
                     80: #define sink_height 48
                     81: #define sink_mask_width 48
                     82: #define sink_mask_height 48
                     83: 
                     84: extern XREPBUFFER Xxrepbuffer;
                     85: 
                     86: /* Non-nil if Emacs is running with an X window for display.
                     87:    Nil if Emacs is run on an ordinary terminal.
                     88:    Initialized in dispnew.c.  */
                     89: 
                     90: Lisp_Object Vxterm;
                     91: 
                     92: Lisp_Object Vx_mouse_pos, Vx_mouse_abs_pos;
                     93: 
                     94: Lisp_Object Vx_mouse_item;
                     95: 
                     96: extern struct Lisp_Vector *MouseMap;
                     97: 
                     98: extern char *fore_color;
                     99: extern char *back_color;
                    100: extern char *brdr_color;
                    101: extern char *mous_color;
                    102: extern char *curs_color;
                    103: 
                    104: extern int fore;
                    105: extern int back;
                    106: extern int brdr;
                    107: extern int mous;
                    108: extern int curs;
                    109: 
                    110: extern int XXborder;
                    111: extern int XXInternalBorder;
                    112: 
                    113: extern int (*handler) ();
                    114: 
                    115: extern FontInfo *fontinfo;
                    116: 
                    117: extern int PendingExposure;
                    118: extern char *default_window;
                    119: 
                    120: extern Window XXwindow;
                    121: extern Cursor EmacsCursor;
                    122: extern short MouseCursor[], MouseMask[];
                    123: extern char *XXcurrentfont;
                    124: extern int informflag;
                    125: 
                    126: extern int WindowMapped;
                    127: extern char iconidentity[];
                    128: extern int CurHL;
                    129: extern int pixelwidth, pixelheight;
                    130: extern int XXxoffset, XXyoffset;
                    131: extern int XXpid;
                    132: 
                    133: extern Display *XXdisplay;
                    134: extern Window XXIconWindow;
                    135: extern int IconWindow;
                    136: extern Bitmap XXIconMask;
                    137: extern int bitblt, CursorExists, VisibleX, VisibleY;
                    138: extern WindowInfo rootwindowinfo;
                    139: 
                    140: extern void x_init_1 ();
                    141: 
                    142: /* Nonzero if x-set-window-edges has been called
                    143:    or x-rubber-band has been called.
                    144:    If it is zero when x-pop-up-window is called,
                    145:    x-rubber-band is called at that point.  */
                    146: 
                    147: int x_edges_specified;
                    148: 
                    149: check_xterm ()
                    150: {
                    151:   if (NULL (Vxterm))
                    152:     error ("Terminal does not understand X protocol.");
                    153: }
                    154: 
                    155: DEFUN ("x-pop-up-window", Fx_pop_up_window, Sx_pop_up_window, 0, 0, 0,
                    156:   "Make the X window appear on the screen.")
                    157:   ()
                    158: {
                    159:   check_xterm ();
                    160:   XPopUpWindow ();
                    161:   return Qnil;
                    162: }
                    163: 
                    164: DEFUN ("x-set-bell", Fx_set_bell, Sx_set_bell, 1, 1, "P",
                    165:   "For X window system, set audible vs visible bell.\n\
                    166: With non-nil argument (prefix arg), use visible bell; otherwise, audible bell.")
                    167:   (arg)
                    168:      Lisp_Object arg;
                    169: {
                    170:   BLOCK_INPUT_DECLARE ()
                    171: 
                    172:   check_xterm ();
                    173:   BLOCK_INPUT ();
                    174:   if (!NULL (arg))
                    175:     XSetFlash ();
                    176:   else
                    177:     XSetFeep ();
                    178:   UNBLOCK_INPUT ();
                    179:   return arg;
                    180: }
                    181: 
                    182: DEFUN ("x-flip-color", Fx_flip_color, Sx_flip_color, 0, 0, "",
                    183:   "Toggle the background and foreground colors")
                    184:   ()
                    185: {
                    186:   check_xterm ();
                    187:   XFlipColor ();
                    188:   return Qt;
                    189: }
                    190: 
                    191: DEFUN ("x-set-foreground-color", Fx_set_foreground_color,
                    192:        Sx_set_foreground_color, 1, 1, "sSet foregroud color:  ",
                    193:        "Set foreground (text) color to COLOR.")
                    194:   (arg)
                    195:      Lisp_Object arg;
                    196: {
                    197:   Color cdef;
                    198:   BLOCK_INPUT_DECLARE ()
                    199:   char *save_color;
                    200: 
                    201:   save_color = fore_color;
                    202:   check_xterm ();
                    203:   CHECK_STRING (arg,1);
                    204:   fore_color = (char *) xmalloc (XSTRING (arg)->size + 1);
                    205:   BLOCK_INPUT ();
                    206:   bcopy (XSTRING (arg)->data, fore_color, XSTRING (arg)->size + 1);
                    207:   if (fore_color && DisplayCells () > 2 &&
                    208:       XParseColor (fore_color, &cdef) && XGetHardwareColor (&cdef))
                    209:     {
                    210:       fore = cdef.pixel;
                    211:     }
                    212:   else if (fore_color && strcmp (fore_color, "black") == 0)
                    213:     {
                    214:       fore = BlackPixel;
                    215:     }
                    216:   else if (fore_color && strcmp (fore_color, "white") == 0)
                    217:     {
                    218:       fore = WhitePixel;
                    219:     }
                    220:   else
                    221:     {
                    222:       fore_color = save_color;
                    223:     }
                    224:   /*    XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width,
                    225:        screen_height * fontinfo->height, back, ClipModeClipped,
                    226:        GXcopy, AllPlanes);*/
                    227:   Fredraw_display ();
                    228:   /*    dumprectangle (0, 0, screen_height * fontinfo->height,
                    229:        screen_width * fontinfo -> width);*/
                    230:   /*    PendingExposure = 1;
                    231:        xfixscreen ();*/
                    232:   UNBLOCK_INPUT ();
                    233:   XFlush ();
                    234:   return Qt;
                    235: }
                    236: 
                    237: DEFUN ("x-set-background-color", Fx_set_background_color,
                    238:        Sx_set_background_color, 1, 1, "sSet background color: ",
                    239:        "Set background color to COLOR.")
                    240:   (arg)
                    241:      Lisp_Object arg;
                    242: {
                    243:   Color cdef;
                    244:   Pixmap temp;
                    245:   BLOCK_INPUT_DECLARE ()
                    246:   char *save_color;
                    247: 
                    248:   check_xterm ();
                    249:   CHECK_STRING (arg,1);
                    250:   save_color = back_color;
                    251:   back_color = (char *) xmalloc (XSTRING (arg)->size + 1);
                    252:   bcopy (XSTRING (arg)->data, back_color, XSTRING (arg)->size + 1);
                    253:   BLOCK_INPUT ();
                    254:   if (back_color && DisplayCells () > 2 &&
                    255:       XParseColor (back_color, &cdef) && XGetHardwareColor (&cdef))
                    256:     {
                    257:       back = cdef.pixel;
                    258:     }
                    259:   else if (back_color && strcmp (back_color, "white") == 0)
                    260:     {
                    261:       back = WhitePixel;
                    262:     }
                    263:   else if (back_color && strcmp (back_color, "black") == 0)
                    264:     {
                    265:       back = BlackPixel;
                    266:     }
                    267:   else
                    268:     {
                    269:       back_color = save_color;
                    270:     }
                    271:   temp = XMakeTile (back);
                    272:   XChangeBackground (XXwindow, temp);
                    273:   /*    XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width,
                    274:        screen_height * fontinfo->height, back, ClipModeClipped,
                    275:        GXcopy, AllPlanes);*/
                    276:   UNBLOCK_INPUT ();
                    277:   Fredraw_display ();
                    278:   /*    dumprectangle (0, 0, screen_height * fontinfo->height,
                    279:        screen_width * fontinfo -> width);*/
                    280:   /*    PendingExposure = 1;
                    281:        xfixscreen ();*/
                    282:   XFlush ();
                    283:   XFreePixmap (temp);
                    284:   return Qt;
                    285: }
                    286: 
                    287: DEFUN ("x-set-border-color", Fx_set_border_color, Sx_set_border_color, 1, 1,
                    288:        "sSet border color: ",
                    289:        "Set border color to COLOR.")
                    290:   (arg)
                    291:      Lisp_Object arg;
                    292: {
                    293:   Color cdef;
                    294:   Pixmap temp;
                    295:   BLOCK_INPUT_DECLARE ()
                    296: 
                    297:   check_xterm ();
                    298:   CHECK_STRING (arg,1);
                    299:   brdr_color= (char *) xmalloc (XSTRING (arg)->size + 1);
                    300:   bcopy (XSTRING (arg)->data, brdr_color, XSTRING (arg)->size + 1);
                    301:   BLOCK_INPUT ();
                    302:   if (brdr_color && DisplayCells () > 2 &&
                    303:       XParseColor (brdr_color, &cdef) && XGetHardwareColor (&cdef))
                    304:     {
                    305:       temp = XMakeTile (cdef.pixel);
                    306:       brdr = cdef.pixel;
                    307:     }
                    308:   else if (brdr_color && strcmp (brdr_color, "black") == 0)
                    309:     {
                    310:       temp = BlackPixmap;
                    311:       brdr = BlackPixel;
                    312:     }
                    313:   else if (brdr_color && strcmp (brdr_color, "white") == 0)
                    314:     {
                    315:       temp = WhitePixmap;
                    316:       brdr = WhitePixel;
                    317:     }
                    318:   else
                    319:     {
                    320:       temp = XMakePixmap ((Bitmap) XStoreBitmap (16, 16, gray_bits),
                    321:                          BlackPixel, WhitePixel);
                    322:       brdr = BlackPixel;
                    323:       brdr_color = "gray";
                    324:     }
                    325:   if (XXborder)
                    326:     XChangeBorder (XXwindow, temp);
                    327:   UNBLOCK_INPUT ();
                    328:   XFreePixmap (temp);
                    329:   return Qt;
                    330: }
                    331: 
                    332: DEFUN ("x-set-cursor-color", Fx_set_cursor_color, Sx_set_cursor_color, 1, 1,
                    333:        "sSet text cursor color: ",
                    334:        "Set text cursor color to COLOR.")
                    335:   (arg)
                    336:      Lisp_Object arg;
                    337: {
                    338:   Color cdef;
                    339:   BLOCK_INPUT_DECLARE ()
                    340:   char *save_color;
                    341: 
                    342:   check_xterm ();
                    343:   CHECK_STRING (arg,1);
                    344:   save_color = curs_color;
                    345:   curs_color = (char *) xmalloc (XSTRING (arg)->size + 1);
                    346:   BLOCK_INPUT ();
                    347:   bcopy (XSTRING (arg)->data, curs_color, XSTRING (arg)->size + 1);
                    348:   if (curs_color && DisplayCells () > 2 &&
                    349:       XParseColor (curs_color, &cdef) && XGetHardwareColor (&cdef))
                    350:     {
                    351:       curs = cdef.pixel;
                    352:     }
                    353:   else if (curs_color && strcmp (curs_color, "black") == 0)
                    354:     {
                    355:       curs = BlackPixel;
                    356:     }
                    357:   else if (curs_color && strcmp (curs_color, "white") == 0)
                    358:     {
                    359:       curs = WhitePixel;
                    360:     }
                    361:   else
                    362:     {
                    363:       curs_color = save_color;
                    364:     }
                    365:   CursorToggle ();
                    366:   CursorToggle ();
                    367:   UNBLOCK_INPUT ();
                    368:   return Qt;
                    369: }
                    370: 
                    371: DEFUN ("x-set-mouse-color", Fx_set_mouse_color, Sx_set_mouse_color, 1, 1,
                    372:        "sSet mouse cursor color: ",
                    373:        "Set mouse cursor color to COLOR.")
                    374:   (arg)
                    375:      Lisp_Object arg;
                    376: {
                    377:   Cursor temp;
                    378:   BLOCK_INPUT_DECLARE ()
                    379:   Color cdef;
                    380:   char *save_color;
                    381: 
                    382:   check_xterm ();
                    383:   CHECK_STRING (arg,1);
                    384:   save_color = mous_color;
                    385:   mous_color = (char *) xmalloc (XSTRING (arg)->size + 1);
                    386:   BLOCK_INPUT ();
                    387:   bcopy (XSTRING (arg)->data, mous_color, XSTRING (arg)->size + 1);
                    388: 
                    389:   if (mous_color && DisplayCells () > 2
                    390:       && XParseColor (mous_color, &cdef) && XGetHardwareColor (&cdef))
                    391:     {
                    392:       mous = cdef.pixel;
                    393:     }
                    394:   else if (mous_color && strcmp (mous_color, "black") == 0)
                    395:     {
                    396:       mous = BlackPixel;
                    397:     }
                    398:   else if (mous_color && strcmp (mous_color, "white") == 0)
                    399:     {
                    400:       mous = WhitePixel;
                    401:     }
                    402:   else
                    403:     {
                    404:       mous_color = save_color;
                    405:     }
                    406:   temp = XCreateCursor (16, 16, MouseCursor, MouseMask, 0, 0,
                    407:                        mous, back, GXcopy);
                    408:   XDefineCursor (XXwindow, temp);
                    409:   XFreeCursor (EmacsCursor);
                    410:   UNBLOCK_INPUT ();
                    411:   bcopy (&temp, &EmacsCursor, sizeof (Cursor));
                    412:   return Qt;
                    413: }   
                    414: 
                    415: DEFUN ("x-color-p", Fx_color_p, Sx_color_p, 0, 0, 0,
                    416:        "Returns t if the display is a color X terminal.")
                    417:   ()
                    418: {
                    419:   check_xterm ();
                    420:   if (DisplayCells () > 2)
                    421:     return Qt;
                    422:   else
                    423:     return Qnil;
                    424: }
                    425:        
                    426: DEFUN ("x-get-foreground-color", Fx_get_foreground_color,
                    427:        Sx_get_foreground_color, 0, 0, 0,
                    428:        "Returns the color of the foreground, as a string.")
                    429:   ()
                    430: {
                    431:   Lisp_Object string;
                    432:   string = build_string (fore_color);
                    433:   return string;
                    434: }
                    435: 
                    436: DEFUN ("x-get-background-color", Fx_get_background_color,
                    437:        Sx_get_background_color, 0, 0, 0,
                    438:        "Returns the color of the background, as a string.")
                    439:   ()
                    440: {
                    441:   Lisp_Object string;
                    442:   string = build_string (back_color);
                    443:   return string;
                    444: }
                    445: 
                    446: DEFUN ("x-get-border-color", Fx_get_border_color,
                    447:        Sx_get_border_color, 0, 0, 0,
                    448:        "Returns the color of the border, as a string.")
                    449:   ()
                    450: {
                    451:   Lisp_Object string;
                    452:   string = build_string (brdr_color);
                    453:   return string;
                    454: }
                    455: 
                    456: DEFUN ("x-get-cursor-color", Fx_get_cursor_color,
                    457:        Sx_get_cursor_color, 0, 0, 0,
                    458:        "Returns the color of the cursor, as a string.")
                    459:   ()
                    460: {
                    461:   Lisp_Object string;
                    462:   string = build_string (curs_color);
                    463:   return string;
                    464: }
                    465: 
                    466: DEFUN ("x-get-mouse-color", Fx_get_mouse_color,
                    467:        Sx_get_mouse_color, 0, 0, 0,
                    468:        "Returns the color of the mouse cursor, as a string.")
                    469:   ()
                    470: {
                    471:   Lisp_Object string;
                    472:   string = build_string (mous_color);
                    473:   return string;
                    474: }
                    475: 
                    476: DEFUN ("x-get-default", Fx_get_default, Sx_get_default, 1, 1, 0,
                    477:        "Get X default ATTRIBUTE from the system.  Returns nil if\n\
                    478: attribute does not exist.")
                    479:   (arg)
                    480:      Lisp_Object arg;
                    481: {
                    482:   unsigned char *default_name, *value;
                    483: 
                    484:   CHECK_STRING (arg, 1);
                    485:   default_name = XSTRING (arg)->data;
                    486: 
                    487:   value = (unsigned char *) XGetDefault ("emacs", default_name);
                    488:   /* if (value == 0)
                    489:      value = XGetDefault ("", default_name); */
                    490:   if (value)
                    491:     return build_string (value);
                    492:   else
                    493:     return (Qnil);
                    494: }
                    495: 
                    496: DEFUN ("x-set-icon", Fx_set_icon, Sx_set_icon, 1, 1, "P",
                    497:   "Set type of icon used by X for Emacs's window.\n\
                    498: ARG non-nil means use kitchen-sink icon;\n\
                    499: nil means use generic window manager icon.")
                    500:   (arg)
                    501:      Lisp_Object arg;
                    502: {
                    503:   check_xterm ();
                    504:   if (NULL (arg))
                    505:     XTextIcon ();
                    506:   else
                    507:     XBitmapIcon ();
                    508:   return arg;
                    509: }
                    510: 
                    511: DEFUN ("x-set-font", Fx_set_font, Sx_set_font, 1, 1, "sFont Name: ",
                    512:       "At initialization sets the font to be used for the X window.")
                    513:   (arg)
                    514:      Lisp_Object arg;
                    515: {
                    516:   register char *newfontname;
                    517:        
                    518:   CHECK_STRING (arg, 1);
                    519:   check_xterm ();
                    520: 
                    521:   newfontname = (char *) xmalloc (XSTRING (arg)->size + 1);
                    522:   bcopy (XSTRING (arg)->data, newfontname, XSTRING (arg)->size + 1);
                    523:   if (XSTRING (arg)->size == 0)
                    524:     /* XOpenFont ("") gets a badarg error rather than a badfont error.
                    525:        I believe this is an X bug.
                    526:        In emacs, badarg errors cause emacs to die, whilst badfont errors
                    527:        are caught.  This kludge prevents us from dying.
                    528:      */
                    529:     goto badfont;
                    530: 
                    531:   if (!XNewFont (newfontname))
                    532:     {
                    533:       free (XXcurrentfont);
                    534:       XXcurrentfont = newfontname;
                    535:       return Qt;
                    536:     }
                    537:   else
                    538:     {
                    539:     badfont:
                    540:       error ("Font \"%s\" is not defined", newfontname);
                    541:       free (newfontname);
                    542:     }
                    543: 
                    544:   return Qnil;
                    545: }
                    546: 
                    547: DEFUN ("x-set-window-edges", Fx_set_window_edges, Sx_set_window_edges, 4, 4,
                    548:   "nNumber of Columns: \nnNumber of Rows: \nnX Offset in Pixels: \n\
                    549: nY Offset in Pixels: ",
                    550:   "Sets X window size/position: size COLS by ROWS, positions XOFF and YOFF.\n\
                    551: To get \"minus zero\" for XOFF or YOFF, supply -1.")
                    552:   (cols, rows, xoffset, yoffset)
                    553:      Lisp_Object rows, cols, xoffset, yoffset;
                    554: {
                    555:   BLOCK_INPUT_DECLARE ()
                    556: 
                    557:   CHECK_NUMBER (rows, 1);
                    558:   CHECK_NUMBER (cols, 2);
                    559:   CHECK_NUMBER (xoffset, 3);
                    560:   CHECK_NUMBER (yoffset, 4);
                    561:   check_xterm ();
                    562: 
                    563:   BLOCK_INPUT ();
                    564:   x_edges_specified = 1;
                    565:   if (XINT (rows) != screen_width || XINT (cols) != screen_height) 
                    566:     {
                    567:       XSetWindowSize (XINT (rows), XINT (cols));
                    568:     }
                    569:   XSetOffset (XINT (xoffset), XINT (yoffset));
                    570:   XFlush ();
                    571:   UNBLOCK_INPUT ();
                    572:   return Qt;
                    573: }
                    574: 
                    575: DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
                    576:   Scoordinates_in_window_p, 2, 2, 0,
                    577:   "Return non-nil if POSITIONS (a list, (SCREEN-X SCREEN-Y)) is in WINDOW.\n\
                    578: Returned value is list of positions expressed\n\
                    579: relative to window upper left corner.")
                    580:   (coordinate, window)
                    581:      register Lisp_Object coordinate, window;
                    582: {
                    583:   register Lisp_Object xcoord, ycoord;
                    584:        
                    585:   if (!CONSP (coordinate)) wrong_type_argument (Qlistp, coordinate);
                    586:   CHECK_WINDOW (window, 2);
                    587:   xcoord = Fcar (coordinate);
                    588:   ycoord = Fcar (Fcdr (coordinate));
                    589:   CHECK_NUMBER (xcoord, 0);
                    590:   CHECK_NUMBER (ycoord, 1);
                    591:   if ((XINT (xcoord) < XINT (XWINDOW (window)->left)) ||
                    592:       (XINT (xcoord) >= (XINT (XWINDOW (window)->left) +
                    593:                         XINT (XWINDOW (window)->width))))
                    594:     {
                    595:       return Qnil;
                    596:     } 
                    597:   XFASTINT (xcoord) -= XFASTINT (XWINDOW (window)->left);
                    598:   if (XINT (ycoord) == (screen_height - 1))
                    599:     return Qnil;
                    600:   if ((XINT (ycoord) < XINT (XWINDOW (window)->top)) ||
                    601:       (XINT (ycoord) >= (XINT (XWINDOW (window)->top) +
                    602:                         XINT (XWINDOW (window)->height)) - 1))
                    603:     {
                    604:       return Qnil;
                    605:     }
                    606:   XFASTINT (ycoord) -= XFASTINT (XWINDOW (window)->top);
                    607:   return Fcons (xcoord, Fcons (ycoord, Qnil));
                    608: }
                    609: 
                    610: DEFUN ("x-mouse-events", Fx_mouse_events, Sx_mouse_events, 0, 0, 0,
                    611:   "Return number of pending mouse events from X window system.")
                    612:   ()
                    613: {
                    614:   register Lisp_Object tem;
                    615:   register int windex, rindex, mindex;
                    616: 
                    617:   check_xterm ();
                    618:   windex = Xxrepbuffer.windex;
                    619:   rindex = Xxrepbuffer.rindex;
                    620:   mindex = Xxrepbuffer.mindex;
                    621: 
                    622:   if (windex >= rindex) 
                    623:     {
                    624:       XSET (tem, Lisp_Int, windex - rindex);
                    625:     }
                    626:   else
                    627:     {
                    628:       XSET (tem, Lisp_Int, mindex + 1 - (rindex - windex));
                    629:     }
                    630:   return tem;
                    631: }
                    632: 
                    633: DEFUN ("x-proc-mouse-event", Fx_proc_mouse_event, Sx_proc_mouse_event,
                    634:   0, 0, 0,
                    635:   "Pulls a mouse event out of the mouse event buffer and dispatches\n\
                    636: the appropriate function to act upon this event.")
                    637:   ()
                    638: {
                    639:   XButtonEvent xrep;
                    640:   register Lisp_Object Mouse_Cmd;
                    641:   register char com_letter;
                    642:   register char key_mask;
                    643:   register Lisp_Object tempx;
                    644:   register Lisp_Object tempy;
                    645:   extern Lisp_Object get_keyelt ();
                    646: 
                    647:   check_xterm ();
                    648:   if (unloadxrepbuffer (&xrep, &Xxrepbuffer) == 0) 
                    649:     {
                    650:       com_letter = xrep.detail & 3;
                    651:       key_mask = (xrep.detail >> 8) & 0xf0;
                    652:       com_letter |= key_mask;
                    653: #ifndef HPUX
                    654:       if (xrep.type == ButtonReleased) com_letter |= 0x04;
                    655: #endif
                    656:       XSET (tempx, Lisp_Int, min (screen_width-1, max (0, (xrep.x - XXInternalBorder)/fontinfo->width)));
                    657:       XSET (tempy, Lisp_Int, min (screen_height-1, max (0, (xrep.y - XXInternalBorder)/fontinfo->height)));
                    658:       Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
                    659:       XSET (tempx, Lisp_Int, xrep.x + XXxoffset);
                    660:       XSET (tempy, Lisp_Int, xrep.y + XXyoffset);
                    661:       Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil));
                    662:       Vx_mouse_item = make_number (com_letter);
                    663:       Mouse_Cmd = get_keyelt (access_keymap (MouseMap, com_letter));
                    664:       if (NULL (Mouse_Cmd)) 
                    665:        {
                    666: #ifndef HPUX
                    667:          if (xrep.type != ButtonReleased)
                    668:            Ding ();
                    669: #endif
                    670:          Vx_mouse_pos = Qnil;
                    671:          Vx_mouse_abs_pos = Qnil;
                    672:        }
                    673:       else
                    674:        {
                    675:          return call1 (Mouse_Cmd, Vx_mouse_pos);
                    676:        }
                    677:     }
                    678:   return Qnil;
                    679: }
                    680: 
                    681: DEFUN ("x-get-mouse-event", Fx_get_mouse_event, Sx_get_mouse_event,
                    682:   1, 1, 0,
                    683:   "Get next mouse event out of mouse event buffer (com-letter (x y)).\n\
                    684: ARG non-nil means return nil immediately if no pending event;\n\
                    685: otherwise, wait for an event.")
                    686:   (arg)
                    687:      Lisp_Object arg;
                    688: {
                    689:   XButtonEvent xrep;
                    690:   register Lisp_Object Mouse_Cmd;
                    691:   register char com_letter;
                    692:   register char key_mask;
                    693: 
                    694:   register Lisp_Object tempx;
                    695:   register Lisp_Object tempy;
                    696:   extern Lisp_Object get_keyelt ();
                    697: 
                    698:   check_xterm ();
                    699: 
                    700:   if (NULL (arg))
                    701:     while (Xxrepbuffer.windex == Xxrepbuffer.rindex);
                    702: /*** ??? Surely you don't mean to busy wait??? */
                    703:   if (unloadxrepbuffer (&xrep, &Xxrepbuffer) == 0) 
                    704:     {
                    705:       com_letter = *((char *)&xrep.detail);
                    706:       com_letter &= 3;
                    707:       key_mask = *((char *)&xrep.detail + 1);
                    708:       key_mask &= 0xf0;
                    709:       com_letter |= key_mask;
                    710: #ifndef HPUX
                    711:       if (xrep.type == ButtonReleased) com_letter |= 0x04;
                    712: #endif
                    713:       XSET (tempx, Lisp_Int, min (screen_width, max (0, (xrep.x - XXInternalBorder)/fontinfo->width)));
                    714:       XSET (tempy, Lisp_Int, min (screen_height, max (0, (xrep.y - XXInternalBorder)/fontinfo->height)));
                    715:       Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil));
                    716:       XSET (tempx, Lisp_Int, xrep.x + XXxoffset);
                    717:       XSET (tempy, Lisp_Int, xrep.y + XXyoffset);
                    718:       Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil));
                    719:       return Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil));
                    720:     }
                    721:   return Qnil;
                    722: }
                    723: 
                    724: DEFUN ("x-set-keyboard-enable", Fx_set_keyboard_enable,
                    725:   Sx_set_keyboard_enable, 1, 1, 0,
                    726:   "In the X window system, set the flag that permite keyboard input.\n\
                    727: Permit input if ARG is non-nil.")
                    728:   (arg)
                    729:      Lisp_Object arg;
                    730: {
                    731:   BLOCK_INPUT_DECLARE ()
                    732: 
                    733:   check_xterm ();
                    734: 
                    735:   BLOCK_INPUT ();
                    736:   XSelectInput (XXwindow,
                    737:                ExposeWindow | ButtonPressed
                    738: #ifndef HPUX
                    739:                | ButtonReleased
                    740: #endif
                    741:                | ExposeRegion | ExposeCopy | (!NULL (arg) ? KeyPressed : 0));
                    742:   UNBLOCK_INPUT ();
                    743:   return arg;
                    744: }
                    745: 
                    746: DEFUN ("x-set-mouse-inform-flag", Fx_set_mouse_inform_flag,
                    747:   Sx_set_mouse_inform_flag, 1, 1, 0,
                    748:   "Set inform-of-mouse-events flag in X window system on if ARG is non-nil.")
                    749:   (arg)
                    750:      Lisp_Object arg;
                    751: {
                    752:   informflag = !NULL (arg);
                    753:   return arg;
                    754: }
                    755: 
                    756: DEFUN ("x-store-cut-buffer", Fx_store_cut_buffer, Sx_store_cut_buffer,
                    757:   1, 1, "sSend string to X:",
                    758:   "Store contents of STRING into the cut buffer of the X window system.")
                    759:   (string)
                    760:      register Lisp_Object string;
                    761: {
                    762:   BLOCK_INPUT_DECLARE ()
                    763: 
                    764:   CHECK_STRING (string, 1);
                    765:   check_xterm ();
                    766: 
                    767:   BLOCK_INPUT ();
                    768:   XStoreBytes (XSTRING (string)->data, XSTRING (string)->size);
                    769:   UNBLOCK_INPUT ();
                    770: 
                    771:   return Qnil;
                    772: }
                    773: 
                    774: DEFUN ("x-get-cut-buffer", Fx_get_cut_buffer, Sx_get_cut_buffer, 0, 0, 0,
                    775:   "Return contents of cut buffer of the X window system, as a string.")
                    776:   ()
                    777: {
                    778:   int len;
                    779:   register Lisp_Object string;
                    780:   BLOCK_INPUT_DECLARE ()
                    781:   register char *d;
                    782: 
                    783:   BLOCK_INPUT ();
                    784:   d = XFetchBytes (&len);
                    785:   string = make_string (d, len);
                    786:   UNBLOCK_INPUT ();
                    787:   return string;
                    788: }
                    789: 
                    790: DEFUN ("x-rubber-band", Fx_rubber_band, Sx_rubber_band, 0, 0, "",
                    791:   "Ask user to specify Emacs window position and size with mouse.\n\
                    792: This is done automatically if the data has not been specified\n\
                    793: when Emacs needs the window to be displayed.")
                    794:   ()
                    795: {
                    796:   int x, y, width, height;
                    797:   BLOCK_INPUT_DECLARE ()
                    798: 
                    799:   x_edges_specified = 1;
                    800: 
                    801:   check_xterm ();
                    802:   BLOCK_INPUT ();
                    803:   window_fetch (fontinfo->id, &x, &y, &width, &height, "", default_window,
                    804:                XXborder, "GNU Emacs");
                    805:   XSetWindowSize (height, width);
                    806:   XSetOffset (x, y);
                    807:   XFlush ();
                    808:   ++screen_garbaged;
                    809:   UNBLOCK_INPUT ();
                    810:   return Qnil;
                    811: }
                    812: 
                    813: DEFUN ("x-create-x-window", Fx_create_x_window, Sx_create_x_window,
                    814:        1, 1, 0,
                    815:        "Create window for GNU Emacs from a valid GEOMETRY specification.")
                    816:      (arg)
                    817:      Lisp_Object arg;
                    818: {
                    819:   int x, y, width, height;
                    820:   char *geometry;
                    821:   BLOCK_INPUT_DECLARE ()
                    822: 
                    823:   x_edges_specified = 1;
                    824: 
                    825:   check_xterm ();
                    826:   CHECK_STRING (arg, 1);
                    827:   geometry= (char *) xmalloc (XSTRING (arg)->size + 1);
                    828:   bcopy (XSTRING (arg)->data, geometry, XSTRING (arg)->size + 1);
                    829:   BLOCK_INPUT ();
                    830:   window_fetch (fontinfo->id, &x, &y, &width, &height, geometry,
                    831:                default_window, XXborder, "GNU Emacs");
                    832:   XSetWindowSize (height, width);
                    833: /*  XSetWindowSize ((height - (2 * XXborder))/fontinfo -> height,
                    834:     (width - (2 * XXborder))/fontinfo -> width);*/
                    835:   XSetOffset (x, y);
                    836:   XMapWindow (XXwindow);
                    837:   XFlush ();
                    838:   UNBLOCK_INPUT ();
                    839:   return Qnil;
                    840: }
                    841: 
                    842: 
                    843: static int
                    844: grey_p (colour)
                    845:      char *colour;
                    846: {
                    847:   return (!strcmp (colour, "grey") || !strcmp (colour, "Grey") ||
                    848:          !strcmp (colour, "gray") || !strcmp (colour, "Gray"));
                    849: }
                    850: 
                    851: DEFUN ("x-set-border-width", Fx_set_border_width, Sx_set_border_width,
                    852:   1, 1, "NSet border width: ",
                    853:   "Set width of border to WIDTH, in the X window system.")
                    854:   (borderwidth)
                    855:      register Lisp_Object borderwidth;
                    856: {
                    857:   WindowInfo WinInfo;
                    858:   BLOCK_INPUT_DECLARE ()
                    859:   Window tempwindow;
                    860:   register int temppixelwidth;
                    861:   register int temppixelheight;
                    862:   register int tempx;
                    863:   register int tempy;
                    864:   Pixmap temp_brdr, temp_back;
                    865: 
                    866:   CHECK_NUMBER (borderwidth, 0);
                    867: 
                    868:   check_xterm ();
                    869:   
                    870:   if (XINT (borderwidth) < 0) XSETINT (borderwidth, 0);
                    871:   
                    872:   temppixelwidth = screen_width * fontinfo->width + 2 * XXInternalBorder;
                    873:   temppixelheight = screen_height * fontinfo->height + 2 * XXInternalBorder;
                    874:   BLOCK_INPUT ();
                    875:   XQueryWindow (XXwindow, &WinInfo);
                    876:   tempx = WinInfo.x;
                    877:   tempy = WinInfo.y;
                    878:   if (grey_p (brdr_color))
                    879:     temp_brdr = XMakePixmap ((Bitmap) XStoreBitmap (16, 16, gray_bits),
                    880:                             BlackPixel, WhitePixel);
                    881:   else
                    882:     temp_brdr = XMakeTile (brdr);
                    883:   temp_back = XMakeTile (back);
                    884:   tempwindow = XCreateWindow (RootWindow,
                    885:                              tempx /* Absolute horizontal offset */,
                    886:                              tempy /* Absolute Vertical offset */,
                    887:                              temppixelwidth, temppixelheight,
                    888:                              XINT (borderwidth),
                    889:                              temp_brdr, temp_back);
                    890:   if (tempwindow) 
                    891:     {
                    892:       XDestroyWindow (XXwindow);
                    893:       XXwindow = tempwindow;
                    894:       pixelwidth = temppixelwidth;
                    895:       pixelheight = temppixelheight;
                    896:       XXborder = XINT (borderwidth);
                    897:       XSelectInput (XXwindow, NoEvent);
                    898:       XSetResizeHint (XXwindow, 2 * XXInternalBorder, 2 * XXInternalBorder,
                    899:                      /* fontinfo->width * 1, fontinfo->height * 1, */
                    900:                      fontinfo->width, fontinfo->height);
                    901:       XStoreName (XXwindow, &iconidentity[0]);
                    902:       XDefineCursor (XXwindow, EmacsCursor);
                    903:       XFreePixmap (temp_brdr);
                    904:       XFreePixmap (temp_back);
                    905:       UNBLOCK_INPUT_RESIGNAL ();
                    906:       if (WindowMapped)
                    907:        {
                    908:          XMapWindow (XXwindow);
                    909:          XSelectInput (XXwindow, KeyPressed | ExposeWindow | ButtonPressed
                    910: #ifndef HPUX
                    911:                        | ButtonReleased
                    912: #endif
                    913:                        | ExposeRegion | ExposeCopy);
                    914:          ++screen_garbaged;
                    915:          XFlush ();
                    916:        }
                    917:       return Qt;
                    918:     }
                    919:   else
                    920:     {
                    921:       UNBLOCK_INPUT_RESIGNAL ();
                    922:       message ("Could not recreate window.");
                    923:       return Qnil;
                    924:     }
                    925: }
                    926: 
                    927: 
                    928: DEFUN ("x-set-internal-border-width", Fx_set_internal_border_width,
                    929:        Sx_set_internal_border_width, 1, 1, "NSet internal border width: ",
                    930:   "Set width of internal border to WIDTH, in the X window system.")
                    931:   (internalborderwidth)
                    932:      register Lisp_Object internalborderwidth;
                    933: {
                    934:   WindowInfo WinInfo;
                    935:   BLOCK_INPUT_DECLARE ()
                    936:   Window tempwindow;
                    937:   register int temppixelwidth;
                    938:   register int temppixelheight;
                    939:   register int tempx;
                    940:   register int tempy;
                    941:   register int intbord;
                    942:   Pixmap temp_brdr, temp_back;
                    943: 
                    944:   CHECK_NUMBER (internalborderwidth, 0);
                    945: 
                    946:   check_xterm ();
                    947:   
                    948:   if (XINT (internalborderwidth) < 0) XSETINT (internalborderwidth, 0);
                    949:   intbord = XINT (internalborderwidth);
                    950:   temppixelwidth = screen_width * fontinfo->width + 2 * intbord;
                    951:   temppixelheight = screen_height * fontinfo->height + 2 * intbord;
                    952:   BLOCK_INPUT ();
                    953:   XQueryWindow (XXwindow, &WinInfo);
                    954:   tempx = WinInfo.x;
                    955:   tempy = WinInfo.y;
                    956:   if (grey_p (brdr_color))
                    957:     temp_brdr = XMakePixmap ((Bitmap) XStoreBitmap (16, 16, gray_bits),
                    958:                             BlackPixel, WhitePixel);
                    959:   else
                    960:     temp_brdr = XMakeTile (brdr);
                    961:   temp_back = XMakeTile (back);
                    962:   tempwindow = XCreateWindow (RootWindow,
                    963:                              tempx /* Absolute horizontal offset */,
                    964:                              tempy /* Absolute Vertical offset */,
                    965:                              temppixelwidth, temppixelheight,
                    966:                              XXborder,
                    967:                              temp_brdr, temp_back);
                    968:   if (tempwindow) 
                    969:     {
                    970:       XDestroyWindow (XXwindow);
                    971:       XXwindow = tempwindow;
                    972:       pixelwidth = temppixelwidth;
                    973:       pixelheight = temppixelheight;
                    974:       XXInternalBorder = intbord;
                    975:       XSelectInput (XXwindow, NoEvent);
                    976:       XSetResizeHint (XXwindow, 2 * XXInternalBorder, 2 * XXInternalBorder,
                    977:                      /* fontinfo->width * 1, fontinfo->height * 1, */
                    978:                      fontinfo->width, fontinfo->height);
                    979:       XStoreName (XXwindow, &iconidentity[0]);
                    980:       XDefineCursor (XXwindow, EmacsCursor);
                    981:       XFreePixmap (temp_brdr);
                    982:       XFreePixmap (temp_back);
                    983:       UNBLOCK_INPUT_RESIGNAL ();
                    984:       if (WindowMapped)
                    985:        {
                    986:          XMapWindow (XXwindow);
                    987:          XSelectInput (XXwindow, KeyPressed | ExposeWindow | ButtonPressed
                    988: #ifndef HPUX
                    989:                        | ButtonReleased
                    990: #endif
                    991:                        | ExposeRegion | ExposeCopy);
                    992:          ++screen_garbaged;
                    993:          XFlush ();
                    994:        }
                    995:       return Qt;
                    996:     }
                    997:   else
                    998:     {
                    999:       UNBLOCK_INPUT_RESIGNAL ();
                   1000:       message ("Could not recreate window.");
                   1001:       return Qnil;
                   1002:     }
                   1003: }
                   1004: 
                   1005: jmp_buf dispenv;
                   1006: Display *OldDisplay;
                   1007: FontInfo *OldFontInfo;
                   1008: Window OldWindow;
                   1009: 
                   1010: XRestoreDisplay ()
                   1011: {
                   1012:   longjmp (dispenv, "Unable to access display (probably)");
                   1013: }
                   1014: 
                   1015: DEFUN ("x-change-display", Fx_change_display, Sx_change_display, 1, 1,
                   1016:   "sNew display name: ", 
                   1017:   "This function takes one argument, the display where you wish to\n\
                   1018: continue your editing session.  Your current window will be unmapped and\n\
                   1019: the current display will be closed.  The new X display will be opened and\n\
                   1020: the rubber-band outline of the new window will appear on the new X display.\n\
                   1021: This function does not look at your .Xdefaults file, so you should use the\n\
                   1022: function x-new-display instead.")
                   1023:   (new_display)
                   1024:      register Lisp_Object new_display;
                   1025: {
                   1026:   Cursor OldEmacsCursor;
                   1027:   BLOCK_INPUT_DECLARE ()
                   1028:   register int (*pipefunc) ();
                   1029:   register char *newdisplayname = 0;
                   1030:   int x, y, width, height;
                   1031:   int temp_icon;
                   1032:   int XRestoreDisplay ();
                   1033:   Pixmap temp_brdr, temp_back;
                   1034:   register char *XXerrorcode;
                   1035: 
                   1036:   CHECK_STRING (new_display, 1);
                   1037:   check_xterm ();
                   1038: 
                   1039: /*  newdisplayname = xmalloc (XSTRING (new_display)->size + 1); */
                   1040: /*  bcopy (XSTRING (new_display)->data, newdisplayname, */
                   1041: /*      XSTRING (new_display)->size + 1);  */
                   1042:   /* Since this was freed at the end, why not just use the original? */
                   1043:   newdisplayname = (char *) XSTRING (new_display)->data;
                   1044:   BLOCK_INPUT ();
                   1045:   XIOErrorHandler (XRestoreDisplay);
                   1046:    if (XXerrorcode = (char *) setjmp (dispenv))
                   1047:      {
                   1048:  /*       free (&newdisplayname[0]); */
                   1049:        if (fontinfo)
                   1050:         XCloseFont (fontinfo);
                   1051:        if (XXwindow)
                   1052:         XDestroyWindow (XXwindow);
                   1053:        if (XXdisplay)
                   1054:         XCloseDisplay (XXdisplay);
                   1055:        XXdisplay = OldDisplay;
                   1056:        fontinfo = OldFontInfo;
                   1057:        XXwindow = OldWindow;
                   1058:        EmacsCursor = OldEmacsCursor;
                   1059:        XIOErrorHandler (handler);
                   1060:        XSetDisplay (XXdisplay);
                   1061:        UNBLOCK_INPUT_RESIGNAL ();
                   1062:        error ("Display change problem: %s", XXerrorcode);
                   1063:      }
                   1064:    else
                   1065:      {
                   1066:        OldEmacsCursor = EmacsCursor;
                   1067:        OldDisplay = XXdisplay;
                   1068:        OldFontInfo = fontinfo;
                   1069:        OldWindow = XXwindow;
                   1070:        XXwindow = 0;
                   1071:        fontinfo = 0;
                   1072:        XXdisplay = 0;
                   1073:      }
                   1074:    XXdisplay = XOpenDisplay (newdisplayname);
                   1075:    if (!XXdisplay)
                   1076:      {
                   1077:        longjmp (dispenv, "Probably nonexistant display");
                   1078:      }
                   1079:    XQueryWindow (RootWindow, &rootwindowinfo);
                   1080:    fontinfo = XOpenFont (XXcurrentfont);
                   1081:    if (!fontinfo)
                   1082:      {
                   1083:        longjmp (dispenv, "Bad font");
                   1084:      }
                   1085:    /* pixelwidth and pixelheight are correct*/
                   1086:    XXwindow = XCreateWindow (RootWindow,
                   1087:                             XXxoffset,
                   1088:                             XXyoffset,
                   1089:                             pixelwidth, pixelheight,
                   1090:                             XXborder, BlackPixmap, WhitePixmap);
                   1091:    if (!XXwindow)
                   1092:      {
                   1093:        longjmp (dispenv, "Could not create window");
                   1094:      }
                   1095:    fore = BlackPixel;
                   1096:    back = WhitePixel;
                   1097:    brdr = BlackPixel;
                   1098:    mous = BlackPixel;
                   1099:    curs = BlackPixel;
                   1100: 
                   1101:    fore_color = "black";
                   1102:    back_color = "white";
                   1103:    brdr_color = "black";
                   1104:    mous_color = "black";
                   1105:    curs_color = "black";
                   1106: 
                   1107:    XSelectInput (XXwindow, NoEvent);
                   1108:    EmacsCursor = XCreateCursor (16, 16, MouseCursor, MouseMask,
                   1109:                                0, 0, mous, back, GXcopy);
                   1110:   XDefineCursor (XXwindow, EmacsCursor);
                   1111:   XSetResizeHint (XXwindow, 2 * XXInternalBorder, 2 * XXInternalBorder,
                   1112:                  /* fontinfo->width * 1, fontinfo->height * 1, */
                   1113:                  fontinfo->width, fontinfo->height);
                   1114:    XStoreName (XXwindow, iconidentity);
                   1115: /*  WindowMapped = 0;*/
                   1116:   x_edges_specified = 0;
                   1117:   bitblt = 0;
                   1118:   CursorExists = 0;
                   1119:   VisibleX = 0;
                   1120:   VisibleY = 0;
                   1121:   XSetDisplay (XXdisplay);
                   1122: /*  XQueryWindow (RootWindow, &rootwindowinfo);*/
                   1123: /*  if (WindowMapped)
                   1124:     {*/
                   1125:   XXIconWindow = XCreateWindow (RootWindow, 0, 0, sink_width, sink_height,
                   1126:                                2, WhitePixmap, BlackPixmap);
                   1127:   XXIconMask = XStoreBitmap (sink_mask_width, sink_mask_height, sink_mask_bits);
                   1128:   WindowMapped = 0;
                   1129:   XPopUpWindow ();
                   1130: /*  }*/
                   1131:   WindowMapped = 1;
                   1132:   XSetDisplay (OldDisplay);
                   1133:   XCloseFont (OldFontInfo);
                   1134:   XFreeCursor (OldEmacsCursor);
                   1135:   XDestroyWindow (OldWindow);
                   1136:   XSetDisplay (XXdisplay);
                   1137:   XCloseDisplay (OldDisplay);
                   1138: 
                   1139:   x_init_1 (0);
                   1140:   UNBLOCK_INPUT_RESIGNAL ();
                   1141: /*  free (newdisplayname); */
                   1142: /*  x_edges_specified = 0;*/
                   1143:   ++screen_garbaged;
                   1144:   Fredraw_display ();
                   1145:   return Qt;
                   1146: }
                   1147: 
                   1148: /*
                   1149:    Grabs mouse, outlines a window, etc.
                   1150:    if left button pressed, sizes a wd x hd window (in characters)
                   1151:    if right button pressed, sizes wd x what will fit window (in characters)
                   1152:    if middle button pressed, allows user to size window in font increments
                   1153:        (+ border * 2 for inner border);
                   1154:    While sizing, dimensions of window are displayed in upper left of root.
                   1155:    str is also displayed there.
                   1156:    In all cases, x and y are the desired coordinates for the upper lefthand
                   1157:        corner, *width = width desired, *height = height desired
                   1158:        (min for both is 1 font char).
                   1159: 
                   1160:        */
                   1161: /*
                   1162:   This routine is a total crock.  It makes a window using XCreateTerm
                   1163:   purely for return value, destroying the temporary window created in
                   1164:   the process.  If XCreateTerm were broken into smaller, more easily
                   1165:   digestible pieces, it would be useful.  As such, the constraints of
                   1166:   time, emacs, and X conventions force me into this crock. --rlk
                   1167:   */
                   1168: 
                   1169: window_fetch (font, x, y, width, height, geo, deflt, border, str)
                   1170:      Font font;
                   1171:      int *x, *y, *width, *height;
                   1172:      char *geo, *deflt;
                   1173:      int border;
                   1174:      char *str;
                   1175: {
                   1176:   OpaqueFrame frame;
                   1177:   Window tempwindow;
                   1178:   WindowInfo WinInfo;
                   1179:   register int temppixelwidth;
                   1180:   register int temppixelheight;
                   1181:   Pixmap temp_brdr, temp_back;
                   1182: 
                   1183:   temp_brdr = XMakeTile (brdr);
                   1184:   temp_back = XMakeTile (back);
                   1185:   frame.bdrwidth = border;
                   1186:   if (grey_p (brdr_color))
                   1187:     frame.border = XMakePixmap ((Bitmap) XStoreBitmap (16, 16, gray_bits),
                   1188:                                BlackPixel, WhitePixel);
                   1189:   else
                   1190:     frame.border = XMakeTile (brdr);
                   1191:   frame.background = XMakeTile (back);
                   1192:   tempwindow = XCreateTerm (str, "emacs", geo, deflt, &frame, 10, 5,
                   1193:                            2 * XXInternalBorder, 2 * XXInternalBorder,
                   1194:                            width, height, fontinfo, fontinfo->width,
                   1195:                            fontinfo->height);
                   1196:   if (tempwindow) 
                   1197:     {
                   1198:       XDestroyWindow (XXwindow);
                   1199:       XXwindow = tempwindow;
                   1200:       XSelectInput (XXwindow, NoEvent);
                   1201:       XSetResizeHint (XXwindow, 2 * XXInternalBorder, 2 * XXInternalBorder,
                   1202:                      /* fontinfo->width * 1, fontinfo->height * 1, */
                   1203:                      fontinfo->width, fontinfo->height);
                   1204:       XStoreName (XXwindow, &iconidentity[0]);
                   1205:       XDefineCursor (XXwindow, EmacsCursor);
                   1206:       XQueryWindow (XXwindow, &WinInfo);
                   1207:       *x = WinInfo.x;
                   1208:       *y = WinInfo.y;
                   1209:       XFreePixmap (temp_brdr);
                   1210:       XFreePixmap (temp_back);
                   1211:       RESIGNAL_INPUT ();
                   1212:       if (WindowMapped)
                   1213:        {
                   1214:          XMapWindow (XXwindow);
                   1215:          XSelectInput (XXwindow, KeyPressed | ExposeWindow | ButtonPressed
                   1216: #ifndef HPUX
                   1217:                        | ButtonReleased
                   1218: #endif
                   1219:                        | ExposeRegion | ExposeCopy);
                   1220:          ++screen_garbaged;
                   1221:          XFlush ();
                   1222:        }
                   1223:       return Qt;
                   1224:     }
                   1225:   else
                   1226:     {
                   1227:       RESIGNAL_INPUT ();
                   1228:       message ("Could not recreate window.");
                   1229:       return Qnil;
                   1230:     }
                   1231: }
                   1232: 
                   1233: DEFUN ("x-rebind-key", Fx_rebind_key, Sx_rebind_key, 3, 3, 0,
                   1234:   "Rebind KEYCODE, with shift bits SHIFT-MASK, to new string NEWSTRING.\n\
                   1235: KEYCODE and SHIFT-MASK should be numbers representing the X keyboard code\n\
                   1236: and shift mask respectively.  NEWSTRING is an arbitrary string of keystrokes.\n\
                   1237: If SHIFT-MASK is nil, then KEYCODE's key will be bound to NEWSTRING for\n\
                   1238: all shift combinations.\n\
                   1239: Shift Lock  1     Shift    2\n\
                   1240: Meta       4      Control  8\n\
                   1241: \n\
                   1242: For values of KEYCODE, see /usr/lib/Xkeymap.txt (remember that the codes\n\
                   1243: in that file are in octal!)\n\
                   1244: \n\
                   1245: NOTE: due to an X bug, this function will not take effect unless one has\n\
                   1246: a ~/.Xkeymap file.  (See the documentation for the \"keycomp\" program.)\n\
                   1247: This problem will be fixed in X version 11.")
                   1248: 
                   1249:   (keycode, shift_mask, newstring)
                   1250:      register Lisp_Object keycode;
                   1251:      register Lisp_Object shift_mask;
                   1252:      register Lisp_Object newstring;
                   1253: {
                   1254:   char *rawstring;
                   1255:   int rawkey, rawshift;
                   1256:   int i;
                   1257:   int strsize;
                   1258: 
                   1259:   CHECK_NUMBER (keycode, 1);
                   1260:   if (!NULL (shift_mask))
                   1261:     CHECK_NUMBER (shift_mask, 2);
                   1262:   CHECK_STRING (newstring, 3);
                   1263:   strsize = XSTRING (newstring) ->size;
                   1264:   rawstring = (char *) xmalloc (strsize);
                   1265:   bcopy (XSTRING (newstring)->data, rawstring, strsize);
                   1266:   rawkey = ((unsigned) (XINT (keycode))) & 255;
                   1267:   if (NULL (shift_mask))
                   1268:     for (i = 0; i <= 15; i++)
                   1269:       XRebindCode (rawkey, i<<11, rawstring, strsize);
                   1270:   else
                   1271:     {
                   1272:       rawshift = (((unsigned) (XINT (shift_mask))) & 15) << 11;
                   1273:       XRebindCode (rawkey, rawshift, rawstring, strsize);
                   1274:     }
                   1275:   return Qnil;
                   1276: }
                   1277:   
                   1278: DEFUN ("x-rebind-keys", Fx_rebind_keys, Sx_rebind_keys, 2, 2, 0,
                   1279:   "Rebind KEYCODE to list of strings STRINGS.\n\
                   1280: STRINGS should be a list of 16 elements, one for each all shift combination.\n\
                   1281: nil as element means don't change.\n\
                   1282: See the documentation of x-rebind-key for more information.")
                   1283:   (keycode, strings)
                   1284:      register Lisp_Object keycode;
                   1285:      register Lisp_Object strings;
                   1286: {
                   1287:   register Lisp_Object item;
                   1288:   register char *rawstring;
                   1289:   int rawkey, strsize;
                   1290:   register unsigned i;
                   1291: 
                   1292:   CHECK_NUMBER (keycode, 1);
                   1293:   CHECK_CONS (strings, 2);
                   1294:   rawkey = ((unsigned) (XINT (keycode))) & 255;
                   1295:   for (i = 0; i <= 15; strings = Fcdr (strings), i++)
                   1296:     {
                   1297:       item = Fcar (strings);
                   1298:       if (!NULL (item))
                   1299:        {
                   1300:          CHECK_STRING (item, 2);
                   1301:          strsize = XSTRING (item)->size;
                   1302:          rawstring = (char *) xmalloc (strsize);
                   1303:          bcopy (XSTRING (item)->data, rawstring, strsize);
                   1304:          XRebindCode (rawkey, i << 11, rawstring, strsize);
                   1305:        }
                   1306:     }
                   1307:   return Qnil;
                   1308: }
                   1309: 
                   1310: XExitWithCoreDump (Disp, Event)
                   1311:      Display *Disp;
                   1312:      XErrorEvent *Event;
                   1313: {
                   1314:   XCleanUp ();
                   1315:   abort ();
                   1316: }
                   1317: 
                   1318: DEFUN ("x-debug", Fx_debug, Sx_debug, 1, 1, 0,
                   1319:   "ARG non-nil means that X errors should generate a coredump.")
                   1320:   (arg)
                   1321:      register Lisp_Object arg;
                   1322: {
                   1323:   if (!NULL (arg))
                   1324:     handler = XExitWithCoreDump;
                   1325:   else
                   1326:     {
                   1327:       extern int XExitGracefully ();
                   1328:       handler = XExitGracefully;
                   1329:     }
                   1330:   XErrorHandler (handler);
                   1331:   XIOErrorHandler (handler);
                   1332:   return (Qnil);
                   1333: }
                   1334: 
                   1335: XRedrawDisplay ()
                   1336: {
                   1337:   Fredraw_display ();
                   1338: }
                   1339: 
                   1340: XCleanUp ()
                   1341: {
                   1342:   Fdo_auto_save (Qt);
                   1343: #ifdef subprocesses
                   1344:   kill_buffer_processes (Qnil);
                   1345: #endif /* subprocesses */
                   1346: }
                   1347: 
                   1348: 
                   1349: syms_of_xfns ()
                   1350: {
                   1351:   x_edges_specified = 0;
                   1352: 
                   1353:   DEFVAR_LISP ("x-mouse-item", &Vx_mouse_item,
                   1354:      "Encoded representation of last mouse click, corresponding to\n\
                   1355: numerical entries in x-mouse-map.");
                   1356:   Vx_mouse_item = Qnil;
                   1357:   DEFVAR_LISP ("x-mouse-pos", &Vx_mouse_pos,
                   1358:      "Current x-y position of mouse by row, column as specified by font.");
                   1359:   Vx_mouse_pos = Qnil;
                   1360:   DEFVAR_LISP ("x-mouse-abs-pos", &Vx_mouse_abs_pos,
                   1361:      "Current x-y position of mouse by row, column in pixels, wrt root window.");
                   1362:   Vx_mouse_abs_pos = Qnil;
                   1363: 
                   1364:   defsubr (&Sx_pop_up_window);
                   1365:   defsubr (&Sx_set_bell);
                   1366:   defsubr (&Sx_flip_color);
                   1367:   defsubr (&Sx_set_icon);
                   1368:   defsubr (&Sx_set_font);
                   1369:   defsubr (&Sx_set_window_edges);
                   1370:   defsubr (&Scoordinates_in_window_p);
                   1371:   defsubr (&Sx_mouse_events);
                   1372:   defsubr (&Sx_proc_mouse_event);
                   1373:   defsubr (&Sx_get_mouse_event);
                   1374:   defsubr (&Sx_set_keyboard_enable);
                   1375:   defsubr (&Sx_set_mouse_inform_flag);
                   1376:   defsubr (&Sx_store_cut_buffer);
                   1377:   defsubr (&Sx_get_cut_buffer);
                   1378:   defsubr (&Sx_rubber_band);
                   1379:   defsubr (&Sx_create_x_window);
                   1380:   defsubr (&Sx_set_border_width);
                   1381:   defsubr (&Sx_set_internal_border_width);
                   1382:   defsubr (&Sx_change_display);
                   1383:   defsubr (&Sx_set_foreground_color);
                   1384:   defsubr (&Sx_set_background_color);
                   1385:   defsubr (&Sx_set_border_color);
                   1386:   defsubr (&Sx_set_cursor_color);
                   1387:   defsubr (&Sx_set_mouse_color);
                   1388:   defsubr (&Sx_get_foreground_color);
                   1389:   defsubr (&Sx_get_background_color);
                   1390:   defsubr (&Sx_get_border_color);
                   1391:   defsubr (&Sx_get_cursor_color);
                   1392:   defsubr (&Sx_get_mouse_color);
                   1393:   defsubr (&Sx_color_p);
                   1394:   defsubr (&Sx_get_default);
                   1395:   defsubr (&Sx_rebind_key);
                   1396:   defsubr (&Sx_rebind_keys);
                   1397:   defsubr (&Sx_debug);
                   1398: }
                   1399: 
                   1400: #endif /* HAVE_X_WINDOWS */
                   1401: 

unix.superglobalmegacorp.com

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