|
|
1.1 ! root 1: /* Functions for the X window system. ! 2: Copyright (C) 1985 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 added by Robert Krawitz*/ ! 23: ! 24: /*#include <stdio.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 <signal.h> ! 32: #include "sink.h" ! 33: #include "sinkmask.h" ! 34: #include <sys/time.h> ! 35: #include <fcntl.h> ! 36: #include <setjmp.h> ! 37: ! 38: #define abs(x) ((x < 0) ? ((x)) : (x)) ! 39: #define sgn(x) ((x < 0) ? (-1) : (1)) ! 40: ! 41: #define CROSS_WIDTH 16 ! 42: #define CROSS_HEIGHT 16 ! 43: ! 44: static short cross_bits[] = ! 45: { ! 46: 0x0000, 0x0180, 0x0180, 0x0180, ! 47: 0x0180, 0x0180, 0x0180, 0x7ffe, ! 48: 0x7ffe, 0x0180, 0x0180, 0x0180, ! 49: 0x0180, 0x0180, 0x0180, 0x0000, ! 50: }; ! 51: ! 52: static short gray_bits[] = { ! 53: 0xaaaa, 0x5555, 0xaaaa, 0x5555, ! 54: 0xaaaa, 0x5555, 0xaaaa, 0x5555, ! 55: 0xaaaa, 0x5555, 0xaaaa, 0x5555, ! 56: 0xaaaa, 0x5555, 0xaaaa, 0x5555}; ! 57: ! 58: #define CROSS_MASK_WIDTH 16 ! 59: #define CROSS_MASK_HEIGHT 16 ! 60: static short cross_mask_bits[] = ! 61: { ! 62: 0x03c0, 0x03c0, 0x03c0, 0x03c0, ! 63: 0x03c0, 0x03c0, 0xffff, 0xffff, ! 64: 0xffff, 0xffff, 0x03c0, 0x03c0, ! 65: 0x03c0, 0x03c0, 0x03c0, 0x03c0, ! 66: }; ! 67: ! 68: extern XREPBUFFER Xxrepbuffer; ! 69: ! 70: /* Non-nil if Emacs is running with an X window for display. ! 71: Nil if Emacs is run on an ordinary terminal. */ ! 72: ! 73: Lisp_Object Vxterm; ! 74: ! 75: Lisp_Object Vx_mouse_pos; ! 76: ! 77: extern struct Lisp_Vector *MouseMap; ! 78: ! 79: extern char *fore_color; ! 80: extern char *back_color; ! 81: extern char *brdr_color; ! 82: extern char *mous_color; ! 83: extern char *curs_color; ! 84: ! 85: extern int fore; ! 86: extern int back; ! 87: extern int brdr; ! 88: extern int mous; ! 89: extern int curs; ! 90: ! 91: /* Nonzero if x-set-window-edges has been called ! 92: or x-rubber-band has been called. ! 93: If it is zero when x-pop-up-window is called, ! 94: x-rubber-band is called at that point. */ ! 95: ! 96: int x_edges_specified; ! 97: ! 98: check_xterm () ! 99: { ! 100: if (NULL (Vxterm)) ! 101: error ("Terminal does not understand X protocol."); ! 102: } ! 103: ! 104: DEFUN ("x-pop-up-window", Fx_pop_up_window, Sx_pop_up_window, 0, 0, 0, ! 105: "Make the X window appear on the screen.") ! 106: () ! 107: { ! 108: check_xterm(); ! 109: XPopUpWindow(); ! 110: return Qnil; ! 111: } ! 112: ! 113: DEFUN ("x-set-bell", Fx_set_bell, Sx_set_bell, 1, 1, "P", ! 114: "For X window system, set audible vs visible bell.\n\ ! 115: With non-nil argument (prefix arg), use visible bell; otherwise, audible bell.") ! 116: (arg) ! 117: Lisp_Object arg; ! 118: { ! 119: check_xterm (); ! 120: if (!NULL (arg)) ! 121: XSetFlash (); ! 122: else ! 123: XSetFeep (); ! 124: return arg; ! 125: } ! 126: ! 127: DEFUN ("x-flip-color", Fx_flip_color, Sx_flip_color, 0, 0, "", ! 128: "Toggle the background and foreground colors (currently only black \n\ ! 129: and white -- by default background is white -- Only effective at init") ! 130: () ! 131: { ! 132: check_xterm (); ! 133: XFlipColor (); ! 134: return Qt; ! 135: } ! 136: ! 137: DEFUN ("x-set-foreground-color", Fx_set_foreground_color, ! 138: Sx_set_foreground_color, 1, 1, "sSet foregroud color: ", ! 139: "Set foreground (text) color to COLOR.") ! 140: (arg) ! 141: Lisp_Object arg; ! 142: { ! 143: Color cdef; ! 144: extern int PendingExposure; ! 145: int (*func) (); ! 146: extern Window XXwindow; ! 147: extern FontInfo *fontinfo; ! 148: char *save_color; ! 149: save_color = fore_color; ! 150: check_xterm (); ! 151: CHECK_STRING (arg,1); ! 152: fore_color = (char *) xmalloc (XSTRING (arg)->size + 1); ! 153: func = signal (SIGIO, SIG_IGN); ! 154: bcopy (XSTRING (arg)->data, fore_color, XSTRING (arg)->size + 1); ! 155: if (fore_color && DisplayCells() > 2 && ! 156: XParseColor(fore_color, &cdef) && XGetHardwareColor(&cdef)) { ! 157: fore = cdef.pixel; ! 158: } else if (fore_color && strcmp(fore_color, "black") == 0) { ! 159: fore = BlackPixel; ! 160: } else if (fore_color && strcmp(fore_color, "white") == 0) { ! 161: fore = WhitePixel; ! 162: } ! 163: else ! 164: { ! 165: fore_color = save_color; ! 166: } ! 167: /* XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width, ! 168: screen_height * fontinfo->height, back, ClipModeClipped, ! 169: GXcopy, AllPlanes);*/ ! 170: Fredraw_display (); ! 171: /* dumprectangle(0, 0, screen_height * fontinfo->height, ! 172: screen_width * fontinfo -> width);*/ ! 173: /* PendingExposure = 1; ! 174: xfixscreen ();*/ ! 175: (void) signal (SIGIO, func); ! 176: XFlush(); ! 177: return Qt; ! 178: } ! 179: ! 180: DEFUN ("x-set-background-color", Fx_set_background_color, ! 181: Sx_set_background_color, 1, 1, "sSet background color: ", ! 182: "Set background color to COLOR.") ! 183: (arg) ! 184: Lisp_Object arg; ! 185: { ! 186: Color cdef; ! 187: extern int PendingExposure; ! 188: Pixmap temp; ! 189: int (*func) (); ! 190: char *save_color; ! 191: extern Window XXwindow; ! 192: check_xterm (); ! 193: CHECK_STRING (arg,1); ! 194: back_color = (char *) xmalloc (XSTRING (arg)->size + 1); ! 195: bcopy (XSTRING (arg)->data, back_color, XSTRING (arg)->size + 1); ! 196: func = signal (SIGIO, SIG_IGN); ! 197: if (back_color && DisplayCells() > 2 && ! 198: XParseColor(back_color, &cdef) && XGetHardwareColor(&cdef)) { ! 199: back = cdef.pixel; ! 200: } else if (back_color && strcmp(back_color, "white") == 0) { ! 201: back = WhitePixel; ! 202: } else if (back_color && strcmp(back_color, "black") == 0) { ! 203: back = BlackPixel; ! 204: } ! 205: else ! 206: { ! 207: back_color = save_color; ! 208: } ! 209: temp = XMakeTile(back); ! 210: XChangeBackground (XXwindow, temp); ! 211: /* XPixFill (XXwindow, 0, 0, screen_width * fontinfo->width, ! 212: screen_height * fontinfo->height, back, ClipModeClipped, ! 213: GXcopy, AllPlanes);*/ ! 214: (void) signal (SIGIO, func); ! 215: Fredraw_display(); ! 216: /* dumprectangle(0, 0, screen_height * fontinfo->height, ! 217: screen_width * fontinfo -> width);*/ ! 218: /* PendingExposure = 1; ! 219: xfixscreen ();*/ ! 220: XFlush(); ! 221: XFreePixmap (temp); ! 222: return Qt; ! 223: } ! 224: ! 225: DEFUN ("x-set-border-color", Fx_set_border_color, Sx_set_border_color, 1, 1, ! 226: "sSet border color: ", ! 227: "Set border color to COLOR.") ! 228: (arg) ! 229: Lisp_Object arg; ! 230: { ! 231: Color cdef; ! 232: Pixmap temp; ! 233: extern int XXborder; ! 234: int (*func) (); ! 235: extern Window XXwindow; ! 236: check_xterm (); ! 237: CHECK_STRING (arg,1); ! 238: brdr_color= (char *) xmalloc (XSTRING (arg)->size + 1); ! 239: bcopy (XSTRING (arg)->data, brdr_color, XSTRING (arg)->size + 1); ! 240: func = signal (SIGIO, SIG_IGN); ! 241: if (brdr_color && DisplayCells() > 2 && ! 242: XParseColor(brdr_color, &cdef) && XGetHardwareColor(&cdef)) ! 243: { ! 244: temp = XMakeTile(cdef.pixel); ! 245: brdr = cdef.pixel; ! 246: } ! 247: else if (brdr_color && strcmp(brdr_color, "black") == 0) ! 248: { ! 249: temp = BlackPixmap; ! 250: brdr = BlackPixel; ! 251: } ! 252: else if (brdr_color && strcmp(brdr_color, "white") == 0) ! 253: { ! 254: temp = WhitePixmap; ! 255: brdr = WhitePixel; ! 256: } ! 257: else ! 258: { ! 259: temp = XMakePixmap ((Bitmap) XStoreBitmap (16, 16, gray_bits), ! 260: BlackPixel, WhitePixel); ! 261: brdr = BlackPixel; ! 262: brdr_color = "gray"; ! 263: } ! 264: if (XXborder) ! 265: XChangeBorder (XXwindow, temp); ! 266: (void) signal (SIGIO, func); ! 267: XFreePixmap (temp); ! 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: Color cdef; ! 278: extern Window XXwindow; ! 279: int (*func) (); ! 280: char *save_color; ! 281: check_xterm (); ! 282: CHECK_STRING (arg,1); ! 283: curs_color = (char *) xmalloc (XSTRING (arg)->size + 1); ! 284: func = signal (SIGIO, SIG_IGN); ! 285: bcopy (XSTRING (arg)->data, curs_color, XSTRING (arg)->size + 1); ! 286: if (curs_color && DisplayCells() > 2 && ! 287: XParseColor(curs_color, &cdef) && XGetHardwareColor(&cdef)) { ! 288: curs = cdef.pixel; ! 289: } else if (curs_color && strcmp(curs_color, "black") == 0) { ! 290: curs = BlackPixel; ! 291: } else if (curs_color && strcmp(curs_color, "white") == 0) { ! 292: curs = WhitePixel; ! 293: } ! 294: else ! 295: { ! 296: curs_color = save_color; ! 297: } ! 298: (void) signal (SIGIO, func); ! 299: CursorToggle(); ! 300: CursorToggle(); ! 301: return Qt; ! 302: } ! 303: ! 304: DEFUN ("x-set-mouse-color", Fx_set_mouse_color, Sx_set_mouse_color, 1, 1, ! 305: "sSet mouse cursor color: ", ! 306: "Set mouse cursor color to COLOR.") ! 307: (arg) ! 308: Lisp_Object arg; ! 309: { ! 310: extern Cursor EmacsCursor; ! 311: extern char MouseCursor[], MouseMask[]; ! 312: Cursor temp; ! 313: int (*func) (); ! 314: Color cdef; ! 315: char *save_color; ! 316: extern Window XXwindow; ! 317: check_xterm (); ! 318: CHECK_STRING (arg,1); ! 319: mous_color = (char *) xmalloc (XSTRING (arg)->size + 1); ! 320: func = signal (SIGIO, SIG_IGN); ! 321: bcopy (XSTRING (arg)->data, mous_color, XSTRING (arg)->size + 1); ! 322: if (mous_color && DisplayCells() > 2 && ! 323: XParseColor(mous_color, &cdef) && XGetHardwareColor(&cdef)) { ! 324: mous = cdef.pixel; ! 325: } else if (mous_color && strcmp(mous_color, "black") == 0) { ! 326: mous = BlackPixel; ! 327: } else if (mous_color && strcmp(mous_color, "white") == 0) { ! 328: mous = WhitePixel; ! 329: } ! 330: else ! 331: { ! 332: mous_color = save_color; ! 333: } ! 334: temp = XCreateCursor(16, 16, MouseCursor, MouseMask, 0, 0, ! 335: mous, back, GXcopy); ! 336: XDefineCursor (XXwindow, temp); ! 337: XFreeCursor (EmacsCursor); ! 338: (void) signal (SIGIO, func); ! 339: bcopy(&temp, &EmacsCursor, sizeof(Cursor)); ! 340: return Qt; ! 341: } ! 342: ! 343: DEFUN ("x-color-p", Fx_color_p, Sx_color_p, 0, 0, "", ! 344: "Returns t if the display is a color X terminal.") ! 345: () ! 346: { ! 347: check_xterm (); ! 348: if (DisplayCells() > 2) ! 349: return Qt; ! 350: else ! 351: return Qnil; ! 352: } ! 353: ! 354: DEFUN ("x-get-foreground-color", Fx_get_foreground_color, ! 355: Sx_get_foreground_color, 0, 0, "", ! 356: "Returns the color of the foreground, as a string.") ! 357: () ! 358: { ! 359: Lisp_Object string; ! 360: string = make_string(fore_color, strlen (fore_color)); ! 361: return string; ! 362: } ! 363: ! 364: DEFUN ("x-get-background-color", Fx_get_background_color, ! 365: Sx_get_background_color, 0, 0, "", ! 366: "Returns the color of the background, as a string.") ! 367: () ! 368: { ! 369: Lisp_Object string; ! 370: string = make_string(back_color, strlen (back_color)); ! 371: return string; ! 372: } ! 373: ! 374: DEFUN ("x-get-border-color", Fx_get_border_color, ! 375: Sx_get_border_color, 0, 0, "", ! 376: "Returns the color of the border, as a string.") ! 377: () ! 378: { ! 379: Lisp_Object string; ! 380: string = make_string(brdr_color, strlen (brdr_color)); ! 381: return string; ! 382: } ! 383: ! 384: DEFUN ("x-get-cursor-color", Fx_get_cursor_color, ! 385: Sx_get_cursor_color, 0, 0, "", ! 386: "Returns the color of the cursor, as a string.") ! 387: () ! 388: { ! 389: Lisp_Object string; ! 390: string = make_string(curs_color, strlen (curs_color)); ! 391: return string; ! 392: } ! 393: ! 394: DEFUN ("x-get-mouse-color", Fx_get_mouse_color, ! 395: Sx_get_mouse_color, 0, 0, "", ! 396: "Returns the color of the mouse cursor, as a string.") ! 397: () ! 398: { ! 399: Lisp_Object string; ! 400: string = make_string(mous_color, strlen (mous_color)); ! 401: return string; ! 402: } ! 403: ! 404: DEFUN ("x-get-default", Fx_get_default, Sx_get_default, 1, 1, ! 405: "sGet X default name: ", ! 406: "Get X default ATTRIBUTE from the system. Returns nil if\n\ ! 407: attribute does not exist.") ! 408: (arg) ! 409: Lisp_Object arg; ! 410: { ! 411: char *default_name, *value; ! 412: Lisp_Object return_string; ! 413: extern char *malloc(), strcpy(); ! 414: check_xterm (); ! 415: CHECK_STRING (arg,1); ! 416: default_name = (char *) xmalloc (XSTRING (arg) -> size + 1); ! 417: if (default_name == 0) ! 418: { ! 419: return Qnil; ! 420: } ! 421: else ! 422: { ! 423: bcopy (XSTRING (arg) -> data, default_name, ! 424: XSTRING (arg) -> size + 1); ! 425: value = XGetDefault("emacs", default_name); ! 426: if (value == 0) ! 427: value = XGetDefault("", default_name); ! 428: return make_string (value, value ? strlen (value) : 0); ! 429: } ! 430: } ! 431: ! 432: DEFUN ("x-set-icon", Fx_set_icon, Sx_set_icon, 1, 1, "P", ! 433: "Set type of icon used by X for Emacs's window.\n\ ! 434: ARG non-nil means use kitchen-sink icon;\n\ ! 435: nil means use generic window manager icon.") ! 436: (arg) ! 437: Lisp_Object arg; ! 438: { ! 439: check_xterm (); ! 440: if (NULL (arg)) ! 441: XTextIcon (); ! 442: else ! 443: XBitmapIcon (); ! 444: return arg; ! 445: } ! 446: ! 447: DEFUN ("x-set-font", Fx_set_font, Sx_set_font, 1, 1, "sFont Name: ", ! 448: "At initialization sets the font to be used for the X window.") ! 449: (arg) ! 450: Lisp_Object arg; ! 451: { ! 452: register char *newfontname; ! 453: extern char *XXcurrentfont; ! 454: ! 455: CHECK_STRING (arg, 1); ! 456: check_xterm (); ! 457: ! 458: newfontname = (char *) xmalloc (XSTRING (arg)->size + 1); ! 459: bcopy (XSTRING (arg)->data, newfontname, XSTRING (arg)->size + 1); ! 460: if (!XNewFont (newfontname)) ! 461: { ! 462: free (XXcurrentfont); ! 463: XXcurrentfont = newfontname; ! 464: return Qt; ! 465: } ! 466: else ! 467: { ! 468: error ("Font %s is not defined", newfontname); ! 469: free (newfontname); ! 470: } ! 471: ! 472: return Qnil; ! 473: } ! 474: ! 475: DEFUN ("x-set-window-edges", Fx_set_window_edges, Sx_set_window_edges, 4, 4, ! 476: "nNumber of Columns: \nnNumber of Rows: \nnX Offset in Pixels: \n\ ! 477: nY Offset in Pixels: ", ! 478: "Sets X window size/position: size COLS by ROWS, positions XOFF and YOFF.\n\ ! 479: To get \"minus zero\" for XOFF or YOFF, supply -1.") ! 480: (cols, rows, xoffset, yoffset) ! 481: Lisp_Object rows, cols, xoffset, yoffset; ! 482: { ! 483: CHECK_NUMBER (rows, 1); ! 484: CHECK_NUMBER (cols, 2); ! 485: CHECK_NUMBER (xoffset, 3); ! 486: CHECK_NUMBER (yoffset, 4); ! 487: check_xterm (); ! 488: ! 489: x_edges_specified = 1; ! 490: if (XINT (rows) != screen_width || XINT (cols) != screen_height) ! 491: { ! 492: XSetWindowSize (XINT (rows), XINT (cols)); ! 493: } ! 494: XSetOffset (XINT (xoffset), XINT (yoffset)); ! 495: XFlush (); ! 496: return Qt; ! 497: } ! 498: ! 499: DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p, ! 500: Scoordinates_in_window_p, 2, 2, ! 501: "xSpecify coordinate pair: \nXExpression which evals to window: ", ! 502: "Return non-nil if POSITIONS (a list, (SCREEN-X SCREEN-Y)) is in WINDOW.\n\ ! 503: Returned value is list of positions expressed\n\ ! 504: relative to window upper left corner.") ! 505: (coordinate, window) ! 506: register Lisp_Object coordinate, window; ! 507: { ! 508: register Lisp_Object xcoord, ycoord; ! 509: ! 510: if (!LISTP (coordinate)) wrong_type_argument (Qlistp, coordinate); ! 511: CHECK_WINDOW (window, 2); ! 512: xcoord = Fcar (coordinate); ! 513: ycoord = Fcar (Fcdr (coordinate)); ! 514: CHECK_NUMBER (xcoord, 0); ! 515: CHECK_NUMBER (ycoord, 1); ! 516: if ((XINT (xcoord) < XINT (XWINDOW (window)->left)) || ! 517: (XINT (xcoord) >= (XINT (XWINDOW (window)->left) + ! 518: XINT (XWINDOW (window)->width)))) ! 519: { ! 520: return Qnil; ! 521: } ! 522: XFASTINT (xcoord) -= XFASTINT (XWINDOW (window)->left); ! 523: if (XINT (ycoord) == (screen_height - 1)) ! 524: return Qnil; ! 525: if ((XINT (ycoord) < XINT (XWINDOW (window)->top)) || ! 526: (XINT (ycoord) >= (XINT (XWINDOW (window)->top) + ! 527: XINT (XWINDOW (window)->height)) - 1)) ! 528: { ! 529: return Qnil; ! 530: } ! 531: XFASTINT (ycoord) -= XFASTINT (XWINDOW (window)->top); ! 532: return (Fcons (xcoord, Fcons (ycoord, Qnil))); ! 533: } ! 534: ! 535: DEFUN ("x-mouse-events", Fx_mouse_events, Sx_mouse_events, 0, 0, 0, ! 536: "Return number of pending mouse events from X window system.") ! 537: () ! 538: { ! 539: register Lisp_Object tem; ! 540: register int windex, rindex, mindex; ! 541: ! 542: check_xterm (); ! 543: windex = Xxrepbuffer.windex; ! 544: rindex = Xxrepbuffer.rindex; ! 545: mindex = Xxrepbuffer.mindex; ! 546: ! 547: if (windex >= rindex) ! 548: { ! 549: XSET (tem, Lisp_Int, windex - rindex); ! 550: } ! 551: else ! 552: { ! 553: XSET (tem, Lisp_Int, mindex + 1 - (rindex - windex)); ! 554: } ! 555: return tem; ! 556: } ! 557: ! 558: DEFUN ("x-proc-mouse-event", Fx_proc_mouse_event, Sx_proc_mouse_event, ! 559: 0, 0, 0, ! 560: "Pulls a mouse event out of the mouse event buffer and dispatches\n\ ! 561: the appropriate function to act upon this event.") ! 562: () ! 563: { ! 564: XButtonEvent xrep; ! 565: extern FontInfo *fontinfo; ! 566: register Lisp_Object Mouse_Cmd; ! 567: register char com_letter; ! 568: register char key_mask; ! 569: register Lisp_Object tempx; ! 570: register Lisp_Object tempy; ! 571: extern Lisp_Object get_keyelt (); ! 572: ! 573: check_xterm (); ! 574: if (unloadxrepbuffer (&xrep, &Xxrepbuffer) == 0) ! 575: { ! 576: com_letter = xrep.detail & 3; ! 577: key_mask = (xrep.detail >> 8) & 0xf0; ! 578: com_letter |= key_mask; ! 579: XSET (tempx, Lisp_Int, xrep.x/fontinfo->width); ! 580: XSET (tempy, Lisp_Int, xrep.y/fontinfo->height); ! 581: Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil)); ! 582: Mouse_Cmd = get_keyelt (access_keymap (MouseMap, com_letter)); ! 583: if (NULL (Mouse_Cmd)) ! 584: { ! 585: Ding (); ! 586: Vx_mouse_pos = Qnil; ! 587: } ! 588: else ! 589: { ! 590: return (call1 (Mouse_Cmd, Vx_mouse_pos)); ! 591: } ! 592: } ! 593: return Qnil; ! 594: } ! 595: ! 596: DEFUN ("x-get-mouse-event", Fx_get_mouse_event, Sx_get_mouse_event, ! 597: 1, 1, 0, ! 598: "Get next mouse event out of mouse event buffer (com-letter (x y)).\n\ ! 599: ARG non-nil means return nil immediately if no pending event;\n\ ! 600: otherwise, wait for an event.") ! 601: (arg) ! 602: Lisp_Object arg; ! 603: { ! 604: XButtonEvent xrep; ! 605: extern FontInfo *fontinfo; ! 606: register Lisp_Object Mouse_Cmd; ! 607: register char com_letter; ! 608: register char key_mask; ! 609: ! 610: register Lisp_Object tempx; ! 611: register Lisp_Object tempy; ! 612: extern Lisp_Object get_keyelt (); ! 613: ! 614: check_xterm (); ! 615: ! 616: if (NULL (arg)) ! 617: while (Xxrepbuffer.windex == Xxrepbuffer.rindex); ! 618: /*** ??? Surely you don't mean to busy wait??? */ ! 619: if (unloadxrepbuffer (&xrep, &Xxrepbuffer) == 0) ! 620: { ! 621: com_letter = *((char *)&xrep.detail); ! 622: com_letter &= 3; ! 623: key_mask = *((char *)&xrep.detail + 1); ! 624: key_mask &= 0xf0; ! 625: com_letter |= key_mask; ! 626: XSET (tempx, Lisp_Int, xrep.x/fontinfo->width); ! 627: XSET (tempy, Lisp_Int, xrep.y/fontinfo->height); ! 628: Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil)); ! 629: return (Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil))); ! 630: } ! 631: return Qnil; ! 632: } ! 633: ! 634: DEFUN ("x-set-keyboard-enable", Fx_set_keyboard_enable, ! 635: Sx_set_keyboard_enable, 1, 1, 0, ! 636: "In the X window system, set the flag that permite keyboard input.\n\ ! 637: Permit input if ARG is non-nil.") ! 638: (arg) ! 639: Lisp_Object arg; ! 640: { ! 641: extern Window XXwindow; ! 642: check_xterm (); ! 643: ! 644: XSelectInput (XXwindow, ! 645: ExposeWindow | ButtonPressed | ExposeRegion | ExposeCopy ! 646: | (!NULL (arg) ? KeyPressed : 0)); ! 647: return arg; ! 648: } ! 649: ! 650: DEFUN ("x-set-mouse-inform-flag", Fx_set_mouse_inform_flag, ! 651: Sx_set_mouse_inform_flag, 1, 1, 0, ! 652: "Set inform-of-mouse-events flag in X window system on if ARG is non-nil.") ! 653: (arg) ! 654: Lisp_Object arg; ! 655: { ! 656: extern int informflag; ! 657: informflag = !NULL (arg); ! 658: return arg; ! 659: } ! 660: ! 661: DEFUN ("x-store-cut-buffer", Fx_store_cut_buffer, Sx_store_cut_buffer, ! 662: 1, 1, "sSend string to X:", ! 663: "Store contents of STRING into the cut buffer of the X window system.") ! 664: (string) ! 665: register Lisp_Object string; ! 666: { ! 667: CHECK_STRING (string, 1); ! 668: check_xterm (); ! 669: ! 670: XStoreBytes (XSTRING (string)->data, XSTRING (string)->size); ! 671: ! 672: return Qnil; ! 673: } ! 674: ! 675: DEFUN ("x-get-cut-buffer", Fx_get_cut_buffer, Sx_get_cut_buffer, 0, 0, 0, ! 676: "Return contents of cut buffer of the X window system, as a string.") ! 677: () ! 678: { ! 679: int len; ! 680: register Lisp_Object string; ! 681: register int (*func) (); ! 682: register char *d; ! 683: ! 684: func = (int (*)()) (signal (SIGIO, SIG_IGN)); ! 685: d = XFetchBytes (&len); ! 686: string = make_string (d, len); ! 687: signal (SIGIO, func); ! 688: return string; ! 689: } ! 690: ! 691: DEFUN ("x-rubber-band", Fx_rubber_band, Sx_rubber_band, 0, 0, 0, ! 692: "Ask user to specify Emacs window position and size with mouse.\n\ ! 693: This is done automatically if the data has not been specified\n\ ! 694: when Emacs needs the window to be displayed.") ! 695: () ! 696: { ! 697: int x, y, width, height; ! 698: extern int XXborder; ! 699: extern int PendingExposure; ! 700: extern char *default_window; ! 701: register int (*handle) (); ! 702: x_edges_specified = 1; ! 703: ! 704: check_xterm (); ! 705: handle = signal (SIGIO, SIG_IGN); ! 706: window_fetch (fontinfo->id, &x, &y, &width, &height, "", default_window, ! 707: XXborder, "Gnuemacs"); ! 708: (void) signal (SIGIO, handle); ! 709: XSetWindowSize (height, width); ! 710: XSetOffset (x, y); ! 711: XFlush(); ! 712: return Qnil; ! 713: } ! 714: ! 715: DEFUN ("x-create-x-window", Fx_create_x_window, Sx_create_x_window, ! 716: 1, 1, 0, ! 717: "Create window for gnuemacs from a valid GEOMETRY specification.") ! 718: (arg) ! 719: Lisp_Object arg; ! 720: { ! 721: int x, y, width, height; ! 722: extern int XXborder; ! 723: extern int PendingExposure; ! 724: char *geometry; ! 725: register int (*handle) (); ! 726: x_edges_specified = 1; ! 727: ! 728: check_xterm (); ! 729: CHECK_STRING(arg, 1); ! 730: geometry= (char *) xmalloc (XSTRING (arg)->size + 1); ! 731: bcopy (XSTRING (arg)->data, geometry, XSTRING (arg)->size + 1); ! 732: handle = signal (SIGIO, SIG_IGN); ! 733: window_fetch (fontinfo->id, &x, &y, &width, &height, geometry, ! 734: default_window, XXborder, "Gnuemacs"); ! 735: (void) signal (SIGIO, handle); ! 736: XSetWindowSize (height, width); ! 737: /* XSetWindowSize ((height - (2 * XXborder))/fontinfo -> height, ! 738: (width - (2 * XXborder))/fontinfo -> width);*/ ! 739: XSetOffset (x, y); ! 740: XMapWindow (XXwindow); ! 741: XFlush(); ! 742: return Qnil; ! 743: } ! 744: ! 745: DEFUN ("x-set-border-width", Fx_set_border_width, Sx_set_border_width, ! 746: 1, 1, 0, ! 747: "Set width of border to WIDTH, in the X window system.\n\ ! 748: Works only before the window has been mapped.") ! 749: (borderwidth) ! 750: register Lisp_Object borderwidth; ! 751: { ! 752: extern int WindowMapped; ! 753: extern int XXborder; ! 754: WindowInfo WinInfo; ! 755: extern Window XXwindow; ! 756: extern FontInfo *fontinfo; ! 757: extern Cursor EmacsCursor; ! 758: extern char iconidentity[]; ! 759: register int (*func) (); ! 760: extern int CurHL; ! 761: Window tempwindow; ! 762: extern int pixelwidth, pixelheight; ! 763: register int temppixelwidth; ! 764: register int temppixelheight; ! 765: register int tempx; ! 766: register int tempy; ! 767: extern int XXxoffset, XXyoffset; ! 768: extern int XXpid; ! 769: Pixmap temp_brdr, temp_back; ! 770: ! 771: CHECK_NUMBER (borderwidth, 1); ! 772: ! 773: check_xterm (); ! 774: ! 775: if (XINT (borderwidth) < 0) XSETINT (borderwidth, 0); ! 776: ! 777: temppixelwidth = screen_width * fontinfo->width; ! 778: temppixelheight = screen_height * fontinfo->height; ! 779: func = signal (SIGIO, SIG_IGN); ! 780: XQueryWindow (XXwindow, &WinInfo); ! 781: tempx = WinInfo.x; ! 782: tempy = WinInfo.y; ! 783: if (strcmp (brdr_color, "gray") == 0) ! 784: temp_brdr = XMakePixmap ((Bitmap) XStoreBitmap (16, 16, gray_bits), ! 785: BlackPixel, WhitePixel); ! 786: else ! 787: temp_brdr = XMakeTile(brdr); ! 788: temp_back = XMakeTile(back); ! 789: tempwindow = XCreateWindow (RootWindow, ! 790: tempx /* Absolute horizontal offset */, ! 791: tempy /* Absolute Vertical offset */, ! 792: temppixelwidth, temppixelheight, ! 793: XINT (borderwidth), ! 794: temp_brdr, temp_back); ! 795: if (tempwindow) ! 796: { ! 797: XDestroyWindow (XXwindow); ! 798: XXwindow = tempwindow; ! 799: pixelwidth = temppixelwidth; ! 800: pixelheight = temppixelheight; ! 801: XXborder = XINT (borderwidth); ! 802: XSelectInput (XXwindow, NoEvent); ! 803: XSetResizeHint (XXwindow, fontinfo->width * 10, fontinfo->height *5, ! 804: fontinfo->width, fontinfo->height); ! 805: XStoreName (XXwindow, &iconidentity[0]); ! 806: XDefineCursor (XXwindow, EmacsCursor); ! 807: XFreePixmap(temp_brdr); ! 808: XFreePixmap(temp_back); ! 809: (void)signal (SIGIO, func); ! 810: if (QLength () > 0) ! 811: { ! 812: kill (XXpid, SIGIO); ! 813: } ! 814: if (WindowMapped) ! 815: { ! 816: XMapWindow (XXwindow); ! 817: XSelectInput (XXwindow, KeyPressed | ExposeWindow | ! 818: ButtonPressed | ExposeRegion | ! 819: ExposeCopy); ! 820: ++screen_garbaged; ! 821: XFlush (); ! 822: } ! 823: return Qt; ! 824: } ! 825: else ! 826: { ! 827: (void) signal (SIGIO, func); ! 828: if (QLength () > 0) ! 829: { ! 830: kill (XXpid, SIGIO); ! 831: } ! 832: message ("Could not recreate window."); ! 833: return Qnil; ! 834: } ! 835: } ! 836: ! 837: jmp_buf dispenv; ! 838: Display *OldDisplay; ! 839: FontInfo *OldFontInfo; ! 840: Window OldWindow; ! 841: ! 842: XRestoreDisplay () ! 843: { ! 844: longjmp (dispenv, "Unable to access display (probably)"); ! 845: } ! 846: ! 847: DEFUN ("x-change-display", Fx_change_display, Sx_change_display, 1, 1, ! 848: "sNew display name: ", ! 849: "This function takes one argument, the display where you wish to\n\ ! 850: continue your editing session. Your current window will be unmapped and\n\ ! 851: the current display will be closed. The new X display will be opened and\n\ ! 852: the rubber-band outline of the new window will appear on the new X display.\n\ ! 853: This function does not look at your .Xdefaults file, so you should use the\n\ ! 854: function x-new-display instead.") ! 855: (new_display) ! 856: register Lisp_Object new_display; ! 857: { ! 858: extern Cursor EmacsCursor; ! 859: Cursor OldEmacsCursor; ! 860: register int (*sigfunc) (), (*pipefunc) (); ! 861: register char *newdisplayname = 0; ! 862: extern char iconidentity[]; ! 863: extern Display *XXdisplay; ! 864: extern Window XXwindow; ! 865: extern Window XXIconWindow; ! 866: extern int IconWindow; ! 867: extern Bitmap XXIconMask; ! 868: extern int pixelwidth, pixelheight, XXborder, CurHL; ! 869: extern FontInfo *fontinfo; ! 870: extern int bitblt, CursorExists, VisibleX, VisibleY; ! 871: extern WindowInfo rootwindowinfo; ! 872: extern char MouseCursor[], MouseMask[]; ! 873: int old_fcntl_flags, old_fcntl_owner; ! 874: int x, y, width, height; ! 875: int temp_icon; ! 876: Pixmap temp_brdr, temp_back; ! 877: register char *XXerrorcode; ! 878: extern int XXxoffset, XXyoffset; ! 879: ! 880: CHECK_STRING (new_display, 1); ! 881: check_xterm (); ! 882: ! 883: /* newdisplayname = xmalloc (XSTRING (new_display)->size + 1); */ ! 884: /* bcopy (XSTRING (new_display)->data, newdisplayname, */ ! 885: /* XSTRING (new_display)->size + 1); */ ! 886: /* Since this was freed at the end, why not just use the original? */ ! 887: newdisplayname = (char *) XSTRING (new_display)->data; ! 888: sigfunc = signal (SIGIO, SIG_IGN); ! 889: XIOErrorHandler(XRestoreDisplay); ! 890: if (XXerrorcode = (char *) setjmp (dispenv)) ! 891: { ! 892: /* free (&newdisplayname[0]); */ ! 893: if (fontinfo) ! 894: XCloseFont (fontinfo); ! 895: if (XXwindow) ! 896: XDestroyWindow (XXwindow); ! 897: if (XXdisplay) ! 898: XCloseDisplay (XXdisplay); ! 899: XXdisplay = OldDisplay; ! 900: fontinfo = OldFontInfo; ! 901: XXwindow = OldWindow; ! 902: EmacsCursor = OldEmacsCursor; ! 903: XIOErrorHandler (0); ! 904: XSetDisplay (XXdisplay); ! 905: (void)signal (SIGIO, sigfunc); ! 906: if (QLength () > 0) ! 907: { ! 908: kill (XXpid, SIGIO); ! 909: } ! 910: error ("Display change problem: %s", XXerrorcode); ! 911: } ! 912: else ! 913: { ! 914: OldEmacsCursor = EmacsCursor; ! 915: OldDisplay = XXdisplay; ! 916: OldFontInfo = fontinfo; ! 917: OldWindow = XXwindow; ! 918: XXwindow = 0; ! 919: fontinfo = 0; ! 920: XXdisplay = 0; ! 921: } ! 922: XXdisplay = XOpenDisplay (newdisplayname); ! 923: if (!XXdisplay) ! 924: { ! 925: longjmp (dispenv, "Probably nonexistant display"); ! 926: } ! 927: XQueryWindow (RootWindow, &rootwindowinfo); ! 928: fontinfo = XOpenFont (XXcurrentfont); ! 929: if (!fontinfo) ! 930: { ! 931: longjmp (dispenv, "Bad font"); ! 932: } ! 933: /* pixelwidth and pixelheight are correct*/ ! 934: XXwindow = XCreateWindow (RootWindow, ! 935: XXxoffset, ! 936: XXyoffset, ! 937: pixelwidth, pixelheight, ! 938: XXborder, BlackPixmap, WhitePixmap); ! 939: if (!XXwindow) ! 940: { ! 941: longjmp (dispenv, "Could not create window"); ! 942: } ! 943: fore = BlackPixel; ! 944: back = WhitePixel; ! 945: brdr = BlackPixel; ! 946: mous = BlackPixel; ! 947: curs = BlackPixel; ! 948: ! 949: fore_color = "black"; ! 950: back_color = "white"; ! 951: brdr_color = "black"; ! 952: mous_color = "black"; ! 953: curs_color = "black"; ! 954: ! 955: XSelectInput (XXwindow, NoEvent); ! 956: EmacsCursor = XCreateCursor (16, 16, MouseCursor, MouseMask, ! 957: 0, 0, mous, back, GXcopy); ! 958: XDefineCursor (XXwindow, EmacsCursor); ! 959: ! 960: XSetResizeHint (XXwindow, fontinfo->width * 10, fontinfo->height * 5, ! 961: fontinfo->width, fontinfo->height); ! 962: XStoreName (XXwindow, iconidentity); ! 963: /* WindowMapped = 0;*/ ! 964: x_edges_specified = 0; ! 965: bitblt = 0; ! 966: CursorExists = 0; ! 967: VisibleX = 0; ! 968: VisibleY = 0; ! 969: XSetDisplay (XXdisplay); ! 970: /* XQueryWindow (RootWindow, &rootwindowinfo);*/ ! 971: /* if (WindowMapped) ! 972: {*/ ! 973: WindowMapped = 0; ! 974: XPopUpWindow (); ! 975: /* }*/ ! 976: WindowMapped = 1; ! 977: XXIconWindow = XCreateWindow (RootWindow, 0, 0, sink_width, sink_height, ! 978: 2, WhitePixmap, BlackPixmap); ! 979: XXIconMask = XStoreBitmap(sink_mask_width, sink_mask_height, sink_mask_bits); ! 980: XSetDisplay (OldDisplay); ! 981: XCloseFont (OldFontInfo); ! 982: XFreeCursor (OldEmacsCursor); ! 983: XDestroyWindow (OldWindow); ! 984: XSetDisplay (XXdisplay); ! 985: XCloseDisplay (OldDisplay); ! 986: temp_icon = IconWindow; ! 987: XBitmapIcon; ! 988: XTextIcon; ! 989: if (temp_icon) ! 990: { ! 991: IconWindow = 0; ! 992: XBitmapIcon; ! 993: } ! 994: XErrorHandler (0); ! 995: dup2 (dpyno (), 0); ! 996: close (dpyno ()); ! 997: dpyno () = 0; /* Looks a little strange? */ ! 998: /* check the def of the */ ! 999: /* macro, it is a genuine */ ! 1000: /* lvalue */ ! 1001: old_fcntl_flags = fcntl (0, F_GETFL, 0); ! 1002: fcntl (0, F_SETFL, old_fcntl_flags | FASYNC); ! 1003: old_fcntl_owner = fcntl (0, F_GETOWN, 0); ! 1004: fcntl (0, F_SETOWN, getpid ()); ! 1005: (void)signal (SIGIO, sigfunc); ! 1006: if (QLength () > 0) ! 1007: { ! 1008: kill (XXpid, SIGIO); ! 1009: } ! 1010: /* free (newdisplayname); */ ! 1011: /* x_edges_specified = 0;*/ ! 1012: ++screen_garbaged; ! 1013: Fredraw_display(); ! 1014: return Qt; ! 1015: } ! 1016: ! 1017: /* ! 1018: Grabs mouse, outlines a window, etc. ! 1019: if left button pressed, sizes a wd x hd window (in characters) ! 1020: if right button pressed, sizes wd x what will fit window (in characters) ! 1021: if middle button pressed, allows user to size window in font increments ! 1022: (+ border * 2 for inner border); ! 1023: While sizing, dimensions of window are displayed in upper left of root. ! 1024: str is also displayed there. ! 1025: In all cases, x and y are the desired coordinates for the upper lefthand ! 1026: corner, *width = width desired, *height = height desired ! 1027: (min for both is 1 font char). ! 1028: ! 1029: */ ! 1030: /* ! 1031: This routine is a total crock. It makes a window using XCreateTerm ! 1032: purely for return value, destroying the temporary window created in ! 1033: the process. If XCreateTerm were broken into smaller, more easily ! 1034: digestible pieces, it would be useful. As such, the constraints of ! 1035: time, emacs, and X conventions force me into this crock. --rlk ! 1036: */ ! 1037: ! 1038: window_fetch(font, x, y, width, height, geo, deflt, border, str) ! 1039: Font font; ! 1040: int *x, *y, *width, *height; ! 1041: char *geo, *deflt; ! 1042: int border; ! 1043: char *str; ! 1044: { ! 1045: extern int WindowMapped; ! 1046: extern int XXborder; ! 1047: extern Window XXwindow; ! 1048: extern FontInfo *fontinfo; ! 1049: extern Cursor EmacsCursor; ! 1050: OpaqueFrame frame; ! 1051: extern char iconidentity[]; ! 1052: register int (*func) (); ! 1053: Window tempwindow; ! 1054: WindowInfo WinInfo; ! 1055: extern int pixelwidth, pixelheight; ! 1056: register int temppixelwidth; ! 1057: register int temppixelheight; ! 1058: extern int XXxoffset, XXyoffset; ! 1059: extern int XXpid; ! 1060: Pixmap temp_brdr, temp_back; ! 1061: ! 1062: func = signal (SIGIO, SIG_IGN); ! 1063: temp_brdr = XMakeTile(brdr); ! 1064: temp_back = XMakeTile(back); ! 1065: frame.bdrwidth = border; ! 1066: frame.border = XMakeTile (brdr); ! 1067: frame.background = XMakeTile (back); ! 1068: tempwindow = XCreateTerm(str, "emacs", geo, deflt, &frame, 10, 5, 0, 0, ! 1069: width, height, fontinfo, fontinfo->width, ! 1070: fontinfo->height); ! 1071: if (tempwindow) ! 1072: { ! 1073: XDestroyWindow (XXwindow); ! 1074: XXwindow = tempwindow; ! 1075: XSelectInput (XXwindow, NoEvent); ! 1076: XSetResizeHint (XXwindow, fontinfo->width * 10, fontinfo->height *5, ! 1077: fontinfo->width, fontinfo->height); ! 1078: XStoreName (XXwindow, &iconidentity[0]); ! 1079: XDefineCursor (XXwindow, EmacsCursor); ! 1080: XQueryWindow (XXwindow, &WinInfo); ! 1081: *x = WinInfo.x; ! 1082: *y = WinInfo.y; ! 1083: XFreePixmap(temp_brdr); ! 1084: XFreePixmap(temp_back); ! 1085: (void)signal (SIGIO, func); ! 1086: if (QLength () > 0) ! 1087: { ! 1088: kill (XXpid, SIGIO); ! 1089: } ! 1090: if (WindowMapped) ! 1091: { ! 1092: XMapWindow (XXwindow); ! 1093: XSelectInput (XXwindow, KeyPressed | ExposeWindow | ! 1094: ButtonPressed | ExposeRegion | ! 1095: ExposeCopy); ! 1096: ++screen_garbaged; ! 1097: XFlush (); ! 1098: } ! 1099: return Qt; ! 1100: } ! 1101: else ! 1102: { ! 1103: (void) signal (SIGIO, func); ! 1104: if (QLength () > 0) ! 1105: { ! 1106: kill (XXpid, SIGIO); ! 1107: } ! 1108: message ("Could not recreate window."); ! 1109: return Qnil; ! 1110: } ! 1111: } ! 1112: ! 1113: setxterm () ! 1114: { ! 1115: Vxterm = Qt; ! 1116: } ! 1117: ! 1118: XRedrawDisplay() ! 1119: { ! 1120: Fredraw_display(); ! 1121: } ! 1122: ! 1123: XAutoSave() ! 1124: { ! 1125: Fdo_auto_save(); ! 1126: } ! 1127: ! 1128: ! 1129: syms_of_xfns () ! 1130: { ! 1131: x_edges_specified = 0; ! 1132: ! 1133: DefLispVar("xterm", &Vxterm, ! 1134: "True if using xterm, nil otherwise."); ! 1135: Vxterm = Qnil; ! 1136: DefLispVar("x-mouse-pos", &Vx_mouse_pos, ! 1137: "Current x-y position of mouse by row, column as specified by font."); ! 1138: Vx_mouse_pos = Qnil; ! 1139: ! 1140: defsubr (&Sx_pop_up_window); ! 1141: defsubr (&Sx_set_bell); ! 1142: defsubr (&Sx_flip_color); ! 1143: defsubr (&Sx_set_icon); ! 1144: defsubr (&Sx_set_font); ! 1145: defsubr (&Sx_set_window_edges); ! 1146: defsubr (&Scoordinates_in_window_p); ! 1147: defsubr (&Sx_mouse_events); ! 1148: defsubr (&Sx_proc_mouse_event); ! 1149: defsubr (&Sx_get_mouse_event); ! 1150: defsubr (&Sx_set_keyboard_enable); ! 1151: defsubr (&Sx_set_mouse_inform_flag); ! 1152: defsubr (&Sx_store_cut_buffer); ! 1153: defsubr (&Sx_get_cut_buffer); ! 1154: defsubr (&Sx_rubber_band); ! 1155: defsubr (&Sx_create_x_window); ! 1156: defsubr (&Sx_set_border_width); ! 1157: defsubr (&Sx_change_display); ! 1158: defsubr (&Sx_set_foreground_color); ! 1159: defsubr (&Sx_set_background_color); ! 1160: defsubr (&Sx_set_border_color); ! 1161: defsubr (&Sx_set_cursor_color); ! 1162: defsubr (&Sx_set_mouse_color); ! 1163: defsubr (&Sx_get_foreground_color); ! 1164: defsubr (&Sx_get_background_color); ! 1165: defsubr (&Sx_get_border_color); ! 1166: defsubr (&Sx_get_cursor_color); ! 1167: defsubr (&Sx_get_mouse_color); ! 1168: defsubr (&Sx_color_p); ! 1169: defsubr (&Sx_get_default); ! 1170: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.