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

unix.superglobalmegacorp.com

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