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