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