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