|
|
1.1 ! root 1: /* Functions for the X window system. ! 2: Copyright (C) 1988, 1990, 1992 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: /* Converted to X11 by Robert French */ ! 23: ! 24: #include <stdio.h> ! 25: #include <signal.h> ! 26: #include "config.h" ! 27: ! 28: /* Get FIONREAD, if it is available. */ ! 29: #ifdef USG ! 30: #include <termio.h> ! 31: #endif /* USG */ ! 32: #include <fcntl.h> ! 33: ! 34: #ifndef VMS ! 35: #include <sys/ioctl.h> ! 36: #endif /* not VMS */ ! 37: ! 38: /* Allow m- file to inhibit use of interrupt-driven input. */ ! 39: #ifdef BROKEN_FIONREAD ! 40: #undef FIONREAD ! 41: #endif ! 42: ! 43: /* We are unable to use interrupts if FIONREAD is not available, ! 44: so flush SIGIO so we won't try. */ ! 45: #ifndef FIONREAD ! 46: #ifdef SIGIO ! 47: #undef SIGIO ! 48: #endif ! 49: #endif ! 50: ! 51: #include "x11term.h" ! 52: #include "dispextern.h" ! 53: #include "termchar.h" ! 54: ! 55: #ifdef HAVE_SOCKETS ! 56: #include <sys/socket.h> /* Must be done before gettime.h. */ ! 57: #endif ! 58: /* Include time.h or sys/time.h or both. */ ! 59: #include "gettime.h" ! 60: #include <setjmp.h> ! 61: ! 62: /* Prepare for lisp.h definition of NULL. ! 63: Sometimes x11term.h includes stddef.h. */ ! 64: #ifdef NULL ! 65: #undef NULL ! 66: #endif ! 67: ! 68: #include "lisp.h" ! 69: #include "window.h" ! 70: ! 71: #ifdef HAVE_X_WINDOWS ! 72: ! 73: #define abs(x) ((x < 0) ? ((x)) : (x)) ! 74: #define sgn(x) ((x < 0) ? (-1) : (1)) ! 75: #define min(a,b) ((a) < (b) ? (a) : (b)) ! 76: #define max(a,b) ((a) > (b) ? (a) : (b)) ! 77: ! 78: /* Non-nil if Emacs is running with an X window for display. ! 79: Nil if Emacs is run on an ordinary terminal. */ ! 80: ! 81: Lisp_Object Vxterm; ! 82: ! 83: Lisp_Object Vx_mouse_pos; ! 84: Lisp_Object Vx_mouse_abs_pos; ! 85: ! 86: Lisp_Object Vx_mouse_item; ! 87: ! 88: /* These are standard "white" and "black" strings, used in the ! 89: *_color variables when the color was not specially allocated for them. */ ! 90: char *white_color = "white"; ! 91: char *black_color = "black"; ! 92: ! 93: extern Lisp_Object MouseMap; ! 94: ! 95: extern Lisp_Object minibuf_window; ! 96: extern int minibuf_prompt_width; ! 97: ! 98: extern XEvent *XXm_queue[XMOUSEBUFSIZE]; ! 99: extern int XXm_queue_num; ! 100: extern int XXm_queue_in; ! 101: extern int XXm_queue_out; ! 102: extern char *fore_color; ! 103: extern char *back_color; ! 104: extern char *brdr_color; ! 105: extern char *mous_color; ! 106: extern char *curs_color; ! 107: ! 108: extern unsigned long fore; ! 109: extern unsigned long back; ! 110: extern unsigned long brdr; ! 111: extern unsigned long curs; ! 112: ! 113: extern int XXborder; ! 114: extern int XXInternalBorder; ! 115: ! 116: extern char *progname; ! 117: ! 118: extern XFontStruct *fontinfo; ! 119: extern Font XXfid; ! 120: extern GC XXgc_norm,XXgc_rev,XXgc_curs,XXgc_temp,XXgc_curs_rev; ! 121: extern XGCValues XXgcv; ! 122: extern int XXfontw,XXfonth,XXbase,XXisColor; ! 123: extern Colormap XXColorMap; ! 124: ! 125: extern int PendingExposure; ! 126: extern char *default_window; ! 127: extern char *desiredwindow; ! 128: ! 129: extern int XXscreen; ! 130: extern Window XXwindow; ! 131: extern Cursor EmacsCursor; ! 132: extern short MouseCursor[], MouseMask[]; ! 133: extern char *XXcurrentfont; ! 134: extern int informflag; ! 135: ! 136: extern int WindowMapped; ! 137: extern int CurHL; ! 138: extern int pixelwidth, pixelheight; ! 139: extern int XXpid; ! 140: ! 141: extern char *XXidentity; ! 142: ! 143: extern Display *XXdisplay; ! 144: extern int bitblt, CursorExists, VisibleX, VisibleY; ! 145: ! 146: check_xterm () ! 147: { ! 148: if (NULL (Vxterm)) ! 149: error ("Terminal does not understand X protocol."); ! 150: } ! 151: ! 152: DEFUN ("x-set-bell", Fx_set_bell, Sx_set_bell, 1, 1, "P", ! 153: "For X window system, set audible vs visible bell.\n\ ! 154: With non-nil argument (prefix arg), use visible bell; otherwise, audible bell.") ! 155: (arg) ! 156: Lisp_Object arg; ! 157: { ! 158: BLOCK_INPUT_DECLARE (); ! 159: ! 160: check_xterm (); ! 161: BLOCK_INPUT (); ! 162: if (!NULL (arg)) ! 163: XSetFlash (); ! 164: else ! 165: XSetFeep (); ! 166: UNBLOCK_INPUT (); ! 167: return arg; ! 168: } ! 169: ! 170: DEFUN ("x-flip-color", Fx_flip_color, Sx_flip_color, 0, 0, "", ! 171: "Toggle the background and foreground colors") ! 172: () ! 173: { ! 174: check_xterm (); ! 175: XFlipColor (); ! 176: return Qt; ! 177: } ! 178: ! 179: DEFUN ("x-set-foreground-color", Fx_set_foreground_color, ! 180: Sx_set_foreground_color, 1, 1, "sSet foreground color: ", ! 181: "Set foreground (text) color to COLOR.") ! 182: (arg) ! 183: Lisp_Object arg; ! 184: { ! 185: XColor cdef; ! 186: BLOCK_INPUT_DECLARE (); ! 187: char *save_color; ! 188: unsigned long save; ! 189: ! 190: save_color = fore_color; ! 191: save = fore; ! 192: check_xterm (); ! 193: CHECK_STRING (arg,1); ! 194: fore_color = (char *) xmalloc (XSTRING (arg)->size + 1); ! 195: bcopy (XSTRING (arg)->data, fore_color, XSTRING (arg)->size + 1); ! 196: ! 197: BLOCK_INPUT (); ! 198: ! 199: if (fore_color && XXisColor && ! 200: XParseColor (XXdisplay, XXColorMap, fore_color, &cdef) && ! 201: XAllocColor(XXdisplay, XXColorMap, &cdef)) ! 202: fore = cdef.pixel; ! 203: else if (fore_color && !strcmp (fore_color, "white")) ! 204: fore = WhitePixel (XXdisplay, XXscreen), fore_color = white_color; ! 205: else if (fore_color && !strcmp (fore_color, "black")) ! 206: fore = BlackPixel (XXdisplay, XXscreen), fore_color = black_color; ! 207: else ! 208: fore_color = save_color; ! 209: ! 210: /* Now free the old background color ! 211: if it was specially allocated and we are not still using it. */ ! 212: if (save_color != white_color && save_color != black_color ! 213: && save_color != fore_color) ! 214: { ! 215: XFreeColors (XXdisplay, XXColorMap, &save, 1, 0); ! 216: free (save_color); ! 217: } ! 218: ! 219: XSetForeground(XXdisplay, XXgc_norm, fore); ! 220: XSetBackground(XXdisplay, XXgc_rev, fore); ! 221: ! 222: Fredraw_display (); ! 223: UNBLOCK_INPUT (); ! 224: ! 225: XFlush (XXdisplay); ! 226: return Qt; ! 227: } ! 228: ! 229: DEFUN ("x-set-background-color", Fx_set_background_color, ! 230: Sx_set_background_color, 1, 1, "sSet background color: ", ! 231: "Set background color to COLOR.") ! 232: (arg) ! 233: Lisp_Object arg; ! 234: { ! 235: XColor cdef; ! 236: BLOCK_INPUT_DECLARE (); ! 237: char *save_color; ! 238: unsigned long save; ! 239: ! 240: check_xterm (); ! 241: CHECK_STRING (arg,1); ! 242: save_color = back_color; ! 243: save = back; ! 244: back_color = (char *) xmalloc (XSTRING (arg)->size + 1); ! 245: bcopy (XSTRING (arg)->data, back_color, XSTRING (arg)->size + 1); ! 246: ! 247: BLOCK_INPUT (); ! 248: ! 249: if (back_color && XXisColor && ! 250: XParseColor (XXdisplay, XXColorMap, back_color, &cdef) && ! 251: XAllocColor(XXdisplay, XXColorMap, &cdef)) ! 252: back = cdef.pixel; ! 253: else if (back_color && !strcmp (back_color, "white")) ! 254: back = WhitePixel (XXdisplay, XXscreen), back_color = white_color; ! 255: else if (back_color && !strcmp (back_color, "black")) ! 256: back = BlackPixel (XXdisplay, XXscreen), back_color = black_color; ! 257: else ! 258: back_color = save_color; ! 259: ! 260: /* Now free the old background color ! 261: if it was specially allocated and we are not still using it. */ ! 262: if (save_color != white_color && save_color != black_color ! 263: && save_color != back_color) ! 264: { ! 265: XFreeColors (XXdisplay, XXColorMap, &save, 1, 0); ! 266: free (save_color); ! 267: } ! 268: ! 269: XSetBackground (XXdisplay, XXgc_norm, back); ! 270: XSetForeground (XXdisplay, XXgc_rev, back); ! 271: XSetForeground (XXdisplay, XXgc_curs, back); ! 272: XSetBackground (XXdisplay, XXgc_curs_rev, back); ! 273: XSetWindowBackground(XXdisplay, XXwindow, back); ! 274: XClearArea (XXdisplay, XXwindow, 0, 0, ! 275: screen_width*XXfontw+2*XXInternalBorder, ! 276: screen_height*XXfonth+2*XXInternalBorder, 0); ! 277: ! 278: UNBLOCK_INPUT (); ! 279: Fredraw_display (); ! 280: ! 281: XFlush (XXdisplay); ! 282: return Qt; ! 283: } ! 284: ! 285: DEFUN ("x-set-border-color", Fx_set_border_color, Sx_set_border_color, 1, 1, ! 286: "sSet border color: ", ! 287: "Set border color to COLOR.") ! 288: (arg) ! 289: Lisp_Object arg; ! 290: { ! 291: XColor cdef; ! 292: BLOCK_INPUT_DECLARE (); ! 293: unsigned long save; ! 294: char *save_color; ! 295: ! 296: check_xterm (); ! 297: CHECK_STRING (arg,1); ! 298: brdr_color= (char *) xmalloc (XSTRING (arg)->size + 1); ! 299: save = brdr; ! 300: save_color = brdr_color; ! 301: bcopy (XSTRING (arg)->data, brdr_color, XSTRING (arg)->size + 1); ! 302: ! 303: BLOCK_INPUT (); ! 304: ! 305: if (brdr_color && XXisColor && ! 306: XParseColor (XXdisplay, XXColorMap, brdr_color, &cdef) && ! 307: XAllocColor(XXdisplay, XXColorMap, &cdef)) ! 308: brdr = cdef.pixel; ! 309: else ! 310: { ! 311: if (brdr_color && !strcmp (brdr_color, "black")) ! 312: { ! 313: brdr = BlackPixel (XXdisplay, XXscreen); ! 314: brdr_color = black_color; ! 315: } ! 316: else ! 317: if (brdr_color && !strcmp (brdr_color, "white")) ! 318: { ! 319: brdr = WhitePixel (XXdisplay, XXscreen); ! 320: brdr_color = white_color; ! 321: } ! 322: else { ! 323: brdr_color = black_color; ! 324: brdr = BlackPixel (XXdisplay, XXscreen); ! 325: } ! 326: } ! 327: ! 328: /* Now free the old background color ! 329: if it was specially allocated and we are not still using it. */ ! 330: if (save_color != white_color && save_color != black_color ! 331: && save_color != brdr_color) ! 332: { ! 333: XFreeColors (XXdisplay, XXColorMap, &save, 1, 0); ! 334: free (save_color); ! 335: } ! 336: ! 337: if (XXborder) { ! 338: XSetWindowBorder(XXdisplay, XXwindow, brdr); ! 339: XFlush (XXdisplay); ! 340: } ! 341: ! 342: UNBLOCK_INPUT (); ! 343: ! 344: return Qt; ! 345: } ! 346: ! 347: DEFUN ("x-set-cursor-color", Fx_set_cursor_color, Sx_set_cursor_color, 1, 1, ! 348: "sSet text cursor color: ", ! 349: "Set text cursor color to COLOR.") ! 350: (arg) ! 351: Lisp_Object arg; ! 352: { ! 353: XColor cdef; ! 354: BLOCK_INPUT_DECLARE (); ! 355: char *save_color; ! 356: unsigned long save; ! 357: ! 358: check_xterm (); ! 359: CHECK_STRING (arg,1); ! 360: save_color = curs_color; ! 361: save = curs; ! 362: curs_color = (char *) xmalloc (XSTRING (arg)->size + 1); ! 363: bcopy (XSTRING (arg)->data, curs_color, XSTRING (arg)->size + 1); ! 364: ! 365: BLOCK_INPUT (); ! 366: ! 367: if (curs_color && XXisColor && ! 368: XParseColor (XXdisplay, XXColorMap, curs_color, &cdef) && ! 369: XAllocColor(XXdisplay, XXColorMap, &cdef)) ! 370: curs = cdef.pixel; ! 371: else if (curs_color && !strcmp (curs_color, "white")) ! 372: curs = WhitePixel (XXdisplay, XXscreen), curs_color = white_color; ! 373: else if (curs_color && !strcmp (curs_color, "black")) ! 374: curs = BlackPixel (XXdisplay, XXscreen), curs_color = black_color; ! 375: else ! 376: curs_color = save_color; ! 377: ! 378: /* Now free the old background color ! 379: if it was specially allocated and we are not still using it. */ ! 380: if (save_color != white_color && save_color != black_color ! 381: && save_color != curs_color) ! 382: { ! 383: XFreeColors (XXdisplay, XXColorMap, &save, 1, 0); ! 384: free (save_color); ! 385: } ! 386: ! 387: XSetBackground(XXdisplay, XXgc_curs, curs); ! 388: XSetForeground(XXdisplay, XXgc_curs_rev, curs); ! 389: ! 390: CursorToggle (); ! 391: CursorToggle (); ! 392: ! 393: UNBLOCK_INPUT (); ! 394: return Qt; ! 395: } ! 396: ! 397: DEFUN ("x-set-mouse-color", Fx_set_mouse_color, Sx_set_mouse_color, 1, 1, ! 398: "sSet mouse cursor color: ", ! 399: "Set mouse cursor color to COLOR.") ! 400: (arg) ! 401: Lisp_Object arg; ! 402: { ! 403: BLOCK_INPUT_DECLARE (); ! 404: char *save_color; ! 405: ! 406: check_xterm (); ! 407: CHECK_STRING (arg,1); ! 408: save_color = mous_color; ! 409: mous_color = (char *) xmalloc (XSTRING (arg)->size + 1); ! 410: bcopy (XSTRING (arg)->data, mous_color, XSTRING (arg)->size + 1); ! 411: ! 412: BLOCK_INPUT (); ! 413: ! 414: if (! x_set_cursor_colors ()) ! 415: mous_color = save_color; ! 416: else if (save_color != white_color && save_color != black_color ! 417: && save_color != mous_color) ! 418: free (save_color); ! 419: ! 420: XFlush (XXdisplay); ! 421: ! 422: UNBLOCK_INPUT (); ! 423: return Qt; ! 424: } ! 425: ! 426: /* Set the actual X cursor colors from `mous_color' and `back_color'. */ ! 427: ! 428: int ! 429: x_set_cursor_colors () ! 430: { ! 431: XColor forec, backc; ! 432: ! 433: char *useback; ! 434: ! 435: /* USEBACK is the background color, but on monochrome screens ! 436: changed if necessary not to match the mouse. */ ! 437: ! 438: useback = back_color; ! 439: ! 440: if (!XXisColor && !strcmp (mous_color, back_color)) ! 441: { ! 442: if (strcmp (back_color, "white")) ! 443: useback = white_color; ! 444: else ! 445: useback = black_color; ! 446: } ! 447: ! 448: if (XXisColor && mous_color ! 449: && XParseColor (XXdisplay, XXColorMap, mous_color, &forec) ! 450: && XParseColor (XXdisplay, XXColorMap, useback, &backc)) ! 451: { ! 452: XRecolorCursor (XXdisplay, EmacsCursor, &forec, &backc); ! 453: return 1; ! 454: } ! 455: else return 0; ! 456: } ! 457: ! 458: DEFUN ("x-color-p", Fx_color_p, Sx_color_p, 0, 0, 0, ! 459: "Returns t if the display is a color X terminal.") ! 460: () ! 461: { ! 462: check_xterm (); ! 463: ! 464: if (XXisColor) ! 465: return Qt; ! 466: else ! 467: return Qnil; ! 468: } ! 469: ! 470: DEFUN ("x-get-foreground-color", Fx_get_foreground_color, ! 471: Sx_get_foreground_color, 0, 0, 0, ! 472: "Returns the color of the foreground, as a string.") ! 473: () ! 474: { ! 475: Lisp_Object string; ! 476: ! 477: check_xterm (); ! 478: string = build_string (fore_color); ! 479: return string; ! 480: } ! 481: ! 482: DEFUN ("x-get-background-color", Fx_get_background_color, ! 483: Sx_get_background_color, 0, 0, 0, ! 484: "Returns the color of the background, as a string.") ! 485: () ! 486: { ! 487: Lisp_Object string; ! 488: ! 489: check_xterm (); ! 490: string = build_string (back_color); ! 491: return string; ! 492: } ! 493: ! 494: DEFUN ("x-get-border-color", Fx_get_border_color, ! 495: Sx_get_border_color, 0, 0, 0, ! 496: "Returns the color of the border, as a string.") ! 497: () ! 498: { ! 499: Lisp_Object string; ! 500: ! 501: check_xterm (); ! 502: string = build_string (brdr_color); ! 503: return string; ! 504: } ! 505: ! 506: DEFUN ("x-get-cursor-color", Fx_get_cursor_color, ! 507: Sx_get_cursor_color, 0, 0, 0, ! 508: "Returns the color of the cursor, as a string.") ! 509: () ! 510: { ! 511: Lisp_Object string; ! 512: ! 513: check_xterm (); ! 514: string = build_string (curs_color); ! 515: return string; ! 516: } ! 517: ! 518: DEFUN ("x-get-mouse-color", Fx_get_mouse_color, ! 519: Sx_get_mouse_color, 0, 0, 0, ! 520: "Returns the color of the mouse cursor, as a string.") ! 521: () ! 522: { ! 523: Lisp_Object string; ! 524: ! 525: check_xterm (); ! 526: string = build_string (mous_color); ! 527: return string; ! 528: } ! 529: ! 530: DEFUN ("x-get-default", Fx_get_default, Sx_get_default, 1, 1, 0, ! 531: "Get default for X-window attribute ATTRIBUTE from the system.\n\ ! 532: ATTRIBUTE must be a string.\n\ ! 533: Returns nil if attribute default isn't specified.") ! 534: (arg) ! 535: Lisp_Object arg; ! 536: { ! 537: char *default_name, *value; ! 538: ! 539: check_xterm (); ! 540: CHECK_STRING (arg, 1); ! 541: default_name = (char *) XSTRING (arg)->data; ! 542: ! 543: #ifdef XBACKWARDS ! 544: /* Some versions of X11R4, at least, have the args backwards. */ ! 545: if (XXidentity && *XXidentity) ! 546: value = XGetDefault (XXdisplay, default_name, XXidentity); ! 547: else ! 548: value = XGetDefault (XXdisplay, default_name, CLASS); ! 549: #else ! 550: if (XXidentity && *XXidentity) ! 551: value = XGetDefault (XXdisplay, XXidentity, default_name); ! 552: else ! 553: value = XGetDefault (XXdisplay, CLASS, default_name); ! 554: #endif ! 555: ! 556: if (value) ! 557: return build_string (value); ! 558: return (Qnil); ! 559: } ! 560: ! 561: DEFUN ("x-set-font", Fx_set_font, Sx_set_font, 1, 1, "sFont Name: ", ! 562: "Sets the font to be used for the X window.") ! 563: (arg) ! 564: Lisp_Object arg; ! 565: { ! 566: register char *newfontname; ! 567: ! 568: CHECK_STRING (arg, 1); ! 569: check_xterm (); ! 570: ! 571: newfontname = (char *) xmalloc (XSTRING (arg)->size + 1); ! 572: bcopy (XSTRING (arg)->data, newfontname, XSTRING (arg)->size + 1); ! 573: if (XSTRING (arg)->size == 0) ! 574: goto badfont; ! 575: ! 576: if (!XNewFont (newfontname)) { ! 577: free (XXcurrentfont); ! 578: XXcurrentfont = newfontname; ! 579: return Qt; ! 580: } ! 581: badfont: ! 582: error ("Font \"%s\" is not defined", newfontname); ! 583: free (newfontname); ! 584: ! 585: return Qnil; ! 586: } ! 587: ! 588: DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p, ! 589: Scoordinates_in_window_p, 2, 2, 0, ! 590: "Return non-nil if POSITIONS (a list, (SCREEN-X SCREEN-Y)) is in WINDOW.\n\ ! 591: Returned value is list of positions expressed\n\ ! 592: relative to window upper left corner.") ! 593: (coordinate, window) ! 594: register Lisp_Object coordinate, window; ! 595: { ! 596: register Lisp_Object xcoord, ycoord; ! 597: int height; ! 598: ! 599: if (!CONSP (coordinate)) ! 600: wrong_type_argument (Qlistp, coordinate); ! 601: ! 602: CHECK_WINDOW (window, 2); ! 603: xcoord = Fcar (coordinate); ! 604: ycoord = Fcar (Fcdr (coordinate)); ! 605: CHECK_NUMBER (xcoord, 0); ! 606: CHECK_NUMBER (ycoord, 1); ! 607: if ((XINT (xcoord) < XINT (XWINDOW (window)->left)) || ! 608: (XINT (xcoord) >= (XINT (XWINDOW (window)->left) + ! 609: XINT (XWINDOW (window)->width)))) ! 610: return Qnil; ! 611: ! 612: XFASTINT (xcoord) -= XFASTINT (XWINDOW (window)->left); ! 613: ! 614: height = XINT (XWINDOW (window)->height); ! 615: ! 616: if (window != minibuf_window) ! 617: height --; ! 618: ! 619: if ((XINT (ycoord) < XINT (XWINDOW (window)->top)) || ! 620: (XINT (ycoord) >= XINT (XWINDOW (window)->top) + height)) ! 621: return Qnil; ! 622: ! 623: XFASTINT (ycoord) -= XFASTINT (XWINDOW (window)->top); ! 624: return Fcons (xcoord, Fcons (ycoord, Qnil)); ! 625: } ! 626: ! 627: DEFUN ("x-mouse-events", Fx_mouse_events, Sx_mouse_events, 0, 0, 0, ! 628: "Return number of pending mouse events from X window system.") ! 629: () ! 630: { ! 631: register Lisp_Object tem; ! 632: ! 633: check_xterm (); ! 634: ! 635: XSET (tem, Lisp_Int, XXm_queue_num); ! 636: ! 637: return tem; ! 638: } ! 639: ! 640: DEFUN ("x-proc-mouse-event", Fx_proc_mouse_event, Sx_proc_mouse_event, ! 641: 0, 0, 0, ! 642: "Pulls a mouse event out of the mouse event buffer and dispatches\n\ ! 643: the appropriate function to act upon this event.") ! 644: () ! 645: { ! 646: XEvent event; ! 647: register Lisp_Object mouse_cmd; ! 648: register char com_letter; ! 649: register char key_mask; ! 650: register Lisp_Object tempx; ! 651: register Lisp_Object tempy; ! 652: extern Lisp_Object get_keyelt (); ! 653: extern int meta_prefix_char; ! 654: ! 655: check_xterm (); ! 656: ! 657: if (XXm_queue_num) { ! 658: event = *XXm_queue[XXm_queue_out]; ! 659: free (XXm_queue[XXm_queue_out]); ! 660: XXm_queue_out = (XXm_queue_out + 1) % XMOUSEBUFSIZE; ! 661: XXm_queue_num--; ! 662: com_letter = 3-(event.xbutton.button & 3); ! 663: key_mask = (event.xbutton.state & 15) << 4; ! 664: /* Get rid of the shift-lock bit. */ ! 665: key_mask &= ~0x20; ! 666: /* Report meta in 2 bit, not in 8 bit. */ ! 667: if (key_mask & 0x80) ! 668: { ! 669: key_mask |= 0x20; ! 670: key_mask &= ~0x80; ! 671: } ! 672: com_letter |= key_mask; ! 673: if (event.type == ButtonRelease) ! 674: com_letter |= 0x04; ! 675: XSET (tempx, Lisp_Int, ! 676: min (screen_width-1, ! 677: max (0, (event.xbutton.x-XXInternalBorder)/ ! 678: XXfontw))); ! 679: XSET (tempy, Lisp_Int, ! 680: min (screen_height-1, ! 681: max (0, (event.xbutton.y-XXInternalBorder)/ ! 682: XXfonth))); ! 683: Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil)); ! 684: XSET (tempx, Lisp_Int, event.xbutton.x_root); ! 685: XSET (tempy, Lisp_Int, event.xbutton.y_root); ! 686: Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil)); ! 687: Vx_mouse_item = make_number (com_letter); ! 688: mouse_cmd ! 689: = get_keyelt (access_keymap (MouseMap, com_letter)); ! 690: if (NULL (mouse_cmd)) { ! 691: if (event.type != ButtonRelease) ! 692: bell (); ! 693: Vx_mouse_pos = Qnil; ! 694: } ! 695: else ! 696: return call1 (mouse_cmd, Vx_mouse_pos); ! 697: } ! 698: return Qnil; ! 699: } ! 700: ! 701: DEFUN ("x-get-mouse-event", Fx_get_mouse_event, Sx_get_mouse_event, ! 702: 1, 1, 0, ! 703: "Get next mouse event out of mouse event buffer (com-letter (x y)).\n\ ! 704: ARG non-nil means return nil immediately if no pending event;\n\ ! 705: otherwise, wait for an event.") ! 706: (arg) ! 707: Lisp_Object arg; ! 708: { ! 709: XEvent event; ! 710: register char com_letter; ! 711: register char key_mask; ! 712: ! 713: register Lisp_Object tempx; ! 714: register Lisp_Object tempy; ! 715: ! 716: check_xterm (); ! 717: ! 718: if (NULL (arg)) ! 719: while (!XXm_queue_num) ! 720: { ! 721: consume_available_input (); ! 722: Fsleep_for (make_number (1)); ! 723: } ! 724: /*** ??? Surely you don't mean to busy wait??? */ ! 725: ! 726: if (XXm_queue_num) { ! 727: event = *XXm_queue[XXm_queue_out]; ! 728: free (XXm_queue[XXm_queue_out]); ! 729: XXm_queue_out = (XXm_queue_out + 1) % XMOUSEBUFSIZE; ! 730: XXm_queue_num--; ! 731: com_letter = 3-(event.xbutton.button & 3); ! 732: key_mask = (event.xbutton.state & 15) << 4; ! 733: /* Report meta in 2 bit, not in 8 bit. */ ! 734: if (key_mask & 0x80) ! 735: { ! 736: key_mask |= 0x20; ! 737: key_mask &= ~0x80; ! 738: } ! 739: com_letter |= key_mask; ! 740: if (event.type == ButtonRelease) ! 741: com_letter |= 0x04; ! 742: XSET (tempx, Lisp_Int, ! 743: min (screen_width-1, ! 744: max (0, (event.xbutton.x-XXInternalBorder)/ ! 745: XXfontw))); ! 746: XSET (tempy, Lisp_Int, ! 747: min (screen_height-1, ! 748: max (0, (event.xbutton.y-XXInternalBorder)/ ! 749: XXfonth))); ! 750: Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil)); ! 751: XSET (tempx, Lisp_Int, event.xbutton.x_root); ! 752: XSET (tempy, Lisp_Int, event.xbutton.y_root); ! 753: Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil)); ! 754: Vx_mouse_item = make_number (com_letter); ! 755: return Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil)); ! 756: } ! 757: return Qnil; ! 758: } ! 759: ! 760: DEFUN ("x-store-cut-buffer", Fx_store_cut_buffer, Sx_store_cut_buffer, ! 761: 1, 1, "sSend string to X:", ! 762: "Store contents of STRING into the cut buffer of the X window system.") ! 763: (string) ! 764: register Lisp_Object string; ! 765: { ! 766: BLOCK_INPUT_DECLARE (); ! 767: ! 768: CHECK_STRING (string, 1); ! 769: check_xterm (); ! 770: ! 771: BLOCK_INPUT (); ! 772: XStoreBytes (XXdisplay, (char *) XSTRING (string)->data, ! 773: XSTRING (string)->size); ! 774: /* Clear the selection owner, so that other applications ! 775: will use the cut buffer rather than a selection. */ ! 776: XSetSelectionOwner (XXdisplay, XA_PRIMARY, None, CurrentTime); ! 777: UNBLOCK_INPUT (); ! 778: ! 779: return Qnil; ! 780: } ! 781: ! 782: DEFUN ("x-get-cut-buffer", Fx_get_cut_buffer, Sx_get_cut_buffer, 0, 0, 0, ! 783: "Return contents of cut buffer of the X window system, as a string.") ! 784: () ! 785: { ! 786: int len; ! 787: register Lisp_Object string; ! 788: BLOCK_INPUT_DECLARE (); ! 789: register char *d; ! 790: ! 791: check_xterm (); ! 792: BLOCK_INPUT (); ! 793: d = XFetchBytes (XXdisplay, &len); ! 794: string = make_string (d, len); ! 795: UNBLOCK_INPUT (); ! 796: ! 797: return string; ! 798: } ! 799: ! 800: DEFUN ("x-set-border-width", Fx_set_border_width, Sx_set_border_width, ! 801: 1, 1, "nBorder width: ", ! 802: "Set width of border to WIDTH, in the X window system.") ! 803: (borderwidth) ! 804: register Lisp_Object borderwidth; ! 805: { ! 806: BLOCK_INPUT_DECLARE (); ! 807: ! 808: CHECK_NUMBER (borderwidth, 0); ! 809: ! 810: check_xterm (); ! 811: ! 812: if (XINT (borderwidth) < 0) ! 813: XSETINT (borderwidth, 0); ! 814: ! 815: BLOCK_INPUT (); ! 816: XSetWindowBorderWidth(XXdisplay, XXwindow, XINT(borderwidth)); ! 817: XFlush(XXdisplay); ! 818: UNBLOCK_INPUT (); ! 819: ! 820: return Qt; ! 821: } ! 822: ! 823: ! 824: DEFUN ("x-set-internal-border-width", Fx_set_internal_border_width, ! 825: Sx_set_internal_border_width, 1, 1, "nInternal border width: ", ! 826: "Set width of internal border to WIDTH, in the X window system.") ! 827: (internalborderwidth) ! 828: register Lisp_Object internalborderwidth; ! 829: { ! 830: BLOCK_INPUT_DECLARE (); ! 831: ! 832: CHECK_NUMBER (internalborderwidth, 0); ! 833: ! 834: check_xterm (); ! 835: ! 836: if (XINT (internalborderwidth) < 0) ! 837: XSETINT (internalborderwidth, 0); ! 838: ! 839: BLOCK_INPUT (); ! 840: XXInternalBorder = XINT(internalborderwidth); ! 841: XSetWindowSize(screen_height,screen_width); ! 842: UNBLOCK_INPUT (); ! 843: ! 844: return Qt; ! 845: } ! 846: ! 847: #ifdef foobar ! 848: DEFUN ("x-rebind-key", Fx_rebind_key, Sx_rebind_key, 3, 3, 0, ! 849: "Rebind KEYCODE, with shift bits SHIFT-MASK, to new string NEWSTRING.\n\ ! 850: KEYCODE and SHIFT-MASK should be numbers representing the X keyboard code\n\ ! 851: and shift mask respectively. NEWSTRING is an arbitrary string of keystrokes.\n\ ! 852: If SHIFT-MASK is nil, then KEYCODE's key will be bound to NEWSTRING for\n\ ! 853: all shift combinations.\n\ ! 854: Shift Lock 1 Shift 2\n\ ! 855: Meta 4 Control 8\n\ ! 856: \n\ ! 857: For values of KEYCODE, see /usr/lib/Xkeymap.txt (remember that the codes\n\ ! 858: in that file are in octal!)\n") ! 859: ! 860: (keycode, shift_mask, newstring) ! 861: register Lisp_Object keycode; ! 862: register Lisp_Object shift_mask; ! 863: register Lisp_Object newstring; ! 864: { ! 865: #ifdef notdef ! 866: char *rawstring; ! 867: int rawkey, rawshift; ! 868: int i; ! 869: int strsize; ! 870: ! 871: CHECK_NUMBER (keycode, 1); ! 872: if (!NULL (shift_mask)) ! 873: CHECK_NUMBER (shift_mask, 2); ! 874: CHECK_STRING (newstring, 3); ! 875: strsize = XSTRING (newstring) ->size; ! 876: rawstring = (char *) xmalloc (strsize); ! 877: bcopy (XSTRING (newstring)->data, rawstring, strsize); ! 878: rawkey = ((unsigned) (XINT (keycode))) & 255; ! 879: if (NULL (shift_mask)) ! 880: for (i = 0; i <= 15; i++) ! 881: XRebindCode (rawkey, i<<11, rawstring, strsize); ! 882: else ! 883: { ! 884: rawshift = (((unsigned) (XINT (shift_mask))) & 15) << 11; ! 885: XRebindCode (rawkey, rawshift, rawstring, strsize); ! 886: } ! 887: #endif notdef ! 888: return Qnil; ! 889: } ! 890: ! 891: DEFUN ("x-rebind-keys", Fx_rebind_keys, Sx_rebind_keys, 2, 2, 0, ! 892: "Rebind KEYCODE to list of strings STRINGS.\n\ ! 893: STRINGS should be a list of 16 elements, one for each all shift combination.\n\ ! 894: nil as element means don't change.\n\ ! 895: See the documentation of x-rebind-key for more information.") ! 896: (keycode, strings) ! 897: register Lisp_Object keycode; ! 898: register Lisp_Object strings; ! 899: { ! 900: #ifdef notdef ! 901: register Lisp_Object item; ! 902: register char *rawstring; ! 903: int rawkey, strsize; ! 904: register unsigned i; ! 905: ! 906: CHECK_NUMBER (keycode, 1); ! 907: CHECK_CONS (strings, 2); ! 908: rawkey = ((unsigned) (XINT (keycode))) & 255; ! 909: for (i = 0; i <= 15; strings = Fcdr (strings), i++) ! 910: { ! 911: item = Fcar (strings); ! 912: if (!NULL (item)) ! 913: { ! 914: CHECK_STRING (item, 2); ! 915: strsize = XSTRING (item)->size; ! 916: rawstring = (char *) xmalloc (strsize); ! 917: bcopy (XSTRING (item)->data, rawstring, strsize); ! 918: XRebindCode (rawkey, i << 11, rawstring, strsize); ! 919: } ! 920: } ! 921: #endif notdef ! 922: return Qnil; ! 923: } ! 924: ! 925: #endif foobar ! 926: ! 927: XExitWithCoreDump () ! 928: { ! 929: XCleanUp (); ! 930: abort (); ! 931: } ! 932: ! 933: DEFUN ("x-debug", Fx_debug, Sx_debug, 1, 1, 0, ! 934: "ARG non-nil means that X errors should generate a coredump.") ! 935: (arg) ! 936: register Lisp_Object arg; ! 937: { ! 938: int (*handler)(); ! 939: ! 940: check_xterm (); ! 941: if (!NULL (arg)) ! 942: handler = XExitWithCoreDump; ! 943: else ! 944: { ! 945: extern int XIgnoreError (); ! 946: handler = XIgnoreError; ! 947: } ! 948: XSetErrorHandler(handler); ! 949: XSetIOErrorHandler(handler); ! 950: return (Qnil); ! 951: } ! 952: ! 953: XRedrawDisplay () ! 954: { ! 955: Fredraw_display (); ! 956: } ! 957: ! 958: XCleanUp () ! 959: { ! 960: Fdo_auto_save (Qt); ! 961: ! 962: #ifdef subprocesses ! 963: kill_buffer_processes (Qnil); ! 964: #endif /* subprocesses */ ! 965: } ! 966: ! 967: syms_of_xfns () ! 968: { ! 969: /* If not dumping, init_display ran before us, so don't override it. */ ! 970: #ifdef CANNOT_DUMP ! 971: if (noninteractive) ! 972: #endif ! 973: Vxterm = Qnil; ! 974: ! 975: DEFVAR_LISP ("x-mouse-item", &Vx_mouse_item, ! 976: "Encoded representation of last mouse click, corresponding to\n\ ! 977: numerical entries in x-mouse-map."); ! 978: Vx_mouse_item = Qnil; ! 979: DEFVAR_LISP ("x-mouse-pos", &Vx_mouse_pos, ! 980: "Current x-y position of mouse by row, column as specified by font."); ! 981: Vx_mouse_pos = Qnil; ! 982: DEFVAR_LISP ("x-mouse-abs-pos", &Vx_mouse_abs_pos, ! 983: "Current x-y position of mouse relative to root window."); ! 984: Vx_mouse_abs_pos = Qnil; ! 985: ! 986: defsubr (&Sx_set_bell); ! 987: defsubr (&Sx_flip_color); ! 988: defsubr (&Sx_set_font); ! 989: #ifdef notdef ! 990: defsubr (&Sx_set_icon); ! 991: #endif notdef ! 992: defsubr (&Scoordinates_in_window_p); ! 993: defsubr (&Sx_mouse_events); ! 994: defsubr (&Sx_proc_mouse_event); ! 995: defsubr (&Sx_get_mouse_event); ! 996: defsubr (&Sx_store_cut_buffer); ! 997: defsubr (&Sx_get_cut_buffer); ! 998: defsubr (&Sx_set_border_width); ! 999: defsubr (&Sx_set_internal_border_width); ! 1000: defsubr (&Sx_set_foreground_color); ! 1001: defsubr (&Sx_set_background_color); ! 1002: defsubr (&Sx_set_border_color); ! 1003: defsubr (&Sx_set_cursor_color); ! 1004: defsubr (&Sx_set_mouse_color); ! 1005: defsubr (&Sx_get_foreground_color); ! 1006: defsubr (&Sx_get_background_color); ! 1007: defsubr (&Sx_get_border_color); ! 1008: defsubr (&Sx_get_cursor_color); ! 1009: defsubr (&Sx_get_mouse_color); ! 1010: defsubr (&Sx_color_p); ! 1011: defsubr (&Sx_get_default); ! 1012: #ifdef notdef ! 1013: defsubr (&Sx_rebind_key); ! 1014: defsubr (&Sx_rebind_keys); ! 1015: #endif notdef ! 1016: defsubr (&Sx_debug); ! 1017: } ! 1018: ! 1019: #endif /* HAVE_X_WINDOWS */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.