1 /* Functions for the X window system.
2 Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
30 /* This makes the fields of a Display accessible, in Xlib header files. */
32 #define XLIB_ILLEGAL_ACCESS
39 #include "intervals.h"
40 #include "dispextern.h"
42 #include "blockinput.h"
48 #include "termhooks.h"
54 #include <sys/types.h>
58 #if 1 /* Used to be #ifdef EMACS_BITMAP_FILES, but this should always work. */
59 #include "bitmaps/gray.xbm"
61 #include <X11/bitmaps/gray>
64 #include "[.bitmaps]gray.xbm"
72 #include <X11/Shell.h>
75 #include <X11/Xaw/Paned.h>
76 #include <X11/Xaw/Label.h>
77 #endif /* USE_MOTIF */
80 #undef USG /* ####KLUDGE for Solaris 2.2 and up */
89 #include "../lwlib/lwlib.h"
93 #include <Xm/DialogS.h>
94 #include <Xm/FileSB.h>
97 /* Do the EDITRES protocol if running X11R5
98 Exception: HP-UX (at least version A.09.05) has X11R5 without EditRes */
100 #if (XtSpecificationRelease >= 5) && !defined(NO_EDITRES)
102 extern void _XEditResCheckMessages ();
103 #endif /* R5 + Athena */
105 /* Unique id counter for widgets created by the Lucid Widget Library. */
107 extern LWLIB_ID widget_id_tick
;
110 /* This is part of a kludge--see lwlib/xlwmenu.c. */
111 extern XFontStruct
*xlwmenu_default_font
;
114 extern void free_frame_menubar ();
115 extern double atof ();
119 /* LessTif/Motif version info. */
121 static Lisp_Object Vmotif_version_string
;
123 #endif /* USE_MOTIF */
125 #endif /* USE_X_TOOLKIT */
129 /* GTK+ version info */
131 static Lisp_Object Vgtk_version_string
;
136 #define MAXREQUEST(dpy) (XMaxRequestSize (dpy))
138 #define MAXREQUEST(dpy) ((dpy)->max_request_size)
141 /* The gray bitmap `bitmaps/gray'. This is done because xterm.c uses
142 it, and including `bitmaps/gray' more than once is a problem when
143 config.h defines `static' as an empty replacement string. */
145 int gray_bitmap_width
= gray_width
;
146 int gray_bitmap_height
= gray_height
;
147 char *gray_bitmap_bits
= gray_bits
;
149 /* Non-zero means we're allowed to display an hourglass cursor. */
151 int display_hourglass_p
;
153 /* Non-zero means prompt with the old GTK file selection dialog. */
155 int x_use_old_gtk_file_dialog
;
157 /* The background and shape of the mouse pointer, and shape when not
158 over text or in the modeline. */
160 Lisp_Object Vx_pointer_shape
, Vx_nontext_pointer_shape
, Vx_mode_pointer_shape
;
161 Lisp_Object Vx_hourglass_pointer_shape
;
163 /* The shape when over mouse-sensitive text. */
165 Lisp_Object Vx_sensitive_text_pointer_shape
;
167 /* If non-nil, the pointer shape to indicate that windows can be
168 dragged horizontally. */
170 Lisp_Object Vx_window_horizontal_drag_shape
;
172 /* Color of chars displayed in cursor box. */
174 Lisp_Object Vx_cursor_fore_pixel
;
176 /* Nonzero if using X. */
180 /* Non nil if no window manager is in use. */
182 Lisp_Object Vx_no_window_manager
;
184 /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'. */
186 Lisp_Object Vx_pixel_size_width_font_regexp
;
189 Lisp_Object Qsuppress_icon
;
190 Lisp_Object Qundefined_color
;
191 Lisp_Object Qcompound_text
, Qcancel_timer
;
195 extern Lisp_Object Vwindow_system_version
;
197 /* The below are defined in frame.c. */
200 int image_cache_refcount
, dpyinfo_refcount
;
205 /* Error if we are not connected to X. */
211 error ("X windows are not in use or not initialized");
214 /* Nonzero if we can use mouse menus.
215 You should not call this unless HAVE_MENUS is defined. */
223 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame
224 and checking validity for X. */
227 check_x_frame (frame
)
233 frame
= selected_frame
;
234 CHECK_LIVE_FRAME (frame
);
237 error ("Non-X frame used");
241 /* Let the user specify an X display with a frame.
242 nil stands for the selected frame--or, if that is not an X frame,
243 the first X display on the list. */
245 struct x_display_info
*
246 check_x_display_info (frame
)
249 struct x_display_info
*dpyinfo
= NULL
;
253 struct frame
*sf
= XFRAME (selected_frame
);
255 if (FRAME_X_P (sf
) && FRAME_LIVE_P (sf
))
256 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
257 else if (x_display_list
!= 0)
258 dpyinfo
= x_display_list
;
260 error ("X windows are not in use or not initialized");
262 else if (STRINGP (frame
))
263 dpyinfo
= x_display_info_for_name (frame
);
266 FRAME_PTR f
= check_x_frame (frame
);
267 dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
274 /* Return the Emacs frame-object corresponding to an X window.
275 It could be the frame's main window or an icon window. */
277 /* This function can be called during GC, so use GC_xxx type test macros. */
280 x_window_to_frame (dpyinfo
, wdesc
)
281 struct x_display_info
*dpyinfo
;
284 Lisp_Object tail
, frame
;
287 if (wdesc
== None
) return 0;
289 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
292 if (!GC_FRAMEP (frame
))
295 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
297 if (f
->output_data
.x
->hourglass_window
== wdesc
)
300 if ((f
->output_data
.x
->edit_widget
301 && XtWindow (f
->output_data
.x
->edit_widget
) == wdesc
)
302 /* A tooltip frame? */
303 || (!f
->output_data
.x
->edit_widget
304 && FRAME_X_WINDOW (f
) == wdesc
)
305 || f
->output_data
.x
->icon_desc
== wdesc
)
307 #else /* not USE_X_TOOLKIT */
309 if (f
->output_data
.x
->edit_widget
)
311 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
312 struct x_output
*x
= f
->output_data
.x
;
313 if (gwdesc
!= 0 && gwdesc
== x
->edit_widget
)
317 if (FRAME_X_WINDOW (f
) == wdesc
318 || f
->output_data
.x
->icon_desc
== wdesc
)
320 #endif /* not USE_X_TOOLKIT */
325 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
326 /* Like x_window_to_frame but also compares the window with the widget's
330 x_any_window_to_frame (dpyinfo
, wdesc
)
331 struct x_display_info
*dpyinfo
;
334 Lisp_Object tail
, frame
;
335 struct frame
*f
, *found
;
338 if (wdesc
== None
) return NULL
;
341 for (tail
= Vframe_list
; GC_CONSP (tail
) && !found
; tail
= XCDR (tail
))
344 if (!GC_FRAMEP (frame
))
348 if (FRAME_X_P (f
) && FRAME_X_DISPLAY_INFO (f
) == dpyinfo
)
350 /* This frame matches if the window is any of its widgets. */
351 x
= f
->output_data
.x
;
352 if (x
->hourglass_window
== wdesc
)
357 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
359 && (gwdesc
== x
->widget
360 || gwdesc
== x
->edit_widget
361 || gwdesc
== x
->vbox_widget
362 || gwdesc
== x
->menubar_widget
))
365 if (wdesc
== XtWindow (x
->widget
)
366 || wdesc
== XtWindow (x
->column_widget
)
367 || wdesc
== XtWindow (x
->edit_widget
))
369 /* Match if the window is this frame's menubar. */
370 else if (lw_window_is_in_menubar (wdesc
, x
->menubar_widget
))
374 else if (FRAME_X_WINDOW (f
) == wdesc
)
375 /* A tooltip frame. */
383 /* Likewise, but exclude the menu bar widget. */
386 x_non_menubar_window_to_frame (dpyinfo
, wdesc
)
387 struct x_display_info
*dpyinfo
;
390 Lisp_Object tail
, frame
;
394 if (wdesc
== None
) return 0;
396 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
399 if (!GC_FRAMEP (frame
))
402 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
404 x
= f
->output_data
.x
;
405 /* This frame matches if the window is any of its widgets. */
406 if (x
->hourglass_window
== wdesc
)
411 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
413 && (gwdesc
== x
->widget
414 || gwdesc
== x
->edit_widget
415 || gwdesc
== x
->vbox_widget
))
418 if (wdesc
== XtWindow (x
->widget
)
419 || wdesc
== XtWindow (x
->column_widget
)
420 || wdesc
== XtWindow (x
->edit_widget
))
424 else if (FRAME_X_WINDOW (f
) == wdesc
)
425 /* A tooltip frame. */
431 /* Likewise, but consider only the menu bar widget. */
434 x_menubar_window_to_frame (dpyinfo
, wdesc
)
435 struct x_display_info
*dpyinfo
;
438 Lisp_Object tail
, frame
;
442 if (wdesc
== None
) return 0;
444 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
447 if (!GC_FRAMEP (frame
))
450 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
452 x
= f
->output_data
.x
;
453 /* Match if the window is this frame's menubar. */
455 if (x
->menubar_widget
)
457 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
462 && (gwdesc
== x
->menubar_widget
463 || gtk_widget_get_parent (gwdesc
) == x
->menubar_widget
))
469 if (x
->menubar_widget
470 && lw_window_is_in_menubar (wdesc
, x
->menubar_widget
))
477 /* Return the frame whose principal (outermost) window is WDESC.
478 If WDESC is some other (smaller) window, we return 0. */
481 x_top_window_to_frame (dpyinfo
, wdesc
)
482 struct x_display_info
*dpyinfo
;
485 Lisp_Object tail
, frame
;
489 if (wdesc
== None
) return 0;
491 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
494 if (!GC_FRAMEP (frame
))
497 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
499 x
= f
->output_data
.x
;
503 /* This frame matches if the window is its topmost widget. */
505 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
506 if (gwdesc
== x
->widget
)
509 if (wdesc
== XtWindow (x
->widget
))
511 #if 0 /* I don't know why it did this,
512 but it seems logically wrong,
513 and it causes trouble for MapNotify events. */
514 /* Match if the window is this frame's menubar. */
515 if (x
->menubar_widget
516 && wdesc
== XtWindow (x
->menubar_widget
))
521 else if (FRAME_X_WINDOW (f
) == wdesc
)
527 #endif /* USE_X_TOOLKIT || USE_GTK */
531 static Lisp_Object unwind_create_frame
P_ ((Lisp_Object
));
532 static Lisp_Object unwind_create_tip_frame
P_ ((Lisp_Object
));
534 void x_set_foreground_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
535 static void x_set_wait_for_wm
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
536 void x_set_background_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
537 void x_set_mouse_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
538 void x_set_cursor_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
539 void x_set_border_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
540 void x_set_cursor_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
541 void x_set_icon_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
542 void x_set_icon_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
543 void x_explicitly_set_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
544 void x_set_menu_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
545 void x_set_title
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
546 void x_set_tool_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
547 void x_set_scroll_bar_foreground
P_ ((struct frame
*, Lisp_Object
,
549 void x_set_scroll_bar_background
P_ ((struct frame
*, Lisp_Object
,
551 static Lisp_Object x_default_scroll_bar_color_parameter
P_ ((struct frame
*,
558 /* Store the screen positions of frame F into XPTR and YPTR.
559 These are the positions of the containing window manager window,
560 not Emacs's own window. */
563 x_real_positions (f
, xptr
, yptr
)
567 int win_x
, win_y
, outer_x
, outer_y
;
568 int real_x
= 0, real_y
= 0;
570 Window win
= f
->output_data
.x
->parent_desc
;
576 count
= x_catch_errors (FRAME_X_DISPLAY (f
));
578 if (win
== FRAME_X_DISPLAY_INFO (f
)->root_window
)
579 win
= FRAME_OUTER_WINDOW (f
);
581 /* This loop traverses up the containment tree until we hit the root
582 window. Window managers may intersect many windows between our window
583 and the root window. The window we find just before the root window
584 should be the outer WM window. */
587 Window wm_window
, rootw
;
588 Window
*tmp_children
;
589 unsigned int tmp_nchildren
;
592 success
= XQueryTree (FRAME_X_DISPLAY (f
), win
, &rootw
,
593 &wm_window
, &tmp_children
, &tmp_nchildren
);
595 had_errors
= x_had_errors_p (FRAME_X_DISPLAY (f
));
597 /* Don't free tmp_children if XQueryTree failed. */
601 XFree ((char *) tmp_children
);
603 if (wm_window
== rootw
|| had_errors
)
614 /* Get the real coordinates for the WM window upper left corner */
615 XGetGeometry (FRAME_X_DISPLAY (f
), win
,
616 &rootw
, &real_x
, &real_y
, &ign
, &ign
, &ign
, &ign
);
618 /* Translate real coordinates to coordinates relative to our
619 window. For our window, the upper left corner is 0, 0.
620 Since the upper left corner of the WM window is outside
621 our window, win_x and win_y will be negative:
623 ------------------ ---> x
625 | ----------------- v y
628 XTranslateCoordinates (FRAME_X_DISPLAY (f
),
630 /* From-window, to-window. */
631 FRAME_X_DISPLAY_INFO (f
)->root_window
,
634 /* From-position, to-position. */
635 real_x
, real_y
, &win_x
, &win_y
,
640 if (FRAME_X_WINDOW (f
) == FRAME_OUTER_WINDOW (f
))
647 XTranslateCoordinates (FRAME_X_DISPLAY (f
),
649 /* From-window, to-window. */
650 FRAME_X_DISPLAY_INFO (f
)->root_window
,
651 FRAME_OUTER_WINDOW (f
),
653 /* From-position, to-position. */
654 real_x
, real_y
, &outer_x
, &outer_y
,
660 had_errors
= x_had_errors_p (FRAME_X_DISPLAY (f
));
663 x_uncatch_errors (FRAME_X_DISPLAY (f
), count
);
667 if (had_errors
) return;
669 f
->x_pixels_diff
= -win_x
;
670 f
->y_pixels_diff
= -win_y
;
672 FRAME_X_OUTPUT (f
)->x_pixels_outer_diff
= -outer_x
;
673 FRAME_X_OUTPUT (f
)->y_pixels_outer_diff
= -outer_y
;
682 /* Gamma-correct COLOR on frame F. */
685 gamma_correct (f
, color
)
691 color
->red
= pow (color
->red
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
692 color
->green
= pow (color
->green
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
693 color
->blue
= pow (color
->blue
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
698 /* Decide if color named COLOR_NAME is valid for use on frame F. If
699 so, return the RGB values in COLOR. If ALLOC_P is non-zero,
700 allocate the color. Value is zero if COLOR_NAME is invalid, or
701 no color could be allocated. */
704 x_defined_color (f
, color_name
, color
, alloc_p
)
711 Display
*dpy
= FRAME_X_DISPLAY (f
);
712 Colormap cmap
= FRAME_X_COLORMAP (f
);
715 success_p
= XParseColor (dpy
, cmap
, color_name
, color
);
716 if (success_p
&& alloc_p
)
717 success_p
= x_alloc_nearest_color (f
, cmap
, color
);
724 /* Return the pixel color value for color COLOR_NAME on frame F. If F
725 is a monochrome frame, return MONO_COLOR regardless of what ARG says.
726 Signal an error if color can't be allocated. */
729 x_decode_color (f
, color_name
, mono_color
)
731 Lisp_Object color_name
;
736 CHECK_STRING (color_name
);
738 #if 0 /* Don't do this. It's wrong when we're not using the default
739 colormap, it makes freeing difficult, and it's probably not
740 an important optimization. */
741 if (strcmp (SDATA (color_name
), "black") == 0)
742 return BLACK_PIX_DEFAULT (f
);
743 else if (strcmp (SDATA (color_name
), "white") == 0)
744 return WHITE_PIX_DEFAULT (f
);
747 /* Return MONO_COLOR for monochrome frames. */
748 if (FRAME_X_DISPLAY_INFO (f
)->n_planes
== 1)
751 /* x_defined_color is responsible for coping with failures
752 by looking for a near-miss. */
753 if (x_defined_color (f
, SDATA (color_name
), &cdef
, 1))
756 Fsignal (Qerror
, Fcons (build_string ("Undefined color"),
757 Fcons (color_name
, Qnil
)));
763 /* Change the `wait-for-wm' frame parameter of frame F. OLD_VALUE is
764 the previous value of that parameter, NEW_VALUE is the new value.
765 See also the comment of wait_for_wm in struct x_output. */
768 x_set_wait_for_wm (f
, new_value
, old_value
)
770 Lisp_Object new_value
, old_value
;
772 f
->output_data
.x
->wait_for_wm
= !NILP (new_value
);
777 /* Set icon from FILE for frame F. By using GTK functions the icon
778 may be any format that GdkPixbuf knows about, i.e. not just bitmaps. */
781 xg_set_icon (f
, file
)
791 found
= x_find_image_file (file
);
799 filename
= SDATA (found
);
802 pixbuf
= gdk_pixbuf_new_from_file (filename
, &err
);
806 gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)),
808 g_object_unref (pixbuf
);
824 /* Functions called only from `x_set_frame_param'
825 to set individual parameters.
827 If FRAME_X_WINDOW (f) is 0,
828 the frame is being created and its X-window does not exist yet.
829 In that case, just record the parameter's new value
830 in the standard place; do not attempt to change the window. */
833 x_set_foreground_color (f
, arg
, oldval
)
835 Lisp_Object arg
, oldval
;
837 struct x_output
*x
= f
->output_data
.x
;
838 unsigned long fg
, old_fg
;
840 fg
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
841 old_fg
= x
->foreground_pixel
;
842 x
->foreground_pixel
= fg
;
844 if (FRAME_X_WINDOW (f
) != 0)
846 Display
*dpy
= FRAME_X_DISPLAY (f
);
849 XSetForeground (dpy
, x
->normal_gc
, fg
);
850 XSetBackground (dpy
, x
->reverse_gc
, fg
);
852 if (x
->cursor_pixel
== old_fg
)
854 unload_color (f
, x
->cursor_pixel
);
855 x
->cursor_pixel
= x_copy_color (f
, fg
);
856 XSetBackground (dpy
, x
->cursor_gc
, x
->cursor_pixel
);
861 update_face_from_frame_parameter (f
, Qforeground_color
, arg
);
863 if (FRAME_VISIBLE_P (f
))
867 unload_color (f
, old_fg
);
871 x_set_background_color (f
, arg
, oldval
)
873 Lisp_Object arg
, oldval
;
875 struct x_output
*x
= f
->output_data
.x
;
878 bg
= x_decode_color (f
, arg
, WHITE_PIX_DEFAULT (f
));
879 unload_color (f
, x
->background_pixel
);
880 x
->background_pixel
= bg
;
882 if (FRAME_X_WINDOW (f
) != 0)
884 Display
*dpy
= FRAME_X_DISPLAY (f
);
887 XSetBackground (dpy
, x
->normal_gc
, bg
);
888 XSetForeground (dpy
, x
->reverse_gc
, bg
);
889 XSetWindowBackground (dpy
, FRAME_X_WINDOW (f
), bg
);
890 XSetForeground (dpy
, x
->cursor_gc
, bg
);
893 xg_set_background_color (f
, bg
);
896 #ifndef USE_TOOLKIT_SCROLL_BARS /* Turns out to be annoying with
897 toolkit scroll bars. */
900 for (bar
= FRAME_SCROLL_BARS (f
);
902 bar
= XSCROLL_BAR (bar
)->next
)
904 Window window
= SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar
));
905 XSetWindowBackground (dpy
, window
, bg
);
908 #endif /* USE_TOOLKIT_SCROLL_BARS */
911 update_face_from_frame_parameter (f
, Qbackground_color
, arg
);
913 if (FRAME_VISIBLE_P (f
))
919 x_set_mouse_color (f
, arg
, oldval
)
921 Lisp_Object arg
, oldval
;
923 struct x_output
*x
= f
->output_data
.x
;
924 Display
*dpy
= FRAME_X_DISPLAY (f
);
925 Cursor cursor
, nontext_cursor
, mode_cursor
, hand_cursor
;
926 Cursor hourglass_cursor
, horizontal_drag_cursor
;
928 unsigned long pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
929 unsigned long mask_color
= x
->background_pixel
;
931 /* Don't let pointers be invisible. */
932 if (mask_color
== pixel
)
934 x_free_colors (f
, &pixel
, 1);
935 pixel
= x_copy_color (f
, x
->foreground_pixel
);
938 unload_color (f
, x
->mouse_pixel
);
939 x
->mouse_pixel
= pixel
;
943 /* It's not okay to crash if the user selects a screwy cursor. */
944 count
= x_catch_errors (dpy
);
946 if (!NILP (Vx_pointer_shape
))
948 CHECK_NUMBER (Vx_pointer_shape
);
949 cursor
= XCreateFontCursor (dpy
, XINT (Vx_pointer_shape
));
952 cursor
= XCreateFontCursor (dpy
, XC_xterm
);
953 x_check_errors (dpy
, "bad text pointer cursor: %s");
955 if (!NILP (Vx_nontext_pointer_shape
))
957 CHECK_NUMBER (Vx_nontext_pointer_shape
);
959 = XCreateFontCursor (dpy
, XINT (Vx_nontext_pointer_shape
));
962 nontext_cursor
= XCreateFontCursor (dpy
, XC_left_ptr
);
963 x_check_errors (dpy
, "bad nontext pointer cursor: %s");
965 if (!NILP (Vx_hourglass_pointer_shape
))
967 CHECK_NUMBER (Vx_hourglass_pointer_shape
);
969 = XCreateFontCursor (dpy
, XINT (Vx_hourglass_pointer_shape
));
972 hourglass_cursor
= XCreateFontCursor (dpy
, XC_watch
);
973 x_check_errors (dpy
, "bad hourglass pointer cursor: %s");
975 if (!NILP (Vx_mode_pointer_shape
))
977 CHECK_NUMBER (Vx_mode_pointer_shape
);
978 mode_cursor
= XCreateFontCursor (dpy
, XINT (Vx_mode_pointer_shape
));
981 mode_cursor
= XCreateFontCursor (dpy
, XC_xterm
);
982 x_check_errors (dpy
, "bad modeline pointer cursor: %s");
984 if (!NILP (Vx_sensitive_text_pointer_shape
))
986 CHECK_NUMBER (Vx_sensitive_text_pointer_shape
);
988 = XCreateFontCursor (dpy
, XINT (Vx_sensitive_text_pointer_shape
));
991 hand_cursor
= XCreateFontCursor (dpy
, XC_hand2
);
993 if (!NILP (Vx_window_horizontal_drag_shape
))
995 CHECK_NUMBER (Vx_window_horizontal_drag_shape
);
996 horizontal_drag_cursor
997 = XCreateFontCursor (dpy
, XINT (Vx_window_horizontal_drag_shape
));
1000 horizontal_drag_cursor
1001 = XCreateFontCursor (dpy
, XC_sb_h_double_arrow
);
1003 /* Check and report errors with the above calls. */
1004 x_check_errors (dpy
, "can't set cursor shape: %s");
1005 x_uncatch_errors (dpy
, count
);
1008 XColor fore_color
, back_color
;
1010 fore_color
.pixel
= x
->mouse_pixel
;
1011 x_query_color (f
, &fore_color
);
1012 back_color
.pixel
= mask_color
;
1013 x_query_color (f
, &back_color
);
1015 XRecolorCursor (dpy
, cursor
, &fore_color
, &back_color
);
1016 XRecolorCursor (dpy
, nontext_cursor
, &fore_color
, &back_color
);
1017 XRecolorCursor (dpy
, mode_cursor
, &fore_color
, &back_color
);
1018 XRecolorCursor (dpy
, hand_cursor
, &fore_color
, &back_color
);
1019 XRecolorCursor (dpy
, hourglass_cursor
, &fore_color
, &back_color
);
1020 XRecolorCursor (dpy
, horizontal_drag_cursor
, &fore_color
, &back_color
);
1023 if (FRAME_X_WINDOW (f
) != 0)
1024 XDefineCursor (dpy
, FRAME_X_WINDOW (f
), cursor
);
1026 if (cursor
!= x
->text_cursor
1027 && x
->text_cursor
!= 0)
1028 XFreeCursor (dpy
, x
->text_cursor
);
1029 x
->text_cursor
= cursor
;
1031 if (nontext_cursor
!= x
->nontext_cursor
1032 && x
->nontext_cursor
!= 0)
1033 XFreeCursor (dpy
, x
->nontext_cursor
);
1034 x
->nontext_cursor
= nontext_cursor
;
1036 if (hourglass_cursor
!= x
->hourglass_cursor
1037 && x
->hourglass_cursor
!= 0)
1038 XFreeCursor (dpy
, x
->hourglass_cursor
);
1039 x
->hourglass_cursor
= hourglass_cursor
;
1041 if (mode_cursor
!= x
->modeline_cursor
1042 && x
->modeline_cursor
!= 0)
1043 XFreeCursor (dpy
, f
->output_data
.x
->modeline_cursor
);
1044 x
->modeline_cursor
= mode_cursor
;
1046 if (hand_cursor
!= x
->hand_cursor
1047 && x
->hand_cursor
!= 0)
1048 XFreeCursor (dpy
, x
->hand_cursor
);
1049 x
->hand_cursor
= hand_cursor
;
1051 if (horizontal_drag_cursor
!= x
->horizontal_drag_cursor
1052 && x
->horizontal_drag_cursor
!= 0)
1053 XFreeCursor (dpy
, x
->horizontal_drag_cursor
);
1054 x
->horizontal_drag_cursor
= horizontal_drag_cursor
;
1059 update_face_from_frame_parameter (f
, Qmouse_color
, arg
);
1063 x_set_cursor_color (f
, arg
, oldval
)
1065 Lisp_Object arg
, oldval
;
1067 unsigned long fore_pixel
, pixel
;
1068 int fore_pixel_allocated_p
= 0, pixel_allocated_p
= 0;
1069 struct x_output
*x
= f
->output_data
.x
;
1071 if (!NILP (Vx_cursor_fore_pixel
))
1073 fore_pixel
= x_decode_color (f
, Vx_cursor_fore_pixel
,
1074 WHITE_PIX_DEFAULT (f
));
1075 fore_pixel_allocated_p
= 1;
1078 fore_pixel
= x
->background_pixel
;
1080 pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1081 pixel_allocated_p
= 1;
1083 /* Make sure that the cursor color differs from the background color. */
1084 if (pixel
== x
->background_pixel
)
1086 if (pixel_allocated_p
)
1088 x_free_colors (f
, &pixel
, 1);
1089 pixel_allocated_p
= 0;
1092 pixel
= x
->mouse_pixel
;
1093 if (pixel
== fore_pixel
)
1095 if (fore_pixel_allocated_p
)
1097 x_free_colors (f
, &fore_pixel
, 1);
1098 fore_pixel_allocated_p
= 0;
1100 fore_pixel
= x
->background_pixel
;
1104 unload_color (f
, x
->cursor_foreground_pixel
);
1105 if (!fore_pixel_allocated_p
)
1106 fore_pixel
= x_copy_color (f
, fore_pixel
);
1107 x
->cursor_foreground_pixel
= fore_pixel
;
1109 unload_color (f
, x
->cursor_pixel
);
1110 if (!pixel_allocated_p
)
1111 pixel
= x_copy_color (f
, pixel
);
1112 x
->cursor_pixel
= pixel
;
1114 if (FRAME_X_WINDOW (f
) != 0)
1117 XSetBackground (FRAME_X_DISPLAY (f
), x
->cursor_gc
, x
->cursor_pixel
);
1118 XSetForeground (FRAME_X_DISPLAY (f
), x
->cursor_gc
, fore_pixel
);
1121 if (FRAME_VISIBLE_P (f
))
1123 x_update_cursor (f
, 0);
1124 x_update_cursor (f
, 1);
1128 update_face_from_frame_parameter (f
, Qcursor_color
, arg
);
1131 /* Set the border-color of frame F to pixel value PIX.
1132 Note that this does not fully take effect if done before
1133 F has an x-window. */
1136 x_set_border_pixel (f
, pix
)
1140 unload_color (f
, f
->output_data
.x
->border_pixel
);
1141 f
->output_data
.x
->border_pixel
= pix
;
1143 if (FRAME_X_WINDOW (f
) != 0 && f
->border_width
> 0)
1146 XSetWindowBorder (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1147 (unsigned long)pix
);
1150 if (FRAME_VISIBLE_P (f
))
1155 /* Set the border-color of frame F to value described by ARG.
1156 ARG can be a string naming a color.
1157 The border-color is used for the border that is drawn by the X server.
1158 Note that this does not fully take effect if done before
1159 F has an x-window; it must be redone when the window is created.
1161 Note: this is done in two routines because of the way X10 works.
1163 Note: under X11, this is normally the province of the window manager,
1164 and so emacs' border colors may be overridden. */
1167 x_set_border_color (f
, arg
, oldval
)
1169 Lisp_Object arg
, oldval
;
1174 pix
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1175 x_set_border_pixel (f
, pix
);
1176 update_face_from_frame_parameter (f
, Qborder_color
, arg
);
1181 x_set_cursor_type (f
, arg
, oldval
)
1183 Lisp_Object arg
, oldval
;
1185 set_frame_cursor_types (f
, arg
);
1187 /* Make sure the cursor gets redrawn. */
1188 cursor_type_changed
= 1;
1192 x_set_icon_type (f
, arg
, oldval
)
1194 Lisp_Object arg
, oldval
;
1200 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1203 else if (!STRINGP (oldval
) && EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
1208 result
= x_text_icon (f
,
1209 (char *) SDATA ((!NILP (f
->icon_name
)
1213 result
= x_bitmap_icon (f
, arg
);
1218 error ("No icon window available");
1221 XFlush (FRAME_X_DISPLAY (f
));
1226 x_set_icon_name (f
, arg
, oldval
)
1228 Lisp_Object arg
, oldval
;
1234 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1237 else if (!STRINGP (oldval
) && EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
1242 if (f
->output_data
.x
->icon_bitmap
!= 0)
1247 result
= x_text_icon (f
,
1248 (char *) SDATA ((!NILP (f
->icon_name
)
1257 error ("No icon window available");
1260 XFlush (FRAME_X_DISPLAY (f
));
1266 x_set_menu_bar_lines (f
, value
, oldval
)
1268 Lisp_Object value
, oldval
;
1271 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
1272 int olines
= FRAME_MENU_BAR_LINES (f
);
1275 /* Right now, menu bars don't work properly in minibuf-only frames;
1276 most of the commands try to apply themselves to the minibuffer
1277 frame itself, and get an error because you can't switch buffers
1278 in or split the minibuffer window. */
1279 if (FRAME_MINIBUF_ONLY_P (f
))
1282 if (INTEGERP (value
))
1283 nlines
= XINT (value
);
1287 /* Make sure we redisplay all windows in this frame. */
1288 windows_or_buffers_changed
++;
1290 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
1291 FRAME_MENU_BAR_LINES (f
) = 0;
1294 FRAME_EXTERNAL_MENU_BAR (f
) = 1;
1295 if (FRAME_X_P (f
) && f
->output_data
.x
->menubar_widget
== 0)
1296 /* Make sure next redisplay shows the menu bar. */
1297 XWINDOW (FRAME_SELECTED_WINDOW (f
))->update_mode_line
= Qt
;
1301 if (FRAME_EXTERNAL_MENU_BAR (f
) == 1)
1302 free_frame_menubar (f
);
1303 FRAME_EXTERNAL_MENU_BAR (f
) = 0;
1305 f
->output_data
.x
->menubar_widget
= 0;
1307 #else /* not USE_X_TOOLKIT && not USE_GTK */
1308 FRAME_MENU_BAR_LINES (f
) = nlines
;
1309 change_window_heights (f
->root_window
, nlines
- olines
);
1310 #endif /* not USE_X_TOOLKIT */
1315 /* Set the number of lines used for the tool bar of frame F to VALUE.
1316 VALUE not an integer, or < 0 means set the lines to zero. OLDVAL
1317 is the old number of tool bar lines. This function changes the
1318 height of all windows on frame F to match the new tool bar height.
1319 The frame's height doesn't change. */
1322 x_set_tool_bar_lines (f
, value
, oldval
)
1324 Lisp_Object value
, oldval
;
1326 int delta
, nlines
, root_height
;
1327 Lisp_Object root_window
;
1329 /* Treat tool bars like menu bars. */
1330 if (FRAME_MINIBUF_ONLY_P (f
))
1333 /* Use VALUE only if an integer >= 0. */
1334 if (INTEGERP (value
) && XINT (value
) >= 0)
1335 nlines
= XFASTINT (value
);
1340 FRAME_TOOL_BAR_LINES (f
) = 0;
1343 FRAME_EXTERNAL_TOOL_BAR (f
) = 1;
1344 if (FRAME_X_P (f
) && f
->output_data
.x
->toolbar_widget
== 0)
1345 /* Make sure next redisplay shows the tool bar. */
1346 XWINDOW (FRAME_SELECTED_WINDOW (f
))->update_mode_line
= Qt
;
1347 update_frame_tool_bar (f
);
1351 if (FRAME_EXTERNAL_TOOL_BAR (f
))
1352 free_frame_tool_bar (f
);
1353 FRAME_EXTERNAL_TOOL_BAR (f
) = 0;
1359 /* Make sure we redisplay all windows in this frame. */
1360 ++windows_or_buffers_changed
;
1362 delta
= nlines
- FRAME_TOOL_BAR_LINES (f
);
1364 /* Don't resize the tool-bar to more than we have room for. */
1365 root_window
= FRAME_ROOT_WINDOW (f
);
1366 root_height
= WINDOW_TOTAL_LINES (XWINDOW (root_window
));
1367 if (root_height
- delta
< 1)
1369 delta
= root_height
- 1;
1370 nlines
= FRAME_TOOL_BAR_LINES (f
) + delta
;
1373 FRAME_TOOL_BAR_LINES (f
) = nlines
;
1374 change_window_heights (root_window
, delta
);
1377 /* We also have to make sure that the internal border at the top of
1378 the frame, below the menu bar or tool bar, is redrawn when the
1379 tool bar disappears. This is so because the internal border is
1380 below the tool bar if one is displayed, but is below the menu bar
1381 if there isn't a tool bar. The tool bar draws into the area
1382 below the menu bar. */
1383 if (FRAME_X_WINDOW (f
) && FRAME_TOOL_BAR_LINES (f
) == 0)
1387 clear_current_matrices (f
);
1388 updating_frame
= NULL
;
1391 /* If the tool bar gets smaller, the internal border below it
1392 has to be cleared. It was formerly part of the display
1393 of the larger tool bar, and updating windows won't clear it. */
1396 int height
= FRAME_INTERNAL_BORDER_WIDTH (f
);
1397 int width
= FRAME_PIXEL_WIDTH (f
);
1398 int y
= nlines
* FRAME_LINE_HEIGHT (f
);
1400 /* height can be zero here. */
1401 if (height
> 0 && width
> 0)
1404 x_clear_area (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1405 0, y
, width
, height
, False
);
1409 if (WINDOWP (f
->tool_bar_window
))
1410 clear_glyph_matrix (XWINDOW (f
->tool_bar_window
)->current_matrix
);
1415 /* Set the foreground color for scroll bars on frame F to VALUE.
1416 VALUE should be a string, a color name. If it isn't a string or
1417 isn't a valid color name, do nothing. OLDVAL is the old value of
1418 the frame parameter. */
1421 x_set_scroll_bar_foreground (f
, value
, oldval
)
1423 Lisp_Object value
, oldval
;
1425 unsigned long pixel
;
1427 if (STRINGP (value
))
1428 pixel
= x_decode_color (f
, value
, BLACK_PIX_DEFAULT (f
));
1432 if (f
->output_data
.x
->scroll_bar_foreground_pixel
!= -1)
1433 unload_color (f
, f
->output_data
.x
->scroll_bar_foreground_pixel
);
1435 f
->output_data
.x
->scroll_bar_foreground_pixel
= pixel
;
1436 if (FRAME_X_WINDOW (f
) && FRAME_VISIBLE_P (f
))
1438 /* Remove all scroll bars because they have wrong colors. */
1439 if (condemn_scroll_bars_hook
)
1440 (*condemn_scroll_bars_hook
) (f
);
1441 if (judge_scroll_bars_hook
)
1442 (*judge_scroll_bars_hook
) (f
);
1444 update_face_from_frame_parameter (f
, Qscroll_bar_foreground
, value
);
1450 /* Set the background color for scroll bars on frame F to VALUE VALUE
1451 should be a string, a color name. If it isn't a string or isn't a
1452 valid color name, do nothing. OLDVAL is the old value of the frame
1456 x_set_scroll_bar_background (f
, value
, oldval
)
1458 Lisp_Object value
, oldval
;
1460 unsigned long pixel
;
1462 if (STRINGP (value
))
1463 pixel
= x_decode_color (f
, value
, WHITE_PIX_DEFAULT (f
));
1467 if (f
->output_data
.x
->scroll_bar_background_pixel
!= -1)
1468 unload_color (f
, f
->output_data
.x
->scroll_bar_background_pixel
);
1470 #ifdef USE_TOOLKIT_SCROLL_BARS
1471 /* Scrollbar shadow colors. */
1472 if (f
->output_data
.x
->scroll_bar_top_shadow_pixel
!= -1)
1474 unload_color (f
, f
->output_data
.x
->scroll_bar_top_shadow_pixel
);
1475 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
1477 if (f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
!= -1)
1479 unload_color (f
, f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
);
1480 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
1482 #endif /* USE_TOOLKIT_SCROLL_BARS */
1484 f
->output_data
.x
->scroll_bar_background_pixel
= pixel
;
1485 if (FRAME_X_WINDOW (f
) && FRAME_VISIBLE_P (f
))
1487 /* Remove all scroll bars because they have wrong colors. */
1488 if (condemn_scroll_bars_hook
)
1489 (*condemn_scroll_bars_hook
) (f
);
1490 if (judge_scroll_bars_hook
)
1491 (*judge_scroll_bars_hook
) (f
);
1493 update_face_from_frame_parameter (f
, Qscroll_bar_background
, value
);
1499 /* Encode Lisp string STRING as a text in a format appropriate for
1500 XICCC (X Inter Client Communication Conventions).
1502 If STRING contains only ASCII characters, do no conversion and
1503 return the string data of STRING. Otherwise, encode the text by
1504 CODING_SYSTEM, and return a newly allocated memory area which
1505 should be freed by `xfree' by a caller.
1507 SELECTIONP non-zero means the string is being encoded for an X
1508 selection, so it is safe to run pre-write conversions (which
1511 Store the byte length of resulting text in *TEXT_BYTES.
1513 If the text contains only ASCII and Latin-1, store 1 in *STRING_P,
1514 which means that the `encoding' of the result can be `STRING'.
1515 Otherwise store 0 in *STRINGP, which means that the `encoding' of
1516 the result should be `COMPOUND_TEXT'. */
1518 static unsigned char *
1519 x_encode_text (string
, coding_system
, selectionp
, text_bytes
, stringp
, freep
)
1520 Lisp_Object string
, coding_system
;
1521 int *text_bytes
, *stringp
;
1525 unsigned char *str
= SDATA (string
);
1526 int chars
= SCHARS (string
);
1527 int bytes
= SBYTES (string
);
1531 struct coding_system coding
;
1532 extern Lisp_Object Qcompound_text_with_extensions
;
1534 charset_info
= find_charset_in_text (str
, chars
, bytes
, NULL
, Qnil
);
1535 if (charset_info
== 0)
1537 /* No multibyte character in OBJ. We need not encode it. */
1538 *text_bytes
= bytes
;
1544 setup_coding_system (coding_system
, &coding
);
1546 && SYMBOLP (coding
.pre_write_conversion
)
1547 && !NILP (Ffboundp (coding
.pre_write_conversion
)))
1549 string
= run_pre_post_conversion_on_str (string
, &coding
, 1);
1550 str
= SDATA (string
);
1551 chars
= SCHARS (string
);
1552 bytes
= SBYTES (string
);
1554 coding
.src_multibyte
= 1;
1555 coding
.dst_multibyte
= 0;
1556 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1557 if (coding
.type
== coding_type_iso2022
)
1558 coding
.flags
|= CODING_FLAG_ISO_SAFE
;
1559 /* We suppress producing escape sequences for composition. */
1560 coding
.composing
= COMPOSITION_DISABLED
;
1561 bufsize
= encoding_buffer_size (&coding
, bytes
);
1562 buf
= (unsigned char *) xmalloc (bufsize
);
1563 encode_coding (&coding
, str
, buf
, bytes
, bufsize
);
1564 *text_bytes
= coding
.produced
;
1565 *stringp
= (charset_info
== 1
1566 || (!EQ (coding_system
, Qcompound_text
)
1567 && !EQ (coding_system
, Qcompound_text_with_extensions
)));
1573 /* Set the WM name to NAME for frame F. Also set the icon name.
1574 If the frame already has an icon name, use that, otherwise set the
1575 icon name to NAME. */
1578 x_set_name_internal (f
, name
)
1582 if (FRAME_X_WINDOW (f
))
1587 XTextProperty text
, icon
;
1589 int do_free_icon_value
= 0, do_free_text_value
= 0;
1590 Lisp_Object coding_system
;
1592 coding_system
= Qcompound_text
;
1593 /* Note: Encoding strategy
1595 We encode NAME by compound-text and use "COMPOUND-TEXT" in
1596 text.encoding. But, there are non-internationalized window
1597 managers which don't support that encoding. So, if NAME
1598 contains only ASCII and 8859-1 characters, encode it by
1599 iso-latin-1, and use "STRING" in text.encoding hoping that
1600 such window managers at least analyze this format correctly,
1601 i.e. treat 8-bit bytes as 8859-1 characters.
1603 We may also be able to use "UTF8_STRING" in text.encoding
1604 in the future which can encode all Unicode characters.
1605 But, for the moment, there's no way to know that the
1606 current window manager supports it or not. */
1607 text
.value
= x_encode_text (name
, coding_system
, 0, &bytes
, &stringp
,
1608 &do_free_text_value
);
1609 text
.encoding
= (stringp
? XA_STRING
1610 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
1612 text
.nitems
= bytes
;
1614 if (NILP (f
->icon_name
))
1620 /* See the above comment "Note: Encoding strategy". */
1621 icon
.value
= x_encode_text (f
->icon_name
, coding_system
, 0,
1622 &bytes
, &stringp
, &do_free_icon_value
);
1623 icon
.encoding
= (stringp
? XA_STRING
1624 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
1626 icon
.nitems
= bytes
;
1630 gtk_window_set_title (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)),
1631 SDATA (ENCODE_UTF_8 (name
)));
1632 #else /* not USE_GTK */
1633 XSetWMName (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
), &text
);
1634 #endif /* not USE_GTK */
1636 XSetWMIconName (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
), &icon
);
1638 if (do_free_icon_value
)
1640 if (do_free_text_value
)
1643 #else /* not HAVE_X11R4 */
1644 XSetIconName (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1646 XStoreName (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1648 #endif /* not HAVE_X11R4 */
1653 /* Change the name of frame F to NAME. If NAME is nil, set F's name to
1656 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1657 name; if NAME is a string, set F's name to NAME and set
1658 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1660 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1661 suggesting a new name, which lisp code should override; if
1662 F->explicit_name is set, ignore the new name; otherwise, set it. */
1665 x_set_name (f
, name
, explicit)
1670 /* Make sure that requests from lisp code override requests from
1671 Emacs redisplay code. */
1674 /* If we're switching from explicit to implicit, we had better
1675 update the mode lines and thereby update the title. */
1676 if (f
->explicit_name
&& NILP (name
))
1677 update_mode_lines
= 1;
1679 f
->explicit_name
= ! NILP (name
);
1681 else if (f
->explicit_name
)
1684 /* If NAME is nil, set the name to the x_id_name. */
1687 /* Check for no change needed in this very common case
1688 before we do any consing. */
1689 if (!strcmp (FRAME_X_DISPLAY_INFO (f
)->x_id_name
,
1692 name
= build_string (FRAME_X_DISPLAY_INFO (f
)->x_id_name
);
1695 CHECK_STRING (name
);
1697 /* Don't change the name if it's already NAME. */
1698 if (! NILP (Fstring_equal (name
, f
->name
)))
1703 /* For setting the frame title, the title parameter should override
1704 the name parameter. */
1705 if (! NILP (f
->title
))
1708 x_set_name_internal (f
, name
);
1711 /* This function should be called when the user's lisp code has
1712 specified a name for the frame; the name will override any set by the
1715 x_explicitly_set_name (f
, arg
, oldval
)
1717 Lisp_Object arg
, oldval
;
1719 x_set_name (f
, arg
, 1);
1722 /* This function should be called by Emacs redisplay code to set the
1723 name; names set this way will never override names set by the user's
1726 x_implicitly_set_name (f
, arg
, oldval
)
1728 Lisp_Object arg
, oldval
;
1730 x_set_name (f
, arg
, 0);
1733 /* Change the title of frame F to NAME.
1734 If NAME is nil, use the frame name as the title.
1736 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1737 name; if NAME is a string, set F's name to NAME and set
1738 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1740 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1741 suggesting a new name, which lisp code should override; if
1742 F->explicit_name is set, ignore the new name; otherwise, set it. */
1745 x_set_title (f
, name
, old_name
)
1747 Lisp_Object name
, old_name
;
1749 /* Don't change the title if it's already NAME. */
1750 if (EQ (name
, f
->title
))
1753 update_mode_lines
= 1;
1760 CHECK_STRING (name
);
1762 x_set_name_internal (f
, name
);
1766 x_set_scroll_bar_default_width (f
)
1769 int wid
= FRAME_COLUMN_WIDTH (f
);
1771 #ifdef USE_TOOLKIT_SCROLL_BARS
1772 /* A minimum width of 14 doesn't look good for toolkit scroll bars. */
1773 int width
= 16 + 2 * VERTICAL_SCROLL_BAR_WIDTH_TRIM
;
1774 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (width
+ wid
- 1) / wid
;
1775 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = width
;
1777 /* Make the actual width at least 14 pixels and a multiple of a
1779 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (14 + wid
- 1) / wid
;
1781 /* Use all of that space (aside from required margins) for the
1783 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = 0;
1788 /* Record in frame F the specified or default value according to ALIST
1789 of the parameter named PROP (a Lisp symbol). If no value is
1790 specified for PROP, look for an X default for XPROP on the frame
1791 named NAME. If that is not found either, use the value DEFLT. */
1794 x_default_scroll_bar_color_parameter (f
, alist
, prop
, xprop
, xclass
,
1803 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
1806 tem
= x_get_arg (dpyinfo
, alist
, prop
, xprop
, xclass
, RES_TYPE_STRING
);
1807 if (EQ (tem
, Qunbound
))
1809 #ifdef USE_TOOLKIT_SCROLL_BARS
1811 /* See if an X resource for the scroll bar color has been
1813 tem
= display_x_get_resource (dpyinfo
,
1814 build_string (foreground_p
1818 build_string ("verticalScrollBar"),
1822 /* If nothing has been specified, scroll bars will use a
1823 toolkit-dependent default. Because these defaults are
1824 difficult to get at without actually creating a scroll
1825 bar, use nil to indicate that no color has been
1830 #else /* not USE_TOOLKIT_SCROLL_BARS */
1834 #endif /* not USE_TOOLKIT_SCROLL_BARS */
1837 x_set_frame_parameters (f
, Fcons (Fcons (prop
, tem
), Qnil
));
1843 #if !defined (HAVE_X11R4) && !defined (HAVE_XSETWMPROTOCOLS)
1846 XSetWMProtocols (dpy
, w
, protocols
, count
)
1853 prop
= XInternAtom (dpy
, "WM_PROTOCOLS", False
);
1854 if (prop
== None
) return False
;
1855 XChangeProperty (dpy
, w
, prop
, XA_ATOM
, 32, PropModeReplace
,
1856 (unsigned char *) protocols
, count
);
1859 #endif /* not HAVE_X11R4 && not HAVE_XSETWMPROTOCOLS */
1861 #ifdef USE_X_TOOLKIT
1863 /* If the WM_PROTOCOLS property does not already contain WM_TAKE_FOCUS,
1864 WM_DELETE_WINDOW, and WM_SAVE_YOURSELF, then add them. (They may
1865 already be present because of the toolkit (Motif adds some of them,
1866 for example, but Xt doesn't). */
1869 hack_wm_protocols (f
, widget
)
1873 Display
*dpy
= XtDisplay (widget
);
1874 Window w
= XtWindow (widget
);
1875 int need_delete
= 1;
1882 unsigned char *catoms
;
1884 unsigned long nitems
= 0;
1885 unsigned long bytes_after
;
1887 if ((XGetWindowProperty (dpy
, w
,
1888 FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
1889 (long)0, (long)100, False
, XA_ATOM
,
1890 &type
, &format
, &nitems
, &bytes_after
,
1893 && format
== 32 && type
== XA_ATOM
)
1895 Atom
*atoms
= (Atom
*) catoms
;
1900 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
)
1902 else if (atoms
[nitems
]
1903 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_take_focus
)
1905 else if (atoms
[nitems
]
1906 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
)
1917 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
;
1919 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_take_focus
;
1921 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
;
1923 XChangeProperty (dpy
, w
, FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
1924 XA_ATOM
, 32, PropModeAppend
,
1925 (unsigned char *) props
, count
);
1933 /* Support routines for XIC (X Input Context). */
1937 static XFontSet xic_create_xfontset
P_ ((struct frame
*, char *));
1938 static XIMStyle best_xim_style
P_ ((XIMStyles
*, XIMStyles
*));
1941 /* Supported XIM styles, ordered by preference. */
1943 static XIMStyle supported_xim_styles
[] =
1945 XIMPreeditPosition
| XIMStatusArea
,
1946 XIMPreeditPosition
| XIMStatusNothing
,
1947 XIMPreeditPosition
| XIMStatusNone
,
1948 XIMPreeditNothing
| XIMStatusArea
,
1949 XIMPreeditNothing
| XIMStatusNothing
,
1950 XIMPreeditNothing
| XIMStatusNone
,
1951 XIMPreeditNone
| XIMStatusArea
,
1952 XIMPreeditNone
| XIMStatusNothing
,
1953 XIMPreeditNone
| XIMStatusNone
,
1958 /* Create an X fontset on frame F with base font name BASE_FONTNAME. */
1960 char xic_defaut_fontset
[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*";
1962 /* Create an Xt fontset spec from the name of a base font.
1963 If `motif' is True use the Motif syntax. */
1965 xic_create_fontsetname (base_fontname
, motif
)
1966 char *base_fontname
;
1969 const char *sep
= motif
? ";" : ",";
1972 /* Make a fontset name from the base font name. */
1973 if (xic_defaut_fontset
== base_fontname
)
1974 { /* There is no base font name, use the default. */
1975 int len
= strlen (base_fontname
) + 2;
1976 fontsetname
= xmalloc (len
);
1977 bzero (fontsetname
, len
);
1978 strcpy (fontsetname
, base_fontname
);
1982 /* Make a fontset name from the base font name.
1983 The font set will be made of the following elements:
1985 - the base font where the charset spec is replaced by -*-*.
1986 - the same but with the family also replaced with -*-*-. */
1987 char *p
= base_fontname
;
1990 for (i
= 0; *p
; p
++)
1993 { /* As the font name doesn't conform to XLFD, we can't
1994 modify it to generalize it to allcs and allfamilies.
1995 Use the specified font plus the default. */
1996 int len
= strlen (base_fontname
) + strlen (xic_defaut_fontset
) + 3;
1997 fontsetname
= xmalloc (len
);
1998 bzero (fontsetname
, len
);
1999 strcpy (fontsetname
, base_fontname
);
2000 strcat (fontsetname
, sep
);
2001 strcat (fontsetname
, xic_defaut_fontset
);
2006 char *p1
= NULL
, *p2
= NULL
;
2007 char *font_allcs
= NULL
;
2008 char *font_allfamilies
= NULL
;
2009 char *font_all
= NULL
;
2010 char *allcs
= "*-*-*-*-*-*-*";
2011 char *allfamilies
= "-*-*-";
2012 char *all
= "*-*-*-*-";
2014 for (i
= 0, p
= base_fontname
; i
< 8; p
++)
2025 /* Build the font spec that matches all charsets. */
2026 len
= p
- base_fontname
+ strlen (allcs
) + 1;
2027 font_allcs
= (char *) alloca (len
);
2028 bzero (font_allcs
, len
);
2029 bcopy (base_fontname
, font_allcs
, p
- base_fontname
);
2030 strcat (font_allcs
, allcs
);
2032 /* Build the font spec that matches all families. */
2033 len
= p
- p1
+ strlen (allcs
) + strlen (allfamilies
) + 1;
2034 font_allfamilies
= (char *) alloca (len
);
2035 bzero (font_allfamilies
, len
);
2036 strcpy (font_allfamilies
, allfamilies
);
2037 bcopy (p1
, font_allfamilies
+ strlen (allfamilies
), p
- p1
);
2038 strcat (font_allfamilies
, allcs
);
2040 /* Build the font spec that matches all. */
2041 len
= p
- p2
+ strlen (allcs
) + strlen (all
) + strlen (allfamilies
) + 1;
2042 font_all
= (char *) alloca (len
);
2043 bzero (font_all
, len
);
2044 strcpy (font_all
, allfamilies
);
2045 strcat (font_all
, all
);
2046 bcopy (p2
, font_all
+ strlen (all
) + strlen (allfamilies
), p
- p2
);
2047 strcat (font_all
, allcs
);
2049 /* Build the actual font set name. */
2050 len
= strlen (base_fontname
) + strlen (font_allcs
)
2051 + strlen (font_allfamilies
) + strlen (font_all
) + 5;
2052 fontsetname
= xmalloc (len
);
2053 bzero (fontsetname
, len
);
2054 strcpy (fontsetname
, base_fontname
);
2055 strcat (fontsetname
, sep
);
2056 strcat (fontsetname
, font_allcs
);
2057 strcat (fontsetname
, sep
);
2058 strcat (fontsetname
, font_allfamilies
);
2059 strcat (fontsetname
, sep
);
2060 strcat (fontsetname
, font_all
);
2064 strcat (fontsetname
, ":");
2069 xic_create_xfontset (f
, base_fontname
)
2071 char *base_fontname
;
2073 XFontSet xfs
= NULL
;
2074 char **missing_list
= NULL
;
2077 Lisp_Object rest
, frame
;
2080 base_fontname
= xic_defaut_fontset
;
2082 /* See if there is another frame already using same fontset. */
2083 FOR_EACH_FRAME (rest
, frame
)
2085 struct frame
*cf
= XFRAME (frame
);
2086 if (cf
!= f
&& FRAME_LIVE_P (f
) && FRAME_X_P (cf
)
2087 && FRAME_X_DISPLAY_INFO (cf
) == FRAME_X_DISPLAY_INFO (f
)
2088 && FRAME_XIC_BASE_FONTNAME (cf
)
2089 && !strcmp (FRAME_XIC_BASE_FONTNAME (cf
), base_fontname
))
2091 xfs
= FRAME_XIC_FONTSET (cf
);
2098 char *fontsetname
= xic_create_fontsetname (base_fontname
, False
);
2101 xfs
= XCreateFontSet (FRAME_X_DISPLAY (f
),
2102 fontsetname
, &missing_list
,
2103 &missing_count
, &def_string
);
2105 XFreeStringList (missing_list
);
2106 xfree (fontsetname
);
2109 if (FRAME_XIC_BASE_FONTNAME (f
))
2110 xfree (FRAME_XIC_BASE_FONTNAME (f
));
2111 FRAME_XIC_BASE_FONTNAME (f
) = xstrdup (base_fontname
);
2113 /* No need to free def_string. */
2117 /* Free the X fontset of frame F if it is the last frame using it. */
2120 xic_free_xfontset (f
)
2123 Lisp_Object rest
, frame
;
2126 if (!FRAME_XIC_FONTSET (f
))
2129 /* See if there is another frame sharing the same fontset. */
2130 FOR_EACH_FRAME (rest
, frame
)
2132 struct frame
*cf
= XFRAME (frame
);
2133 if (cf
!= f
&& FRAME_LIVE_P (f
) && FRAME_X_P (cf
)
2134 && FRAME_X_DISPLAY_INFO (cf
) == FRAME_X_DISPLAY_INFO (f
)
2135 && FRAME_XIC_FONTSET (cf
) == FRAME_XIC_FONTSET (f
))
2143 /* The fontset is not used anymore. It is safe to free it. */
2144 XFreeFontSet (FRAME_X_DISPLAY (f
), FRAME_XIC_FONTSET (f
));
2146 if (FRAME_XIC_BASE_FONTNAME (f
))
2147 xfree (FRAME_XIC_BASE_FONTNAME (f
));
2148 FRAME_XIC_BASE_FONTNAME (f
) = NULL
;
2149 FRAME_XIC_FONTSET (f
) = NULL
;
2153 /* Value is the best input style, given user preferences USER (already
2154 checked to be supported by Emacs), and styles supported by the
2155 input method XIM. */
2158 best_xim_style (user
, xim
)
2164 for (i
= 0; i
< user
->count_styles
; ++i
)
2165 for (j
= 0; j
< xim
->count_styles
; ++j
)
2166 if (user
->supported_styles
[i
] == xim
->supported_styles
[j
])
2167 return user
->supported_styles
[i
];
2169 /* Return the default style. */
2170 return XIMPreeditNothing
| XIMStatusNothing
;
2173 /* Create XIC for frame F. */
2175 static XIMStyle xic_style
;
2178 create_frame_xic (f
)
2183 XFontSet xfs
= NULL
;
2188 /* Create X fontset. */
2189 xfs
= xic_create_xfontset
2190 (f
, (FRAME_FONTSET (f
) < 0) ? NULL
2191 : (char *) SDATA (fontset_ascii (FRAME_FONTSET (f
))));
2193 xim
= FRAME_X_XIM (f
);
2198 XVaNestedList preedit_attr
;
2199 XVaNestedList status_attr
;
2201 s_area
.x
= 0; s_area
.y
= 0; s_area
.width
= 1; s_area
.height
= 1;
2202 spot
.x
= 0; spot
.y
= 1;
2204 /* Determine XIC style. */
2207 XIMStyles supported_list
;
2208 supported_list
.count_styles
= (sizeof supported_xim_styles
2209 / sizeof supported_xim_styles
[0]);
2210 supported_list
.supported_styles
= supported_xim_styles
;
2211 xic_style
= best_xim_style (&supported_list
,
2212 FRAME_X_XIM_STYLES (f
));
2215 preedit_attr
= XVaCreateNestedList (0,
2218 FRAME_FOREGROUND_PIXEL (f
),
2220 FRAME_BACKGROUND_PIXEL (f
),
2221 (xic_style
& XIMPreeditPosition
2226 status_attr
= XVaCreateNestedList (0,
2232 FRAME_FOREGROUND_PIXEL (f
),
2234 FRAME_BACKGROUND_PIXEL (f
),
2237 xic
= XCreateIC (xim
,
2238 XNInputStyle
, xic_style
,
2239 XNClientWindow
, FRAME_X_WINDOW (f
),
2240 XNFocusWindow
, FRAME_X_WINDOW (f
),
2241 XNStatusAttributes
, status_attr
,
2242 XNPreeditAttributes
, preedit_attr
,
2244 XFree (preedit_attr
);
2245 XFree (status_attr
);
2248 FRAME_XIC (f
) = xic
;
2249 FRAME_XIC_STYLE (f
) = xic_style
;
2250 FRAME_XIC_FONTSET (f
) = xfs
;
2254 /* Destroy XIC and free XIC fontset of frame F, if any. */
2260 if (FRAME_XIC (f
) == NULL
)
2263 XDestroyIC (FRAME_XIC (f
));
2264 xic_free_xfontset (f
);
2266 FRAME_XIC (f
) = NULL
;
2270 /* Place preedit area for XIC of window W's frame to specified
2271 pixel position X/Y. X and Y are relative to window W. */
2274 xic_set_preeditarea (w
, x
, y
)
2278 struct frame
*f
= XFRAME (w
->frame
);
2282 spot
.x
= WINDOW_TO_FRAME_PIXEL_X (w
, x
) + WINDOW_LEFT_FRINGE_WIDTH (w
);
2283 spot
.y
= WINDOW_TO_FRAME_PIXEL_Y (w
, y
) + FONT_BASE (FRAME_FONT (f
));
2284 attr
= XVaCreateNestedList (0, XNSpotLocation
, &spot
, NULL
);
2285 XSetICValues (FRAME_XIC (f
), XNPreeditAttributes
, attr
, NULL
);
2290 /* Place status area for XIC in bottom right corner of frame F.. */
2293 xic_set_statusarea (f
)
2296 XIC xic
= FRAME_XIC (f
);
2301 /* Negotiate geometry of status area. If input method has existing
2302 status area, use its current size. */
2303 area
.x
= area
.y
= area
.width
= area
.height
= 0;
2304 attr
= XVaCreateNestedList (0, XNAreaNeeded
, &area
, NULL
);
2305 XSetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2308 attr
= XVaCreateNestedList (0, XNAreaNeeded
, &needed
, NULL
);
2309 XGetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2312 if (needed
->width
== 0) /* Use XNArea instead of XNAreaNeeded */
2314 attr
= XVaCreateNestedList (0, XNArea
, &needed
, NULL
);
2315 XGetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2319 area
.width
= needed
->width
;
2320 area
.height
= needed
->height
;
2321 area
.x
= FRAME_PIXEL_WIDTH (f
) - area
.width
- FRAME_INTERNAL_BORDER_WIDTH (f
);
2322 area
.y
= (FRAME_PIXEL_HEIGHT (f
) - area
.height
2323 - FRAME_MENUBAR_HEIGHT (f
)
2324 - FRAME_TOOLBAR_HEIGHT (f
)
2325 - FRAME_INTERNAL_BORDER_WIDTH (f
));
2328 attr
= XVaCreateNestedList (0, XNArea
, &area
, NULL
);
2329 XSetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2334 /* Set X fontset for XIC of frame F, using base font name
2335 BASE_FONTNAME. Called when a new Emacs fontset is chosen. */
2338 xic_set_xfontset (f
, base_fontname
)
2340 char *base_fontname
;
2345 xic_free_xfontset (f
);
2347 xfs
= xic_create_xfontset (f
, base_fontname
);
2349 attr
= XVaCreateNestedList (0, XNFontSet
, xfs
, NULL
);
2350 if (FRAME_XIC_STYLE (f
) & XIMPreeditPosition
)
2351 XSetICValues (FRAME_XIC (f
), XNPreeditAttributes
, attr
, NULL
);
2352 if (FRAME_XIC_STYLE (f
) & XIMStatusArea
)
2353 XSetICValues (FRAME_XIC (f
), XNStatusAttributes
, attr
, NULL
);
2356 FRAME_XIC_FONTSET (f
) = xfs
;
2359 #endif /* HAVE_X_I18N */
2363 #ifdef USE_X_TOOLKIT
2365 /* Create and set up the X widget for frame F. */
2368 x_window (f
, window_prompting
, minibuffer_only
)
2370 long window_prompting
;
2371 int minibuffer_only
;
2373 XClassHint class_hints
;
2374 XSetWindowAttributes attributes
;
2375 unsigned long attribute_mask
;
2376 Widget shell_widget
;
2378 Widget frame_widget
;
2384 /* Use the resource name as the top-level widget name
2385 for looking up resources. Make a non-Lisp copy
2386 for the window manager, so GC relocation won't bother it.
2388 Elsewhere we specify the window name for the window manager. */
2391 char *str
= (char *) SDATA (Vx_resource_name
);
2392 f
->namebuf
= (char *) xmalloc (strlen (str
) + 1);
2393 strcpy (f
->namebuf
, str
);
2397 XtSetArg (al
[ac
], XtNallowShellResize
, 1); ac
++;
2398 XtSetArg (al
[ac
], XtNinput
, 1); ac
++;
2399 XtSetArg (al
[ac
], XtNmappedWhenManaged
, 0); ac
++;
2400 XtSetArg (al
[ac
], XtNborderWidth
, f
->border_width
); ac
++;
2401 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2402 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2403 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2404 shell_widget
= XtAppCreateShell (f
->namebuf
, EMACS_CLASS
,
2405 applicationShellWidgetClass
,
2406 FRAME_X_DISPLAY (f
), al
, ac
);
2408 f
->output_data
.x
->widget
= shell_widget
;
2409 /* maybe_set_screen_title_format (shell_widget); */
2411 pane_widget
= lw_create_widget ("main", "pane", widget_id_tick
++,
2412 (widget_value
*) NULL
,
2413 shell_widget
, False
,
2417 (lw_callback
) NULL
);
2420 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2421 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2422 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2423 XtSetValues (pane_widget
, al
, ac
);
2424 f
->output_data
.x
->column_widget
= pane_widget
;
2426 /* mappedWhenManaged to false tells to the paned window to not map/unmap
2427 the emacs screen when changing menubar. This reduces flickering. */
2430 XtSetArg (al
[ac
], XtNmappedWhenManaged
, 0); ac
++;
2431 XtSetArg (al
[ac
], XtNshowGrip
, 0); ac
++;
2432 XtSetArg (al
[ac
], XtNallowResize
, 1); ac
++;
2433 XtSetArg (al
[ac
], XtNresizeToPreferred
, 1); ac
++;
2434 XtSetArg (al
[ac
], XtNemacsFrame
, f
); ac
++;
2435 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2436 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2437 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2438 frame_widget
= XtCreateWidget (f
->namebuf
, emacsFrameClass
, pane_widget
,
2441 f
->output_data
.x
->edit_widget
= frame_widget
;
2443 XtManageChild (frame_widget
);
2445 /* Do some needed geometry management. */
2448 char *tem
, shell_position
[32];
2451 int extra_borders
= 0;
2453 = (f
->output_data
.x
->menubar_widget
2454 ? (f
->output_data
.x
->menubar_widget
->core
.height
2455 + f
->output_data
.x
->menubar_widget
->core
.border_width
)
2458 #if 0 /* Experimentally, we now get the right results
2459 for -geometry -0-0 without this. 24 Aug 96, rms. */
2460 if (FRAME_EXTERNAL_MENU_BAR (f
))
2463 XtVaGetValues (pane_widget
, XtNinternalBorderWidth
, &ibw
, NULL
);
2464 menubar_size
+= ibw
;
2468 f
->output_data
.x
->menubar_height
= menubar_size
;
2471 /* Motif seems to need this amount added to the sizes
2472 specified for the shell widget. The Athena/Lucid widgets don't.
2473 Both conclusions reached experimentally. -- rms. */
2474 XtVaGetValues (f
->output_data
.x
->edit_widget
, XtNinternalBorderWidth
,
2475 &extra_borders
, NULL
);
2479 /* Convert our geometry parameters into a geometry string
2481 Note that we do not specify here whether the position
2482 is a user-specified or program-specified one.
2483 We pass that information later, in x_wm_set_size_hints. */
2485 int left
= f
->left_pos
;
2486 int xneg
= window_prompting
& XNegative
;
2487 int top
= f
->top_pos
;
2488 int yneg
= window_prompting
& YNegative
;
2494 if (window_prompting
& USPosition
)
2495 sprintf (shell_position
, "=%dx%d%c%d%c%d",
2496 FRAME_PIXEL_WIDTH (f
) + extra_borders
,
2497 FRAME_PIXEL_HEIGHT (f
) + menubar_size
+ extra_borders
,
2498 (xneg
? '-' : '+'), left
,
2499 (yneg
? '-' : '+'), top
);
2502 sprintf (shell_position
, "=%dx%d",
2503 FRAME_PIXEL_WIDTH (f
) + extra_borders
,
2504 FRAME_PIXEL_HEIGHT (f
) + menubar_size
+ extra_borders
);
2506 /* Setting x and y when the position is not specified in
2507 the geometry string will set program position in the WM hints.
2508 If Emacs had just one program position, we could set it in
2509 fallback resources, but since each make-frame call can specify
2510 different program positions, this is easier. */
2511 XtSetArg (al
[ac
], XtNx
, left
); ac
++;
2512 XtSetArg (al
[ac
], XtNy
, top
); ac
++;
2516 len
= strlen (shell_position
) + 1;
2517 /* We don't free this because we don't know whether
2518 it is safe to free it while the frame exists.
2519 It isn't worth the trouble of arranging to free it
2520 when the frame is deleted. */
2521 tem
= (char *) xmalloc (len
);
2522 strncpy (tem
, shell_position
, len
);
2523 XtSetArg (al
[ac
], XtNgeometry
, tem
); ac
++;
2524 XtSetValues (shell_widget
, al
, ac
);
2527 XtManageChild (pane_widget
);
2528 XtRealizeWidget (shell_widget
);
2530 FRAME_X_WINDOW (f
) = XtWindow (frame_widget
);
2532 validate_x_resource_name ();
2534 class_hints
.res_name
= (char *) SDATA (Vx_resource_name
);
2535 class_hints
.res_class
= (char *) SDATA (Vx_resource_class
);
2536 XSetClassHint (FRAME_X_DISPLAY (f
), XtWindow (shell_widget
), &class_hints
);
2539 FRAME_XIC (f
) = NULL
;
2541 create_frame_xic (f
);
2544 f
->output_data
.x
->wm_hints
.input
= True
;
2545 f
->output_data
.x
->wm_hints
.flags
|= InputHint
;
2546 XSetWMHints (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2547 &f
->output_data
.x
->wm_hints
);
2549 hack_wm_protocols (f
, shell_widget
);
2552 XtAddEventHandler (shell_widget
, 0, True
, _XEditResCheckMessages
, 0);
2555 /* Do a stupid property change to force the server to generate a
2556 PropertyNotify event so that the event_stream server timestamp will
2557 be initialized to something relevant to the time we created the window.
2559 XChangeProperty (XtDisplay (frame_widget
), XtWindow (frame_widget
),
2560 FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
2561 XA_ATOM
, 32, PropModeAppend
,
2562 (unsigned char*) NULL
, 0);
2564 /* Make all the standard events reach the Emacs frame. */
2565 attributes
.event_mask
= STANDARD_EVENT_SET
;
2570 /* XIM server might require some X events. */
2571 unsigned long fevent
= NoEventMask
;
2572 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2573 attributes
.event_mask
|= fevent
;
2575 #endif /* HAVE_X_I18N */
2577 attribute_mask
= CWEventMask
;
2578 XChangeWindowAttributes (XtDisplay (shell_widget
), XtWindow (shell_widget
),
2579 attribute_mask
, &attributes
);
2581 XtMapWidget (frame_widget
);
2583 /* x_set_name normally ignores requests to set the name if the
2584 requested name is the same as the current name. This is the one
2585 place where that assumption isn't correct; f->name is set, but
2586 the X server hasn't been told. */
2589 int explicit = f
->explicit_name
;
2591 f
->explicit_name
= 0;
2594 x_set_name (f
, name
, explicit);
2597 XDefineCursor (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2598 f
->output_data
.x
->text_cursor
);
2602 /* This is a no-op, except under Motif. Make sure main areas are
2603 set to something reasonable, in case we get an error later. */
2604 lw_set_main_areas (pane_widget
, 0, frame_widget
);
2607 #else /* not USE_X_TOOLKIT */
2613 if (! xg_create_frame_widgets (f
))
2614 error ("Unable to create window");
2617 FRAME_XIC (f
) = NULL
;
2621 create_frame_xic (f
);
2624 /* XIM server might require some X events. */
2625 unsigned long fevent
= NoEventMask
;
2626 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2628 if (fevent
!= NoEventMask
)
2630 XSetWindowAttributes attributes
;
2631 XWindowAttributes wattr
;
2632 unsigned long attribute_mask
;
2634 XGetWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2636 attributes
.event_mask
= wattr
.your_event_mask
| fevent
;
2637 attribute_mask
= CWEventMask
;
2638 XChangeWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2639 attribute_mask
, &attributes
);
2647 #else /*! USE_GTK */
2648 /* Create and set up the X window for frame F. */
2655 XClassHint class_hints
;
2656 XSetWindowAttributes attributes
;
2657 unsigned long attribute_mask
;
2659 attributes
.background_pixel
= f
->output_data
.x
->background_pixel
;
2660 attributes
.border_pixel
= f
->output_data
.x
->border_pixel
;
2661 attributes
.bit_gravity
= StaticGravity
;
2662 attributes
.backing_store
= NotUseful
;
2663 attributes
.save_under
= True
;
2664 attributes
.event_mask
= STANDARD_EVENT_SET
;
2665 attributes
.colormap
= FRAME_X_COLORMAP (f
);
2666 attribute_mask
= (CWBackPixel
| CWBorderPixel
| CWBitGravity
| CWEventMask
2671 = XCreateWindow (FRAME_X_DISPLAY (f
),
2672 f
->output_data
.x
->parent_desc
,
2675 FRAME_PIXEL_WIDTH (f
), FRAME_PIXEL_HEIGHT (f
),
2677 CopyFromParent
, /* depth */
2678 InputOutput
, /* class */
2680 attribute_mask
, &attributes
);
2685 create_frame_xic (f
);
2688 /* XIM server might require some X events. */
2689 unsigned long fevent
= NoEventMask
;
2690 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2691 attributes
.event_mask
|= fevent
;
2692 attribute_mask
= CWEventMask
;
2693 XChangeWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2694 attribute_mask
, &attributes
);
2697 #endif /* HAVE_X_I18N */
2699 validate_x_resource_name ();
2701 class_hints
.res_name
= (char *) SDATA (Vx_resource_name
);
2702 class_hints
.res_class
= (char *) SDATA (Vx_resource_class
);
2703 XSetClassHint (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), &class_hints
);
2705 /* The menubar is part of the ordinary display;
2706 it does not count in addition to the height of the window. */
2707 f
->output_data
.x
->menubar_height
= 0;
2709 /* This indicates that we use the "Passive Input" input model.
2710 Unless we do this, we don't get the Focus{In,Out} events that we
2711 need to draw the cursor correctly. Accursed bureaucrats.
2712 XWhipsAndChains (FRAME_X_DISPLAY (f), IronMaiden, &TheRack); */
2714 f
->output_data
.x
->wm_hints
.input
= True
;
2715 f
->output_data
.x
->wm_hints
.flags
|= InputHint
;
2716 XSetWMHints (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2717 &f
->output_data
.x
->wm_hints
);
2718 f
->output_data
.x
->wm_hints
.icon_pixmap
= None
;
2720 /* Request "save yourself" and "delete window" commands from wm. */
2723 protocols
[0] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
;
2724 protocols
[1] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
;
2725 XSetWMProtocols (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), protocols
, 2);
2728 /* x_set_name normally ignores requests to set the name if the
2729 requested name is the same as the current name. This is the one
2730 place where that assumption isn't correct; f->name is set, but
2731 the X server hasn't been told. */
2734 int explicit = f
->explicit_name
;
2736 f
->explicit_name
= 0;
2739 x_set_name (f
, name
, explicit);
2742 XDefineCursor (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2743 f
->output_data
.x
->text_cursor
);
2747 if (FRAME_X_WINDOW (f
) == 0)
2748 error ("Unable to create window");
2751 #endif /* not USE_GTK */
2752 #endif /* not USE_X_TOOLKIT */
2754 /* Verify that the icon position args for this window are valid. */
2757 x_icon_verify (f
, parms
)
2761 Lisp_Object icon_x
, icon_y
;
2763 /* Set the position of the icon. Note that twm groups all
2764 icons in an icon window. */
2765 icon_x
= x_frame_get_and_record_arg (f
, parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2766 icon_y
= x_frame_get_and_record_arg (f
, parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2767 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2769 CHECK_NUMBER (icon_x
);
2770 CHECK_NUMBER (icon_y
);
2772 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2773 error ("Both left and top icon corners of icon must be specified");
2776 /* Handle the icon stuff for this window. Perhaps later we might
2777 want an x_set_icon_position which can be called interactively as
2785 Lisp_Object icon_x
, icon_y
;
2786 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2788 /* Set the position of the icon. Note that twm groups all
2789 icons in an icon window. */
2790 icon_x
= x_frame_get_and_record_arg (f
, parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2791 icon_y
= x_frame_get_and_record_arg (f
, parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2792 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2794 CHECK_NUMBER (icon_x
);
2795 CHECK_NUMBER (icon_y
);
2797 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2798 error ("Both left and top icon corners of icon must be specified");
2802 if (! EQ (icon_x
, Qunbound
))
2803 x_wm_set_icon_position (f
, XINT (icon_x
), XINT (icon_y
));
2805 /* Start up iconic or window? */
2806 x_wm_set_window_state
2807 (f
, (EQ (x_get_arg (dpyinfo
, parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
),
2812 x_text_icon (f
, (char *) SDATA ((!NILP (f
->icon_name
)
2819 /* Make the GCs needed for this window, setting the
2820 background, border and mouse colors; also create the
2821 mouse cursor and the gray border tile. */
2823 static char cursor_bits
[] =
2825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2826 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2827 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2828 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2835 XGCValues gc_values
;
2839 /* Create the GCs of this frame.
2840 Note that many default values are used. */
2843 gc_values
.font
= FRAME_FONT (f
)->fid
;
2844 gc_values
.foreground
= f
->output_data
.x
->foreground_pixel
;
2845 gc_values
.background
= f
->output_data
.x
->background_pixel
;
2846 gc_values
.line_width
= 0; /* Means 1 using fast algorithm. */
2847 f
->output_data
.x
->normal_gc
2848 = XCreateGC (FRAME_X_DISPLAY (f
),
2850 GCLineWidth
| GCFont
| GCForeground
| GCBackground
,
2853 /* Reverse video style. */
2854 gc_values
.foreground
= f
->output_data
.x
->background_pixel
;
2855 gc_values
.background
= f
->output_data
.x
->foreground_pixel
;
2856 f
->output_data
.x
->reverse_gc
2857 = XCreateGC (FRAME_X_DISPLAY (f
),
2859 GCFont
| GCForeground
| GCBackground
| GCLineWidth
,
2862 /* Cursor has cursor-color background, background-color foreground. */
2863 gc_values
.foreground
= f
->output_data
.x
->background_pixel
;
2864 gc_values
.background
= f
->output_data
.x
->cursor_pixel
;
2865 gc_values
.fill_style
= FillOpaqueStippled
;
2867 = XCreateBitmapFromData (FRAME_X_DISPLAY (f
),
2868 FRAME_X_DISPLAY_INFO (f
)->root_window
,
2869 cursor_bits
, 16, 16);
2870 f
->output_data
.x
->cursor_gc
2871 = XCreateGC (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2872 (GCFont
| GCForeground
| GCBackground
2873 | GCFillStyle
/* | GCStipple */ | GCLineWidth
),
2877 f
->output_data
.x
->white_relief
.gc
= 0;
2878 f
->output_data
.x
->black_relief
.gc
= 0;
2880 /* Create the gray border tile used when the pointer is not in
2881 the frame. Since this depends on the frame's pixel values,
2882 this must be done on a per-frame basis. */
2883 f
->output_data
.x
->border_tile
2884 = (XCreatePixmapFromBitmapData
2885 (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
2886 gray_bits
, gray_width
, gray_height
,
2887 f
->output_data
.x
->foreground_pixel
,
2888 f
->output_data
.x
->background_pixel
,
2889 DefaultDepth (FRAME_X_DISPLAY (f
), FRAME_X_SCREEN_NUMBER (f
))));
2895 /* Free what was was allocated in x_make_gc. */
2901 Display
*dpy
= FRAME_X_DISPLAY (f
);
2905 if (f
->output_data
.x
->normal_gc
)
2907 XFreeGC (dpy
, f
->output_data
.x
->normal_gc
);
2908 f
->output_data
.x
->normal_gc
= 0;
2911 if (f
->output_data
.x
->reverse_gc
)
2913 XFreeGC (dpy
, f
->output_data
.x
->reverse_gc
);
2914 f
->output_data
.x
->reverse_gc
= 0;
2917 if (f
->output_data
.x
->cursor_gc
)
2919 XFreeGC (dpy
, f
->output_data
.x
->cursor_gc
);
2920 f
->output_data
.x
->cursor_gc
= 0;
2923 if (f
->output_data
.x
->border_tile
)
2925 XFreePixmap (dpy
, f
->output_data
.x
->border_tile
);
2926 f
->output_data
.x
->border_tile
= 0;
2933 /* Handler for signals raised during x_create_frame and
2934 x_create_top_frame. FRAME is the frame which is partially
2938 unwind_create_frame (frame
)
2941 struct frame
*f
= XFRAME (frame
);
2943 /* If frame is ``official'', nothing to do. */
2944 if (!CONSP (Vframe_list
) || !EQ (XCAR (Vframe_list
), frame
))
2947 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2950 x_free_frame_resources (f
);
2953 /* Check that reference counts are indeed correct. */
2954 xassert (dpyinfo
->reference_count
== dpyinfo_refcount
);
2955 xassert (dpyinfo
->image_cache
->refcount
== image_cache_refcount
);
2964 DEFUN ("x-create-frame", Fx_create_frame
, Sx_create_frame
,
2966 doc
: /* Make a new X window, which is called a "frame" in Emacs terms.
2967 Returns an Emacs frame object.
2968 ALIST is an alist of frame parameters.
2969 If the parameters specify that the frame should not have a minibuffer,
2970 and do not specify a specific minibuffer window to use,
2971 then `default-minibuffer-frame' must be a frame whose minibuffer can
2972 be shared by the new frame.
2974 This function is an internal primitive--use `make-frame' instead. */)
2979 Lisp_Object frame
, tem
;
2981 int minibuffer_only
= 0;
2982 long window_prompting
= 0;
2984 int count
= SPECPDL_INDEX ();
2985 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
2986 Lisp_Object display
;
2987 struct x_display_info
*dpyinfo
= NULL
;
2993 /* Use this general default value to start with
2994 until we know if this frame has a specified name. */
2995 Vx_resource_name
= Vinvocation_name
;
2997 display
= x_get_arg (dpyinfo
, parms
, Qdisplay
, 0, 0, RES_TYPE_STRING
);
2998 if (EQ (display
, Qunbound
))
3000 dpyinfo
= check_x_display_info (display
);
3002 kb
= dpyinfo
->kboard
;
3004 kb
= &the_only_kboard
;
3007 name
= x_get_arg (dpyinfo
, parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
3009 && ! EQ (name
, Qunbound
)
3011 error ("Invalid frame name--not a string or nil");
3014 Vx_resource_name
= name
;
3016 /* See if parent window is specified. */
3017 parent
= x_get_arg (dpyinfo
, parms
, Qparent_id
, NULL
, NULL
, RES_TYPE_NUMBER
);
3018 if (EQ (parent
, Qunbound
))
3020 if (! NILP (parent
))
3021 CHECK_NUMBER (parent
);
3023 /* make_frame_without_minibuffer can run Lisp code and garbage collect. */
3024 /* No need to protect DISPLAY because that's not used after passing
3025 it to make_frame_without_minibuffer. */
3027 GCPRO4 (parms
, parent
, name
, frame
);
3028 tem
= x_get_arg (dpyinfo
, parms
, Qminibuffer
, "minibuffer", "Minibuffer",
3030 if (EQ (tem
, Qnone
) || NILP (tem
))
3031 f
= make_frame_without_minibuffer (Qnil
, kb
, display
);
3032 else if (EQ (tem
, Qonly
))
3034 f
= make_minibuffer_frame ();
3035 minibuffer_only
= 1;
3037 else if (WINDOWP (tem
))
3038 f
= make_frame_without_minibuffer (tem
, kb
, display
);
3042 XSETFRAME (frame
, f
);
3044 /* Note that X Windows does support scroll bars. */
3045 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 1;
3047 f
->output_method
= output_x_window
;
3048 f
->output_data
.x
= (struct x_output
*) xmalloc (sizeof (struct x_output
));
3049 bzero (f
->output_data
.x
, sizeof (struct x_output
));
3050 f
->output_data
.x
->icon_bitmap
= -1;
3051 FRAME_FONTSET (f
) = -1;
3052 f
->output_data
.x
->scroll_bar_foreground_pixel
= -1;
3053 f
->output_data
.x
->scroll_bar_background_pixel
= -1;
3054 #ifdef USE_TOOLKIT_SCROLL_BARS
3055 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
3056 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
3057 #endif /* USE_TOOLKIT_SCROLL_BARS */
3058 record_unwind_protect (unwind_create_frame
, frame
);
3061 = x_get_arg (dpyinfo
, parms
, Qicon_name
, "iconName", "Title",
3063 if (! STRINGP (f
->icon_name
))
3064 f
->icon_name
= Qnil
;
3066 FRAME_X_DISPLAY_INFO (f
) = dpyinfo
;
3068 image_cache_refcount
= FRAME_X_IMAGE_CACHE (f
)->refcount
;
3069 dpyinfo_refcount
= dpyinfo
->reference_count
;
3070 #endif /* GLYPH_DEBUG */
3072 FRAME_KBOARD (f
) = kb
;
3075 /* These colors will be set anyway later, but it's important
3076 to get the color reference counts right, so initialize them! */
3079 struct gcpro gcpro1
;
3081 /* Function x_decode_color can signal an error. Make
3082 sure to initialize color slots so that we won't try
3083 to free colors we haven't allocated. */
3084 f
->output_data
.x
->foreground_pixel
= -1;
3085 f
->output_data
.x
->background_pixel
= -1;
3086 f
->output_data
.x
->cursor_pixel
= -1;
3087 f
->output_data
.x
->cursor_foreground_pixel
= -1;
3088 f
->output_data
.x
->border_pixel
= -1;
3089 f
->output_data
.x
->mouse_pixel
= -1;
3091 black
= build_string ("black");
3093 f
->output_data
.x
->foreground_pixel
3094 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3095 f
->output_data
.x
->background_pixel
3096 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3097 f
->output_data
.x
->cursor_pixel
3098 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3099 f
->output_data
.x
->cursor_foreground_pixel
3100 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3101 f
->output_data
.x
->border_pixel
3102 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3103 f
->output_data
.x
->mouse_pixel
3104 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3108 /* Specify the parent under which to make this X window. */
3112 f
->output_data
.x
->parent_desc
= (Window
) XFASTINT (parent
);
3113 f
->output_data
.x
->explicit_parent
= 1;
3117 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
3118 f
->output_data
.x
->explicit_parent
= 0;
3121 /* Set the name; the functions to which we pass f expect the name to
3123 if (EQ (name
, Qunbound
) || NILP (name
))
3125 f
->name
= build_string (dpyinfo
->x_id_name
);
3126 f
->explicit_name
= 0;
3131 f
->explicit_name
= 1;
3132 /* use the frame's title when getting resources for this frame. */
3133 specbind (Qx_resource_name
, name
);
3136 /* Extract the window parameters from the supplied values
3137 that are needed to determine window geometry. */
3141 font
= x_get_arg (dpyinfo
, parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
3144 /* First, try whatever font the caller has specified. */
3147 tem
= Fquery_fontset (font
, Qnil
);
3149 font
= x_new_fontset (f
, SDATA (tem
));
3151 font
= x_new_font (f
, SDATA (font
));
3154 /* Try out a font which we hope has bold and italic variations. */
3155 if (!STRINGP (font
))
3156 font
= x_new_font (f
, "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1");
3157 if (!STRINGP (font
))
3158 font
= x_new_font (f
, "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
3159 if (! STRINGP (font
))
3160 font
= x_new_font (f
, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
3161 if (! STRINGP (font
))
3162 /* This was formerly the first thing tried, but it finds too many fonts
3163 and takes too long. */
3164 font
= x_new_font (f
, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1");
3165 /* If those didn't work, look for something which will at least work. */
3166 if (! STRINGP (font
))
3167 font
= x_new_font (f
, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1");
3169 if (! STRINGP (font
))
3170 font
= build_string ("fixed");
3172 x_default_parameter (f
, parms
, Qfont
, font
,
3173 "font", "Font", RES_TYPE_STRING
);
3177 /* Prevent lwlib/xlwmenu.c from crashing because of a bug
3178 whereby it fails to get any font. */
3179 xlwmenu_default_font
= FRAME_FONT (f
);
3182 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
3183 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
3185 /* This defaults to 1 in order to match xterm. We recognize either
3186 internalBorderWidth or internalBorder (which is what xterm calls
3188 if (NILP (Fassq (Qinternal_border_width
, parms
)))
3192 value
= x_get_arg (dpyinfo
, parms
, Qinternal_border_width
,
3193 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
3194 if (! EQ (value
, Qunbound
))
3195 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
3198 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
3199 "internalBorderWidth", "internalBorderWidth",
3201 x_default_parameter (f
, parms
, Qvertical_scroll_bars
, Qleft
,
3202 "verticalScrollBars", "ScrollBars",
3205 /* Also do the stuff which must be set before the window exists. */
3206 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
3207 "foreground", "Foreground", RES_TYPE_STRING
);
3208 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
3209 "background", "Background", RES_TYPE_STRING
);
3210 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
3211 "pointerColor", "Foreground", RES_TYPE_STRING
);
3212 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
3213 "cursorColor", "Foreground", RES_TYPE_STRING
);
3214 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
3215 "borderColor", "BorderColor", RES_TYPE_STRING
);
3216 x_default_parameter (f
, parms
, Qscreen_gamma
, Qnil
,
3217 "screenGamma", "ScreenGamma", RES_TYPE_FLOAT
);
3218 x_default_parameter (f
, parms
, Qline_spacing
, Qnil
,
3219 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER
);
3220 x_default_parameter (f
, parms
, Qleft_fringe
, Qnil
,
3221 "leftFringe", "LeftFringe", RES_TYPE_NUMBER
);
3222 x_default_parameter (f
, parms
, Qright_fringe
, Qnil
,
3223 "rightFringe", "RightFringe", RES_TYPE_NUMBER
);
3225 x_default_scroll_bar_color_parameter (f
, parms
, Qscroll_bar_foreground
,
3226 "scrollBarForeground",
3227 "ScrollBarForeground", 1);
3228 x_default_scroll_bar_color_parameter (f
, parms
, Qscroll_bar_background
,
3229 "scrollBarBackground",
3230 "ScrollBarBackground", 0);
3232 /* Init faces before x_default_parameter is called for scroll-bar
3233 parameters because that function calls x_set_scroll_bar_width,
3234 which calls change_frame_size, which calls Fset_window_buffer,
3235 which runs hooks, which call Fvertical_motion. At the end, we
3236 end up in init_iterator with a null face cache, which should not
3238 init_frame_faces (f
);
3240 x_default_parameter (f
, parms
, Qmenu_bar_lines
, make_number (1),
3241 "menuBar", "MenuBar", RES_TYPE_NUMBER
);
3242 x_default_parameter (f
, parms
, Qtool_bar_lines
, make_number (1),
3243 "toolBar", "ToolBar", RES_TYPE_NUMBER
);
3244 x_default_parameter (f
, parms
, Qbuffer_predicate
, Qnil
,
3245 "bufferPredicate", "BufferPredicate",
3247 x_default_parameter (f
, parms
, Qtitle
, Qnil
,
3248 "title", "Title", RES_TYPE_STRING
);
3249 x_default_parameter (f
, parms
, Qwait_for_wm
, Qt
,
3250 "waitForWM", "WaitForWM", RES_TYPE_BOOLEAN
);
3251 x_default_parameter (f
, parms
, Qfullscreen
, Qnil
,
3252 "fullscreen", "Fullscreen", RES_TYPE_SYMBOL
);
3254 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
3256 /* Compute the size of the X window. */
3257 window_prompting
= x_figure_window_size (f
, parms
, 1);
3259 tem
= x_get_arg (dpyinfo
, parms
, Qunsplittable
, 0, 0, RES_TYPE_BOOLEAN
);
3260 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
3262 x_icon_verify (f
, parms
);
3264 /* Create the X widget or window. */
3265 #ifdef USE_X_TOOLKIT
3266 x_window (f
, window_prompting
, minibuffer_only
);
3274 /* Now consider the frame official. */
3275 FRAME_X_DISPLAY_INFO (f
)->reference_count
++;
3276 Vframe_list
= Fcons (frame
, Vframe_list
);
3278 /* We need to do this after creating the X window, so that the
3279 icon-creation functions can say whose icon they're describing. */
3280 x_default_parameter (f
, parms
, Qicon_type
, Qt
,
3281 "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL
);
3283 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
3284 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3285 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
3286 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3287 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
3288 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
3289 x_default_parameter (f
, parms
, Qscroll_bar_width
, Qnil
,
3290 "scrollBarWidth", "ScrollBarWidth",
3293 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
3294 Change will not be effected unless different from the current
3296 width
= FRAME_COLS (f
);
3297 height
= FRAME_LINES (f
);
3299 SET_FRAME_COLS (f
, 0);
3300 FRAME_LINES (f
) = 0;
3301 change_frame_size (f
, height
, width
, 1, 0, 0);
3303 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
3304 /* Create the menu bar. */
3305 if (!minibuffer_only
&& FRAME_EXTERNAL_MENU_BAR (f
))
3307 /* If this signals an error, we haven't set size hints for the
3308 frame and we didn't make it visible. */
3309 initialize_frame_menubar (f
);
3312 /* This is a no-op, except under Motif where it arranges the
3313 main window for the widgets on it. */
3314 lw_set_main_areas (f
->output_data
.x
->column_widget
,
3315 f
->output_data
.x
->menubar_widget
,
3316 f
->output_data
.x
->edit_widget
);
3317 #endif /* not USE_GTK */
3319 #endif /* USE_X_TOOLKIT || USE_GTK */
3321 /* Tell the server what size and position, etc, we want, and how
3322 badly we want them. This should be done after we have the menu
3323 bar so that its size can be taken into account. */
3325 x_wm_set_size_hint (f
, window_prompting
, 0);
3328 /* Make the window appear on the frame and enable display, unless
3329 the caller says not to. However, with explicit parent, Emacs
3330 cannot control visibility, so don't try. */
3331 if (! f
->output_data
.x
->explicit_parent
)
3333 Lisp_Object visibility
;
3335 visibility
= x_get_arg (dpyinfo
, parms
, Qvisibility
, 0, 0,
3337 if (EQ (visibility
, Qunbound
))
3340 if (EQ (visibility
, Qicon
))
3341 x_iconify_frame (f
);
3342 else if (! NILP (visibility
))
3343 x_make_frame_visible (f
);
3345 /* Must have been Qnil. */
3349 /* Set the WM leader property. GTK does this itself, so this is not
3350 needed when using GTK. */
3351 if (dpyinfo
->client_leader_window
!= 0)
3354 XChangeProperty (FRAME_X_DISPLAY (f
),
3355 FRAME_OUTER_WINDOW (f
),
3356 dpyinfo
->Xatom_wm_client_leader
,
3357 XA_WINDOW
, 32, PropModeReplace
,
3358 (char *) &dpyinfo
->client_leader_window
, 1);
3364 /* Make sure windows on this frame appear in calls to next-window
3365 and similar functions. */
3366 Vwindow_list
= Qnil
;
3368 return unbind_to (count
, frame
);
3372 /* FRAME is used only to get a handle on the X display. We don't pass the
3373 display info directly because we're called from frame.c, which doesn't
3374 know about that structure. */
3377 x_get_focus_frame (frame
)
3378 struct frame
*frame
;
3380 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (frame
);
3382 if (! dpyinfo
->x_focus_frame
)
3385 XSETFRAME (xfocus
, dpyinfo
->x_focus_frame
);
3390 /* In certain situations, when the window manager follows a
3391 click-to-focus policy, there seems to be no way around calling
3392 XSetInputFocus to give another frame the input focus .
3394 In an ideal world, XSetInputFocus should generally be avoided so
3395 that applications don't interfere with the window manager's focus
3396 policy. But I think it's okay to use when it's clearly done
3397 following a user-command. */
3399 DEFUN ("x-focus-frame", Fx_focus_frame
, Sx_focus_frame
, 1, 1, 0,
3400 doc
: /* Set the input focus to FRAME.
3401 FRAME nil means use the selected frame. */)
3405 struct frame
*f
= check_x_frame (frame
);
3406 Display
*dpy
= FRAME_X_DISPLAY (f
);
3410 count
= x_catch_errors (dpy
);
3411 XSetInputFocus (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
3412 RevertToParent
, CurrentTime
);
3413 x_uncatch_errors (dpy
, count
);
3420 DEFUN ("xw-color-defined-p", Fxw_color_defined_p
, Sxw_color_defined_p
, 1, 2, 0,
3421 doc
: /* Internal function called by `color-defined-p', which see. */)
3423 Lisp_Object color
, frame
;
3426 FRAME_PTR f
= check_x_frame (frame
);
3428 CHECK_STRING (color
);
3430 if (x_defined_color (f
, SDATA (color
), &foo
, 0))
3436 DEFUN ("xw-color-values", Fxw_color_values
, Sxw_color_values
, 1, 2, 0,
3437 doc
: /* Internal function called by `color-values', which see. */)
3439 Lisp_Object color
, frame
;
3442 FRAME_PTR f
= check_x_frame (frame
);
3444 CHECK_STRING (color
);
3446 if (x_defined_color (f
, SDATA (color
), &foo
, 0))
3450 rgb
[0] = make_number (foo
.red
);
3451 rgb
[1] = make_number (foo
.green
);
3452 rgb
[2] = make_number (foo
.blue
);
3453 return Flist (3, rgb
);
3459 DEFUN ("xw-display-color-p", Fxw_display_color_p
, Sxw_display_color_p
, 0, 1, 0,
3460 doc
: /* Internal function called by `display-color-p', which see. */)
3462 Lisp_Object display
;
3464 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3466 if (dpyinfo
->n_planes
<= 2)
3469 switch (dpyinfo
->visual
->class)
3482 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p
, Sx_display_grayscale_p
,
3484 doc
: /* Return t if the X display supports shades of gray.
3485 Note that color displays do support shades of gray.
3486 The optional argument DISPLAY specifies which display to ask about.
3487 DISPLAY should be either a frame or a display name (a string).
3488 If omitted or nil, that stands for the selected frame's display. */)
3490 Lisp_Object display
;
3492 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3494 if (dpyinfo
->n_planes
<= 1)
3497 switch (dpyinfo
->visual
->class)
3512 DEFUN ("x-display-pixel-width", Fx_display_pixel_width
, Sx_display_pixel_width
,
3514 doc
: /* Returns the width in pixels of the X display DISPLAY.
3515 The optional argument DISPLAY specifies which display to ask about.
3516 DISPLAY should be either a frame or a display name (a string).
3517 If omitted or nil, that stands for the selected frame's display. */)
3519 Lisp_Object display
;
3521 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3523 return make_number (dpyinfo
->width
);
3526 DEFUN ("x-display-pixel-height", Fx_display_pixel_height
,
3527 Sx_display_pixel_height
, 0, 1, 0,
3528 doc
: /* Returns the height in pixels of the X display DISPLAY.
3529 The optional argument DISPLAY specifies which display to ask about.
3530 DISPLAY should be either a frame or a display name (a string).
3531 If omitted or nil, that stands for the selected frame's display. */)
3533 Lisp_Object display
;
3535 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3537 return make_number (dpyinfo
->height
);
3540 DEFUN ("x-display-planes", Fx_display_planes
, Sx_display_planes
,
3542 doc
: /* Returns the number of bitplanes of the X display DISPLAY.
3543 The optional argument DISPLAY specifies which display to ask about.
3544 DISPLAY should be either a frame or a display name (a string).
3545 If omitted or nil, that stands for the selected frame's display. */)
3547 Lisp_Object display
;
3549 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3551 return make_number (dpyinfo
->n_planes
);
3554 DEFUN ("x-display-color-cells", Fx_display_color_cells
, Sx_display_color_cells
,
3556 doc
: /* Returns the number of color cells of the X display DISPLAY.
3557 The optional argument DISPLAY specifies which display to ask about.
3558 DISPLAY should be either a frame or a display name (a string).
3559 If omitted or nil, that stands for the selected frame's display. */)
3561 Lisp_Object display
;
3563 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3565 int nr_planes
= DisplayPlanes (dpyinfo
->display
,
3566 XScreenNumberOfScreen (dpyinfo
->screen
));
3568 /* Truncate nr_planes to 24 to avoid integer overflow.
3569 Some displays says 32, but only 24 bits are actually significant.
3570 There are only very few and rare video cards that have more than
3571 24 significant bits. Also 24 bits is more than 16 million colors,
3572 it "should be enough for everyone". */
3573 if (nr_planes
> 24) nr_planes
= 24;
3575 return make_number (1 << nr_planes
);
3578 DEFUN ("x-server-max-request-size", Fx_server_max_request_size
,
3579 Sx_server_max_request_size
,
3581 doc
: /* Returns the maximum request size of the X server of display DISPLAY.
3582 The optional argument DISPLAY specifies which display to ask about.
3583 DISPLAY should be either a frame or a display name (a string).
3584 If omitted or nil, that stands for the selected frame's display. */)
3586 Lisp_Object display
;
3588 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3590 return make_number (MAXREQUEST (dpyinfo
->display
));
3593 DEFUN ("x-server-vendor", Fx_server_vendor
, Sx_server_vendor
, 0, 1, 0,
3594 doc
: /* Returns the "vendor ID" string of the X server of display DISPLAY.
3595 \(Labelling every distributor as a "vendor" embodies the false assumption
3596 that operating systems cannot be developed and distributed noncommercially.)
3597 The optional argument DISPLAY specifies which display to ask about.
3598 DISPLAY should be either a frame or a display name (a string).
3599 If omitted or nil, that stands for the selected frame's display. */)
3601 Lisp_Object display
;
3603 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3604 char *vendor
= ServerVendor (dpyinfo
->display
);
3606 if (! vendor
) vendor
= "";
3607 return build_string (vendor
);
3610 DEFUN ("x-server-version", Fx_server_version
, Sx_server_version
, 0, 1, 0,
3611 doc
: /* Returns the version numbers of the X server of display DISPLAY.
3612 The value is a list of three integers: the major and minor
3613 version numbers of the X Protocol in use, and the distributor-specific release
3614 number. See also the function `x-server-vendor'.
3616 The optional argument DISPLAY specifies which display to ask about.
3617 DISPLAY should be either a frame or a display name (a string).
3618 If omitted or nil, that stands for the selected frame's display. */)
3620 Lisp_Object display
;
3622 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3623 Display
*dpy
= dpyinfo
->display
;
3625 return Fcons (make_number (ProtocolVersion (dpy
)),
3626 Fcons (make_number (ProtocolRevision (dpy
)),
3627 Fcons (make_number (VendorRelease (dpy
)), Qnil
)));
3630 DEFUN ("x-display-screens", Fx_display_screens
, Sx_display_screens
, 0, 1, 0,
3631 doc
: /* Return the number of screens on the X server of display DISPLAY.
3632 The optional argument DISPLAY specifies which display to ask about.
3633 DISPLAY should be either a frame or a display name (a string).
3634 If omitted or nil, that stands for the selected frame's display. */)
3636 Lisp_Object display
;
3638 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3640 return make_number (ScreenCount (dpyinfo
->display
));
3643 DEFUN ("x-display-mm-height", Fx_display_mm_height
, Sx_display_mm_height
, 0, 1, 0,
3644 doc
: /* Return the height in millimeters of the X display DISPLAY.
3645 The optional argument DISPLAY specifies which display to ask about.
3646 DISPLAY should be either a frame or a display name (a string).
3647 If omitted or nil, that stands for the selected frame's display. */)
3649 Lisp_Object display
;
3651 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3653 return make_number (HeightMMOfScreen (dpyinfo
->screen
));
3656 DEFUN ("x-display-mm-width", Fx_display_mm_width
, Sx_display_mm_width
, 0, 1, 0,
3657 doc
: /* Return the width in millimeters of the X display DISPLAY.
3658 The optional argument DISPLAY specifies which display to ask about.
3659 DISPLAY should be either a frame or a display name (a string).
3660 If omitted or nil, that stands for the selected frame's display. */)
3662 Lisp_Object display
;
3664 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3666 return make_number (WidthMMOfScreen (dpyinfo
->screen
));
3669 DEFUN ("x-display-backing-store", Fx_display_backing_store
,
3670 Sx_display_backing_store
, 0, 1, 0,
3671 doc
: /* Returns an indication of whether X display DISPLAY does backing store.
3672 The value may be `always', `when-mapped', or `not-useful'.
3673 The optional argument DISPLAY specifies which display to ask about.
3674 DISPLAY should be either a frame or a display name (a string).
3675 If omitted or nil, that stands for the selected frame's display. */)
3677 Lisp_Object display
;
3679 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3682 switch (DoesBackingStore (dpyinfo
->screen
))
3685 result
= intern ("always");
3689 result
= intern ("when-mapped");
3693 result
= intern ("not-useful");
3697 error ("Strange value for BackingStore parameter of screen");
3704 DEFUN ("x-display-visual-class", Fx_display_visual_class
,
3705 Sx_display_visual_class
, 0, 1, 0,
3706 doc
: /* Return the visual class of the X display DISPLAY.
3707 The value is one of the symbols `static-gray', `gray-scale',
3708 `static-color', `pseudo-color', `true-color', or `direct-color'.
3710 The optional argument DISPLAY specifies which display to ask about.
3711 DISPLAY should be either a frame or a display name (a string).
3712 If omitted or nil, that stands for the selected frame's display. */)
3714 Lisp_Object display
;
3716 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3719 switch (dpyinfo
->visual
->class)
3722 result
= intern ("static-gray");
3725 result
= intern ("gray-scale");
3728 result
= intern ("static-color");
3731 result
= intern ("pseudo-color");
3734 result
= intern ("true-color");
3737 result
= intern ("direct-color");
3740 error ("Display has an unknown visual class");
3747 DEFUN ("x-display-save-under", Fx_display_save_under
,
3748 Sx_display_save_under
, 0, 1, 0,
3749 doc
: /* Returns t if the X display DISPLAY supports the save-under feature.
3750 The optional argument DISPLAY specifies which display to ask about.
3751 DISPLAY should be either a frame or a display name (a string).
3752 If omitted or nil, that stands for the selected frame's display. */)
3754 Lisp_Object display
;
3756 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3758 if (DoesSaveUnders (dpyinfo
->screen
) == True
)
3766 register struct frame
*f
;
3768 return FRAME_PIXEL_WIDTH (f
);
3773 register struct frame
*f
;
3775 return FRAME_PIXEL_HEIGHT (f
);
3780 register struct frame
*f
;
3782 return FRAME_COLUMN_WIDTH (f
);
3787 register struct frame
*f
;
3789 return FRAME_LINE_HEIGHT (f
);
3794 register struct frame
*f
;
3796 return FRAME_X_DISPLAY_INFO (f
)->n_planes
;
3801 /************************************************************************
3803 ************************************************************************/
3806 /* Mapping visual names to visuals. */
3808 static struct visual_class
3815 {"StaticGray", StaticGray
},
3816 {"GrayScale", GrayScale
},
3817 {"StaticColor", StaticColor
},
3818 {"PseudoColor", PseudoColor
},
3819 {"TrueColor", TrueColor
},
3820 {"DirectColor", DirectColor
},
3825 #ifndef HAVE_XSCREENNUMBEROFSCREEN
3827 /* Value is the screen number of screen SCR. This is a substitute for
3828 the X function with the same name when that doesn't exist. */
3831 XScreenNumberOfScreen (scr
)
3832 register Screen
*scr
;
3834 Display
*dpy
= scr
->display
;
3837 for (i
= 0; i
< dpy
->nscreens
; ++i
)
3838 if (scr
== dpy
->screens
+ i
)
3844 #endif /* not HAVE_XSCREENNUMBEROFSCREEN */
3847 /* Select the visual that should be used on display DPYINFO. Set
3848 members of DPYINFO appropriately. Called from x_term_init. */
3851 select_visual (dpyinfo
)
3852 struct x_display_info
*dpyinfo
;
3854 Display
*dpy
= dpyinfo
->display
;
3855 Screen
*screen
= dpyinfo
->screen
;
3858 /* See if a visual is specified. */
3859 value
= display_x_get_resource (dpyinfo
,
3860 build_string ("visualClass"),
3861 build_string ("VisualClass"),
3863 if (STRINGP (value
))
3865 /* VALUE should be of the form CLASS-DEPTH, where CLASS is one
3866 of `PseudoColor', `TrueColor' etc. and DEPTH is the color
3867 depth, a decimal number. NAME is compared with case ignored. */
3868 char *s
= (char *) alloca (SBYTES (value
) + 1);
3873 strcpy (s
, SDATA (value
));
3874 dash
= index (s
, '-');
3877 dpyinfo
->n_planes
= atoi (dash
+ 1);
3881 /* We won't find a matching visual with depth 0, so that
3882 an error will be printed below. */
3883 dpyinfo
->n_planes
= 0;
3885 /* Determine the visual class. */
3886 for (i
= 0; visual_classes
[i
].name
; ++i
)
3887 if (xstricmp (s
, visual_classes
[i
].name
) == 0)
3889 class = visual_classes
[i
].class;
3893 /* Look up a matching visual for the specified class. */
3895 || !XMatchVisualInfo (dpy
, XScreenNumberOfScreen (screen
),
3896 dpyinfo
->n_planes
, class, &vinfo
))
3897 fatal ("Invalid visual specification `%s'", SDATA (value
));
3899 dpyinfo
->visual
= vinfo
.visual
;
3904 XVisualInfo
*vinfo
, vinfo_template
;
3906 dpyinfo
->visual
= DefaultVisualOfScreen (screen
);
3909 vinfo_template
.visualid
= XVisualIDFromVisual (dpyinfo
->visual
);
3911 vinfo_template
.visualid
= dpyinfo
->visual
->visualid
;
3913 vinfo_template
.screen
= XScreenNumberOfScreen (screen
);
3914 vinfo
= XGetVisualInfo (dpy
, VisualIDMask
| VisualScreenMask
,
3915 &vinfo_template
, &n_visuals
);
3917 fatal ("Can't get proper X visual info");
3919 dpyinfo
->n_planes
= vinfo
->depth
;
3920 XFree ((char *) vinfo
);
3925 /* Return the X display structure for the display named NAME.
3926 Open a new connection if necessary. */
3928 struct x_display_info
*
3929 x_display_info_for_name (name
)
3933 struct x_display_info
*dpyinfo
;
3935 CHECK_STRING (name
);
3937 if (! EQ (Vwindow_system
, intern ("x")))
3938 error ("Not using X Windows");
3940 for (dpyinfo
= x_display_list
, names
= x_display_name_list
;
3942 dpyinfo
= dpyinfo
->next
, names
= XCDR (names
))
3945 tem
= Fstring_equal (XCAR (XCAR (names
)), name
);
3950 /* Use this general default value to start with. */
3951 Vx_resource_name
= Vinvocation_name
;
3953 validate_x_resource_name ();
3955 dpyinfo
= x_term_init (name
, (char *)0,
3956 (char *) SDATA (Vx_resource_name
));
3959 error ("Cannot connect to X server %s", SDATA (name
));
3962 XSETFASTINT (Vwindow_system_version
, 11);
3968 DEFUN ("x-open-connection", Fx_open_connection
, Sx_open_connection
,
3970 doc
: /* Open a connection to an X server.
3971 DISPLAY is the name of the display to connect to.
3972 Optional second arg XRM-STRING is a string of resources in xrdb format.
3973 If the optional third arg MUST-SUCCEED is non-nil,
3974 terminate Emacs if we can't open the connection. */)
3975 (display
, xrm_string
, must_succeed
)
3976 Lisp_Object display
, xrm_string
, must_succeed
;
3978 unsigned char *xrm_option
;
3979 struct x_display_info
*dpyinfo
;
3981 CHECK_STRING (display
);
3982 if (! NILP (xrm_string
))
3983 CHECK_STRING (xrm_string
);
3985 if (! EQ (Vwindow_system
, intern ("x")))
3986 error ("Not using X Windows");
3988 if (! NILP (xrm_string
))
3989 xrm_option
= (unsigned char *) SDATA (xrm_string
);
3991 xrm_option
= (unsigned char *) 0;
3993 validate_x_resource_name ();
3995 /* This is what opens the connection and sets x_current_display.
3996 This also initializes many symbols, such as those used for input. */
3997 dpyinfo
= x_term_init (display
, xrm_option
,
3998 (char *) SDATA (Vx_resource_name
));
4002 if (!NILP (must_succeed
))
4003 fatal ("Cannot connect to X server %s.\n\
4004 Check the DISPLAY environment variable or use `-d'.\n\
4005 Also use the `xauth' program to verify that you have the proper\n\
4006 authorization information needed to connect the X server.\n\
4007 An insecure way to solve the problem may be to use `xhost'.\n",
4010 error ("Cannot connect to X server %s", SDATA (display
));
4015 XSETFASTINT (Vwindow_system_version
, 11);
4019 DEFUN ("x-close-connection", Fx_close_connection
,
4020 Sx_close_connection
, 1, 1, 0,
4021 doc
: /* Close the connection to DISPLAY's X server.
4022 For DISPLAY, specify either a frame or a display name (a string).
4023 If DISPLAY is nil, that stands for the selected frame's display. */)
4025 Lisp_Object display
;
4027 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
4030 if (dpyinfo
->reference_count
> 0)
4031 error ("Display still has frames on it");
4034 /* Free the fonts in the font table. */
4035 for (i
= 0; i
< dpyinfo
->n_fonts
; i
++)
4036 if (dpyinfo
->font_table
[i
].name
)
4038 XFreeFont (dpyinfo
->display
, dpyinfo
->font_table
[i
].font
);
4041 x_destroy_all_bitmaps (dpyinfo
);
4042 XSetCloseDownMode (dpyinfo
->display
, DestroyAll
);
4044 #ifdef USE_X_TOOLKIT
4045 XtCloseDisplay (dpyinfo
->display
);
4047 XCloseDisplay (dpyinfo
->display
);
4050 x_delete_display (dpyinfo
);
4056 DEFUN ("x-display-list", Fx_display_list
, Sx_display_list
, 0, 0, 0,
4057 doc
: /* Return the list of display names that Emacs has connections to. */)
4060 Lisp_Object tail
, result
;
4063 for (tail
= x_display_name_list
; ! NILP (tail
); tail
= XCDR (tail
))
4064 result
= Fcons (XCAR (XCAR (tail
)), result
);
4069 DEFUN ("x-synchronize", Fx_synchronize
, Sx_synchronize
, 1, 2, 0,
4070 doc
: /* If ON is non-nil, report X errors as soon as the erring request is made.
4071 If ON is nil, allow buffering of requests.
4072 Turning on synchronization prohibits the Xlib routines from buffering
4073 requests and seriously degrades performance, but makes debugging much
4075 The optional second argument DISPLAY specifies which display to act on.
4076 DISPLAY should be either a frame or a display name (a string).
4077 If DISPLAY is omitted or nil, that stands for the selected frame's display. */)
4079 Lisp_Object display
, on
;
4081 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
4083 XSynchronize (dpyinfo
->display
, !EQ (on
, Qnil
));
4088 /* Wait for responses to all X commands issued so far for frame F. */
4095 XSync (FRAME_X_DISPLAY (f
), False
);
4100 /***********************************************************************
4102 ***********************************************************************/
4104 DEFUN ("x-change-window-property", Fx_change_window_property
,
4105 Sx_change_window_property
, 2, 6, 0,
4106 doc
: /* Change window property PROP to VALUE on the X window of FRAME.
4107 PROP must be a string.
4108 VALUE may be a string or a list of conses, numbers and/or strings.
4109 If an element in the list is a string, it is converted to
4110 an Atom and the value of the Atom is used. If an element is a cons,
4111 it is converted to a 32 bit number where the car is the 16 top bits and the
4112 cdr is the lower 16 bits.
4113 FRAME nil or omitted means use the selected frame.
4114 If TYPE is given and non-nil, it is the name of the type of VALUE.
4115 If TYPE is not given or nil, the type is STRING.
4116 FORMAT gives the size in bits of each element if VALUE is a list.
4117 It must be one of 8, 16 or 32.
4118 If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
4119 If OUTER_P is non-nil, the property is changed for the outer X window of
4120 FRAME. Default is to change on the edit X window.
4123 (prop
, value
, frame
, type
, format
, outer_p
)
4124 Lisp_Object prop
, value
, frame
, type
, format
, outer_p
;
4126 struct frame
*f
= check_x_frame (frame
);
4128 Atom target_type
= XA_STRING
;
4129 int element_format
= 8;
4130 unsigned char *data
;
4134 CHECK_STRING (prop
);
4136 if (! NILP (format
))
4138 CHECK_NUMBER (format
);
4139 element_format
= XFASTINT (format
);
4141 if (element_format
!= 8 && element_format
!= 16
4142 && element_format
!= 32)
4143 error ("FORMAT must be one of 8, 16 or 32");
4148 nelements
= x_check_property_data (value
);
4149 if (nelements
== -1)
4150 error ("Bad data in VALUE, must be number, string or cons");
4152 if (element_format
== 8)
4153 data
= (unsigned char *) xmalloc (nelements
);
4154 else if (element_format
== 16)
4155 data
= (unsigned char *) xmalloc (nelements
*2);
4156 else /* format == 32 */
4157 /* The man page for XChangeProperty:
4158 "If the specified format is 32, the property data must be a
4160 This applies even if long is more than 64 bits. The X library
4161 converts to 32 bits before sending to the X server. */
4162 data
= (unsigned char *) xmalloc (nelements
* sizeof(long));
4164 x_fill_property_data (FRAME_X_DISPLAY (f
), value
, data
, element_format
);
4168 CHECK_STRING (value
);
4169 data
= SDATA (value
);
4170 nelements
= SCHARS (value
);
4174 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4177 CHECK_STRING (type
);
4178 target_type
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (type
), False
);
4181 if (! NILP (outer_p
)) w
= FRAME_OUTER_WINDOW (f
);
4182 else w
= FRAME_X_WINDOW (f
);
4184 XChangeProperty (FRAME_X_DISPLAY (f
), w
,
4185 prop_atom
, target_type
, element_format
, PropModeReplace
,
4188 if (CONSP (value
)) xfree (data
);
4190 /* Make sure the property is set when we return. */
4191 XFlush (FRAME_X_DISPLAY (f
));
4198 DEFUN ("x-delete-window-property", Fx_delete_window_property
,
4199 Sx_delete_window_property
, 1, 2, 0,
4200 doc
: /* Remove window property PROP from X window of FRAME.
4201 FRAME nil or omitted means use the selected frame. Value is PROP. */)
4203 Lisp_Object prop
, frame
;
4205 struct frame
*f
= check_x_frame (frame
);
4208 CHECK_STRING (prop
);
4210 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4211 XDeleteProperty (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), prop_atom
);
4213 /* Make sure the property is removed when we return. */
4214 XFlush (FRAME_X_DISPLAY (f
));
4221 DEFUN ("x-window-property", Fx_window_property
, Sx_window_property
,
4223 doc
: /* Value is the value of window property PROP on FRAME.
4224 If FRAME is nil or omitted, use the selected frame.
4225 If TYPE is nil or omitted, get the property as a string. Otherwise TYPE
4226 is the name of the Atom that denotes the type expected.
4227 If SOURCE is non-nil, get the property on that window instead of from
4228 FRAME. The number 0 denotes the root window.
4229 If DELETE_P is non-nil, delete the property after retreiving it.
4230 If VECTOR_RET_P is non-nil, don't return a string but a vector of values.
4232 Value is nil if FRAME hasn't a property with name PROP or if PROP has
4233 no value of TYPE. */)
4234 (prop
, frame
, type
, source
, delete_p
, vector_ret_p
)
4235 Lisp_Object prop
, frame
, type
, source
, delete_p
, vector_ret_p
;
4237 struct frame
*f
= check_x_frame (frame
);
4240 Lisp_Object prop_value
= Qnil
;
4241 unsigned char *tmp_data
= NULL
;
4243 Atom target_type
= XA_STRING
;
4245 unsigned long actual_size
, bytes_remaining
;
4246 Window target_window
= FRAME_X_WINDOW (f
);
4247 struct gcpro gcpro1
;
4249 GCPRO1 (prop_value
);
4250 CHECK_STRING (prop
);
4252 if (! NILP (source
))
4254 if (NUMBERP (source
))
4256 if (FLOATP (source
))
4257 target_window
= (Window
) XFLOAT (source
);
4259 target_window
= XFASTINT (source
);
4261 if (target_window
== 0)
4262 target_window
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4264 else if (CONSP (source
))
4265 target_window
= cons_to_long (source
);
4271 if (strcmp ("AnyPropertyType", SDATA (type
)) == 0)
4272 target_type
= AnyPropertyType
;
4274 target_type
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (type
), False
);
4277 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4278 rc
= XGetWindowProperty (FRAME_X_DISPLAY (f
), target_window
,
4279 prop_atom
, 0, 0, False
, target_type
,
4280 &actual_type
, &actual_format
, &actual_size
,
4281 &bytes_remaining
, &tmp_data
);
4284 int size
= bytes_remaining
;
4289 rc
= XGetWindowProperty (FRAME_X_DISPLAY (f
), target_window
,
4290 prop_atom
, 0, bytes_remaining
,
4291 ! NILP (delete_p
), target_type
,
4292 &actual_type
, &actual_format
,
4293 &actual_size
, &bytes_remaining
,
4295 if (rc
== Success
&& tmp_data
)
4297 /* The man page for XGetWindowProperty says:
4298 "If the returned format is 32, the returned data is represented
4299 as a long array and should be cast to that type to obtain the
4301 This applies even if long is more than 32 bits, the X library
4302 converts from 32 bit elements received from the X server to long
4303 and passes the long array to us. Thus, for that case bcopy can not
4304 be used. We convert to a 32 bit type here, because so much code
4307 The bytes and offsets passed to XGetWindowProperty refers to the
4308 property and those are indeed in 32 bit quantities if format is
4311 if (actual_format
== 32 && actual_format
< BITS_PER_LONG
)
4314 int *idata
= (int *) tmp_data
;
4315 long *ldata
= (long *) tmp_data
;
4317 for (i
= 0; i
< actual_size
; ++i
)
4318 idata
[i
] = (int) ldata
[i
];
4321 if (NILP (vector_ret_p
))
4322 prop_value
= make_string (tmp_data
, size
);
4324 prop_value
= x_property_data_to_lisp (f
,
4331 if (tmp_data
) XFree (tmp_data
);
4341 /***********************************************************************
4343 ***********************************************************************/
4345 /* If non-null, an asynchronous timer that, when it expires, displays
4346 an hourglass cursor on all frames. */
4348 static struct atimer
*hourglass_atimer
;
4350 /* Non-zero means an hourglass cursor is currently shown. */
4352 static int hourglass_shown_p
;
4354 /* Number of seconds to wait before displaying an hourglass cursor. */
4356 static Lisp_Object Vhourglass_delay
;
4358 /* Default number of seconds to wait before displaying an hourglass
4361 #define DEFAULT_HOURGLASS_DELAY 1
4363 /* Function prototypes. */
4365 static void show_hourglass
P_ ((struct atimer
*));
4366 static void hide_hourglass
P_ ((void));
4368 /* Return non-zero if houglass timer has been started or hourglass is shown. */
4371 hourglass_started ()
4373 return hourglass_shown_p
|| hourglass_atimer
!= NULL
;
4377 /* Cancel a currently active hourglass timer, and start a new one. */
4383 int secs
, usecs
= 0;
4385 /* Don't bother for ttys. */
4386 if (NILP (Vwindow_system
))
4389 cancel_hourglass ();
4391 if (INTEGERP (Vhourglass_delay
)
4392 && XINT (Vhourglass_delay
) > 0)
4393 secs
= XFASTINT (Vhourglass_delay
);
4394 else if (FLOATP (Vhourglass_delay
)
4395 && XFLOAT_DATA (Vhourglass_delay
) > 0)
4398 tem
= Ftruncate (Vhourglass_delay
, Qnil
);
4399 secs
= XFASTINT (tem
);
4400 usecs
= (XFLOAT_DATA (Vhourglass_delay
) - secs
) * 1000000;
4403 secs
= DEFAULT_HOURGLASS_DELAY
;
4405 EMACS_SET_SECS_USECS (delay
, secs
, usecs
);
4406 hourglass_atimer
= start_atimer (ATIMER_RELATIVE
, delay
,
4407 show_hourglass
, NULL
);
4411 /* Cancel the hourglass cursor timer if active, hide a busy cursor if
4417 if (hourglass_atimer
)
4419 cancel_atimer (hourglass_atimer
);
4420 hourglass_atimer
= NULL
;
4423 if (hourglass_shown_p
)
4428 /* Timer function of hourglass_atimer. TIMER is equal to
4431 Display an hourglass pointer on all frames by mapping the frames'
4432 hourglass_window. Set the hourglass_p flag in the frames'
4433 output_data.x structure to indicate that an hourglass cursor is
4434 shown on the frames. */
4437 show_hourglass (timer
)
4438 struct atimer
*timer
;
4440 /* The timer implementation will cancel this timer automatically
4441 after this function has run. Set hourglass_atimer to null
4442 so that we know the timer doesn't have to be canceled. */
4443 hourglass_atimer
= NULL
;
4445 if (!hourglass_shown_p
)
4447 Lisp_Object rest
, frame
;
4451 FOR_EACH_FRAME (rest
, frame
)
4453 struct frame
*f
= XFRAME (frame
);
4455 if (FRAME_LIVE_P (f
) && FRAME_X_P (f
) && FRAME_X_DISPLAY (f
))
4457 Display
*dpy
= FRAME_X_DISPLAY (f
);
4459 #ifdef USE_X_TOOLKIT
4460 if (f
->output_data
.x
->widget
)
4462 if (FRAME_OUTER_WINDOW (f
))
4465 f
->output_data
.x
->hourglass_p
= 1;
4467 if (!f
->output_data
.x
->hourglass_window
)
4469 unsigned long mask
= CWCursor
;
4470 XSetWindowAttributes attrs
;
4472 Window parent
= FRAME_X_WINDOW (f
);
4474 Window parent
= FRAME_OUTER_WINDOW (f
);
4476 attrs
.cursor
= f
->output_data
.x
->hourglass_cursor
;
4478 f
->output_data
.x
->hourglass_window
4479 = XCreateWindow (dpy
, parent
,
4480 0, 0, 32000, 32000, 0, 0,
4486 XMapRaised (dpy
, f
->output_data
.x
->hourglass_window
);
4492 hourglass_shown_p
= 1;
4498 /* Hide the hourglass pointer on all frames, if it is currently
4504 if (hourglass_shown_p
)
4506 Lisp_Object rest
, frame
;
4509 FOR_EACH_FRAME (rest
, frame
)
4511 struct frame
*f
= XFRAME (frame
);
4514 /* Watch out for newly created frames. */
4515 && f
->output_data
.x
->hourglass_window
)
4517 XUnmapWindow (FRAME_X_DISPLAY (f
),
4518 f
->output_data
.x
->hourglass_window
);
4519 /* Sync here because XTread_socket looks at the
4520 hourglass_p flag that is reset to zero below. */
4521 XSync (FRAME_X_DISPLAY (f
), False
);
4522 f
->output_data
.x
->hourglass_p
= 0;
4526 hourglass_shown_p
= 0;
4533 /***********************************************************************
4535 ***********************************************************************/
4537 static Lisp_Object x_create_tip_frame
P_ ((struct x_display_info
*,
4538 Lisp_Object
, Lisp_Object
));
4539 static void compute_tip_xy
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
,
4540 Lisp_Object
, int, int, int *, int *));
4542 /* The frame of a currently visible tooltip. */
4544 Lisp_Object tip_frame
;
4546 /* If non-nil, a timer started that hides the last tooltip when it
4549 Lisp_Object tip_timer
;
4552 /* If non-nil, a vector of 3 elements containing the last args
4553 with which x-show-tip was called. See there. */
4555 Lisp_Object last_show_tip_args
;
4557 /* Maximum size for tooltips; a cons (COLUMNS . ROWS). */
4559 Lisp_Object Vx_max_tooltip_size
;
4563 unwind_create_tip_frame (frame
)
4566 Lisp_Object deleted
;
4568 deleted
= unwind_create_frame (frame
);
4569 if (EQ (deleted
, Qt
))
4579 /* Create a frame for a tooltip on the display described by DPYINFO.
4580 PARMS is a list of frame parameters. TEXT is the string to
4581 display in the tip frame. Value is the frame.
4583 Note that functions called here, esp. x_default_parameter can
4584 signal errors, for instance when a specified color name is
4585 undefined. We have to make sure that we're in a consistent state
4586 when this happens. */
4589 x_create_tip_frame (dpyinfo
, parms
, text
)
4590 struct x_display_info
*dpyinfo
;
4591 Lisp_Object parms
, text
;
4594 Lisp_Object frame
, tem
;
4596 long window_prompting
= 0;
4598 int count
= SPECPDL_INDEX ();
4599 struct gcpro gcpro1
, gcpro2
, gcpro3
;
4601 int face_change_count_before
= face_change_count
;
4603 struct buffer
*old_buffer
;
4609 kb
= dpyinfo
->kboard
;
4611 kb
= &the_only_kboard
;
4614 /* Get the name of the frame to use for resource lookup. */
4615 name
= x_get_arg (dpyinfo
, parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
4617 && !EQ (name
, Qunbound
)
4619 error ("Invalid frame name--not a string or nil");
4622 GCPRO3 (parms
, name
, frame
);
4624 XSETFRAME (frame
, f
);
4626 buffer
= Fget_buffer_create (build_string (" *tip*"));
4627 Fset_window_buffer (FRAME_ROOT_WINDOW (f
), buffer
, Qnil
);
4628 old_buffer
= current_buffer
;
4629 set_buffer_internal_1 (XBUFFER (buffer
));
4630 current_buffer
->truncate_lines
= Qnil
;
4631 specbind (Qinhibit_read_only
, Qt
);
4632 specbind (Qinhibit_modification_hooks
, Qt
);
4635 set_buffer_internal_1 (old_buffer
);
4637 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 0;
4638 record_unwind_protect (unwind_create_tip_frame
, frame
);
4640 /* By setting the output method, we're essentially saying that
4641 the frame is live, as per FRAME_LIVE_P. If we get a signal
4642 from this point on, x_destroy_window might screw up reference
4644 f
->output_method
= output_x_window
;
4645 f
->output_data
.x
= (struct x_output
*) xmalloc (sizeof (struct x_output
));
4646 bzero (f
->output_data
.x
, sizeof (struct x_output
));
4647 f
->output_data
.x
->icon_bitmap
= -1;
4648 FRAME_FONTSET (f
) = -1;
4649 f
->output_data
.x
->scroll_bar_foreground_pixel
= -1;
4650 f
->output_data
.x
->scroll_bar_background_pixel
= -1;
4651 #ifdef USE_TOOLKIT_SCROLL_BARS
4652 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
4653 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
4654 #endif /* USE_TOOLKIT_SCROLL_BARS */
4655 f
->icon_name
= Qnil
;
4656 FRAME_X_DISPLAY_INFO (f
) = dpyinfo
;
4658 image_cache_refcount
= FRAME_X_IMAGE_CACHE (f
)->refcount
;
4659 dpyinfo_refcount
= dpyinfo
->reference_count
;
4660 #endif /* GLYPH_DEBUG */
4662 FRAME_KBOARD (f
) = kb
;
4664 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4665 f
->output_data
.x
->explicit_parent
= 0;
4667 /* These colors will be set anyway later, but it's important
4668 to get the color reference counts right, so initialize them! */
4671 struct gcpro gcpro1
;
4673 black
= build_string ("black");
4675 f
->output_data
.x
->foreground_pixel
4676 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4677 f
->output_data
.x
->background_pixel
4678 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4679 f
->output_data
.x
->cursor_pixel
4680 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4681 f
->output_data
.x
->cursor_foreground_pixel
4682 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4683 f
->output_data
.x
->border_pixel
4684 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4685 f
->output_data
.x
->mouse_pixel
4686 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4690 /* Set the name; the functions to which we pass f expect the name to
4692 if (EQ (name
, Qunbound
) || NILP (name
))
4694 f
->name
= build_string (dpyinfo
->x_id_name
);
4695 f
->explicit_name
= 0;
4700 f
->explicit_name
= 1;
4701 /* use the frame's title when getting resources for this frame. */
4702 specbind (Qx_resource_name
, name
);
4705 /* Extract the window parameters from the supplied values that are
4706 needed to determine window geometry. */
4710 font
= x_get_arg (dpyinfo
, parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
4713 /* First, try whatever font the caller has specified. */
4716 tem
= Fquery_fontset (font
, Qnil
);
4718 font
= x_new_fontset (f
, SDATA (tem
));
4720 font
= x_new_font (f
, SDATA (font
));
4723 /* Try out a font which we hope has bold and italic variations. */
4724 if (!STRINGP (font
))
4725 font
= x_new_font (f
, "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1");
4726 if (!STRINGP (font
))
4727 font
= x_new_font (f
, "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
4728 if (! STRINGP (font
))
4729 font
= x_new_font (f
, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
4730 if (! STRINGP (font
))
4731 /* This was formerly the first thing tried, but it finds too many fonts
4732 and takes too long. */
4733 font
= x_new_font (f
, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1");
4734 /* If those didn't work, look for something which will at least work. */
4735 if (! STRINGP (font
))
4736 font
= x_new_font (f
, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1");
4738 if (! STRINGP (font
))
4739 font
= build_string ("fixed");
4741 x_default_parameter (f
, parms
, Qfont
, font
,
4742 "font", "Font", RES_TYPE_STRING
);
4745 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
4746 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
4748 /* This defaults to 2 in order to match xterm. We recognize either
4749 internalBorderWidth or internalBorder (which is what xterm calls
4751 if (NILP (Fassq (Qinternal_border_width
, parms
)))
4755 value
= x_get_arg (dpyinfo
, parms
, Qinternal_border_width
,
4756 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
4757 if (! EQ (value
, Qunbound
))
4758 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
4762 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
4763 "internalBorderWidth", "internalBorderWidth",
4766 /* Also do the stuff which must be set before the window exists. */
4767 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
4768 "foreground", "Foreground", RES_TYPE_STRING
);
4769 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
4770 "background", "Background", RES_TYPE_STRING
);
4771 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
4772 "pointerColor", "Foreground", RES_TYPE_STRING
);
4773 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
4774 "cursorColor", "Foreground", RES_TYPE_STRING
);
4775 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
4776 "borderColor", "BorderColor", RES_TYPE_STRING
);
4778 /* Init faces before x_default_parameter is called for scroll-bar
4779 parameters because that function calls x_set_scroll_bar_width,
4780 which calls change_frame_size, which calls Fset_window_buffer,
4781 which runs hooks, which call Fvertical_motion. At the end, we
4782 end up in init_iterator with a null face cache, which should not
4784 init_frame_faces (f
);
4786 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4788 window_prompting
= x_figure_window_size (f
, parms
, 0);
4791 XSetWindowAttributes attrs
;
4795 mask
= CWBackPixel
| CWOverrideRedirect
| CWEventMask
;
4796 if (DoesSaveUnders (dpyinfo
->screen
))
4797 mask
|= CWSaveUnder
;
4799 /* Window managers look at the override-redirect flag to determine
4800 whether or net to give windows a decoration (Xlib spec, chapter
4802 attrs
.override_redirect
= True
;
4803 attrs
.save_under
= True
;
4804 attrs
.background_pixel
= FRAME_BACKGROUND_PIXEL (f
);
4805 /* Arrange for getting MapNotify and UnmapNotify events. */
4806 attrs
.event_mask
= StructureNotifyMask
;
4808 = FRAME_X_WINDOW (f
)
4809 = XCreateWindow (FRAME_X_DISPLAY (f
),
4810 FRAME_X_DISPLAY_INFO (f
)->root_window
,
4811 /* x, y, width, height */
4815 CopyFromParent
, InputOutput
, CopyFromParent
,
4822 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
4823 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
4824 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
4825 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
4826 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
4827 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
4829 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
4830 Change will not be effected unless different from the current
4832 width
= FRAME_COLS (f
);
4833 height
= FRAME_LINES (f
);
4834 SET_FRAME_COLS (f
, 0);
4835 FRAME_LINES (f
) = 0;
4836 change_frame_size (f
, height
, width
, 1, 0, 0);
4838 /* Add `tooltip' frame parameter's default value. */
4839 if (NILP (Fframe_parameter (frame
, intern ("tooltip"))))
4840 Fmodify_frame_parameters (frame
, Fcons (Fcons (intern ("tooltip"), Qt
),
4843 /* Set up faces after all frame parameters are known. This call
4844 also merges in face attributes specified for new frames.
4846 Frame parameters may be changed if .Xdefaults contains
4847 specifications for the default font. For example, if there is an
4848 `Emacs.default.attributeBackground: pink', the `background-color'
4849 attribute of the frame get's set, which let's the internal border
4850 of the tooltip frame appear in pink. Prevent this. */
4852 Lisp_Object bg
= Fframe_parameter (frame
, Qbackground_color
);
4854 /* Set tip_frame here, so that */
4856 call1 (Qface_set_after_frame_default
, frame
);
4858 if (!EQ (bg
, Fframe_parameter (frame
, Qbackground_color
)))
4859 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qbackground_color
, bg
),
4867 /* It is now ok to make the frame official even if we get an error
4868 below. And the frame needs to be on Vframe_list or making it
4869 visible won't work. */
4870 Vframe_list
= Fcons (frame
, Vframe_list
);
4872 /* Now that the frame is official, it counts as a reference to
4874 FRAME_X_DISPLAY_INFO (f
)->reference_count
++;
4876 /* Setting attributes of faces of the tooltip frame from resources
4877 and similar will increment face_change_count, which leads to the
4878 clearing of all current matrices. Since this isn't necessary
4879 here, avoid it by resetting face_change_count to the value it
4880 had before we created the tip frame. */
4881 face_change_count
= face_change_count_before
;
4883 /* Discard the unwind_protect. */
4884 return unbind_to (count
, frame
);
4888 /* Compute where to display tip frame F. PARMS is the list of frame
4889 parameters for F. DX and DY are specified offsets from the current
4890 location of the mouse. WIDTH and HEIGHT are the width and height
4891 of the tooltip. Return coordinates relative to the root window of
4892 the display in *ROOT_X, and *ROOT_Y. */
4895 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, root_x
, root_y
)
4897 Lisp_Object parms
, dx
, dy
;
4899 int *root_x
, *root_y
;
4901 Lisp_Object left
, top
;
4906 /* User-specified position? */
4907 left
= Fcdr (Fassq (Qleft
, parms
));
4908 top
= Fcdr (Fassq (Qtop
, parms
));
4910 /* Move the tooltip window where the mouse pointer is. Resize and
4912 if (!INTEGERP (left
) || !INTEGERP (top
))
4915 XQueryPointer (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
4916 &root
, &child
, root_x
, root_y
, &win_x
, &win_y
, &pmask
);
4921 *root_y
= XINT (top
);
4922 else if (*root_y
+ XINT (dy
) - height
< 0)
4923 *root_y
-= XINT (dy
);
4927 *root_y
+= XINT (dy
);
4930 if (INTEGERP (left
))
4931 *root_x
= XINT (left
);
4932 else if (*root_x
+ XINT (dx
) + width
<= FRAME_X_DISPLAY_INFO (f
)->width
)
4933 /* It fits to the right of the pointer. */
4934 *root_x
+= XINT (dx
);
4935 else if (width
+ XINT (dx
) <= *root_x
)
4936 /* It fits to the left of the pointer. */
4937 *root_x
-= width
+ XINT (dx
);
4939 /* Put it left-justified on the screen--it ought to fit that way. */
4944 DEFUN ("x-show-tip", Fx_show_tip
, Sx_show_tip
, 1, 6, 0,
4945 doc
: /* Show STRING in a "tooltip" window on frame FRAME.
4946 A tooltip window is a small X window displaying a string.
4948 FRAME nil or omitted means use the selected frame.
4950 PARMS is an optional list of frame parameters which can be used to
4951 change the tooltip's appearance.
4953 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
4954 means use the default timeout of 5 seconds.
4956 If the list of frame parameters PARAMS contains a `left' parameters,
4957 the tooltip is displayed at that x-position. Otherwise it is
4958 displayed at the mouse position, with offset DX added (default is 5 if
4959 DX isn't specified). Likewise for the y-position; if a `top' frame
4960 parameter is specified, it determines the y-position of the tooltip
4961 window, otherwise it is displayed at the mouse position, with offset
4962 DY added (default is -10).
4964 A tooltip's maximum size is specified by `x-max-tooltip-size'.
4965 Text larger than the specified size is clipped. */)
4966 (string
, frame
, parms
, timeout
, dx
, dy
)
4967 Lisp_Object string
, frame
, parms
, timeout
, dx
, dy
;
4972 struct buffer
*old_buffer
;
4973 struct text_pos pos
;
4974 int i
, width
, height
;
4975 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
4976 int old_windows_or_buffers_changed
= windows_or_buffers_changed
;
4977 int count
= SPECPDL_INDEX ();
4979 specbind (Qinhibit_redisplay
, Qt
);
4981 GCPRO4 (string
, parms
, frame
, timeout
);
4983 CHECK_STRING (string
);
4984 f
= check_x_frame (frame
);
4986 timeout
= make_number (5);
4988 CHECK_NATNUM (timeout
);
4991 dx
= make_number (5);
4996 dy
= make_number (-10);
5000 if (NILP (last_show_tip_args
))
5001 last_show_tip_args
= Fmake_vector (make_number (3), Qnil
);
5003 if (!NILP (tip_frame
))
5005 Lisp_Object last_string
= AREF (last_show_tip_args
, 0);
5006 Lisp_Object last_frame
= AREF (last_show_tip_args
, 1);
5007 Lisp_Object last_parms
= AREF (last_show_tip_args
, 2);
5009 if (EQ (frame
, last_frame
)
5010 && !NILP (Fequal (last_string
, string
))
5011 && !NILP (Fequal (last_parms
, parms
)))
5013 struct frame
*f
= XFRAME (tip_frame
);
5015 /* Only DX and DY have changed. */
5016 if (!NILP (tip_timer
))
5018 Lisp_Object timer
= tip_timer
;
5020 call1 (Qcancel_timer
, timer
);
5024 compute_tip_xy (f
, parms
, dx
, dy
, FRAME_PIXEL_WIDTH (f
),
5025 FRAME_PIXEL_HEIGHT (f
), &root_x
, &root_y
);
5026 XMoveWindow (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
5033 /* Hide a previous tip, if any. */
5036 ASET (last_show_tip_args
, 0, string
);
5037 ASET (last_show_tip_args
, 1, frame
);
5038 ASET (last_show_tip_args
, 2, parms
);
5040 /* Add default values to frame parameters. */
5041 if (NILP (Fassq (Qname
, parms
)))
5042 parms
= Fcons (Fcons (Qname
, build_string ("tooltip")), parms
);
5043 if (NILP (Fassq (Qinternal_border_width
, parms
)))
5044 parms
= Fcons (Fcons (Qinternal_border_width
, make_number (3)), parms
);
5045 if (NILP (Fassq (Qborder_width
, parms
)))
5046 parms
= Fcons (Fcons (Qborder_width
, make_number (1)), parms
);
5047 if (NILP (Fassq (Qborder_color
, parms
)))
5048 parms
= Fcons (Fcons (Qborder_color
, build_string ("lightyellow")), parms
);
5049 if (NILP (Fassq (Qbackground_color
, parms
)))
5050 parms
= Fcons (Fcons (Qbackground_color
, build_string ("lightyellow")),
5053 /* Create a frame for the tooltip, and record it in the global
5054 variable tip_frame. */
5055 frame
= x_create_tip_frame (FRAME_X_DISPLAY_INFO (f
), parms
, string
);
5058 /* Set up the frame's root window. */
5059 w
= XWINDOW (FRAME_ROOT_WINDOW (f
));
5060 w
->left_col
= w
->top_line
= make_number (0);
5062 if (CONSP (Vx_max_tooltip_size
)
5063 && INTEGERP (XCAR (Vx_max_tooltip_size
))
5064 && XINT (XCAR (Vx_max_tooltip_size
)) > 0
5065 && INTEGERP (XCDR (Vx_max_tooltip_size
))
5066 && XINT (XCDR (Vx_max_tooltip_size
)) > 0)
5068 w
->total_cols
= XCAR (Vx_max_tooltip_size
);
5069 w
->total_lines
= XCDR (Vx_max_tooltip_size
);
5073 w
->total_cols
= make_number (80);
5074 w
->total_lines
= make_number (40);
5077 FRAME_TOTAL_COLS (f
) = XINT (w
->total_cols
);
5079 w
->pseudo_window_p
= 1;
5081 /* Display the tooltip text in a temporary buffer. */
5082 old_buffer
= current_buffer
;
5083 set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f
))->buffer
));
5084 current_buffer
->truncate_lines
= Qnil
;
5085 clear_glyph_matrix (w
->desired_matrix
);
5086 clear_glyph_matrix (w
->current_matrix
);
5087 SET_TEXT_POS (pos
, BEGV
, BEGV_BYTE
);
5088 try_window (FRAME_ROOT_WINDOW (f
), pos
, 0);
5090 /* Compute width and height of the tooltip. */
5092 for (i
= 0; i
< w
->desired_matrix
->nrows
; ++i
)
5094 struct glyph_row
*row
= &w
->desired_matrix
->rows
[i
];
5098 /* Stop at the first empty row at the end. */
5099 if (!row
->enabled_p
|| !row
->displays_text_p
)
5102 /* Let the row go over the full width of the frame. */
5103 row
->full_width_p
= 1;
5105 /* There's a glyph at the end of rows that is used to place
5106 the cursor there. Don't include the width of this glyph. */
5107 if (row
->used
[TEXT_AREA
])
5109 last
= &row
->glyphs
[TEXT_AREA
][row
->used
[TEXT_AREA
] - 1];
5110 row_width
= row
->pixel_width
- last
->pixel_width
;
5113 row_width
= row
->pixel_width
;
5115 height
+= row
->height
;
5116 width
= max (width
, row_width
);
5119 /* Add the frame's internal border to the width and height the X
5120 window should have. */
5121 height
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
5122 width
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
5124 /* Move the tooltip window where the mouse pointer is. Resize and
5126 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, &root_x
, &root_y
);
5129 XMoveResizeWindow (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
5130 root_x
, root_y
, width
, height
);
5131 XMapRaised (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
));
5134 /* Draw into the window. */
5135 w
->must_be_updated_p
= 1;
5136 update_single_window (w
, 1);
5138 /* Restore original current buffer. */
5139 set_buffer_internal_1 (old_buffer
);
5140 windows_or_buffers_changed
= old_windows_or_buffers_changed
;
5143 /* Let the tip disappear after timeout seconds. */
5144 tip_timer
= call3 (intern ("run-at-time"), timeout
, Qnil
,
5145 intern ("x-hide-tip"));
5148 return unbind_to (count
, Qnil
);
5152 DEFUN ("x-hide-tip", Fx_hide_tip
, Sx_hide_tip
, 0, 0, 0,
5153 doc
: /* Hide the current tooltip window, if there is any.
5154 Value is t if tooltip was open, nil otherwise. */)
5158 Lisp_Object deleted
, frame
, timer
;
5159 struct gcpro gcpro1
, gcpro2
;
5161 /* Return quickly if nothing to do. */
5162 if (NILP (tip_timer
) && NILP (tip_frame
))
5167 GCPRO2 (frame
, timer
);
5168 tip_frame
= tip_timer
= deleted
= Qnil
;
5170 count
= SPECPDL_INDEX ();
5171 specbind (Qinhibit_redisplay
, Qt
);
5172 specbind (Qinhibit_quit
, Qt
);
5175 call1 (Qcancel_timer
, timer
);
5179 Fdelete_frame (frame
, Qnil
);
5183 /* Bloodcurdling hack alert: The Lucid menu bar widget's
5184 redisplay procedure is not called when a tip frame over menu
5185 items is unmapped. Redisplay the menu manually... */
5187 struct frame
*f
= SELECTED_FRAME ();
5188 Widget w
= f
->output_data
.x
->menubar_widget
;
5189 extern void xlwmenu_redisplay
P_ ((Widget
));
5191 if (!DoesSaveUnders (FRAME_X_DISPLAY_INFO (f
)->screen
)
5195 xlwmenu_redisplay (w
);
5199 #endif /* USE_LUCID */
5203 return unbind_to (count
, deleted
);
5208 /***********************************************************************
5209 File selection dialog
5210 ***********************************************************************/
5214 /* Callback for "OK" and "Cancel" on file selection dialog. */
5217 file_dialog_cb (widget
, client_data
, call_data
)
5219 XtPointer call_data
, client_data
;
5221 int *result
= (int *) client_data
;
5222 XmAnyCallbackStruct
*cb
= (XmAnyCallbackStruct
*) call_data
;
5223 *result
= cb
->reason
;
5227 /* Callback for unmapping a file selection dialog. This is used to
5228 capture the case where a dialog is closed via a window manager's
5229 closer button, for example. Using a XmNdestroyCallback didn't work
5233 file_dialog_unmap_cb (widget
, client_data
, call_data
)
5235 XtPointer call_data
, client_data
;
5237 int *result
= (int *) client_data
;
5238 *result
= XmCR_CANCEL
;
5242 clean_up_file_dialog (arg
)
5245 struct Lisp_Save_Value
*p
= XSAVE_VALUE (arg
);
5246 Widget dialog
= (Widget
) p
->pointer
;
5250 XtUnmanageChild (dialog
);
5251 XtDestroyWidget (dialog
);
5252 x_menu_set_in_use (0);
5259 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
5260 doc
: /* Read file name, prompting with PROMPT in directory DIR.
5261 Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
5262 selection box, if specified. If MUSTMATCH is non-nil, the returned file
5263 or directory must exist. ONLY-DIR-P is ignored." */)
5264 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
)
5265 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, only_dir_p
;
5268 struct frame
*f
= SELECTED_FRAME ();
5269 Lisp_Object file
= Qnil
;
5270 Widget dialog
, text
, help
;
5273 extern XtAppContext Xt_app_con
;
5274 XmString dir_xmstring
, pattern_xmstring
;
5275 int count
= SPECPDL_INDEX ();
5276 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
5278 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
, file
);
5280 if (popup_activated ())
5281 error ("Trying to use a menu from within a menu-entry");
5283 CHECK_STRING (prompt
);
5286 /* Prevent redisplay. */
5287 specbind (Qinhibit_redisplay
, Qt
);
5291 /* Create the dialog with PROMPT as title, using DIR as initial
5292 directory and using "*" as pattern. */
5293 dir
= Fexpand_file_name (dir
, Qnil
);
5294 dir_xmstring
= XmStringCreateLocalized (SDATA (dir
));
5295 pattern_xmstring
= XmStringCreateLocalized ("*");
5297 XtSetArg (al
[ac
], XmNtitle
, SDATA (prompt
)); ++ac
;
5298 XtSetArg (al
[ac
], XmNdirectory
, dir_xmstring
); ++ac
;
5299 XtSetArg (al
[ac
], XmNpattern
, pattern_xmstring
); ++ac
;
5300 XtSetArg (al
[ac
], XmNresizePolicy
, XmRESIZE_GROW
); ++ac
;
5301 XtSetArg (al
[ac
], XmNdialogStyle
, XmDIALOG_APPLICATION_MODAL
); ++ac
;
5302 dialog
= XmCreateFileSelectionDialog (f
->output_data
.x
->widget
,
5304 XmStringFree (dir_xmstring
);
5305 XmStringFree (pattern_xmstring
);
5307 /* Add callbacks for OK and Cancel. */
5308 XtAddCallback (dialog
, XmNokCallback
, file_dialog_cb
,
5309 (XtPointer
) &result
);
5310 XtAddCallback (dialog
, XmNcancelCallback
, file_dialog_cb
,
5311 (XtPointer
) &result
);
5312 XtAddCallback (dialog
, XmNunmapCallback
, file_dialog_unmap_cb
,
5313 (XtPointer
) &result
);
5315 /* Remove the help button since we can't display help. */
5316 help
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_HELP_BUTTON
);
5317 XtUnmanageChild (help
);
5319 /* Mark OK button as default. */
5320 XtVaSetValues (XmFileSelectionBoxGetChild (dialog
, XmDIALOG_OK_BUTTON
),
5321 XmNshowAsDefault
, True
, NULL
);
5323 /* If MUSTMATCH is non-nil, disable the file entry field of the
5324 dialog, so that the user must select a file from the files list
5325 box. We can't remove it because we wouldn't have a way to get at
5326 the result file name, then. */
5327 text
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_TEXT
);
5328 if (!NILP (mustmatch
))
5331 label
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_SELECTION_LABEL
);
5332 XtSetSensitive (text
, False
);
5333 XtSetSensitive (label
, False
);
5336 /* Manage the dialog, so that list boxes get filled. */
5337 XtManageChild (dialog
);
5339 if (STRINGP (default_filename
))
5341 XmString default_xmstring
;
5342 Widget wtext
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_TEXT
);
5343 Widget list
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_LIST
);
5345 XmTextPosition last_pos
= XmTextFieldGetLastPosition (wtext
);
5346 XmTextFieldReplace (wtext
, 0, last_pos
,
5347 (SDATA (Ffile_name_nondirectory (default_filename
))));
5349 /* Select DEFAULT_FILENAME in the files list box. DEFAULT_FILENAME
5350 must include the path for this to work. */
5352 default_xmstring
= XmStringCreateLocalized (SDATA (default_filename
));
5354 if (XmListItemExists (list
, default_xmstring
))
5356 int item_pos
= XmListItemPos (list
, default_xmstring
);
5357 /* Select the item and scroll it into view. */
5358 XmListSelectPos (list
, item_pos
, True
);
5359 XmListSetPos (list
, item_pos
);
5362 XmStringFree (default_xmstring
);
5365 record_unwind_protect (clean_up_file_dialog
, make_save_value (dialog
, 0));
5367 /* Process events until the user presses Cancel or OK. */
5368 x_menu_set_in_use (1);
5373 x_menu_wait_for_event (0);
5374 XtAppNextEvent (Xt_app_con
, &event
);
5375 if (event
.type
== KeyPress
5376 && FRAME_X_DISPLAY (f
) == event
.xkey
.display
)
5378 KeySym keysym
= XLookupKeysym (&event
.xkey
, 0);
5380 /* Pop down on C-g. */
5381 if (keysym
== XK_g
&& (event
.xkey
.state
& ControlMask
) != 0)
5382 XtUnmanageChild (dialog
);
5385 (void) x_dispatch_event (&event
, FRAME_X_DISPLAY (f
));
5388 /* Get the result. */
5389 if (result
== XmCR_OK
)
5394 XtVaGetValues (dialog
, XmNtextString
, &text
, NULL
);
5395 XmStringGetLtoR (text
, XmFONTLIST_DEFAULT_TAG
, &data
);
5396 XmStringFree (text
);
5397 file
= build_string (data
);
5406 /* Make "Cancel" equivalent to C-g. */
5408 Fsignal (Qquit
, Qnil
);
5410 return unbind_to (count
, file
);
5413 #endif /* USE_MOTIF */
5418 clean_up_dialog (arg
)
5421 x_menu_set_in_use (0);
5426 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
5427 doc
: /* Read file name, prompting with PROMPT in directory DIR.
5428 Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
5429 selection box, if specified. If MUSTMATCH is non-nil, the returned file
5430 or directory must exist. If ONLY-DIR-P is non-nil, the user can only select
5432 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
)
5433 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, only_dir_p
;
5435 FRAME_PTR f
= SELECTED_FRAME ();
5437 Lisp_Object file
= Qnil
;
5438 int count
= SPECPDL_INDEX ();
5439 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
5442 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
, file
);
5444 if (popup_activated ())
5445 error ("Trying to use a menu from within a menu-entry");
5447 CHECK_STRING (prompt
);
5450 /* Prevent redisplay. */
5451 specbind (Qinhibit_redisplay
, Qt
);
5452 record_unwind_protect (clean_up_dialog
, Qnil
);
5456 if (STRINGP (default_filename
))
5457 cdef_file
= SDATA (default_filename
);
5459 cdef_file
= SDATA (dir
);
5461 fn
= xg_get_file_name (f
, SDATA (prompt
), cdef_file
,
5463 ! NILP (only_dir_p
));
5467 file
= build_string (fn
);
5474 /* Make "Cancel" equivalent to C-g. */
5476 Fsignal (Qquit
, Qnil
);
5478 return unbind_to (count
, file
);
5481 #endif /* USE_GTK */
5484 /***********************************************************************
5486 ***********************************************************************/
5488 #ifdef HAVE_XKBGETKEYBOARD
5489 #include <X11/XKBlib.h>
5490 #include <X11/keysym.h>
5493 DEFUN ("x-backspace-delete-keys-p", Fx_backspace_delete_keys_p
,
5494 Sx_backspace_delete_keys_p
, 0, 1, 0,
5495 doc
: /* Check if both Backspace and Delete keys are on the keyboard of FRAME.
5496 FRAME nil means use the selected frame.
5497 Value is t if we know that both keys are present, and are mapped to the
5498 usual X keysyms. */)
5502 #ifdef HAVE_XKBGETKEYBOARD
5504 struct frame
*f
= check_x_frame (frame
);
5505 Display
*dpy
= FRAME_X_DISPLAY (f
);
5506 Lisp_Object have_keys
;
5507 int major
, minor
, op
, event
, error
;
5511 /* Check library version in case we're dynamically linked. */
5512 major
= XkbMajorVersion
;
5513 minor
= XkbMinorVersion
;
5514 if (!XkbLibraryVersion (&major
, &minor
))
5520 /* Check that the server supports XKB. */
5521 major
= XkbMajorVersion
;
5522 minor
= XkbMinorVersion
;
5523 if (!XkbQueryExtension (dpy
, &op
, &event
, &error
, &major
, &minor
))
5529 /* In this code we check that the keyboard has physical keys with names
5530 that start with BKSP (Backspace) and DELE (Delete), and that they
5531 generate keysym XK_BackSpace and XK_Delete respectively.
5532 This function is used to test if normal-erase-is-backspace should be
5534 An alternative approach would be to just check if XK_BackSpace and
5535 XK_Delete are mapped to any key. But if any of those are mapped to
5536 some non-intuitive key combination (Meta-Shift-Ctrl-whatever) and the
5537 user doesn't know about it, it is better to return false here.
5538 It is more obvious to the user what to do if she/he has two keys
5539 clearly marked with names/symbols and one key does something not
5540 expected (i.e. she/he then tries the other).
5541 The cases where Backspace/Delete is mapped to some other key combination
5542 are rare, and in those cases, normal-erase-is-backspace can be turned on
5546 kb
= XkbGetMap (dpy
, XkbAllMapComponentsMask
, XkbUseCoreKbd
);
5549 int delete_keycode
= 0, backspace_keycode
= 0, i
;
5551 if (XkbGetNames (dpy
, XkbAllNamesMask
, kb
) == Success
)
5553 for (i
= kb
->min_key_code
;
5554 (i
< kb
->max_key_code
5555 && (delete_keycode
== 0 || backspace_keycode
== 0));
5558 /* The XKB symbolic key names can be seen most easily in
5559 the PS file generated by `xkbprint -label name
5561 if (bcmp ("DELE", kb
->names
->keys
[i
].name
, 4) == 0)
5563 else if (bcmp ("BKSP", kb
->names
->keys
[i
].name
, 4) == 0)
5564 backspace_keycode
= i
;
5567 XkbFreeNames (kb
, 0, True
);
5570 XkbFreeClientMap (kb
, 0, True
);
5573 && backspace_keycode
5574 && XKeysymToKeycode (dpy
, XK_Delete
) == delete_keycode
5575 && XKeysymToKeycode (dpy
, XK_BackSpace
) == backspace_keycode
)
5580 #else /* not HAVE_XKBGETKEYBOARD */
5582 #endif /* not HAVE_XKBGETKEYBOARD */
5587 /***********************************************************************
5589 ***********************************************************************/
5591 /* Keep this list in the same order as frame_parms in frame.c.
5592 Use 0 for unsupported frame parameters. */
5594 frame_parm_handler x_frame_parm_handlers
[] =
5598 x_set_background_color
,
5604 x_set_foreground_color
,
5607 x_set_internal_border_width
,
5608 x_set_menu_bar_lines
,
5610 x_explicitly_set_name
,
5611 x_set_scroll_bar_width
,
5614 x_set_vertical_scroll_bars
,
5616 x_set_tool_bar_lines
,
5617 x_set_scroll_bar_foreground
,
5618 x_set_scroll_bar_background
,
5630 /* This is zero if not using X windows. */
5633 /* The section below is built by the lisp expression at the top of the file,
5634 just above where these variables are declared. */
5635 /*&&& init symbols here &&&*/
5636 Qnone
= intern ("none");
5638 Qsuppress_icon
= intern ("suppress-icon");
5639 staticpro (&Qsuppress_icon
);
5640 Qundefined_color
= intern ("undefined-color");
5641 staticpro (&Qundefined_color
);
5642 Qcompound_text
= intern ("compound-text");
5643 staticpro (&Qcompound_text
);
5644 Qcancel_timer
= intern ("cancel-timer");
5645 staticpro (&Qcancel_timer
);
5646 /* This is the end of symbol initialization. */
5648 /* Text property `display' should be nonsticky by default. */
5649 Vtext_property_default_nonsticky
5650 = Fcons (Fcons (Qdisplay
, Qt
), Vtext_property_default_nonsticky
);
5653 Fput (Qundefined_color
, Qerror_conditions
,
5654 Fcons (Qundefined_color
, Fcons (Qerror
, Qnil
)));
5655 Fput (Qundefined_color
, Qerror_message
,
5656 build_string ("Undefined color"));
5658 DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape
,
5659 doc
: /* The shape of the pointer when over text.
5660 Changing the value does not affect existing frames
5661 unless you set the mouse color. */);
5662 Vx_pointer_shape
= Qnil
;
5664 #if 0 /* This doesn't really do anything. */
5665 DEFVAR_LISP ("x-nontext-pointer-shape", &Vx_nontext_pointer_shape
,
5666 doc
: /* The shape of the pointer when not over text.
5667 This variable takes effect when you create a new frame
5668 or when you set the mouse color. */);
5670 Vx_nontext_pointer_shape
= Qnil
;
5672 DEFVAR_LISP ("x-hourglass-pointer-shape", &Vx_hourglass_pointer_shape
,
5673 doc
: /* The shape of the pointer when Emacs is busy.
5674 This variable takes effect when you create a new frame
5675 or when you set the mouse color. */);
5676 Vx_hourglass_pointer_shape
= Qnil
;
5678 DEFVAR_BOOL ("display-hourglass", &display_hourglass_p
,
5679 doc
: /* Non-zero means Emacs displays an hourglass pointer on window systems. */);
5680 display_hourglass_p
= 1;
5682 DEFVAR_LISP ("hourglass-delay", &Vhourglass_delay
,
5683 doc
: /* *Seconds to wait before displaying an hourglass pointer.
5684 Value must be an integer or float. */);
5685 Vhourglass_delay
= make_number (DEFAULT_HOURGLASS_DELAY
);
5687 #if 0 /* This doesn't really do anything. */
5688 DEFVAR_LISP ("x-mode-pointer-shape", &Vx_mode_pointer_shape
,
5689 doc
: /* The shape of the pointer when over the mode line.
5690 This variable takes effect when you create a new frame
5691 or when you set the mouse color. */);
5693 Vx_mode_pointer_shape
= Qnil
;
5695 DEFVAR_LISP ("x-sensitive-text-pointer-shape",
5696 &Vx_sensitive_text_pointer_shape
,
5697 doc
: /* The shape of the pointer when over mouse-sensitive text.
5698 This variable takes effect when you create a new frame
5699 or when you set the mouse color. */);
5700 Vx_sensitive_text_pointer_shape
= Qnil
;
5702 DEFVAR_LISP ("x-window-horizontal-drag-cursor",
5703 &Vx_window_horizontal_drag_shape
,
5704 doc
: /* Pointer shape to use for indicating a window can be dragged horizontally.
5705 This variable takes effect when you create a new frame
5706 or when you set the mouse color. */);
5707 Vx_window_horizontal_drag_shape
= Qnil
;
5709 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel
,
5710 doc
: /* A string indicating the foreground color of the cursor box. */);
5711 Vx_cursor_fore_pixel
= Qnil
;
5713 DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size
,
5714 doc
: /* Maximum size for tooltips. Value is a pair (COLUMNS . ROWS).
5715 Text larger than this is clipped. */);
5716 Vx_max_tooltip_size
= Fcons (make_number (80), make_number (40));
5718 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager
,
5719 doc
: /* Non-nil if no X window manager is in use.
5720 Emacs doesn't try to figure this out; this is always nil
5721 unless you set it to something else. */);
5722 /* We don't have any way to find this out, so set it to nil
5723 and maybe the user would like to set it to t. */
5724 Vx_no_window_manager
= Qnil
;
5726 DEFVAR_LISP ("x-pixel-size-width-font-regexp",
5727 &Vx_pixel_size_width_font_regexp
,
5728 doc
: /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'.
5730 Since Emacs gets width of a font matching with this regexp from
5731 PIXEL_SIZE field of the name, font finding mechanism gets faster for
5732 such a font. This is especially effective for such large fonts as
5733 Chinese, Japanese, and Korean. */);
5734 Vx_pixel_size_width_font_regexp
= Qnil
;
5736 /* This is not ifdef:ed, so other builds than GTK can customize it. */
5737 DEFVAR_BOOL ("x-use-old-gtk-file-dialog", &x_use_old_gtk_file_dialog
,
5738 doc
: /* *Non-nil means prompt with the old GTK file selection dialog.
5739 If nil or if the file selection dialog is not available, the new GTK file
5740 chooser is used instead. To turn off all file dialogs set the
5741 variable `use-file-dialog'. */);
5742 x_use_old_gtk_file_dialog
= 0;
5744 #ifdef USE_X_TOOLKIT
5745 Fprovide (intern ("x-toolkit"), Qnil
);
5747 Fprovide (intern ("motif"), Qnil
);
5749 DEFVAR_LISP ("motif-version-string", &Vmotif_version_string
,
5750 doc
: /* Version info for LessTif/Motif. */);
5751 Vmotif_version_string
= build_string (XmVERSION_STRING
);
5752 #endif /* USE_MOTIF */
5753 #endif /* USE_X_TOOLKIT */
5756 /* Provide x-toolkit also for GTK. Internally GTK does not use Xt so it
5757 is not an X toolkit in that sense (USE_X_TOOLKIT is not defined).
5758 But for a user it is a toolkit for X, and indeed, configure
5759 accepts --with-x-toolkit=gtk. */
5760 Fprovide (intern ("x-toolkit"), Qnil
);
5761 Fprovide (intern ("gtk"), Qnil
);
5763 DEFVAR_LISP ("gtk-version-string", &Vgtk_version_string
,
5764 doc
: /* Version info for GTK+. */);
5766 char gtk_version
[40];
5767 g_snprintf (gtk_version
, sizeof (gtk_version
), "%u.%u.%u",
5768 GTK_MAJOR_VERSION
, GTK_MINOR_VERSION
, GTK_MICRO_VERSION
);
5769 Vgtk_version_string
= build_string (gtk_version
);
5771 #endif /* USE_GTK */
5773 /* X window properties. */
5774 defsubr (&Sx_change_window_property
);
5775 defsubr (&Sx_delete_window_property
);
5776 defsubr (&Sx_window_property
);
5778 defsubr (&Sxw_display_color_p
);
5779 defsubr (&Sx_display_grayscale_p
);
5780 defsubr (&Sxw_color_defined_p
);
5781 defsubr (&Sxw_color_values
);
5782 defsubr (&Sx_server_max_request_size
);
5783 defsubr (&Sx_server_vendor
);
5784 defsubr (&Sx_server_version
);
5785 defsubr (&Sx_display_pixel_width
);
5786 defsubr (&Sx_display_pixel_height
);
5787 defsubr (&Sx_display_mm_width
);
5788 defsubr (&Sx_display_mm_height
);
5789 defsubr (&Sx_display_screens
);
5790 defsubr (&Sx_display_planes
);
5791 defsubr (&Sx_display_color_cells
);
5792 defsubr (&Sx_display_visual_class
);
5793 defsubr (&Sx_display_backing_store
);
5794 defsubr (&Sx_display_save_under
);
5795 defsubr (&Sx_create_frame
);
5796 defsubr (&Sx_open_connection
);
5797 defsubr (&Sx_close_connection
);
5798 defsubr (&Sx_display_list
);
5799 defsubr (&Sx_synchronize
);
5800 defsubr (&Sx_focus_frame
);
5801 defsubr (&Sx_backspace_delete_keys_p
);
5803 /* Setting callback functions for fontset handler. */
5804 get_font_info_func
= x_get_font_info
;
5806 #if 0 /* This function pointer doesn't seem to be used anywhere.
5807 And the pointer assigned has the wrong type, anyway. */
5808 list_fonts_func
= x_list_fonts
;
5811 load_font_func
= x_load_font
;
5812 find_ccl_program_func
= x_find_ccl_program
;
5813 query_font_func
= x_query_font
;
5814 set_frame_fontset_func
= x_set_font
;
5815 check_window_system_func
= check_x
;
5817 hourglass_atimer
= NULL
;
5818 hourglass_shown_p
= 0;
5820 defsubr (&Sx_show_tip
);
5821 defsubr (&Sx_hide_tip
);
5823 staticpro (&tip_timer
);
5825 staticpro (&tip_frame
);
5827 last_show_tip_args
= Qnil
;
5828 staticpro (&last_show_tip_args
);
5830 #if defined (USE_MOTIF) || defined (USE_GTK)
5831 defsubr (&Sx_file_dialog
);
5835 #endif /* HAVE_X_WINDOWS */
5837 /* arch-tag: 55040d02-5485-4d58-8b22-95a7a05f3288
5838 (do not change this comment) */