1 /* Functions for the X window system.
2 Copyright (C) 1989, 1992, 1993 Free Software Foundation.
4 This file is part of GNU Emacs.
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 2, or (at your option)
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.
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. */
20 /* Completely rewritten by Richard Stallman. */
22 /* Rewritten for X11 by Joseph Arceneaux */
34 #include "dispextern.h"
40 #include <X11/bitmaps/gray>
42 #define min(a,b) ((a) < (b) ? (a) : (b))
43 #define max(a,b) ((a) > (b) ? (a) : (b))
46 /* X Resource data base */
47 static XrmDatabase xrdb
;
49 /* The class of this X application. */
50 #define EMACS_CLASS "Emacs"
52 /* Title name and application name for X stuff. */
53 extern char *x_id_name
;
54 extern Lisp_Object invocation_name
;
56 /* The background and shape of the mouse pointer, and shape when not
57 over text or in the modeline. */
58 Lisp_Object Vx_pointer_shape
, Vx_nontext_pointer_shape
, Vx_mode_pointer_shape
;
60 /* Color of chars displayed in cursor box. */
61 Lisp_Object Vx_cursor_fore_pixel
;
63 /* The X Visual we are using for X windows (the default) */
64 Visual
*screen_visual
;
66 /* How many screens this X display has. */
69 /* The vendor supporting this X server. */
70 Lisp_Object Vx_vendor
;
72 /* The vendor's release number for this X server. */
75 /* Height of this X screen in pixels. */
78 /* Height of this X screen in millimeters. */
79 int x_screen_height_mm
;
81 /* Width of this X screen in pixels. */
84 /* Width of this X screen in millimeters. */
85 int x_screen_width_mm
;
87 /* Does this X screen do backing store? */
88 Lisp_Object Vx_backing_store
;
90 /* Does this X screen do save-unders? */
93 /* Number of planes for this screen. */
96 /* X Visual type of this screen. */
97 Lisp_Object Vx_screen_visual
;
99 /* Non nil if no window manager is in use. */
100 Lisp_Object Vx_no_window_manager
;
102 static char *x_visual_strings
[] =
112 /* `t' if a mouse button is depressed. */
114 Lisp_Object Vmouse_depressed
;
116 extern unsigned int x_mouse_x
, x_mouse_y
, x_mouse_grabbed
;
118 /* Atom for indicating window state to the window manager. */
119 Atom Xatom_wm_change_state
;
121 /* When emacs became the selection owner. */
122 extern Time x_begin_selection_own
;
124 /* Emacs' selection property identifier. */
125 extern Atom Xatom_emacs_selection
;
127 /* Clipboard selection atom. */
128 extern Atom Xatom_clipboard_selection
;
130 /* Clipboard atom. */
131 extern Atom Xatom_clipboard
;
133 /* Atom for indicating incremental selection transfer. */
134 extern Atom Xatom_incremental
;
136 /* Atom for indicating multiple selection request list */
137 extern Atom Xatom_multiple
;
139 /* Atom for what targets emacs handles. */
140 extern Atom Xatom_targets
;
142 /* Atom for indicating timstamp selection request */
143 extern Atom Xatom_timestamp
;
145 /* Atom requesting we delete our selection. */
146 extern Atom Xatom_delete
;
148 /* Selection magic. */
149 extern Atom Xatom_insert_selection
;
151 /* Type of property for INSERT_SELECTION. */
152 extern Atom Xatom_pair
;
154 /* More selection magic. */
155 extern Atom Xatom_insert_property
;
157 /* Atom for indicating property type TEXT */
158 extern Atom Xatom_text
;
160 /* Communication with window managers. */
161 extern Atom Xatom_wm_protocols
;
163 /* Kinds of protocol things we may receive. */
164 extern Atom Xatom_wm_take_focus
;
165 extern Atom Xatom_wm_save_yourself
;
166 extern Atom Xatom_wm_delete_window
;
168 /* Other WM communication */
169 extern Atom Xatom_wm_configure_denied
; /* When our config request is denied */
170 extern Atom Xatom_wm_window_moved
; /* When the WM moves us. */
174 /* Default size of an Emacs window. */
175 static char *default_window
= "=80x24+0+0";
178 char iconidentity
[MAXICID
];
179 #define ICONTAG "emacs@"
180 char minibuffer_iconidentity
[MAXICID
];
181 #define MINIBUFFER_ICONTAG "minibuffer@"
185 /* The last 23 bits of the timestamp of the last mouse button event. */
186 Time mouse_timestamp
;
188 /* Evaluate this expression to rebuild the section of syms_of_xfns
189 that initializes and staticpros the symbols declared below. Note
190 that Emacs 18 has a bug that keeps C-x C-e from being able to
191 evaluate this expression.
194 ;; Accumulate a list of the symbols we want to initialize from the
195 ;; declarations at the top of the file.
196 (goto-char (point-min))
197 (search-forward "/\*&&& symbols declared here &&&*\/\n")
199 (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)")
201 (cons (buffer-substring (match-beginning 1) (match-end 1))
204 (setq symbol-list (nreverse symbol-list))
205 ;; Delete the section of syms_of_... where we initialize the symbols.
206 (search-forward "\n /\*&&& init symbols here &&&*\/\n")
207 (let ((start (point)))
208 (while (looking-at "^ Q")
210 (kill-region start (point)))
211 ;; Write a new symbol initialization section.
213 (insert (format " %s = intern (\"" (car symbol-list)))
214 (let ((start (point)))
215 (insert (substring (car symbol-list) 1))
216 (subst-char-in-region start (point) ?_ ?-))
217 (insert (format "\");\n staticpro (&%s);\n" (car symbol-list)))
218 (setq symbol-list (cdr symbol-list)))))
222 /*&&& symbols declared here &&&*/
223 Lisp_Object Qauto_raise
;
224 Lisp_Object Qauto_lower
;
225 Lisp_Object Qbackground_color
;
227 Lisp_Object Qborder_color
;
228 Lisp_Object Qborder_width
;
230 Lisp_Object Qcursor_color
;
231 Lisp_Object Qcursor_type
;
233 Lisp_Object Qforeground_color
;
234 Lisp_Object Qgeometry
;
235 Lisp_Object Qicon_left
;
236 Lisp_Object Qicon_top
;
237 Lisp_Object Qicon_type
;
238 Lisp_Object Qiconic_startup
;
239 Lisp_Object Qinternal_border_width
;
241 Lisp_Object Qmouse_color
;
243 Lisp_Object Qparent_id
;
244 Lisp_Object Qsuppress_icon
;
245 Lisp_Object Qsuppress_initial_map
;
247 Lisp_Object Qundefined_color
;
248 Lisp_Object Qvertical_scroll_bars
;
249 Lisp_Object Qwindow_id
;
250 Lisp_Object Qx_frame_parameter
;
252 /* The below are defined in frame.c. */
253 extern Lisp_Object Qheight
, Qminibuffer
, Qname
, Qonly
, Qwidth
;
254 extern Lisp_Object Qunsplittable
;
256 extern Lisp_Object Vwindow_system_version
;
258 /* Mouse map for clicks in windows. */
259 extern Lisp_Object Vglobal_mouse_map
;
261 /* Points to table of defined typefaces. */
262 struct face
*x_face_table
[MAX_FACES_AND_GLYPHS
];
264 /* Return the Emacs frame-object corresponding to an X window.
265 It could be the frame's main window or an icon window. */
268 x_window_to_frame (wdesc
)
271 Lisp_Object tail
, frame
;
274 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCONS (tail
)->cdr
)
276 frame
= XCONS (tail
)->car
;
277 if (XTYPE (frame
) != Lisp_Frame
)
280 if (FRAME_X_WINDOW (f
) == wdesc
281 || f
->display
.x
->icon_desc
== wdesc
)
288 /* Connect the frame-parameter names for X frames
289 to the ways of passing the parameter values to the window system.
291 The name of a parameter, as a Lisp symbol,
292 has an `x-frame-parameter' property which is an integer in Lisp
293 but can be interpreted as an `enum x_frame_parm' in C. */
297 X_PARM_FOREGROUND_COLOR
,
298 X_PARM_BACKGROUND_COLOR
,
305 X_PARM_INTERNAL_BORDER_WIDTH
,
309 X_PARM_VERT_SCROLL_BAR
,
313 struct x_frame_parm_table
316 void (*setter
)( /* struct frame *frame, Lisp_Object val, oldval */ );
319 void x_set_foreground_color ();
320 void x_set_background_color ();
321 void x_set_mouse_color ();
322 void x_set_cursor_color ();
323 void x_set_border_color ();
324 void x_set_cursor_type ();
325 void x_set_icon_type ();
327 void x_set_border_width ();
328 void x_set_internal_border_width ();
329 void x_explicitly_set_name ();
330 void x_set_autoraise ();
331 void x_set_autolower ();
332 void x_set_vertical_scroll_bars ();
334 static struct x_frame_parm_table x_frame_parms
[] =
336 "foreground-color", x_set_foreground_color
,
337 "background-color", x_set_background_color
,
338 "mouse-color", x_set_mouse_color
,
339 "cursor-color", x_set_cursor_color
,
340 "border-color", x_set_border_color
,
341 "cursor-type", x_set_cursor_type
,
342 "icon-type", x_set_icon_type
,
344 "border-width", x_set_border_width
,
345 "internal-border-width", x_set_internal_border_width
,
346 "name", x_explicitly_set_name
,
347 "auto-raise", x_set_autoraise
,
348 "auto-lower", x_set_autolower
,
349 "vertical-scroll-bars", x_set_vertical_scroll_bars
,
352 /* Attach the `x-frame-parameter' properties to
353 the Lisp symbol names of parameters relevant to X. */
355 init_x_parm_symbols ()
359 for (i
= 0; i
< sizeof (x_frame_parms
)/sizeof (x_frame_parms
[0]); i
++)
360 Fput (intern (x_frame_parms
[i
].name
), Qx_frame_parameter
,
365 /* Change the parameters of FRAME as specified by ALIST.
366 If a parameter is not specially recognized, do nothing;
367 otherwise call the `x_set_...' function for that parameter. */
369 x_set_frame_parameters (f
, alist
)
375 /* If both of these parameters are present, it's more efficient to
376 set them both at once. So we wait until we've looked at the
377 entire list before we set them. */
378 Lisp_Object width
, height
;
381 Lisp_Object left
, top
;
383 XSET (width
, Lisp_Int
, FRAME_WIDTH (f
));
384 XSET (height
, Lisp_Int
, FRAME_HEIGHT (f
));
386 XSET (top
, Lisp_Int
, f
->display
.x
->top_pos
);
387 XSET (left
, Lisp_Int
, f
->display
.x
->left_pos
);
389 for (tail
= alist
; CONSP (tail
); tail
= Fcdr (tail
))
391 Lisp_Object elt
, prop
, val
;
397 if (EQ (prop
, Qwidth
))
399 else if (EQ (prop
, Qheight
))
401 else if (EQ (prop
, Qtop
))
403 else if (EQ (prop
, Qleft
))
407 register Lisp_Object tem
;
408 tem
= Fget (prop
, Qx_frame_parameter
);
409 if (XTYPE (tem
) == Lisp_Int
411 && XINT (tem
) < sizeof (x_frame_parms
)/sizeof (x_frame_parms
[0]))
412 (*x_frame_parms
[XINT (tem
)].setter
)(f
, val
,
413 get_frame_param (f
, prop
));
414 store_frame_param (f
, prop
, val
);
418 /* Don't call these unless they've changed; the window may not actually
423 XSET (frame
, Lisp_Frame
, f
);
424 if (XINT (width
) != FRAME_WIDTH (f
)
425 || XINT (height
) != FRAME_HEIGHT (f
))
426 Fset_frame_size (frame
, width
, height
);
427 if (XINT (left
) != f
->display
.x
->left_pos
428 || XINT (top
) != f
->display
.x
->top_pos
)
429 Fset_frame_position (frame
, left
, top
);
433 /* Report to X that a frame parameter of frame F is being set or changed.
434 PARAM is the symbol that says which parameter.
435 VAL is the new value.
436 OLDVAL is the old value.
437 If the parameter is not specially recognized, do nothing;
438 otherwise the `x_set_...' function for this parameter. */
441 x_set_frame_param (f
, param
, val
, oldval
)
442 register struct frame
*f
;
444 register Lisp_Object val
;
445 register Lisp_Object oldval
;
447 register Lisp_Object tem
;
448 tem
= Fget (param
, Qx_frame_parameter
);
449 if (XTYPE (tem
) == Lisp_Int
451 && XINT (tem
) < sizeof (x_frame_parms
)/sizeof (x_frame_parms
[0]))
452 (*x_frame_parms
[XINT (tem
)].setter
)(f
, val
, oldval
);
455 /* Insert a description of internally-recorded parameters of frame X
456 into the parameter alist *ALISTPTR that is to be given to the user.
457 Only parameters that are specific to the X window system
458 and whose values are not correctly recorded in the frame's
459 param_alist need to be considered here. */
461 x_report_frame_params (f
, alistptr
)
463 Lisp_Object
*alistptr
;
467 store_in_alist (alistptr
, Qleft
, make_number (f
->display
.x
->left_pos
));
468 store_in_alist (alistptr
, Qtop
, make_number (f
->display
.x
->top_pos
));
469 store_in_alist (alistptr
, Qborder_width
,
470 make_number (f
->display
.x
->border_width
));
471 store_in_alist (alistptr
, Qinternal_border_width
,
472 make_number (f
->display
.x
->internal_border_width
));
473 sprintf (buf
, "%d", FRAME_X_WINDOW (f
));
474 store_in_alist (alistptr
, Qwindow_id
,
478 /* Decide if color named COLOR is valid for the display
479 associated with the selected frame. */
481 defined_color (color
, color_def
)
486 Colormap screen_colormap
;
491 = DefaultColormap (x_current_display
, XDefaultScreen (x_current_display
));
493 foo
= XParseColor (x_current_display
, screen_colormap
,
495 && XAllocColor (x_current_display
, screen_colormap
, color_def
);
497 foo
= XParseColor (color
, color_def
) && XGetHardwareColor (color_def
);
498 #endif /* not HAVE_X11 */
507 /* Given a string ARG naming a color, compute a pixel value from it
508 suitable for screen F.
509 If F is not a color screen, return DEF (default) regardless of what
513 x_decode_color (arg
, def
)
519 CHECK_STRING (arg
, 0);
521 if (strcmp (XSTRING (arg
)->data
, "black") == 0)
522 return BLACK_PIX_DEFAULT
;
523 else if (strcmp (XSTRING (arg
)->data
, "white") == 0)
524 return WHITE_PIX_DEFAULT
;
527 if (x_screen_planes
== 1)
530 if (DISPLAY_CELLS
== 1)
534 if (defined_color (XSTRING (arg
)->data
, &cdef
))
537 Fsignal (Qundefined_color
, Fcons (arg
, Qnil
));
540 /* Functions called only from `x_set_frame_param'
541 to set individual parameters.
543 If FRAME_X_WINDOW (f) is 0,
544 the frame is being created and its X-window does not exist yet.
545 In that case, just record the parameter's new value
546 in the standard place; do not attempt to change the window. */
549 x_set_foreground_color (f
, arg
, oldval
)
551 Lisp_Object arg
, oldval
;
553 f
->display
.x
->foreground_pixel
= x_decode_color (arg
, BLACK_PIX_DEFAULT
);
554 if (FRAME_X_WINDOW (f
) != 0)
558 XSetForeground (x_current_display
, f
->display
.x
->normal_gc
,
559 f
->display
.x
->foreground_pixel
);
560 XSetBackground (x_current_display
, f
->display
.x
->reverse_gc
,
561 f
->display
.x
->foreground_pixel
);
563 #endif /* HAVE_X11 */
564 if (FRAME_VISIBLE_P (f
))
570 x_set_background_color (f
, arg
, oldval
)
572 Lisp_Object arg
, oldval
;
577 f
->display
.x
->background_pixel
= x_decode_color (arg
, WHITE_PIX_DEFAULT
);
579 if (FRAME_X_WINDOW (f
) != 0)
583 /* The main frame area. */
584 XSetBackground (x_current_display
, f
->display
.x
->normal_gc
,
585 f
->display
.x
->background_pixel
);
586 XSetForeground (x_current_display
, f
->display
.x
->reverse_gc
,
587 f
->display
.x
->background_pixel
);
588 XSetWindowBackground (x_current_display
, FRAME_X_WINDOW (f
),
589 f
->display
.x
->background_pixel
);
592 temp
= XMakeTile (f
->display
.x
->background_pixel
);
593 XChangeBackground (FRAME_X_WINDOW (f
), temp
);
595 #endif /* not HAVE_X11 */
598 if (FRAME_VISIBLE_P (f
))
604 x_set_mouse_color (f
, arg
, oldval
)
606 Lisp_Object arg
, oldval
;
608 Cursor cursor
, nontext_cursor
, mode_cursor
;
612 f
->display
.x
->mouse_pixel
= x_decode_color (arg
, BLACK_PIX_DEFAULT
);
613 mask_color
= f
->display
.x
->background_pixel
;
614 /* No invisible pointers. */
615 if (mask_color
== f
->display
.x
->mouse_pixel
616 && mask_color
== f
->display
.x
->background_pixel
)
617 f
->display
.x
->mouse_pixel
= f
->display
.x
->foreground_pixel
;
622 /* It's not okay to crash if the user selects a screwey cursor. */
625 if (!EQ (Qnil
, Vx_pointer_shape
))
627 CHECK_NUMBER (Vx_pointer_shape
, 0);
628 cursor
= XCreateFontCursor (x_current_display
, XINT (Vx_pointer_shape
));
631 cursor
= XCreateFontCursor (x_current_display
, XC_xterm
);
632 x_check_errors ("bad text pointer cursor: %s");
634 if (!EQ (Qnil
, Vx_nontext_pointer_shape
))
636 CHECK_NUMBER (Vx_nontext_pointer_shape
, 0);
637 nontext_cursor
= XCreateFontCursor (x_current_display
,
638 XINT (Vx_nontext_pointer_shape
));
641 nontext_cursor
= XCreateFontCursor (x_current_display
, XC_left_ptr
);
642 x_check_errors ("bad nontext pointer cursor: %s");
644 if (!EQ (Qnil
, Vx_mode_pointer_shape
))
646 CHECK_NUMBER (Vx_mode_pointer_shape
, 0);
647 mode_cursor
= XCreateFontCursor (x_current_display
,
648 XINT (Vx_mode_pointer_shape
));
651 mode_cursor
= XCreateFontCursor (x_current_display
, XC_xterm
);
653 /* Check and report errors with the above calls. */
654 x_check_errors ("can't set cursor shape: %s");
658 XColor fore_color
, back_color
;
660 fore_color
.pixel
= f
->display
.x
->mouse_pixel
;
661 back_color
.pixel
= mask_color
;
662 XQueryColor (x_current_display
,
663 DefaultColormap (x_current_display
,
664 DefaultScreen (x_current_display
)),
666 XQueryColor (x_current_display
,
667 DefaultColormap (x_current_display
,
668 DefaultScreen (x_current_display
)),
670 XRecolorCursor (x_current_display
, cursor
,
671 &fore_color
, &back_color
);
672 XRecolorCursor (x_current_display
, nontext_cursor
,
673 &fore_color
, &back_color
);
674 XRecolorCursor (x_current_display
, mode_cursor
,
675 &fore_color
, &back_color
);
678 cursor
= XCreateCursor (16, 16, MouseCursor
, MouseMask
,
680 f
->display
.x
->mouse_pixel
,
681 f
->display
.x
->background_pixel
,
685 if (FRAME_X_WINDOW (f
) != 0)
687 XDefineCursor (XDISPLAY
FRAME_X_WINDOW (f
), cursor
);
690 if (cursor
!= f
->display
.x
->text_cursor
&& f
->display
.x
->text_cursor
!= 0)
691 XFreeCursor (XDISPLAY f
->display
.x
->text_cursor
);
692 f
->display
.x
->text_cursor
= cursor
;
694 if (nontext_cursor
!= f
->display
.x
->nontext_cursor
695 && f
->display
.x
->nontext_cursor
!= 0)
696 XFreeCursor (XDISPLAY f
->display
.x
->nontext_cursor
);
697 f
->display
.x
->nontext_cursor
= nontext_cursor
;
699 if (mode_cursor
!= f
->display
.x
->modeline_cursor
700 && f
->display
.x
->modeline_cursor
!= 0)
701 XFreeCursor (XDISPLAY f
->display
.x
->modeline_cursor
);
702 f
->display
.x
->modeline_cursor
= mode_cursor
;
703 #endif /* HAVE_X11 */
710 x_set_cursor_color (f
, arg
, oldval
)
712 Lisp_Object arg
, oldval
;
714 unsigned long fore_pixel
;
716 if (!EQ (Vx_cursor_fore_pixel
, Qnil
))
717 fore_pixel
= x_decode_color (Vx_cursor_fore_pixel
, WHITE_PIX_DEFAULT
);
719 fore_pixel
= f
->display
.x
->background_pixel
;
720 f
->display
.x
->cursor_pixel
= x_decode_color (arg
, BLACK_PIX_DEFAULT
);
722 /* Make sure that the cursor color differs from the background color. */
723 if (f
->display
.x
->cursor_pixel
== f
->display
.x
->background_pixel
)
725 f
->display
.x
->cursor_pixel
== f
->display
.x
->mouse_pixel
;
726 if (f
->display
.x
->cursor_pixel
== fore_pixel
)
727 fore_pixel
= f
->display
.x
->background_pixel
;
730 if (FRAME_X_WINDOW (f
) != 0)
734 XSetBackground (x_current_display
, f
->display
.x
->cursor_gc
,
735 f
->display
.x
->cursor_pixel
);
736 XSetForeground (x_current_display
, f
->display
.x
->cursor_gc
,
739 #endif /* HAVE_X11 */
741 if (FRAME_VISIBLE_P (f
))
743 x_display_cursor (f
, 0);
744 x_display_cursor (f
, 1);
749 /* Set the border-color of frame F to value described by ARG.
750 ARG can be a string naming a color.
751 The border-color is used for the border that is drawn by the X server.
752 Note that this does not fully take effect if done before
753 F has an x-window; it must be redone when the window is created.
755 Note: this is done in two routines because of the way X10 works.
757 Note: under X11, this is normally the province of the window manager,
758 and so emacs' border colors may be overridden. */
761 x_set_border_color (f
, arg
, oldval
)
763 Lisp_Object arg
, oldval
;
768 CHECK_STRING (arg
, 0);
769 str
= XSTRING (arg
)->data
;
772 if (!strcmp (str
, "grey") || !strcmp (str
, "Grey")
773 || !strcmp (str
, "gray") || !strcmp (str
, "Gray"))
778 pix
= x_decode_color (arg
, BLACK_PIX_DEFAULT
);
780 x_set_border_pixel (f
, pix
);
783 /* Set the border-color of frame F to pixel value PIX.
784 Note that this does not fully take effect if done before
785 F has an x-window. */
787 x_set_border_pixel (f
, pix
)
791 f
->display
.x
->border_pixel
= pix
;
793 if (FRAME_X_WINDOW (f
) != 0 && f
->display
.x
->border_width
> 0)
800 XSetWindowBorder (x_current_display
, FRAME_X_WINDOW (f
),
804 temp
= XMakePixmap ((Bitmap
) XStoreBitmap (gray_width
, gray_height
,
806 BLACK_PIX_DEFAULT
, WHITE_PIX_DEFAULT
);
808 temp
= XMakeTile (pix
);
809 XChangeBorder (FRAME_X_WINDOW (f
), temp
);
810 XFreePixmap (XDISPLAY temp
);
811 #endif /* not HAVE_X11 */
814 if (FRAME_VISIBLE_P (f
))
820 x_set_cursor_type (f
, arg
, oldval
)
822 Lisp_Object arg
, oldval
;
825 FRAME_DESIRED_CURSOR (f
) = bar_cursor
;
826 else if (EQ (arg
, Qbox
))
827 FRAME_DESIRED_CURSOR (f
) = filled_box_cursor
;
830 ("the `cursor-type' frame parameter should be either `bar' or `box'");
832 /* Make sure the cursor gets redrawn. This is overkill, but how
833 often do people change cursor types? */
838 x_set_icon_type (f
, arg
, oldval
)
840 Lisp_Object arg
, oldval
;
845 if (EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
850 result
= x_text_icon (f
, 0);
852 result
= x_bitmap_icon (f
);
857 error ("No icon window available.");
860 /* If the window was unmapped (and its icon was mapped),
861 the new icon is not mapped, so map the window in its stead. */
862 if (FRAME_VISIBLE_P (f
))
863 XMapWindow (XDISPLAY
FRAME_X_WINDOW (f
));
870 x_set_font (f
, arg
, oldval
)
872 Lisp_Object arg
, oldval
;
877 CHECK_STRING (arg
, 1);
878 name
= XSTRING (arg
)->data
;
881 result
= x_new_font (f
, name
);
885 error ("Font \"%s\" is not defined", name
);
889 x_set_border_width (f
, arg
, oldval
)
891 Lisp_Object arg
, oldval
;
893 CHECK_NUMBER (arg
, 0);
895 if (XINT (arg
) == f
->display
.x
->border_width
)
898 if (FRAME_X_WINDOW (f
) != 0)
899 error ("Cannot change the border width of a window");
901 f
->display
.x
->border_width
= XINT (arg
);
905 x_set_internal_border_width (f
, arg
, oldval
)
907 Lisp_Object arg
, oldval
;
910 int old
= f
->display
.x
->internal_border_width
;
912 CHECK_NUMBER (arg
, 0);
913 f
->display
.x
->internal_border_width
= XINT (arg
);
914 if (f
->display
.x
->internal_border_width
< 0)
915 f
->display
.x
->internal_border_width
= 0;
917 if (f
->display
.x
->internal_border_width
== old
)
920 if (FRAME_X_WINDOW (f
) != 0)
923 x_set_window_size (f
, f
->width
, f
->height
);
925 x_set_resize_hint (f
);
929 SET_FRAME_GARBAGED (f
);
933 void x_user_set_name (f
, arg
, oldval
)
935 Lisp_Object arg
, oldval
;
939 /* Change the name of frame F to ARG. If ARG is nil, set F's name to
942 If EXPLICIT is non-zero, that indicates that lisp code is setting the
943 name; if ARG is a string, set F's name to ARG and set
944 F->explicit_name; if ARG is Qnil, then clear F->explicit_name.
946 If EXPLICIT is zero, that indicates that Emacs redisplay code is
947 suggesting a new name, which lisp code should override; if
948 F->explicit_name is set, ignore the new name; otherwise, set it. */
951 x_set_name (f
, name
, explicit)
956 /* Make sure that requests from lisp code override requests from
957 Emacs redisplay code. */
960 /* If we're switching from explicit to implicit, we had better
961 update the mode lines and thereby update the title. */
962 if (f
->explicit_name
&& NILP (name
))
963 update_mode_lines
= 1;
965 f
->explicit_name
= ! NILP (name
);
967 else if (f
->explicit_name
)
970 /* If NAME is nil, set the name to the x_id_name. */
972 name
= build_string (x_id_name
);
974 CHECK_STRING (name
, 0);
976 /* Don't change the name if it's already NAME. */
977 if (! NILP (Fstring_equal (name
, f
->name
)))
980 if (FRAME_X_WINDOW (f
))
987 text
.value
= XSTRING (name
)->data
;
988 text
.encoding
= XA_STRING
;
990 text
.nitems
= XSTRING (name
)->size
;
991 XSetWMName (x_current_display
, FRAME_X_WINDOW (f
), &text
);
992 XSetWMIconName (x_current_display
, FRAME_X_WINDOW (f
), &text
);
995 XSetIconName (XDISPLAY
FRAME_X_WINDOW (f
),
996 XSTRING (name
)->data
);
997 XStoreName (XDISPLAY
FRAME_X_WINDOW (f
),
998 XSTRING (name
)->data
);
1007 /* This function should be called when the user's lisp code has
1008 specified a name for the frame; the name will override any set by the
1011 x_explicitly_set_name (f
, arg
, oldval
)
1013 Lisp_Object arg
, oldval
;
1015 x_set_name (f
, arg
, 1);
1018 /* This function should be called by Emacs redisplay code to set the
1019 name; names set this way will never override names set by the user's
1022 x_implicitly_set_name (f
, arg
, oldval
)
1024 Lisp_Object arg
, oldval
;
1026 x_set_name (f
, arg
, 0);
1030 x_set_autoraise (f
, arg
, oldval
)
1032 Lisp_Object arg
, oldval
;
1034 f
->auto_raise
= !EQ (Qnil
, arg
);
1038 x_set_autolower (f
, arg
, oldval
)
1040 Lisp_Object arg
, oldval
;
1042 f
->auto_lower
= !EQ (Qnil
, arg
);
1046 x_set_vertical_scroll_bars (f
, arg
, oldval
)
1048 Lisp_Object arg
, oldval
;
1050 if (NILP (arg
) != ! FRAME_HAS_VERTICAL_SCROLL_BARS (f
))
1052 FRAME_HAS_VERTICAL_SCROLL_BARS (f
) = ! NILP (arg
);
1054 /* We set this parameter before creating the X window for the
1055 frame, so we can get the geometry right from the start.
1056 However, if the window hasn't been created yet, we shouldn't
1057 call x_set_window_size. */
1058 if (FRAME_X_WINDOW (f
))
1059 x_set_window_size (f
, FRAME_WIDTH (f
), FRAME_HEIGHT (f
));
1067 /* I believe this function is obsolete with respect to the new face display
1069 x_set_face (scr
, font
, background
, foreground
, stipple
)
1072 unsigned long background
, foreground
;
1075 XGCValues gc_values
;
1077 unsigned long gc_mask
;
1078 struct face
*new_face
;
1079 unsigned int width
= 16;
1080 unsigned int height
= 16;
1082 if (n_faces
== MAX_FACES_AND_GLYPHS
)
1085 /* Create the Graphics Context. */
1086 gc_values
.font
= font
->fid
;
1087 gc_values
.foreground
= foreground
;
1088 gc_values
.background
= background
;
1089 gc_values
.line_width
= 0;
1090 gc_mask
= GCLineWidth
| GCFont
| GCForeground
| GCBackground
;
1094 = XCreateBitmapFromData (x_current_display
, ROOT_WINDOW
,
1095 (char *) stipple
, width
, height
);
1096 gc_mask
|= GCStipple
;
1099 temp_gc
= XCreateGC (x_current_display
, FRAME_X_WINDOW (scr
),
1100 gc_mask
, &gc_values
);
1103 new_face
= (struct face
*) xmalloc (sizeof (struct face
));
1106 XFreeGC (x_current_display
, temp_gc
);
1110 new_face
->font
= font
;
1111 new_face
->foreground
= foreground
;
1112 new_face
->background
= background
;
1113 new_face
->face_gc
= temp_gc
;
1115 new_face
->stipple
= gc_values
.stipple
;
1117 x_face_table
[++n_faces
] = new_face
;
1122 x_set_glyph (scr
, glyph
)
1127 DEFUN ("x-set-face-font", Fx_set_face_font
, Sx_set_face_font
, 4, 2, 0,
1128 "Specify face table entry FACE-CODE to be the font named by FONT,\n\
1129 in colors FOREGROUND and BACKGROUND.")
1130 (face_code
, font_name
, foreground
, background
)
1131 Lisp_Object face_code
;
1132 Lisp_Object font_name
;
1133 Lisp_Object foreground
;
1134 Lisp_Object background
;
1136 register struct face
*fp
; /* Current face info. */
1137 register int fn
; /* Face number. */
1138 register FONT_TYPE
*f
; /* Font data structure. */
1139 unsigned char *newname
;
1142 XGCValues gc_values
;
1144 /* Need to do something about this. */
1145 Drawable drawable
= FRAME_X_WINDOW (selected_frame
);
1147 CHECK_NUMBER (face_code
, 1);
1148 CHECK_STRING (font_name
, 2);
1150 if (EQ (foreground
, Qnil
) || EQ (background
, Qnil
))
1152 fg
= selected_frame
->display
.x
->foreground_pixel
;
1153 bg
= selected_frame
->display
.x
->background_pixel
;
1157 CHECK_NUMBER (foreground
, 0);
1158 CHECK_NUMBER (background
, 1);
1160 fg
= x_decode_color (XINT (foreground
), BLACK_PIX_DEFAULT
);
1161 bg
= x_decode_color (XINT (background
), WHITE_PIX_DEFAULT
);
1164 fn
= XINT (face_code
);
1165 if ((fn
< 1) || (fn
> 255))
1166 error ("Invalid face code, %d", fn
);
1168 newname
= XSTRING (font_name
)->data
;
1170 f
= (*newname
== 0 ? 0 : XGetFont (newname
));
1173 error ("Font \"%s\" is not defined", newname
);
1175 fp
= x_face_table
[fn
];
1178 x_face_table
[fn
] = fp
= (struct face
*) xmalloc (sizeof (struct face
));
1179 bzero (fp
, sizeof (struct face
));
1180 fp
->face_type
= x_pixmap
;
1182 else if (FACE_IS_FONT (fn
))
1185 XFreeGC (FACE_FONT (fn
));
1188 else if (FACE_IS_IMAGE (fn
)) /* This should not happen... */
1191 XFreePixmap (x_current_display
, FACE_IMAGE (fn
));
1192 fp
->face_type
= x_font
;
1198 fp
->face_GLYPH
.font_desc
.font
= f
;
1199 gc_values
.font
= f
->fid
;
1200 gc_values
.foreground
= fg
;
1201 gc_values
.background
= bg
;
1202 fp
->face_GLYPH
.font_desc
.face_gc
= XCreateGC (x_current_display
,
1203 drawable
, GCFont
| GCForeground
1204 | GCBackground
, &gc_values
);
1205 fp
->face_GLYPH
.font_desc
.font_width
= FONT_WIDTH (f
);
1206 fp
->face_GLYPH
.font_desc
.font_height
= FONT_HEIGHT (f
);
1212 DEFUN ("x-set-face", Fx_set_face
, Sx_set_face
, 4, 4, 0,
1213 "Specify face table entry FACE-CODE to be the font named by FONT,\n\
1214 in colors FOREGROUND and BACKGROUND.")
1215 (face_code
, font_name
, foreground
, background
)
1216 Lisp_Object face_code
;
1217 Lisp_Object font_name
;
1218 Lisp_Object foreground
;
1219 Lisp_Object background
;
1221 register struct face
*fp
; /* Current face info. */
1222 register int fn
; /* Face number. */
1223 register FONT_TYPE
*f
; /* Font data structure. */
1224 unsigned char *newname
;
1226 CHECK_NUMBER (face_code
, 1);
1227 CHECK_STRING (font_name
, 2);
1229 fn
= XINT (face_code
);
1230 if ((fn
< 1) || (fn
> 255))
1231 error ("Invalid face code, %d", fn
);
1233 /* Ask the server to find the specified font. */
1234 newname
= XSTRING (font_name
)->data
;
1236 f
= (*newname
== 0 ? 0 : XGetFont (newname
));
1239 error ("Font \"%s\" is not defined", newname
);
1241 /* Get the face structure for face_code in the face table.
1242 Make sure it exists. */
1243 fp
= x_face_table
[fn
];
1246 x_face_table
[fn
] = fp
= (struct face
*) xmalloc (sizeof (struct face
));
1247 bzero (fp
, sizeof (struct face
));
1250 /* If this face code already exists, get rid of the old font. */
1251 if (fp
->font
!= 0 && fp
->font
!= f
)
1254 XLoseFont (fp
->font
);
1258 /* Store the specified information in FP. */
1259 fp
->fg
= x_decode_color (foreground
, BLACK_PIX_DEFAULT
);
1260 fp
->bg
= x_decode_color (background
, WHITE_PIX_DEFAULT
);
1268 /* This is excluded because there is no painless way
1269 to get or to remember the name of the font. */
1271 DEFUN ("x-get-face", Fx_get_face
, Sx_get_face
, 1, 1, 0,
1272 "Get data defining face code FACE. FACE is an integer.\n\
1273 The value is a list (FONT FG-COLOR BG-COLOR).")
1277 register struct face
*fp
; /* Current face info. */
1278 register int fn
; /* Face number. */
1280 CHECK_NUMBER (face
, 1);
1282 if ((fn
< 1) || (fn
> 255))
1283 error ("Invalid face code, %d", fn
);
1285 /* Make sure the face table exists and this face code is defined. */
1286 if (x_face_table
== 0 || x_face_table
[fn
] == 0)
1289 fp
= x_face_table
[fn
];
1291 return Fcons (build_string (fp
->name
),
1292 Fcons (make_number (fp
->fg
),
1293 Fcons (make_number (fp
->bg
), Qnil
)));
1297 /* Subroutines of creating an X frame. */
1300 extern char *x_get_string_resource ();
1301 extern XrmDatabase
x_load_resources ();
1303 DEFUN ("x-get-resource", Fx_get_resource
, Sx_get_resource
, 2, 4, 0,
1304 "Return the value of ATTRIBUTE, of class CLASS, from the X defaults database.\n\
1305 This uses `INSTANCE.ATTRIBUTE' as the key and `Emacs.CLASS' as the\n\
1306 class, where INSTANCE is the name under which Emacs was invoked.\n\
1308 The optional arguments COMPONENT and SUBCLASS add to the key and the\n\
1309 class, respectively. You must specify both of them or neither.\n\
1310 If you specify them, the key is `INSTANCE.COMPONENT.ATTRIBUTE'\n\
1311 and the class is `Emacs.CLASS.SUBCLASS'.")
1312 (attribute
, class, component
, subclass
)
1313 Lisp_Object attribute
, class, component
, subclass
;
1315 register char *value
;
1319 CHECK_STRING (attribute
, 0);
1320 CHECK_STRING (class, 0);
1322 if (!NILP (component
))
1323 CHECK_STRING (component
, 1);
1324 if (!NILP (subclass
))
1325 CHECK_STRING (subclass
, 2);
1326 if (NILP (component
) != NILP (subclass
))
1327 error ("x-get-resource: must specify both COMPONENT and SUBCLASS or neither");
1329 if (NILP (component
))
1331 /* Allocate space for the components, the dots which separate them,
1332 and the final '\0'. */
1333 name_key
= (char *) alloca (XSTRING (invocation_name
)->size
1334 + XSTRING (attribute
)->size
1336 class_key
= (char *) alloca ((sizeof (EMACS_CLASS
) - 1)
1337 + XSTRING (class)->size
1340 sprintf (name_key
, "%s.%s",
1341 XSTRING (invocation_name
)->data
,
1342 XSTRING (attribute
)->data
);
1343 sprintf (class_key
, "%s.%s",
1345 XSTRING (class)->data
);
1349 name_key
= (char *) alloca (XSTRING (invocation_name
)->size
1350 + XSTRING (component
)->size
1351 + XSTRING (attribute
)->size
1354 class_key
= (char *) alloca ((sizeof (EMACS_CLASS
) - 1)
1355 + XSTRING (class)->size
1356 + XSTRING (subclass
)->size
1359 sprintf (name_key
, "%s.%s.%s",
1360 XSTRING (invocation_name
)->data
,
1361 XSTRING (component
)->data
,
1362 XSTRING (attribute
)->data
);
1363 sprintf (class_key
, "%s.%s",
1365 XSTRING (class)->data
,
1366 XSTRING (subclass
)->data
);
1369 value
= x_get_string_resource (xrdb
, name_key
, class_key
);
1371 if (value
!= (char *) 0)
1372 return build_string (value
);
1379 DEFUN ("x-get-default", Fx_get_default
, Sx_get_default
, 1, 1, 0,
1380 "Get X default ATTRIBUTE from the system, or nil if no default.\n\
1381 Value is a string (when not nil) and ATTRIBUTE is also a string.\n\
1382 The defaults are specified in the file `~/.Xdefaults'.")
1386 register unsigned char *value
;
1388 CHECK_STRING (arg
, 1);
1390 value
= (unsigned char *) XGetDefault (XDISPLAY
1391 XSTRING (invocation_name
)->data
,
1392 XSTRING (arg
)->data
);
1394 /* Try reversing last two args, in case this is the buggy version of X. */
1395 value
= (unsigned char *) XGetDefault (XDISPLAY
1396 XSTRING (arg
)->data
,
1397 XSTRING (invocation_name
)->data
);
1399 return build_string (value
);
1404 #define Fx_get_resource(attribute, class, component, subclass) \
1405 Fx_get_default(attribute)
1409 /* Types we might convert a resource string into. */
1412 number
, boolean
, string
, symbol
,
1415 /* Return the value of parameter PARAM.
1417 First search ALIST, then Vdefault_frame_alist, then the X defaults
1418 database, using ATTRIBUTE as the attribute name and CLASS as its class.
1420 Convert the resource to the type specified by desired_type.
1422 If no default is specified, return Qunbound. If you call
1423 x_get_arg, make sure you deal with Qunbound in a reasonable way,
1424 and don't let it get stored in any lisp-visible variables! */
1427 x_get_arg (alist
, param
, attribute
, class, type
)
1428 Lisp_Object alist
, param
;
1431 enum resource_types type
;
1433 register Lisp_Object tem
;
1435 tem
= Fassq (param
, alist
);
1437 tem
= Fassq (param
, Vdefault_frame_alist
);
1443 tem
= Fx_get_resource (build_string (attribute
),
1444 build_string (class),
1453 return make_number (atoi (XSTRING (tem
)->data
));
1456 tem
= Fdowncase (tem
);
1457 if (!strcmp (XSTRING (tem
)->data
, "on")
1458 || !strcmp (XSTRING (tem
)->data
, "true"))
1467 return intern (tem
);
1479 /* Record in frame F the specified or default value according to ALIST
1480 of the parameter named PARAM (a Lisp symbol).
1481 If no value is specified for PARAM, look for an X default for XPROP
1482 on the frame named NAME.
1483 If that is not found either, use the value DEFLT. */
1486 x_default_parameter (f
, alist
, prop
, deflt
, xprop
, xclass
, type
)
1493 enum resource_types type
;
1497 tem
= x_get_arg (alist
, prop
, xprop
, xclass
, type
);
1498 if (EQ (tem
, Qunbound
))
1500 x_set_frame_parameters (f
, Fcons (Fcons (prop
, tem
), Qnil
));
1504 DEFUN ("x-geometry", Fx_geometry
, Sx_geometry
, 1, 1, 0,
1505 "Parse an X-style geometry string STRING.\n\
1506 Returns an alist of the form ((top . TOP), (left . LEFT) ... ).")
1511 unsigned int width
, height
;
1512 Lisp_Object values
[4];
1514 CHECK_STRING (string
, 0);
1516 geometry
= XParseGeometry ((char *) XSTRING (string
)->data
,
1517 &x
, &y
, &width
, &height
);
1519 switch (geometry
& 0xf) /* Mask out {X,Y}Negative */
1521 case (XValue
| YValue
):
1522 /* What's one pixel among friends?
1523 Perhaps fix this some day by returning symbol `extreme-top'... */
1524 if (x
== 0 && (geometry
& XNegative
))
1526 if (y
== 0 && (geometry
& YNegative
))
1528 values
[0] = Fcons (Qleft
, make_number (x
));
1529 values
[1] = Fcons (Qtop
, make_number (y
));
1530 return Flist (2, values
);
1533 case (WidthValue
| HeightValue
):
1534 values
[0] = Fcons (Qwidth
, make_number (width
));
1535 values
[1] = Fcons (Qheight
, make_number (height
));
1536 return Flist (2, values
);
1539 case (XValue
| YValue
| WidthValue
| HeightValue
):
1540 if (x
== 0 && (geometry
& XNegative
))
1542 if (y
== 0 && (geometry
& YNegative
))
1544 values
[0] = Fcons (Qwidth
, make_number (width
));
1545 values
[1] = Fcons (Qheight
, make_number (height
));
1546 values
[2] = Fcons (Qleft
, make_number (x
));
1547 values
[3] = Fcons (Qtop
, make_number (y
));
1548 return Flist (4, values
);
1555 error ("Must specify x and y value, and/or width and height");
1560 /* Calculate the desired size and position of this window,
1561 or set rubber-band prompting if none. */
1563 #define DEFAULT_ROWS 40
1564 #define DEFAULT_COLS 80
1567 x_figure_window_size (f
, parms
)
1571 register Lisp_Object tem0
, tem1
;
1572 int height
, width
, left
, top
;
1573 register int geometry
;
1574 long window_prompting
= 0;
1576 /* Default values if we fall through.
1577 Actually, if that happens we should get
1578 window manager prompting. */
1579 f
->width
= DEFAULT_COLS
;
1580 f
->height
= DEFAULT_ROWS
;
1581 f
->display
.x
->top_pos
= 1;
1582 f
->display
.x
->left_pos
= 1;
1584 tem0
= x_get_arg (parms
, Qheight
, 0, 0, number
);
1585 tem1
= x_get_arg (parms
, Qwidth
, 0, 0, number
);
1586 if (! EQ (tem0
, Qunbound
) && ! EQ (tem1
, Qunbound
))
1588 CHECK_NUMBER (tem0
, 0);
1589 CHECK_NUMBER (tem1
, 0);
1590 f
->height
= XINT (tem0
);
1591 f
->width
= XINT (tem1
);
1592 window_prompting
|= USSize
;
1594 else if (! EQ (tem0
, Qunbound
) || ! EQ (tem1
, Qunbound
))
1595 error ("Must specify *both* height and width");
1597 f
->display
.x
->vertical_scroll_bar_extra
=
1598 (FRAME_HAS_VERTICAL_SCROLL_BARS (f
)
1599 ? VERTICAL_SCROLL_BAR_PIXEL_WIDTH (f
)
1601 f
->display
.x
->pixel_width
= CHAR_TO_PIXEL_WIDTH (f
, f
->width
);
1602 f
->display
.x
->pixel_height
= CHAR_TO_PIXEL_HEIGHT (f
, f
->height
);
1604 tem0
= x_get_arg (parms
, Qtop
, 0, 0, number
);
1605 tem1
= x_get_arg (parms
, Qleft
, 0, 0, number
);
1606 if (! EQ (tem0
, Qunbound
) && ! EQ (tem1
, Qunbound
))
1608 CHECK_NUMBER (tem0
, 0);
1609 CHECK_NUMBER (tem1
, 0);
1610 f
->display
.x
->top_pos
= XINT (tem0
);
1611 f
->display
.x
->left_pos
= XINT (tem1
);
1612 x_calc_absolute_position (f
);
1613 window_prompting
|= USPosition
;
1615 else if (! EQ (tem0
, Qunbound
) || ! EQ (tem1
, Qunbound
))
1616 error ("Must specify *both* top and left corners");
1618 switch (window_prompting
)
1620 case USSize
| USPosition
:
1621 return window_prompting
;
1624 case USSize
: /* Got the size, need the position. */
1625 window_prompting
|= PPosition
;
1626 return window_prompting
;
1629 case USPosition
: /* Got the position, need the size. */
1630 window_prompting
|= PSize
;
1631 return window_prompting
;
1634 case 0: /* Got nothing, take both from geometry. */
1635 window_prompting
|= PPosition
| PSize
;
1636 return window_prompting
;
1640 /* Somehow a bit got set in window_prompting that we didn't
1650 XSetWindowAttributes attributes
;
1651 unsigned long attribute_mask
;
1652 XClassHint class_hints
;
1654 attributes
.background_pixel
= f
->display
.x
->background_pixel
;
1655 attributes
.border_pixel
= f
->display
.x
->border_pixel
;
1656 attributes
.bit_gravity
= StaticGravity
;
1657 attributes
.backing_store
= NotUseful
;
1658 attributes
.save_under
= True
;
1659 attributes
.event_mask
= STANDARD_EVENT_SET
;
1660 attribute_mask
= (CWBackPixel
| CWBorderPixel
| CWBitGravity
1662 | CWBackingStore
| CWSaveUnder
1668 = XCreateWindow (x_current_display
, ROOT_WINDOW
,
1669 f
->display
.x
->left_pos
,
1670 f
->display
.x
->top_pos
,
1671 PIXEL_WIDTH (f
), PIXEL_HEIGHT (f
),
1672 f
->display
.x
->border_width
,
1673 CopyFromParent
, /* depth */
1674 InputOutput
, /* class */
1675 screen_visual
, /* set in Fx_open_connection */
1676 attribute_mask
, &attributes
);
1678 class_hints
.res_name
= (char *) XSTRING (f
->name
)->data
;
1679 class_hints
.res_class
= EMACS_CLASS
;
1680 XSetClassHint (x_current_display
, FRAME_X_WINDOW (f
), &class_hints
);
1682 /* This indicates that we use the "Passive Input" input model.
1683 Unless we do this, we don't get the Focus{In,Out} events that we
1684 need to draw the cursor correctly. Accursed bureaucrats.
1685 XWhipsAndChains (x_current_display, IronMaiden, &TheRack); */
1687 f
->display
.x
->wm_hints
.input
= True
;
1688 f
->display
.x
->wm_hints
.flags
|= InputHint
;
1689 XSetWMHints (x_current_display
, FRAME_X_WINDOW (f
), &f
->display
.x
->wm_hints
);
1691 /* x_set_name normally ignores requests to set the name if the
1692 requested name is the same as the current name. This is the one
1693 place where that assumption isn't correct; f->name is set, but
1694 the X server hasn't been told. */
1696 Lisp_Object name
= f
->name
;
1697 int explicit = f
->explicit_name
;
1700 f
->explicit_name
= 0;
1701 x_set_name (f
, name
, explicit);
1704 XDefineCursor (XDISPLAY
FRAME_X_WINDOW (f
),
1705 f
->display
.x
->text_cursor
);
1708 if (FRAME_X_WINDOW (f
) == 0)
1709 error ("Unable to create window.");
1712 /* Handle the icon stuff for this window. Perhaps later we might
1713 want an x_set_icon_position which can be called interactively as
1721 Lisp_Object icon_x
, icon_y
;
1723 /* Set the position of the icon. Note that twm groups all
1724 icons in an icon window. */
1725 icon_x
= x_get_arg (parms
, Qicon_left
, 0, 0, number
);
1726 icon_y
= x_get_arg (parms
, Qicon_top
, 0, 0, number
);
1727 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
1729 CHECK_NUMBER (icon_x
, 0);
1730 CHECK_NUMBER (icon_y
, 0);
1732 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
1733 error ("Both left and top icon corners of icon must be specified");
1737 if (! EQ (icon_x
, Qunbound
))
1738 x_wm_set_icon_position (f
, XINT (icon_x
), XINT (icon_y
));
1740 /* Start up iconic or window? */
1741 x_wm_set_window_state (f
,
1742 (EQ (x_get_arg (parms
, Qiconic_startup
,
1751 /* Make the GC's needed for this window, setting the
1752 background, border and mouse colors; also create the
1753 mouse cursor and the gray border tile. */
1755 static char cursor_bits
[] =
1757 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1758 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1759 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1760 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
1767 XGCValues gc_values
;
1771 /* Create the GC's of this frame.
1772 Note that many default values are used. */
1775 gc_values
.font
= f
->display
.x
->font
->fid
;
1776 gc_values
.foreground
= f
->display
.x
->foreground_pixel
;
1777 gc_values
.background
= f
->display
.x
->background_pixel
;
1778 gc_values
.line_width
= 0; /* Means 1 using fast algorithm. */
1779 f
->display
.x
->normal_gc
= XCreateGC (x_current_display
,
1781 GCLineWidth
| GCFont
1782 | GCForeground
| GCBackground
,
1785 /* Reverse video style. */
1786 gc_values
.foreground
= f
->display
.x
->background_pixel
;
1787 gc_values
.background
= f
->display
.x
->foreground_pixel
;
1788 f
->display
.x
->reverse_gc
= XCreateGC (x_current_display
,
1790 GCFont
| GCForeground
| GCBackground
1794 /* Cursor has cursor-color background, background-color foreground. */
1795 gc_values
.foreground
= f
->display
.x
->background_pixel
;
1796 gc_values
.background
= f
->display
.x
->cursor_pixel
;
1797 gc_values
.fill_style
= FillOpaqueStippled
;
1799 = XCreateBitmapFromData (x_current_display
, ROOT_WINDOW
,
1800 cursor_bits
, 16, 16);
1801 f
->display
.x
->cursor_gc
1802 = XCreateGC (x_current_display
, FRAME_X_WINDOW (f
),
1803 (GCFont
| GCForeground
| GCBackground
1804 | GCFillStyle
| GCStipple
| GCLineWidth
),
1807 /* Create the gray border tile used when the pointer is not in
1808 the frame. Since this depends on the frame's pixel values,
1809 this must be done on a per-frame basis. */
1810 f
->display
.x
->border_tile
=
1811 XCreatePixmapFromBitmapData
1812 (x_current_display
, ROOT_WINDOW
,
1813 gray_bits
, gray_width
, gray_height
,
1814 f
->display
.x
->foreground_pixel
,
1815 f
->display
.x
->background_pixel
,
1816 DefaultDepth (x_current_display
, XDefaultScreen (x_current_display
)));
1818 #endif /* HAVE_X11 */
1820 DEFUN ("x-create-frame", Fx_create_frame
, Sx_create_frame
,
1822 "Make a new X window, which is called a \"frame\" in Emacs terms.\n\
1823 Return an Emacs frame object representing the X window.\n\
1824 ALIST is an alist of frame parameters.\n\
1825 If the parameters specify that the frame should not have a minibuffer,\n\
1826 and do not specify a specific minibuffer window to use,\n\
1827 then `default-minibuffer-frame' must be a frame whose minibuffer can\n\
1828 be shared by the new frame.")
1834 Lisp_Object frame
, tem
;
1836 int minibuffer_only
= 0;
1837 long window_prompting
= 0;
1840 if (x_current_display
== 0)
1841 error ("X windows are not in use or not initialized");
1843 name
= x_get_arg (parms
, Qname
, "title", "Title", string
);
1844 if (XTYPE (name
) != Lisp_String
1845 && ! EQ (name
, Qunbound
)
1847 error ("x-create-frame: name parameter must be a string");
1849 tem
= x_get_arg (parms
, Qminibuffer
, 0, 0, symbol
);
1850 if (EQ (tem
, Qnone
) || NILP (tem
))
1851 f
= make_frame_without_minibuffer (Qnil
);
1852 else if (EQ (tem
, Qonly
))
1854 f
= make_minibuffer_frame ();
1855 minibuffer_only
= 1;
1857 else if (XTYPE (tem
) == Lisp_Window
)
1858 f
= make_frame_without_minibuffer (tem
);
1862 /* Note that X Windows does support scroll bars. */
1863 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 1;
1865 /* Set the name; the functions to which we pass f expect the name to
1867 if (EQ (name
, Qunbound
) || NILP (name
))
1869 f
->name
= build_string (x_id_name
);
1870 f
->explicit_name
= 0;
1875 f
->explicit_name
= 1;
1878 XSET (frame
, Lisp_Frame
, f
);
1879 f
->output_method
= output_x_window
;
1880 f
->display
.x
= (struct x_display
*) xmalloc (sizeof (struct x_display
));
1881 bzero (f
->display
.x
, sizeof (struct x_display
));
1883 /* Note that the frame has no physical cursor right now. */
1884 f
->phys_cursor_x
= -1;
1886 /* Extract the window parameters from the supplied values
1887 that are needed to determine window geometry. */
1888 x_default_parameter (f
, parms
, Qfont
, build_string ("9x15"),
1889 "font", "Font", string
);
1890 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
1891 "borderwidth", "BorderWidth", number
);
1892 /* This defaults to 2 in order to match xterm. */
1893 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (2),
1894 "internalBorderWidth", "BorderWidth", number
);
1895 x_default_parameter (f
, parms
, Qvertical_scroll_bars
, Qt
,
1896 "verticalScrollBars", "ScrollBars", boolean
);
1898 /* Also do the stuff which must be set before the window exists. */
1899 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
1900 "foreground", "Foreground", string
);
1901 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
1902 "background", "Background", string
);
1903 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
1904 "pointerColor", "Foreground", string
);
1905 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
1906 "cursorColor", "Foreground", string
);
1907 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
1908 "borderColor", "BorderColor", string
);
1910 f
->display
.x
->parent_desc
= ROOT_WINDOW
;
1911 window_prompting
= x_figure_window_size (f
, parms
);
1917 /* We need to do this after creating the X window, so that the
1918 icon-creation functions can say whose icon they're describing. */
1919 x_default_parameter (f
, parms
, Qicon_type
, Qnil
,
1920 "iconType", "IconType", symbol
);
1922 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
1923 "autoRaise", "AutoRaiseLower", boolean
);
1924 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
1925 "autoLower", "AutoRaiseLower", boolean
);
1926 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
1927 "cursorType", "CursorType", symbol
);
1929 /* Dimensions, especially f->height, must be done via change_frame_size.
1930 Change will not be effected unless different from the current
1934 f
->height
= f
->width
= 0;
1935 change_frame_size (f
, height
, width
, 1, 0);
1937 x_wm_set_size_hint (f
, window_prompting
);
1940 tem
= x_get_arg (parms
, Qunsplittable
, 0, 0, boolean
);
1941 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
1943 /* Make the window appear on the frame and enable display. */
1944 if (!EQ (x_get_arg (parms
, Qsuppress_initial_map
, 0, 0, boolean
), Qt
))
1945 x_make_frame_visible (f
);
1950 Lisp_Object frame
, tem
;
1952 int pixelwidth
, pixelheight
;
1957 int minibuffer_only
= 0;
1958 Lisp_Object vscroll
, hscroll
;
1960 if (x_current_display
== 0)
1961 error ("X windows are not in use or not initialized");
1963 name
= Fassq (Qname
, parms
);
1965 tem
= x_get_arg (parms
, Qminibuffer
, 0, 0, symbol
);
1966 if (EQ (tem
, Qnone
))
1967 f
= make_frame_without_minibuffer (Qnil
);
1968 else if (EQ (tem
, Qonly
))
1970 f
= make_minibuffer_frame ();
1971 minibuffer_only
= 1;
1973 else if (EQ (tem
, Qnil
) || EQ (tem
, Qunbound
))
1976 f
= make_frame_without_minibuffer (tem
);
1978 parent
= ROOT_WINDOW
;
1980 XSET (frame
, Lisp_Frame
, f
);
1981 f
->output_method
= output_x_window
;
1982 f
->display
.x
= (struct x_display
*) xmalloc (sizeof (struct x_display
));
1983 bzero (f
->display
.x
, sizeof (struct x_display
));
1985 /* Some temprorary default values for height and width. */
1988 f
->display
.x
->left_pos
= -1;
1989 f
->display
.x
->top_pos
= -1;
1991 /* Give the frame a default name (which may be overridden with PARMS). */
1993 strncpy (iconidentity
, ICONTAG
, MAXICID
);
1994 if (gethostname (&iconidentity
[sizeof (ICONTAG
) - 1],
1995 (MAXICID
- 1) - sizeof (ICONTAG
)))
1996 iconidentity
[sizeof (ICONTAG
) - 2] = '\0';
1997 f
->name
= build_string (iconidentity
);
1999 /* Extract some window parameters from the supplied values.
2000 These are the parameters that affect window geometry. */
2002 tem
= x_get_arg (parms
, Qfont
, "BodyFont", 0, string
);
2003 if (EQ (tem
, Qunbound
))
2004 tem
= build_string ("9x15");
2005 x_set_font (f
, tem
, Qnil
);
2006 x_default_parameter (f
, parms
, Qborder_color
,
2007 build_string ("black"), "Border", 0, string
);
2008 x_default_parameter (f
, parms
, Qbackground_color
,
2009 build_string ("white"), "Background", 0, string
);
2010 x_default_parameter (f
, parms
, Qforeground_color
,
2011 build_string ("black"), "Foreground", 0, string
);
2012 x_default_parameter (f
, parms
, Qmouse_color
,
2013 build_string ("black"), "Mouse", 0, string
);
2014 x_default_parameter (f
, parms
, Qcursor_color
,
2015 build_string ("black"), "Cursor", 0, string
);
2016 x_default_parameter (f
, parms
, Qborder_width
,
2017 make_number (2), "BorderWidth", 0, number
);
2018 x_default_parameter (f
, parms
, Qinternal_border_width
,
2019 make_number (4), "InternalBorderWidth", 0, number
);
2020 x_default_parameter (f
, parms
, Qauto_raise
,
2021 Qnil
, "AutoRaise", 0, boolean
);
2023 hscroll
= EQ (x_get_arg (parms
, Qhorizontal_scroll_bar
, 0, 0, boolean
), Qt
);
2024 vscroll
= EQ (x_get_arg (parms
, Qvertical_scroll_bar
, 0, 0, boolean
), Qt
);
2026 if (f
->display
.x
->internal_border_width
< 0)
2027 f
->display
.x
->internal_border_width
= 0;
2029 tem
= x_get_arg (parms
, Qwindow_id
, 0, 0, number
);
2030 if (!EQ (tem
, Qunbound
))
2032 WINDOWINFO_TYPE wininfo
;
2034 Window
*children
, root
;
2036 CHECK_NUMBER (tem
, 0);
2037 FRAME_X_WINDOW (f
) = (Window
) XINT (tem
);
2040 XGetWindowInfo (FRAME_X_WINDOW (f
), &wininfo
);
2041 XQueryTree (FRAME_X_WINDOW (f
), &parent
, &nchildren
, &children
);
2045 height
= PIXEL_TO_CHAR_HEIGHT (f
, wininfo
.height
);
2046 width
= PIXEL_TO_CHAR_WIDTH (f
, wininfo
.width
);
2047 f
->display
.x
->left_pos
= wininfo
.x
;
2048 f
->display
.x
->top_pos
= wininfo
.y
;
2049 FRAME_SET_VISIBILITY (f
, wininfo
.mapped
!= 0);
2050 f
->display
.x
->border_width
= wininfo
.bdrwidth
;
2051 f
->display
.x
->parent_desc
= parent
;
2055 tem
= x_get_arg (parms
, Qparent_id
, 0, 0, number
);
2056 if (!EQ (tem
, Qunbound
))
2058 CHECK_NUMBER (tem
, 0);
2059 parent
= (Window
) XINT (tem
);
2061 f
->display
.x
->parent_desc
= parent
;
2062 tem
= x_get_arg (parms
, Qheight
, 0, 0, number
);
2063 if (EQ (tem
, Qunbound
))
2065 tem
= x_get_arg (parms
, Qwidth
, 0, 0, number
);
2066 if (EQ (tem
, Qunbound
))
2068 tem
= x_get_arg (parms
, Qtop
, 0, 0, number
);
2069 if (EQ (tem
, Qunbound
))
2070 tem
= x_get_arg (parms
, Qleft
, 0, 0, number
);
2073 /* Now TEM is Qunbound if no edge or size was specified.
2074 In that case, we must do rubber-banding. */
2075 if (EQ (tem
, Qunbound
))
2077 tem
= x_get_arg (parms
, Qgeometry
, 0, 0, number
);
2079 &f
->display
.x
->left_pos
, &f
->display
.x
->top_pos
,
2081 (XTYPE (tem
) == Lisp_String
2082 ? (char *) XSTRING (tem
)->data
: ""),
2083 XSTRING (f
->name
)->data
,
2084 !NILP (hscroll
), !NILP (vscroll
));
2088 /* Here if at least one edge or size was specified.
2089 Demand that they all were specified, and use them. */
2090 tem
= x_get_arg (parms
, Qheight
, 0, 0, number
);
2091 if (EQ (tem
, Qunbound
))
2092 error ("Height not specified");
2093 CHECK_NUMBER (tem
, 0);
2094 height
= XINT (tem
);
2096 tem
= x_get_arg (parms
, Qwidth
, 0, 0, number
);
2097 if (EQ (tem
, Qunbound
))
2098 error ("Width not specified");
2099 CHECK_NUMBER (tem
, 0);
2102 tem
= x_get_arg (parms
, Qtop
, 0, 0, number
);
2103 if (EQ (tem
, Qunbound
))
2104 error ("Top position not specified");
2105 CHECK_NUMBER (tem
, 0);
2106 f
->display
.x
->left_pos
= XINT (tem
);
2108 tem
= x_get_arg (parms
, Qleft
, 0, 0, number
);
2109 if (EQ (tem
, Qunbound
))
2110 error ("Left position not specified");
2111 CHECK_NUMBER (tem
, 0);
2112 f
->display
.x
->top_pos
= XINT (tem
);
2115 pixelwidth
= CHAR_TO_PIXEL_WIDTH (f
, width
);
2116 pixelheight
= CHAR_TO_PIXEL_HEIGHT (f
, height
);
2120 = XCreateWindow (parent
,
2121 f
->display
.x
->left_pos
, /* Absolute horizontal offset */
2122 f
->display
.x
->top_pos
, /* Absolute Vertical offset */
2123 pixelwidth
, pixelheight
,
2124 f
->display
.x
->border_width
,
2125 BLACK_PIX_DEFAULT
, WHITE_PIX_DEFAULT
);
2127 if (FRAME_X_WINDOW (f
) == 0)
2128 error ("Unable to create window.");
2131 /* Install the now determined height and width
2132 in the windows and in phys_lines and desired_lines. */
2133 change_frame_size (f
, height
, width
, 1, 0);
2134 XSelectInput (FRAME_X_WINDOW (f
), KeyPressed
| ExposeWindow
2135 | ButtonPressed
| ButtonReleased
| ExposeRegion
| ExposeCopy
2136 | EnterWindow
| LeaveWindow
| UnmapWindow
);
2137 x_set_resize_hint (f
);
2139 /* Tell the server the window's default name. */
2140 XStoreName (XDISPLAY
FRAME_X_WINDOW (f
), XSTRING (f
->name
)->data
);
2142 /* Now override the defaults with all the rest of the specified
2144 tem
= x_get_arg (parms
, Qunsplittable
, 0, 0, boolean
);
2145 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
2147 /* Do not create an icon window if the caller says not to */
2148 if (!EQ (x_get_arg (parms
, Qsuppress_icon
, 0, 0, boolean
), Qt
)
2149 || f
->display
.x
->parent_desc
!= ROOT_WINDOW
)
2151 x_text_icon (f
, iconidentity
);
2152 x_default_parameter (f
, parms
, Qicon_type
, Qnil
,
2153 "BitmapIcon", 0, symbol
);
2156 /* Tell the X server the previously set values of the
2157 background, border and mouse colors; also create the mouse cursor. */
2159 temp
= XMakeTile (f
->display
.x
->background_pixel
);
2160 XChangeBackground (FRAME_X_WINDOW (f
), temp
);
2163 x_set_border_pixel (f
, f
->display
.x
->border_pixel
);
2165 x_set_mouse_color (f
, Qnil
, Qnil
);
2167 /* Now override the defaults with all the rest of the specified parms. */
2169 Fmodify_frame_parameters (frame
, parms
);
2171 /* Make the window appear on the frame and enable display. */
2173 if (!EQ (x_get_arg (parms
, Qsuppress_initial_map
, 0, 0, boolean
), Qt
))
2174 x_make_window_visible (f
);
2175 SET_FRAME_GARBAGED (f
);
2181 DEFUN ("focus-frame", Ffocus_frame
, Sfocus_frame
, 1, 1, 0,
2182 "Set the focus on FRAME.")
2186 CHECK_LIVE_FRAME (frame
, 0);
2188 if (FRAME_X_P (XFRAME (frame
)))
2191 x_focus_on_frame (XFRAME (frame
));
2199 DEFUN ("unfocus-frame", Funfocus_frame
, Sunfocus_frame
, 0, 0, 0,
2200 "If a frame has been focused, release it.")
2206 x_unfocus_frame (x_focus_frame
);
2214 /* Computes an X-window size and position either from geometry GEO
2217 F is a frame. It specifies an X window which is used to
2218 determine which display to compute for. Its font, borders
2219 and colors control how the rectangle will be displayed.
2221 X and Y are where to store the positions chosen.
2222 WIDTH and HEIGHT are where to store the sizes chosen.
2224 GEO is the geometry that may specify some of the info.
2225 STR is a prompt to display.
2226 HSCROLL and VSCROLL say whether we have horiz and vert scroll bars. */
2229 x_rubber_band (f
, x
, y
, width
, height
, geo
, str
, hscroll
, vscroll
)
2231 int *x
, *y
, *width
, *height
;
2234 int hscroll
, vscroll
;
2240 int background_color
;
2246 background_color
= f
->display
.x
->background_pixel
;
2247 border_color
= f
->display
.x
->border_pixel
;
2249 frame
.bdrwidth
= f
->display
.x
->border_width
;
2250 frame
.border
= XMakeTile (border_color
);
2251 frame
.background
= XMakeTile (background_color
);
2252 tempwindow
= XCreateTerm (str
, "emacs", geo
, default_window
, &frame
, 10, 5,
2253 (2 * f
->display
.x
->internal_border_width
2254 + (vscroll
? VSCROLL_WIDTH
: 0)),
2255 (2 * f
->display
.x
->internal_border_width
2256 + (hscroll
? HSCROLL_HEIGHT
: 0)),
2257 width
, height
, f
->display
.x
->font
,
2258 FONT_WIDTH (f
->display
.x
->font
),
2259 FONT_HEIGHT (f
->display
.x
->font
));
2260 XFreePixmap (frame
.border
);
2261 XFreePixmap (frame
.background
);
2263 if (tempwindow
!= 0)
2265 XQueryWindow (tempwindow
, &wininfo
);
2266 XDestroyWindow (tempwindow
);
2271 /* Coordinates we got are relative to the root window.
2272 Convert them to coordinates relative to desired parent window
2273 by scanning from there up to the root. */
2274 tempwindow
= f
->display
.x
->parent_desc
;
2275 while (tempwindow
!= ROOT_WINDOW
)
2279 XQueryWindow (tempwindow
, &wininfo
);
2282 XQueryTree (tempwindow
, &tempwindow
, &nchildren
, &children
);
2287 return tempwindow
!= 0;
2289 #endif /* not HAVE_X11 */
2292 register struct frame
*f
;
2294 return PIXEL_WIDTH (f
);
2298 register struct frame
*f
;
2300 return PIXEL_HEIGHT (f
);
2303 DEFUN ("x-defined-color", Fx_defined_color
, Sx_defined_color
, 1, 1, 0,
2304 "Return t if the current X display supports the color named COLOR.")
2310 CHECK_STRING (color
, 0);
2312 if (defined_color (XSTRING (color
)->data
, &foo
))
2318 DEFUN ("x-color-display-p", Fx_color_display_p
, Sx_color_display_p
, 0, 0, 0,
2319 "Return t if the X display used currently supports color.")
2322 if (x_screen_planes
<= 2)
2325 switch (screen_visual
->class)
2338 DEFUN ("x-pixel-width", Fx_pixel_width
, Sx_pixel_width
, 1, 1, 0,
2339 "Return the width in pixels of FRAME.")
2343 CHECK_LIVE_FRAME (frame
, 0);
2344 return make_number (XFRAME (frame
)->display
.x
->pixel_width
);
2347 DEFUN ("x-pixel-height", Fx_pixel_height
, Sx_pixel_height
, 1, 1, 0,
2348 "Return the height in pixels of FRAME.")
2352 CHECK_LIVE_FRAME (frame
, 0);
2353 return make_number (XFRAME (frame
)->display
.x
->pixel_height
);
2356 #if 0 /* These no longer seem like the right way to do things. */
2358 /* Draw a rectangle on the frame with left top corner including
2359 the character specified by LEFT_CHAR and TOP_CHAR. The rectangle is
2360 CHARS by LINES wide and long and is the color of the cursor. */
2363 x_rectangle (f
, gc
, left_char
, top_char
, chars
, lines
)
2364 register struct frame
*f
;
2366 register int top_char
, left_char
, chars
, lines
;
2370 int left
= (left_char
* FONT_WIDTH (f
->display
.x
->font
)
2371 + f
->display
.x
->internal_border_width
);
2372 int top
= (top_char
* FONT_HEIGHT (f
->display
.x
->font
)
2373 + f
->display
.x
->internal_border_width
);
2376 width
= FONT_WIDTH (f
->display
.x
->font
) / 2;
2378 width
= FONT_WIDTH (f
->display
.x
->font
) * chars
;
2380 height
= FONT_HEIGHT (f
->display
.x
->font
) / 2;
2382 height
= FONT_HEIGHT (f
->display
.x
->font
) * lines
;
2384 XDrawRectangle (x_current_display
, FRAME_X_WINDOW (f
),
2385 gc
, left
, top
, width
, height
);
2388 DEFUN ("x-draw-rectangle", Fx_draw_rectangle
, Sx_draw_rectangle
, 5, 5, 0,
2389 "Draw a rectangle on FRAME between coordinates specified by\n\
2390 numbers X0, Y0, X1, Y1 in the cursor pixel.")
2391 (frame
, X0
, Y0
, X1
, Y1
)
2392 register Lisp_Object frame
, X0
, X1
, Y0
, Y1
;
2394 register int x0
, y0
, x1
, y1
, top
, left
, n_chars
, n_lines
;
2396 CHECK_LIVE_FRAME (frame
, 0);
2397 CHECK_NUMBER (X0
, 0);
2398 CHECK_NUMBER (Y0
, 1);
2399 CHECK_NUMBER (X1
, 2);
2400 CHECK_NUMBER (Y1
, 3);
2410 n_lines
= y1
- y0
+ 1;
2415 n_lines
= y0
- y1
+ 1;
2421 n_chars
= x1
- x0
+ 1;
2426 n_chars
= x0
- x1
+ 1;
2430 x_rectangle (XFRAME (frame
), XFRAME (frame
)->display
.x
->cursor_gc
,
2431 left
, top
, n_chars
, n_lines
);
2437 DEFUN ("x-erase-rectangle", Fx_erase_rectangle
, Sx_erase_rectangle
, 5, 5, 0,
2438 "Draw a rectangle drawn on FRAME between coordinates\n\
2439 X0, Y0, X1, Y1 in the regular background-pixel.")
2440 (frame
, X0
, Y0
, X1
, Y1
)
2441 register Lisp_Object frame
, X0
, Y0
, X1
, Y1
;
2443 register int x0
, y0
, x1
, y1
, top
, left
, n_chars
, n_lines
;
2445 CHECK_FRAME (frame
, 0);
2446 CHECK_NUMBER (X0
, 0);
2447 CHECK_NUMBER (Y0
, 1);
2448 CHECK_NUMBER (X1
, 2);
2449 CHECK_NUMBER (Y1
, 3);
2459 n_lines
= y1
- y0
+ 1;
2464 n_lines
= y0
- y1
+ 1;
2470 n_chars
= x1
- x0
+ 1;
2475 n_chars
= x0
- x1
+ 1;
2479 x_rectangle (XFRAME (frame
), XFRAME (frame
)->display
.x
->reverse_gc
,
2480 left
, top
, n_chars
, n_lines
);
2486 /* Draw lines around the text region beginning at the character position
2487 TOP_X, TOP_Y and ending at BOTTOM_X and BOTTOM_Y. GC specifies the
2488 pixel and line characteristics. */
2490 #define line_len(line) (FRAME_CURRENT_GLYPHS (f)->used[(line)])
2493 outline_region (f
, gc
, top_x
, top_y
, bottom_x
, bottom_y
)
2494 register struct frame
*f
;
2496 int top_x
, top_y
, bottom_x
, bottom_y
;
2498 register int ibw
= f
->display
.x
->internal_border_width
;
2499 register int font_w
= FONT_WIDTH (f
->display
.x
->font
);
2500 register int font_h
= FONT_HEIGHT (f
->display
.x
->font
);
2502 int x
= line_len (y
);
2503 XPoint
*pixel_points
= (XPoint
*)
2504 alloca (((bottom_y
- top_y
+ 2) * 4) * sizeof (XPoint
));
2505 register XPoint
*this_point
= pixel_points
;
2507 /* Do the horizontal top line/lines */
2510 this_point
->x
= ibw
;
2511 this_point
->y
= ibw
+ (font_h
* top_y
);
2514 this_point
->x
= ibw
+ (font_w
/ 2); /* Half-size for newline chars. */
2516 this_point
->x
= ibw
+ (font_w
* x
);
2517 this_point
->y
= (this_point
- 1)->y
;
2521 this_point
->x
= ibw
;
2522 this_point
->y
= ibw
+ (font_h
* (top_y
+ 1));
2524 this_point
->x
= ibw
+ (font_w
* top_x
);
2525 this_point
->y
= (this_point
- 1)->y
;
2527 this_point
->x
= (this_point
- 1)->x
;
2528 this_point
->y
= ibw
+ (font_h
* top_y
);
2530 this_point
->x
= ibw
+ (font_w
* x
);
2531 this_point
->y
= (this_point
- 1)->y
;
2534 /* Now do the right side. */
2535 while (y
< bottom_y
)
2536 { /* Right vertical edge */
2538 this_point
->x
= (this_point
- 1)->x
;
2539 this_point
->y
= ibw
+ (font_h
* (y
+ 1));
2542 y
++; /* Horizontal connection to next line */
2545 this_point
->x
= ibw
+ (font_w
/ 2);
2547 this_point
->x
= ibw
+ (font_w
* x
);
2549 this_point
->y
= (this_point
- 1)->y
;
2552 /* Now do the bottom and connect to the top left point. */
2553 this_point
->x
= ibw
+ (font_w
* (bottom_x
+ 1));
2556 this_point
->x
= (this_point
- 1)->x
;
2557 this_point
->y
= ibw
+ (font_h
* (bottom_y
+ 1));
2559 this_point
->x
= ibw
;
2560 this_point
->y
= (this_point
- 1)->y
;
2562 this_point
->x
= pixel_points
->x
;
2563 this_point
->y
= pixel_points
->y
;
2565 XDrawLines (x_current_display
, FRAME_X_WINDOW (f
),
2567 (this_point
- pixel_points
+ 1), CoordModeOrigin
);
2570 DEFUN ("x-contour-region", Fx_contour_region
, Sx_contour_region
, 1, 1, 0,
2571 "Highlight the region between point and the character under the mouse\n\
2574 register Lisp_Object event
;
2576 register int x0
, y0
, x1
, y1
;
2577 register struct frame
*f
= selected_frame
;
2578 register int p1
, p2
;
2580 CHECK_CONS (event
, 0);
2583 x0
= XINT (Fcar (Fcar (event
)));
2584 y0
= XINT (Fcar (Fcdr (Fcar (event
))));
2586 /* If the mouse is past the end of the line, don't that area. */
2587 /* ReWrite this... */
2592 if (y1
> y0
) /* point below mouse */
2593 outline_region (f
, f
->display
.x
->cursor_gc
,
2595 else if (y1
< y0
) /* point above mouse */
2596 outline_region (f
, f
->display
.x
->cursor_gc
,
2598 else /* same line: draw horizontal rectangle */
2601 x_rectangle (f
, f
->display
.x
->cursor_gc
,
2602 x0
, y0
, (x1
- x0
+ 1), 1);
2604 x_rectangle (f
, f
->display
.x
->cursor_gc
,
2605 x1
, y1
, (x0
- x1
+ 1), 1);
2608 XFlush (x_current_display
);
2614 DEFUN ("x-uncontour-region", Fx_uncontour_region
, Sx_uncontour_region
, 1, 1, 0,
2615 "Erase any highlighting of the region between point and the character\n\
2616 at X, Y on the selected frame.")
2618 register Lisp_Object event
;
2620 register int x0
, y0
, x1
, y1
;
2621 register struct frame
*f
= selected_frame
;
2624 x0
= XINT (Fcar (Fcar (event
)));
2625 y0
= XINT (Fcar (Fcdr (Fcar (event
))));
2629 if (y1
> y0
) /* point below mouse */
2630 outline_region (f
, f
->display
.x
->reverse_gc
,
2632 else if (y1
< y0
) /* point above mouse */
2633 outline_region (f
, f
->display
.x
->reverse_gc
,
2635 else /* same line: draw horizontal rectangle */
2638 x_rectangle (f
, f
->display
.x
->reverse_gc
,
2639 x0
, y0
, (x1
- x0
+ 1), 1);
2641 x_rectangle (f
, f
->display
.x
->reverse_gc
,
2642 x1
, y1
, (x0
- x1
+ 1), 1);
2650 int contour_begin_x
, contour_begin_y
;
2651 int contour_end_x
, contour_end_y
;
2652 int contour_npoints
;
2654 /* Clip the top part of the contour lines down (and including) line Y_POS.
2655 If X_POS is in the middle (rather than at the end) of the line, drop
2656 down a line at that character. */
2659 clip_contour_top (y_pos
, x_pos
)
2661 register XPoint
*begin
= contour_lines
[y_pos
].top_left
;
2662 register XPoint
*end
;
2663 register int npoints
;
2664 register struct display_line
*line
= selected_frame
->phys_lines
[y_pos
+ 1];
2666 if (x_pos
>= line
->len
- 1) /* Draw one, straight horizontal line. */
2668 end
= contour_lines
[y_pos
].top_right
;
2669 npoints
= (end
- begin
+ 1);
2670 XDrawLines (x_current_display
, contour_window
,
2671 contour_erase_gc
, begin_erase
, npoints
, CoordModeOrigin
);
2673 bcopy (end
, begin
+ 1, contour_last_point
- end
+ 1);
2674 contour_last_point
-= (npoints
- 2);
2675 XDrawLines (x_current_display
, contour_window
,
2676 contour_erase_gc
, begin
, 2, CoordModeOrigin
);
2677 XFlush (x_current_display
);
2679 /* Now, update contour_lines structure. */
2684 register XPoint
*p
= begin
+ 1;
2685 end
= contour_lines
[y_pos
].bottom_right
;
2686 npoints
= (end
- begin
+ 1);
2687 XDrawLines (x_current_display
, contour_window
,
2688 contour_erase_gc
, begin_erase
, npoints
, CoordModeOrigin
);
2691 p
->x
= ibw
+ (font_w
* (x_pos
+ 1));
2693 p
->y
= begin
->y
+ font_h
;
2695 bcopy (end
, begin
+ 3, contour_last_point
- end
+ 1);
2696 contour_last_point
-= (npoints
- 5);
2697 XDrawLines (x_current_display
, contour_window
,
2698 contour_erase_gc
, begin
, 4, CoordModeOrigin
);
2699 XFlush (x_current_display
);
2701 /* Now, update contour_lines structure. */
2705 /* Erase the top horzontal lines of the contour, and then extend
2706 the contour upwards. */
2709 extend_contour_top (line
)
2714 clip_contour_bottom (x_pos
, y_pos
)
2720 extend_contour_bottom (x_pos
, y_pos
)
2724 DEFUN ("x-select-region", Fx_select_region
, Sx_select_region
, 1, 1, "e",
2729 register struct frame
*f
= selected_frame
;
2730 register int point_x
= f
->cursor_x
;
2731 register int point_y
= f
->cursor_y
;
2732 register int mouse_below_point
;
2733 register Lisp_Object obj
;
2734 register int x_contour_x
, x_contour_y
;
2736 x_contour_x
= x_mouse_x
;
2737 x_contour_y
= x_mouse_y
;
2738 if (x_contour_y
> point_y
|| (x_contour_y
== point_y
2739 && x_contour_x
> point_x
))
2741 mouse_below_point
= 1;
2742 outline_region (f
, f
->display
.x
->cursor_gc
, point_x
, point_y
,
2743 x_contour_x
, x_contour_y
);
2747 mouse_below_point
= 0;
2748 outline_region (f
, f
->display
.x
->cursor_gc
, x_contour_x
, x_contour_y
,
2754 obj
= read_char (-1, 0, 0, Qnil
, 0);
2755 if (XTYPE (obj
) != Lisp_Cons
)
2758 if (mouse_below_point
)
2760 if (x_mouse_y
<= point_y
) /* Flipped. */
2762 mouse_below_point
= 0;
2764 outline_region (f
, f
->display
.x
->reverse_gc
, point_x
, point_y
,
2765 x_contour_x
, x_contour_y
);
2766 outline_region (f
, f
->display
.x
->cursor_gc
, x_mouse_x
, x_mouse_y
,
2769 else if (x_mouse_y
< x_contour_y
) /* Bottom clipped. */
2771 clip_contour_bottom (x_mouse_y
);
2773 else if (x_mouse_y
> x_contour_y
) /* Bottom extended. */
2775 extend_bottom_contour (x_mouse_y
);
2778 x_contour_x
= x_mouse_x
;
2779 x_contour_y
= x_mouse_y
;
2781 else /* mouse above or same line as point */
2783 if (x_mouse_y
>= point_y
) /* Flipped. */
2785 mouse_below_point
= 1;
2787 outline_region (f
, f
->display
.x
->reverse_gc
,
2788 x_contour_x
, x_contour_y
, point_x
, point_y
);
2789 outline_region (f
, f
->display
.x
->cursor_gc
, point_x
, point_y
,
2790 x_mouse_x
, x_mouse_y
);
2792 else if (x_mouse_y
> x_contour_y
) /* Top clipped. */
2794 clip_contour_top (x_mouse_y
);
2796 else if (x_mouse_y
< x_contour_y
) /* Top extended. */
2798 extend_contour_top (x_mouse_y
);
2803 unread_command_event
= obj
;
2804 if (mouse_below_point
)
2806 contour_begin_x
= point_x
;
2807 contour_begin_y
= point_y
;
2808 contour_end_x
= x_contour_x
;
2809 contour_end_y
= x_contour_y
;
2813 contour_begin_x
= x_contour_x
;
2814 contour_begin_y
= x_contour_y
;
2815 contour_end_x
= point_x
;
2816 contour_end_y
= point_y
;
2821 DEFUN ("x-horizontal-line", Fx_horizontal_line
, Sx_horizontal_line
, 1, 1, "e",
2826 register Lisp_Object obj
;
2827 struct frame
*f
= selected_frame
;
2828 register struct window
*w
= XWINDOW (selected_window
);
2829 register GC line_gc
= f
->display
.x
->cursor_gc
;
2830 register GC erase_gc
= f
->display
.x
->reverse_gc
;
2832 char dash_list
[] = {6, 4, 6, 4};
2834 XGCValues gc_values
;
2836 register int previous_y
;
2837 register int line
= (x_mouse_y
+ 1) * FONT_HEIGHT (f
->display
.x
->font
)
2838 + f
->display
.x
->internal_border_width
;
2839 register int left
= f
->display
.x
->internal_border_width
2841 * FONT_WIDTH (f
->display
.x
->font
));
2842 register int right
= left
+ (w
->width
2843 * FONT_WIDTH (f
->display
.x
->font
))
2844 - f
->display
.x
->internal_border_width
;
2848 gc_values
.foreground
= f
->display
.x
->cursor_pixel
;
2849 gc_values
.background
= f
->display
.x
->background_pixel
;
2850 gc_values
.line_width
= 1;
2851 gc_values
.line_style
= LineOnOffDash
;
2852 gc_values
.cap_style
= CapRound
;
2853 gc_values
.join_style
= JoinRound
;
2855 line_gc
= XCreateGC (x_current_display
, FRAME_X_WINDOW (f
),
2856 GCLineStyle
| GCJoinStyle
| GCCapStyle
2857 | GCLineWidth
| GCForeground
| GCBackground
,
2859 XSetDashes (x_current_display
, line_gc
, 0, dash_list
, dashes
);
2860 gc_values
.foreground
= f
->display
.x
->background_pixel
;
2861 gc_values
.background
= f
->display
.x
->foreground_pixel
;
2862 erase_gc
= XCreateGC (x_current_display
, FRAME_X_WINDOW (f
),
2863 GCLineStyle
| GCJoinStyle
| GCCapStyle
2864 | GCLineWidth
| GCForeground
| GCBackground
,
2866 XSetDashes (x_current_display
, erase_gc
, 0, dash_list
, dashes
);
2872 if (x_mouse_y
>= XINT (w
->top
)
2873 && x_mouse_y
< XINT (w
->top
) + XINT (w
->height
) - 1)
2875 previous_y
= x_mouse_y
;
2876 line
= (x_mouse_y
+ 1) * FONT_HEIGHT (f
->display
.x
->font
)
2877 + f
->display
.x
->internal_border_width
;
2878 XDrawLine (x_current_display
, FRAME_X_WINDOW (f
),
2879 line_gc
, left
, line
, right
, line
);
2886 obj
= read_char (-1, 0, 0, Qnil
, 0);
2887 if ((XTYPE (obj
) != Lisp_Cons
)
2888 || (! EQ (Fcar (Fcdr (Fcdr (obj
))),
2889 Qvertical_scroll_bar
))
2893 XDrawLine (x_current_display
, FRAME_X_WINDOW (f
),
2894 erase_gc
, left
, line
, right
, line
);
2896 unread_command_event
= obj
;
2898 XFreeGC (x_current_display
, line_gc
);
2899 XFreeGC (x_current_display
, erase_gc
);
2904 while (x_mouse_y
== previous_y
);
2907 XDrawLine (x_current_display
, FRAME_X_WINDOW (f
),
2908 erase_gc
, left
, line
, right
, line
);
2914 /* Offset in buffer of character under the pointer, or 0. */
2915 int mouse_buffer_offset
;
2918 /* These keep track of the rectangle following the pointer. */
2919 int mouse_track_top
, mouse_track_left
, mouse_track_width
;
2921 DEFUN ("x-track-pointer", Fx_track_pointer
, Sx_track_pointer
, 0, 0, 0,
2922 "Track the pointer.")
2925 static Cursor current_pointer_shape
;
2926 FRAME_PTR f
= x_mouse_frame
;
2929 if (EQ (Vmouse_frame_part
, Qtext_part
)
2930 && (current_pointer_shape
!= f
->display
.x
->nontext_cursor
))
2935 current_pointer_shape
= f
->display
.x
->nontext_cursor
;
2936 XDefineCursor (x_current_display
,
2938 current_pointer_shape
);
2940 buf
= XBUFFER (XWINDOW (Vmouse_window
)->buffer
);
2941 c
= *(BUF_CHAR_ADDRESS (buf
, mouse_buffer_offset
));
2943 else if (EQ (Vmouse_frame_part
, Qmodeline_part
)
2944 && (current_pointer_shape
!= f
->display
.x
->modeline_cursor
))
2946 current_pointer_shape
= f
->display
.x
->modeline_cursor
;
2947 XDefineCursor (x_current_display
,
2949 current_pointer_shape
);
2958 DEFUN ("x-track-pointer", Fx_track_pointer
, Sx_track_pointer
, 1, 1, "e",
2959 "Draw rectangle around character under mouse pointer, if there is one.")
2963 struct window
*w
= XWINDOW (Vmouse_window
);
2964 struct frame
*f
= XFRAME (WINDOW_FRAME (w
));
2965 struct buffer
*b
= XBUFFER (w
->buffer
);
2968 if (! EQ (Vmouse_window
, selected_window
))
2971 if (EQ (event
, Qnil
))
2975 x_read_mouse_position (selected_frame
, &x
, &y
);
2979 mouse_track_width
= 0;
2980 mouse_track_left
= mouse_track_top
= -1;
2984 if ((x_mouse_x
!= mouse_track_left
2985 && (x_mouse_x
< mouse_track_left
2986 || x_mouse_x
> (mouse_track_left
+ mouse_track_width
)))
2987 || x_mouse_y
!= mouse_track_top
)
2989 int hp
= 0; /* Horizontal position */
2990 int len
= FRAME_CURRENT_GLYPHS (f
)->used
[x_mouse_y
];
2991 int p
= FRAME_CURRENT_GLYPHS (f
)->bufp
[x_mouse_y
];
2992 int tab_width
= XINT (b
->tab_width
);
2993 int ctl_arrow_p
= !NILP (b
->ctl_arrow
);
2995 int mode_line_vpos
= XFASTINT (w
->height
) + XFASTINT (w
->top
) - 1;
2996 int in_mode_line
= 0;
2998 if (! FRAME_CURRENT_GLYPHS (f
)->enable
[x_mouse_y
])
3001 /* Erase previous rectangle. */
3002 if (mouse_track_width
)
3004 x_rectangle (f
, f
->display
.x
->reverse_gc
,
3005 mouse_track_left
, mouse_track_top
,
3006 mouse_track_width
, 1);
3008 if ((mouse_track_left
== f
->phys_cursor_x
3009 || mouse_track_left
== f
->phys_cursor_x
- 1)
3010 && mouse_track_top
== f
->phys_cursor_y
)
3012 x_display_cursor (f
, 1);
3016 mouse_track_left
= x_mouse_x
;
3017 mouse_track_top
= x_mouse_y
;
3018 mouse_track_width
= 0;
3020 if (mouse_track_left
> len
) /* Past the end of line. */
3023 if (mouse_track_top
== mode_line_vpos
)
3029 if (tab_width
<= 0 || tab_width
> 20) tab_width
= 8;
3033 if (len
== f
->width
&& hp
== len
- 1 && c
!= '\n')
3039 mouse_track_width
= tab_width
- (hp
% tab_width
);
3041 hp
+= mouse_track_width
;
3044 mouse_track_left
= hp
- mouse_track_width
;
3050 mouse_track_width
= -1;
3054 if (ctl_arrow_p
&& (c
< 040 || c
== 0177))
3059 mouse_track_width
= 2;
3064 mouse_track_left
= hp
- mouse_track_width
;
3070 mouse_track_width
= 1;
3077 while (hp
<= x_mouse_x
);
3080 if (mouse_track_width
) /* Over text; use text pointer shape. */
3082 XDefineCursor (x_current_display
,
3084 f
->display
.x
->text_cursor
);
3085 x_rectangle (f
, f
->display
.x
->cursor_gc
,
3086 mouse_track_left
, mouse_track_top
,
3087 mouse_track_width
, 1);
3089 else if (in_mode_line
)
3090 XDefineCursor (x_current_display
,
3092 f
->display
.x
->modeline_cursor
);
3094 XDefineCursor (x_current_display
,
3096 f
->display
.x
->nontext_cursor
);
3099 XFlush (x_current_display
);
3102 obj
= read_char (-1, 0, 0, Qnil
, 0);
3105 while (XTYPE (obj
) == Lisp_Cons
/* Mouse event */
3106 && EQ (Fcar (Fcdr (Fcdr (obj
))), Qnil
) /* Not scroll bar */
3107 && EQ (Vmouse_depressed
, Qnil
) /* Only motion events */
3108 && EQ (Vmouse_window
, selected_window
) /* In this window */
3111 unread_command_event
= obj
;
3113 if (mouse_track_width
)
3115 x_rectangle (f
, f
->display
.x
->reverse_gc
,
3116 mouse_track_left
, mouse_track_top
,
3117 mouse_track_width
, 1);
3118 mouse_track_width
= 0;
3119 if ((mouse_track_left
== f
->phys_cursor_x
3120 || mouse_track_left
- 1 == f
->phys_cursor_x
)
3121 && mouse_track_top
== f
->phys_cursor_y
)
3123 x_display_cursor (f
, 1);
3126 XDefineCursor (x_current_display
,
3128 f
->display
.x
->nontext_cursor
);
3129 XFlush (x_current_display
);
3139 /* Draw a pixmap specified by IMAGE_DATA of dimensions WIDTH and HEIGHT
3140 on the frame F at position X, Y. */
3142 x_draw_pixmap (f
, x
, y
, image_data
, width
, height
)
3144 int x
, y
, width
, height
;
3149 image
= XCreateBitmapFromData (x_current_display
,
3150 FRAME_X_WINDOW (f
), image_data
,
3152 XCopyPlane (x_current_display
, image
, FRAME_X_WINDOW (f
),
3153 f
->display
.x
->normal_gc
, 0, 0, width
, height
, x
, y
);
3160 #define XMouseEvent XEvent
3161 #define WhichMouseButton xbutton.button
3162 #define MouseWindow xbutton.window
3163 #define MouseX xbutton.x
3164 #define MouseY xbutton.y
3165 #define MouseTime xbutton.time
3166 #define ButtonReleased ButtonRelease
3167 #define ButtonPressed ButtonPress
3169 #define XMouseEvent XButtonEvent
3170 #define WhichMouseButton detail
3171 #define MouseWindow window
3174 #define MouseTime time
3177 DEFUN ("x-mouse-events", Fx_mouse_events
, Sx_mouse_events
, 0, 0, 0,
3178 "Return number of pending mouse events from X window system.")
3181 return make_number (queue_event_count (&x_mouse_queue
));
3184 /* Encode the mouse button events in the form expected by the
3185 mouse code in Lisp. For X11, this means moving the masks around. */
3188 encode_mouse_button (mouse_event
)
3189 XMouseEvent mouse_event
;
3191 register int event_code
;
3192 register char key_mask
;
3194 event_code
= mouse_event
.detail
& 3;
3195 key_mask
= (mouse_event
.detail
>> 8) & 0xf0;
3196 event_code
|= key_mask
>> 1;
3197 if (mouse_event
.type
== ButtonReleased
) event_code
|= 0x04;
3201 DEFUN ("x-get-mouse-event", Fx_get_mouse_event
, Sx_get_mouse_event
,
3203 "Get next mouse event out of mouse event buffer.\n\
3204 Optional ARG non-nil means return nil immediately if no pending event;\n\
3205 otherwise, wait for an event. Returns a four-part list:\n\
3206 ((X-POS Y-POS) WINDOW FRAME-PART KEYSEQ TIMESTAMP).\n\
3207 Normally X-POS and Y-POS are the position of the click on the frame\n\
3208 (measured in characters and lines), and WINDOW is the window clicked in.\n\
3209 KEYSEQ is a string, the key sequence to be looked up in the mouse maps.\n\
3210 If FRAME-PART is non-nil, the event was on a scroll bar;\n\
3211 then Y-POS is really the total length of the scroll bar, while X-POS is\n\
3212 the relative position of the scroll bar's value within that total length,\n\
3213 and a third element OFFSET appears in that list: the height of the thumb-up\n\
3214 area at the top of the scroll bar.\n\
3215 FRAME-PART is one of the following symbols:\n\
3216 `vertical-scroll-bar', `vertical-thumbup', `vertical-thumbdown',\n\
3217 `horizontal-scroll-bar', `horizontal-thumbleft', `horizontal-thumbright'.\n\
3218 TIMESTAMP is the lower 23 bits of the X-server's timestamp for\n\
3224 register int com_letter
;
3225 register Lisp_Object tempx
;
3226 register Lisp_Object tempy
;
3227 Lisp_Object part
, pos
, timestamp
;
3236 tem
= dequeue_event (&xrep
, &x_mouse_queue
);
3244 case ButtonReleased
:
3246 com_letter
= encode_mouse_button (xrep
);
3247 mouse_timestamp
= xrep
.MouseTime
;
3249 if ((f
= x_window_to_frame (xrep
.MouseWindow
)) != 0)
3253 if (f
->display
.x
->icon_desc
== xrep
.MouseWindow
)
3255 x_make_frame_visible (f
);
3259 XSET (tempx
, Lisp_Int
,
3260 min (f
->width
-1, max (0, (xrep
.MouseX
- f
->display
.x
->internal_border_width
)/FONT_WIDTH (f
->display
.x
->font
))));
3261 XSET (tempy
, Lisp_Int
,
3262 min (f
->height
-1, max (0, (xrep
.MouseY
- f
->display
.x
->internal_border_width
)/FONT_HEIGHT (f
->display
.x
->font
))));
3263 XSET (timestamp
, Lisp_Int
, (xrep
.MouseTime
& 0x7fffff));
3264 XSET (frame
, Lisp_Frame
, f
);
3266 pos
= Fcons (tempx
, Fcons (tempy
, Qnil
));
3268 = Flocate_window_from_coordinates (frame
, pos
);
3272 Fcons (Vmouse_window
,
3274 Fcons (Fchar_to_string (make_number (com_letter
)),
3275 Fcons (timestamp
, Qnil
)))));
3276 return Vmouse_event
;
3278 else if ((f
= x_window_to_scroll_bar (xrep
.MouseWindow
, &part
, &prefix
)) != 0)
3284 keyseq
= concat2 (Fchar_to_string (make_number (prefix
)),
3285 Fchar_to_string (make_number (com_letter
)));
3287 pos
= xrep
.MouseY
- (f
->display
.x
->v_scroll_bar_width
- 2);
3288 XSET (tempx
, Lisp_Int
, pos
);
3289 len
= ((FONT_HEIGHT (f
->display
.x
->font
) * f
->height
)
3290 + f
->display
.x
->internal_border_width
3291 - (2 * (f
->display
.x
->v_scroll_bar_width
- 2)));
3292 XSET (tempy
, Lisp_Int
, len
);
3293 XSET (timestamp
, Lisp_Int
, (xrep
.MouseTime
& 0x7fffff));
3294 Vmouse_window
= f
->selected_window
;
3296 = Fcons (Fcons (tempx
, Fcons (tempy
,
3297 Fcons (make_number (f
->display
.x
->v_scroll_bar_width
- 2),
3299 Fcons (Vmouse_window
,
3300 Fcons (intern (part
),
3301 Fcons (keyseq
, Fcons (timestamp
,
3303 return Vmouse_event
;
3311 com_letter
= x11_encode_mouse_button (xrep
);
3312 if ((f
= x_window_to_frame (xrep
.MouseWindow
)) != 0)
3316 XSET (tempx
, Lisp_Int
,
3318 max (0, (xrep
.MouseX
- f
->display
.x
->internal_border_width
)
3319 / FONT_WIDTH (f
->display
.x
->font
))));
3320 XSET (tempy
, Lisp_Int
,
3322 max (0, (xrep
.MouseY
- f
->display
.x
->internal_border_width
)
3323 / FONT_HEIGHT (f
->display
.x
->font
))));
3325 XSET (frame
, Lisp_Frame
, f
);
3326 XSET (timestamp
, Lisp_Int
, (xrep
.MouseTime
& 0x7fffff));
3328 pos
= Fcons (tempx
, Fcons (tempy
, Qnil
));
3330 = Flocate_window_from_coordinates (frame
, pos
);
3334 Fcons (Vmouse_window
,
3336 Fcons (Fchar_to_string (make_number (com_letter
)),
3337 Fcons (timestamp
, Qnil
)))));
3338 return Vmouse_event
;
3342 #endif /* HAVE_X11 */
3345 if (f
= x_window_to_frame (xrep
.MouseWindow
))
3346 Vmouse_window
= f
->selected_window
;
3347 else if (f
= x_window_to_scroll_bar (xrep
.MouseWindow
, &part
, &prefix
))
3348 Vmouse_window
= f
->selected_window
;
3349 return Vmouse_event
= Qnil
;
3356 /* Wait till we get another mouse event. */
3357 wait_reading_process_input (0, 0, 2, 0);
3364 DEFUN ("x-store-cut-buffer", Fx_store_cut_buffer
, Sx_store_cut_buffer
,
3365 1, 1, "sStore text in cut buffer: ",
3366 "Store contents of STRING into the cut buffer of the X window system.")
3368 register Lisp_Object string
;
3372 CHECK_STRING (string
, 1);
3373 if (! FRAME_X_P (selected_frame
))
3374 error ("Selected frame does not understand X protocol.");
3377 XStoreBytes ((char *) XSTRING (string
)->data
, XSTRING (string
)->size
);
3383 DEFUN ("x-get-cut-buffer", Fx_get_cut_buffer
, Sx_get_cut_buffer
, 0, 0, 0,
3384 "Return contents of cut buffer of the X window system, as a string.")
3388 register Lisp_Object string
;
3393 d
= XFetchBytes (&len
);
3394 string
= make_string (d
, len
);
3402 DEFUN ("x-rebind-key", Fx_rebind_key
, Sx_rebind_key
, 3, 3, 0,
3403 "Rebind X keysym KEYSYM, with MODIFIERS, to generate NEWSTRING.\n\
3404 KEYSYM is a string which conforms to the X keysym definitions found\n\
3405 in X11/keysymdef.h, sans the initial XK_. MODIFIERS is nil or a\n\
3406 list of strings specifying modifier keys such as Control_L, which must\n\
3407 also be depressed for NEWSTRING to appear.")
3408 (x_keysym
, modifiers
, newstring
)
3409 register Lisp_Object x_keysym
;
3410 register Lisp_Object modifiers
;
3411 register Lisp_Object newstring
;
3414 register KeySym keysym
;
3415 KeySym modifier_list
[16];
3417 CHECK_STRING (x_keysym
, 1);
3418 CHECK_STRING (newstring
, 3);
3420 keysym
= XStringToKeysym ((char *) XSTRING (x_keysym
)->data
);
3421 if (keysym
== NoSymbol
)
3422 error ("Keysym does not exist");
3424 if (NILP (modifiers
))
3425 XRebindKeysym (x_current_display
, keysym
, modifier_list
, 0,
3426 XSTRING (newstring
)->data
, XSTRING (newstring
)->size
);
3429 register Lisp_Object rest
, mod
;
3432 for (rest
= modifiers
; !NILP (rest
); rest
= Fcdr (rest
))
3435 error ("Can't have more than 16 modifiers");
3438 CHECK_STRING (mod
, 3);
3439 modifier_list
[i
] = XStringToKeysym ((char *) XSTRING (mod
)->data
);
3440 if (modifier_list
[i
] == NoSymbol
3441 || !IsModifierKey (modifier_list
[i
]))
3442 error ("Element is not a modifier keysym");
3446 XRebindKeysym (x_current_display
, keysym
, modifier_list
, i
,
3447 XSTRING (newstring
)->data
, XSTRING (newstring
)->size
);
3453 DEFUN ("x-rebind-keys", Fx_rebind_keys
, Sx_rebind_keys
, 2, 2, 0,
3454 "Rebind KEYCODE to list of strings STRINGS.\n\
3455 STRINGS should be a list of 16 elements, one for each shift combination.\n\
3456 nil as element means don't change.\n\
3457 See the documentation of `x-rebind-key' for more information.")
3459 register Lisp_Object keycode
;
3460 register Lisp_Object strings
;
3462 register Lisp_Object item
;
3463 register unsigned char *rawstring
;
3464 KeySym rawkey
, modifier
[1];
3466 register unsigned i
;
3468 CHECK_NUMBER (keycode
, 1);
3469 CHECK_CONS (strings
, 2);
3470 rawkey
= (KeySym
) ((unsigned) (XINT (keycode
))) & 255;
3471 for (i
= 0; i
<= 15; strings
= Fcdr (strings
), i
++)
3473 item
= Fcar (strings
);
3476 CHECK_STRING (item
, 2);
3477 strsize
= XSTRING (item
)->size
;
3478 rawstring
= (unsigned char *) xmalloc (strsize
);
3479 bcopy (XSTRING (item
)->data
, rawstring
, strsize
);
3480 modifier
[1] = 1 << i
;
3481 XRebindKeysym (x_current_display
, rawkey
, modifier
, 1,
3482 rawstring
, strsize
);
3488 DEFUN ("x-rebind-key", Fx_rebind_key
, Sx_rebind_key
, 3, 3, 0,
3489 "Rebind KEYCODE, with shift bits SHIFT-MASK, to new string NEWSTRING.\n\
3490 KEYCODE and SHIFT-MASK should be numbers representing the X keyboard code\n\
3491 and shift mask respectively. NEWSTRING is an arbitrary string of keystrokes.\n\
3492 If SHIFT-MASK is nil, then KEYCODE's key will be bound to NEWSTRING for\n\
3493 all shift combinations.\n\
3494 Shift Lock 1 Shift 2\n\
3497 For values of KEYCODE, see /usr/lib/Xkeymap.txt (remember that the codes\n\
3498 in that file are in octal!)\n\
3500 NOTE: due to an X bug, this function will not take effect unless one has\n\
3501 a `~/.Xkeymap' file. (See the documentation for the `keycomp' program.)\n\
3502 This problem will be fixed in X version 11.")
3504 (keycode
, shift_mask
, newstring
)
3505 register Lisp_Object keycode
;
3506 register Lisp_Object shift_mask
;
3507 register Lisp_Object newstring
;
3510 int keysym
, rawshift
;
3513 CHECK_NUMBER (keycode
, 1);
3514 if (!NILP (shift_mask
))
3515 CHECK_NUMBER (shift_mask
, 2);
3516 CHECK_STRING (newstring
, 3);
3517 strsize
= XSTRING (newstring
)->size
;
3518 rawstring
= (char *) xmalloc (strsize
);
3519 bcopy (XSTRING (newstring
)->data
, rawstring
, strsize
);
3521 keysym
= ((unsigned) (XINT (keycode
))) & 255;
3523 if (NILP (shift_mask
))
3525 for (i
= 0; i
<= 15; i
++)
3526 XRebindCode (keysym
, i
<<11, rawstring
, strsize
);
3530 rawshift
= (((unsigned) (XINT (shift_mask
))) & 15) << 11;
3531 XRebindCode (keysym
, rawshift
, rawstring
, strsize
);
3536 DEFUN ("x-rebind-keys", Fx_rebind_keys
, Sx_rebind_keys
, 2, 2, 0,
3537 "Rebind KEYCODE to list of strings STRINGS.\n\
3538 STRINGS should be a list of 16 elements, one for each shift combination.\n\
3539 nil as element means don't change.\n\
3540 See the documentation of `x-rebind-key' for more information.")
3542 register Lisp_Object keycode
;
3543 register Lisp_Object strings
;
3545 register Lisp_Object item
;
3546 register char *rawstring
;
3547 KeySym rawkey
, modifier
[1];
3549 register unsigned i
;
3551 CHECK_NUMBER (keycode
, 1);
3552 CHECK_CONS (strings
, 2);
3553 rawkey
= (KeySym
) ((unsigned) (XINT (keycode
))) & 255;
3554 for (i
= 0; i
<= 15; strings
= Fcdr (strings
), i
++)
3556 item
= Fcar (strings
);
3559 CHECK_STRING (item
, 2);
3560 strsize
= XSTRING (item
)->size
;
3561 rawstring
= (char *) xmalloc (strsize
);
3562 bcopy (XSTRING (item
)->data
, rawstring
, strsize
);
3563 XRebindCode (rawkey
, i
<< 11, rawstring
, strsize
);
3568 #endif /* not HAVE_X11 */
3572 select_visual (screen
, depth
)
3574 unsigned int *depth
;
3577 XVisualInfo
*vinfo
, vinfo_template
;
3580 v
= DefaultVisualOfScreen (screen
);
3583 vinfo_template
.visualid
= XVisualIDFromVisual (v
);
3585 vinfo_template
.visualid
= x
->visualid
;
3588 vinfo
= XGetVisualInfo (x_current_display
, VisualIDMask
, &vinfo_template
,
3591 fatal ("Can't get proper X visual info");
3593 if ((1 << vinfo
->depth
) == vinfo
->colormap_size
)
3594 *depth
= vinfo
->depth
;
3598 int n
= vinfo
->colormap_size
- 1;
3607 XFree ((char *) vinfo
);
3610 #endif /* HAVE_X11 */
3612 DEFUN ("x-open-connection", Fx_open_connection
, Sx_open_connection
,
3613 1, 2, 0, "Open a connection to an X server.\n\
3614 DISPLAY is the name of the display to connect to. Optional second\n\
3615 arg XRM_STRING is a string of resources in xrdb format.")
3616 (display
, xrm_string
)
3617 Lisp_Object display
, xrm_string
;
3619 unsigned int n_planes
;
3620 register Screen
*x_screen
;
3621 unsigned char *xrm_option
;
3623 CHECK_STRING (display
, 0);
3624 if (x_current_display
!= 0)
3625 error ("X server connection is already initialized");
3627 /* This is what opens the connection and sets x_current_display.
3628 This also initializes many symbols, such as those used for input. */
3629 x_term_init (XSTRING (display
)->data
);
3632 XFASTINT (Vwindow_system_version
) = 11;
3634 if (!EQ (xrm_string
, Qnil
))
3636 CHECK_STRING (xrm_string
, 1);
3637 xrm_option
= (unsigned char *) XSTRING (xrm_string
);
3640 xrm_option
= (unsigned char *) 0;
3641 xrdb
= x_load_resources (x_current_display
, xrm_option
, EMACS_CLASS
);
3642 x_current_display
->db
= xrdb
;
3644 x_screen
= DefaultScreenOfDisplay (x_current_display
);
3646 x_screen_count
= ScreenCount (x_current_display
);
3647 Vx_vendor
= build_string (ServerVendor (x_current_display
));
3648 x_release
= VendorRelease (x_current_display
);
3650 x_screen_height
= HeightOfScreen (x_screen
);
3651 x_screen_height_mm
= HeightMMOfScreen (x_screen
);
3652 x_screen_width
= WidthOfScreen (x_screen
);
3653 x_screen_width_mm
= WidthMMOfScreen (x_screen
);
3655 switch (DoesBackingStore (x_screen
))
3658 Vx_backing_store
= intern ("Always");
3662 Vx_backing_store
= intern ("WhenMapped");
3666 Vx_backing_store
= intern ("NotUseful");
3670 error ("Strange value for BackingStore.");
3674 if (DoesSaveUnders (x_screen
) == True
)
3679 screen_visual
= select_visual (x_screen
, &n_planes
);
3680 x_screen_planes
= n_planes
;
3681 Vx_screen_visual
= intern (x_visual_strings
[screen_visual
->class]);
3683 /* X Atoms used by emacs. */
3685 Xatom_emacs_selection
= XInternAtom (x_current_display
, "_EMACS_SELECTION_",
3687 Xatom_clipboard
= XInternAtom (x_current_display
, "CLIPBOARD",
3689 Xatom_clipboard_selection
= XInternAtom (x_current_display
, "_EMACS_CLIPBOARD_",
3691 Xatom_wm_change_state
= XInternAtom (x_current_display
, "WM_CHANGE_STATE",
3693 Xatom_incremental
= XInternAtom (x_current_display
, "INCR",
3695 Xatom_multiple
= XInternAtom (x_current_display
, "MULTIPLE",
3697 Xatom_targets
= XInternAtom (x_current_display
, "TARGETS",
3699 Xatom_timestamp
= XInternAtom (x_current_display
, "TIMESTAMP",
3701 Xatom_delete
= XInternAtom (x_current_display
, "DELETE",
3703 Xatom_insert_selection
= XInternAtom (x_current_display
, "INSERT_SELECTION",
3705 Xatom_pair
= XInternAtom (x_current_display
, "XA_ATOM_PAIR",
3707 Xatom_insert_property
= XInternAtom (x_current_display
, "INSERT_PROPERTY",
3709 Xatom_text
= XInternAtom (x_current_display
, "TEXT",
3711 Xatom_wm_protocols
= XInternAtom (x_current_display
, "WM_PROTOCOLS",
3713 Xatom_wm_take_focus
= XInternAtom (x_current_display
, "WM_TAKE_FOCUS",
3715 Xatom_wm_save_yourself
= XInternAtom (x_current_display
, "WM_SAVE_YOURSELF",
3717 Xatom_wm_delete_window
= XInternAtom (x_current_display
, "WM_DELETE_WINDOW",
3719 Xatom_wm_change_state
= XInternAtom (x_current_display
, "WM_CHANGE_STATE",
3721 Xatom_wm_configure_denied
= XInternAtom (x_current_display
,
3722 "WM_CONFIGURE_DENIED", False
);
3723 Xatom_wm_window_moved
= XInternAtom (x_current_display
, "WM_MOVED",
3726 #else /* not HAVE_X11 */
3727 XFASTINT (Vwindow_system_version
) = 10;
3728 #endif /* not HAVE_X11 */
3732 DEFUN ("x-close-current-connection", Fx_close_current_connection
,
3733 Sx_close_current_connection
,
3734 0, 0, 0, "Close the connection to the current X server.")
3738 /* This is ONLY used when killing emacs; For switching displays
3739 we'll have to take care of setting CloseDownMode elsewhere. */
3741 if (x_current_display
)
3744 XSetCloseDownMode (x_current_display
, DestroyAll
);
3745 XCloseDisplay (x_current_display
);
3748 fatal ("No current X display connection to close\n");
3753 DEFUN ("x-synchronize", Fx_synchronize
, Sx_synchronize
,
3754 1, 1, 0, "If ON is non-nil, report X errors as soon as the erring request is made.\n\
3755 If ON is nil, allow buffering of requests.\n\
3756 Turning on synchronization prohibits the Xlib routines from buffering\n\
3757 requests and seriously degrades performance, but makes debugging much\n\
3762 XSynchronize (x_current_display
, !EQ (on
, Qnil
));
3770 /* This is zero if not using X windows. */
3771 x_current_display
= 0;
3773 /* The section below is built by the lisp expression at the top of the file,
3774 just above where these variables are declared. */
3775 /*&&& init symbols here &&&*/
3776 Qauto_raise
= intern ("auto-raise");
3777 staticpro (&Qauto_raise
);
3778 Qauto_lower
= intern ("auto-lower");
3779 staticpro (&Qauto_lower
);
3780 Qbackground_color
= intern ("background-color");
3781 staticpro (&Qbackground_color
);
3782 Qbar
= intern ("bar");
3784 Qborder_color
= intern ("border-color");
3785 staticpro (&Qborder_color
);
3786 Qborder_width
= intern ("border-width");
3787 staticpro (&Qborder_width
);
3788 Qbox
= intern ("box");
3790 Qcursor_color
= intern ("cursor-color");
3791 staticpro (&Qcursor_color
);
3792 Qcursor_type
= intern ("cursor-type");
3793 staticpro (&Qcursor_type
);
3794 Qfont
= intern ("font");
3796 Qforeground_color
= intern ("foreground-color");
3797 staticpro (&Qforeground_color
);
3798 Qgeometry
= intern ("geometry");
3799 staticpro (&Qgeometry
);
3800 Qicon_left
= intern ("icon-left");
3801 staticpro (&Qicon_left
);
3802 Qicon_top
= intern ("icon-top");
3803 staticpro (&Qicon_top
);
3804 Qicon_type
= intern ("icon-type");
3805 staticpro (&Qicon_type
);
3806 Qiconic_startup
= intern ("iconic-startup");
3807 staticpro (&Qiconic_startup
);
3808 Qinternal_border_width
= intern ("internal-border-width");
3809 staticpro (&Qinternal_border_width
);
3810 Qleft
= intern ("left");
3812 Qmouse_color
= intern ("mouse-color");
3813 staticpro (&Qmouse_color
);
3814 Qnone
= intern ("none");
3816 Qparent_id
= intern ("parent-id");
3817 staticpro (&Qparent_id
);
3818 Qsuppress_icon
= intern ("suppress-icon");
3819 staticpro (&Qsuppress_icon
);
3820 Qsuppress_initial_map
= intern ("suppress-initial-map");
3821 staticpro (&Qsuppress_initial_map
);
3822 Qtop
= intern ("top");
3824 Qundefined_color
= intern ("undefined-color");
3825 staticpro (&Qundefined_color
);
3826 Qvertical_scroll_bars
= intern ("vertical-scroll-bars");
3827 staticpro (&Qvertical_scroll_bars
);
3828 Qwindow_id
= intern ("window-id");
3829 staticpro (&Qwindow_id
);
3830 Qx_frame_parameter
= intern ("x-frame-parameter");
3831 staticpro (&Qx_frame_parameter
);
3832 /* This is the end of symbol initialization. */
3834 Fput (Qundefined_color
, Qerror_conditions
,
3835 Fcons (Qundefined_color
, Fcons (Qerror
, Qnil
)));
3836 Fput (Qundefined_color
, Qerror_message
,
3837 build_string ("Undefined color"));
3839 init_x_parm_symbols ();
3841 DEFVAR_INT ("mouse-buffer-offset", &mouse_buffer_offset
,
3842 "The buffer offset of the character under the pointer.");
3843 mouse_buffer_offset
= 0;
3845 DEFVAR_INT ("x-pointer-shape", &Vx_pointer_shape
,
3846 "The shape of the pointer when over text.");
3847 Vx_pointer_shape
= Qnil
;
3849 DEFVAR_INT ("x-nontext-pointer-shape", &Vx_nontext_pointer_shape
,
3850 "The shape of the pointer when not over text.");
3851 Vx_nontext_pointer_shape
= Qnil
;
3853 DEFVAR_INT ("x-mode-pointer-shape", &Vx_mode_pointer_shape
,
3854 "The shape of the pointer when over the mode line.");
3855 Vx_mode_pointer_shape
= Qnil
;
3857 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel
,
3858 "A string indicating the foreground color of the cursor box.");
3859 Vx_cursor_fore_pixel
= Qnil
;
3861 DEFVAR_LISP ("mouse-grabbed", &Vmouse_depressed
,
3862 "Non-nil if a mouse button is currently depressed.");
3863 Vmouse_depressed
= Qnil
;
3865 DEFVAR_INT ("x-screen-count", &x_screen_count
,
3866 "The number of screens associated with the current display.");
3867 DEFVAR_INT ("x-release", &x_release
,
3868 "The release number of the X server in use.");
3869 DEFVAR_LISP ("x-vendor", &Vx_vendor
,
3870 "The vendor supporting the X server in use.");
3871 DEFVAR_INT ("x-screen-height", &x_screen_height
,
3872 "The height of this X screen in pixels.");
3873 DEFVAR_INT ("x-screen-height-mm", &x_screen_height_mm
,
3874 "The height of this X screen in millimeters.");
3875 DEFVAR_INT ("x-screen-width", &x_screen_width
,
3876 "The width of this X screen in pixels.");
3877 DEFVAR_INT ("x-screen-width-mm", &x_screen_width_mm
,
3878 "The width of this X screen in millimeters.");
3879 DEFVAR_LISP ("x-backing-store", &Vx_backing_store
,
3880 "The backing store capability of this screen.\n\
3881 Values can be the symbols Always, WhenMapped, or NotUseful.");
3882 DEFVAR_BOOL ("x-save-under", &x_save_under
,
3883 "*Non-nil means this X screen supports the SaveUnder feature.");
3884 DEFVAR_INT ("x-screen-planes", &x_screen_planes
,
3885 "The number of planes this monitor supports.");
3886 DEFVAR_LISP ("x-screen-visual", &Vx_screen_visual
,
3887 "The default X visual for this X screen.");
3888 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager
,
3889 "t if no X window manager is in use.");
3892 defsubr (&Sx_get_resource
);
3893 defsubr (&Sx_pixel_width
);
3894 defsubr (&Sx_pixel_height
);
3896 defsubr (&Sx_draw_rectangle
);
3897 defsubr (&Sx_erase_rectangle
);
3898 defsubr (&Sx_contour_region
);
3899 defsubr (&Sx_uncontour_region
);
3901 defsubr (&Sx_color_display_p
);
3902 defsubr (&Sx_defined_color
);
3904 defsubr (&Sx_track_pointer
);
3905 defsubr (&Sx_grab_pointer
);
3906 defsubr (&Sx_ungrab_pointer
);
3909 defsubr (&Sx_get_default
);
3910 defsubr (&Sx_store_cut_buffer
);
3911 defsubr (&Sx_get_cut_buffer
);
3912 defsubr (&Sx_set_face
);
3914 defsubr (&Sx_geometry
);
3915 defsubr (&Sx_create_frame
);
3916 defsubr (&Sfocus_frame
);
3917 defsubr (&Sunfocus_frame
);
3919 defsubr (&Sx_horizontal_line
);
3921 defsubr (&Sx_rebind_key
);
3922 defsubr (&Sx_rebind_keys
);
3923 defsubr (&Sx_open_connection
);
3924 defsubr (&Sx_close_current_connection
);
3925 defsubr (&Sx_synchronize
);
3927 /* This was used in the old event interface which used a separate
3930 defsubr (&Sx_mouse_events
);
3931 defsubr (&Sx_get_mouse_event
);
3935 #endif /* HAVE_X_WINDOWS */