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