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, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
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"
44 #include "character.h"
49 #include "termhooks.h"
57 #include <sys/types.h>
60 #if 1 /* Used to be #ifdef EMACS_BITMAP_FILES, but this should always work. */
61 #include "bitmaps/gray.xbm"
63 #include <X11/bitmaps/gray>
71 #include <X11/Shell.h>
75 #include <X11/Xaw3d/Paned.h>
76 #include <X11/Xaw3d/Label.h>
77 #else /* !HAVE_XAW3D */
78 #include <X11/Xaw/Paned.h>
79 #include <X11/Xaw/Label.h>
80 #endif /* HAVE_XAW3D */
81 #endif /* USE_MOTIF */
84 #undef USG /* ####KLUDGE for Solaris 2.2 and up */
93 #include "../lwlib/lwlib.h"
97 #include <Xm/DialogS.h>
98 #include <Xm/FileSB.h>
101 #if !defined(NO_EDITRES)
103 extern void _XEditResCheckMessages ();
104 #endif /* not defined NO_EDITRES */
106 /* Unique id counter for widgets created by the Lucid Widget Library. */
108 extern LWLIB_ID widget_id_tick
;
111 /* This is part of a kludge--see lwlib/xlwmenu.c. */
112 extern XFontStruct
*xlwmenu_default_font
;
115 extern void free_frame_menubar ();
116 extern double atof ();
120 /* LessTif/Motif version info. */
122 static Lisp_Object Vmotif_version_string
;
124 #endif /* USE_MOTIF */
126 #endif /* USE_X_TOOLKIT */
130 /* GTK+ version info */
132 static Lisp_Object Vgtk_version_string
;
136 #define MAXREQUEST(dpy) (XMaxRequestSize (dpy))
138 /* The gray bitmap `bitmaps/gray'. This is done because xterm.c uses
139 it, and including `bitmaps/gray' more than once is a problem when
140 config.h defines `static' as an empty replacement string. */
142 int gray_bitmap_width
= gray_width
;
143 int gray_bitmap_height
= gray_height
;
144 char *gray_bitmap_bits
= gray_bits
;
146 /* Non-zero means prompt with the old GTK file selection dialog. */
148 int x_gtk_use_old_file_dialog
;
150 /* If non-zero, by default show hidden files in the GTK file chooser. */
152 int x_gtk_show_hidden_files
;
154 /* If non-zero, don't show additional help text in the GTK file chooser. */
156 int x_gtk_file_dialog_help_text
;
158 /* If non-zero, don't collapse to tool bar when it is detached. */
160 int x_gtk_whole_detached_tool_bar
;
162 /* The background and shape of the mouse pointer, and shape when not
163 over text or in the modeline. */
165 Lisp_Object Vx_pointer_shape
, Vx_nontext_pointer_shape
, Vx_mode_pointer_shape
;
166 Lisp_Object Vx_hourglass_pointer_shape
;
168 /* The shape when over mouse-sensitive text. */
170 Lisp_Object Vx_sensitive_text_pointer_shape
;
172 /* If non-nil, the pointer shape to indicate that windows can be
173 dragged horizontally. */
175 Lisp_Object Vx_window_horizontal_drag_shape
;
177 /* Color of chars displayed in cursor box. */
179 Lisp_Object Vx_cursor_fore_pixel
;
181 /* Nonzero if using X. */
185 /* Non nil if no window manager is in use. */
187 Lisp_Object Vx_no_window_manager
;
189 /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'. */
191 Lisp_Object Vx_pixel_size_width_font_regexp
;
194 Lisp_Object Qsuppress_icon
;
195 Lisp_Object Qundefined_color
;
196 Lisp_Object Qcompound_text
, Qcancel_timer
;
197 static Lisp_Object Qfont_param
;
201 extern Lisp_Object Vwindow_system_version
;
203 /* The below are defined in frame.c. */
206 int image_cache_refcount
, dpyinfo_refcount
;
209 #if defined (USE_GTK) && defined (HAVE_FREETYPE)
210 char *x_last_font_name
;
214 /* Error if we are not connected to X. */
220 error ("X windows are not in use or not initialized");
223 /* Nonzero if we can use mouse menus.
224 You should not call this unless HAVE_MENUS is defined. */
232 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame
233 and checking validity for X. */
236 check_x_frame (frame
)
242 frame
= selected_frame
;
243 CHECK_LIVE_FRAME (frame
);
246 error ("Non-X frame used");
250 /* Let the user specify an X display with a Lisp object.
251 OBJECT may be nil, a frame or a terminal object.
252 nil stands for the selected frame--or, if that is not an X frame,
253 the first X display on the list. */
255 struct x_display_info
*
256 check_x_display_info (object
)
259 struct x_display_info
*dpyinfo
= NULL
;
263 struct frame
*sf
= XFRAME (selected_frame
);
265 if (FRAME_X_P (sf
) && FRAME_LIVE_P (sf
))
266 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
267 else if (x_display_list
!= 0)
268 dpyinfo
= x_display_list
;
270 error ("X windows are not in use or not initialized");
272 else if (TERMINALP (object
))
274 struct terminal
*t
= get_terminal (object
, 1);
276 if (t
->type
!= output_x_window
)
277 error ("Terminal %d is not an X display", XINT (object
));
279 dpyinfo
= t
->display_info
.x
;
281 else if (STRINGP (object
))
282 dpyinfo
= x_display_info_for_name (object
);
285 FRAME_PTR f
= check_x_frame (object
);
286 dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
293 /* Return the Emacs frame-object corresponding to an X window.
294 It could be the frame's main window or an icon window. */
296 /* This function can be called during GC, so use GC_xxx type test macros. */
299 x_window_to_frame (dpyinfo
, wdesc
)
300 struct x_display_info
*dpyinfo
;
303 Lisp_Object tail
, frame
;
306 if (wdesc
== None
) return 0;
308 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
314 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
316 if (f
->output_data
.x
->hourglass_window
== wdesc
)
319 if ((f
->output_data
.x
->edit_widget
320 && XtWindow (f
->output_data
.x
->edit_widget
) == wdesc
)
321 /* A tooltip frame? */
322 || (!f
->output_data
.x
->edit_widget
323 && FRAME_X_WINDOW (f
) == wdesc
)
324 || f
->output_data
.x
->icon_desc
== wdesc
)
326 #else /* not USE_X_TOOLKIT */
328 if (f
->output_data
.x
->edit_widget
)
330 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
331 struct x_output
*x
= f
->output_data
.x
;
332 if (gwdesc
!= 0 && gwdesc
== x
->edit_widget
)
336 if (FRAME_X_WINDOW (f
) == wdesc
337 || f
->output_data
.x
->icon_desc
== wdesc
)
339 #endif /* not USE_X_TOOLKIT */
344 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
345 /* Like x_window_to_frame but also compares the window with the widget's
349 x_any_window_to_frame (dpyinfo
, wdesc
)
350 struct x_display_info
*dpyinfo
;
353 Lisp_Object tail
, frame
;
354 struct frame
*f
, *found
;
357 if (wdesc
== None
) return NULL
;
360 for (tail
= Vframe_list
; CONSP (tail
) && !found
; tail
= XCDR (tail
))
367 if (FRAME_X_P (f
) && FRAME_X_DISPLAY_INFO (f
) == dpyinfo
)
369 /* This frame matches if the window is any of its widgets. */
370 x
= f
->output_data
.x
;
371 if (x
->hourglass_window
== wdesc
)
376 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
378 && gtk_widget_get_toplevel (gwdesc
) == x
->widget
)
381 if (wdesc
== XtWindow (x
->widget
)
382 || wdesc
== XtWindow (x
->column_widget
)
383 || wdesc
== XtWindow (x
->edit_widget
))
385 /* Match if the window is this frame's menubar. */
386 else if (lw_window_is_in_menubar (wdesc
, x
->menubar_widget
))
390 else if (FRAME_X_WINDOW (f
) == wdesc
)
391 /* A tooltip frame. */
399 /* Likewise, but consider only the menu bar widget. */
402 x_menubar_window_to_frame (dpyinfo
, wdesc
)
403 struct x_display_info
*dpyinfo
;
406 Lisp_Object tail
, frame
;
410 if (wdesc
== None
) return 0;
412 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
418 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
420 x
= f
->output_data
.x
;
421 /* Match if the window is this frame's menubar. */
423 if (x
->menubar_widget
)
425 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
427 /* This gives false positives, but the rectangle check in xterm.c
428 where this is called takes care of that. */
430 && (gwdesc
== x
->menubar_widget
431 || gtk_widget_is_ancestor (x
->menubar_widget
, gwdesc
)
432 || gtk_widget_is_ancestor (gwdesc
, x
->menubar_widget
)))
436 if (x
->menubar_widget
437 && lw_window_is_in_menubar (wdesc
, x
->menubar_widget
))
444 /* Return the frame whose principal (outermost) window is WDESC.
445 If WDESC is some other (smaller) window, we return 0. */
448 x_top_window_to_frame (dpyinfo
, wdesc
)
449 struct x_display_info
*dpyinfo
;
452 Lisp_Object tail
, frame
;
456 if (wdesc
== None
) return 0;
458 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
464 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
466 x
= f
->output_data
.x
;
470 /* This frame matches if the window is its topmost widget. */
472 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
473 if (gwdesc
== x
->widget
)
476 if (wdesc
== XtWindow (x
->widget
))
478 #if 0 /* I don't know why it did this,
479 but it seems logically wrong,
480 and it causes trouble for MapNotify events. */
481 /* Match if the window is this frame's menubar. */
482 if (x
->menubar_widget
483 && wdesc
== XtWindow (x
->menubar_widget
))
488 else if (FRAME_X_WINDOW (f
) == wdesc
)
494 #endif /* USE_X_TOOLKIT || USE_GTK */
498 static void x_default_font_parameter
P_ ((struct frame
*, Lisp_Object
));
500 static Lisp_Object unwind_create_frame
P_ ((Lisp_Object
));
501 static Lisp_Object unwind_create_tip_frame
P_ ((Lisp_Object
));
503 void x_set_foreground_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
504 static void x_set_wait_for_wm
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
505 void x_set_background_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
506 void x_set_mouse_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
507 void x_set_cursor_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
508 void x_set_border_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
509 void x_set_cursor_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
510 void x_set_icon_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
511 void x_set_icon_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
512 void x_explicitly_set_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
513 void x_set_menu_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
514 void x_set_title
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
515 void x_set_tool_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
516 void x_set_scroll_bar_foreground
P_ ((struct frame
*, Lisp_Object
,
518 void x_set_scroll_bar_background
P_ ((struct frame
*, Lisp_Object
,
520 static Lisp_Object x_default_scroll_bar_color_parameter
P_ ((struct frame
*,
527 /* Store the screen positions of frame F into XPTR and YPTR.
528 These are the positions of the containing window manager window,
529 not Emacs's own window. */
532 x_real_positions (f
, xptr
, yptr
)
536 int win_x
, win_y
, outer_x
, outer_y
;
537 int real_x
= 0, real_y
= 0;
539 Window win
= f
->output_data
.x
->parent_desc
;
543 x_catch_errors (FRAME_X_DISPLAY (f
));
545 if (win
== FRAME_X_DISPLAY_INFO (f
)->root_window
)
546 win
= FRAME_OUTER_WINDOW (f
);
548 /* This loop traverses up the containment tree until we hit the root
549 window. Window managers may intersect many windows between our window
550 and the root window. The window we find just before the root window
551 should be the outer WM window. */
554 Window wm_window
, rootw
;
555 Window
*tmp_children
;
556 unsigned int tmp_nchildren
;
559 success
= XQueryTree (FRAME_X_DISPLAY (f
), win
, &rootw
,
560 &wm_window
, &tmp_children
, &tmp_nchildren
);
562 had_errors
= x_had_errors_p (FRAME_X_DISPLAY (f
));
564 /* Don't free tmp_children if XQueryTree failed. */
568 XFree ((char *) tmp_children
);
570 if (wm_window
== rootw
|| had_errors
)
581 /* Get the real coordinates for the WM window upper left corner */
582 XGetGeometry (FRAME_X_DISPLAY (f
), win
,
583 &rootw
, &real_x
, &real_y
, &ign
, &ign
, &ign
, &ign
);
585 /* Translate real coordinates to coordinates relative to our
586 window. For our window, the upper left corner is 0, 0.
587 Since the upper left corner of the WM window is outside
588 our window, win_x and win_y will be negative:
590 ------------------ ---> x
592 | ----------------- v y
595 XTranslateCoordinates (FRAME_X_DISPLAY (f
),
597 /* From-window, to-window. */
598 FRAME_X_DISPLAY_INFO (f
)->root_window
,
601 /* From-position, to-position. */
602 real_x
, real_y
, &win_x
, &win_y
,
607 if (FRAME_X_WINDOW (f
) == FRAME_OUTER_WINDOW (f
))
614 XTranslateCoordinates (FRAME_X_DISPLAY (f
),
616 /* From-window, to-window. */
617 FRAME_X_DISPLAY_INFO (f
)->root_window
,
618 FRAME_OUTER_WINDOW (f
),
620 /* From-position, to-position. */
621 real_x
, real_y
, &outer_x
, &outer_y
,
627 had_errors
= x_had_errors_p (FRAME_X_DISPLAY (f
));
634 if (had_errors
) return;
636 f
->x_pixels_diff
= -win_x
;
637 f
->y_pixels_diff
= -win_y
;
639 FRAME_X_OUTPUT (f
)->x_pixels_outer_diff
= -outer_x
;
640 FRAME_X_OUTPUT (f
)->y_pixels_outer_diff
= -outer_y
;
649 /* Gamma-correct COLOR on frame F. */
652 gamma_correct (f
, color
)
658 color
->red
= pow (color
->red
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
659 color
->green
= pow (color
->green
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
660 color
->blue
= pow (color
->blue
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
665 /* Decide if color named COLOR_NAME is valid for use on frame F. If
666 so, return the RGB values in COLOR. If ALLOC_P is non-zero,
667 allocate the color. Value is zero if COLOR_NAME is invalid, or
668 no color could be allocated. */
671 x_defined_color (f
, color_name
, color
, alloc_p
)
678 Display
*dpy
= FRAME_X_DISPLAY (f
);
679 Colormap cmap
= FRAME_X_COLORMAP (f
);
682 success_p
= XParseColor (dpy
, cmap
, color_name
, color
);
683 if (success_p
&& alloc_p
)
684 success_p
= x_alloc_nearest_color (f
, cmap
, color
);
691 /* Return the pixel color value for color COLOR_NAME on frame F. If F
692 is a monochrome frame, return MONO_COLOR regardless of what ARG says.
693 Signal an error if color can't be allocated. */
696 x_decode_color (f
, color_name
, mono_color
)
698 Lisp_Object color_name
;
703 CHECK_STRING (color_name
);
705 #if 0 /* Don't do this. It's wrong when we're not using the default
706 colormap, it makes freeing difficult, and it's probably not
707 an important optimization. */
708 if (strcmp (SDATA (color_name
), "black") == 0)
709 return BLACK_PIX_DEFAULT (f
);
710 else if (strcmp (SDATA (color_name
), "white") == 0)
711 return WHITE_PIX_DEFAULT (f
);
714 /* Return MONO_COLOR for monochrome frames. */
715 if (FRAME_X_DISPLAY_INFO (f
)->n_planes
== 1)
718 /* x_defined_color is responsible for coping with failures
719 by looking for a near-miss. */
720 if (x_defined_color (f
, SDATA (color_name
), &cdef
, 1))
723 signal_error ("Undefined color", color_name
);
728 /* Change the `wait-for-wm' frame parameter of frame F. OLD_VALUE is
729 the previous value of that parameter, NEW_VALUE is the new value.
730 See also the comment of wait_for_wm in struct x_output. */
733 x_set_wait_for_wm (f
, new_value
, old_value
)
735 Lisp_Object new_value
, old_value
;
737 f
->output_data
.x
->wait_for_wm
= !NILP (new_value
);
742 /* Set icon from FILE for frame F. By using GTK functions the icon
743 may be any format that GdkPixbuf knows about, i.e. not just bitmaps. */
746 xg_set_icon (f
, file
)
753 found
= x_find_image_file (file
);
759 char *filename
= (char *) SDATA (found
);
762 pixbuf
= gdk_pixbuf_new_from_file (filename
, &err
);
766 gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)),
768 g_object_unref (pixbuf
);
782 xg_set_icon_from_xpm_data (f
, data
)
787 GdkPixbuf
*pixbuf
= gdk_pixbuf_new_from_xpm_data ((const char **) data
);
792 gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)), pixbuf
);
793 g_object_unref (pixbuf
);
799 /* Functions called only from `x_set_frame_param'
800 to set individual parameters.
802 If FRAME_X_WINDOW (f) is 0,
803 the frame is being created and its X-window does not exist yet.
804 In that case, just record the parameter's new value
805 in the standard place; do not attempt to change the window. */
808 x_set_foreground_color (f
, arg
, oldval
)
810 Lisp_Object arg
, oldval
;
812 struct x_output
*x
= f
->output_data
.x
;
813 unsigned long fg
, old_fg
;
815 fg
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
816 old_fg
= FRAME_FOREGROUND_PIXEL (f
);
817 FRAME_FOREGROUND_PIXEL (f
) = fg
;
819 if (FRAME_X_WINDOW (f
) != 0)
821 Display
*dpy
= FRAME_X_DISPLAY (f
);
824 XSetForeground (dpy
, x
->normal_gc
, fg
);
825 XSetBackground (dpy
, x
->reverse_gc
, fg
);
827 if (x
->cursor_pixel
== old_fg
)
829 unload_color (f
, x
->cursor_pixel
);
830 x
->cursor_pixel
= x_copy_color (f
, fg
);
831 XSetBackground (dpy
, x
->cursor_gc
, x
->cursor_pixel
);
836 update_face_from_frame_parameter (f
, Qforeground_color
, arg
);
838 if (FRAME_VISIBLE_P (f
))
842 unload_color (f
, old_fg
);
846 x_set_background_color (f
, arg
, oldval
)
848 Lisp_Object arg
, oldval
;
850 struct x_output
*x
= f
->output_data
.x
;
853 bg
= x_decode_color (f
, arg
, WHITE_PIX_DEFAULT (f
));
854 unload_color (f
, FRAME_BACKGROUND_PIXEL (f
));
855 FRAME_BACKGROUND_PIXEL (f
) = bg
;
857 if (FRAME_X_WINDOW (f
) != 0)
859 Display
*dpy
= FRAME_X_DISPLAY (f
);
862 XSetBackground (dpy
, x
->normal_gc
, bg
);
863 XSetForeground (dpy
, x
->reverse_gc
, bg
);
864 XSetWindowBackground (dpy
, FRAME_X_WINDOW (f
), bg
);
865 XSetForeground (dpy
, x
->cursor_gc
, bg
);
868 xg_set_background_color (f
, bg
);
871 #ifndef USE_TOOLKIT_SCROLL_BARS /* Turns out to be annoying with
872 toolkit scroll bars. */
875 for (bar
= FRAME_SCROLL_BARS (f
);
877 bar
= XSCROLL_BAR (bar
)->next
)
879 Window window
= XSCROLL_BAR (bar
)->x_window
;
880 XSetWindowBackground (dpy
, window
, bg
);
883 #endif /* USE_TOOLKIT_SCROLL_BARS */
886 update_face_from_frame_parameter (f
, Qbackground_color
, arg
);
888 if (FRAME_VISIBLE_P (f
))
894 make_invisible_cursor (f
)
897 Display
*dpy
= FRAME_X_DISPLAY (f
);
898 static char const no_data
[] = { 0 };
903 x_catch_errors (dpy
);
904 pix
= XCreateBitmapFromData (dpy
, FRAME_X_DISPLAY_INFO (f
)->root_window
,
906 if (! x_had_errors_p (dpy
) && pix
!= None
)
909 col
.red
= col
.green
= col
.blue
= 0;
910 col
.flags
= DoRed
| DoGreen
| DoBlue
;
911 c
= XCreatePixmapCursor (dpy
, pix
, pix
, &col
, &col
, 0, 0);
912 if (x_had_errors_p (dpy
) || c
== None
)
914 XFreePixmap (dpy
, pix
);
923 x_set_mouse_color (f
, arg
, oldval
)
925 Lisp_Object arg
, oldval
;
927 struct x_output
*x
= f
->output_data
.x
;
928 Display
*dpy
= FRAME_X_DISPLAY (f
);
929 Cursor cursor
, nontext_cursor
, mode_cursor
, hand_cursor
;
930 Cursor hourglass_cursor
, horizontal_drag_cursor
;
931 unsigned long pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
932 unsigned long mask_color
= FRAME_BACKGROUND_PIXEL (f
);
934 /* Don't let pointers be invisible. */
935 if (mask_color
== pixel
)
937 x_free_colors (f
, &pixel
, 1);
938 pixel
= x_copy_color (f
, FRAME_FOREGROUND_PIXEL (f
));
941 unload_color (f
, x
->mouse_pixel
);
942 x
->mouse_pixel
= pixel
;
946 /* It's not okay to crash if the user selects a screwy cursor. */
947 x_catch_errors (dpy
);
949 if (!NILP (Vx_pointer_shape
))
951 CHECK_NUMBER (Vx_pointer_shape
);
952 cursor
= XCreateFontCursor (dpy
, XINT (Vx_pointer_shape
));
955 cursor
= XCreateFontCursor (dpy
, XC_xterm
);
956 x_check_errors (dpy
, "bad text pointer cursor: %s");
958 if (!NILP (Vx_nontext_pointer_shape
))
960 CHECK_NUMBER (Vx_nontext_pointer_shape
);
962 = XCreateFontCursor (dpy
, XINT (Vx_nontext_pointer_shape
));
965 nontext_cursor
= XCreateFontCursor (dpy
, XC_left_ptr
);
966 x_check_errors (dpy
, "bad nontext pointer cursor: %s");
968 if (!NILP (Vx_hourglass_pointer_shape
))
970 CHECK_NUMBER (Vx_hourglass_pointer_shape
);
972 = XCreateFontCursor (dpy
, XINT (Vx_hourglass_pointer_shape
));
975 hourglass_cursor
= XCreateFontCursor (dpy
, XC_watch
);
976 x_check_errors (dpy
, "bad hourglass pointer cursor: %s");
978 if (!NILP (Vx_mode_pointer_shape
))
980 CHECK_NUMBER (Vx_mode_pointer_shape
);
981 mode_cursor
= XCreateFontCursor (dpy
, XINT (Vx_mode_pointer_shape
));
984 mode_cursor
= XCreateFontCursor (dpy
, XC_xterm
);
985 x_check_errors (dpy
, "bad modeline pointer cursor: %s");
987 if (!NILP (Vx_sensitive_text_pointer_shape
))
989 CHECK_NUMBER (Vx_sensitive_text_pointer_shape
);
991 = XCreateFontCursor (dpy
, XINT (Vx_sensitive_text_pointer_shape
));
994 hand_cursor
= XCreateFontCursor (dpy
, XC_hand2
);
996 if (!NILP (Vx_window_horizontal_drag_shape
))
998 CHECK_NUMBER (Vx_window_horizontal_drag_shape
);
999 horizontal_drag_cursor
1000 = XCreateFontCursor (dpy
, XINT (Vx_window_horizontal_drag_shape
));
1003 horizontal_drag_cursor
1004 = XCreateFontCursor (dpy
, XC_sb_h_double_arrow
);
1006 /* Check and report errors with the above calls. */
1007 x_check_errors (dpy
, "can't set cursor shape: %s");
1008 x_uncatch_errors ();
1011 XColor fore_color
, back_color
;
1013 fore_color
.pixel
= x
->mouse_pixel
;
1014 x_query_color (f
, &fore_color
);
1015 back_color
.pixel
= mask_color
;
1016 x_query_color (f
, &back_color
);
1018 XRecolorCursor (dpy
, cursor
, &fore_color
, &back_color
);
1019 XRecolorCursor (dpy
, nontext_cursor
, &fore_color
, &back_color
);
1020 XRecolorCursor (dpy
, mode_cursor
, &fore_color
, &back_color
);
1021 XRecolorCursor (dpy
, hand_cursor
, &fore_color
, &back_color
);
1022 XRecolorCursor (dpy
, hourglass_cursor
, &fore_color
, &back_color
);
1023 XRecolorCursor (dpy
, horizontal_drag_cursor
, &fore_color
, &back_color
);
1026 if (FRAME_X_WINDOW (f
) != 0)
1027 XDefineCursor (dpy
, FRAME_X_WINDOW (f
),
1028 f
->output_data
.x
->current_cursor
= cursor
);
1030 if (FRAME_X_DISPLAY_INFO (f
)->invisible_cursor
== 0)
1031 FRAME_X_DISPLAY_INFO (f
)->invisible_cursor
= make_invisible_cursor (f
);
1033 if (cursor
!= x
->text_cursor
1034 && x
->text_cursor
!= 0)
1035 XFreeCursor (dpy
, x
->text_cursor
);
1036 x
->text_cursor
= cursor
;
1038 if (nontext_cursor
!= x
->nontext_cursor
1039 && x
->nontext_cursor
!= 0)
1040 XFreeCursor (dpy
, x
->nontext_cursor
);
1041 x
->nontext_cursor
= nontext_cursor
;
1043 if (hourglass_cursor
!= x
->hourglass_cursor
1044 && x
->hourglass_cursor
!= 0)
1045 XFreeCursor (dpy
, x
->hourglass_cursor
);
1046 x
->hourglass_cursor
= hourglass_cursor
;
1048 if (mode_cursor
!= x
->modeline_cursor
1049 && x
->modeline_cursor
!= 0)
1050 XFreeCursor (dpy
, f
->output_data
.x
->modeline_cursor
);
1051 x
->modeline_cursor
= mode_cursor
;
1053 if (hand_cursor
!= x
->hand_cursor
1054 && x
->hand_cursor
!= 0)
1055 XFreeCursor (dpy
, x
->hand_cursor
);
1056 x
->hand_cursor
= hand_cursor
;
1058 if (horizontal_drag_cursor
!= x
->horizontal_drag_cursor
1059 && x
->horizontal_drag_cursor
!= 0)
1060 XFreeCursor (dpy
, x
->horizontal_drag_cursor
);
1061 x
->horizontal_drag_cursor
= horizontal_drag_cursor
;
1066 update_face_from_frame_parameter (f
, Qmouse_color
, arg
);
1070 x_set_cursor_color (f
, arg
, oldval
)
1072 Lisp_Object arg
, oldval
;
1074 unsigned long fore_pixel
, pixel
;
1075 int fore_pixel_allocated_p
= 0, pixel_allocated_p
= 0;
1076 struct x_output
*x
= f
->output_data
.x
;
1078 if (!NILP (Vx_cursor_fore_pixel
))
1080 fore_pixel
= x_decode_color (f
, Vx_cursor_fore_pixel
,
1081 WHITE_PIX_DEFAULT (f
));
1082 fore_pixel_allocated_p
= 1;
1085 fore_pixel
= FRAME_BACKGROUND_PIXEL (f
);
1087 pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1088 pixel_allocated_p
= 1;
1090 /* Make sure that the cursor color differs from the background color. */
1091 if (pixel
== FRAME_BACKGROUND_PIXEL (f
))
1093 if (pixel_allocated_p
)
1095 x_free_colors (f
, &pixel
, 1);
1096 pixel_allocated_p
= 0;
1099 pixel
= x
->mouse_pixel
;
1100 if (pixel
== fore_pixel
)
1102 if (fore_pixel_allocated_p
)
1104 x_free_colors (f
, &fore_pixel
, 1);
1105 fore_pixel_allocated_p
= 0;
1107 fore_pixel
= FRAME_BACKGROUND_PIXEL (f
);
1111 unload_color (f
, x
->cursor_foreground_pixel
);
1112 if (!fore_pixel_allocated_p
)
1113 fore_pixel
= x_copy_color (f
, fore_pixel
);
1114 x
->cursor_foreground_pixel
= fore_pixel
;
1116 unload_color (f
, x
->cursor_pixel
);
1117 if (!pixel_allocated_p
)
1118 pixel
= x_copy_color (f
, pixel
);
1119 x
->cursor_pixel
= pixel
;
1121 if (FRAME_X_WINDOW (f
) != 0)
1124 XSetBackground (FRAME_X_DISPLAY (f
), x
->cursor_gc
, x
->cursor_pixel
);
1125 XSetForeground (FRAME_X_DISPLAY (f
), x
->cursor_gc
, fore_pixel
);
1128 if (FRAME_VISIBLE_P (f
))
1130 x_update_cursor (f
, 0);
1131 x_update_cursor (f
, 1);
1135 update_face_from_frame_parameter (f
, Qcursor_color
, arg
);
1138 /* Set the border-color of frame F to pixel value PIX.
1139 Note that this does not fully take effect if done before
1140 F has an x-window. */
1143 x_set_border_pixel (f
, pix
)
1147 unload_color (f
, f
->output_data
.x
->border_pixel
);
1148 f
->output_data
.x
->border_pixel
= pix
;
1150 if (FRAME_X_WINDOW (f
) != 0 && f
->border_width
> 0)
1153 XSetWindowBorder (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1154 (unsigned long)pix
);
1157 if (FRAME_VISIBLE_P (f
))
1162 /* Set the border-color of frame F to value described by ARG.
1163 ARG can be a string naming a color.
1164 The border-color is used for the border that is drawn by the X server.
1165 Note that this does not fully take effect if done before
1166 F has an x-window; it must be redone when the window is created.
1168 Note: this is done in two routines because of the way X10 works.
1170 Note: under X11, this is normally the province of the window manager,
1171 and so emacs' border colors may be overridden. */
1174 x_set_border_color (f
, arg
, oldval
)
1176 Lisp_Object arg
, oldval
;
1181 pix
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1182 x_set_border_pixel (f
, pix
);
1183 update_face_from_frame_parameter (f
, Qborder_color
, arg
);
1188 x_set_cursor_type (f
, arg
, oldval
)
1190 Lisp_Object arg
, oldval
;
1192 set_frame_cursor_types (f
, arg
);
1194 /* Make sure the cursor gets redrawn. */
1195 cursor_type_changed
= 1;
1199 x_set_icon_type (f
, arg
, oldval
)
1201 Lisp_Object arg
, oldval
;
1207 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1210 else if (!STRINGP (oldval
) && EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
1215 result
= x_text_icon (f
,
1216 (char *) SDATA ((!NILP (f
->icon_name
)
1220 result
= x_bitmap_icon (f
, arg
);
1225 error ("No icon window available");
1228 XFlush (FRAME_X_DISPLAY (f
));
1233 x_set_icon_name (f
, arg
, oldval
)
1235 Lisp_Object arg
, oldval
;
1241 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1244 else if (!NILP (arg
) || NILP (oldval
))
1249 if (f
->output_data
.x
->icon_bitmap
!= 0)
1254 result
= x_text_icon (f
,
1255 (char *) SDATA ((!NILP (f
->icon_name
)
1264 error ("No icon window available");
1267 XFlush (FRAME_X_DISPLAY (f
));
1273 x_set_menu_bar_lines (f
, value
, oldval
)
1275 Lisp_Object value
, oldval
;
1278 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
1279 int olines
= FRAME_MENU_BAR_LINES (f
);
1282 /* Right now, menu bars don't work properly in minibuf-only frames;
1283 most of the commands try to apply themselves to the minibuffer
1284 frame itself, and get an error because you can't switch buffers
1285 in or split the minibuffer window. */
1286 if (FRAME_MINIBUF_ONLY_P (f
))
1289 if (INTEGERP (value
))
1290 nlines
= XINT (value
);
1294 /* Make sure we redisplay all windows in this frame. */
1295 windows_or_buffers_changed
++;
1297 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
1298 FRAME_MENU_BAR_LINES (f
) = 0;
1301 FRAME_EXTERNAL_MENU_BAR (f
) = 1;
1302 if (FRAME_X_P (f
) && f
->output_data
.x
->menubar_widget
== 0)
1303 /* Make sure next redisplay shows the menu bar. */
1304 XWINDOW (FRAME_SELECTED_WINDOW (f
))->update_mode_line
= Qt
;
1308 if (FRAME_EXTERNAL_MENU_BAR (f
) == 1)
1309 free_frame_menubar (f
);
1310 FRAME_EXTERNAL_MENU_BAR (f
) = 0;
1312 f
->output_data
.x
->menubar_widget
= 0;
1314 #else /* not USE_X_TOOLKIT && not USE_GTK */
1315 FRAME_MENU_BAR_LINES (f
) = nlines
;
1316 change_window_heights (f
->root_window
, nlines
- olines
);
1317 #endif /* not USE_X_TOOLKIT */
1322 /* Set the number of lines used for the tool bar of frame F to VALUE.
1323 VALUE not an integer, or < 0 means set the lines to zero. OLDVAL
1324 is the old number of tool bar lines. This function changes the
1325 height of all windows on frame F to match the new tool bar height.
1326 The frame's height doesn't change. */
1329 x_set_tool_bar_lines (f
, value
, oldval
)
1331 Lisp_Object value
, oldval
;
1333 int delta
, nlines
, root_height
;
1334 Lisp_Object root_window
;
1336 /* Treat tool bars like menu bars. */
1337 if (FRAME_MINIBUF_ONLY_P (f
))
1340 /* Use VALUE only if an integer >= 0. */
1341 if (INTEGERP (value
) && XINT (value
) >= 0)
1342 nlines
= XFASTINT (value
);
1347 FRAME_TOOL_BAR_LINES (f
) = 0;
1350 FRAME_EXTERNAL_TOOL_BAR (f
) = 1;
1351 if (FRAME_X_P (f
) && f
->output_data
.x
->toolbar_widget
== 0)
1352 /* Make sure next redisplay shows the tool bar. */
1353 XWINDOW (FRAME_SELECTED_WINDOW (f
))->update_mode_line
= Qt
;
1354 update_frame_tool_bar (f
);
1358 if (FRAME_EXTERNAL_TOOL_BAR (f
))
1359 free_frame_tool_bar (f
);
1360 FRAME_EXTERNAL_TOOL_BAR (f
) = 0;
1366 /* Make sure we redisplay all windows in this frame. */
1367 ++windows_or_buffers_changed
;
1369 delta
= nlines
- FRAME_TOOL_BAR_LINES (f
);
1371 /* Don't resize the tool-bar to more than we have room for. */
1372 root_window
= FRAME_ROOT_WINDOW (f
);
1373 root_height
= WINDOW_TOTAL_LINES (XWINDOW (root_window
));
1374 if (root_height
- delta
< 1)
1376 delta
= root_height
- 1;
1377 nlines
= FRAME_TOOL_BAR_LINES (f
) + delta
;
1380 FRAME_TOOL_BAR_LINES (f
) = nlines
;
1381 change_window_heights (root_window
, delta
);
1384 /* We also have to make sure that the internal border at the top of
1385 the frame, below the menu bar or tool bar, is redrawn when the
1386 tool bar disappears. This is so because the internal border is
1387 below the tool bar if one is displayed, but is below the menu bar
1388 if there isn't a tool bar. The tool bar draws into the area
1389 below the menu bar. */
1390 if (FRAME_X_WINDOW (f
) && FRAME_TOOL_BAR_LINES (f
) == 0)
1393 clear_current_matrices (f
);
1396 /* If the tool bar gets smaller, the internal border below it
1397 has to be cleared. It was formerly part of the display
1398 of the larger tool bar, and updating windows won't clear it. */
1401 int height
= FRAME_INTERNAL_BORDER_WIDTH (f
);
1402 int width
= FRAME_PIXEL_WIDTH (f
);
1403 int y
= nlines
* FRAME_LINE_HEIGHT (f
);
1405 /* height can be zero here. */
1406 if (height
> 0 && width
> 0)
1409 x_clear_area (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1410 0, y
, width
, height
, False
);
1414 if (WINDOWP (f
->tool_bar_window
))
1415 clear_glyph_matrix (XWINDOW (f
->tool_bar_window
)->current_matrix
);
1420 /* Set the foreground color for scroll bars on frame F to VALUE.
1421 VALUE should be a string, a color name. If it isn't a string or
1422 isn't a valid color name, do nothing. OLDVAL is the old value of
1423 the frame parameter. */
1426 x_set_scroll_bar_foreground (f
, value
, oldval
)
1428 Lisp_Object value
, oldval
;
1430 unsigned long pixel
;
1432 if (STRINGP (value
))
1433 pixel
= x_decode_color (f
, value
, BLACK_PIX_DEFAULT (f
));
1437 if (f
->output_data
.x
->scroll_bar_foreground_pixel
!= -1)
1438 unload_color (f
, f
->output_data
.x
->scroll_bar_foreground_pixel
);
1440 f
->output_data
.x
->scroll_bar_foreground_pixel
= pixel
;
1441 if (FRAME_X_WINDOW (f
) && FRAME_VISIBLE_P (f
))
1443 /* Remove all scroll bars because they have wrong colors. */
1444 if (FRAME_TERMINAL (f
)->condemn_scroll_bars_hook
)
1445 (*FRAME_TERMINAL (f
)->condemn_scroll_bars_hook
) (f
);
1446 if (FRAME_TERMINAL (f
)->judge_scroll_bars_hook
)
1447 (*FRAME_TERMINAL (f
)->judge_scroll_bars_hook
) (f
);
1449 update_face_from_frame_parameter (f
, Qscroll_bar_foreground
, value
);
1455 /* Set the background color for scroll bars on frame F to VALUE VALUE
1456 should be a string, a color name. If it isn't a string or isn't a
1457 valid color name, do nothing. OLDVAL is the old value of the frame
1461 x_set_scroll_bar_background (f
, value
, oldval
)
1463 Lisp_Object value
, oldval
;
1465 unsigned long pixel
;
1467 if (STRINGP (value
))
1468 pixel
= x_decode_color (f
, value
, WHITE_PIX_DEFAULT (f
));
1472 if (f
->output_data
.x
->scroll_bar_background_pixel
!= -1)
1473 unload_color (f
, f
->output_data
.x
->scroll_bar_background_pixel
);
1475 #ifdef USE_TOOLKIT_SCROLL_BARS
1476 /* Scrollbar shadow colors. */
1477 if (f
->output_data
.x
->scroll_bar_top_shadow_pixel
!= -1)
1479 unload_color (f
, f
->output_data
.x
->scroll_bar_top_shadow_pixel
);
1480 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
1482 if (f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
!= -1)
1484 unload_color (f
, f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
);
1485 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
1487 #endif /* USE_TOOLKIT_SCROLL_BARS */
1489 f
->output_data
.x
->scroll_bar_background_pixel
= pixel
;
1490 if (FRAME_X_WINDOW (f
) && FRAME_VISIBLE_P (f
))
1492 /* Remove all scroll bars because they have wrong colors. */
1493 if (FRAME_TERMINAL (f
)->condemn_scroll_bars_hook
)
1494 (*FRAME_TERMINAL (f
)->condemn_scroll_bars_hook
) (f
);
1495 if (FRAME_TERMINAL (f
)->judge_scroll_bars_hook
)
1496 (*FRAME_TERMINAL (f
)->judge_scroll_bars_hook
) (f
);
1498 update_face_from_frame_parameter (f
, Qscroll_bar_background
, value
);
1504 /* Encode Lisp string STRING as a text in a format appropriate for
1505 XICCC (X Inter Client Communication Conventions).
1507 This can call Lisp code, so callers must GCPRO.
1509 If STRING contains only ASCII characters, do no conversion and
1510 return the string data of STRING. Otherwise, encode the text by
1511 CODING_SYSTEM, and return a newly allocated memory area which
1512 should be freed by `xfree' by a caller.
1514 SELECTIONP non-zero means the string is being encoded for an X
1515 selection, so it is safe to run pre-write conversions (which
1518 Store the byte length of resulting text in *TEXT_BYTES.
1520 If the text contains only ASCII and Latin-1, store 1 in *STRING_P,
1521 which means that the `encoding' of the result can be `STRING'.
1522 Otherwise store 0 in *STRINGP, which means that the `encoding' of
1523 the result should be `COMPOUND_TEXT'. */
1525 static unsigned char *
1526 x_encode_text (string
, coding_system
, selectionp
, text_bytes
, stringp
, freep
)
1527 Lisp_Object string
, coding_system
;
1528 int *text_bytes
, *stringp
;
1532 int result
= string_xstring_p (string
);
1533 struct coding_system coding
;
1537 /* No multibyte character in OBJ. We need not encode it. */
1538 *text_bytes
= SBYTES (string
);
1541 return SDATA (string
);
1544 setup_coding_system (coding_system
, &coding
);
1545 coding
.mode
|= (CODING_MODE_SAFE_ENCODING
| CODING_MODE_LAST_BLOCK
);
1546 /* We suppress producing escape sequences for composition. */
1547 coding
.common_flags
&= ~CODING_ANNOTATION_MASK
;
1548 coding
.dst_bytes
= SCHARS (string
) * 2;
1549 coding
.destination
= (unsigned char *) xmalloc (coding
.dst_bytes
);
1550 encode_coding_object (&coding
, string
, 0, 0,
1551 SCHARS (string
), SBYTES (string
), Qnil
);
1552 *text_bytes
= coding
.produced
;
1553 *stringp
= (result
== 1 || !EQ (coding_system
, Qcompound_text
));
1555 return coding
.destination
;
1559 /* Set the WM name to NAME for frame F. Also set the icon name.
1560 If the frame already has an icon name, use that, otherwise set the
1561 icon name to NAME. */
1564 x_set_name_internal (f
, name
)
1568 if (FRAME_X_WINDOW (f
))
1572 XTextProperty text
, icon
;
1574 int do_free_icon_value
= 0, do_free_text_value
= 0;
1575 Lisp_Object coding_system
;
1577 Lisp_Object encoded_name
;
1578 struct gcpro gcpro1
;
1580 /* As ENCODE_UTF_8 may cause GC and relocation of string data,
1581 we use it before x_encode_text that may return string data. */
1583 encoded_name
= ENCODE_UTF_8 (name
);
1587 coding_system
= Qcompound_text
;
1588 /* Note: Encoding strategy
1590 We encode NAME by compound-text and use "COMPOUND-TEXT" in
1591 text.encoding. But, there are non-internationalized window
1592 managers which don't support that encoding. So, if NAME
1593 contains only ASCII and 8859-1 characters, encode it by
1594 iso-latin-1, and use "STRING" in text.encoding hoping that
1595 such window managers at least analyze this format correctly,
1596 i.e. treat 8-bit bytes as 8859-1 characters.
1598 We may also be able to use "UTF8_STRING" in text.encoding
1599 in the future which can encode all Unicode characters.
1600 But, for the moment, there's no way to know that the
1601 current window manager supports it or not. */
1602 text
.value
= x_encode_text (name
, coding_system
, 0, &bytes
, &stringp
,
1603 &do_free_text_value
);
1604 text
.encoding
= (stringp
? XA_STRING
1605 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
1607 text
.nitems
= bytes
;
1609 if (!STRINGP (f
->icon_name
))
1615 /* See the above comment "Note: Encoding strategy". */
1616 icon
.value
= x_encode_text (f
->icon_name
, coding_system
, 0,
1617 &bytes
, &stringp
, &do_free_icon_value
);
1618 icon
.encoding
= (stringp
? XA_STRING
1619 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
1621 icon
.nitems
= bytes
;
1625 gtk_window_set_title (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)),
1626 (char *) SDATA (encoded_name
));
1627 #else /* not USE_GTK */
1628 XSetWMName (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
), &text
);
1629 #endif /* not USE_GTK */
1631 XSetWMIconName (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
), &icon
);
1633 if (do_free_icon_value
)
1635 if (do_free_text_value
)
1642 /* Change the name of frame F to NAME. If NAME is nil, set F's name to
1645 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1646 name; if NAME is a string, set F's name to NAME and set
1647 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1649 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1650 suggesting a new name, which lisp code should override; if
1651 F->explicit_name is set, ignore the new name; otherwise, set it. */
1654 x_set_name (f
, name
, explicit)
1659 /* Make sure that requests from lisp code override requests from
1660 Emacs redisplay code. */
1663 /* If we're switching from explicit to implicit, we had better
1664 update the mode lines and thereby update the title. */
1665 if (f
->explicit_name
&& NILP (name
))
1666 update_mode_lines
= 1;
1668 f
->explicit_name
= ! NILP (name
);
1670 else if (f
->explicit_name
)
1673 /* If NAME is nil, set the name to the x_id_name. */
1676 /* Check for no change needed in this very common case
1677 before we do any consing. */
1678 if (!strcmp (FRAME_X_DISPLAY_INFO (f
)->x_id_name
,
1681 name
= build_string (FRAME_X_DISPLAY_INFO (f
)->x_id_name
);
1684 CHECK_STRING (name
);
1686 /* Don't change the name if it's already NAME. */
1687 if (! NILP (Fstring_equal (name
, f
->name
)))
1692 /* For setting the frame title, the title parameter should override
1693 the name parameter. */
1694 if (! NILP (f
->title
))
1697 x_set_name_internal (f
, name
);
1700 /* This function should be called when the user's lisp code has
1701 specified a name for the frame; the name will override any set by the
1704 x_explicitly_set_name (f
, arg
, oldval
)
1706 Lisp_Object arg
, oldval
;
1708 x_set_name (f
, arg
, 1);
1711 /* This function should be called by Emacs redisplay code to set the
1712 name; names set this way will never override names set by the user's
1715 x_implicitly_set_name (f
, arg
, oldval
)
1717 Lisp_Object arg
, oldval
;
1719 x_set_name (f
, arg
, 0);
1722 /* Change the title of frame F to NAME.
1723 If NAME is nil, use the frame name as the title. */
1726 x_set_title (f
, name
, old_name
)
1728 Lisp_Object name
, old_name
;
1730 /* Don't change the title if it's already NAME. */
1731 if (EQ (name
, f
->title
))
1734 update_mode_lines
= 1;
1741 CHECK_STRING (name
);
1743 x_set_name_internal (f
, name
);
1747 x_set_scroll_bar_default_width (f
)
1750 int wid
= FRAME_COLUMN_WIDTH (f
);
1752 #ifdef USE_TOOLKIT_SCROLL_BARS
1753 /* A minimum width of 14 doesn't look good for toolkit scroll bars. */
1754 int width
= 16 + 2 * VERTICAL_SCROLL_BAR_WIDTH_TRIM
;
1755 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (width
+ wid
- 1) / wid
;
1756 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = width
;
1758 /* Make the actual width at least 14 pixels and a multiple of a
1760 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (14 + wid
- 1) / wid
;
1762 /* Use all of that space (aside from required margins) for the
1764 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = 0;
1769 /* Record in frame F the specified or default value according to ALIST
1770 of the parameter named PROP (a Lisp symbol). If no value is
1771 specified for PROP, look for an X default for XPROP on the frame
1772 named NAME. If that is not found either, use the value DEFLT. */
1775 x_default_scroll_bar_color_parameter (f
, alist
, prop
, xprop
, xclass
,
1784 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
1787 tem
= x_get_arg (dpyinfo
, alist
, prop
, xprop
, xclass
, RES_TYPE_STRING
);
1788 if (EQ (tem
, Qunbound
))
1790 #ifdef USE_TOOLKIT_SCROLL_BARS
1792 /* See if an X resource for the scroll bar color has been
1794 tem
= display_x_get_resource (dpyinfo
,
1795 build_string (foreground_p
1798 empty_unibyte_string
,
1799 build_string ("verticalScrollBar"),
1800 empty_unibyte_string
);
1803 /* If nothing has been specified, scroll bars will use a
1804 toolkit-dependent default. Because these defaults are
1805 difficult to get at without actually creating a scroll
1806 bar, use nil to indicate that no color has been
1811 #else /* not USE_TOOLKIT_SCROLL_BARS */
1815 #endif /* not USE_TOOLKIT_SCROLL_BARS */
1818 x_set_frame_parameters (f
, Fcons (Fcons (prop
, tem
), Qnil
));
1825 #ifdef USE_X_TOOLKIT
1827 /* If the WM_PROTOCOLS property does not already contain WM_TAKE_FOCUS,
1828 WM_DELETE_WINDOW, and WM_SAVE_YOURSELF, then add them. (They may
1829 already be present because of the toolkit (Motif adds some of them,
1830 for example, but Xt doesn't). */
1833 hack_wm_protocols (f
, widget
)
1837 Display
*dpy
= XtDisplay (widget
);
1838 Window w
= XtWindow (widget
);
1839 int need_delete
= 1;
1846 unsigned char *catoms
;
1848 unsigned long nitems
= 0;
1849 unsigned long bytes_after
;
1851 if ((XGetWindowProperty (dpy
, w
,
1852 FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
1853 (long)0, (long)100, False
, XA_ATOM
,
1854 &type
, &format
, &nitems
, &bytes_after
,
1857 && format
== 32 && type
== XA_ATOM
)
1859 Atom
*atoms
= (Atom
*) catoms
;
1864 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
)
1866 else if (atoms
[nitems
]
1867 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_take_focus
)
1869 else if (atoms
[nitems
]
1870 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
)
1881 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
;
1883 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_take_focus
;
1885 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
;
1887 XChangeProperty (dpy
, w
, FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
1888 XA_ATOM
, 32, PropModeAppend
,
1889 (unsigned char *) props
, count
);
1897 /* Support routines for XIC (X Input Context). */
1901 static XFontSet xic_create_xfontset
P_ ((struct frame
*));
1902 static XIMStyle best_xim_style
P_ ((XIMStyles
*, XIMStyles
*));
1905 /* Supported XIM styles, ordered by preference. */
1907 static XIMStyle supported_xim_styles
[] =
1909 XIMPreeditPosition
| XIMStatusArea
,
1910 XIMPreeditPosition
| XIMStatusNothing
,
1911 XIMPreeditPosition
| XIMStatusNone
,
1912 XIMPreeditNothing
| XIMStatusArea
,
1913 XIMPreeditNothing
| XIMStatusNothing
,
1914 XIMPreeditNothing
| XIMStatusNone
,
1915 XIMPreeditNone
| XIMStatusArea
,
1916 XIMPreeditNone
| XIMStatusNothing
,
1917 XIMPreeditNone
| XIMStatusNone
,
1922 /* Create an X fontset on frame F with base font name BASE_FONTNAME. */
1924 char xic_defaut_fontset
[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*";
1926 /* Create an Xt fontset spec from the name of a base font.
1927 If `motif' is True use the Motif syntax. */
1929 xic_create_fontsetname (base_fontname
, motif
)
1930 char *base_fontname
;
1933 const char *sep
= motif
? ";" : ",";
1936 /* Make a fontset name from the base font name. */
1937 if (xic_defaut_fontset
== base_fontname
)
1938 { /* There is no base font name, use the default. */
1939 int len
= strlen (base_fontname
) + 2;
1940 fontsetname
= xmalloc (len
);
1941 bzero (fontsetname
, len
);
1942 strcpy (fontsetname
, base_fontname
);
1946 /* Make a fontset name from the base font name.
1947 The font set will be made of the following elements:
1949 - the base font where the charset spec is replaced by -*-*.
1950 - the same but with the family also replaced with -*-*-. */
1951 char *p
= base_fontname
;
1954 for (i
= 0; *p
; p
++)
1957 { /* As the font name doesn't conform to XLFD, we can't
1958 modify it to generalize it to allcs and allfamilies.
1959 Use the specified font plus the default. */
1960 int len
= strlen (base_fontname
) + strlen (xic_defaut_fontset
) + 3;
1961 fontsetname
= xmalloc (len
);
1962 bzero (fontsetname
, len
);
1963 strcpy (fontsetname
, base_fontname
);
1964 strcat (fontsetname
, sep
);
1965 strcat (fontsetname
, xic_defaut_fontset
);
1970 char *p1
= NULL
, *p2
= NULL
, *p3
= NULL
;
1971 char *font_allcs
= NULL
;
1972 char *font_allfamilies
= NULL
;
1973 char *font_all
= NULL
;
1974 char *allcs
= "*-*-*-*-*-*-*";
1975 char *allfamilies
= "-*-*-";
1976 char *all
= "*-*-*-*-";
1979 for (i
= 0, p
= base_fontname
; i
< 8; p
++)
1992 /* If base_fontname specifies ADSTYLE, make it a
1996 int diff
= (p2
- p3
) - 2;
1998 base
= alloca (strlen (base_fontname
) + 1);
1999 bcopy (base_fontname
, base
, p3
- base_fontname
);
2000 base
[p3
- base_fontname
] = '*';
2001 base
[(p3
- base_fontname
) + 1] = '-';
2002 strcpy (base
+ (p3
- base_fontname
) + 2, p2
);
2003 p
= base
+ (p
- base_fontname
) - diff
;
2004 p1
= base
+ (p1
- base_fontname
);
2005 p2
= base
+ (p2
- base_fontname
) - diff
;
2006 base_fontname
= base
;
2009 /* Build the font spec that matches all charsets. */
2010 len
= p
- base_fontname
+ strlen (allcs
) + 1;
2011 font_allcs
= (char *) alloca (len
);
2012 bzero (font_allcs
, len
);
2013 bcopy (base_fontname
, font_allcs
, p
- base_fontname
);
2014 strcat (font_allcs
, allcs
);
2016 /* Build the font spec that matches all families and
2018 len
= p
- p1
+ strlen (allcs
) + strlen (allfamilies
) + 1;
2019 font_allfamilies
= (char *) alloca (len
);
2020 bzero (font_allfamilies
, len
);
2021 strcpy (font_allfamilies
, allfamilies
);
2022 bcopy (p1
, font_allfamilies
+ strlen (allfamilies
), p
- p1
);
2023 strcat (font_allfamilies
, allcs
);
2025 /* Build the font spec that matches all. */
2026 len
= p
- p2
+ strlen (allcs
) + strlen (all
) + strlen (allfamilies
) + 1;
2027 font_all
= (char *) alloca (len
);
2028 bzero (font_all
, len
);
2029 strcpy (font_all
, allfamilies
);
2030 strcat (font_all
, all
);
2031 bcopy (p2
, font_all
+ strlen (all
) + strlen (allfamilies
), p
- p2
);
2032 strcat (font_all
, allcs
);
2034 /* Build the actual font set name. */
2035 len
= strlen (base_fontname
) + strlen (font_allcs
)
2036 + strlen (font_allfamilies
) + strlen (font_all
) + 5;
2037 fontsetname
= xmalloc (len
);
2038 bzero (fontsetname
, len
);
2039 strcpy (fontsetname
, base_fontname
);
2040 strcat (fontsetname
, sep
);
2041 strcat (fontsetname
, font_allcs
);
2042 strcat (fontsetname
, sep
);
2043 strcat (fontsetname
, font_allfamilies
);
2044 strcat (fontsetname
, sep
);
2045 strcat (fontsetname
, font_all
);
2049 strcat (fontsetname
, ":");
2053 #ifdef DEBUG_XIC_FONTSET
2055 print_fontset_result (xfs
, name
, missing_list
, missing_count
)
2058 char **missing_list
;
2062 fprintf (stderr
, "XIC Fontset created: %s\n", name
);
2065 fprintf (stderr
, "XIC Fontset failed: %s\n", name
);
2066 while (missing_count
-- > 0)
2068 fprintf (stderr
, " missing: %s\n", *missing_list
);
2077 xic_create_xfontset (f
)
2080 XFontSet xfs
= NULL
;
2081 struct font
*font
= FRAME_FONT (f
);
2082 int pixel_size
= font
->pixel_size
;
2083 Lisp_Object rest
, frame
;
2085 /* See if there is another frame already using same fontset. */
2086 FOR_EACH_FRAME (rest
, frame
)
2088 struct frame
*cf
= XFRAME (frame
);
2090 if (cf
!= f
&& FRAME_LIVE_P (f
) && FRAME_X_P (cf
)
2091 && FRAME_X_DISPLAY_INFO (cf
) == FRAME_X_DISPLAY_INFO (f
)
2093 && FRAME_FONT (f
)->pixel_size
== pixel_size
)
2095 xfs
= FRAME_XIC_FONTSET (cf
);
2103 char **missing_list
;
2106 char *xlfd_format
= "-*-*-medium-r-normal--%d-*-*-*-*-*";
2108 sprintf (buf
, xlfd_format
, pixel_size
);
2109 missing_list
= NULL
;
2110 xfs
= XCreateFontSet (FRAME_X_DISPLAY (f
), buf
,
2111 &missing_list
, &missing_count
, &def_string
);
2112 #ifdef DEBUG_XIC_FONTSET
2113 print_fontset_result (xfs
, buf
, missing_list
, missing_count
);
2116 XFreeStringList (missing_list
);
2119 /* List of pixel sizes most likely available. Find one that
2120 is closest to pixel_size. */
2121 int sizes
[] = {0, 8, 10, 11, 12, 14, 17, 18, 20, 24, 26, 34, 0};
2122 int *smaller
, *larger
;
2124 for (smaller
= sizes
; smaller
[1]; smaller
++)
2125 if (smaller
[1] >= pixel_size
)
2127 larger
= smaller
+ 1;
2128 if (*larger
== pixel_size
)
2130 while (*smaller
|| *larger
)
2135 this_size
= *smaller
--;
2136 else if (! *smaller
)
2137 this_size
= *larger
++;
2138 else if (pixel_size
- *smaller
< *larger
- pixel_size
)
2139 this_size
= *smaller
--;
2141 this_size
= *larger
++;
2142 sprintf (buf
, xlfd_format
, this_size
);
2143 missing_list
= NULL
;
2144 xfs
= XCreateFontSet (FRAME_X_DISPLAY (f
), buf
,
2145 &missing_list
, &missing_count
, &def_string
);
2146 #ifdef DEBUG_XIC_FONTSET
2147 print_fontset_result (xfs
, buf
, missing_list
, missing_count
);
2150 XFreeStringList (missing_list
);
2157 char *last_resort
= "-*-*-*-r-normal--*-*-*-*-*-*";
2159 missing_list
= NULL
;
2160 xfs
= XCreateFontSet (FRAME_X_DISPLAY (f
), last_resort
,
2161 &missing_list
, &missing_count
, &def_string
);
2162 #ifdef DEBUG_XIC_FONTSET
2163 print_fontset_result (xfs
, last_resort
, missing_list
, missing_count
);
2166 XFreeStringList (missing_list
);
2174 /* Free the X fontset of frame F if it is the last frame using it. */
2177 xic_free_xfontset (f
)
2180 Lisp_Object rest
, frame
;
2183 if (!FRAME_XIC_FONTSET (f
))
2186 /* See if there is another frame sharing the same fontset. */
2187 FOR_EACH_FRAME (rest
, frame
)
2189 struct frame
*cf
= XFRAME (frame
);
2190 if (cf
!= f
&& FRAME_LIVE_P (f
) && FRAME_X_P (cf
)
2191 && FRAME_X_DISPLAY_INFO (cf
) == FRAME_X_DISPLAY_INFO (f
)
2192 && FRAME_XIC_FONTSET (cf
) == FRAME_XIC_FONTSET (f
))
2200 /* The fontset is not used anymore. It is safe to free it. */
2201 XFreeFontSet (FRAME_X_DISPLAY (f
), FRAME_XIC_FONTSET (f
));
2203 if (FRAME_XIC_BASE_FONTNAME (f
))
2204 xfree (FRAME_XIC_BASE_FONTNAME (f
));
2205 FRAME_XIC_BASE_FONTNAME (f
) = NULL
;
2206 FRAME_XIC_FONTSET (f
) = NULL
;
2210 /* Value is the best input style, given user preferences USER (already
2211 checked to be supported by Emacs), and styles supported by the
2212 input method XIM. */
2215 best_xim_style (user
, xim
)
2221 for (i
= 0; i
< user
->count_styles
; ++i
)
2222 for (j
= 0; j
< xim
->count_styles
; ++j
)
2223 if (user
->supported_styles
[i
] == xim
->supported_styles
[j
])
2224 return user
->supported_styles
[i
];
2226 /* Return the default style. */
2227 return XIMPreeditNothing
| XIMStatusNothing
;
2230 /* Create XIC for frame F. */
2232 static XIMStyle xic_style
;
2235 create_frame_xic (f
)
2240 XFontSet xfs
= NULL
;
2245 /* Create X fontset. */
2246 xfs
= xic_create_xfontset (f
);
2247 xim
= FRAME_X_XIM (f
);
2252 XVaNestedList preedit_attr
;
2253 XVaNestedList status_attr
;
2255 s_area
.x
= 0; s_area
.y
= 0; s_area
.width
= 1; s_area
.height
= 1;
2256 spot
.x
= 0; spot
.y
= 1;
2258 /* Determine XIC style. */
2261 XIMStyles supported_list
;
2262 supported_list
.count_styles
= (sizeof supported_xim_styles
2263 / sizeof supported_xim_styles
[0]);
2264 supported_list
.supported_styles
= supported_xim_styles
;
2265 xic_style
= best_xim_style (&supported_list
,
2266 FRAME_X_XIM_STYLES (f
));
2269 preedit_attr
= XVaCreateNestedList (0,
2272 FRAME_FOREGROUND_PIXEL (f
),
2274 FRAME_BACKGROUND_PIXEL (f
),
2275 (xic_style
& XIMPreeditPosition
2280 status_attr
= XVaCreateNestedList (0,
2286 FRAME_FOREGROUND_PIXEL (f
),
2288 FRAME_BACKGROUND_PIXEL (f
),
2291 xic
= XCreateIC (xim
,
2292 XNInputStyle
, xic_style
,
2293 XNClientWindow
, FRAME_X_WINDOW (f
),
2294 XNFocusWindow
, FRAME_X_WINDOW (f
),
2295 XNStatusAttributes
, status_attr
,
2296 XNPreeditAttributes
, preedit_attr
,
2298 XFree (preedit_attr
);
2299 XFree (status_attr
);
2302 FRAME_XIC (f
) = xic
;
2303 FRAME_XIC_STYLE (f
) = xic_style
;
2304 FRAME_XIC_FONTSET (f
) = xfs
;
2308 /* Destroy XIC and free XIC fontset of frame F, if any. */
2314 if (FRAME_XIC (f
) == NULL
)
2317 XDestroyIC (FRAME_XIC (f
));
2318 xic_free_xfontset (f
);
2320 FRAME_XIC (f
) = NULL
;
2324 /* Place preedit area for XIC of window W's frame to specified
2325 pixel position X/Y. X and Y are relative to window W. */
2328 xic_set_preeditarea (w
, x
, y
)
2332 struct frame
*f
= XFRAME (w
->frame
);
2336 spot
.x
= WINDOW_TO_FRAME_PIXEL_X (w
, x
) + WINDOW_LEFT_FRINGE_WIDTH (w
);
2337 spot
.y
= WINDOW_TO_FRAME_PIXEL_Y (w
, y
) + FONT_BASE (FRAME_FONT (f
));
2338 attr
= XVaCreateNestedList (0, XNSpotLocation
, &spot
, NULL
);
2339 XSetICValues (FRAME_XIC (f
), XNPreeditAttributes
, attr
, NULL
);
2344 /* Place status area for XIC in bottom right corner of frame F.. */
2347 xic_set_statusarea (f
)
2350 XIC xic
= FRAME_XIC (f
);
2355 /* Negotiate geometry of status area. If input method has existing
2356 status area, use its current size. */
2357 area
.x
= area
.y
= area
.width
= area
.height
= 0;
2358 attr
= XVaCreateNestedList (0, XNAreaNeeded
, &area
, NULL
);
2359 XSetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2362 attr
= XVaCreateNestedList (0, XNAreaNeeded
, &needed
, NULL
);
2363 XGetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2366 if (needed
->width
== 0) /* Use XNArea instead of XNAreaNeeded */
2368 attr
= XVaCreateNestedList (0, XNArea
, &needed
, NULL
);
2369 XGetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2373 area
.width
= needed
->width
;
2374 area
.height
= needed
->height
;
2375 area
.x
= FRAME_PIXEL_WIDTH (f
) - area
.width
- FRAME_INTERNAL_BORDER_WIDTH (f
);
2376 area
.y
= (FRAME_PIXEL_HEIGHT (f
) - area
.height
2377 - FRAME_MENUBAR_HEIGHT (f
)
2378 - FRAME_TOOLBAR_HEIGHT (f
)
2379 - FRAME_INTERNAL_BORDER_WIDTH (f
));
2382 attr
= XVaCreateNestedList (0, XNArea
, &area
, NULL
);
2383 XSetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2388 /* Set X fontset for XIC of frame F, using base font name
2389 BASE_FONTNAME. Called when a new Emacs fontset is chosen. */
2392 xic_set_xfontset (f
, base_fontname
)
2394 char *base_fontname
;
2399 xic_free_xfontset (f
);
2401 xfs
= xic_create_xfontset (f
);
2403 attr
= XVaCreateNestedList (0, XNFontSet
, xfs
, NULL
);
2404 if (FRAME_XIC_STYLE (f
) & XIMPreeditPosition
)
2405 XSetICValues (FRAME_XIC (f
), XNPreeditAttributes
, attr
, NULL
);
2406 if (FRAME_XIC_STYLE (f
) & XIMStatusArea
)
2407 XSetICValues (FRAME_XIC (f
), XNStatusAttributes
, attr
, NULL
);
2410 FRAME_XIC_FONTSET (f
) = xfs
;
2413 #endif /* HAVE_X_I18N */
2417 #ifdef USE_X_TOOLKIT
2419 /* Create and set up the X widget for frame F. */
2422 x_window (f
, window_prompting
, minibuffer_only
)
2424 long window_prompting
;
2425 int minibuffer_only
;
2427 XClassHint class_hints
;
2428 XSetWindowAttributes attributes
;
2429 unsigned long attribute_mask
;
2430 Widget shell_widget
;
2432 Widget frame_widget
;
2438 /* Use the resource name as the top-level widget name
2439 for looking up resources. Make a non-Lisp copy
2440 for the window manager, so GC relocation won't bother it.
2442 Elsewhere we specify the window name for the window manager. */
2445 char *str
= (char *) SDATA (Vx_resource_name
);
2446 f
->namebuf
= (char *) xmalloc (strlen (str
) + 1);
2447 strcpy (f
->namebuf
, str
);
2451 XtSetArg (al
[ac
], XtNallowShellResize
, 1); ac
++;
2452 XtSetArg (al
[ac
], XtNinput
, 1); ac
++;
2453 XtSetArg (al
[ac
], XtNmappedWhenManaged
, 0); ac
++;
2454 XtSetArg (al
[ac
], XtNborderWidth
, f
->border_width
); ac
++;
2455 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2456 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2457 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2458 shell_widget
= XtAppCreateShell (f
->namebuf
, EMACS_CLASS
,
2459 applicationShellWidgetClass
,
2460 FRAME_X_DISPLAY (f
), al
, ac
);
2462 f
->output_data
.x
->widget
= shell_widget
;
2463 /* maybe_set_screen_title_format (shell_widget); */
2465 pane_widget
= lw_create_widget ("main", "pane", widget_id_tick
++,
2466 (widget_value
*) NULL
,
2467 shell_widget
, False
,
2471 (lw_callback
) NULL
);
2474 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2475 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2476 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2477 XtSetValues (pane_widget
, al
, ac
);
2478 f
->output_data
.x
->column_widget
= pane_widget
;
2480 /* mappedWhenManaged to false tells to the paned window to not map/unmap
2481 the emacs screen when changing menubar. This reduces flickering. */
2484 XtSetArg (al
[ac
], XtNmappedWhenManaged
, 0); ac
++;
2485 XtSetArg (al
[ac
], XtNshowGrip
, 0); ac
++;
2486 XtSetArg (al
[ac
], XtNallowResize
, 1); ac
++;
2487 XtSetArg (al
[ac
], XtNresizeToPreferred
, 1); ac
++;
2488 XtSetArg (al
[ac
], XtNemacsFrame
, f
); ac
++;
2489 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2490 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2491 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2492 frame_widget
= XtCreateWidget (f
->namebuf
, emacsFrameClass
, pane_widget
,
2495 f
->output_data
.x
->edit_widget
= frame_widget
;
2497 XtManageChild (frame_widget
);
2499 /* Do some needed geometry management. */
2502 char *tem
, shell_position
[32];
2505 int extra_borders
= 0;
2507 = (f
->output_data
.x
->menubar_widget
2508 ? (f
->output_data
.x
->menubar_widget
->core
.height
2509 + f
->output_data
.x
->menubar_widget
->core
.border_width
)
2512 #if 0 /* Experimentally, we now get the right results
2513 for -geometry -0-0 without this. 24 Aug 96, rms. */
2514 if (FRAME_EXTERNAL_MENU_BAR (f
))
2517 XtVaGetValues (pane_widget
, XtNinternalBorderWidth
, &ibw
, NULL
);
2518 menubar_size
+= ibw
;
2522 f
->output_data
.x
->menubar_height
= menubar_size
;
2525 /* Motif seems to need this amount added to the sizes
2526 specified for the shell widget. The Athena/Lucid widgets don't.
2527 Both conclusions reached experimentally. -- rms. */
2528 XtVaGetValues (f
->output_data
.x
->edit_widget
, XtNinternalBorderWidth
,
2529 &extra_borders
, NULL
);
2533 /* Convert our geometry parameters into a geometry string
2535 Note that we do not specify here whether the position
2536 is a user-specified or program-specified one.
2537 We pass that information later, in x_wm_set_size_hints. */
2539 int left
= f
->left_pos
;
2540 int xneg
= window_prompting
& XNegative
;
2541 int top
= f
->top_pos
;
2542 int yneg
= window_prompting
& YNegative
;
2548 if (window_prompting
& USPosition
)
2549 sprintf (shell_position
, "=%dx%d%c%d%c%d",
2550 FRAME_PIXEL_WIDTH (f
) + extra_borders
,
2551 FRAME_PIXEL_HEIGHT (f
) + menubar_size
+ extra_borders
,
2552 (xneg
? '-' : '+'), left
,
2553 (yneg
? '-' : '+'), top
);
2556 sprintf (shell_position
, "=%dx%d",
2557 FRAME_PIXEL_WIDTH (f
) + extra_borders
,
2558 FRAME_PIXEL_HEIGHT (f
) + menubar_size
+ extra_borders
);
2560 /* Setting x and y when the position is not specified in
2561 the geometry string will set program position in the WM hints.
2562 If Emacs had just one program position, we could set it in
2563 fallback resources, but since each make-frame call can specify
2564 different program positions, this is easier. */
2565 XtSetArg (al
[ac
], XtNx
, left
); ac
++;
2566 XtSetArg (al
[ac
], XtNy
, top
); ac
++;
2570 len
= strlen (shell_position
) + 1;
2571 /* We don't free this because we don't know whether
2572 it is safe to free it while the frame exists.
2573 It isn't worth the trouble of arranging to free it
2574 when the frame is deleted. */
2575 tem
= (char *) xmalloc (len
);
2576 strncpy (tem
, shell_position
, len
);
2577 XtSetArg (al
[ac
], XtNgeometry
, tem
); ac
++;
2578 XtSetValues (shell_widget
, al
, ac
);
2581 XtManageChild (pane_widget
);
2582 XtRealizeWidget (shell_widget
);
2584 if (FRAME_X_EMBEDDED_P (f
))
2585 XReparentWindow (FRAME_X_DISPLAY (f
), XtWindow (shell_widget
),
2586 f
->output_data
.x
->parent_desc
, 0, 0);
2588 FRAME_X_WINDOW (f
) = XtWindow (frame_widget
);
2590 validate_x_resource_name ();
2592 class_hints
.res_name
= (char *) SDATA (Vx_resource_name
);
2593 class_hints
.res_class
= (char *) SDATA (Vx_resource_class
);
2594 XSetClassHint (FRAME_X_DISPLAY (f
), XtWindow (shell_widget
), &class_hints
);
2597 FRAME_XIC (f
) = NULL
;
2599 create_frame_xic (f
);
2602 f
->output_data
.x
->wm_hints
.input
= True
;
2603 f
->output_data
.x
->wm_hints
.flags
|= InputHint
;
2604 XSetWMHints (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2605 &f
->output_data
.x
->wm_hints
);
2607 hack_wm_protocols (f
, shell_widget
);
2610 XtAddEventHandler (shell_widget
, 0, True
, _XEditResCheckMessages
, 0);
2613 /* Do a stupid property change to force the server to generate a
2614 PropertyNotify event so that the event_stream server timestamp will
2615 be initialized to something relevant to the time we created the window.
2617 XChangeProperty (XtDisplay (frame_widget
), XtWindow (frame_widget
),
2618 FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
2619 XA_ATOM
, 32, PropModeAppend
,
2620 (unsigned char*) NULL
, 0);
2622 /* Make all the standard events reach the Emacs frame. */
2623 attributes
.event_mask
= STANDARD_EVENT_SET
;
2628 /* XIM server might require some X events. */
2629 unsigned long fevent
= NoEventMask
;
2630 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2631 attributes
.event_mask
|= fevent
;
2633 #endif /* HAVE_X_I18N */
2635 attribute_mask
= CWEventMask
;
2636 XChangeWindowAttributes (XtDisplay (shell_widget
), XtWindow (shell_widget
),
2637 attribute_mask
, &attributes
);
2639 XtMapWidget (frame_widget
);
2641 /* x_set_name normally ignores requests to set the name if the
2642 requested name is the same as the current name. This is the one
2643 place where that assumption isn't correct; f->name is set, but
2644 the X server hasn't been told. */
2647 int explicit = f
->explicit_name
;
2649 f
->explicit_name
= 0;
2652 x_set_name (f
, name
, explicit);
2655 XDefineCursor (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2656 f
->output_data
.x
->current_cursor
2657 = f
->output_data
.x
->text_cursor
);
2661 /* This is a no-op, except under Motif. Make sure main areas are
2662 set to something reasonable, in case we get an error later. */
2663 lw_set_main_areas (pane_widget
, 0, frame_widget
);
2666 #else /* not USE_X_TOOLKIT */
2672 if (! xg_create_frame_widgets (f
))
2673 error ("Unable to create window");
2676 FRAME_XIC (f
) = NULL
;
2680 create_frame_xic (f
);
2683 /* XIM server might require some X events. */
2684 unsigned long fevent
= NoEventMask
;
2685 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2687 if (fevent
!= NoEventMask
)
2689 XSetWindowAttributes attributes
;
2690 XWindowAttributes wattr
;
2691 unsigned long attribute_mask
;
2693 XGetWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2695 attributes
.event_mask
= wattr
.your_event_mask
| fevent
;
2696 attribute_mask
= CWEventMask
;
2697 XChangeWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2698 attribute_mask
, &attributes
);
2706 #else /*! USE_GTK */
2707 /* Create and set up the X window for frame F. */
2714 XClassHint class_hints
;
2715 XSetWindowAttributes attributes
;
2716 unsigned long attribute_mask
;
2718 attributes
.background_pixel
= FRAME_BACKGROUND_PIXEL (f
);
2719 attributes
.border_pixel
= f
->output_data
.x
->border_pixel
;
2720 attributes
.bit_gravity
= StaticGravity
;
2721 attributes
.backing_store
= NotUseful
;
2722 attributes
.save_under
= True
;
2723 attributes
.event_mask
= STANDARD_EVENT_SET
;
2724 attributes
.colormap
= FRAME_X_COLORMAP (f
);
2725 attribute_mask
= (CWBackPixel
| CWBorderPixel
| CWBitGravity
| CWEventMask
2730 = XCreateWindow (FRAME_X_DISPLAY (f
),
2731 f
->output_data
.x
->parent_desc
,
2734 FRAME_PIXEL_WIDTH (f
), FRAME_PIXEL_HEIGHT (f
),
2736 CopyFromParent
, /* depth */
2737 InputOutput
, /* class */
2739 attribute_mask
, &attributes
);
2744 create_frame_xic (f
);
2747 /* XIM server might require some X events. */
2748 unsigned long fevent
= NoEventMask
;
2749 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2750 attributes
.event_mask
|= fevent
;
2751 attribute_mask
= CWEventMask
;
2752 XChangeWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2753 attribute_mask
, &attributes
);
2756 #endif /* HAVE_X_I18N */
2758 validate_x_resource_name ();
2760 class_hints
.res_name
= (char *) SDATA (Vx_resource_name
);
2761 class_hints
.res_class
= (char *) SDATA (Vx_resource_class
);
2762 XSetClassHint (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), &class_hints
);
2764 /* The menubar is part of the ordinary display;
2765 it does not count in addition to the height of the window. */
2766 f
->output_data
.x
->menubar_height
= 0;
2768 /* This indicates that we use the "Passive Input" input model.
2769 Unless we do this, we don't get the Focus{In,Out} events that we
2770 need to draw the cursor correctly. Accursed bureaucrats.
2771 XWhipsAndChains (FRAME_X_DISPLAY (f), IronMaiden, &TheRack); */
2773 f
->output_data
.x
->wm_hints
.input
= True
;
2774 f
->output_data
.x
->wm_hints
.flags
|= InputHint
;
2775 XSetWMHints (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2776 &f
->output_data
.x
->wm_hints
);
2777 f
->output_data
.x
->wm_hints
.icon_pixmap
= None
;
2779 /* Request "save yourself" and "delete window" commands from wm. */
2782 protocols
[0] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
;
2783 protocols
[1] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
;
2784 XSetWMProtocols (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), protocols
, 2);
2787 /* x_set_name normally ignores requests to set the name if the
2788 requested name is the same as the current name. This is the one
2789 place where that assumption isn't correct; f->name is set, but
2790 the X server hasn't been told. */
2793 int explicit = f
->explicit_name
;
2795 f
->explicit_name
= 0;
2798 x_set_name (f
, name
, explicit);
2801 XDefineCursor (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2802 f
->output_data
.x
->current_cursor
2803 = f
->output_data
.x
->text_cursor
);
2807 if (FRAME_X_WINDOW (f
) == 0)
2808 error ("Unable to create window");
2811 #endif /* not USE_GTK */
2812 #endif /* not USE_X_TOOLKIT */
2814 /* Verify that the icon position args for this window are valid. */
2817 x_icon_verify (f
, parms
)
2821 Lisp_Object icon_x
, icon_y
;
2823 /* Set the position of the icon. Note that twm groups all
2824 icons in an icon window. */
2825 icon_x
= x_frame_get_and_record_arg (f
, parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2826 icon_y
= x_frame_get_and_record_arg (f
, parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2827 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2829 CHECK_NUMBER (icon_x
);
2830 CHECK_NUMBER (icon_y
);
2832 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2833 error ("Both left and top icon corners of icon must be specified");
2836 /* Handle the icon stuff for this window. Perhaps later we might
2837 want an x_set_icon_position which can be called interactively as
2845 Lisp_Object icon_x
, icon_y
;
2847 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2850 /* Set the position of the icon. Note that twm groups all
2851 icons in an icon window. */
2852 icon_x
= x_frame_get_and_record_arg (f
, parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2853 icon_y
= x_frame_get_and_record_arg (f
, parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2854 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2856 CHECK_NUMBER (icon_x
);
2857 CHECK_NUMBER (icon_y
);
2859 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2860 error ("Both left and top icon corners of icon must be specified");
2864 if (! EQ (icon_x
, Qunbound
))
2865 x_wm_set_icon_position (f
, XINT (icon_x
), XINT (icon_y
));
2867 #if 0 /* x_get_arg removes the visibility parameter as a side effect,
2868 but x_create_frame still needs it. */
2869 /* Start up iconic or window? */
2870 x_wm_set_window_state
2871 (f
, (EQ (x_get_arg (dpyinfo
, parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
),
2877 x_text_icon (f
, (char *) SDATA ((!NILP (f
->icon_name
)
2884 /* Make the GCs needed for this window, setting the
2885 background, border and mouse colors; also create the
2886 mouse cursor and the gray border tile. */
2888 static char cursor_bits
[] =
2890 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2891 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2892 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2900 XGCValues gc_values
;
2904 /* Create the GCs of this frame.
2905 Note that many default values are used. */
2907 gc_values
.foreground
= FRAME_FOREGROUND_PIXEL (f
);
2908 gc_values
.background
= FRAME_BACKGROUND_PIXEL (f
);
2909 gc_values
.line_width
= 0; /* Means 1 using fast algorithm. */
2910 f
->output_data
.x
->normal_gc
2911 = XCreateGC (FRAME_X_DISPLAY (f
),
2913 GCLineWidth
| GCForeground
| GCBackground
,
2916 /* Reverse video style. */
2917 gc_values
.foreground
= FRAME_BACKGROUND_PIXEL (f
);
2918 gc_values
.background
= FRAME_FOREGROUND_PIXEL (f
);
2919 f
->output_data
.x
->reverse_gc
2920 = XCreateGC (FRAME_X_DISPLAY (f
),
2922 GCForeground
| GCBackground
| GCLineWidth
,
2925 /* Cursor has cursor-color background, background-color foreground. */
2926 gc_values
.foreground
= FRAME_BACKGROUND_PIXEL (f
);
2927 gc_values
.background
= f
->output_data
.x
->cursor_pixel
;
2928 gc_values
.fill_style
= FillOpaqueStippled
;
2929 f
->output_data
.x
->cursor_gc
2930 = XCreateGC (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2931 (GCForeground
| GCBackground
2932 | GCFillStyle
| GCLineWidth
),
2936 f
->output_data
.x
->white_relief
.gc
= 0;
2937 f
->output_data
.x
->black_relief
.gc
= 0;
2939 /* Create the gray border tile used when the pointer is not in
2940 the frame. Since this depends on the frame's pixel values,
2941 this must be done on a per-frame basis. */
2942 f
->output_data
.x
->border_tile
2943 = (XCreatePixmapFromBitmapData
2944 (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
2945 gray_bits
, gray_width
, gray_height
,
2946 FRAME_FOREGROUND_PIXEL (f
),
2947 FRAME_BACKGROUND_PIXEL (f
),
2948 DefaultDepth (FRAME_X_DISPLAY (f
), FRAME_X_SCREEN_NUMBER (f
))));
2954 /* Free what was allocated in x_make_gc. */
2960 Display
*dpy
= FRAME_X_DISPLAY (f
);
2964 if (f
->output_data
.x
->normal_gc
)
2966 XFreeGC (dpy
, f
->output_data
.x
->normal_gc
);
2967 f
->output_data
.x
->normal_gc
= 0;
2970 if (f
->output_data
.x
->reverse_gc
)
2972 XFreeGC (dpy
, f
->output_data
.x
->reverse_gc
);
2973 f
->output_data
.x
->reverse_gc
= 0;
2976 if (f
->output_data
.x
->cursor_gc
)
2978 XFreeGC (dpy
, f
->output_data
.x
->cursor_gc
);
2979 f
->output_data
.x
->cursor_gc
= 0;
2982 if (f
->output_data
.x
->border_tile
)
2984 XFreePixmap (dpy
, f
->output_data
.x
->border_tile
);
2985 f
->output_data
.x
->border_tile
= 0;
2992 /* Handler for signals raised during x_create_frame and
2993 x_create_top_frame. FRAME is the frame which is partially
2997 unwind_create_frame (frame
)
3000 struct frame
*f
= XFRAME (frame
);
3002 /* If frame is already dead, nothing to do. This can happen if the
3003 display is disconnected after the frame has become official, but
3004 before x_create_frame removes the unwind protect. */
3005 if (!FRAME_LIVE_P (f
))
3008 /* If frame is ``official'', nothing to do. */
3009 if (!CONSP (Vframe_list
) || !EQ (XCAR (Vframe_list
), frame
))
3012 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
3015 x_free_frame_resources (f
);
3018 /* Check that reference counts are indeed correct. */
3019 xassert (dpyinfo
->reference_count
== dpyinfo_refcount
);
3020 xassert (dpyinfo
->image_cache
->refcount
== image_cache_refcount
);
3030 x_default_font_parameter (f
, parms
)
3034 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
3035 Lisp_Object font_param
= x_get_arg (dpyinfo
, parms
, Qfont
, NULL
, NULL
,
3038 if (EQ (font_param
, Qunbound
))
3040 font
= !NILP (font_param
) ? font_param
3041 : x_get_arg (dpyinfo
, parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
3043 if (! STRINGP (font
))
3048 /* This will find the normal Xft font. */
3051 "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1",
3052 "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1",
3053 "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1",
3054 /* This was formerly the first thing tried, but it finds
3055 too many fonts and takes too long. */
3056 "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1",
3057 /* If those didn't work, look for something which will
3059 "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1",
3064 for (i
= 0; names
[i
]; i
++)
3066 font
= font_open_by_name (f
, names
[i
]);
3071 error ("No suitable font was found");
3073 else if (!NILP (font_param
))
3075 /* Remember the explicit font parameter, so we can re-apply it after
3076 we've applied the `default' face settings. */
3077 x_set_frame_parameters (f
, Fcons (Fcons (Qfont_param
, font_param
), Qnil
));
3079 x_default_parameter (f
, parms
, Qfont
, font
, "font", "Font", RES_TYPE_STRING
);
3083 DEFUN ("x-wm-set-size-hint", Fx_wm_set_size_hint
, Sx_wm_set_size_hint
,
3085 doc
: /* Send the size hints for frame FRAME to the window manager.
3086 If FRAME is nil, use the selected frame. */)
3092 frame
= selected_frame
;
3096 x_wm_set_size_hint (f
, 0, 0);
3101 DEFUN ("x-create-frame", Fx_create_frame
, Sx_create_frame
,
3103 doc
: /* Make a new X window, which is called a "frame" in Emacs terms.
3104 Return an Emacs frame object.
3105 PARMS is an alist of frame parameters.
3106 If the parameters specify that the frame should not have a minibuffer,
3107 and do not specify a specific minibuffer window to use,
3108 then `default-minibuffer-frame' must be a frame whose minibuffer can
3109 be shared by the new frame.
3111 This function is an internal primitive--use `make-frame' instead. */)
3116 Lisp_Object frame
, tem
;
3118 int minibuffer_only
= 0;
3119 long window_prompting
= 0;
3121 int count
= SPECPDL_INDEX ();
3122 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
3123 Lisp_Object display
;
3124 struct x_display_info
*dpyinfo
= NULL
;
3128 parms
= Fcopy_alist (parms
);
3130 /* Use this general default value to start with
3131 until we know if this frame has a specified name. */
3132 Vx_resource_name
= Vinvocation_name
;
3134 display
= x_get_arg (dpyinfo
, parms
, Qterminal
, 0, 0, RES_TYPE_NUMBER
);
3135 if (EQ (display
, Qunbound
))
3136 display
= x_get_arg (dpyinfo
, parms
, Qdisplay
, 0, 0, RES_TYPE_STRING
);
3137 if (EQ (display
, Qunbound
))
3139 dpyinfo
= check_x_display_info (display
);
3140 kb
= dpyinfo
->terminal
->kboard
;
3142 if (!dpyinfo
->terminal
->name
)
3143 error ("Terminal is not live, can't create new frames on it");
3145 name
= x_get_arg (dpyinfo
, parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
3147 && ! EQ (name
, Qunbound
)
3149 error ("Invalid frame name--not a string or nil");
3152 Vx_resource_name
= name
;
3154 /* See if parent window is specified. */
3155 parent
= x_get_arg (dpyinfo
, parms
, Qparent_id
, NULL
, NULL
, RES_TYPE_NUMBER
);
3156 if (EQ (parent
, Qunbound
))
3158 if (! NILP (parent
))
3159 CHECK_NUMBER (parent
);
3161 /* make_frame_without_minibuffer can run Lisp code and garbage collect. */
3162 /* No need to protect DISPLAY because that's not used after passing
3163 it to make_frame_without_minibuffer. */
3165 GCPRO4 (parms
, parent
, name
, frame
);
3166 tem
= x_get_arg (dpyinfo
, parms
, Qminibuffer
, "minibuffer", "Minibuffer",
3168 if (EQ (tem
, Qnone
) || NILP (tem
))
3169 f
= make_frame_without_minibuffer (Qnil
, kb
, display
);
3170 else if (EQ (tem
, Qonly
))
3172 f
= make_minibuffer_frame ();
3173 minibuffer_only
= 1;
3175 else if (WINDOWP (tem
))
3176 f
= make_frame_without_minibuffer (tem
, kb
, display
);
3180 XSETFRAME (frame
, f
);
3182 /* Note that X Windows does support scroll bars. */
3183 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 1;
3185 f
->terminal
= dpyinfo
->terminal
;
3186 f
->terminal
->reference_count
++;
3188 f
->output_method
= output_x_window
;
3189 f
->output_data
.x
= (struct x_output
*) xmalloc (sizeof (struct x_output
));
3190 bzero (f
->output_data
.x
, sizeof (struct x_output
));
3191 f
->output_data
.x
->icon_bitmap
= -1;
3192 FRAME_FONTSET (f
) = -1;
3193 f
->output_data
.x
->scroll_bar_foreground_pixel
= -1;
3194 f
->output_data
.x
->scroll_bar_background_pixel
= -1;
3195 #ifdef USE_TOOLKIT_SCROLL_BARS
3196 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
3197 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
3198 #endif /* USE_TOOLKIT_SCROLL_BARS */
3201 = x_get_arg (dpyinfo
, parms
, Qicon_name
, "iconName", "Title",
3203 if (! STRINGP (f
->icon_name
))
3204 f
->icon_name
= Qnil
;
3206 FRAME_X_DISPLAY_INFO (f
) = dpyinfo
;
3208 /* With FRAME_X_DISPLAY_INFO set up, this unwind-protect is safe. */
3209 record_unwind_protect (unwind_create_frame
, frame
);
3211 image_cache_refcount
= FRAME_IMAGE_CACHE (f
)->refcount
;
3212 dpyinfo_refcount
= dpyinfo
->reference_count
;
3213 #endif /* GLYPH_DEBUG */
3215 /* These colors will be set anyway later, but it's important
3216 to get the color reference counts right, so initialize them! */
3219 struct gcpro gcpro1
;
3221 /* Function x_decode_color can signal an error. Make
3222 sure to initialize color slots so that we won't try
3223 to free colors we haven't allocated. */
3224 FRAME_FOREGROUND_PIXEL (f
) = -1;
3225 FRAME_BACKGROUND_PIXEL (f
) = -1;
3226 f
->output_data
.x
->cursor_pixel
= -1;
3227 f
->output_data
.x
->cursor_foreground_pixel
= -1;
3228 f
->output_data
.x
->border_pixel
= -1;
3229 f
->output_data
.x
->mouse_pixel
= -1;
3231 black
= build_string ("black");
3233 FRAME_FOREGROUND_PIXEL (f
)
3234 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3235 FRAME_BACKGROUND_PIXEL (f
)
3236 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3237 f
->output_data
.x
->cursor_pixel
3238 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3239 f
->output_data
.x
->cursor_foreground_pixel
3240 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3241 f
->output_data
.x
->border_pixel
3242 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3243 f
->output_data
.x
->mouse_pixel
3244 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3248 /* Specify the parent under which to make this X window. */
3252 f
->output_data
.x
->parent_desc
= (Window
) XFASTINT (parent
);
3253 f
->output_data
.x
->explicit_parent
= 1;
3257 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
3258 f
->output_data
.x
->explicit_parent
= 0;
3261 /* Set the name; the functions to which we pass f expect the name to
3263 if (EQ (name
, Qunbound
) || NILP (name
))
3265 f
->name
= build_string (dpyinfo
->x_id_name
);
3266 f
->explicit_name
= 0;
3271 f
->explicit_name
= 1;
3272 /* use the frame's title when getting resources for this frame. */
3273 specbind (Qx_resource_name
, name
);
3276 f
->resx
= dpyinfo
->resx
;
3277 f
->resy
= dpyinfo
->resy
;
3279 #ifdef HAVE_FREETYPE
3281 register_font_driver (&xftfont_driver
, f
);
3282 #else /* not HAVE_XFT */
3283 register_font_driver (&ftxfont_driver
, f
);
3284 #endif /* not HAVE_XFT */
3285 #endif /* HAVE_FREETYPE */
3286 register_font_driver (&xfont_driver
, f
);
3288 x_default_parameter (f
, parms
, Qfont_backend
, Qnil
,
3289 "fontBackend", "FontBackend", RES_TYPE_STRING
);
3291 /* Extract the window parameters from the supplied values
3292 that are needed to determine window geometry. */
3293 x_default_font_parameter (f
, parms
);
3294 if (!FRAME_FONT (f
))
3296 delete_frame (frame
, Qnoelisp
);
3297 error ("Invalid frame font");
3301 /* Prevent lwlib/xlwmenu.c from crashing because of a bug
3302 whereby it fails to get any font. */
3303 xlwmenu_default_font
= XLoadQueryFont (FRAME_X_DISPLAY (f
), "fixed");
3306 /* Frame contents get displaced if an embedded X window has a border. */
3307 if (! FRAME_X_EMBEDDED_P (f
))
3308 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
3309 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
3311 /* This defaults to 1 in order to match xterm. We recognize either
3312 internalBorderWidth or internalBorder (which is what xterm calls
3314 if (NILP (Fassq (Qinternal_border_width
, parms
)))
3318 value
= x_get_arg (dpyinfo
, parms
, Qinternal_border_width
,
3319 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
3320 if (! EQ (value
, Qunbound
))
3321 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
3324 x_default_parameter (f
, parms
, Qinternal_border_width
,
3325 #ifdef USE_GTK /* We used to impose 0 in xg_create_frame_widgets. */
3330 "internalBorderWidth", "internalBorderWidth",
3332 x_default_parameter (f
, parms
, Qvertical_scroll_bars
, Qleft
,
3333 "verticalScrollBars", "ScrollBars",
3336 /* Also do the stuff which must be set before the window exists. */
3337 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
3338 "foreground", "Foreground", RES_TYPE_STRING
);
3339 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
3340 "background", "Background", RES_TYPE_STRING
);
3341 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
3342 "pointerColor", "Foreground", RES_TYPE_STRING
);
3343 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
3344 "cursorColor", "Foreground", RES_TYPE_STRING
);
3345 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
3346 "borderColor", "BorderColor", RES_TYPE_STRING
);
3347 x_default_parameter (f
, parms
, Qscreen_gamma
, Qnil
,
3348 "screenGamma", "ScreenGamma", RES_TYPE_FLOAT
);
3349 x_default_parameter (f
, parms
, Qline_spacing
, Qnil
,
3350 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER
);
3351 x_default_parameter (f
, parms
, Qleft_fringe
, Qnil
,
3352 "leftFringe", "LeftFringe", RES_TYPE_NUMBER
);
3353 x_default_parameter (f
, parms
, Qright_fringe
, Qnil
,
3354 "rightFringe", "RightFringe", RES_TYPE_NUMBER
);
3356 x_default_scroll_bar_color_parameter (f
, parms
, Qscroll_bar_foreground
,
3357 "scrollBarForeground",
3358 "ScrollBarForeground", 1);
3359 x_default_scroll_bar_color_parameter (f
, parms
, Qscroll_bar_background
,
3360 "scrollBarBackground",
3361 "ScrollBarBackground", 0);
3363 /* Init faces before x_default_parameter is called for scroll-bar
3364 parameters because that function calls x_set_scroll_bar_width,
3365 which calls change_frame_size, which calls Fset_window_buffer,
3366 which runs hooks, which call Fvertical_motion. At the end, we
3367 end up in init_iterator with a null face cache, which should not
3369 init_frame_faces (f
);
3371 x_default_parameter (f
, parms
, Qmenu_bar_lines
, make_number (1),
3372 "menuBar", "MenuBar", RES_TYPE_NUMBER
);
3373 x_default_parameter (f
, parms
, Qtool_bar_lines
, make_number (1),
3374 "toolBar", "ToolBar", RES_TYPE_NUMBER
);
3375 x_default_parameter (f
, parms
, Qbuffer_predicate
, Qnil
,
3376 "bufferPredicate", "BufferPredicate",
3378 x_default_parameter (f
, parms
, Qtitle
, Qnil
,
3379 "title", "Title", RES_TYPE_STRING
);
3380 x_default_parameter (f
, parms
, Qwait_for_wm
, Qt
,
3381 "waitForWM", "WaitForWM", RES_TYPE_BOOLEAN
);
3382 x_default_parameter (f
, parms
, Qfullscreen
, Qnil
,
3383 "fullscreen", "Fullscreen", RES_TYPE_SYMBOL
);
3385 /* Compute the size of the X window. */
3386 window_prompting
= x_figure_window_size (f
, parms
, 1);
3388 tem
= x_get_arg (dpyinfo
, parms
, Qunsplittable
, 0, 0, RES_TYPE_BOOLEAN
);
3389 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
3391 x_icon_verify (f
, parms
);
3393 /* Create the X widget or window. */
3394 #ifdef USE_X_TOOLKIT
3395 x_window (f
, window_prompting
, minibuffer_only
);
3403 /* Now consider the frame official. */
3404 FRAME_X_DISPLAY_INFO (f
)->reference_count
++;
3405 Vframe_list
= Fcons (frame
, Vframe_list
);
3407 /* We need to do this after creating the X window, so that the
3408 icon-creation functions can say whose icon they're describing. */
3409 x_default_parameter (f
, parms
, Qicon_type
, Qt
,
3410 "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL
);
3412 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
3413 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3414 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
3415 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3416 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
3417 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
3418 x_default_parameter (f
, parms
, Qscroll_bar_width
, Qnil
,
3419 "scrollBarWidth", "ScrollBarWidth",
3421 x_default_parameter (f
, parms
, Qalpha
, Qnil
,
3422 "alpha", "Alpha", RES_TYPE_NUMBER
);
3424 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
3425 Change will not be effected unless different from the current
3427 width
= FRAME_COLS (f
);
3428 height
= FRAME_LINES (f
);
3430 SET_FRAME_COLS (f
, 0);
3431 FRAME_LINES (f
) = 0;
3432 change_frame_size (f
, height
, width
, 1, 0, 0);
3434 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
3435 /* Create the menu bar. */
3436 if (!minibuffer_only
&& FRAME_EXTERNAL_MENU_BAR (f
))
3438 /* If this signals an error, we haven't set size hints for the
3439 frame and we didn't make it visible. */
3440 initialize_frame_menubar (f
);
3443 /* This is a no-op, except under Motif where it arranges the
3444 main window for the widgets on it. */
3445 lw_set_main_areas (f
->output_data
.x
->column_widget
,
3446 f
->output_data
.x
->menubar_widget
,
3447 f
->output_data
.x
->edit_widget
);
3448 #endif /* not USE_GTK */
3450 #endif /* USE_X_TOOLKIT || USE_GTK */
3452 /* Tell the server what size and position, etc, we want, and how
3453 badly we want them. This should be done after we have the menu
3454 bar so that its size can be taken into account. */
3456 x_wm_set_size_hint (f
, window_prompting
, 0);
3459 /* Make the window appear on the frame and enable display, unless
3460 the caller says not to. However, with explicit parent, Emacs
3461 cannot control visibility, so don't try. */
3462 if (! f
->output_data
.x
->explicit_parent
)
3464 Lisp_Object visibility
;
3466 visibility
= x_get_arg (dpyinfo
, parms
, Qvisibility
, 0, 0,
3468 if (EQ (visibility
, Qunbound
))
3471 if (EQ (visibility
, Qicon
))
3472 x_iconify_frame (f
);
3473 else if (! NILP (visibility
))
3474 x_make_frame_visible (f
);
3476 /* Must have been Qnil. */
3480 /* Set the WM leader property. GTK does this itself, so this is not
3481 needed when using GTK. */
3482 if (dpyinfo
->client_leader_window
!= 0)
3485 XChangeProperty (FRAME_X_DISPLAY (f
),
3486 FRAME_OUTER_WINDOW (f
),
3487 dpyinfo
->Xatom_wm_client_leader
,
3488 XA_WINDOW
, 32, PropModeReplace
,
3489 (unsigned char *) &dpyinfo
->client_leader_window
, 1);
3493 /* Initialize `default-minibuffer-frame' in case this is the first
3494 frame on this terminal. */
3495 if (FRAME_HAS_MINIBUF_P (f
)
3496 && (!FRAMEP (kb
->Vdefault_minibuffer_frame
)
3497 || !FRAME_LIVE_P (XFRAME (kb
->Vdefault_minibuffer_frame
))))
3498 kb
->Vdefault_minibuffer_frame
= frame
;
3500 /* All remaining specified parameters, which have not been "used"
3501 by x_get_arg and friends, now go in the misc. alist of the frame. */
3502 for (tem
= parms
; CONSP (tem
); tem
= XCDR (tem
))
3503 if (CONSP (XCAR (tem
)) && !NILP (XCAR (XCAR (tem
))))
3504 f
->param_alist
= Fcons (XCAR (tem
), f
->param_alist
);
3508 /* Make sure windows on this frame appear in calls to next-window
3509 and similar functions. */
3510 Vwindow_list
= Qnil
;
3512 return unbind_to (count
, frame
);
3516 /* FRAME is used only to get a handle on the X display. We don't pass the
3517 display info directly because we're called from frame.c, which doesn't
3518 know about that structure. */
3521 x_get_focus_frame (frame
)
3522 struct frame
*frame
;
3524 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (frame
);
3526 if (! dpyinfo
->x_focus_frame
)
3529 XSETFRAME (xfocus
, dpyinfo
->x_focus_frame
);
3534 /* In certain situations, when the window manager follows a
3535 click-to-focus policy, there seems to be no way around calling
3536 XSetInputFocus to give another frame the input focus .
3538 In an ideal world, XSetInputFocus should generally be avoided so
3539 that applications don't interfere with the window manager's focus
3540 policy. But I think it's okay to use when it's clearly done
3541 following a user-command. */
3543 DEFUN ("x-focus-frame", Fx_focus_frame
, Sx_focus_frame
, 1, 1, 0,
3544 doc
: /* Set the input focus to FRAME.
3545 FRAME nil means use the selected frame. */)
3549 struct frame
*f
= check_x_frame (frame
);
3550 Display
*dpy
= FRAME_X_DISPLAY (f
);
3553 x_catch_errors (dpy
);
3554 XSetInputFocus (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
3555 RevertToParent
, CurrentTime
);
3556 x_ewmh_activate_frame (f
);
3557 x_uncatch_errors ();
3564 DEFUN ("xw-color-defined-p", Fxw_color_defined_p
, Sxw_color_defined_p
, 1, 2, 0,
3565 doc
: /* Internal function called by `color-defined-p', which see. */)
3567 Lisp_Object color
, frame
;
3570 FRAME_PTR f
= check_x_frame (frame
);
3572 CHECK_STRING (color
);
3574 if (x_defined_color (f
, SDATA (color
), &foo
, 0))
3580 DEFUN ("xw-color-values", Fxw_color_values
, Sxw_color_values
, 1, 2, 0,
3581 doc
: /* Internal function called by `color-values', which see. */)
3583 Lisp_Object color
, frame
;
3586 FRAME_PTR f
= check_x_frame (frame
);
3588 CHECK_STRING (color
);
3590 if (x_defined_color (f
, SDATA (color
), &foo
, 0))
3591 return list3 (make_number (foo
.red
),
3592 make_number (foo
.green
),
3593 make_number (foo
.blue
));
3598 DEFUN ("xw-display-color-p", Fxw_display_color_p
, Sxw_display_color_p
, 0, 1, 0,
3599 doc
: /* Internal function called by `display-color-p', which see. */)
3601 Lisp_Object terminal
;
3603 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3605 if (dpyinfo
->n_planes
<= 2)
3608 switch (dpyinfo
->visual
->class)
3621 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p
, Sx_display_grayscale_p
,
3623 doc
: /* Return t if the X display supports shades of gray.
3624 Note that color displays do support shades of gray.
3625 The optional argument TERMINAL specifies which display to ask about.
3626 TERMINAL should be a terminal object, a frame or a display name (a string).
3627 If omitted or nil, that stands for the selected frame's display. */)
3629 Lisp_Object terminal
;
3631 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3633 if (dpyinfo
->n_planes
<= 1)
3636 switch (dpyinfo
->visual
->class)
3651 DEFUN ("x-display-pixel-width", Fx_display_pixel_width
, Sx_display_pixel_width
,
3653 doc
: /* Return the width in pixels of the X display TERMINAL.
3654 The optional argument TERMINAL specifies which display to ask about.
3655 TERMINAL should be a terminal object, a frame or a display name (a string).
3656 If omitted or nil, that stands for the selected frame's display. */)
3658 Lisp_Object terminal
;
3660 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3662 return make_number (x_display_pixel_width (dpyinfo
));
3665 DEFUN ("x-display-pixel-height", Fx_display_pixel_height
,
3666 Sx_display_pixel_height
, 0, 1, 0,
3667 doc
: /* Return the height in pixels of the X display TERMINAL.
3668 The optional argument TERMINAL specifies which display to ask about.
3669 TERMINAL should be a terminal object, a frame or a display name (a string).
3670 If omitted or nil, that stands for the selected frame's display. */)
3672 Lisp_Object terminal
;
3674 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3676 return make_number (x_display_pixel_height (dpyinfo
));
3679 DEFUN ("x-display-planes", Fx_display_planes
, Sx_display_planes
,
3681 doc
: /* Return the number of bitplanes of the X display TERMINAL.
3682 The optional argument TERMINAL specifies which display to ask about.
3683 TERMINAL should be a terminal object, a frame or a display name (a string).
3684 If omitted or nil, that stands for the selected frame's display. */)
3686 Lisp_Object terminal
;
3688 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3690 return make_number (dpyinfo
->n_planes
);
3693 DEFUN ("x-display-color-cells", Fx_display_color_cells
, Sx_display_color_cells
,
3695 doc
: /* Return the number of color cells of the X display TERMINAL.
3696 The optional argument TERMINAL specifies which display to ask about.
3697 TERMINAL should be a terminal object, a frame or a display name (a string).
3698 If omitted or nil, that stands for the selected frame's display. */)
3700 Lisp_Object terminal
;
3702 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3704 int nr_planes
= DisplayPlanes (dpyinfo
->display
,
3705 XScreenNumberOfScreen (dpyinfo
->screen
));
3707 /* Truncate nr_planes to 24 to avoid integer overflow.
3708 Some displays says 32, but only 24 bits are actually significant.
3709 There are only very few and rare video cards that have more than
3710 24 significant bits. Also 24 bits is more than 16 million colors,
3711 it "should be enough for everyone". */
3712 if (nr_planes
> 24) nr_planes
= 24;
3714 return make_number (1 << nr_planes
);
3717 DEFUN ("x-server-max-request-size", Fx_server_max_request_size
,
3718 Sx_server_max_request_size
,
3720 doc
: /* Return the maximum request size of the X server of display TERMINAL.
3721 The optional argument TERMINAL specifies which display to ask about.
3722 TERMINAL should be a terminal object, a frame or a display name (a string).
3723 If omitted or nil, that stands for the selected frame's display. */)
3725 Lisp_Object terminal
;
3727 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3729 return make_number (MAXREQUEST (dpyinfo
->display
));
3732 DEFUN ("x-server-vendor", Fx_server_vendor
, Sx_server_vendor
, 0, 1, 0,
3733 doc
: /* Return the "vendor ID" string of the X server of display TERMINAL.
3734 \(Labelling every distributor as a "vendor" embodies the false assumption
3735 that operating systems cannot be developed and distributed noncommercially.)
3736 The optional argument TERMINAL specifies which display to ask about.
3737 TERMINAL should be a terminal object, a frame or a display name (a string).
3738 If omitted or nil, that stands for the selected frame's display. */)
3740 Lisp_Object terminal
;
3742 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3743 char *vendor
= ServerVendor (dpyinfo
->display
);
3745 if (! vendor
) vendor
= "";
3746 return build_string (vendor
);
3749 DEFUN ("x-server-version", Fx_server_version
, Sx_server_version
, 0, 1, 0,
3750 doc
: /* Return the version numbers of the X server of display TERMINAL.
3751 The value is a list of three integers: the major and minor
3752 version numbers of the X Protocol in use, and the distributor-specific release
3753 number. See also the function `x-server-vendor'.
3755 The optional argument TERMINAL specifies which display to ask about.
3756 TERMINAL should be a terminal object, a frame or a display name (a string).
3757 If omitted or nil, that stands for the selected frame's display. */)
3759 Lisp_Object terminal
;
3761 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3762 Display
*dpy
= dpyinfo
->display
;
3764 return Fcons (make_number (ProtocolVersion (dpy
)),
3765 Fcons (make_number (ProtocolRevision (dpy
)),
3766 Fcons (make_number (VendorRelease (dpy
)), Qnil
)));
3769 DEFUN ("x-display-screens", Fx_display_screens
, Sx_display_screens
, 0, 1, 0,
3770 doc
: /* Return the number of screens on the X server of display TERMINAL.
3771 The optional argument TERMINAL specifies which display to ask about.
3772 TERMINAL should be a terminal object, a frame or a display name (a string).
3773 If omitted or nil, that stands for the selected frame's display. */)
3775 Lisp_Object terminal
;
3777 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3779 return make_number (ScreenCount (dpyinfo
->display
));
3782 DEFUN ("x-display-mm-height", Fx_display_mm_height
, Sx_display_mm_height
, 0, 1, 0,
3783 doc
: /* Return the height in millimeters of the X display TERMINAL.
3784 The optional argument TERMINAL specifies which display to ask about.
3785 TERMINAL should be a terminal object, a frame or a display name (a string).
3786 If omitted or nil, that stands for the selected frame's display. */)
3788 Lisp_Object terminal
;
3790 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3792 return make_number (HeightMMOfScreen (dpyinfo
->screen
));
3795 DEFUN ("x-display-mm-width", Fx_display_mm_width
, Sx_display_mm_width
, 0, 1, 0,
3796 doc
: /* Return the width in millimeters of the X display TERMINAL.
3797 The optional argument TERMINAL specifies which display to ask about.
3798 TERMINAL should be a terminal object, a frame or a display name (a string).
3799 If omitted or nil, that stands for the selected frame's display. */)
3801 Lisp_Object terminal
;
3803 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3805 return make_number (WidthMMOfScreen (dpyinfo
->screen
));
3808 DEFUN ("x-display-backing-store", Fx_display_backing_store
,
3809 Sx_display_backing_store
, 0, 1, 0,
3810 doc
: /* Return an indication of whether X display TERMINAL does backing store.
3811 The value may be `always', `when-mapped', or `not-useful'.
3812 The optional argument TERMINAL specifies which display to ask about.
3813 TERMINAL should be a terminal object, a frame or a display name (a string).
3814 If omitted or nil, that stands for the selected frame's display. */)
3816 Lisp_Object terminal
;
3818 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3821 switch (DoesBackingStore (dpyinfo
->screen
))
3824 result
= intern ("always");
3828 result
= intern ("when-mapped");
3832 result
= intern ("not-useful");
3836 error ("Strange value for BackingStore parameter of screen");
3843 DEFUN ("x-display-visual-class", Fx_display_visual_class
,
3844 Sx_display_visual_class
, 0, 1, 0,
3845 doc
: /* Return the visual class of the X display TERMINAL.
3846 The value is one of the symbols `static-gray', `gray-scale',
3847 `static-color', `pseudo-color', `true-color', or `direct-color'.
3849 The optional argument TERMINAL specifies which display to ask about.
3850 TERMINAL should a terminal object, a frame or a display name (a string).
3851 If omitted or nil, that stands for the selected frame's display. */)
3853 Lisp_Object terminal
;
3855 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3858 switch (dpyinfo
->visual
->class)
3861 result
= intern ("static-gray");
3864 result
= intern ("gray-scale");
3867 result
= intern ("static-color");
3870 result
= intern ("pseudo-color");
3873 result
= intern ("true-color");
3876 result
= intern ("direct-color");
3879 error ("Display has an unknown visual class");
3886 DEFUN ("x-display-save-under", Fx_display_save_under
,
3887 Sx_display_save_under
, 0, 1, 0,
3888 doc
: /* Return t if the X display TERMINAL supports the save-under feature.
3889 The optional argument TERMINAL specifies which display to ask about.
3890 TERMINAL should be a terminal object, a frame or a display name (a string).
3891 If omitted or nil, that stands for the selected frame's display. */)
3893 Lisp_Object terminal
;
3895 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3897 if (DoesSaveUnders (dpyinfo
->screen
) == True
)
3905 register struct frame
*f
;
3907 return FRAME_PIXEL_WIDTH (f
);
3912 register struct frame
*f
;
3914 return FRAME_PIXEL_HEIGHT (f
);
3919 register struct frame
*f
;
3921 return FRAME_COLUMN_WIDTH (f
);
3926 register struct frame
*f
;
3928 return FRAME_LINE_HEIGHT (f
);
3933 register struct frame
*f
;
3935 return FRAME_X_DISPLAY_INFO (f
)->n_planes
;
3940 /************************************************************************
3942 ************************************************************************/
3945 /* Mapping visual names to visuals. */
3947 static struct visual_class
3954 {"StaticGray", StaticGray
},
3955 {"GrayScale", GrayScale
},
3956 {"StaticColor", StaticColor
},
3957 {"PseudoColor", PseudoColor
},
3958 {"TrueColor", TrueColor
},
3959 {"DirectColor", DirectColor
},
3964 #ifndef HAVE_XSCREENNUMBEROFSCREEN
3966 /* Value is the screen number of screen SCR. This is a substitute for
3967 the X function with the same name when that doesn't exist. */
3970 XScreenNumberOfScreen (scr
)
3971 register Screen
*scr
;
3973 Display
*dpy
= scr
->display
;
3976 for (i
= 0; i
< dpy
->nscreens
; ++i
)
3977 if (scr
== dpy
->screens
+ i
)
3983 #endif /* not HAVE_XSCREENNUMBEROFSCREEN */
3986 /* Select the visual that should be used on display DPYINFO. Set
3987 members of DPYINFO appropriately. Called from x_term_init. */
3990 select_visual (dpyinfo
)
3991 struct x_display_info
*dpyinfo
;
3993 Display
*dpy
= dpyinfo
->display
;
3994 Screen
*screen
= dpyinfo
->screen
;
3997 /* See if a visual is specified. */
3998 value
= display_x_get_resource (dpyinfo
,
3999 build_string ("visualClass"),
4000 build_string ("VisualClass"),
4002 if (STRINGP (value
))
4004 /* VALUE should be of the form CLASS-DEPTH, where CLASS is one
4005 of `PseudoColor', `TrueColor' etc. and DEPTH is the color
4006 depth, a decimal number. NAME is compared with case ignored. */
4007 char *s
= (char *) alloca (SBYTES (value
) + 1);
4012 strcpy (s
, SDATA (value
));
4013 dash
= index (s
, '-');
4016 dpyinfo
->n_planes
= atoi (dash
+ 1);
4020 /* We won't find a matching visual with depth 0, so that
4021 an error will be printed below. */
4022 dpyinfo
->n_planes
= 0;
4024 /* Determine the visual class. */
4025 for (i
= 0; visual_classes
[i
].name
; ++i
)
4026 if (xstrcasecmp (s
, visual_classes
[i
].name
) == 0)
4028 class = visual_classes
[i
].class;
4032 /* Look up a matching visual for the specified class. */
4034 || !XMatchVisualInfo (dpy
, XScreenNumberOfScreen (screen
),
4035 dpyinfo
->n_planes
, class, &vinfo
))
4036 fatal ("Invalid visual specification `%s'", SDATA (value
));
4038 dpyinfo
->visual
= vinfo
.visual
;
4043 XVisualInfo
*vinfo
, vinfo_template
;
4045 dpyinfo
->visual
= DefaultVisualOfScreen (screen
);
4047 vinfo_template
.visualid
= XVisualIDFromVisual (dpyinfo
->visual
);
4048 vinfo_template
.screen
= XScreenNumberOfScreen (screen
);
4049 vinfo
= XGetVisualInfo (dpy
, VisualIDMask
| VisualScreenMask
,
4050 &vinfo_template
, &n_visuals
);
4052 fatal ("Can't get proper X visual info");
4054 dpyinfo
->n_planes
= vinfo
->depth
;
4055 XFree ((char *) vinfo
);
4060 /* Return the X display structure for the display named NAME.
4061 Open a new connection if necessary. */
4063 struct x_display_info
*
4064 x_display_info_for_name (name
)
4068 struct x_display_info
*dpyinfo
;
4070 CHECK_STRING (name
);
4073 if (! EQ (Vinitial_window_system
, intern ("x")))
4074 error ("Not using X Windows"); /* That doesn't stop us anymore. */
4077 for (dpyinfo
= x_display_list
, names
= x_display_name_list
;
4079 dpyinfo
= dpyinfo
->next
, names
= XCDR (names
))
4082 tem
= Fstring_equal (XCAR (XCAR (names
)), name
);
4087 /* Use this general default value to start with. */
4088 Vx_resource_name
= Vinvocation_name
;
4090 validate_x_resource_name ();
4092 dpyinfo
= x_term_init (name
, (char *)0,
4093 (char *) SDATA (Vx_resource_name
));
4096 error ("Cannot connect to X server %s", SDATA (name
));
4099 XSETFASTINT (Vwindow_system_version
, 11);
4105 DEFUN ("x-open-connection", Fx_open_connection
, Sx_open_connection
,
4107 doc
: /* Open a connection to an X server.
4108 DISPLAY is the name of the display to connect to.
4109 Optional second arg XRM-STRING is a string of resources in xrdb format.
4110 If the optional third arg MUST-SUCCEED is non-nil,
4111 terminate Emacs if we can't open the connection. */)
4112 (display
, xrm_string
, must_succeed
)
4113 Lisp_Object display
, xrm_string
, must_succeed
;
4115 unsigned char *xrm_option
;
4116 struct x_display_info
*dpyinfo
;
4118 CHECK_STRING (display
);
4119 if (! NILP (xrm_string
))
4120 CHECK_STRING (xrm_string
);
4123 if (! EQ (Vinitial_window_system
, intern ("x")))
4124 error ("Not using X Windows"); /* That doesn't stop us anymore. */
4127 if (! NILP (xrm_string
))
4128 xrm_option
= (unsigned char *) SDATA (xrm_string
);
4130 xrm_option
= (unsigned char *) 0;
4132 validate_x_resource_name ();
4134 /* This is what opens the connection and sets x_current_display.
4135 This also initializes many symbols, such as those used for input. */
4136 dpyinfo
= x_term_init (display
, xrm_option
,
4137 (char *) SDATA (Vx_resource_name
));
4141 if (!NILP (must_succeed
))
4142 fatal ("Cannot connect to X server %s.\n\
4143 Check the DISPLAY environment variable or use `-d'.\n\
4144 Also use the `xauth' program to verify that you have the proper\n\
4145 authorization information needed to connect the X server.\n\
4146 An insecure way to solve the problem may be to use `xhost'.\n",
4149 error ("Cannot connect to X server %s", SDATA (display
));
4154 XSETFASTINT (Vwindow_system_version
, 11);
4158 DEFUN ("x-close-connection", Fx_close_connection
,
4159 Sx_close_connection
, 1, 1, 0,
4160 doc
: /* Close the connection to TERMINAL's X server.
4161 For TERMINAL, specify a terminal object, a frame or a display name (a
4162 string). If TERMINAL is nil, that stands for the selected frame's
4165 Lisp_Object terminal
;
4167 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
4169 if (dpyinfo
->reference_count
> 0)
4170 error ("Display still has frames on it");
4172 x_delete_terminal (dpyinfo
->terminal
);
4177 DEFUN ("x-display-list", Fx_display_list
, Sx_display_list
, 0, 0, 0,
4178 doc
: /* Return the list of display names that Emacs has connections to. */)
4181 Lisp_Object tail
, result
;
4184 for (tail
= x_display_name_list
; CONSP (tail
); tail
= XCDR (tail
))
4185 result
= Fcons (XCAR (XCAR (tail
)), result
);
4190 DEFUN ("x-synchronize", Fx_synchronize
, Sx_synchronize
, 1, 2, 0,
4191 doc
: /* If ON is non-nil, report X errors as soon as the erring request is made.
4192 If ON is nil, allow buffering of requests.
4193 Turning on synchronization prohibits the Xlib routines from buffering
4194 requests and seriously degrades performance, but makes debugging much
4196 The optional second argument TERMINAL specifies which display to act on.
4197 TERMINAL should be a terminal object, a frame or a display name (a string).
4198 If TERMINAL is omitted or nil, that stands for the selected frame's display. */)
4200 Lisp_Object terminal
, on
;
4202 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
4204 XSynchronize (dpyinfo
->display
, !EQ (on
, Qnil
));
4209 /* Wait for responses to all X commands issued so far for frame F. */
4216 XSync (FRAME_X_DISPLAY (f
), False
);
4221 /***********************************************************************
4223 ***********************************************************************/
4225 DEFUN ("x-change-window-property", Fx_change_window_property
,
4226 Sx_change_window_property
, 2, 6, 0,
4227 doc
: /* Change window property PROP to VALUE on the X window of FRAME.
4228 PROP must be a string.
4229 VALUE may be a string or a list of conses, numbers and/or strings.
4230 If an element in the list is a string, it is converted to
4231 an Atom and the value of the Atom is used. If an element is a cons,
4232 it is converted to a 32 bit number where the car is the 16 top bits and the
4233 cdr is the lower 16 bits.
4234 FRAME nil or omitted means use the selected frame.
4235 If TYPE is given and non-nil, it is the name of the type of VALUE.
4236 If TYPE is not given or nil, the type is STRING.
4237 FORMAT gives the size in bits of each element if VALUE is a list.
4238 It must be one of 8, 16 or 32.
4239 If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
4240 If OUTER_P is non-nil, the property is changed for the outer X window of
4241 FRAME. Default is to change on the edit X window.
4244 (prop
, value
, frame
, type
, format
, outer_p
)
4245 Lisp_Object prop
, value
, frame
, type
, format
, outer_p
;
4247 struct frame
*f
= check_x_frame (frame
);
4249 Atom target_type
= XA_STRING
;
4250 int element_format
= 8;
4251 unsigned char *data
;
4255 CHECK_STRING (prop
);
4257 if (! NILP (format
))
4259 CHECK_NUMBER (format
);
4260 element_format
= XFASTINT (format
);
4262 if (element_format
!= 8 && element_format
!= 16
4263 && element_format
!= 32)
4264 error ("FORMAT must be one of 8, 16 or 32");
4269 nelements
= x_check_property_data (value
);
4270 if (nelements
== -1)
4271 error ("Bad data in VALUE, must be number, string or cons");
4273 if (element_format
== 8)
4274 data
= (unsigned char *) xmalloc (nelements
);
4275 else if (element_format
== 16)
4276 data
= (unsigned char *) xmalloc (nelements
*2);
4277 else /* format == 32 */
4278 /* The man page for XChangeProperty:
4279 "If the specified format is 32, the property data must be a
4281 This applies even if long is more than 64 bits. The X library
4282 converts to 32 bits before sending to the X server. */
4283 data
= (unsigned char *) xmalloc (nelements
* sizeof(long));
4285 x_fill_property_data (FRAME_X_DISPLAY (f
), value
, data
, element_format
);
4289 CHECK_STRING (value
);
4290 data
= SDATA (value
);
4291 nelements
= SCHARS (value
);
4295 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4298 CHECK_STRING (type
);
4299 target_type
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (type
), False
);
4302 if (! NILP (outer_p
)) w
= FRAME_OUTER_WINDOW (f
);
4303 else w
= FRAME_X_WINDOW (f
);
4305 XChangeProperty (FRAME_X_DISPLAY (f
), w
,
4306 prop_atom
, target_type
, element_format
, PropModeReplace
,
4309 if (CONSP (value
)) xfree (data
);
4311 /* Make sure the property is set when we return. */
4312 XFlush (FRAME_X_DISPLAY (f
));
4319 DEFUN ("x-delete-window-property", Fx_delete_window_property
,
4320 Sx_delete_window_property
, 1, 2, 0,
4321 doc
: /* Remove window property PROP from X window of FRAME.
4322 FRAME nil or omitted means use the selected frame. Value is PROP. */)
4324 Lisp_Object prop
, frame
;
4326 struct frame
*f
= check_x_frame (frame
);
4329 CHECK_STRING (prop
);
4331 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4332 XDeleteProperty (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), prop_atom
);
4334 /* Make sure the property is removed when we return. */
4335 XFlush (FRAME_X_DISPLAY (f
));
4342 DEFUN ("x-window-property", Fx_window_property
, Sx_window_property
,
4344 doc
: /* Value is the value of window property PROP on FRAME.
4345 If FRAME is nil or omitted, use the selected frame.
4346 If TYPE is nil or omitted, get the property as a string. Otherwise TYPE
4347 is the name of the Atom that denotes the type expected.
4348 If SOURCE is non-nil, get the property on that window instead of from
4349 FRAME. The number 0 denotes the root window.
4350 If DELETE_P is non-nil, delete the property after retreiving it.
4351 If VECTOR_RET_P is non-nil, don't return a string but a vector of values.
4353 Value is nil if FRAME hasn't a property with name PROP or if PROP has
4354 no value of TYPE. */)
4355 (prop
, frame
, type
, source
, delete_p
, vector_ret_p
)
4356 Lisp_Object prop
, frame
, type
, source
, delete_p
, vector_ret_p
;
4358 struct frame
*f
= check_x_frame (frame
);
4361 Lisp_Object prop_value
= Qnil
;
4362 unsigned char *tmp_data
= NULL
;
4364 Atom target_type
= XA_STRING
;
4366 unsigned long actual_size
, bytes_remaining
;
4367 Window target_window
= FRAME_X_WINDOW (f
);
4368 struct gcpro gcpro1
;
4370 GCPRO1 (prop_value
);
4371 CHECK_STRING (prop
);
4373 if (! NILP (source
))
4375 if (NUMBERP (source
))
4377 if (FLOATP (source
))
4378 target_window
= (Window
) XFLOAT (source
);
4380 target_window
= XFASTINT (source
);
4382 if (target_window
== 0)
4383 target_window
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4385 else if (CONSP (source
))
4386 target_window
= cons_to_long (source
);
4392 if (strcmp ("AnyPropertyType", SDATA (type
)) == 0)
4393 target_type
= AnyPropertyType
;
4395 target_type
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (type
), False
);
4398 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4399 rc
= XGetWindowProperty (FRAME_X_DISPLAY (f
), target_window
,
4400 prop_atom
, 0, 0, False
, target_type
,
4401 &actual_type
, &actual_format
, &actual_size
,
4402 &bytes_remaining
, &tmp_data
);
4405 int size
= bytes_remaining
;
4410 rc
= XGetWindowProperty (FRAME_X_DISPLAY (f
), target_window
,
4411 prop_atom
, 0, bytes_remaining
,
4412 ! NILP (delete_p
), target_type
,
4413 &actual_type
, &actual_format
,
4414 &actual_size
, &bytes_remaining
,
4416 if (rc
== Success
&& tmp_data
)
4418 /* The man page for XGetWindowProperty says:
4419 "If the returned format is 32, the returned data is represented
4420 as a long array and should be cast to that type to obtain the
4422 This applies even if long is more than 32 bits, the X library
4423 converts from 32 bit elements received from the X server to long
4424 and passes the long array to us. Thus, for that case bcopy can not
4425 be used. We convert to a 32 bit type here, because so much code
4428 The bytes and offsets passed to XGetWindowProperty refers to the
4429 property and those are indeed in 32 bit quantities if format is
4432 if (actual_format
== 32 && actual_format
< BITS_PER_LONG
)
4435 int *idata
= (int *) tmp_data
;
4436 long *ldata
= (long *) tmp_data
;
4438 for (i
= 0; i
< actual_size
; ++i
)
4439 idata
[i
] = (int) ldata
[i
];
4442 if (NILP (vector_ret_p
))
4443 prop_value
= make_string (tmp_data
, size
);
4445 prop_value
= x_property_data_to_lisp (f
,
4452 if (tmp_data
) XFree (tmp_data
);
4462 /***********************************************************************
4464 ***********************************************************************/
4466 /* Timer function of hourglass_atimer. TIMER is equal to
4469 Display an hourglass pointer on all frames by mapping the frames'
4470 hourglass_window. Set the hourglass_p flag in the frames'
4471 output_data.x structure to indicate that an hourglass cursor is
4472 shown on the frames. */
4475 show_hourglass (timer
)
4476 struct atimer
*timer
;
4478 /* The timer implementation will cancel this timer automatically
4479 after this function has run. Set hourglass_atimer to null
4480 so that we know the timer doesn't have to be canceled. */
4481 hourglass_atimer
= NULL
;
4483 if (!hourglass_shown_p
)
4485 Lisp_Object rest
, frame
;
4489 FOR_EACH_FRAME (rest
, frame
)
4491 struct frame
*f
= XFRAME (frame
);
4493 if (FRAME_LIVE_P (f
) && FRAME_X_P (f
) && FRAME_X_DISPLAY (f
))
4495 Display
*dpy
= FRAME_X_DISPLAY (f
);
4497 #ifdef USE_X_TOOLKIT
4498 if (f
->output_data
.x
->widget
)
4500 if (FRAME_OUTER_WINDOW (f
))
4503 f
->output_data
.x
->hourglass_p
= 1;
4505 if (!f
->output_data
.x
->hourglass_window
)
4507 unsigned long mask
= CWCursor
;
4508 XSetWindowAttributes attrs
;
4510 Window parent
= FRAME_X_WINDOW (f
);
4512 Window parent
= FRAME_OUTER_WINDOW (f
);
4514 attrs
.cursor
= f
->output_data
.x
->hourglass_cursor
;
4516 f
->output_data
.x
->hourglass_window
4517 = XCreateWindow (dpy
, parent
,
4518 0, 0, 32000, 32000, 0, 0,
4524 XMapRaised (dpy
, f
->output_data
.x
->hourglass_window
);
4530 hourglass_shown_p
= 1;
4536 /* Hide the hourglass pointer on all frames, if it is currently
4542 if (hourglass_shown_p
)
4544 Lisp_Object rest
, frame
;
4547 FOR_EACH_FRAME (rest
, frame
)
4549 struct frame
*f
= XFRAME (frame
);
4552 /* Watch out for newly created frames. */
4553 && f
->output_data
.x
->hourglass_window
)
4555 XUnmapWindow (FRAME_X_DISPLAY (f
),
4556 f
->output_data
.x
->hourglass_window
);
4557 /* Sync here because XTread_socket looks at the
4558 hourglass_p flag that is reset to zero below. */
4559 XSync (FRAME_X_DISPLAY (f
), False
);
4560 f
->output_data
.x
->hourglass_p
= 0;
4564 hourglass_shown_p
= 0;
4571 /***********************************************************************
4573 ***********************************************************************/
4575 static Lisp_Object x_create_tip_frame
P_ ((struct x_display_info
*,
4576 Lisp_Object
, Lisp_Object
));
4577 static void compute_tip_xy
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
,
4578 Lisp_Object
, int, int, int *, int *));
4580 /* The frame of a currently visible tooltip. */
4582 Lisp_Object tip_frame
;
4584 /* If non-nil, a timer started that hides the last tooltip when it
4587 Lisp_Object tip_timer
;
4590 /* If non-nil, a vector of 3 elements containing the last args
4591 with which x-show-tip was called. See there. */
4593 Lisp_Object last_show_tip_args
;
4595 /* Maximum size for tooltips; a cons (COLUMNS . ROWS). */
4597 Lisp_Object Vx_max_tooltip_size
;
4601 unwind_create_tip_frame (frame
)
4604 Lisp_Object deleted
;
4606 deleted
= unwind_create_frame (frame
);
4607 if (EQ (deleted
, Qt
))
4617 /* Create a frame for a tooltip on the display described by DPYINFO.
4618 PARMS is a list of frame parameters. TEXT is the string to
4619 display in the tip frame. Value is the frame.
4621 Note that functions called here, esp. x_default_parameter can
4622 signal errors, for instance when a specified color name is
4623 undefined. We have to make sure that we're in a consistent state
4624 when this happens. */
4627 x_create_tip_frame (dpyinfo
, parms
, text
)
4628 struct x_display_info
*dpyinfo
;
4629 Lisp_Object parms
, text
;
4632 Lisp_Object frame
, tem
;
4634 long window_prompting
= 0;
4636 int count
= SPECPDL_INDEX ();
4637 struct gcpro gcpro1
, gcpro2
, gcpro3
;
4638 int face_change_count_before
= face_change_count
;
4640 struct buffer
*old_buffer
;
4644 if (!dpyinfo
->terminal
->name
)
4645 error ("Terminal is not live, can't create new frames on it");
4647 parms
= Fcopy_alist (parms
);
4649 /* Get the name of the frame to use for resource lookup. */
4650 name
= x_get_arg (dpyinfo
, parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
4652 && !EQ (name
, Qunbound
)
4654 error ("Invalid frame name--not a string or nil");
4657 GCPRO3 (parms
, name
, frame
);
4659 XSETFRAME (frame
, f
);
4661 buffer
= Fget_buffer_create (build_string (" *tip*"));
4662 Fset_window_buffer (FRAME_ROOT_WINDOW (f
), buffer
, Qnil
);
4663 old_buffer
= current_buffer
;
4664 set_buffer_internal_1 (XBUFFER (buffer
));
4665 current_buffer
->truncate_lines
= Qnil
;
4666 specbind (Qinhibit_read_only
, Qt
);
4667 specbind (Qinhibit_modification_hooks
, Qt
);
4670 set_buffer_internal_1 (old_buffer
);
4672 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 0;
4673 record_unwind_protect (unwind_create_tip_frame
, frame
);
4675 f
->terminal
= dpyinfo
->terminal
;
4676 f
->terminal
->reference_count
++;
4678 /* By setting the output method, we're essentially saying that
4679 the frame is live, as per FRAME_LIVE_P. If we get a signal
4680 from this point on, x_destroy_window might screw up reference
4682 f
->output_method
= output_x_window
;
4683 f
->output_data
.x
= (struct x_output
*) xmalloc (sizeof (struct x_output
));
4684 bzero (f
->output_data
.x
, sizeof (struct x_output
));
4685 f
->output_data
.x
->icon_bitmap
= -1;
4686 FRAME_FONTSET (f
) = -1;
4687 f
->output_data
.x
->scroll_bar_foreground_pixel
= -1;
4688 f
->output_data
.x
->scroll_bar_background_pixel
= -1;
4689 #ifdef USE_TOOLKIT_SCROLL_BARS
4690 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
4691 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
4692 #endif /* USE_TOOLKIT_SCROLL_BARS */
4693 f
->icon_name
= Qnil
;
4694 FRAME_X_DISPLAY_INFO (f
) = dpyinfo
;
4696 image_cache_refcount
= FRAME_IMAGE_CACHE (f
)->refcount
;
4697 dpyinfo_refcount
= dpyinfo
->reference_count
;
4698 #endif /* GLYPH_DEBUG */
4699 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4700 f
->output_data
.x
->explicit_parent
= 0;
4702 /* These colors will be set anyway later, but it's important
4703 to get the color reference counts right, so initialize them! */
4706 struct gcpro gcpro1
;
4708 /* Function x_decode_color can signal an error. Make
4709 sure to initialize color slots so that we won't try
4710 to free colors we haven't allocated. */
4711 FRAME_FOREGROUND_PIXEL (f
) = -1;
4712 FRAME_BACKGROUND_PIXEL (f
) = -1;
4713 f
->output_data
.x
->cursor_pixel
= -1;
4714 f
->output_data
.x
->cursor_foreground_pixel
= -1;
4715 f
->output_data
.x
->border_pixel
= -1;
4716 f
->output_data
.x
->mouse_pixel
= -1;
4718 black
= build_string ("black");
4720 FRAME_FOREGROUND_PIXEL (f
)
4721 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4722 FRAME_BACKGROUND_PIXEL (f
)
4723 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4724 f
->output_data
.x
->cursor_pixel
4725 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4726 f
->output_data
.x
->cursor_foreground_pixel
4727 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4728 f
->output_data
.x
->border_pixel
4729 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4730 f
->output_data
.x
->mouse_pixel
4731 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4735 /* Set the name; the functions to which we pass f expect the name to
4737 if (EQ (name
, Qunbound
) || NILP (name
))
4739 f
->name
= build_string (dpyinfo
->x_id_name
);
4740 f
->explicit_name
= 0;
4745 f
->explicit_name
= 1;
4746 /* use the frame's title when getting resources for this frame. */
4747 specbind (Qx_resource_name
, name
);
4750 f
->resx
= dpyinfo
->resx
;
4751 f
->resy
= dpyinfo
->resy
;
4753 register_font_driver (&xfont_driver
, f
);
4754 #ifdef HAVE_FREETYPE
4756 register_font_driver (&xftfont_driver
, f
);
4757 #else /* not HAVE_XFT */
4758 register_font_driver (&ftxfont_driver
, f
);
4759 #endif /* not HAVE_XFT */
4760 #endif /* HAVE_FREETYPE */
4762 x_default_parameter (f
, parms
, Qfont_backend
, Qnil
,
4763 "fontBackend", "FontBackend", RES_TYPE_STRING
);
4765 /* Extract the window parameters from the supplied values that are
4766 needed to determine window geometry. */
4767 x_default_font_parameter (f
, parms
);
4769 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
4770 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
4772 /* This defaults to 2 in order to match xterm. We recognize either
4773 internalBorderWidth or internalBorder (which is what xterm calls
4775 if (NILP (Fassq (Qinternal_border_width
, parms
)))
4779 value
= x_get_arg (dpyinfo
, parms
, Qinternal_border_width
,
4780 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
4781 if (! EQ (value
, Qunbound
))
4782 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
4786 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
4787 "internalBorderWidth", "internalBorderWidth",
4790 /* Also do the stuff which must be set before the window exists. */
4791 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
4792 "foreground", "Foreground", RES_TYPE_STRING
);
4793 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
4794 "background", "Background", RES_TYPE_STRING
);
4795 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
4796 "pointerColor", "Foreground", RES_TYPE_STRING
);
4797 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
4798 "cursorColor", "Foreground", RES_TYPE_STRING
);
4799 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
4800 "borderColor", "BorderColor", RES_TYPE_STRING
);
4802 /* Init faces before x_default_parameter is called for scroll-bar
4803 parameters because that function calls x_set_scroll_bar_width,
4804 which calls change_frame_size, which calls Fset_window_buffer,
4805 which runs hooks, which call Fvertical_motion. At the end, we
4806 end up in init_iterator with a null face cache, which should not
4808 init_frame_faces (f
);
4810 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4812 window_prompting
= x_figure_window_size (f
, parms
, 0);
4815 XSetWindowAttributes attrs
;
4819 mask
= CWBackPixel
| CWOverrideRedirect
| CWEventMask
;
4820 if (DoesSaveUnders (dpyinfo
->screen
))
4821 mask
|= CWSaveUnder
;
4823 /* Window managers look at the override-redirect flag to determine
4824 whether or net to give windows a decoration (Xlib spec, chapter
4826 attrs
.override_redirect
= True
;
4827 attrs
.save_under
= True
;
4828 attrs
.background_pixel
= FRAME_BACKGROUND_PIXEL (f
);
4829 /* Arrange for getting MapNotify and UnmapNotify events. */
4830 attrs
.event_mask
= StructureNotifyMask
;
4832 = FRAME_X_WINDOW (f
)
4833 = XCreateWindow (FRAME_X_DISPLAY (f
),
4834 FRAME_X_DISPLAY_INFO (f
)->root_window
,
4835 /* x, y, width, height */
4839 CopyFromParent
, InputOutput
, CopyFromParent
,
4846 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
4847 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
4848 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
4849 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
4850 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
4851 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
4853 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
4854 Change will not be effected unless different from the current
4856 width
= FRAME_COLS (f
);
4857 height
= FRAME_LINES (f
);
4858 SET_FRAME_COLS (f
, 0);
4859 FRAME_LINES (f
) = 0;
4860 change_frame_size (f
, height
, width
, 1, 0, 0);
4862 /* Add `tooltip' frame parameter's default value. */
4863 if (NILP (Fframe_parameter (frame
, intern ("tooltip"))))
4864 Fmodify_frame_parameters (frame
, Fcons (Fcons (intern ("tooltip"), Qt
),
4867 /* FIXME - can this be done in a similar way to normal frames?
4868 http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg00641.html */
4870 /* Set the `display-type' frame parameter before setting up faces. */
4872 Lisp_Object disptype
;
4874 if (FRAME_X_DISPLAY_INFO (f
)->n_planes
== 1)
4875 disptype
= intern ("mono");
4876 else if (FRAME_X_DISPLAY_INFO (f
)->visual
->class == GrayScale
4877 || FRAME_X_DISPLAY_INFO (f
)->visual
->class == StaticGray
)
4878 disptype
= intern ("grayscale");
4880 disptype
= intern ("color");
4882 if (NILP (Fframe_parameter (frame
, Qdisplay_type
)))
4883 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qdisplay_type
, disptype
),
4887 /* Set up faces after all frame parameters are known. This call
4888 also merges in face attributes specified for new frames.
4890 Frame parameters may be changed if .Xdefaults contains
4891 specifications for the default font. For example, if there is an
4892 `Emacs.default.attributeBackground: pink', the `background-color'
4893 attribute of the frame get's set, which let's the internal border
4894 of the tooltip frame appear in pink. Prevent this. */
4896 Lisp_Object bg
= Fframe_parameter (frame
, Qbackground_color
);
4898 /* Set tip_frame here, so that */
4900 call2 (Qface_set_after_frame_default
, frame
, Qnil
);
4902 if (!EQ (bg
, Fframe_parameter (frame
, Qbackground_color
)))
4903 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qbackground_color
, bg
),
4911 /* It is now ok to make the frame official even if we get an error
4912 below. And the frame needs to be on Vframe_list or making it
4913 visible won't work. */
4914 Vframe_list
= Fcons (frame
, Vframe_list
);
4916 /* Now that the frame is official, it counts as a reference to
4918 FRAME_X_DISPLAY_INFO (f
)->reference_count
++;
4920 /* Setting attributes of faces of the tooltip frame from resources
4921 and similar will increment face_change_count, which leads to the
4922 clearing of all current matrices. Since this isn't necessary
4923 here, avoid it by resetting face_change_count to the value it
4924 had before we created the tip frame. */
4925 face_change_count
= face_change_count_before
;
4927 /* Discard the unwind_protect. */
4928 return unbind_to (count
, frame
);
4932 /* Compute where to display tip frame F. PARMS is the list of frame
4933 parameters for F. DX and DY are specified offsets from the current
4934 location of the mouse. WIDTH and HEIGHT are the width and height
4935 of the tooltip. Return coordinates relative to the root window of
4936 the display in *ROOT_X, and *ROOT_Y. */
4939 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, root_x
, root_y
)
4941 Lisp_Object parms
, dx
, dy
;
4943 int *root_x
, *root_y
;
4945 Lisp_Object left
, top
;
4950 /* User-specified position? */
4951 left
= Fcdr (Fassq (Qleft
, parms
));
4952 top
= Fcdr (Fassq (Qtop
, parms
));
4954 /* Move the tooltip window where the mouse pointer is. Resize and
4956 if (!INTEGERP (left
) || !INTEGERP (top
))
4959 XQueryPointer (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
4960 &root
, &child
, root_x
, root_y
, &win_x
, &win_y
, &pmask
);
4965 *root_y
= XINT (top
);
4966 else if (*root_y
+ XINT (dy
) <= 0)
4967 *root_y
= 0; /* Can happen for negative dy */
4968 else if (*root_y
+ XINT (dy
) + height
4969 <= x_display_pixel_height (FRAME_X_DISPLAY_INFO (f
)))
4970 /* It fits below the pointer */
4971 *root_y
+= XINT (dy
);
4972 else if (height
+ XINT (dy
) <= *root_y
)
4973 /* It fits above the pointer. */
4974 *root_y
-= height
+ XINT (dy
);
4976 /* Put it on the top. */
4979 if (INTEGERP (left
))
4980 *root_x
= XINT (left
);
4981 else if (*root_x
+ XINT (dx
) <= 0)
4982 *root_x
= 0; /* Can happen for negative dx */
4983 else if (*root_x
+ XINT (dx
) + width
4984 <= x_display_pixel_width (FRAME_X_DISPLAY_INFO (f
)))
4985 /* It fits to the right of the pointer. */
4986 *root_x
+= XINT (dx
);
4987 else if (width
+ XINT (dx
) <= *root_x
)
4988 /* It fits to the left of the pointer. */
4989 *root_x
-= width
+ XINT (dx
);
4991 /* Put it left-justified on the screen--it ought to fit that way. */
4996 DEFUN ("x-show-tip", Fx_show_tip
, Sx_show_tip
, 1, 6, 0,
4997 doc
: /* Show STRING in a "tooltip" window on frame FRAME.
4998 A tooltip window is a small X window displaying a string.
5000 This is an internal function; Lisp code should call `tooltip-show'.
5002 FRAME nil or omitted means use the selected frame.
5004 PARMS is an optional list of frame parameters which can be used to
5005 change the tooltip's appearance.
5007 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
5008 means use the default timeout of 5 seconds.
5010 If the list of frame parameters PARAMS contains a `left' parameters,
5011 the tooltip is displayed at that x-position. Otherwise it is
5012 displayed at the mouse position, with offset DX added (default is 5 if
5013 DX isn't specified). Likewise for the y-position; if a `top' frame
5014 parameter is specified, it determines the y-position of the tooltip
5015 window, otherwise it is displayed at the mouse position, with offset
5016 DY added (default is -10).
5018 A tooltip's maximum size is specified by `x-max-tooltip-size'.
5019 Text larger than the specified size is clipped. */)
5020 (string
, frame
, parms
, timeout
, dx
, dy
)
5021 Lisp_Object string
, frame
, parms
, timeout
, dx
, dy
;
5026 struct buffer
*old_buffer
;
5027 struct text_pos pos
;
5028 int i
, width
, height
;
5029 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
5030 int old_windows_or_buffers_changed
= windows_or_buffers_changed
;
5031 int count
= SPECPDL_INDEX ();
5033 specbind (Qinhibit_redisplay
, Qt
);
5035 GCPRO4 (string
, parms
, frame
, timeout
);
5037 CHECK_STRING (string
);
5038 if (SCHARS (string
) == 0)
5039 string
= make_unibyte_string (" ", 1);
5041 f
= check_x_frame (frame
);
5043 timeout
= make_number (5);
5045 CHECK_NATNUM (timeout
);
5048 dx
= make_number (5);
5053 dy
= make_number (-10);
5057 if (NILP (last_show_tip_args
))
5058 last_show_tip_args
= Fmake_vector (make_number (3), Qnil
);
5060 if (!NILP (tip_frame
))
5062 Lisp_Object last_string
= AREF (last_show_tip_args
, 0);
5063 Lisp_Object last_frame
= AREF (last_show_tip_args
, 1);
5064 Lisp_Object last_parms
= AREF (last_show_tip_args
, 2);
5066 if (EQ (frame
, last_frame
)
5067 && !NILP (Fequal (last_string
, string
))
5068 && !NILP (Fequal (last_parms
, parms
)))
5070 struct frame
*f
= XFRAME (tip_frame
);
5072 /* Only DX and DY have changed. */
5073 if (!NILP (tip_timer
))
5075 Lisp_Object timer
= tip_timer
;
5077 call1 (Qcancel_timer
, timer
);
5081 compute_tip_xy (f
, parms
, dx
, dy
, FRAME_PIXEL_WIDTH (f
),
5082 FRAME_PIXEL_HEIGHT (f
), &root_x
, &root_y
);
5083 XMoveWindow (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
5090 /* Hide a previous tip, if any. */
5093 ASET (last_show_tip_args
, 0, string
);
5094 ASET (last_show_tip_args
, 1, frame
);
5095 ASET (last_show_tip_args
, 2, parms
);
5097 /* Add default values to frame parameters. */
5098 if (NILP (Fassq (Qname
, parms
)))
5099 parms
= Fcons (Fcons (Qname
, build_string ("tooltip")), parms
);
5100 if (NILP (Fassq (Qinternal_border_width
, parms
)))
5101 parms
= Fcons (Fcons (Qinternal_border_width
, make_number (3)), parms
);
5102 if (NILP (Fassq (Qborder_width
, parms
)))
5103 parms
= Fcons (Fcons (Qborder_width
, make_number (1)), parms
);
5104 if (NILP (Fassq (Qborder_color
, parms
)))
5105 parms
= Fcons (Fcons (Qborder_color
, build_string ("lightyellow")), parms
);
5106 if (NILP (Fassq (Qbackground_color
, parms
)))
5107 parms
= Fcons (Fcons (Qbackground_color
, build_string ("lightyellow")),
5110 /* Create a frame for the tooltip, and record it in the global
5111 variable tip_frame. */
5112 frame
= x_create_tip_frame (FRAME_X_DISPLAY_INFO (f
), parms
, string
);
5115 /* Set up the frame's root window. */
5116 w
= XWINDOW (FRAME_ROOT_WINDOW (f
));
5117 w
->left_col
= w
->top_line
= make_number (0);
5119 if (CONSP (Vx_max_tooltip_size
)
5120 && INTEGERP (XCAR (Vx_max_tooltip_size
))
5121 && XINT (XCAR (Vx_max_tooltip_size
)) > 0
5122 && INTEGERP (XCDR (Vx_max_tooltip_size
))
5123 && XINT (XCDR (Vx_max_tooltip_size
)) > 0)
5125 w
->total_cols
= XCAR (Vx_max_tooltip_size
);
5126 w
->total_lines
= XCDR (Vx_max_tooltip_size
);
5130 w
->total_cols
= make_number (80);
5131 w
->total_lines
= make_number (40);
5134 FRAME_TOTAL_COLS (f
) = XINT (w
->total_cols
);
5136 w
->pseudo_window_p
= 1;
5138 /* Display the tooltip text in a temporary buffer. */
5139 old_buffer
= current_buffer
;
5140 set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f
))->buffer
));
5141 current_buffer
->truncate_lines
= Qnil
;
5142 clear_glyph_matrix (w
->desired_matrix
);
5143 clear_glyph_matrix (w
->current_matrix
);
5144 SET_TEXT_POS (pos
, BEGV
, BEGV_BYTE
);
5145 try_window (FRAME_ROOT_WINDOW (f
), pos
, 0);
5147 /* Compute width and height of the tooltip. */
5149 for (i
= 0; i
< w
->desired_matrix
->nrows
; ++i
)
5151 struct glyph_row
*row
= &w
->desired_matrix
->rows
[i
];
5155 /* Stop at the first empty row at the end. */
5156 if (!row
->enabled_p
|| !row
->displays_text_p
)
5159 /* Let the row go over the full width of the frame. */
5160 row
->full_width_p
= 1;
5162 /* There's a glyph at the end of rows that is used to place
5163 the cursor there. Don't include the width of this glyph. */
5164 if (row
->used
[TEXT_AREA
])
5166 last
= &row
->glyphs
[TEXT_AREA
][row
->used
[TEXT_AREA
] - 1];
5167 row_width
= row
->pixel_width
- last
->pixel_width
;
5170 row_width
= row
->pixel_width
;
5172 height
+= row
->height
;
5173 width
= max (width
, row_width
);
5176 /* Add the frame's internal border to the width and height the X
5177 window should have. */
5178 height
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
5179 width
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
5181 /* Move the tooltip window where the mouse pointer is. Resize and
5183 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, &root_x
, &root_y
);
5186 XMoveResizeWindow (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
5187 root_x
, root_y
, width
, height
);
5188 XMapRaised (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
));
5191 /* Draw into the window. */
5192 w
->must_be_updated_p
= 1;
5193 update_single_window (w
, 1);
5195 /* Restore original current buffer. */
5196 set_buffer_internal_1 (old_buffer
);
5197 windows_or_buffers_changed
= old_windows_or_buffers_changed
;
5200 /* Let the tip disappear after timeout seconds. */
5201 tip_timer
= call3 (intern ("run-at-time"), timeout
, Qnil
,
5202 intern ("x-hide-tip"));
5205 return unbind_to (count
, Qnil
);
5209 DEFUN ("x-hide-tip", Fx_hide_tip
, Sx_hide_tip
, 0, 0, 0,
5210 doc
: /* Hide the current tooltip window, if there is any.
5211 Value is t if tooltip was open, nil otherwise. */)
5215 Lisp_Object deleted
, frame
, timer
;
5216 struct gcpro gcpro1
, gcpro2
;
5218 /* Return quickly if nothing to do. */
5219 if (NILP (tip_timer
) && NILP (tip_frame
))
5224 GCPRO2 (frame
, timer
);
5225 tip_frame
= tip_timer
= deleted
= Qnil
;
5227 count
= SPECPDL_INDEX ();
5228 specbind (Qinhibit_redisplay
, Qt
);
5229 specbind (Qinhibit_quit
, Qt
);
5232 call1 (Qcancel_timer
, timer
);
5236 delete_frame (frame
, Qnil
);
5240 /* Bloodcurdling hack alert: The Lucid menu bar widget's
5241 redisplay procedure is not called when a tip frame over menu
5242 items is unmapped. Redisplay the menu manually... */
5244 struct frame
*f
= SELECTED_FRAME ();
5245 Widget w
= f
->output_data
.x
->menubar_widget
;
5246 extern void xlwmenu_redisplay
P_ ((Widget
));
5248 if (!DoesSaveUnders (FRAME_X_DISPLAY_INFO (f
)->screen
)
5252 xlwmenu_redisplay (w
);
5256 #endif /* USE_LUCID */
5260 return unbind_to (count
, deleted
);
5265 /***********************************************************************
5266 File selection dialog
5267 ***********************************************************************/
5269 DEFUN ("x-uses-old-gtk-dialog", Fx_uses_old_gtk_dialog
,
5270 Sx_uses_old_gtk_dialog
,
5272 doc
: /* Return t if the old Gtk+ file selection dialog is used. */)
5276 extern int use_dialog_box
;
5277 extern int use_file_dialog
;
5282 && xg_uses_old_file_dialog ())
5290 /* Callback for "OK" and "Cancel" on file selection dialog. */
5293 file_dialog_cb (widget
, client_data
, call_data
)
5295 XtPointer call_data
, client_data
;
5297 int *result
= (int *) client_data
;
5298 XmAnyCallbackStruct
*cb
= (XmAnyCallbackStruct
*) call_data
;
5299 *result
= cb
->reason
;
5303 /* Callback for unmapping a file selection dialog. This is used to
5304 capture the case where a dialog is closed via a window manager's
5305 closer button, for example. Using a XmNdestroyCallback didn't work
5309 file_dialog_unmap_cb (widget
, client_data
, call_data
)
5311 XtPointer call_data
, client_data
;
5313 int *result
= (int *) client_data
;
5314 *result
= XmCR_CANCEL
;
5318 clean_up_file_dialog (arg
)
5321 struct Lisp_Save_Value
*p
= XSAVE_VALUE (arg
);
5322 Widget dialog
= (Widget
) p
->pointer
;
5326 XtUnmanageChild (dialog
);
5327 XtDestroyWidget (dialog
);
5328 x_menu_set_in_use (0);
5335 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
5336 doc
: /* Read file name, prompting with PROMPT in directory DIR.
5337 Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
5338 selection box, if specified. If MUSTMATCH is non-nil, the returned file
5339 or directory must exist. ONLY-DIR-P is ignored." */)
5340 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
)
5341 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, only_dir_p
;
5344 struct frame
*f
= SELECTED_FRAME ();
5345 Lisp_Object file
= Qnil
;
5346 Lisp_Object decoded_file
;
5347 Widget dialog
, text
, help
;
5350 extern XtAppContext Xt_app_con
;
5351 XmString dir_xmstring
, pattern_xmstring
;
5352 int count
= SPECPDL_INDEX ();
5353 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
5357 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
, file
);
5359 if (popup_activated ())
5360 error ("Trying to use a menu from within a menu-entry");
5362 CHECK_STRING (prompt
);
5365 /* Prevent redisplay. */
5366 specbind (Qinhibit_redisplay
, Qt
);
5370 /* Create the dialog with PROMPT as title, using DIR as initial
5371 directory and using "*" as pattern. */
5372 dir
= Fexpand_file_name (dir
, Qnil
);
5373 dir_xmstring
= XmStringCreateLocalized (SDATA (dir
));
5374 pattern_xmstring
= XmStringCreateLocalized ("*");
5376 XtSetArg (al
[ac
], XmNtitle
, SDATA (prompt
)); ++ac
;
5377 XtSetArg (al
[ac
], XmNdirectory
, dir_xmstring
); ++ac
;
5378 XtSetArg (al
[ac
], XmNpattern
, pattern_xmstring
); ++ac
;
5379 XtSetArg (al
[ac
], XmNresizePolicy
, XmRESIZE_GROW
); ++ac
;
5380 XtSetArg (al
[ac
], XmNdialogStyle
, XmDIALOG_APPLICATION_MODAL
); ++ac
;
5381 dialog
= XmCreateFileSelectionDialog (f
->output_data
.x
->widget
,
5383 XmStringFree (dir_xmstring
);
5384 XmStringFree (pattern_xmstring
);
5386 /* Add callbacks for OK and Cancel. */
5387 XtAddCallback (dialog
, XmNokCallback
, file_dialog_cb
,
5388 (XtPointer
) &result
);
5389 XtAddCallback (dialog
, XmNcancelCallback
, file_dialog_cb
,
5390 (XtPointer
) &result
);
5391 XtAddCallback (dialog
, XmNunmapCallback
, file_dialog_unmap_cb
,
5392 (XtPointer
) &result
);
5394 /* Remove the help button since we can't display help. */
5395 help
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_HELP_BUTTON
);
5396 XtUnmanageChild (help
);
5398 /* Mark OK button as default. */
5399 XtVaSetValues (XmFileSelectionBoxGetChild (dialog
, XmDIALOG_OK_BUTTON
),
5400 XmNshowAsDefault
, True
, NULL
);
5402 /* If MUSTMATCH is non-nil, disable the file entry field of the
5403 dialog, so that the user must select a file from the files list
5404 box. We can't remove it because we wouldn't have a way to get at
5405 the result file name, then. */
5406 text
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_TEXT
);
5407 if (!NILP (mustmatch
))
5410 label
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_SELECTION_LABEL
);
5411 XtSetSensitive (text
, False
);
5412 XtSetSensitive (label
, False
);
5415 /* Manage the dialog, so that list boxes get filled. */
5416 XtManageChild (dialog
);
5418 if (STRINGP (default_filename
))
5420 XmString default_xmstring
;
5421 Widget wtext
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_TEXT
);
5422 Widget list
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_LIST
);
5424 XmTextPosition last_pos
= XmTextFieldGetLastPosition (wtext
);
5425 XmTextFieldReplace (wtext
, 0, last_pos
,
5426 (SDATA (Ffile_name_nondirectory (default_filename
))));
5428 /* Select DEFAULT_FILENAME in the files list box. DEFAULT_FILENAME
5429 must include the path for this to work. */
5431 default_xmstring
= XmStringCreateLocalized (SDATA (default_filename
));
5433 if (XmListItemExists (list
, default_xmstring
))
5435 int item_pos
= XmListItemPos (list
, default_xmstring
);
5436 /* Select the item and scroll it into view. */
5437 XmListSelectPos (list
, item_pos
, True
);
5438 XmListSetPos (list
, item_pos
);
5441 XmStringFree (default_xmstring
);
5444 record_unwind_protect (clean_up_file_dialog
, make_save_value (dialog
, 0));
5446 /* Process events until the user presses Cancel or OK. */
5447 x_menu_set_in_use (1);
5452 x_menu_wait_for_event (0);
5453 XtAppNextEvent (Xt_app_con
, &event
);
5454 if (event
.type
== KeyPress
5455 && FRAME_X_DISPLAY (f
) == event
.xkey
.display
)
5457 KeySym keysym
= XLookupKeysym (&event
.xkey
, 0);
5459 /* Pop down on C-g. */
5460 if (keysym
== XK_g
&& (event
.xkey
.state
& ControlMask
) != 0)
5461 XtUnmanageChild (dialog
);
5464 (void) x_dispatch_event (&event
, FRAME_X_DISPLAY (f
));
5467 /* Get the result. */
5468 if (result
== XmCR_OK
)
5473 XtVaGetValues (dialog
, XmNtextString
, &text
, NULL
);
5474 XmStringGetLtoR (text
, XmFONTLIST_DEFAULT_TAG
, &data
);
5475 XmStringFree (text
);
5476 file
= build_string (data
);
5485 /* Make "Cancel" equivalent to C-g. */
5487 Fsignal (Qquit
, Qnil
);
5489 decoded_file
= DECODE_FILE (file
);
5491 return unbind_to (count
, decoded_file
);
5494 #endif /* USE_MOTIF */
5499 clean_up_dialog (arg
)
5502 x_menu_set_in_use (0);
5507 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
5508 doc
: /* Read file name, prompting with PROMPT in directory DIR.
5509 Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
5510 selection box, if specified. If MUSTMATCH is non-nil, the returned file
5511 or directory must exist. If ONLY-DIR-P is non-nil, the user can only select
5513 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
)
5514 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, only_dir_p
;
5516 FRAME_PTR f
= SELECTED_FRAME ();
5518 Lisp_Object file
= Qnil
;
5519 Lisp_Object decoded_file
;
5520 int count
= SPECPDL_INDEX ();
5521 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
5526 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
, file
);
5528 if (popup_activated ())
5529 error ("Trying to use a menu from within a menu-entry");
5531 CHECK_STRING (prompt
);
5534 /* Prevent redisplay. */
5535 specbind (Qinhibit_redisplay
, Qt
);
5536 record_unwind_protect (clean_up_dialog
, Qnil
);
5540 if (STRINGP (default_filename
))
5541 cdef_file
= SDATA (default_filename
);
5543 cdef_file
= SDATA (dir
);
5545 fn
= xg_get_file_name (f
, SDATA (prompt
), cdef_file
,
5547 ! NILP (only_dir_p
));
5551 file
= build_string (fn
);
5558 /* Make "Cancel" equivalent to C-g. */
5560 Fsignal (Qquit
, Qnil
);
5562 decoded_file
= DECODE_FILE (file
);
5564 return unbind_to (count
, decoded_file
);
5568 #ifdef HAVE_FREETYPE
5570 DEFUN ("x-select-font", Fx_select_font
, Sx_select_font
, 0, 2, 0,
5571 doc
: /* Read a font name using a GTK font selection dialog.
5572 Return a GTK-style font string corresponding to the selection.
5574 If FRAME is omitted or nil, it defaults to the selected frame. */)
5576 Lisp_Object frame
, ignored
;
5578 FRAME_PTR f
= check_x_frame (frame
);
5580 Lisp_Object default_font
, font
= Qnil
;
5581 Lisp_Object font_param
;
5582 char *default_name
= NULL
;
5583 struct gcpro gcpro1
;
5584 int count
= SPECPDL_INDEX ();
5588 if (popup_activated ())
5589 error ("Trying to use a menu from within a menu-entry");
5591 /* Prevent redisplay. */
5592 specbind (Qinhibit_redisplay
, Qt
);
5593 record_unwind_protect (clean_up_dialog
, Qnil
);
5598 font_param
= Fframe_parameter (frame
, Qfont_param
);
5600 if (x_last_font_name
!= NULL
)
5601 default_name
= x_last_font_name
;
5602 else if (STRINGP (font_param
))
5603 default_name
= SDATA (font_param
);
5604 else if (FONTP (default_font
))
5606 XSETFONT (default_font
, FRAME_FONT (f
));
5607 default_name
= alloca (256);
5608 if (font_unparse_gtkname (default_font
, f
, default_name
, 256) < 0)
5609 default_name
= NULL
;
5612 name
= xg_get_font_name (f
, default_name
);
5616 font
= build_string (name
);
5617 g_free (x_last_font_name
);
5618 x_last_font_name
= name
;
5624 Fsignal (Qquit
, Qnil
);
5626 return unbind_to (count
, font
);
5628 #endif /* HAVE_FREETYPE */
5630 #endif /* USE_GTK */
5633 /***********************************************************************
5635 ***********************************************************************/
5637 #ifdef HAVE_XKBGETKEYBOARD
5638 #include <X11/XKBlib.h>
5639 #include <X11/keysym.h>
5642 DEFUN ("x-backspace-delete-keys-p", Fx_backspace_delete_keys_p
,
5643 Sx_backspace_delete_keys_p
, 0, 1, 0,
5644 doc
: /* Check if both Backspace and Delete keys are on the keyboard of FRAME.
5645 FRAME nil means use the selected frame.
5646 Value is t if we know that both keys are present, and are mapped to the
5647 usual X keysyms. Value is `lambda' if we cannot determine if both keys are
5648 present and mapped to the usual X keysyms. */)
5652 #ifdef HAVE_XKBGETKEYBOARD
5654 struct frame
*f
= check_x_frame (frame
);
5655 Display
*dpy
= FRAME_X_DISPLAY (f
);
5656 Lisp_Object have_keys
;
5657 int major
, minor
, op
, event
, error
;
5661 /* Check library version in case we're dynamically linked. */
5662 major
= XkbMajorVersion
;
5663 minor
= XkbMinorVersion
;
5664 if (!XkbLibraryVersion (&major
, &minor
))
5670 /* Check that the server supports XKB. */
5671 major
= XkbMajorVersion
;
5672 minor
= XkbMinorVersion
;
5673 if (!XkbQueryExtension (dpy
, &op
, &event
, &error
, &major
, &minor
))
5679 /* In this code we check that the keyboard has physical keys with names
5680 that start with BKSP (Backspace) and DELE (Delete), and that they
5681 generate keysym XK_BackSpace and XK_Delete respectively.
5682 This function is used to test if normal-erase-is-backspace should be
5684 An alternative approach would be to just check if XK_BackSpace and
5685 XK_Delete are mapped to any key. But if any of those are mapped to
5686 some non-intuitive key combination (Meta-Shift-Ctrl-whatever) and the
5687 user doesn't know about it, it is better to return false here.
5688 It is more obvious to the user what to do if she/he has two keys
5689 clearly marked with names/symbols and one key does something not
5690 expected (i.e. she/he then tries the other).
5691 The cases where Backspace/Delete is mapped to some other key combination
5692 are rare, and in those cases, normal-erase-is-backspace can be turned on
5696 kb
= XkbGetMap (dpy
, XkbAllMapComponentsMask
, XkbUseCoreKbd
);
5699 int delete_keycode
= 0, backspace_keycode
= 0, i
;
5701 if (XkbGetNames (dpy
, XkbAllNamesMask
, kb
) == Success
)
5703 for (i
= kb
->min_key_code
;
5704 (i
< kb
->max_key_code
5705 && (delete_keycode
== 0 || backspace_keycode
== 0));
5708 /* The XKB symbolic key names can be seen most easily in
5709 the PS file generated by `xkbprint -label name
5711 if (bcmp ("DELE", kb
->names
->keys
[i
].name
, 4) == 0)
5713 else if (bcmp ("BKSP", kb
->names
->keys
[i
].name
, 4) == 0)
5714 backspace_keycode
= i
;
5717 XkbFreeNames (kb
, 0, True
);
5720 XkbFreeClientMap (kb
, 0, True
);
5723 && backspace_keycode
5724 && XKeysymToKeycode (dpy
, XK_Delete
) == delete_keycode
5725 && XKeysymToKeycode (dpy
, XK_BackSpace
) == backspace_keycode
)
5730 #else /* not HAVE_XKBGETKEYBOARD */
5732 #endif /* not HAVE_XKBGETKEYBOARD */
5737 /***********************************************************************
5739 ***********************************************************************/
5741 /* Keep this list in the same order as frame_parms in frame.c.
5742 Use 0 for unsupported frame parameters. */
5744 frame_parm_handler x_frame_parm_handlers
[] =
5748 x_set_background_color
,
5754 x_set_foreground_color
,
5757 x_set_internal_border_width
,
5758 x_set_menu_bar_lines
,
5760 x_explicitly_set_name
,
5761 x_set_scroll_bar_width
,
5764 x_set_vertical_scroll_bars
,
5766 x_set_tool_bar_lines
,
5767 x_set_scroll_bar_foreground
,
5768 x_set_scroll_bar_background
,
5783 /* This is zero if not using X windows. */
5786 /* The section below is built by the lisp expression at the top of the file,
5787 just above where these variables are declared. */
5788 /*&&& init symbols here &&&*/
5789 Qnone
= intern ("none");
5791 Qsuppress_icon
= intern ("suppress-icon");
5792 staticpro (&Qsuppress_icon
);
5793 Qundefined_color
= intern ("undefined-color");
5794 staticpro (&Qundefined_color
);
5795 Qcompound_text
= intern ("compound-text");
5796 staticpro (&Qcompound_text
);
5797 Qcancel_timer
= intern ("cancel-timer");
5798 staticpro (&Qcancel_timer
);
5799 Qfont_param
= intern ("font-parameter");
5800 staticpro (&Qfont_param
);
5801 /* This is the end of symbol initialization. */
5803 /* Text property `display' should be nonsticky by default. */
5804 Vtext_property_default_nonsticky
5805 = Fcons (Fcons (Qdisplay
, Qt
), Vtext_property_default_nonsticky
);
5808 Fput (Qundefined_color
, Qerror_conditions
,
5809 Fcons (Qundefined_color
, Fcons (Qerror
, Qnil
)));
5810 Fput (Qundefined_color
, Qerror_message
,
5811 build_string ("Undefined color"));
5813 DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape
,
5814 doc
: /* The shape of the pointer when over text.
5815 Changing the value does not affect existing frames
5816 unless you set the mouse color. */);
5817 Vx_pointer_shape
= Qnil
;
5819 #if 0 /* This doesn't really do anything. */
5820 DEFVAR_LISP ("x-nontext-pointer-shape", &Vx_nontext_pointer_shape
,
5821 doc
: /* The shape of the pointer when not over text.
5822 This variable takes effect when you create a new frame
5823 or when you set the mouse color. */);
5825 Vx_nontext_pointer_shape
= Qnil
;
5827 DEFVAR_LISP ("x-hourglass-pointer-shape", &Vx_hourglass_pointer_shape
,
5828 doc
: /* The shape of the pointer when Emacs is busy.
5829 This variable takes effect when you create a new frame
5830 or when you set the mouse color. */);
5831 Vx_hourglass_pointer_shape
= Qnil
;
5833 #if 0 /* This doesn't really do anything. */
5834 DEFVAR_LISP ("x-mode-pointer-shape", &Vx_mode_pointer_shape
,
5835 doc
: /* The shape of the pointer when over the mode line.
5836 This variable takes effect when you create a new frame
5837 or when you set the mouse color. */);
5839 Vx_mode_pointer_shape
= Qnil
;
5841 DEFVAR_LISP ("x-sensitive-text-pointer-shape",
5842 &Vx_sensitive_text_pointer_shape
,
5843 doc
: /* The shape of the pointer when over mouse-sensitive text.
5844 This variable takes effect when you create a new frame
5845 or when you set the mouse color. */);
5846 Vx_sensitive_text_pointer_shape
= Qnil
;
5848 DEFVAR_LISP ("x-window-horizontal-drag-cursor",
5849 &Vx_window_horizontal_drag_shape
,
5850 doc
: /* Pointer shape to use for indicating a window can be dragged horizontally.
5851 This variable takes effect when you create a new frame
5852 or when you set the mouse color. */);
5853 Vx_window_horizontal_drag_shape
= Qnil
;
5855 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel
,
5856 doc
: /* A string indicating the foreground color of the cursor box. */);
5857 Vx_cursor_fore_pixel
= Qnil
;
5859 DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size
,
5860 doc
: /* Maximum size for tooltips. Value is a pair (COLUMNS . ROWS).
5861 Text larger than this is clipped. */);
5862 Vx_max_tooltip_size
= Fcons (make_number (80), make_number (40));
5864 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager
,
5865 doc
: /* Non-nil if no X window manager is in use.
5866 Emacs doesn't try to figure this out; this is always nil
5867 unless you set it to something else. */);
5868 /* We don't have any way to find this out, so set it to nil
5869 and maybe the user would like to set it to t. */
5870 Vx_no_window_manager
= Qnil
;
5872 DEFVAR_LISP ("x-pixel-size-width-font-regexp",
5873 &Vx_pixel_size_width_font_regexp
,
5874 doc
: /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'.
5876 Since Emacs gets width of a font matching with this regexp from
5877 PIXEL_SIZE field of the name, font finding mechanism gets faster for
5878 such a font. This is especially effective for such large fonts as
5879 Chinese, Japanese, and Korean. */);
5880 Vx_pixel_size_width_font_regexp
= Qnil
;
5882 /* This is not ifdef:ed, so other builds than GTK can customize it. */
5883 DEFVAR_BOOL ("x-gtk-use-old-file-dialog", &x_gtk_use_old_file_dialog
,
5884 doc
: /* *Non-nil means prompt with the old GTK file selection dialog.
5885 If nil or if the file selection dialog is not available, the new GTK file
5886 chooser is used instead. To turn off all file dialogs set the
5887 variable `use-file-dialog'. */);
5888 x_gtk_use_old_file_dialog
= 0;
5890 DEFVAR_BOOL ("x-gtk-show-hidden-files", &x_gtk_show_hidden_files
,
5891 doc
: /* *If non-nil, the GTK file chooser will by default show hidden files.
5892 Note that this is just the default, there is a toggle button on the file
5893 chooser to show or not show hidden files on a case by case basis. */);
5894 x_gtk_show_hidden_files
= 0;
5896 DEFVAR_BOOL ("x-gtk-file-dialog-help-text", &x_gtk_file_dialog_help_text
,
5897 doc
: /* *If non-nil, the GTK file chooser will show additional help text.
5898 If more space for files in the file chooser dialog is wanted, set this to nil
5899 to turn the additional text off. */);
5900 x_gtk_file_dialog_help_text
= 1;
5902 DEFVAR_BOOL ("x-gtk-whole-detached-tool-bar", &x_gtk_whole_detached_tool_bar
,
5903 doc
: /* *If non-nil, a detached tool bar is shown in full.
5904 The default is to just show an arrow and pressing on that arrow shows
5905 the tool bar buttons. */);
5906 x_gtk_whole_detached_tool_bar
= 0;
5908 Fprovide (intern ("x"), Qnil
);
5910 #ifdef USE_X_TOOLKIT
5911 Fprovide (intern ("x-toolkit"), Qnil
);
5913 Fprovide (intern ("motif"), Qnil
);
5915 DEFVAR_LISP ("motif-version-string", &Vmotif_version_string
,
5916 doc
: /* Version info for LessTif/Motif. */);
5917 Vmotif_version_string
= build_string (XmVERSION_STRING
);
5918 #endif /* USE_MOTIF */
5919 #endif /* USE_X_TOOLKIT */
5922 /* Provide x-toolkit also for GTK. Internally GTK does not use Xt so it
5923 is not an X toolkit in that sense (USE_X_TOOLKIT is not defined).
5924 But for a user it is a toolkit for X, and indeed, configure
5925 accepts --with-x-toolkit=gtk. */
5926 Fprovide (intern ("x-toolkit"), Qnil
);
5927 Fprovide (intern ("gtk"), Qnil
);
5929 DEFVAR_LISP ("gtk-version-string", &Vgtk_version_string
,
5930 doc
: /* Version info for GTK+. */);
5932 char gtk_version
[40];
5933 g_snprintf (gtk_version
, sizeof (gtk_version
), "%u.%u.%u",
5934 GTK_MAJOR_VERSION
, GTK_MINOR_VERSION
, GTK_MICRO_VERSION
);
5935 Vgtk_version_string
= build_string (gtk_version
);
5937 #endif /* USE_GTK */
5939 /* X window properties. */
5940 defsubr (&Sx_change_window_property
);
5941 defsubr (&Sx_delete_window_property
);
5942 defsubr (&Sx_window_property
);
5944 defsubr (&Sxw_display_color_p
);
5945 defsubr (&Sx_display_grayscale_p
);
5946 defsubr (&Sxw_color_defined_p
);
5947 defsubr (&Sxw_color_values
);
5948 defsubr (&Sx_server_max_request_size
);
5949 defsubr (&Sx_server_vendor
);
5950 defsubr (&Sx_server_version
);
5951 defsubr (&Sx_display_pixel_width
);
5952 defsubr (&Sx_display_pixel_height
);
5953 defsubr (&Sx_display_mm_width
);
5954 defsubr (&Sx_display_mm_height
);
5955 defsubr (&Sx_display_screens
);
5956 defsubr (&Sx_display_planes
);
5957 defsubr (&Sx_display_color_cells
);
5958 defsubr (&Sx_display_visual_class
);
5959 defsubr (&Sx_display_backing_store
);
5960 defsubr (&Sx_display_save_under
);
5961 defsubr (&Sx_wm_set_size_hint
);
5962 defsubr (&Sx_create_frame
);
5963 defsubr (&Sx_open_connection
);
5964 defsubr (&Sx_close_connection
);
5965 defsubr (&Sx_display_list
);
5966 defsubr (&Sx_synchronize
);
5967 defsubr (&Sx_focus_frame
);
5968 defsubr (&Sx_backspace_delete_keys_p
);
5970 /* Setting callback functions for fontset handler. */
5971 check_window_system_func
= check_x
;
5973 defsubr (&Sx_show_tip
);
5974 defsubr (&Sx_hide_tip
);
5976 staticpro (&tip_timer
);
5978 staticpro (&tip_frame
);
5980 last_show_tip_args
= Qnil
;
5981 staticpro (&last_show_tip_args
);
5983 defsubr (&Sx_uses_old_gtk_dialog
);
5984 #if defined (USE_MOTIF) || defined (USE_GTK)
5985 defsubr (&Sx_file_dialog
);
5988 #if defined (USE_GTK) && defined (HAVE_FREETYPE)
5989 defsubr (&Sx_select_font
);
5990 x_last_font_name
= NULL
;
5994 #endif /* HAVE_X_WINDOWS */
5996 /* arch-tag: 55040d02-5485-4d58-8b22-95a7a05f3288
5997 (do not change this comment) */