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, 2010
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/>. */
31 /* This makes the fields of a Display accessible, in Xlib header files. */
33 #define XLIB_ILLEGAL_ACCESS
40 #include "intervals.h"
41 #include "dispextern.h"
43 #include "blockinput.h"
45 #include "character.h"
50 #include "termhooks.h"
58 #include <sys/types.h>
61 #if 1 /* Used to be #ifdef EMACS_BITMAP_FILES, but this should always work. */
62 #include "bitmaps/gray.xbm"
64 #include <X11/bitmaps/gray>
67 #include "xsettings.h"
74 #include <X11/Shell.h>
78 #include <X11/Xaw3d/Paned.h>
79 #include <X11/Xaw3d/Label.h>
80 #else /* !HAVE_XAW3D */
81 #include <X11/Xaw/Paned.h>
82 #include <X11/Xaw/Label.h>
83 #endif /* HAVE_XAW3D */
84 #endif /* USE_MOTIF */
87 #undef USG /* ####KLUDGE for Solaris 2.2 and up */
96 #include "../lwlib/lwlib.h"
100 #include <Xm/DialogS.h>
101 #include <Xm/FileSB.h>
103 #include <Xm/TextF.h>
107 #include "../lwlib/xlwmenu.h"
110 #if !defined(NO_EDITRES)
112 extern void _XEditResCheckMessages ();
113 #endif /* not defined NO_EDITRES */
115 /* Unique id counter for widgets created by the Lucid Widget Library. */
117 extern LWLIB_ID widget_id_tick
;
119 extern void free_frame_menubar ();
120 extern double atof ();
124 /* LessTif/Motif version info. */
126 static Lisp_Object Vmotif_version_string
;
128 #endif /* USE_MOTIF */
130 #endif /* USE_X_TOOLKIT */
134 /* GTK+ version info */
136 static Lisp_Object Vgtk_version_string
;
140 #define MAXREQUEST(dpy) (XMaxRequestSize (dpy))
142 /* The gray bitmap `bitmaps/gray'. This is done because xterm.c uses
143 it, and including `bitmaps/gray' more than once is a problem when
144 config.h defines `static' as an empty replacement string. */
146 int gray_bitmap_width
= gray_width
;
147 int gray_bitmap_height
= gray_height
;
148 char *gray_bitmap_bits
= gray_bits
;
150 /* Non-zero means prompt with the old GTK file selection dialog. */
152 int x_gtk_use_old_file_dialog
;
154 /* If non-zero, by default show hidden files in the GTK file chooser. */
156 int x_gtk_show_hidden_files
;
158 /* If non-zero, don't show additional help text in the GTK file chooser. */
160 int x_gtk_file_dialog_help_text
;
162 /* If non-zero, don't collapse to tool bar when it is detached. */
164 int x_gtk_whole_detached_tool_bar
;
166 /* If non-zero, use Gtk+ tooltips. */
168 static int x_gtk_use_system_tooltips
;
170 /* The background and shape of the mouse pointer, and shape when not
171 over text or in the modeline. */
173 Lisp_Object Vx_pointer_shape
, Vx_nontext_pointer_shape
, Vx_mode_pointer_shape
;
174 Lisp_Object Vx_hourglass_pointer_shape
;
176 /* The shape when over mouse-sensitive text. */
178 Lisp_Object Vx_sensitive_text_pointer_shape
;
180 /* If non-nil, the pointer shape to indicate that windows can be
181 dragged horizontally. */
183 Lisp_Object Vx_window_horizontal_drag_shape
;
185 /* Color of chars displayed in cursor box. */
187 Lisp_Object Vx_cursor_fore_pixel
;
189 /* Nonzero if using X. */
193 /* Non nil if no window manager is in use. */
195 Lisp_Object Vx_no_window_manager
;
197 /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'. */
199 Lisp_Object Vx_pixel_size_width_font_regexp
;
202 Lisp_Object Qsuppress_icon
;
203 Lisp_Object Qundefined_color
;
204 Lisp_Object Qcompound_text
, Qcancel_timer
;
205 Lisp_Object Qfont_param
;
208 int image_cache_refcount
, dpyinfo_refcount
;
211 #if defined (USE_GTK) && defined (HAVE_FREETYPE)
212 char *x_last_font_name
;
216 /* Error if we are not connected to X. */
222 error ("X windows are not in use or not initialized");
225 /* Nonzero if we can use mouse menus.
226 You should not call this unless HAVE_MENUS is defined. */
234 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame
235 and checking validity for X. */
238 check_x_frame (Lisp_Object frame
)
243 frame
= selected_frame
;
244 CHECK_LIVE_FRAME (frame
);
247 error ("Non-X frame used");
251 /* Let the user specify an X display with a Lisp object.
252 OBJECT may be nil, a frame or a terminal object.
253 nil stands for the selected frame--or, if that is not an X frame,
254 the first X display on the list. */
256 struct x_display_info
*
257 check_x_display_info (Lisp_Object 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 (struct x_display_info
*dpyinfo
, int wdesc
)
301 Lisp_Object tail
, frame
;
304 if (wdesc
== None
) return 0;
306 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
312 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
314 if (f
->output_data
.x
->hourglass_window
== wdesc
)
317 if ((f
->output_data
.x
->edit_widget
318 && XtWindow (f
->output_data
.x
->edit_widget
) == wdesc
)
319 /* A tooltip frame? */
320 || (!f
->output_data
.x
->edit_widget
321 && FRAME_X_WINDOW (f
) == wdesc
)
322 || f
->output_data
.x
->icon_desc
== wdesc
)
324 #else /* not USE_X_TOOLKIT */
326 if (f
->output_data
.x
->edit_widget
)
328 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
329 struct x_output
*x
= f
->output_data
.x
;
330 if (gwdesc
!= 0 && gwdesc
== x
->edit_widget
)
334 if (FRAME_X_WINDOW (f
) == wdesc
335 || f
->output_data
.x
->icon_desc
== wdesc
)
337 #endif /* not USE_X_TOOLKIT */
342 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
343 /* Like x_window_to_frame but also compares the window with the widget's
347 x_any_window_to_frame (struct x_display_info
*dpyinfo
, int wdesc
)
349 Lisp_Object tail
, frame
;
350 struct frame
*f
, *found
;
353 if (wdesc
== None
) return NULL
;
356 for (tail
= Vframe_list
; CONSP (tail
) && !found
; tail
= XCDR (tail
))
363 if (FRAME_X_P (f
) && FRAME_X_DISPLAY_INFO (f
) == dpyinfo
)
365 /* This frame matches if the window is any of its widgets. */
366 x
= f
->output_data
.x
;
367 if (x
->hourglass_window
== wdesc
)
372 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
374 && gtk_widget_get_toplevel (gwdesc
) == x
->widget
)
377 if (wdesc
== XtWindow (x
->widget
)
378 || wdesc
== XtWindow (x
->column_widget
)
379 || wdesc
== XtWindow (x
->edit_widget
))
381 /* Match if the window is this frame's menubar. */
382 else if (lw_window_is_in_menubar (wdesc
, x
->menubar_widget
))
386 else if (FRAME_X_WINDOW (f
) == wdesc
)
387 /* A tooltip frame. */
395 /* Likewise, but consider only the menu bar widget. */
398 x_menubar_window_to_frame (struct x_display_info
*dpyinfo
, XEvent
*event
)
400 Window wdesc
= event
->xany
.window
;
401 Lisp_Object tail
, frame
;
405 if (wdesc
== None
) return 0;
407 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
413 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
415 x
= f
->output_data
.x
;
417 if (x
->menubar_widget
&& xg_event_is_for_menubar (f
, event
))
420 /* Match if the window is this frame's menubar. */
421 if (x
->menubar_widget
422 && lw_window_is_in_menubar (wdesc
, x
->menubar_widget
))
429 /* Return the frame whose principal (outermost) window is WDESC.
430 If WDESC is some other (smaller) window, we return 0. */
433 x_top_window_to_frame (struct x_display_info
*dpyinfo
, int wdesc
)
435 Lisp_Object tail
, frame
;
439 if (wdesc
== None
) return 0;
441 for (tail
= Vframe_list
; CONSP (tail
); tail
= XCDR (tail
))
447 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
449 x
= f
->output_data
.x
;
453 /* This frame matches if the window is its topmost widget. */
455 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
456 if (gwdesc
== x
->widget
)
459 if (wdesc
== XtWindow (x
->widget
))
461 #if 0 /* I don't know why it did this,
462 but it seems logically wrong,
463 and it causes trouble for MapNotify events. */
464 /* Match if the window is this frame's menubar. */
465 if (x
->menubar_widget
466 && wdesc
== XtWindow (x
->menubar_widget
))
471 else if (FRAME_X_WINDOW (f
) == wdesc
)
477 #endif /* USE_X_TOOLKIT || USE_GTK */
481 static void x_default_font_parameter (struct frame
*, Lisp_Object
);
483 static Lisp_Object
unwind_create_frame (Lisp_Object
);
484 static Lisp_Object
unwind_create_tip_frame (Lisp_Object
);
486 void x_set_foreground_color (struct frame
*, Lisp_Object
, Lisp_Object
);
487 static void x_set_wait_for_wm (struct frame
*, Lisp_Object
, Lisp_Object
);
488 void x_set_background_color (struct frame
*, Lisp_Object
, Lisp_Object
);
489 void x_set_mouse_color (struct frame
*, Lisp_Object
, Lisp_Object
);
490 void x_set_cursor_color (struct frame
*, Lisp_Object
, Lisp_Object
);
491 void x_set_border_color (struct frame
*, Lisp_Object
, Lisp_Object
);
492 void x_set_cursor_type (struct frame
*, Lisp_Object
, Lisp_Object
);
493 void x_set_icon_type (struct frame
*, Lisp_Object
, Lisp_Object
);
494 void x_set_icon_name (struct frame
*, Lisp_Object
, Lisp_Object
);
495 void x_explicitly_set_name (struct frame
*, Lisp_Object
, Lisp_Object
);
496 void x_set_menu_bar_lines (struct frame
*, Lisp_Object
, Lisp_Object
);
497 void x_set_title (struct frame
*, Lisp_Object
, Lisp_Object
);
498 void x_set_tool_bar_lines (struct frame
*, Lisp_Object
, Lisp_Object
);
499 void x_set_scroll_bar_foreground (struct frame
*, Lisp_Object
,
501 void x_set_scroll_bar_background (struct frame
*, Lisp_Object
,
503 static Lisp_Object
x_default_scroll_bar_color_parameter (struct frame
*,
506 const char *, const char *,
510 /* Store the screen positions of frame F into XPTR and YPTR.
511 These are the positions of the containing window manager window,
512 not Emacs's own window. */
515 x_real_positions (FRAME_PTR f
, int *xptr
, int *yptr
)
517 int win_x
, win_y
, outer_x
, outer_y
;
518 int real_x
= 0, real_y
= 0;
520 Window win
= f
->output_data
.x
->parent_desc
;
524 x_catch_errors (FRAME_X_DISPLAY (f
));
526 if (win
== FRAME_X_DISPLAY_INFO (f
)->root_window
)
527 win
= FRAME_OUTER_WINDOW (f
);
529 /* This loop traverses up the containment tree until we hit the root
530 window. Window managers may intersect many windows between our window
531 and the root window. The window we find just before the root window
532 should be the outer WM window. */
535 Window wm_window
, rootw
;
536 Window
*tmp_children
;
537 unsigned int tmp_nchildren
;
540 success
= XQueryTree (FRAME_X_DISPLAY (f
), win
, &rootw
,
541 &wm_window
, &tmp_children
, &tmp_nchildren
);
543 had_errors
= x_had_errors_p (FRAME_X_DISPLAY (f
));
545 /* Don't free tmp_children if XQueryTree failed. */
549 XFree ((char *) tmp_children
);
551 if (wm_window
== rootw
|| had_errors
)
562 /* Get the real coordinates for the WM window upper left corner */
563 XGetGeometry (FRAME_X_DISPLAY (f
), win
,
564 &rootw
, &real_x
, &real_y
, &ign
, &ign
, &ign
, &ign
);
566 /* Translate real coordinates to coordinates relative to our
567 window. For our window, the upper left corner is 0, 0.
568 Since the upper left corner of the WM window is outside
569 our window, win_x and win_y will be negative:
571 ------------------ ---> x
573 | ----------------- v y
576 XTranslateCoordinates (FRAME_X_DISPLAY (f
),
578 /* From-window, to-window. */
579 FRAME_X_DISPLAY_INFO (f
)->root_window
,
582 /* From-position, to-position. */
583 real_x
, real_y
, &win_x
, &win_y
,
588 if (FRAME_X_WINDOW (f
) == FRAME_OUTER_WINDOW (f
))
595 XTranslateCoordinates (FRAME_X_DISPLAY (f
),
597 /* From-window, to-window. */
598 FRAME_X_DISPLAY_INFO (f
)->root_window
,
599 FRAME_OUTER_WINDOW (f
),
601 /* From-position, to-position. */
602 real_x
, real_y
, &outer_x
, &outer_y
,
608 had_errors
= x_had_errors_p (FRAME_X_DISPLAY (f
));
615 if (had_errors
) return;
617 f
->x_pixels_diff
= -win_x
;
618 f
->y_pixels_diff
= -win_y
;
620 FRAME_X_OUTPUT (f
)->x_pixels_outer_diff
= -outer_x
;
621 FRAME_X_OUTPUT (f
)->y_pixels_outer_diff
= -outer_y
;
630 /* Gamma-correct COLOR on frame F. */
633 gamma_correct (struct frame
*f
, XColor
*color
)
637 color
->red
= pow (color
->red
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
638 color
->green
= pow (color
->green
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
639 color
->blue
= pow (color
->blue
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
644 /* Decide if color named COLOR_NAME is valid for use on frame F. If
645 so, return the RGB values in COLOR. If ALLOC_P is non-zero,
646 allocate the color. Value is zero if COLOR_NAME is invalid, or
647 no color could be allocated. */
650 x_defined_color (struct frame
*f
, const char *color_name
,
651 XColor
*color
, int alloc_p
)
654 Display
*dpy
= FRAME_X_DISPLAY (f
);
655 Colormap cmap
= FRAME_X_COLORMAP (f
);
659 success_p
= xg_check_special_colors (f
, color_name
, color
);
662 success_p
= XParseColor (dpy
, cmap
, color_name
, color
);
663 if (success_p
&& alloc_p
)
664 success_p
= x_alloc_nearest_color (f
, cmap
, color
);
671 /* Return the pixel color value for color COLOR_NAME on frame F. If F
672 is a monochrome frame, return MONO_COLOR regardless of what ARG says.
673 Signal an error if color can't be allocated. */
676 x_decode_color (FRAME_PTR f
, Lisp_Object color_name
, int mono_color
)
680 CHECK_STRING (color_name
);
682 #if 0 /* Don't do this. It's wrong when we're not using the default
683 colormap, it makes freeing difficult, and it's probably not
684 an important optimization. */
685 if (strcmp (SDATA (color_name
), "black") == 0)
686 return BLACK_PIX_DEFAULT (f
);
687 else if (strcmp (SDATA (color_name
), "white") == 0)
688 return WHITE_PIX_DEFAULT (f
);
691 /* Return MONO_COLOR for monochrome frames. */
692 if (FRAME_X_DISPLAY_INFO (f
)->n_planes
== 1)
695 /* x_defined_color is responsible for coping with failures
696 by looking for a near-miss. */
697 if (x_defined_color (f
, SDATA (color_name
), &cdef
, 1))
700 signal_error ("Undefined color", color_name
);
705 /* Change the `wait-for-wm' frame parameter of frame F. OLD_VALUE is
706 the previous value of that parameter, NEW_VALUE is the new value.
707 See also the comment of wait_for_wm in struct x_output. */
710 x_set_wait_for_wm (struct frame
*f
, Lisp_Object new_value
, Lisp_Object old_value
)
712 f
->output_data
.x
->wait_for_wm
= !NILP (new_value
);
716 x_set_tool_bar_position (struct frame
*f
,
717 Lisp_Object new_value
,
718 Lisp_Object old_value
)
720 if (! EQ (new_value
, Qleft
) && ! EQ (new_value
, Qright
)
721 && ! EQ (new_value
, Qbottom
) && ! EQ (new_value
, Qtop
))
723 if (EQ (new_value
, old_value
)) return;
726 if (xg_change_toolbar_position (f
, new_value
))
727 f
->tool_bar_position
= new_value
;
733 /* Set icon from FILE for frame F. By using GTK functions the icon
734 may be any format that GdkPixbuf knows about, i.e. not just bitmaps. */
737 xg_set_icon (FRAME_PTR f
, Lisp_Object file
)
742 found
= x_find_image_file (file
);
748 char *filename
= (char *) SDATA (found
);
751 pixbuf
= gdk_pixbuf_new_from_file (filename
, &err
);
755 gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)),
757 g_object_unref (pixbuf
);
771 xg_set_icon_from_xpm_data (FRAME_PTR f
, const char **data
)
774 GdkPixbuf
*pixbuf
= gdk_pixbuf_new_from_xpm_data (data
);
779 gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)), pixbuf
);
780 g_object_unref (pixbuf
);
786 /* Functions called only from `x_set_frame_param'
787 to set individual parameters.
789 If FRAME_X_WINDOW (f) is 0,
790 the frame is being created and its X-window does not exist yet.
791 In that case, just record the parameter's new value
792 in the standard place; do not attempt to change the window. */
795 x_set_foreground_color (struct frame
*f
, Lisp_Object arg
, Lisp_Object oldval
)
797 struct x_output
*x
= f
->output_data
.x
;
798 unsigned long fg
, old_fg
;
800 fg
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
801 old_fg
= FRAME_FOREGROUND_PIXEL (f
);
802 FRAME_FOREGROUND_PIXEL (f
) = fg
;
804 if (FRAME_X_WINDOW (f
) != 0)
806 Display
*dpy
= FRAME_X_DISPLAY (f
);
809 XSetForeground (dpy
, x
->normal_gc
, fg
);
810 XSetBackground (dpy
, x
->reverse_gc
, fg
);
812 if (x
->cursor_pixel
== old_fg
)
814 unload_color (f
, x
->cursor_pixel
);
815 x
->cursor_pixel
= x_copy_color (f
, fg
);
816 XSetBackground (dpy
, x
->cursor_gc
, x
->cursor_pixel
);
821 update_face_from_frame_parameter (f
, Qforeground_color
, arg
);
823 if (FRAME_VISIBLE_P (f
))
827 unload_color (f
, old_fg
);
831 x_set_background_color (struct frame
*f
, Lisp_Object arg
, Lisp_Object oldval
)
833 struct x_output
*x
= f
->output_data
.x
;
836 bg
= x_decode_color (f
, arg
, WHITE_PIX_DEFAULT (f
));
837 unload_color (f
, FRAME_BACKGROUND_PIXEL (f
));
838 FRAME_BACKGROUND_PIXEL (f
) = bg
;
840 if (FRAME_X_WINDOW (f
) != 0)
842 Display
*dpy
= FRAME_X_DISPLAY (f
);
845 XSetBackground (dpy
, x
->normal_gc
, bg
);
846 XSetForeground (dpy
, x
->reverse_gc
, bg
);
847 XSetWindowBackground (dpy
, FRAME_X_WINDOW (f
), bg
);
848 XSetForeground (dpy
, x
->cursor_gc
, bg
);
851 xg_set_background_color (f
, bg
);
854 #ifndef USE_TOOLKIT_SCROLL_BARS /* Turns out to be annoying with
855 toolkit scroll bars. */
858 for (bar
= FRAME_SCROLL_BARS (f
);
860 bar
= XSCROLL_BAR (bar
)->next
)
862 Window window
= XSCROLL_BAR (bar
)->x_window
;
863 XSetWindowBackground (dpy
, window
, bg
);
866 #endif /* USE_TOOLKIT_SCROLL_BARS */
869 update_face_from_frame_parameter (f
, Qbackground_color
, arg
);
871 if (FRAME_VISIBLE_P (f
))
877 make_invisible_cursor (struct frame
*f
)
879 Display
*dpy
= FRAME_X_DISPLAY (f
);
880 static char const no_data
[] = { 0 };
885 x_catch_errors (dpy
);
886 pix
= XCreateBitmapFromData (dpy
, FRAME_X_DISPLAY_INFO (f
)->root_window
,
888 if (! x_had_errors_p (dpy
) && pix
!= None
)
891 col
.red
= col
.green
= col
.blue
= 0;
892 col
.flags
= DoRed
| DoGreen
| DoBlue
;
893 c
= XCreatePixmapCursor (dpy
, pix
, pix
, &col
, &col
, 0, 0);
894 if (x_had_errors_p (dpy
) || c
== None
)
896 XFreePixmap (dpy
, pix
);
905 x_set_mouse_color (struct frame
*f
, Lisp_Object arg
, Lisp_Object oldval
)
907 struct x_output
*x
= f
->output_data
.x
;
908 Display
*dpy
= FRAME_X_DISPLAY (f
);
909 Cursor cursor
, nontext_cursor
, mode_cursor
, hand_cursor
;
910 Cursor hourglass_cursor
, horizontal_drag_cursor
;
911 unsigned long pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
912 unsigned long mask_color
= FRAME_BACKGROUND_PIXEL (f
);
914 /* Don't let pointers be invisible. */
915 if (mask_color
== pixel
)
917 x_free_colors (f
, &pixel
, 1);
918 pixel
= x_copy_color (f
, FRAME_FOREGROUND_PIXEL (f
));
921 unload_color (f
, x
->mouse_pixel
);
922 x
->mouse_pixel
= pixel
;
926 /* It's not okay to crash if the user selects a screwy cursor. */
927 x_catch_errors (dpy
);
929 if (!NILP (Vx_pointer_shape
))
931 CHECK_NUMBER (Vx_pointer_shape
);
932 cursor
= XCreateFontCursor (dpy
, XINT (Vx_pointer_shape
));
935 cursor
= XCreateFontCursor (dpy
, XC_xterm
);
936 x_check_errors (dpy
, "bad text pointer cursor: %s");
938 if (!NILP (Vx_nontext_pointer_shape
))
940 CHECK_NUMBER (Vx_nontext_pointer_shape
);
942 = XCreateFontCursor (dpy
, XINT (Vx_nontext_pointer_shape
));
945 nontext_cursor
= XCreateFontCursor (dpy
, XC_left_ptr
);
946 x_check_errors (dpy
, "bad nontext pointer cursor: %s");
948 if (!NILP (Vx_hourglass_pointer_shape
))
950 CHECK_NUMBER (Vx_hourglass_pointer_shape
);
952 = XCreateFontCursor (dpy
, XINT (Vx_hourglass_pointer_shape
));
955 hourglass_cursor
= XCreateFontCursor (dpy
, XC_watch
);
956 x_check_errors (dpy
, "bad hourglass pointer cursor: %s");
958 if (!NILP (Vx_mode_pointer_shape
))
960 CHECK_NUMBER (Vx_mode_pointer_shape
);
961 mode_cursor
= XCreateFontCursor (dpy
, XINT (Vx_mode_pointer_shape
));
964 mode_cursor
= XCreateFontCursor (dpy
, XC_xterm
);
965 x_check_errors (dpy
, "bad modeline pointer cursor: %s");
967 if (!NILP (Vx_sensitive_text_pointer_shape
))
969 CHECK_NUMBER (Vx_sensitive_text_pointer_shape
);
971 = XCreateFontCursor (dpy
, XINT (Vx_sensitive_text_pointer_shape
));
974 hand_cursor
= XCreateFontCursor (dpy
, XC_hand2
);
976 if (!NILP (Vx_window_horizontal_drag_shape
))
978 CHECK_NUMBER (Vx_window_horizontal_drag_shape
);
979 horizontal_drag_cursor
980 = XCreateFontCursor (dpy
, XINT (Vx_window_horizontal_drag_shape
));
983 horizontal_drag_cursor
984 = XCreateFontCursor (dpy
, XC_sb_h_double_arrow
);
986 /* Check and report errors with the above calls. */
987 x_check_errors (dpy
, "can't set cursor shape: %s");
991 XColor fore_color
, back_color
;
993 fore_color
.pixel
= x
->mouse_pixel
;
994 x_query_color (f
, &fore_color
);
995 back_color
.pixel
= mask_color
;
996 x_query_color (f
, &back_color
);
998 XRecolorCursor (dpy
, cursor
, &fore_color
, &back_color
);
999 XRecolorCursor (dpy
, nontext_cursor
, &fore_color
, &back_color
);
1000 XRecolorCursor (dpy
, mode_cursor
, &fore_color
, &back_color
);
1001 XRecolorCursor (dpy
, hand_cursor
, &fore_color
, &back_color
);
1002 XRecolorCursor (dpy
, hourglass_cursor
, &fore_color
, &back_color
);
1003 XRecolorCursor (dpy
, horizontal_drag_cursor
, &fore_color
, &back_color
);
1006 if (FRAME_X_WINDOW (f
) != 0)
1007 XDefineCursor (dpy
, FRAME_X_WINDOW (f
),
1008 f
->output_data
.x
->current_cursor
= cursor
);
1010 if (FRAME_X_DISPLAY_INFO (f
)->invisible_cursor
== 0)
1011 FRAME_X_DISPLAY_INFO (f
)->invisible_cursor
= make_invisible_cursor (f
);
1013 if (cursor
!= x
->text_cursor
1014 && x
->text_cursor
!= 0)
1015 XFreeCursor (dpy
, x
->text_cursor
);
1016 x
->text_cursor
= cursor
;
1018 if (nontext_cursor
!= x
->nontext_cursor
1019 && x
->nontext_cursor
!= 0)
1020 XFreeCursor (dpy
, x
->nontext_cursor
);
1021 x
->nontext_cursor
= nontext_cursor
;
1023 if (hourglass_cursor
!= x
->hourglass_cursor
1024 && x
->hourglass_cursor
!= 0)
1025 XFreeCursor (dpy
, x
->hourglass_cursor
);
1026 x
->hourglass_cursor
= hourglass_cursor
;
1028 if (mode_cursor
!= x
->modeline_cursor
1029 && x
->modeline_cursor
!= 0)
1030 XFreeCursor (dpy
, f
->output_data
.x
->modeline_cursor
);
1031 x
->modeline_cursor
= mode_cursor
;
1033 if (hand_cursor
!= x
->hand_cursor
1034 && x
->hand_cursor
!= 0)
1035 XFreeCursor (dpy
, x
->hand_cursor
);
1036 x
->hand_cursor
= hand_cursor
;
1038 if (horizontal_drag_cursor
!= x
->horizontal_drag_cursor
1039 && x
->horizontal_drag_cursor
!= 0)
1040 XFreeCursor (dpy
, x
->horizontal_drag_cursor
);
1041 x
->horizontal_drag_cursor
= horizontal_drag_cursor
;
1046 update_face_from_frame_parameter (f
, Qmouse_color
, arg
);
1050 x_set_cursor_color (struct frame
*f
, Lisp_Object arg
, Lisp_Object oldval
)
1052 unsigned long fore_pixel
, pixel
;
1053 int fore_pixel_allocated_p
= 0, pixel_allocated_p
= 0;
1054 struct x_output
*x
= f
->output_data
.x
;
1056 if (!NILP (Vx_cursor_fore_pixel
))
1058 fore_pixel
= x_decode_color (f
, Vx_cursor_fore_pixel
,
1059 WHITE_PIX_DEFAULT (f
));
1060 fore_pixel_allocated_p
= 1;
1063 fore_pixel
= FRAME_BACKGROUND_PIXEL (f
);
1065 pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1066 pixel_allocated_p
= 1;
1068 /* Make sure that the cursor color differs from the background color. */
1069 if (pixel
== FRAME_BACKGROUND_PIXEL (f
))
1071 if (pixel_allocated_p
)
1073 x_free_colors (f
, &pixel
, 1);
1074 pixel_allocated_p
= 0;
1077 pixel
= x
->mouse_pixel
;
1078 if (pixel
== fore_pixel
)
1080 if (fore_pixel_allocated_p
)
1082 x_free_colors (f
, &fore_pixel
, 1);
1083 fore_pixel_allocated_p
= 0;
1085 fore_pixel
= FRAME_BACKGROUND_PIXEL (f
);
1089 unload_color (f
, x
->cursor_foreground_pixel
);
1090 if (!fore_pixel_allocated_p
)
1091 fore_pixel
= x_copy_color (f
, fore_pixel
);
1092 x
->cursor_foreground_pixel
= fore_pixel
;
1094 unload_color (f
, x
->cursor_pixel
);
1095 if (!pixel_allocated_p
)
1096 pixel
= x_copy_color (f
, pixel
);
1097 x
->cursor_pixel
= pixel
;
1099 if (FRAME_X_WINDOW (f
) != 0)
1102 XSetBackground (FRAME_X_DISPLAY (f
), x
->cursor_gc
, x
->cursor_pixel
);
1103 XSetForeground (FRAME_X_DISPLAY (f
), x
->cursor_gc
, fore_pixel
);
1106 if (FRAME_VISIBLE_P (f
))
1108 x_update_cursor (f
, 0);
1109 x_update_cursor (f
, 1);
1113 update_face_from_frame_parameter (f
, Qcursor_color
, arg
);
1116 /* Set the border-color of frame F to pixel value PIX.
1117 Note that this does not fully take effect if done before
1118 F has an x-window. */
1121 x_set_border_pixel (struct frame
*f
, int pix
)
1123 unload_color (f
, f
->output_data
.x
->border_pixel
);
1124 f
->output_data
.x
->border_pixel
= pix
;
1126 if (FRAME_X_WINDOW (f
) != 0 && f
->border_width
> 0)
1129 XSetWindowBorder (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1130 (unsigned long)pix
);
1133 if (FRAME_VISIBLE_P (f
))
1138 /* Set the border-color of frame F to value described by ARG.
1139 ARG can be a string naming a color.
1140 The border-color is used for the border that is drawn by the X server.
1141 Note that this does not fully take effect if done before
1142 F has an x-window; it must be redone when the window is created.
1144 Note: this is done in two routines because of the way X10 works.
1146 Note: under X11, this is normally the province of the window manager,
1147 and so emacs' border colors may be overridden. */
1150 x_set_border_color (struct frame
*f
, Lisp_Object arg
, Lisp_Object oldval
)
1155 pix
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1156 x_set_border_pixel (f
, pix
);
1157 update_face_from_frame_parameter (f
, Qborder_color
, arg
);
1162 x_set_cursor_type (FRAME_PTR f
, Lisp_Object arg
, Lisp_Object oldval
)
1164 set_frame_cursor_types (f
, arg
);
1166 /* Make sure the cursor gets redrawn. */
1167 cursor_type_changed
= 1;
1171 x_set_icon_type (struct frame
*f
, Lisp_Object arg
, Lisp_Object oldval
)
1177 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1180 else if (!STRINGP (oldval
) && EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
1185 result
= x_text_icon (f
,
1186 (char *) SDATA ((!NILP (f
->icon_name
)
1190 result
= x_bitmap_icon (f
, arg
);
1195 error ("No icon window available");
1198 XFlush (FRAME_X_DISPLAY (f
));
1203 x_set_icon_name (struct frame
*f
, Lisp_Object arg
, Lisp_Object oldval
)
1209 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1212 else if (!NILP (arg
) || NILP (oldval
))
1217 if (f
->output_data
.x
->icon_bitmap
!= 0)
1222 result
= x_text_icon (f
,
1223 (char *) SDATA ((!NILP (f
->icon_name
)
1232 error ("No icon window available");
1235 XFlush (FRAME_X_DISPLAY (f
));
1241 x_set_menu_bar_lines (struct frame
*f
, Lisp_Object value
, Lisp_Object oldval
)
1244 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
1245 int olines
= FRAME_MENU_BAR_LINES (f
);
1248 /* Right now, menu bars don't work properly in minibuf-only frames;
1249 most of the commands try to apply themselves to the minibuffer
1250 frame itself, and get an error because you can't switch buffers
1251 in or split the minibuffer window. */
1252 if (FRAME_MINIBUF_ONLY_P (f
))
1255 if (INTEGERP (value
))
1256 nlines
= XINT (value
);
1260 /* Make sure we redisplay all windows in this frame. */
1261 windows_or_buffers_changed
++;
1263 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
1264 FRAME_MENU_BAR_LINES (f
) = 0;
1267 FRAME_EXTERNAL_MENU_BAR (f
) = 1;
1268 if (FRAME_X_P (f
) && f
->output_data
.x
->menubar_widget
== 0)
1269 /* Make sure next redisplay shows the menu bar. */
1270 XWINDOW (FRAME_SELECTED_WINDOW (f
))->update_mode_line
= Qt
;
1274 if (FRAME_EXTERNAL_MENU_BAR (f
) == 1)
1275 free_frame_menubar (f
);
1276 FRAME_EXTERNAL_MENU_BAR (f
) = 0;
1278 f
->output_data
.x
->menubar_widget
= 0;
1280 #else /* not USE_X_TOOLKIT && not USE_GTK */
1281 FRAME_MENU_BAR_LINES (f
) = nlines
;
1282 change_window_heights (f
->root_window
, nlines
- olines
);
1284 /* If the menu bar height gets changed, the internal border below
1285 the top margin has to be cleared. Also, if the menu bar gets
1286 larger, the area for the added lines has to be cleared except for
1287 the first menu bar line that is to be drawn later. */
1288 if (nlines
!= olines
)
1290 int height
= FRAME_INTERNAL_BORDER_WIDTH (f
);
1291 int width
= FRAME_PIXEL_WIDTH (f
);
1294 /* height can be zero here. */
1295 if (height
> 0 && width
> 0)
1297 y
= FRAME_TOP_MARGIN_HEIGHT (f
);
1300 x_clear_area (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1301 0, y
, width
, height
, False
);
1305 if (nlines
> 1 && nlines
> olines
)
1307 y
= (olines
== 0 ? 1 : olines
) * FRAME_LINE_HEIGHT (f
);
1308 height
= nlines
* FRAME_LINE_HEIGHT (f
) - y
;
1311 x_clear_area (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1312 0, y
, width
, height
, False
);
1316 if (nlines
== 0 && WINDOWP (f
->menu_bar_window
))
1317 clear_glyph_matrix (XWINDOW (f
->menu_bar_window
)->current_matrix
);
1319 #endif /* not USE_X_TOOLKIT && not USE_GTK */
1324 /* Set the number of lines used for the tool bar of frame F to VALUE.
1325 VALUE not an integer, or < 0 means set the lines to zero. OLDVAL
1326 is the old number of tool bar lines. This function changes the
1327 height of all windows on frame F to match the new tool bar height.
1328 The frame's height doesn't change. */
1331 x_set_tool_bar_lines (struct frame
*f
, Lisp_Object value
, Lisp_Object 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
= (FRAME_MENU_BAR_LINES (f
) + 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 (struct frame
*f
, Lisp_Object value
, Lisp_Object oldval
)
1428 unsigned long pixel
;
1430 if (STRINGP (value
))
1431 pixel
= x_decode_color (f
, value
, BLACK_PIX_DEFAULT (f
));
1435 if (f
->output_data
.x
->scroll_bar_foreground_pixel
!= -1)
1436 unload_color (f
, f
->output_data
.x
->scroll_bar_foreground_pixel
);
1438 f
->output_data
.x
->scroll_bar_foreground_pixel
= pixel
;
1439 if (FRAME_X_WINDOW (f
) && FRAME_VISIBLE_P (f
))
1441 /* Remove all scroll bars because they have wrong colors. */
1442 if (FRAME_TERMINAL (f
)->condemn_scroll_bars_hook
)
1443 (*FRAME_TERMINAL (f
)->condemn_scroll_bars_hook
) (f
);
1444 if (FRAME_TERMINAL (f
)->judge_scroll_bars_hook
)
1445 (*FRAME_TERMINAL (f
)->judge_scroll_bars_hook
) (f
);
1447 update_face_from_frame_parameter (f
, Qscroll_bar_foreground
, value
);
1453 /* Set the background color for scroll bars on frame F to VALUE VALUE
1454 should be a string, a color name. If it isn't a string or isn't a
1455 valid color name, do nothing. OLDVAL is the old value of the frame
1459 x_set_scroll_bar_background (struct frame
*f
, Lisp_Object value
, Lisp_Object oldval
)
1461 unsigned long pixel
;
1463 if (STRINGP (value
))
1464 pixel
= x_decode_color (f
, value
, WHITE_PIX_DEFAULT (f
));
1468 if (f
->output_data
.x
->scroll_bar_background_pixel
!= -1)
1469 unload_color (f
, f
->output_data
.x
->scroll_bar_background_pixel
);
1471 #ifdef USE_TOOLKIT_SCROLL_BARS
1472 /* Scrollbar shadow colors. */
1473 if (f
->output_data
.x
->scroll_bar_top_shadow_pixel
!= -1)
1475 unload_color (f
, f
->output_data
.x
->scroll_bar_top_shadow_pixel
);
1476 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
1478 if (f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
!= -1)
1480 unload_color (f
, f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
);
1481 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
1483 #endif /* USE_TOOLKIT_SCROLL_BARS */
1485 f
->output_data
.x
->scroll_bar_background_pixel
= pixel
;
1486 if (FRAME_X_WINDOW (f
) && FRAME_VISIBLE_P (f
))
1488 /* Remove all scroll bars because they have wrong colors. */
1489 if (FRAME_TERMINAL (f
)->condemn_scroll_bars_hook
)
1490 (*FRAME_TERMINAL (f
)->condemn_scroll_bars_hook
) (f
);
1491 if (FRAME_TERMINAL (f
)->judge_scroll_bars_hook
)
1492 (*FRAME_TERMINAL (f
)->judge_scroll_bars_hook
) (f
);
1494 update_face_from_frame_parameter (f
, Qscroll_bar_background
, value
);
1500 /* Encode Lisp string STRING as a text in a format appropriate for
1501 XICCC (X Inter Client Communication Conventions).
1503 This can call Lisp code, so callers must GCPRO.
1505 If STRING contains only ASCII characters, do no conversion and
1506 return the string data of STRING. Otherwise, encode the text by
1507 CODING_SYSTEM, and return a newly allocated memory area which
1508 should be freed by `xfree' by a caller.
1510 SELECTIONP non-zero means the string is being encoded for an X
1511 selection, so it is safe to run pre-write conversions (which
1514 Store the byte length of resulting text in *TEXT_BYTES.
1516 If the text contains only ASCII and Latin-1, store 1 in *STRING_P,
1517 which means that the `encoding' of the result can be `STRING'.
1518 Otherwise store 0 in *STRINGP, which means that the `encoding' of
1519 the result should be `COMPOUND_TEXT'. */
1521 static unsigned char *
1522 x_encode_text (Lisp_Object string
, Lisp_Object coding_system
, int selectionp
, int *text_bytes
, int *stringp
, int *freep
)
1524 int result
= string_xstring_p (string
);
1525 struct coding_system coding
;
1529 /* No multibyte character in OBJ. We need not encode it. */
1530 *text_bytes
= SBYTES (string
);
1533 return SDATA (string
);
1536 setup_coding_system (coding_system
, &coding
);
1537 coding
.mode
|= (CODING_MODE_SAFE_ENCODING
| CODING_MODE_LAST_BLOCK
);
1538 /* We suppress producing escape sequences for composition. */
1539 coding
.common_flags
&= ~CODING_ANNOTATION_MASK
;
1540 coding
.dst_bytes
= SCHARS (string
) * 2;
1541 coding
.destination
= (unsigned char *) xmalloc (coding
.dst_bytes
);
1542 encode_coding_object (&coding
, string
, 0, 0,
1543 SCHARS (string
), SBYTES (string
), Qnil
);
1544 *text_bytes
= coding
.produced
;
1545 *stringp
= (result
== 1 || !EQ (coding_system
, Qcompound_text
));
1547 return coding
.destination
;
1551 /* Set the WM name to NAME for frame F. Also set the icon name.
1552 If the frame already has an icon name, use that, otherwise set the
1553 icon name to NAME. */
1556 x_set_name_internal (FRAME_PTR f
, Lisp_Object name
)
1558 if (FRAME_X_WINDOW (f
))
1562 XTextProperty text
, icon
;
1564 int do_free_icon_value
= 0, do_free_text_value
= 0;
1565 Lisp_Object coding_system
;
1566 Lisp_Object encoded_name
;
1567 Lisp_Object encoded_icon_name
;
1568 struct gcpro gcpro1
;
1570 /* As ENCODE_UTF_8 may cause GC and relocation of string data,
1571 we use it before x_encode_text that may return string data. */
1573 encoded_name
= ENCODE_UTF_8 (name
);
1576 coding_system
= Qcompound_text
;
1577 /* Note: Encoding strategy
1579 We encode NAME by compound-text and use "COMPOUND-TEXT" in
1580 text.encoding. But, there are non-internationalized window
1581 managers which don't support that encoding. So, if NAME
1582 contains only ASCII and 8859-1 characters, encode it by
1583 iso-latin-1, and use "STRING" in text.encoding hoping that
1584 such window managers at least analyze this format correctly,
1585 i.e. treat 8-bit bytes as 8859-1 characters.
1587 We may also be able to use "UTF8_STRING" in text.encoding
1588 in the future which can encode all Unicode characters.
1589 But, for the moment, there's no way to know that the
1590 current window manager supports it or not.
1592 Either way, we also set the _NET_WM_NAME and _NET_WM_ICON_NAME
1593 properties. Per the EWMH specification, those two properties
1594 are always UTF8_STRING. This matches what gtk_window_set_title()
1595 does in the USE_GTK case. */
1596 text
.value
= x_encode_text (name
, coding_system
, 0, &bytes
, &stringp
,
1597 &do_free_text_value
);
1598 text
.encoding
= (stringp
? XA_STRING
1599 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
1601 text
.nitems
= bytes
;
1603 if (!STRINGP (f
->icon_name
))
1606 encoded_icon_name
= encoded_name
;
1610 /* See the above comment "Note: Encoding strategy". */
1611 icon
.value
= x_encode_text (f
->icon_name
, coding_system
, 0,
1612 &bytes
, &stringp
, &do_free_icon_value
);
1613 icon
.encoding
= (stringp
? XA_STRING
1614 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
1616 icon
.nitems
= bytes
;
1618 encoded_icon_name
= ENCODE_UTF_8 (f
->icon_name
);
1622 gtk_window_set_title (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)),
1623 (char *) SDATA (encoded_name
));
1624 #else /* not USE_GTK */
1625 XSetWMName (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
), &text
);
1626 XChangeProperty (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
),
1627 FRAME_X_DISPLAY_INFO (f
)->Xatom_net_wm_name
,
1628 FRAME_X_DISPLAY_INFO (f
)->Xatom_UTF8_STRING
,
1630 (char *) SDATA (encoded_name
),
1631 SBYTES (encoded_name
));
1632 #endif /* not USE_GTK */
1634 XSetWMIconName (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
), &icon
);
1635 XChangeProperty (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
),
1636 FRAME_X_DISPLAY_INFO (f
)->Xatom_net_wm_icon_name
,
1637 FRAME_X_DISPLAY_INFO (f
)->Xatom_UTF8_STRING
,
1639 (char *) SDATA (encoded_icon_name
),
1640 SBYTES (encoded_icon_name
));
1642 if (do_free_icon_value
)
1644 if (do_free_text_value
)
1651 /* Change the name of frame F to NAME. If NAME is nil, set F's name to
1654 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1655 name; if NAME is a string, set F's name to NAME and set
1656 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1658 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1659 suggesting a new name, which lisp code should override; if
1660 F->explicit_name is set, ignore the new name; otherwise, set it. */
1663 x_set_name (struct frame
*f
, Lisp_Object name
, int explicit)
1665 /* Make sure that requests from lisp code override requests from
1666 Emacs redisplay code. */
1669 /* If we're switching from explicit to implicit, we had better
1670 update the mode lines and thereby update the title. */
1671 if (f
->explicit_name
&& NILP (name
))
1672 update_mode_lines
= 1;
1674 f
->explicit_name
= ! NILP (name
);
1676 else if (f
->explicit_name
)
1679 /* If NAME is nil, set the name to the x_id_name. */
1682 /* Check for no change needed in this very common case
1683 before we do any consing. */
1684 if (!strcmp (FRAME_X_DISPLAY_INFO (f
)->x_id_name
,
1687 name
= build_string (FRAME_X_DISPLAY_INFO (f
)->x_id_name
);
1690 CHECK_STRING (name
);
1692 /* Don't change the name if it's already NAME. */
1693 if (! NILP (Fstring_equal (name
, f
->name
)))
1698 /* For setting the frame title, the title parameter should override
1699 the name parameter. */
1700 if (! NILP (f
->title
))
1703 x_set_name_internal (f
, name
);
1706 /* This function should be called when the user's lisp code has
1707 specified a name for the frame; the name will override any set by the
1710 x_explicitly_set_name (FRAME_PTR f
, Lisp_Object arg
, Lisp_Object oldval
)
1712 x_set_name (f
, arg
, 1);
1715 /* This function should be called by Emacs redisplay code to set the
1716 name; names set this way will never override names set by the user's
1719 x_implicitly_set_name (FRAME_PTR f
, Lisp_Object arg
, Lisp_Object oldval
)
1721 x_set_name (f
, arg
, 0);
1724 /* Change the title of frame F to NAME.
1725 If NAME is nil, use the frame name as the title. */
1728 x_set_title (struct frame
*f
, Lisp_Object name
, Lisp_Object 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 (struct frame
*f
)
1749 int wid
= FRAME_COLUMN_WIDTH (f
);
1751 #ifdef USE_TOOLKIT_SCROLL_BARS
1752 /* A minimum width of 14 doesn't look good for toolkit scroll bars. */
1753 int width
= 16 + 2 * VERTICAL_SCROLL_BAR_WIDTH_TRIM
;
1754 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (width
+ wid
- 1) / wid
;
1755 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = width
;
1757 /* Make the actual width at least 14 pixels and a multiple of a
1759 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (14 + wid
- 1) / wid
;
1761 /* Use all of that space (aside from required margins) for the
1763 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = 0;
1768 /* Record in frame F the specified or default value according to ALIST
1769 of the parameter named PROP (a Lisp symbol). If no value is
1770 specified for PROP, look for an X default for XPROP on the frame
1771 named NAME. If that is not found either, use the value DEFLT. */
1774 x_default_scroll_bar_color_parameter (struct frame
*f
,
1775 Lisp_Object alist
, Lisp_Object prop
,
1776 const char *xprop
, const char *xclass
,
1779 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
1782 tem
= x_get_arg (dpyinfo
, alist
, prop
, xprop
, xclass
, RES_TYPE_STRING
);
1783 if (EQ (tem
, Qunbound
))
1785 #ifdef USE_TOOLKIT_SCROLL_BARS
1787 /* See if an X resource for the scroll bar color has been
1789 tem
= display_x_get_resource (dpyinfo
,
1790 build_string (foreground_p
1793 empty_unibyte_string
,
1794 build_string ("verticalScrollBar"),
1795 empty_unibyte_string
);
1798 /* If nothing has been specified, scroll bars will use a
1799 toolkit-dependent default. Because these defaults are
1800 difficult to get at without actually creating a scroll
1801 bar, use nil to indicate that no color has been
1806 #else /* not USE_TOOLKIT_SCROLL_BARS */
1810 #endif /* not USE_TOOLKIT_SCROLL_BARS */
1813 x_set_frame_parameters (f
, Fcons (Fcons (prop
, tem
), Qnil
));
1820 #ifdef USE_X_TOOLKIT
1822 /* If the WM_PROTOCOLS property does not already contain WM_TAKE_FOCUS,
1823 WM_DELETE_WINDOW, and WM_SAVE_YOURSELF, then add them. (They may
1824 already be present because of the toolkit (Motif adds some of them,
1825 for example, but Xt doesn't). */
1828 hack_wm_protocols (FRAME_PTR f
, Widget widget
)
1830 Display
*dpy
= XtDisplay (widget
);
1831 Window w
= XtWindow (widget
);
1832 int need_delete
= 1;
1839 unsigned char *catoms
;
1841 unsigned long nitems
= 0;
1842 unsigned long bytes_after
;
1844 if ((XGetWindowProperty (dpy
, w
,
1845 FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
1846 (long)0, (long)100, False
, XA_ATOM
,
1847 &type
, &format
, &nitems
, &bytes_after
,
1850 && format
== 32 && type
== XA_ATOM
)
1852 Atom
*atoms
= (Atom
*) catoms
;
1857 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
)
1859 else if (atoms
[nitems
]
1860 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_take_focus
)
1862 else if (atoms
[nitems
]
1863 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
)
1874 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
;
1876 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_take_focus
;
1878 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
;
1880 XChangeProperty (dpy
, w
, FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
1881 XA_ATOM
, 32, PropModeAppend
,
1882 (unsigned char *) props
, count
);
1890 /* Support routines for XIC (X Input Context). */
1894 static XFontSet
xic_create_xfontset (struct frame
*);
1895 static XIMStyle
best_xim_style (XIMStyles
*, XIMStyles
*);
1898 /* Supported XIM styles, ordered by preference. */
1900 static XIMStyle supported_xim_styles
[] =
1902 XIMPreeditPosition
| XIMStatusArea
,
1903 XIMPreeditPosition
| XIMStatusNothing
,
1904 XIMPreeditPosition
| XIMStatusNone
,
1905 XIMPreeditNothing
| XIMStatusArea
,
1906 XIMPreeditNothing
| XIMStatusNothing
,
1907 XIMPreeditNothing
| XIMStatusNone
,
1908 XIMPreeditNone
| XIMStatusArea
,
1909 XIMPreeditNone
| XIMStatusNothing
,
1910 XIMPreeditNone
| XIMStatusNone
,
1915 /* Create an X fontset on frame F with base font name BASE_FONTNAME. */
1917 const char xic_defaut_fontset
[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*";
1919 /* Create an Xt fontset spec from the name of a base font.
1920 If `motif' is True use the Motif syntax. */
1922 xic_create_fontsetname (const char *base_fontname
, int motif
)
1924 const char *sep
= motif
? ";" : ",";
1927 /* Make a fontset name from the base font name. */
1928 if (xic_defaut_fontset
== base_fontname
)
1929 { /* There is no base font name, use the default. */
1930 int len
= strlen (base_fontname
) + 2;
1931 fontsetname
= xmalloc (len
);
1932 memset (fontsetname
, 0, len
);
1933 strcpy (fontsetname
, base_fontname
);
1937 /* Make a fontset name from the base font name.
1938 The font set will be made of the following elements:
1940 - the base font where the charset spec is replaced by -*-*.
1941 - the same but with the family also replaced with -*-*-. */
1942 const char *p
= base_fontname
;
1945 for (i
= 0; *p
; p
++)
1948 { /* As the font name doesn't conform to XLFD, we can't
1949 modify it to generalize it to allcs and allfamilies.
1950 Use the specified font plus the default. */
1951 int len
= strlen (base_fontname
) + strlen (xic_defaut_fontset
) + 3;
1952 fontsetname
= xmalloc (len
);
1953 memset (fontsetname
, 0, len
);
1954 strcpy (fontsetname
, base_fontname
);
1955 strcat (fontsetname
, sep
);
1956 strcat (fontsetname
, xic_defaut_fontset
);
1961 const char *p1
= NULL
, *p2
= NULL
, *p3
= NULL
;
1962 char *font_allcs
= NULL
;
1963 char *font_allfamilies
= NULL
;
1964 char *font_all
= NULL
;
1965 const char *allcs
= "*-*-*-*-*-*-*";
1966 const char *allfamilies
= "-*-*-";
1967 const char *all
= "*-*-*-*-";
1970 for (i
= 0, p
= base_fontname
; i
< 8; p
++)
1983 /* If base_fontname specifies ADSTYLE, make it a
1987 int diff
= (p2
- p3
) - 2;
1989 base
= alloca (strlen (base_fontname
) + 1);
1990 memcpy (base
, base_fontname
, p3
- base_fontname
);
1991 base
[p3
- base_fontname
] = '*';
1992 base
[(p3
- base_fontname
) + 1] = '-';
1993 strcpy (base
+ (p3
- base_fontname
) + 2, p2
);
1994 p
= base
+ (p
- base_fontname
) - diff
;
1995 p1
= base
+ (p1
- base_fontname
);
1996 p2
= base
+ (p2
- base_fontname
) - diff
;
1997 base_fontname
= base
;
2000 /* Build the font spec that matches all charsets. */
2001 len
= p
- base_fontname
+ strlen (allcs
) + 1;
2002 font_allcs
= (char *) alloca (len
);
2003 memset (font_allcs
, 0, len
);
2004 memcpy (font_allcs
, base_fontname
, p
- base_fontname
);
2005 strcat (font_allcs
, allcs
);
2007 /* Build the font spec that matches all families and
2009 len
= p
- p1
+ strlen (allcs
) + strlen (allfamilies
) + 1;
2010 font_allfamilies
= (char *) alloca (len
);
2011 memset (font_allfamilies
, 0, len
);
2012 strcpy (font_allfamilies
, allfamilies
);
2013 memcpy (font_allfamilies
+ strlen (allfamilies
), p1
, p
- p1
);
2014 strcat (font_allfamilies
, allcs
);
2016 /* Build the font spec that matches all. */
2017 len
= p
- p2
+ strlen (allcs
) + strlen (all
) + strlen (allfamilies
) + 1;
2018 font_all
= (char *) alloca (len
);
2019 memset (font_all
, 0, len
);
2020 strcpy (font_all
, allfamilies
);
2021 strcat (font_all
, all
);
2022 memcpy (font_all
+ strlen (all
) + strlen (allfamilies
), p2
, p
- p2
);
2023 strcat (font_all
, allcs
);
2025 /* Build the actual font set name. */
2026 len
= strlen (base_fontname
) + strlen (font_allcs
)
2027 + strlen (font_allfamilies
) + strlen (font_all
) + 5;
2028 fontsetname
= xmalloc (len
);
2029 memset (fontsetname
, 0, len
);
2030 strcpy (fontsetname
, base_fontname
);
2031 strcat (fontsetname
, sep
);
2032 strcat (fontsetname
, font_allcs
);
2033 strcat (fontsetname
, sep
);
2034 strcat (fontsetname
, font_allfamilies
);
2035 strcat (fontsetname
, sep
);
2036 strcat (fontsetname
, font_all
);
2040 strcat (fontsetname
, ":");
2044 #ifdef DEBUG_XIC_FONTSET
2046 print_fontset_result (xfs
, name
, missing_list
, missing_count
)
2049 char **missing_list
;
2053 fprintf (stderr
, "XIC Fontset created: %s\n", name
);
2056 fprintf (stderr
, "XIC Fontset failed: %s\n", name
);
2057 while (missing_count
-- > 0)
2059 fprintf (stderr
, " missing: %s\n", *missing_list
);
2068 xic_create_xfontset (struct frame
*f
)
2070 XFontSet xfs
= NULL
;
2071 struct font
*font
= FRAME_FONT (f
);
2072 int pixel_size
= font
->pixel_size
;
2073 Lisp_Object rest
, frame
;
2075 /* See if there is another frame already using same fontset. */
2076 FOR_EACH_FRAME (rest
, frame
)
2078 struct frame
*cf
= XFRAME (frame
);
2080 if (cf
!= f
&& FRAME_LIVE_P (f
) && FRAME_X_P (cf
)
2081 && FRAME_X_DISPLAY_INFO (cf
) == FRAME_X_DISPLAY_INFO (f
)
2083 && FRAME_FONT (f
)->pixel_size
== pixel_size
)
2085 xfs
= FRAME_XIC_FONTSET (cf
);
2093 char **missing_list
;
2096 const char *xlfd_format
= "-*-*-medium-r-normal--%d-*-*-*-*-*";
2098 sprintf (buf
, xlfd_format
, pixel_size
);
2099 missing_list
= NULL
;
2100 xfs
= XCreateFontSet (FRAME_X_DISPLAY (f
), buf
,
2101 &missing_list
, &missing_count
, &def_string
);
2102 #ifdef DEBUG_XIC_FONTSET
2103 print_fontset_result (xfs
, buf
, missing_list
, missing_count
);
2106 XFreeStringList (missing_list
);
2109 /* List of pixel sizes most likely available. Find one that
2110 is closest to pixel_size. */
2111 int sizes
[] = {0, 8, 10, 11, 12, 14, 17, 18, 20, 24, 26, 34, 0};
2112 int *smaller
, *larger
;
2114 for (smaller
= sizes
; smaller
[1]; smaller
++)
2115 if (smaller
[1] >= pixel_size
)
2117 larger
= smaller
+ 1;
2118 if (*larger
== pixel_size
)
2120 while (*smaller
|| *larger
)
2125 this_size
= *smaller
--;
2126 else if (! *smaller
)
2127 this_size
= *larger
++;
2128 else if (pixel_size
- *smaller
< *larger
- pixel_size
)
2129 this_size
= *smaller
--;
2131 this_size
= *larger
++;
2132 sprintf (buf
, xlfd_format
, this_size
);
2133 missing_list
= NULL
;
2134 xfs
= XCreateFontSet (FRAME_X_DISPLAY (f
), buf
,
2135 &missing_list
, &missing_count
, &def_string
);
2136 #ifdef DEBUG_XIC_FONTSET
2137 print_fontset_result (xfs
, buf
, missing_list
, missing_count
);
2140 XFreeStringList (missing_list
);
2147 const char *last_resort
= "-*-*-*-r-normal--*-*-*-*-*-*";
2149 missing_list
= NULL
;
2150 xfs
= XCreateFontSet (FRAME_X_DISPLAY (f
), last_resort
,
2151 &missing_list
, &missing_count
, &def_string
);
2152 #ifdef DEBUG_XIC_FONTSET
2153 print_fontset_result (xfs
, last_resort
, missing_list
, missing_count
);
2156 XFreeStringList (missing_list
);
2164 /* Free the X fontset of frame F if it is the last frame using it. */
2167 xic_free_xfontset (struct frame
*f
)
2169 Lisp_Object rest
, frame
;
2172 if (!FRAME_XIC_FONTSET (f
))
2175 /* See if there is another frame sharing the same fontset. */
2176 FOR_EACH_FRAME (rest
, frame
)
2178 struct frame
*cf
= XFRAME (frame
);
2179 if (cf
!= f
&& FRAME_LIVE_P (f
) && FRAME_X_P (cf
)
2180 && FRAME_X_DISPLAY_INFO (cf
) == FRAME_X_DISPLAY_INFO (f
)
2181 && FRAME_XIC_FONTSET (cf
) == FRAME_XIC_FONTSET (f
))
2189 /* The fontset is not used anymore. It is safe to free it. */
2190 XFreeFontSet (FRAME_X_DISPLAY (f
), FRAME_XIC_FONTSET (f
));
2192 if (FRAME_XIC_BASE_FONTNAME (f
))
2193 xfree (FRAME_XIC_BASE_FONTNAME (f
));
2194 FRAME_XIC_BASE_FONTNAME (f
) = NULL
;
2195 FRAME_XIC_FONTSET (f
) = NULL
;
2199 /* Value is the best input style, given user preferences USER (already
2200 checked to be supported by Emacs), and styles supported by the
2201 input method XIM. */
2204 best_xim_style (XIMStyles
*user
, XIMStyles
*xim
)
2208 for (i
= 0; i
< user
->count_styles
; ++i
)
2209 for (j
= 0; j
< xim
->count_styles
; ++j
)
2210 if (user
->supported_styles
[i
] == xim
->supported_styles
[j
])
2211 return user
->supported_styles
[i
];
2213 /* Return the default style. */
2214 return XIMPreeditNothing
| XIMStatusNothing
;
2217 /* Create XIC for frame F. */
2219 static XIMStyle xic_style
;
2222 create_frame_xic (struct frame
*f
)
2226 XFontSet xfs
= NULL
;
2231 /* Create X fontset. */
2232 xfs
= xic_create_xfontset (f
);
2233 xim
= FRAME_X_XIM (f
);
2238 XVaNestedList preedit_attr
;
2239 XVaNestedList status_attr
;
2241 s_area
.x
= 0; s_area
.y
= 0; s_area
.width
= 1; s_area
.height
= 1;
2242 spot
.x
= 0; spot
.y
= 1;
2244 /* Determine XIC style. */
2247 XIMStyles supported_list
;
2248 supported_list
.count_styles
= (sizeof supported_xim_styles
2249 / sizeof supported_xim_styles
[0]);
2250 supported_list
.supported_styles
= supported_xim_styles
;
2251 xic_style
= best_xim_style (&supported_list
,
2252 FRAME_X_XIM_STYLES (f
));
2255 preedit_attr
= XVaCreateNestedList (0,
2258 FRAME_FOREGROUND_PIXEL (f
),
2260 FRAME_BACKGROUND_PIXEL (f
),
2261 (xic_style
& XIMPreeditPosition
2266 status_attr
= XVaCreateNestedList (0,
2272 FRAME_FOREGROUND_PIXEL (f
),
2274 FRAME_BACKGROUND_PIXEL (f
),
2277 xic
= XCreateIC (xim
,
2278 XNInputStyle
, xic_style
,
2279 XNClientWindow
, FRAME_X_WINDOW (f
),
2280 XNFocusWindow
, FRAME_X_WINDOW (f
),
2281 XNStatusAttributes
, status_attr
,
2282 XNPreeditAttributes
, preedit_attr
,
2284 XFree (preedit_attr
);
2285 XFree (status_attr
);
2288 FRAME_XIC (f
) = xic
;
2289 FRAME_XIC_STYLE (f
) = xic_style
;
2290 FRAME_XIC_FONTSET (f
) = xfs
;
2294 /* Destroy XIC and free XIC fontset of frame F, if any. */
2297 free_frame_xic (struct frame
*f
)
2299 if (FRAME_XIC (f
) == NULL
)
2302 XDestroyIC (FRAME_XIC (f
));
2303 xic_free_xfontset (f
);
2305 FRAME_XIC (f
) = NULL
;
2309 /* Place preedit area for XIC of window W's frame to specified
2310 pixel position X/Y. X and Y are relative to window W. */
2313 xic_set_preeditarea (struct window
*w
, int x
, int y
)
2315 struct frame
*f
= XFRAME (w
->frame
);
2319 spot
.x
= WINDOW_TO_FRAME_PIXEL_X (w
, x
) + WINDOW_LEFT_FRINGE_WIDTH (w
);
2320 spot
.y
= WINDOW_TO_FRAME_PIXEL_Y (w
, y
) + FONT_BASE (FRAME_FONT (f
));
2321 attr
= XVaCreateNestedList (0, XNSpotLocation
, &spot
, NULL
);
2322 XSetICValues (FRAME_XIC (f
), XNPreeditAttributes
, attr
, NULL
);
2327 /* Place status area for XIC in bottom right corner of frame F.. */
2330 xic_set_statusarea (struct frame
*f
)
2332 XIC xic
= FRAME_XIC (f
);
2337 /* Negotiate geometry of status area. If input method has existing
2338 status area, use its current size. */
2339 area
.x
= area
.y
= area
.width
= area
.height
= 0;
2340 attr
= XVaCreateNestedList (0, XNAreaNeeded
, &area
, NULL
);
2341 XSetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2344 attr
= XVaCreateNestedList (0, XNAreaNeeded
, &needed
, NULL
);
2345 XGetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2348 if (needed
->width
== 0) /* Use XNArea instead of XNAreaNeeded */
2350 attr
= XVaCreateNestedList (0, XNArea
, &needed
, NULL
);
2351 XGetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2355 area
.width
= needed
->width
;
2356 area
.height
= needed
->height
;
2357 area
.x
= FRAME_PIXEL_WIDTH (f
) - area
.width
- FRAME_INTERNAL_BORDER_WIDTH (f
);
2358 area
.y
= (FRAME_PIXEL_HEIGHT (f
) - area
.height
2359 - FRAME_MENUBAR_HEIGHT (f
)
2360 - FRAME_TOOLBAR_TOP_HEIGHT (f
)
2361 - FRAME_INTERNAL_BORDER_WIDTH (f
));
2364 attr
= XVaCreateNestedList (0, XNArea
, &area
, NULL
);
2365 XSetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2370 /* Set X fontset for XIC of frame F, using base font name
2371 BASE_FONTNAME. Called when a new Emacs fontset is chosen. */
2374 xic_set_xfontset (struct frame
*f
, const char *base_fontname
)
2379 xic_free_xfontset (f
);
2381 xfs
= xic_create_xfontset (f
);
2383 attr
= XVaCreateNestedList (0, XNFontSet
, xfs
, NULL
);
2384 if (FRAME_XIC_STYLE (f
) & XIMPreeditPosition
)
2385 XSetICValues (FRAME_XIC (f
), XNPreeditAttributes
, attr
, NULL
);
2386 if (FRAME_XIC_STYLE (f
) & XIMStatusArea
)
2387 XSetICValues (FRAME_XIC (f
), XNStatusAttributes
, attr
, NULL
);
2390 FRAME_XIC_FONTSET (f
) = xfs
;
2393 #endif /* HAVE_X_I18N */
2397 #ifdef USE_X_TOOLKIT
2399 /* Create and set up the X widget for frame F. */
2402 x_window (struct frame
*f
, long window_prompting
, int minibuffer_only
)
2404 XClassHint class_hints
;
2405 XSetWindowAttributes attributes
;
2406 unsigned long attribute_mask
;
2407 Widget shell_widget
;
2409 Widget frame_widget
;
2415 /* Use the resource name as the top-level widget name
2416 for looking up resources. Make a non-Lisp copy
2417 for the window manager, so GC relocation won't bother it.
2419 Elsewhere we specify the window name for the window manager. */
2422 char *str
= (char *) SDATA (Vx_resource_name
);
2423 f
->namebuf
= (char *) xmalloc (strlen (str
) + 1);
2424 strcpy (f
->namebuf
, str
);
2428 XtSetArg (al
[ac
], XtNallowShellResize
, 1); ac
++;
2429 XtSetArg (al
[ac
], XtNinput
, 1); ac
++;
2430 XtSetArg (al
[ac
], XtNmappedWhenManaged
, 0); ac
++;
2431 XtSetArg (al
[ac
], XtNborderWidth
, f
->border_width
); ac
++;
2432 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2433 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2434 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2435 shell_widget
= XtAppCreateShell (f
->namebuf
, EMACS_CLASS
,
2436 applicationShellWidgetClass
,
2437 FRAME_X_DISPLAY (f
), al
, ac
);
2439 f
->output_data
.x
->widget
= shell_widget
;
2440 /* maybe_set_screen_title_format (shell_widget); */
2442 pane_widget
= lw_create_widget ("main", "pane", widget_id_tick
++,
2443 (widget_value
*) NULL
,
2444 shell_widget
, False
,
2448 (lw_callback
) NULL
);
2451 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2452 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2453 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2454 XtSetArg (al
[ac
], XtNborderWidth
, 0); ac
++;
2455 XtSetValues (pane_widget
, al
, ac
);
2456 f
->output_data
.x
->column_widget
= pane_widget
;
2458 /* mappedWhenManaged to false tells to the paned window to not map/unmap
2459 the emacs screen when changing menubar. This reduces flickering. */
2462 XtSetArg (al
[ac
], XtNmappedWhenManaged
, 0); ac
++;
2463 XtSetArg (al
[ac
], XtNshowGrip
, 0); ac
++;
2464 XtSetArg (al
[ac
], XtNallowResize
, 1); ac
++;
2465 XtSetArg (al
[ac
], XtNresizeToPreferred
, 1); ac
++;
2466 XtSetArg (al
[ac
], XtNemacsFrame
, f
); ac
++;
2467 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2468 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2469 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2470 XtSetArg (al
[ac
], XtNborderWidth
, 0); ac
++;
2471 frame_widget
= XtCreateWidget (f
->namebuf
, emacsFrameClass
, pane_widget
,
2474 f
->output_data
.x
->edit_widget
= frame_widget
;
2476 XtManageChild (frame_widget
);
2478 /* Do some needed geometry management. */
2481 char *tem
, shell_position
[32];
2484 int extra_borders
= 0;
2486 = (f
->output_data
.x
->menubar_widget
2487 ? (f
->output_data
.x
->menubar_widget
->core
.height
2488 + f
->output_data
.x
->menubar_widget
->core
.border_width
)
2491 #if 0 /* Experimentally, we now get the right results
2492 for -geometry -0-0 without this. 24 Aug 96, rms. */
2493 if (FRAME_EXTERNAL_MENU_BAR (f
))
2496 XtVaGetValues (pane_widget
, XtNinternalBorderWidth
, &ibw
, NULL
);
2497 menubar_size
+= ibw
;
2501 f
->output_data
.x
->menubar_height
= menubar_size
;
2504 /* Motif seems to need this amount added to the sizes
2505 specified for the shell widget. The Athena/Lucid widgets don't.
2506 Both conclusions reached experimentally. -- rms. */
2507 XtVaGetValues (f
->output_data
.x
->edit_widget
, XtNinternalBorderWidth
,
2508 &extra_borders
, NULL
);
2512 /* Convert our geometry parameters into a geometry string
2514 Note that we do not specify here whether the position
2515 is a user-specified or program-specified one.
2516 We pass that information later, in x_wm_set_size_hints. */
2518 int left
= f
->left_pos
;
2519 int xneg
= window_prompting
& XNegative
;
2520 int top
= f
->top_pos
;
2521 int yneg
= window_prompting
& YNegative
;
2527 if (window_prompting
& USPosition
)
2528 sprintf (shell_position
, "=%dx%d%c%d%c%d",
2529 FRAME_PIXEL_WIDTH (f
) + extra_borders
,
2530 FRAME_PIXEL_HEIGHT (f
) + menubar_size
+ extra_borders
,
2531 (xneg
? '-' : '+'), left
,
2532 (yneg
? '-' : '+'), top
);
2535 sprintf (shell_position
, "=%dx%d",
2536 FRAME_PIXEL_WIDTH (f
) + extra_borders
,
2537 FRAME_PIXEL_HEIGHT (f
) + menubar_size
+ extra_borders
);
2539 /* Setting x and y when the position is not specified in
2540 the geometry string will set program position in the WM hints.
2541 If Emacs had just one program position, we could set it in
2542 fallback resources, but since each make-frame call can specify
2543 different program positions, this is easier. */
2544 XtSetArg (al
[ac
], XtNx
, left
); ac
++;
2545 XtSetArg (al
[ac
], XtNy
, top
); ac
++;
2549 len
= strlen (shell_position
) + 1;
2550 /* We don't free this because we don't know whether
2551 it is safe to free it while the frame exists.
2552 It isn't worth the trouble of arranging to free it
2553 when the frame is deleted. */
2554 tem
= (char *) xmalloc (len
);
2555 strncpy (tem
, shell_position
, len
);
2556 XtSetArg (al
[ac
], XtNgeometry
, tem
); ac
++;
2557 XtSetValues (shell_widget
, al
, ac
);
2560 XtManageChild (pane_widget
);
2561 XtRealizeWidget (shell_widget
);
2563 if (FRAME_X_EMBEDDED_P (f
))
2564 XReparentWindow (FRAME_X_DISPLAY (f
), XtWindow (shell_widget
),
2565 f
->output_data
.x
->parent_desc
, 0, 0);
2567 FRAME_X_WINDOW (f
) = XtWindow (frame_widget
);
2569 validate_x_resource_name ();
2571 class_hints
.res_name
= (char *) SDATA (Vx_resource_name
);
2572 class_hints
.res_class
= (char *) SDATA (Vx_resource_class
);
2573 XSetClassHint (FRAME_X_DISPLAY (f
), XtWindow (shell_widget
), &class_hints
);
2576 FRAME_XIC (f
) = NULL
;
2578 create_frame_xic (f
);
2581 f
->output_data
.x
->wm_hints
.input
= True
;
2582 f
->output_data
.x
->wm_hints
.flags
|= InputHint
;
2583 XSetWMHints (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2584 &f
->output_data
.x
->wm_hints
);
2586 hack_wm_protocols (f
, shell_widget
);
2589 XtAddEventHandler (shell_widget
, 0, True
, _XEditResCheckMessages
, 0);
2592 /* Do a stupid property change to force the server to generate a
2593 PropertyNotify event so that the event_stream server timestamp will
2594 be initialized to something relevant to the time we created the window.
2596 XChangeProperty (XtDisplay (frame_widget
), XtWindow (frame_widget
),
2597 FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
2598 XA_ATOM
, 32, PropModeAppend
,
2599 (unsigned char*) NULL
, 0);
2601 /* Make all the standard events reach the Emacs frame. */
2602 attributes
.event_mask
= STANDARD_EVENT_SET
;
2607 /* XIM server might require some X events. */
2608 unsigned long fevent
= NoEventMask
;
2609 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2610 attributes
.event_mask
|= fevent
;
2612 #endif /* HAVE_X_I18N */
2614 attribute_mask
= CWEventMask
;
2615 XChangeWindowAttributes (XtDisplay (shell_widget
), XtWindow (shell_widget
),
2616 attribute_mask
, &attributes
);
2618 XtMapWidget (frame_widget
);
2620 /* x_set_name normally ignores requests to set the name if the
2621 requested name is the same as the current name. This is the one
2622 place where that assumption isn't correct; f->name is set, but
2623 the X server hasn't been told. */
2626 int explicit = f
->explicit_name
;
2628 f
->explicit_name
= 0;
2631 x_set_name (f
, name
, explicit);
2634 XDefineCursor (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2635 f
->output_data
.x
->current_cursor
2636 = f
->output_data
.x
->text_cursor
);
2640 /* This is a no-op, except under Motif. Make sure main areas are
2641 set to something reasonable, in case we get an error later. */
2642 lw_set_main_areas (pane_widget
, 0, frame_widget
);
2645 #else /* not USE_X_TOOLKIT */
2648 x_window (FRAME_PTR f
)
2650 if (! xg_create_frame_widgets (f
))
2651 error ("Unable to create window");
2654 FRAME_XIC (f
) = NULL
;
2658 create_frame_xic (f
);
2661 /* XIM server might require some X events. */
2662 unsigned long fevent
= NoEventMask
;
2663 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2665 if (fevent
!= NoEventMask
)
2667 XSetWindowAttributes attributes
;
2668 XWindowAttributes wattr
;
2669 unsigned long attribute_mask
;
2671 XGetWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2673 attributes
.event_mask
= wattr
.your_event_mask
| fevent
;
2674 attribute_mask
= CWEventMask
;
2675 XChangeWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2676 attribute_mask
, &attributes
);
2684 #else /*! USE_GTK */
2685 /* Create and set up the X window for frame F. */
2688 x_window (struct frame
*f
)
2690 XClassHint class_hints
;
2691 XSetWindowAttributes attributes
;
2692 unsigned long attribute_mask
;
2694 attributes
.background_pixel
= FRAME_BACKGROUND_PIXEL (f
);
2695 attributes
.border_pixel
= f
->output_data
.x
->border_pixel
;
2696 attributes
.bit_gravity
= StaticGravity
;
2697 attributes
.backing_store
= NotUseful
;
2698 attributes
.save_under
= True
;
2699 attributes
.event_mask
= STANDARD_EVENT_SET
;
2700 attributes
.colormap
= FRAME_X_COLORMAP (f
);
2701 attribute_mask
= (CWBackPixel
| CWBorderPixel
| CWBitGravity
| CWEventMask
2706 = XCreateWindow (FRAME_X_DISPLAY (f
),
2707 f
->output_data
.x
->parent_desc
,
2710 FRAME_PIXEL_WIDTH (f
), FRAME_PIXEL_HEIGHT (f
),
2712 CopyFromParent
, /* depth */
2713 InputOutput
, /* class */
2715 attribute_mask
, &attributes
);
2720 create_frame_xic (f
);
2723 /* XIM server might require some X events. */
2724 unsigned long fevent
= NoEventMask
;
2725 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2726 attributes
.event_mask
|= fevent
;
2727 attribute_mask
= CWEventMask
;
2728 XChangeWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2729 attribute_mask
, &attributes
);
2732 #endif /* HAVE_X_I18N */
2734 validate_x_resource_name ();
2736 class_hints
.res_name
= (char *) SDATA (Vx_resource_name
);
2737 class_hints
.res_class
= (char *) SDATA (Vx_resource_class
);
2738 XSetClassHint (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), &class_hints
);
2740 /* The menubar is part of the ordinary display;
2741 it does not count in addition to the height of the window. */
2742 f
->output_data
.x
->menubar_height
= 0;
2744 /* This indicates that we use the "Passive Input" input model.
2745 Unless we do this, we don't get the Focus{In,Out} events that we
2746 need to draw the cursor correctly. Accursed bureaucrats.
2747 XWhipsAndChains (FRAME_X_DISPLAY (f), IronMaiden, &TheRack); */
2749 f
->output_data
.x
->wm_hints
.input
= True
;
2750 f
->output_data
.x
->wm_hints
.flags
|= InputHint
;
2751 XSetWMHints (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2752 &f
->output_data
.x
->wm_hints
);
2753 f
->output_data
.x
->wm_hints
.icon_pixmap
= None
;
2755 /* Request "save yourself" and "delete window" commands from wm. */
2758 protocols
[0] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
;
2759 protocols
[1] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
;
2760 XSetWMProtocols (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), protocols
, 2);
2763 /* x_set_name normally ignores requests to set the name if the
2764 requested name is the same as the current name. This is the one
2765 place where that assumption isn't correct; f->name is set, but
2766 the X server hasn't been told. */
2769 int explicit = f
->explicit_name
;
2771 f
->explicit_name
= 0;
2774 x_set_name (f
, name
, explicit);
2777 XDefineCursor (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2778 f
->output_data
.x
->current_cursor
2779 = f
->output_data
.x
->text_cursor
);
2783 if (FRAME_X_WINDOW (f
) == 0)
2784 error ("Unable to create window");
2787 #endif /* not USE_GTK */
2788 #endif /* not USE_X_TOOLKIT */
2790 /* Verify that the icon position args for this window are valid. */
2793 x_icon_verify (struct frame
*f
, Lisp_Object parms
)
2795 Lisp_Object icon_x
, icon_y
;
2797 /* Set the position of the icon. Note that twm groups all
2798 icons in an icon window. */
2799 icon_x
= x_frame_get_and_record_arg (f
, parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2800 icon_y
= x_frame_get_and_record_arg (f
, parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2801 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2803 CHECK_NUMBER (icon_x
);
2804 CHECK_NUMBER (icon_y
);
2806 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2807 error ("Both left and top icon corners of icon must be specified");
2810 /* Handle the icon stuff for this window. Perhaps later we might
2811 want an x_set_icon_position which can be called interactively as
2815 x_icon (struct frame
*f
, Lisp_Object parms
)
2817 Lisp_Object icon_x
, icon_y
;
2819 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2822 /* Set the position of the icon. Note that twm groups all
2823 icons in an icon window. */
2824 icon_x
= x_frame_get_and_record_arg (f
, parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2825 icon_y
= x_frame_get_and_record_arg (f
, parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2826 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2828 CHECK_NUMBER (icon_x
);
2829 CHECK_NUMBER (icon_y
);
2831 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2832 error ("Both left and top icon corners of icon must be specified");
2836 if (! EQ (icon_x
, Qunbound
))
2837 x_wm_set_icon_position (f
, XINT (icon_x
), XINT (icon_y
));
2839 #if 0 /* x_get_arg removes the visibility parameter as a side effect,
2840 but x_create_frame still needs it. */
2841 /* Start up iconic or window? */
2842 x_wm_set_window_state
2843 (f
, (EQ (x_get_arg (dpyinfo
, parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
),
2849 x_text_icon (f
, (char *) SDATA ((!NILP (f
->icon_name
)
2856 /* Make the GCs needed for this window, setting the
2857 background, border and mouse colors; also create the
2858 mouse cursor and the gray border tile. */
2861 x_make_gc (struct frame
*f
)
2863 XGCValues gc_values
;
2867 /* Create the GCs of this frame.
2868 Note that many default values are used. */
2870 gc_values
.foreground
= FRAME_FOREGROUND_PIXEL (f
);
2871 gc_values
.background
= FRAME_BACKGROUND_PIXEL (f
);
2872 gc_values
.line_width
= 0; /* Means 1 using fast algorithm. */
2873 f
->output_data
.x
->normal_gc
2874 = XCreateGC (FRAME_X_DISPLAY (f
),
2876 GCLineWidth
| GCForeground
| GCBackground
,
2879 /* Reverse video style. */
2880 gc_values
.foreground
= FRAME_BACKGROUND_PIXEL (f
);
2881 gc_values
.background
= FRAME_FOREGROUND_PIXEL (f
);
2882 f
->output_data
.x
->reverse_gc
2883 = XCreateGC (FRAME_X_DISPLAY (f
),
2885 GCForeground
| GCBackground
| GCLineWidth
,
2888 /* Cursor has cursor-color background, background-color foreground. */
2889 gc_values
.foreground
= FRAME_BACKGROUND_PIXEL (f
);
2890 gc_values
.background
= f
->output_data
.x
->cursor_pixel
;
2891 gc_values
.fill_style
= FillOpaqueStippled
;
2892 f
->output_data
.x
->cursor_gc
2893 = XCreateGC (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2894 (GCForeground
| GCBackground
2895 | GCFillStyle
| GCLineWidth
),
2899 f
->output_data
.x
->white_relief
.gc
= 0;
2900 f
->output_data
.x
->black_relief
.gc
= 0;
2902 /* Create the gray border tile used when the pointer is not in
2903 the frame. Since this depends on the frame's pixel values,
2904 this must be done on a per-frame basis. */
2905 f
->output_data
.x
->border_tile
2906 = (XCreatePixmapFromBitmapData
2907 (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
2908 gray_bits
, gray_width
, gray_height
,
2909 FRAME_FOREGROUND_PIXEL (f
),
2910 FRAME_BACKGROUND_PIXEL (f
),
2911 DefaultDepth (FRAME_X_DISPLAY (f
), FRAME_X_SCREEN_NUMBER (f
))));
2917 /* Free what was allocated in x_make_gc. */
2920 x_free_gcs (struct frame
*f
)
2922 Display
*dpy
= FRAME_X_DISPLAY (f
);
2926 if (f
->output_data
.x
->normal_gc
)
2928 XFreeGC (dpy
, f
->output_data
.x
->normal_gc
);
2929 f
->output_data
.x
->normal_gc
= 0;
2932 if (f
->output_data
.x
->reverse_gc
)
2934 XFreeGC (dpy
, f
->output_data
.x
->reverse_gc
);
2935 f
->output_data
.x
->reverse_gc
= 0;
2938 if (f
->output_data
.x
->cursor_gc
)
2940 XFreeGC (dpy
, f
->output_data
.x
->cursor_gc
);
2941 f
->output_data
.x
->cursor_gc
= 0;
2944 if (f
->output_data
.x
->border_tile
)
2946 XFreePixmap (dpy
, f
->output_data
.x
->border_tile
);
2947 f
->output_data
.x
->border_tile
= 0;
2954 /* Handler for signals raised during x_create_frame and
2955 x_create_top_frame. FRAME is the frame which is partially
2959 unwind_create_frame (Lisp_Object frame
)
2961 struct frame
*f
= XFRAME (frame
);
2963 /* If frame is already dead, nothing to do. This can happen if the
2964 display is disconnected after the frame has become official, but
2965 before x_create_frame removes the unwind protect. */
2966 if (!FRAME_LIVE_P (f
))
2969 /* If frame is ``official'', nothing to do. */
2970 if (!CONSP (Vframe_list
) || !EQ (XCAR (Vframe_list
), frame
))
2973 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2976 x_free_frame_resources (f
);
2979 /* Check that reference counts are indeed correct. */
2980 xassert (dpyinfo
->reference_count
== dpyinfo_refcount
);
2981 xassert (dpyinfo
->image_cache
->refcount
== image_cache_refcount
);
2991 x_default_font_parameter (struct frame
*f
, Lisp_Object parms
)
2993 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2994 Lisp_Object font_param
= x_get_arg (dpyinfo
, parms
, Qfont
, NULL
, NULL
,
2996 Lisp_Object font
= Qnil
;
2997 if (EQ (font_param
, Qunbound
))
3000 if (NILP (font_param
))
3002 /* System font should take precedendce over X resources. We suggest this
3003 regardless of font-use-system-font because .emacs may not have been
3005 const char *system_font
= xsettings_get_system_font ();
3008 char *name
= xstrdup (system_font
);
3009 font
= font_open_by_name (f
, name
);
3015 font
= !NILP (font_param
) ? font_param
3016 : x_get_arg (dpyinfo
, parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
3018 if (! FONTP (font
) && ! STRINGP (font
))
3023 /* This will find the normal Xft font. */
3026 "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1",
3027 "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1",
3028 "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1",
3029 /* This was formerly the first thing tried, but it finds
3030 too many fonts and takes too long. */
3031 "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1",
3032 /* If those didn't work, look for something which will
3034 "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1",
3039 for (i
= 0; names
[i
]; i
++)
3041 font
= font_open_by_name (f
, names
[i
]);
3046 error ("No suitable font was found");
3048 else if (!NILP (font_param
))
3050 /* Remember the explicit font parameter, so we can re-apply it after
3051 we've applied the `default' face settings. */
3052 x_set_frame_parameters (f
, Fcons (Fcons (Qfont_param
, font_param
), Qnil
));
3055 /* This call will make X resources override any system font setting. */
3056 x_default_parameter (f
, parms
, Qfont
, font
, "font", "Font", RES_TYPE_STRING
);
3060 DEFUN ("x-wm-set-size-hint", Fx_wm_set_size_hint
, Sx_wm_set_size_hint
,
3062 doc
: /* Send the size hints for frame FRAME to the window manager.
3063 If FRAME is nil, use the selected frame. */)
3068 frame
= selected_frame
;
3072 x_wm_set_size_hint (f
, 0, 0);
3078 set_machine_and_pid_properties (struct frame
*f
)
3080 /* See the above comment "Note: Encoding strategy". */
3083 int do_free_text_value
= 0;
3084 long pid
= (long) getpid ();
3086 text
.value
= x_encode_text (Vsystem_name
,
3087 Qcompound_text
, 0, &bytes
, &stringp
,
3088 &do_free_text_value
);
3089 text
.encoding
= (stringp
? XA_STRING
3090 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
3092 text
.nitems
= bytes
;
3093 XSetWMClientMachine (FRAME_X_DISPLAY (f
),
3094 FRAME_OUTER_WINDOW (f
),
3096 if (do_free_text_value
)
3099 XChangeProperty (FRAME_X_DISPLAY (f
),
3100 FRAME_OUTER_WINDOW (f
),
3101 XInternAtom (FRAME_X_DISPLAY (f
),
3104 XA_CARDINAL
, 32, PropModeReplace
,
3105 (unsigned char *) &pid
, 1);
3108 DEFUN ("x-create-frame", Fx_create_frame
, Sx_create_frame
,
3110 doc
: /* Make a new X window, which is called a "frame" in Emacs terms.
3111 Return an Emacs frame object.
3112 PARMS is an alist of frame parameters.
3113 If the parameters specify that the frame should not have a minibuffer,
3114 and do not specify a specific minibuffer window to use,
3115 then `default-minibuffer-frame' must be a frame whose minibuffer can
3116 be shared by the new frame.
3118 This function is an internal primitive--use `make-frame' instead. */)
3122 Lisp_Object frame
, tem
;
3124 int minibuffer_only
= 0;
3125 long window_prompting
= 0;
3127 int count
= SPECPDL_INDEX ();
3128 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
3129 Lisp_Object display
;
3130 struct x_display_info
*dpyinfo
= NULL
;
3134 parms
= Fcopy_alist (parms
);
3136 /* Use this general default value to start with
3137 until we know if this frame has a specified name. */
3138 Vx_resource_name
= Vinvocation_name
;
3140 display
= x_get_arg (dpyinfo
, parms
, Qterminal
, 0, 0, RES_TYPE_NUMBER
);
3141 if (EQ (display
, Qunbound
))
3142 display
= x_get_arg (dpyinfo
, parms
, Qdisplay
, 0, 0, RES_TYPE_STRING
);
3143 if (EQ (display
, Qunbound
))
3145 dpyinfo
= check_x_display_info (display
);
3146 kb
= dpyinfo
->terminal
->kboard
;
3148 if (!dpyinfo
->terminal
->name
)
3149 error ("Terminal is not live, can't create new frames on it");
3151 name
= x_get_arg (dpyinfo
, parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
3153 && ! EQ (name
, Qunbound
)
3155 error ("Invalid frame name--not a string or nil");
3158 Vx_resource_name
= name
;
3160 /* See if parent window is specified. */
3161 parent
= x_get_arg (dpyinfo
, parms
, Qparent_id
, NULL
, NULL
, RES_TYPE_NUMBER
);
3162 if (EQ (parent
, Qunbound
))
3164 if (! NILP (parent
))
3165 CHECK_NUMBER (parent
);
3167 /* make_frame_without_minibuffer can run Lisp code and garbage collect. */
3168 /* No need to protect DISPLAY because that's not used after passing
3169 it to make_frame_without_minibuffer. */
3171 GCPRO4 (parms
, parent
, name
, frame
);
3172 tem
= x_get_arg (dpyinfo
, parms
, Qminibuffer
, "minibuffer", "Minibuffer",
3174 if (EQ (tem
, Qnone
) || NILP (tem
))
3175 f
= make_frame_without_minibuffer (Qnil
, kb
, display
);
3176 else if (EQ (tem
, Qonly
))
3178 f
= make_minibuffer_frame ();
3179 minibuffer_only
= 1;
3181 else if (WINDOWP (tem
))
3182 f
= make_frame_without_minibuffer (tem
, kb
, display
);
3186 XSETFRAME (frame
, f
);
3188 /* Note that X Windows does support scroll bars. */
3189 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 1;
3191 f
->terminal
= dpyinfo
->terminal
;
3192 f
->terminal
->reference_count
++;
3194 f
->output_method
= output_x_window
;
3195 f
->output_data
.x
= (struct x_output
*) xmalloc (sizeof (struct x_output
));
3196 memset (f
->output_data
.x
, 0, sizeof (struct x_output
));
3197 f
->output_data
.x
->icon_bitmap
= -1;
3198 FRAME_FONTSET (f
) = -1;
3199 f
->output_data
.x
->scroll_bar_foreground_pixel
= -1;
3200 f
->output_data
.x
->scroll_bar_background_pixel
= -1;
3201 #ifdef USE_TOOLKIT_SCROLL_BARS
3202 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
3203 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
3204 #endif /* USE_TOOLKIT_SCROLL_BARS */
3207 = x_get_arg (dpyinfo
, parms
, Qicon_name
, "iconName", "Title",
3209 if (! STRINGP (f
->icon_name
))
3210 f
->icon_name
= Qnil
;
3212 FRAME_X_DISPLAY_INFO (f
) = dpyinfo
;
3214 /* With FRAME_X_DISPLAY_INFO set up, this unwind-protect is safe. */
3215 record_unwind_protect (unwind_create_frame
, frame
);
3217 image_cache_refcount
= FRAME_IMAGE_CACHE (f
)->refcount
;
3218 dpyinfo_refcount
= dpyinfo
->reference_count
;
3219 #endif /* GLYPH_DEBUG */
3221 /* These colors will be set anyway later, but it's important
3222 to get the color reference counts right, so initialize them! */
3225 struct gcpro gcpro1
;
3227 /* Function x_decode_color can signal an error. Make
3228 sure to initialize color slots so that we won't try
3229 to free colors we haven't allocated. */
3230 FRAME_FOREGROUND_PIXEL (f
) = -1;
3231 FRAME_BACKGROUND_PIXEL (f
) = -1;
3232 f
->output_data
.x
->cursor_pixel
= -1;
3233 f
->output_data
.x
->cursor_foreground_pixel
= -1;
3234 f
->output_data
.x
->border_pixel
= -1;
3235 f
->output_data
.x
->mouse_pixel
= -1;
3237 black
= build_string ("black");
3239 FRAME_FOREGROUND_PIXEL (f
)
3240 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3241 FRAME_BACKGROUND_PIXEL (f
)
3242 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3243 f
->output_data
.x
->cursor_pixel
3244 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3245 f
->output_data
.x
->cursor_foreground_pixel
3246 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3247 f
->output_data
.x
->border_pixel
3248 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3249 f
->output_data
.x
->mouse_pixel
3250 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3254 /* Specify the parent under which to make this X window. */
3258 f
->output_data
.x
->parent_desc
= (Window
) XFASTINT (parent
);
3259 f
->output_data
.x
->explicit_parent
= 1;
3263 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
3264 f
->output_data
.x
->explicit_parent
= 0;
3267 /* Set the name; the functions to which we pass f expect the name to
3269 if (EQ (name
, Qunbound
) || NILP (name
))
3271 f
->name
= build_string (dpyinfo
->x_id_name
);
3272 f
->explicit_name
= 0;
3277 f
->explicit_name
= 1;
3278 /* use the frame's title when getting resources for this frame. */
3279 specbind (Qx_resource_name
, name
);
3282 f
->resx
= dpyinfo
->resx
;
3283 f
->resy
= dpyinfo
->resy
;
3285 #ifdef HAVE_FREETYPE
3287 register_font_driver (&xftfont_driver
, f
);
3288 #else /* not HAVE_XFT */
3289 register_font_driver (&ftxfont_driver
, f
);
3290 #endif /* not HAVE_XFT */
3291 #endif /* HAVE_FREETYPE */
3292 register_font_driver (&xfont_driver
, f
);
3294 x_default_parameter (f
, parms
, Qfont_backend
, Qnil
,
3295 "fontBackend", "FontBackend", RES_TYPE_STRING
);
3297 /* Extract the window parameters from the supplied values
3298 that are needed to determine window geometry. */
3299 x_default_font_parameter (f
, parms
);
3300 if (!FRAME_FONT (f
))
3302 delete_frame (frame
, Qnoelisp
);
3303 error ("Invalid frame font");
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 (0),
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
,
3333 #if defined(USE_GTK) && defined(USE_TOOLKIT_SCROLL_BARS)
3338 "verticalScrollBars", "ScrollBars",
3341 /* Also do the stuff which must be set before the window exists. */
3342 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
3343 "foreground", "Foreground", RES_TYPE_STRING
);
3344 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
3345 "background", "Background", RES_TYPE_STRING
);
3346 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
3347 "pointerColor", "Foreground", RES_TYPE_STRING
);
3348 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
3349 "cursorColor", "Foreground", RES_TYPE_STRING
);
3350 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
3351 "borderColor", "BorderColor", RES_TYPE_STRING
);
3352 x_default_parameter (f
, parms
, Qscreen_gamma
, Qnil
,
3353 "screenGamma", "ScreenGamma", RES_TYPE_FLOAT
);
3354 x_default_parameter (f
, parms
, Qline_spacing
, Qnil
,
3355 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER
);
3356 x_default_parameter (f
, parms
, Qleft_fringe
, Qnil
,
3357 "leftFringe", "LeftFringe", RES_TYPE_NUMBER
);
3358 x_default_parameter (f
, parms
, Qright_fringe
, Qnil
,
3359 "rightFringe", "RightFringe", RES_TYPE_NUMBER
);
3361 x_default_scroll_bar_color_parameter (f
, parms
, Qscroll_bar_foreground
,
3362 "scrollBarForeground",
3363 "ScrollBarForeground", 1);
3364 x_default_scroll_bar_color_parameter (f
, parms
, Qscroll_bar_background
,
3365 "scrollBarBackground",
3366 "ScrollBarBackground", 0);
3368 /* Init faces before x_default_parameter is called for scroll-bar
3369 parameters because that function calls x_set_scroll_bar_width,
3370 which calls change_frame_size, which calls Fset_window_buffer,
3371 which runs hooks, which call Fvertical_motion. At the end, we
3372 end up in init_iterator with a null face cache, which should not
3374 init_frame_faces (f
);
3376 /* The X resources controlling the menu-bar and tool-bar are
3377 processed specially at startup, and reflected in the mode
3378 variables; ignore them here. */
3379 x_default_parameter (f
, parms
, Qmenu_bar_lines
,
3380 NILP (Vmenu_bar_mode
)
3381 ? make_number (0) : make_number (1),
3382 NULL
, NULL
, RES_TYPE_NUMBER
);
3383 x_default_parameter (f
, parms
, Qtool_bar_lines
,
3384 NILP (Vtool_bar_mode
)
3385 ? make_number (0) : make_number (1),
3386 NULL
, NULL
, RES_TYPE_NUMBER
);
3388 x_default_parameter (f
, parms
, Qbuffer_predicate
, Qnil
,
3389 "bufferPredicate", "BufferPredicate",
3391 x_default_parameter (f
, parms
, Qtitle
, Qnil
,
3392 "title", "Title", RES_TYPE_STRING
);
3393 x_default_parameter (f
, parms
, Qwait_for_wm
, Qt
,
3394 "waitForWM", "WaitForWM", RES_TYPE_BOOLEAN
);
3395 x_default_parameter (f
, parms
, Qfullscreen
, Qnil
,
3396 "fullscreen", "Fullscreen", RES_TYPE_SYMBOL
);
3397 x_default_parameter (f
, parms
, Qtool_bar_position
,
3398 f
->tool_bar_position
, 0, 0, RES_TYPE_SYMBOL
);
3400 /* Compute the size of the X window. */
3401 window_prompting
= x_figure_window_size (f
, parms
, 1);
3403 tem
= x_get_arg (dpyinfo
, parms
, Qunsplittable
, 0, 0, RES_TYPE_BOOLEAN
);
3404 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
3406 x_icon_verify (f
, parms
);
3408 /* Create the X widget or window. */
3409 #ifdef USE_X_TOOLKIT
3410 x_window (f
, window_prompting
, minibuffer_only
);
3418 /* Now consider the frame official. */
3419 FRAME_X_DISPLAY_INFO (f
)->reference_count
++;
3420 Vframe_list
= Fcons (frame
, Vframe_list
);
3422 /* We need to do this after creating the X window, so that the
3423 icon-creation functions can say whose icon they're describing. */
3424 x_default_parameter (f
, parms
, Qicon_type
, Qt
,
3425 "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL
);
3427 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
3428 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3429 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
3430 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3431 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
3432 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
3433 x_default_parameter (f
, parms
, Qscroll_bar_width
, Qnil
,
3434 "scrollBarWidth", "ScrollBarWidth",
3436 x_default_parameter (f
, parms
, Qalpha
, Qnil
,
3437 "alpha", "Alpha", RES_TYPE_NUMBER
);
3439 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
3440 Change will not be effected unless different from the current
3442 width
= FRAME_COLS (f
);
3443 height
= FRAME_LINES (f
);
3445 SET_FRAME_COLS (f
, 0);
3446 FRAME_LINES (f
) = 0;
3447 change_frame_size (f
, height
, width
, 1, 0, 0);
3449 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
3450 /* Create the menu bar. */
3451 if (!minibuffer_only
&& FRAME_EXTERNAL_MENU_BAR (f
))
3453 /* If this signals an error, we haven't set size hints for the
3454 frame and we didn't make it visible. */
3455 initialize_frame_menubar (f
);
3458 /* This is a no-op, except under Motif where it arranges the
3459 main window for the widgets on it. */
3460 lw_set_main_areas (f
->output_data
.x
->column_widget
,
3461 f
->output_data
.x
->menubar_widget
,
3462 f
->output_data
.x
->edit_widget
);
3463 #endif /* not USE_GTK */
3465 #endif /* USE_X_TOOLKIT || USE_GTK */
3467 /* Tell the server what size and position, etc, we want, and how
3468 badly we want them. This should be done after we have the menu
3469 bar so that its size can be taken into account. */
3471 x_wm_set_size_hint (f
, window_prompting
, 0);
3474 /* Make the window appear on the frame and enable display, unless
3475 the caller says not to. However, with explicit parent, Emacs
3476 cannot control visibility, so don't try. */
3477 if (! f
->output_data
.x
->explicit_parent
)
3479 Lisp_Object visibility
;
3481 visibility
= x_get_arg (dpyinfo
, parms
, Qvisibility
, 0, 0,
3483 if (EQ (visibility
, Qunbound
))
3486 if (EQ (visibility
, Qicon
))
3487 x_iconify_frame (f
);
3488 else if (! NILP (visibility
))
3489 x_make_frame_visible (f
);
3491 /* Must have been Qnil. */
3497 /* Set machine name and pid for the purpose of window managers. */
3498 set_machine_and_pid_properties(f
);
3500 /* Set the WM leader property. GTK does this itself, so this is not
3501 needed when using GTK. */
3502 if (dpyinfo
->client_leader_window
!= 0)
3504 XChangeProperty (FRAME_X_DISPLAY (f
),
3505 FRAME_OUTER_WINDOW (f
),
3506 dpyinfo
->Xatom_wm_client_leader
,
3507 XA_WINDOW
, 32, PropModeReplace
,
3508 (unsigned char *) &dpyinfo
->client_leader_window
, 1);
3513 /* Initialize `default-minibuffer-frame' in case this is the first
3514 frame on this terminal. */
3515 if (FRAME_HAS_MINIBUF_P (f
)
3516 && (!FRAMEP (kb
->Vdefault_minibuffer_frame
)
3517 || !FRAME_LIVE_P (XFRAME (kb
->Vdefault_minibuffer_frame
))))
3518 kb
->Vdefault_minibuffer_frame
= frame
;
3520 /* All remaining specified parameters, which have not been "used"
3521 by x_get_arg and friends, now go in the misc. alist of the frame. */
3522 for (tem
= parms
; CONSP (tem
); tem
= XCDR (tem
))
3523 if (CONSP (XCAR (tem
)) && !NILP (XCAR (XCAR (tem
))))
3524 f
->param_alist
= Fcons (XCAR (tem
), f
->param_alist
);
3528 /* Make sure windows on this frame appear in calls to next-window
3529 and similar functions. */
3530 Vwindow_list
= Qnil
;
3532 return unbind_to (count
, frame
);
3536 /* FRAME is used only to get a handle on the X display. We don't pass the
3537 display info directly because we're called from frame.c, which doesn't
3538 know about that structure. */
3541 x_get_focus_frame (struct frame
*frame
)
3543 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (frame
);
3545 if (! dpyinfo
->x_focus_frame
)
3548 XSETFRAME (xfocus
, dpyinfo
->x_focus_frame
);
3553 /* In certain situations, when the window manager follows a
3554 click-to-focus policy, there seems to be no way around calling
3555 XSetInputFocus to give another frame the input focus .
3557 In an ideal world, XSetInputFocus should generally be avoided so
3558 that applications don't interfere with the window manager's focus
3559 policy. But I think it's okay to use when it's clearly done
3560 following a user-command. */
3562 DEFUN ("x-focus-frame", Fx_focus_frame
, Sx_focus_frame
, 1, 1, 0,
3563 doc
: /* Set the input focus to FRAME.
3564 FRAME nil means use the selected frame. */)
3567 struct frame
*f
= check_x_frame (frame
);
3568 Display
*dpy
= FRAME_X_DISPLAY (f
);
3571 x_catch_errors (dpy
);
3572 XSetInputFocus (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
3573 RevertToParent
, CurrentTime
);
3574 x_ewmh_activate_frame (f
);
3575 x_uncatch_errors ();
3582 DEFUN ("xw-color-defined-p", Fxw_color_defined_p
, Sxw_color_defined_p
, 1, 2, 0,
3583 doc
: /* Internal function called by `color-defined-p', which see. */)
3584 (Lisp_Object color
, Lisp_Object frame
)
3587 FRAME_PTR f
= check_x_frame (frame
);
3589 CHECK_STRING (color
);
3591 if (x_defined_color (f
, SDATA (color
), &foo
, 0))
3597 DEFUN ("xw-color-values", Fxw_color_values
, Sxw_color_values
, 1, 2, 0,
3598 doc
: /* Internal function called by `color-values', which see. */)
3599 (Lisp_Object color
, Lisp_Object frame
)
3602 FRAME_PTR f
= check_x_frame (frame
);
3604 CHECK_STRING (color
);
3606 if (x_defined_color (f
, SDATA (color
), &foo
, 0))
3607 return list3 (make_number (foo
.red
),
3608 make_number (foo
.green
),
3609 make_number (foo
.blue
));
3614 DEFUN ("xw-display-color-p", Fxw_display_color_p
, Sxw_display_color_p
, 0, 1, 0,
3615 doc
: /* Internal function called by `display-color-p', which see. */)
3616 (Lisp_Object terminal
)
3618 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3620 if (dpyinfo
->n_planes
<= 2)
3623 switch (dpyinfo
->visual
->class)
3636 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p
, Sx_display_grayscale_p
,
3638 doc
: /* Return t if the X display supports shades of gray.
3639 Note that color displays do support shades of gray.
3640 The optional argument TERMINAL specifies which display to ask about.
3641 TERMINAL should be a terminal object, a frame or a display name (a string).
3642 If omitted or nil, that stands for the selected frame's display. */)
3643 (Lisp_Object terminal
)
3645 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3647 if (dpyinfo
->n_planes
<= 1)
3650 switch (dpyinfo
->visual
->class)
3665 DEFUN ("x-display-pixel-width", Fx_display_pixel_width
, Sx_display_pixel_width
,
3667 doc
: /* Return the width 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. */)
3671 (Lisp_Object terminal
)
3673 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3675 return make_number (x_display_pixel_width (dpyinfo
));
3678 DEFUN ("x-display-pixel-height", Fx_display_pixel_height
,
3679 Sx_display_pixel_height
, 0, 1, 0,
3680 doc
: /* Return the height in pixels of the X display TERMINAL.
3681 The optional argument TERMINAL specifies which display to ask about.
3682 TERMINAL should be a terminal object, a frame or a display name (a string).
3683 If omitted or nil, that stands for the selected frame's display. */)
3684 (Lisp_Object terminal
)
3686 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3688 return make_number (x_display_pixel_height (dpyinfo
));
3691 DEFUN ("x-display-planes", Fx_display_planes
, Sx_display_planes
,
3693 doc
: /* Return the number of bitplanes of the X display TERMINAL.
3694 The optional argument TERMINAL specifies which display to ask about.
3695 TERMINAL should be a terminal object, a frame or a display name (a string).
3696 If omitted or nil, that stands for the selected frame's display. */)
3697 (Lisp_Object terminal
)
3699 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3701 return make_number (dpyinfo
->n_planes
);
3704 DEFUN ("x-display-color-cells", Fx_display_color_cells
, Sx_display_color_cells
,
3706 doc
: /* Return the number of color cells of the X display TERMINAL.
3707 The optional argument TERMINAL specifies which display to ask about.
3708 TERMINAL should be a terminal object, a frame or a display name (a string).
3709 If omitted or nil, that stands for the selected frame's display. */)
3710 (Lisp_Object terminal
)
3712 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3714 int nr_planes
= DisplayPlanes (dpyinfo
->display
,
3715 XScreenNumberOfScreen (dpyinfo
->screen
));
3717 /* Truncate nr_planes to 24 to avoid integer overflow.
3718 Some displays says 32, but only 24 bits are actually significant.
3719 There are only very few and rare video cards that have more than
3720 24 significant bits. Also 24 bits is more than 16 million colors,
3721 it "should be enough for everyone". */
3722 if (nr_planes
> 24) nr_planes
= 24;
3724 return make_number (1 << nr_planes
);
3727 DEFUN ("x-server-max-request-size", Fx_server_max_request_size
,
3728 Sx_server_max_request_size
,
3730 doc
: /* Return the maximum request size of the X server of display TERMINAL.
3731 The optional argument TERMINAL specifies which display to ask about.
3732 TERMINAL should be a terminal object, a frame or a display name (a string).
3733 If omitted or nil, that stands for the selected frame's display. */)
3734 (Lisp_Object terminal
)
3736 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3738 return make_number (MAXREQUEST (dpyinfo
->display
));
3741 DEFUN ("x-server-vendor", Fx_server_vendor
, Sx_server_vendor
, 0, 1, 0,
3742 doc
: /* Return the "vendor ID" string of the X server of display TERMINAL.
3743 \(Labelling every distributor as a "vendor" embodies the false assumption
3744 that operating systems cannot be developed and distributed noncommercially.)
3745 The optional argument TERMINAL specifies which display to ask about.
3746 TERMINAL should be a terminal object, a frame or a display name (a string).
3747 If omitted or nil, that stands for the selected frame's display. */)
3748 (Lisp_Object terminal
)
3750 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3751 const char *vendor
= ServerVendor (dpyinfo
->display
);
3753 if (! vendor
) vendor
= "";
3754 return build_string (vendor
);
3757 DEFUN ("x-server-version", Fx_server_version
, Sx_server_version
, 0, 1, 0,
3758 doc
: /* Return the version numbers of the X server of display TERMINAL.
3759 The value is a list of three integers: the major and minor
3760 version numbers of the X Protocol in use, and the distributor-specific release
3761 number. See also the function `x-server-vendor'.
3763 The optional argument TERMINAL specifies which display to ask about.
3764 TERMINAL should be a terminal object, a frame or a display name (a string).
3765 If omitted or nil, that stands for the selected frame's display. */)
3766 (Lisp_Object terminal
)
3768 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3769 Display
*dpy
= dpyinfo
->display
;
3771 return Fcons (make_number (ProtocolVersion (dpy
)),
3772 Fcons (make_number (ProtocolRevision (dpy
)),
3773 Fcons (make_number (VendorRelease (dpy
)), Qnil
)));
3776 DEFUN ("x-display-screens", Fx_display_screens
, Sx_display_screens
, 0, 1, 0,
3777 doc
: /* Return the number of screens on the X server of display TERMINAL.
3778 The optional argument TERMINAL specifies which display to ask about.
3779 TERMINAL should be a terminal object, a frame or a display name (a string).
3780 If omitted or nil, that stands for the selected frame's display. */)
3781 (Lisp_Object terminal
)
3783 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3785 return make_number (ScreenCount (dpyinfo
->display
));
3788 DEFUN ("x-display-mm-height", Fx_display_mm_height
, Sx_display_mm_height
, 0, 1, 0,
3789 doc
: /* Return the height in millimeters of the X display TERMINAL.
3790 The optional argument TERMINAL specifies which display to ask about.
3791 TERMINAL should be a terminal object, a frame or a display name (a string).
3792 If omitted or nil, that stands for the selected frame's display. */)
3793 (Lisp_Object terminal
)
3795 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3797 return make_number (HeightMMOfScreen (dpyinfo
->screen
));
3800 DEFUN ("x-display-mm-width", Fx_display_mm_width
, Sx_display_mm_width
, 0, 1, 0,
3801 doc
: /* Return the width in millimeters of the X display TERMINAL.
3802 The optional argument TERMINAL specifies which display to ask about.
3803 TERMINAL should be a terminal object, a frame or a display name (a string).
3804 If omitted or nil, that stands for the selected frame's display. */)
3805 (Lisp_Object terminal
)
3807 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3809 return make_number (WidthMMOfScreen (dpyinfo
->screen
));
3812 DEFUN ("x-display-backing-store", Fx_display_backing_store
,
3813 Sx_display_backing_store
, 0, 1, 0,
3814 doc
: /* Return an indication of whether X display TERMINAL does backing store.
3815 The value may be `always', `when-mapped', or `not-useful'.
3816 The optional argument TERMINAL specifies which display to ask about.
3817 TERMINAL should be a terminal object, a frame or a display name (a string).
3818 If omitted or nil, that stands for the selected frame's display. */)
3819 (Lisp_Object terminal
)
3821 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3824 switch (DoesBackingStore (dpyinfo
->screen
))
3827 result
= intern ("always");
3831 result
= intern ("when-mapped");
3835 result
= intern ("not-useful");
3839 error ("Strange value for BackingStore parameter of screen");
3846 DEFUN ("x-display-visual-class", Fx_display_visual_class
,
3847 Sx_display_visual_class
, 0, 1, 0,
3848 doc
: /* Return the visual class of the X display TERMINAL.
3849 The value is one of the symbols `static-gray', `gray-scale',
3850 `static-color', `pseudo-color', `true-color', or `direct-color'.
3852 The optional argument TERMINAL specifies which display to ask about.
3853 TERMINAL should a terminal object, a frame or a display name (a string).
3854 If omitted or nil, that stands for the selected frame's display. */)
3855 (Lisp_Object terminal
)
3857 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3860 switch (dpyinfo
->visual
->class)
3863 result
= intern ("static-gray");
3866 result
= intern ("gray-scale");
3869 result
= intern ("static-color");
3872 result
= intern ("pseudo-color");
3875 result
= intern ("true-color");
3878 result
= intern ("direct-color");
3881 error ("Display has an unknown visual class");
3888 DEFUN ("x-display-save-under", Fx_display_save_under
,
3889 Sx_display_save_under
, 0, 1, 0,
3890 doc
: /* Return t if the X display TERMINAL supports the save-under feature.
3891 The optional argument TERMINAL specifies which display to ask about.
3892 TERMINAL should be a terminal object, a frame or a display name (a string).
3893 If omitted or nil, that stands for the selected frame's display. */)
3894 (Lisp_Object terminal
)
3896 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
3898 if (DoesSaveUnders (dpyinfo
->screen
) == True
)
3905 x_pixel_width (register struct frame
*f
)
3907 return FRAME_PIXEL_WIDTH (f
);
3911 x_pixel_height (register struct frame
*f
)
3913 return FRAME_PIXEL_HEIGHT (f
);
3917 x_char_width (register struct frame
*f
)
3919 return FRAME_COLUMN_WIDTH (f
);
3923 x_char_height (register struct frame
*f
)
3925 return FRAME_LINE_HEIGHT (f
);
3929 x_screen_planes (register struct frame
*f
)
3931 return FRAME_X_DISPLAY_INFO (f
)->n_planes
;
3936 /************************************************************************
3938 ************************************************************************/
3941 /* Mapping visual names to visuals. */
3943 static struct visual_class
3950 {"StaticGray", StaticGray
},
3951 {"GrayScale", GrayScale
},
3952 {"StaticColor", StaticColor
},
3953 {"PseudoColor", PseudoColor
},
3954 {"TrueColor", TrueColor
},
3955 {"DirectColor", DirectColor
},
3960 #ifndef HAVE_XSCREENNUMBEROFSCREEN
3962 /* Value is the screen number of screen SCR. This is a substitute for
3963 the X function with the same name when that doesn't exist. */
3966 XScreenNumberOfScreen (scr
)
3967 register Screen
*scr
;
3969 Display
*dpy
= scr
->display
;
3972 for (i
= 0; i
< dpy
->nscreens
; ++i
)
3973 if (scr
== dpy
->screens
+ i
)
3979 #endif /* not HAVE_XSCREENNUMBEROFSCREEN */
3982 /* Select the visual that should be used on display DPYINFO. Set
3983 members of DPYINFO appropriately. Called from x_term_init. */
3986 select_visual (struct x_display_info
*dpyinfo
)
3988 Display
*dpy
= dpyinfo
->display
;
3989 Screen
*screen
= dpyinfo
->screen
;
3992 /* See if a visual is specified. */
3993 value
= display_x_get_resource (dpyinfo
,
3994 build_string ("visualClass"),
3995 build_string ("VisualClass"),
3997 if (STRINGP (value
))
3999 /* VALUE should be of the form CLASS-DEPTH, where CLASS is one
4000 of `PseudoColor', `TrueColor' etc. and DEPTH is the color
4001 depth, a decimal number. NAME is compared with case ignored. */
4002 char *s
= (char *) alloca (SBYTES (value
) + 1);
4007 strcpy (s
, SDATA (value
));
4008 dash
= strchr (s
, '-');
4011 dpyinfo
->n_planes
= atoi (dash
+ 1);
4015 /* We won't find a matching visual with depth 0, so that
4016 an error will be printed below. */
4017 dpyinfo
->n_planes
= 0;
4019 /* Determine the visual class. */
4020 for (i
= 0; visual_classes
[i
].name
; ++i
)
4021 if (xstrcasecmp (s
, visual_classes
[i
].name
) == 0)
4023 class = visual_classes
[i
].class;
4027 /* Look up a matching visual for the specified class. */
4029 || !XMatchVisualInfo (dpy
, XScreenNumberOfScreen (screen
),
4030 dpyinfo
->n_planes
, class, &vinfo
))
4031 fatal ("Invalid visual specification `%s'", SDATA (value
));
4033 dpyinfo
->visual
= vinfo
.visual
;
4038 XVisualInfo
*vinfo
, vinfo_template
;
4040 dpyinfo
->visual
= DefaultVisualOfScreen (screen
);
4042 vinfo_template
.visualid
= XVisualIDFromVisual (dpyinfo
->visual
);
4043 vinfo_template
.screen
= XScreenNumberOfScreen (screen
);
4044 vinfo
= XGetVisualInfo (dpy
, VisualIDMask
| VisualScreenMask
,
4045 &vinfo_template
, &n_visuals
);
4047 fatal ("Can't get proper X visual info");
4049 dpyinfo
->n_planes
= vinfo
->depth
;
4050 XFree ((char *) vinfo
);
4055 /* Return the X display structure for the display named NAME.
4056 Open a new connection if necessary. */
4058 struct x_display_info
*
4059 x_display_info_for_name (Lisp_Object name
)
4062 struct x_display_info
*dpyinfo
;
4064 CHECK_STRING (name
);
4067 if (! EQ (Vinitial_window_system
, intern ("x")))
4068 error ("Not using X Windows"); /* That doesn't stop us anymore. */
4071 for (dpyinfo
= x_display_list
, names
= x_display_name_list
;
4073 dpyinfo
= dpyinfo
->next
, names
= XCDR (names
))
4076 tem
= Fstring_equal (XCAR (XCAR (names
)), name
);
4081 /* Use this general default value to start with. */
4082 Vx_resource_name
= Vinvocation_name
;
4084 validate_x_resource_name ();
4086 dpyinfo
= x_term_init (name
, (char *)0,
4087 (char *) SDATA (Vx_resource_name
));
4090 error ("Cannot connect to X server %s", SDATA (name
));
4093 XSETFASTINT (Vwindow_system_version
, 11);
4099 DEFUN ("x-open-connection", Fx_open_connection
, Sx_open_connection
,
4101 doc
: /* Open a connection to an X server.
4102 DISPLAY is the name of the display to connect to.
4103 Optional second arg XRM-STRING is a string of resources in xrdb format.
4104 If the optional third arg MUST-SUCCEED is non-nil,
4105 terminate Emacs if we can't open the connection. */)
4106 (Lisp_Object display
, Lisp_Object xrm_string
, Lisp_Object must_succeed
)
4108 unsigned char *xrm_option
;
4109 struct x_display_info
*dpyinfo
;
4111 CHECK_STRING (display
);
4112 if (! NILP (xrm_string
))
4113 CHECK_STRING (xrm_string
);
4116 if (! EQ (Vinitial_window_system
, intern ("x")))
4117 error ("Not using X Windows"); /* That doesn't stop us anymore. */
4120 if (! NILP (xrm_string
))
4121 xrm_option
= (unsigned char *) SDATA (xrm_string
);
4123 xrm_option
= (unsigned char *) 0;
4125 validate_x_resource_name ();
4127 /* This is what opens the connection and sets x_current_display.
4128 This also initializes many symbols, such as those used for input. */
4129 dpyinfo
= x_term_init (display
, xrm_option
,
4130 (char *) SDATA (Vx_resource_name
));
4134 if (!NILP (must_succeed
))
4135 fatal ("Cannot connect to X server %s.\n\
4136 Check the DISPLAY environment variable or use `-d'.\n\
4137 Also use the `xauth' program to verify that you have the proper\n\
4138 authorization information needed to connect the X server.\n\
4139 An insecure way to solve the problem may be to use `xhost'.\n",
4142 error ("Cannot connect to X server %s", SDATA (display
));
4147 XSETFASTINT (Vwindow_system_version
, 11);
4151 DEFUN ("x-close-connection", Fx_close_connection
,
4152 Sx_close_connection
, 1, 1, 0,
4153 doc
: /* Close the connection to TERMINAL's X server.
4154 For TERMINAL, specify a terminal object, a frame or a display name (a
4155 string). If TERMINAL is nil, that stands for the selected frame's
4157 (Lisp_Object terminal
)
4159 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
4161 if (dpyinfo
->reference_count
> 0)
4162 error ("Display still has frames on it");
4164 x_delete_terminal (dpyinfo
->terminal
);
4169 DEFUN ("x-display-list", Fx_display_list
, Sx_display_list
, 0, 0, 0,
4170 doc
: /* Return the list of display names that Emacs has connections to. */)
4173 Lisp_Object tail
, result
;
4176 for (tail
= x_display_name_list
; CONSP (tail
); tail
= XCDR (tail
))
4177 result
= Fcons (XCAR (XCAR (tail
)), result
);
4182 DEFUN ("x-synchronize", Fx_synchronize
, Sx_synchronize
, 1, 2, 0,
4183 doc
: /* If ON is non-nil, report X errors as soon as the erring request is made.
4184 If ON is nil, allow buffering of requests.
4185 Turning on synchronization prohibits the Xlib routines from buffering
4186 requests and seriously degrades performance, but makes debugging much
4188 The optional second argument TERMINAL specifies which display to act on.
4189 TERMINAL should be a terminal object, a frame or a display name (a string).
4190 If TERMINAL is omitted or nil, that stands for the selected frame's display. */)
4191 (Lisp_Object on
, Lisp_Object terminal
)
4193 struct x_display_info
*dpyinfo
= check_x_display_info (terminal
);
4195 XSynchronize (dpyinfo
->display
, !EQ (on
, Qnil
));
4200 /* Wait for responses to all X commands issued so far for frame F. */
4203 x_sync (FRAME_PTR f
)
4206 XSync (FRAME_X_DISPLAY (f
), False
);
4211 /***********************************************************************
4213 ***********************************************************************/
4215 DEFUN ("x-change-window-property", Fx_change_window_property
,
4216 Sx_change_window_property
, 2, 6, 0,
4217 doc
: /* Change window property PROP to VALUE on the X window of FRAME.
4218 PROP must be a string.
4219 VALUE may be a string or a list of conses, numbers and/or strings.
4220 If an element in the list is a string, it is converted to
4221 an Atom and the value of the Atom is used. If an element is a cons,
4222 it is converted to a 32 bit number where the car is the 16 top bits and the
4223 cdr is the lower 16 bits.
4224 FRAME nil or omitted means use the selected frame.
4225 If TYPE is given and non-nil, it is the name of the type of VALUE.
4226 If TYPE is not given or nil, the type is STRING.
4227 FORMAT gives the size in bits of each element if VALUE is a list.
4228 It must be one of 8, 16 or 32.
4229 If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
4230 If OUTER_P is non-nil, the property is changed for the outer X window of
4231 FRAME. Default is to change on the edit X window.
4234 (Lisp_Object prop
, Lisp_Object value
, Lisp_Object frame
, Lisp_Object type
, Lisp_Object format
, Lisp_Object outer_p
)
4236 struct frame
*f
= check_x_frame (frame
);
4238 Atom target_type
= XA_STRING
;
4239 int element_format
= 8;
4240 unsigned char *data
;
4244 CHECK_STRING (prop
);
4246 if (! NILP (format
))
4248 CHECK_NUMBER (format
);
4249 element_format
= XFASTINT (format
);
4251 if (element_format
!= 8 && element_format
!= 16
4252 && element_format
!= 32)
4253 error ("FORMAT must be one of 8, 16 or 32");
4258 nelements
= x_check_property_data (value
);
4259 if (nelements
== -1)
4260 error ("Bad data in VALUE, must be number, string or cons");
4262 if (element_format
== 8)
4263 data
= (unsigned char *) xmalloc (nelements
);
4264 else if (element_format
== 16)
4265 data
= (unsigned char *) xmalloc (nelements
*2);
4266 else /* format == 32 */
4267 /* The man page for XChangeProperty:
4268 "If the specified format is 32, the property data must be a
4270 This applies even if long is more than 64 bits. The X library
4271 converts to 32 bits before sending to the X server. */
4272 data
= (unsigned char *) xmalloc (nelements
* sizeof(long));
4274 x_fill_property_data (FRAME_X_DISPLAY (f
), value
, data
, element_format
);
4278 CHECK_STRING (value
);
4279 data
= SDATA (value
);
4280 nelements
= SCHARS (value
);
4284 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4287 CHECK_STRING (type
);
4288 target_type
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (type
), False
);
4291 if (! NILP (outer_p
)) w
= FRAME_OUTER_WINDOW (f
);
4292 else w
= FRAME_X_WINDOW (f
);
4294 XChangeProperty (FRAME_X_DISPLAY (f
), w
,
4295 prop_atom
, target_type
, element_format
, PropModeReplace
,
4298 if (CONSP (value
)) xfree (data
);
4300 /* Make sure the property is set when we return. */
4301 XFlush (FRAME_X_DISPLAY (f
));
4308 DEFUN ("x-delete-window-property", Fx_delete_window_property
,
4309 Sx_delete_window_property
, 1, 2, 0,
4310 doc
: /* Remove window property PROP from X window of FRAME.
4311 FRAME nil or omitted means use the selected frame. Value is PROP. */)
4312 (Lisp_Object prop
, Lisp_Object frame
)
4314 struct frame
*f
= check_x_frame (frame
);
4317 CHECK_STRING (prop
);
4319 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4320 XDeleteProperty (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), prop_atom
);
4322 /* Make sure the property is removed when we return. */
4323 XFlush (FRAME_X_DISPLAY (f
));
4330 DEFUN ("x-window-property", Fx_window_property
, Sx_window_property
,
4332 doc
: /* Value is the value of window property PROP on FRAME.
4333 If FRAME is nil or omitted, use the selected frame.
4334 If TYPE is nil or omitted, get the property as a string. Otherwise TYPE
4335 is the name of the Atom that denotes the type expected.
4336 If SOURCE is non-nil, get the property on that window instead of from
4337 FRAME. The number 0 denotes the root window.
4338 If DELETE_P is non-nil, delete the property after retreiving it.
4339 If VECTOR_RET_P is non-nil, don't return a string but a vector of values.
4341 Value is nil if FRAME hasn't a property with name PROP or if PROP has
4342 no value of TYPE. */)
4343 (Lisp_Object prop
, Lisp_Object frame
, Lisp_Object type
, Lisp_Object source
, Lisp_Object delete_p
, Lisp_Object vector_ret_p
)
4345 struct frame
*f
= check_x_frame (frame
);
4348 Lisp_Object prop_value
= Qnil
;
4349 unsigned char *tmp_data
= NULL
;
4351 Atom target_type
= XA_STRING
;
4353 unsigned long actual_size
, bytes_remaining
;
4354 Window target_window
= FRAME_X_WINDOW (f
);
4355 struct gcpro gcpro1
;
4357 GCPRO1 (prop_value
);
4358 CHECK_STRING (prop
);
4360 if (! NILP (source
))
4362 if (NUMBERP (source
))
4364 if (FLOATP (source
))
4365 target_window
= (Window
) XFLOAT (source
);
4367 target_window
= XFASTINT (source
);
4369 if (target_window
== 0)
4370 target_window
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4372 else if (CONSP (source
))
4373 target_window
= cons_to_long (source
);
4379 if (strcmp ("AnyPropertyType", SDATA (type
)) == 0)
4380 target_type
= AnyPropertyType
;
4382 target_type
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (type
), False
);
4385 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4386 rc
= XGetWindowProperty (FRAME_X_DISPLAY (f
), target_window
,
4387 prop_atom
, 0, 0, False
, target_type
,
4388 &actual_type
, &actual_format
, &actual_size
,
4389 &bytes_remaining
, &tmp_data
);
4392 int size
= bytes_remaining
;
4397 rc
= XGetWindowProperty (FRAME_X_DISPLAY (f
), target_window
,
4398 prop_atom
, 0, bytes_remaining
,
4399 ! NILP (delete_p
), target_type
,
4400 &actual_type
, &actual_format
,
4401 &actual_size
, &bytes_remaining
,
4403 if (rc
== Success
&& tmp_data
)
4405 /* The man page for XGetWindowProperty says:
4406 "If the returned format is 32, the returned data is represented
4407 as a long array and should be cast to that type to obtain the
4409 This applies even if long is more than 32 bits, the X library
4410 converts from 32 bit elements received from the X server to long
4411 and passes the long array to us. Thus, for that case memcpy can not
4412 be used. We convert to a 32 bit type here, because so much code
4415 The bytes and offsets passed to XGetWindowProperty refers to the
4416 property and those are indeed in 32 bit quantities if format is
4419 if (actual_format
== 32 && actual_format
< BITS_PER_LONG
)
4422 int *idata
= (int *) tmp_data
;
4423 long *ldata
= (long *) tmp_data
;
4425 for (i
= 0; i
< actual_size
; ++i
)
4426 idata
[i
] = (int) ldata
[i
];
4429 if (NILP (vector_ret_p
))
4430 prop_value
= make_string (tmp_data
, size
);
4432 prop_value
= x_property_data_to_lisp (f
,
4439 if (tmp_data
) XFree (tmp_data
);
4449 /***********************************************************************
4451 ***********************************************************************/
4453 /* Timer function of hourglass_atimer. TIMER is equal to
4456 Display an hourglass pointer on all frames by mapping the frames'
4457 hourglass_window. Set the hourglass_p flag in the frames'
4458 output_data.x structure to indicate that an hourglass cursor is
4459 shown on the frames. */
4462 show_hourglass (struct atimer
*timer
)
4464 /* The timer implementation will cancel this timer automatically
4465 after this function has run. Set hourglass_atimer to null
4466 so that we know the timer doesn't have to be canceled. */
4467 hourglass_atimer
= NULL
;
4469 if (!hourglass_shown_p
)
4471 Lisp_Object rest
, frame
;
4475 FOR_EACH_FRAME (rest
, frame
)
4477 struct frame
*f
= XFRAME (frame
);
4479 if (FRAME_LIVE_P (f
) && FRAME_X_P (f
) && FRAME_X_DISPLAY (f
))
4481 Display
*dpy
= FRAME_X_DISPLAY (f
);
4483 #ifdef USE_X_TOOLKIT
4484 if (f
->output_data
.x
->widget
)
4486 if (FRAME_OUTER_WINDOW (f
))
4489 f
->output_data
.x
->hourglass_p
= 1;
4491 if (!f
->output_data
.x
->hourglass_window
)
4493 unsigned long mask
= CWCursor
;
4494 XSetWindowAttributes attrs
;
4496 Window parent
= FRAME_X_WINDOW (f
);
4498 Window parent
= FRAME_OUTER_WINDOW (f
);
4500 attrs
.cursor
= f
->output_data
.x
->hourglass_cursor
;
4502 f
->output_data
.x
->hourglass_window
4503 = XCreateWindow (dpy
, parent
,
4504 0, 0, 32000, 32000, 0, 0,
4510 XMapRaised (dpy
, f
->output_data
.x
->hourglass_window
);
4516 hourglass_shown_p
= 1;
4522 /* Hide the hourglass pointer on all frames, if it is currently
4526 hide_hourglass (void)
4528 if (hourglass_shown_p
)
4530 Lisp_Object rest
, frame
;
4533 FOR_EACH_FRAME (rest
, frame
)
4535 struct frame
*f
= XFRAME (frame
);
4538 /* Watch out for newly created frames. */
4539 && f
->output_data
.x
->hourglass_window
)
4541 XUnmapWindow (FRAME_X_DISPLAY (f
),
4542 f
->output_data
.x
->hourglass_window
);
4543 /* Sync here because XTread_socket looks at the
4544 hourglass_p flag that is reset to zero below. */
4545 XSync (FRAME_X_DISPLAY (f
), False
);
4546 f
->output_data
.x
->hourglass_p
= 0;
4550 hourglass_shown_p
= 0;
4557 /***********************************************************************
4559 ***********************************************************************/
4561 static Lisp_Object
x_create_tip_frame (struct x_display_info
*,
4562 Lisp_Object
, Lisp_Object
);
4563 static void compute_tip_xy (struct frame
*, Lisp_Object
, Lisp_Object
,
4564 Lisp_Object
, int, int, int *, int *);
4566 /* The frame of a currently visible tooltip. */
4568 Lisp_Object tip_frame
;
4570 /* If non-nil, a timer started that hides the last tooltip when it
4573 Lisp_Object tip_timer
;
4576 /* If non-nil, a vector of 3 elements containing the last args
4577 with which x-show-tip was called. See there. */
4579 Lisp_Object last_show_tip_args
;
4581 /* Maximum size for tooltips; a cons (COLUMNS . ROWS). */
4583 Lisp_Object Vx_max_tooltip_size
;
4587 unwind_create_tip_frame (Lisp_Object frame
)
4589 Lisp_Object deleted
;
4591 deleted
= unwind_create_frame (frame
);
4592 if (EQ (deleted
, Qt
))
4602 /* Create a frame for a tooltip on the display described by DPYINFO.
4603 PARMS is a list of frame parameters. TEXT is the string to
4604 display in the tip frame. Value is the frame.
4606 Note that functions called here, esp. x_default_parameter can
4607 signal errors, for instance when a specified color name is
4608 undefined. We have to make sure that we're in a consistent state
4609 when this happens. */
4612 x_create_tip_frame (struct x_display_info
*dpyinfo
,
4617 Lisp_Object frame
, tem
;
4619 long window_prompting
= 0;
4621 int count
= SPECPDL_INDEX ();
4622 struct gcpro gcpro1
, gcpro2
, gcpro3
;
4623 int face_change_count_before
= face_change_count
;
4625 struct buffer
*old_buffer
;
4629 if (!dpyinfo
->terminal
->name
)
4630 error ("Terminal is not live, can't create new frames on it");
4632 parms
= Fcopy_alist (parms
);
4634 /* Get the name of the frame to use for resource lookup. */
4635 name
= x_get_arg (dpyinfo
, parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
4637 && !EQ (name
, Qunbound
)
4639 error ("Invalid frame name--not a string or nil");
4642 GCPRO3 (parms
, name
, frame
);
4644 XSETFRAME (frame
, f
);
4646 buffer
= Fget_buffer_create (build_string (" *tip*"));
4647 Fset_window_buffer (FRAME_ROOT_WINDOW (f
), buffer
, Qnil
);
4648 old_buffer
= current_buffer
;
4649 set_buffer_internal_1 (XBUFFER (buffer
));
4650 current_buffer
->truncate_lines
= Qnil
;
4651 specbind (Qinhibit_read_only
, Qt
);
4652 specbind (Qinhibit_modification_hooks
, Qt
);
4655 set_buffer_internal_1 (old_buffer
);
4657 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 0;
4658 record_unwind_protect (unwind_create_tip_frame
, frame
);
4660 f
->terminal
= dpyinfo
->terminal
;
4661 f
->terminal
->reference_count
++;
4663 /* By setting the output method, we're essentially saying that
4664 the frame is live, as per FRAME_LIVE_P. If we get a signal
4665 from this point on, x_destroy_window might screw up reference
4667 f
->output_method
= output_x_window
;
4668 f
->output_data
.x
= (struct x_output
*) xmalloc (sizeof (struct x_output
));
4669 memset (f
->output_data
.x
, 0, sizeof (struct x_output
));
4670 f
->output_data
.x
->icon_bitmap
= -1;
4671 FRAME_FONTSET (f
) = -1;
4672 f
->output_data
.x
->scroll_bar_foreground_pixel
= -1;
4673 f
->output_data
.x
->scroll_bar_background_pixel
= -1;
4674 #ifdef USE_TOOLKIT_SCROLL_BARS
4675 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
4676 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
4677 #endif /* USE_TOOLKIT_SCROLL_BARS */
4678 f
->icon_name
= Qnil
;
4679 FRAME_X_DISPLAY_INFO (f
) = dpyinfo
;
4681 image_cache_refcount
= FRAME_IMAGE_CACHE (f
)->refcount
;
4682 dpyinfo_refcount
= dpyinfo
->reference_count
;
4683 #endif /* GLYPH_DEBUG */
4684 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4685 f
->output_data
.x
->explicit_parent
= 0;
4687 /* These colors will be set anyway later, but it's important
4688 to get the color reference counts right, so initialize them! */
4691 struct gcpro gcpro1
;
4693 /* Function x_decode_color can signal an error. Make
4694 sure to initialize color slots so that we won't try
4695 to free colors we haven't allocated. */
4696 FRAME_FOREGROUND_PIXEL (f
) = -1;
4697 FRAME_BACKGROUND_PIXEL (f
) = -1;
4698 f
->output_data
.x
->cursor_pixel
= -1;
4699 f
->output_data
.x
->cursor_foreground_pixel
= -1;
4700 f
->output_data
.x
->border_pixel
= -1;
4701 f
->output_data
.x
->mouse_pixel
= -1;
4703 black
= build_string ("black");
4705 FRAME_FOREGROUND_PIXEL (f
)
4706 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4707 FRAME_BACKGROUND_PIXEL (f
)
4708 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4709 f
->output_data
.x
->cursor_pixel
4710 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4711 f
->output_data
.x
->cursor_foreground_pixel
4712 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4713 f
->output_data
.x
->border_pixel
4714 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4715 f
->output_data
.x
->mouse_pixel
4716 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4720 /* Set the name; the functions to which we pass f expect the name to
4722 if (EQ (name
, Qunbound
) || NILP (name
))
4724 f
->name
= build_string (dpyinfo
->x_id_name
);
4725 f
->explicit_name
= 0;
4730 f
->explicit_name
= 1;
4731 /* use the frame's title when getting resources for this frame. */
4732 specbind (Qx_resource_name
, name
);
4735 f
->resx
= dpyinfo
->resx
;
4736 f
->resy
= dpyinfo
->resy
;
4738 register_font_driver (&xfont_driver
, f
);
4739 #ifdef HAVE_FREETYPE
4741 register_font_driver (&xftfont_driver
, f
);
4742 #else /* not HAVE_XFT */
4743 register_font_driver (&ftxfont_driver
, f
);
4744 #endif /* not HAVE_XFT */
4745 #endif /* HAVE_FREETYPE */
4747 x_default_parameter (f
, parms
, Qfont_backend
, Qnil
,
4748 "fontBackend", "FontBackend", RES_TYPE_STRING
);
4750 /* Extract the window parameters from the supplied values that are
4751 needed to determine window geometry. */
4752 x_default_font_parameter (f
, parms
);
4754 x_default_parameter (f
, parms
, Qborder_width
, make_number (0),
4755 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
4757 /* This defaults to 2 in order to match xterm. We recognize either
4758 internalBorderWidth or internalBorder (which is what xterm calls
4760 if (NILP (Fassq (Qinternal_border_width
, parms
)))
4764 value
= x_get_arg (dpyinfo
, parms
, Qinternal_border_width
,
4765 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
4766 if (! EQ (value
, Qunbound
))
4767 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
4771 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
4772 "internalBorderWidth", "internalBorderWidth",
4775 /* Also do the stuff which must be set before the window exists. */
4776 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
4777 "foreground", "Foreground", RES_TYPE_STRING
);
4778 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
4779 "background", "Background", RES_TYPE_STRING
);
4780 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
4781 "pointerColor", "Foreground", RES_TYPE_STRING
);
4782 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
4783 "cursorColor", "Foreground", RES_TYPE_STRING
);
4784 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
4785 "borderColor", "BorderColor", RES_TYPE_STRING
);
4787 /* Init faces before x_default_parameter is called for scroll-bar
4788 parameters because that function calls x_set_scroll_bar_width,
4789 which calls change_frame_size, which calls Fset_window_buffer,
4790 which runs hooks, which call Fvertical_motion. At the end, we
4791 end up in init_iterator with a null face cache, which should not
4793 init_frame_faces (f
);
4795 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4797 window_prompting
= x_figure_window_size (f
, parms
, 0);
4800 XSetWindowAttributes attrs
;
4802 Atom type
= FRAME_X_DISPLAY_INFO (f
)->Xatom_net_window_type_tooltip
;
4805 mask
= CWBackPixel
| CWOverrideRedirect
| CWEventMask
;
4806 if (DoesSaveUnders (dpyinfo
->screen
))
4807 mask
|= CWSaveUnder
;
4809 /* Window managers look at the override-redirect flag to determine
4810 whether or net to give windows a decoration (Xlib spec, chapter
4812 attrs
.override_redirect
= True
;
4813 attrs
.save_under
= True
;
4814 attrs
.background_pixel
= FRAME_BACKGROUND_PIXEL (f
);
4815 /* Arrange for getting MapNotify and UnmapNotify events. */
4816 attrs
.event_mask
= StructureNotifyMask
;
4818 = FRAME_X_WINDOW (f
)
4819 = XCreateWindow (FRAME_X_DISPLAY (f
),
4820 FRAME_X_DISPLAY_INFO (f
)->root_window
,
4821 /* x, y, width, height */
4825 CopyFromParent
, InputOutput
, CopyFromParent
,
4827 XChangeProperty (FRAME_X_DISPLAY (f
), tip_window
,
4828 FRAME_X_DISPLAY_INFO (f
)->Xatom_net_window_type
,
4829 XA_ATOM
, 32, PropModeReplace
,
4830 (unsigned char *)&type
, 1);
4836 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
4837 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
4838 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
4839 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
4840 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
4841 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
4843 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
4844 Change will not be effected unless different from the current
4846 width
= FRAME_COLS (f
);
4847 height
= FRAME_LINES (f
);
4848 SET_FRAME_COLS (f
, 0);
4849 FRAME_LINES (f
) = 0;
4850 change_frame_size (f
, height
, width
, 1, 0, 0);
4852 /* Add `tooltip' frame parameter's default value. */
4853 if (NILP (Fframe_parameter (frame
, Qtooltip
)))
4854 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qtooltip
, Qt
), Qnil
));
4856 /* FIXME - can this be done in a similar way to normal frames?
4857 http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg00641.html */
4859 /* Set the `display-type' frame parameter before setting up faces. */
4861 Lisp_Object disptype
;
4863 if (FRAME_X_DISPLAY_INFO (f
)->n_planes
== 1)
4864 disptype
= intern ("mono");
4865 else if (FRAME_X_DISPLAY_INFO (f
)->visual
->class == GrayScale
4866 || FRAME_X_DISPLAY_INFO (f
)->visual
->class == StaticGray
)
4867 disptype
= intern ("grayscale");
4869 disptype
= intern ("color");
4871 if (NILP (Fframe_parameter (frame
, Qdisplay_type
)))
4872 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qdisplay_type
, disptype
),
4876 /* Set up faces after all frame parameters are known. This call
4877 also merges in face attributes specified for new frames.
4879 Frame parameters may be changed if .Xdefaults contains
4880 specifications for the default font. For example, if there is an
4881 `Emacs.default.attributeBackground: pink', the `background-color'
4882 attribute of the frame get's set, which let's the internal border
4883 of the tooltip frame appear in pink. Prevent this. */
4885 Lisp_Object bg
= Fframe_parameter (frame
, Qbackground_color
);
4887 /* Set tip_frame here, so that */
4889 call2 (Qface_set_after_frame_default
, frame
, Qnil
);
4891 if (!EQ (bg
, Fframe_parameter (frame
, Qbackground_color
)))
4892 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qbackground_color
, bg
),
4900 /* It is now ok to make the frame official even if we get an error
4901 below. And the frame needs to be on Vframe_list or making it
4902 visible won't work. */
4903 Vframe_list
= Fcons (frame
, Vframe_list
);
4905 /* Now that the frame is official, it counts as a reference to
4907 FRAME_X_DISPLAY_INFO (f
)->reference_count
++;
4909 /* Setting attributes of faces of the tooltip frame from resources
4910 and similar will increment face_change_count, which leads to the
4911 clearing of all current matrices. Since this isn't necessary
4912 here, avoid it by resetting face_change_count to the value it
4913 had before we created the tip frame. */
4914 face_change_count
= face_change_count_before
;
4916 /* Discard the unwind_protect. */
4917 return unbind_to (count
, frame
);
4921 /* Compute where to display tip frame F. PARMS is the list of frame
4922 parameters for F. DX and DY are specified offsets from the current
4923 location of the mouse. WIDTH and HEIGHT are the width and height
4924 of the tooltip. Return coordinates relative to the root window of
4925 the display in *ROOT_X, and *ROOT_Y. */
4928 compute_tip_xy (struct frame
*f
, Lisp_Object parms
, Lisp_Object dx
, Lisp_Object dy
, int width
, int height
, int *root_x
, int *root_y
)
4930 Lisp_Object left
, top
;
4935 /* User-specified position? */
4936 left
= Fcdr (Fassq (Qleft
, parms
));
4937 top
= Fcdr (Fassq (Qtop
, parms
));
4939 /* Move the tooltip window where the mouse pointer is. Resize and
4941 if (!INTEGERP (left
) || !INTEGERP (top
))
4944 XQueryPointer (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
4945 &root
, &child
, root_x
, root_y
, &win_x
, &win_y
, &pmask
);
4950 *root_y
= XINT (top
);
4951 else if (*root_y
+ XINT (dy
) <= 0)
4952 *root_y
= 0; /* Can happen for negative dy */
4953 else if (*root_y
+ XINT (dy
) + height
4954 <= x_display_pixel_height (FRAME_X_DISPLAY_INFO (f
)))
4955 /* It fits below the pointer */
4956 *root_y
+= XINT (dy
);
4957 else if (height
+ XINT (dy
) <= *root_y
)
4958 /* It fits above the pointer. */
4959 *root_y
-= height
+ XINT (dy
);
4961 /* Put it on the top. */
4964 if (INTEGERP (left
))
4965 *root_x
= XINT (left
);
4966 else if (*root_x
+ XINT (dx
) <= 0)
4967 *root_x
= 0; /* Can happen for negative dx */
4968 else if (*root_x
+ XINT (dx
) + width
4969 <= x_display_pixel_width (FRAME_X_DISPLAY_INFO (f
)))
4970 /* It fits to the right of the pointer. */
4971 *root_x
+= XINT (dx
);
4972 else if (width
+ XINT (dx
) <= *root_x
)
4973 /* It fits to the left of the pointer. */
4974 *root_x
-= width
+ XINT (dx
);
4976 /* Put it left-justified on the screen--it ought to fit that way. */
4981 DEFUN ("x-show-tip", Fx_show_tip
, Sx_show_tip
, 1, 6, 0,
4982 doc
: /* Show STRING in a "tooltip" window on frame FRAME.
4983 A tooltip window is a small X window displaying a string.
4985 This is an internal function; Lisp code should call `tooltip-show'.
4987 FRAME nil or omitted means use the selected frame.
4989 PARMS is an optional list of frame parameters which can be used to
4990 change the tooltip's appearance.
4992 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
4993 means use the default timeout of 5 seconds.
4995 If the list of frame parameters PARAMS contains a `left' parameters,
4996 the tooltip is displayed at that x-position. Otherwise it is
4997 displayed at the mouse position, with offset DX added (default is 5 if
4998 DX isn't specified). Likewise for the y-position; if a `top' frame
4999 parameter is specified, it determines the y-position of the tooltip
5000 window, otherwise it is displayed at the mouse position, with offset
5001 DY added (default is -10).
5003 A tooltip's maximum size is specified by `x-max-tooltip-size'.
5004 Text larger than the specified size is clipped. */)
5005 (Lisp_Object string
, Lisp_Object frame
, Lisp_Object parms
, Lisp_Object timeout
, Lisp_Object dx
, Lisp_Object dy
)
5010 struct buffer
*old_buffer
;
5011 struct text_pos pos
;
5012 int i
, width
, height
;
5013 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
5014 int old_windows_or_buffers_changed
= windows_or_buffers_changed
;
5015 int count
= SPECPDL_INDEX ();
5017 specbind (Qinhibit_redisplay
, Qt
);
5019 GCPRO4 (string
, parms
, frame
, timeout
);
5021 CHECK_STRING (string
);
5022 if (SCHARS (string
) == 0)
5023 string
= make_unibyte_string (" ", 1);
5025 f
= check_x_frame (frame
);
5027 timeout
= make_number (5);
5029 CHECK_NATNUM (timeout
);
5032 dx
= make_number (5);
5037 dy
= make_number (-10);
5042 if (x_gtk_use_system_tooltips
)
5046 /* Hide a previous tip, if any. */
5050 if ((ok
= xg_prepare_tooltip (f
, string
, &width
, &height
)) != 0)
5052 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, &root_x
, &root_y
);
5053 xg_show_tooltip (f
, root_x
, root_y
);
5054 /* This is used in Fx_hide_tip. */
5055 XSETFRAME (tip_frame
, f
);
5058 if (ok
) goto start_timer
;
5060 #endif /* USE_GTK */
5062 if (NILP (last_show_tip_args
))
5063 last_show_tip_args
= Fmake_vector (make_number (3), Qnil
);
5065 if (!NILP (tip_frame
))
5067 Lisp_Object last_string
= AREF (last_show_tip_args
, 0);
5068 Lisp_Object last_frame
= AREF (last_show_tip_args
, 1);
5069 Lisp_Object last_parms
= AREF (last_show_tip_args
, 2);
5071 if (EQ (frame
, last_frame
)
5072 && !NILP (Fequal (last_string
, string
))
5073 && !NILP (Fequal (last_parms
, parms
)))
5075 struct frame
*f
= XFRAME (tip_frame
);
5077 /* Only DX and DY have changed. */
5078 if (!NILP (tip_timer
))
5080 Lisp_Object timer
= tip_timer
;
5082 call1 (Qcancel_timer
, timer
);
5086 compute_tip_xy (f
, parms
, dx
, dy
, FRAME_PIXEL_WIDTH (f
),
5087 FRAME_PIXEL_HEIGHT (f
), &root_x
, &root_y
);
5088 XMoveWindow (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
5095 /* Hide a previous tip, if any. */
5098 ASET (last_show_tip_args
, 0, string
);
5099 ASET (last_show_tip_args
, 1, frame
);
5100 ASET (last_show_tip_args
, 2, parms
);
5102 /* Add default values to frame parameters. */
5103 if (NILP (Fassq (Qname
, parms
)))
5104 parms
= Fcons (Fcons (Qname
, build_string ("tooltip")), parms
);
5105 if (NILP (Fassq (Qinternal_border_width
, parms
)))
5106 parms
= Fcons (Fcons (Qinternal_border_width
, make_number (3)), parms
);
5107 if (NILP (Fassq (Qborder_width
, parms
)))
5108 parms
= Fcons (Fcons (Qborder_width
, make_number (1)), parms
);
5109 if (NILP (Fassq (Qborder_color
, parms
)))
5110 parms
= Fcons (Fcons (Qborder_color
, build_string ("lightyellow")), parms
);
5111 if (NILP (Fassq (Qbackground_color
, parms
)))
5112 parms
= Fcons (Fcons (Qbackground_color
, build_string ("lightyellow")),
5115 /* Create a frame for the tooltip, and record it in the global
5116 variable tip_frame. */
5117 frame
= x_create_tip_frame (FRAME_X_DISPLAY_INFO (f
), parms
, string
);
5120 /* Set up the frame's root window. */
5121 w
= XWINDOW (FRAME_ROOT_WINDOW (f
));
5122 w
->left_col
= w
->top_line
= make_number (0);
5124 if (CONSP (Vx_max_tooltip_size
)
5125 && INTEGERP (XCAR (Vx_max_tooltip_size
))
5126 && XINT (XCAR (Vx_max_tooltip_size
)) > 0
5127 && INTEGERP (XCDR (Vx_max_tooltip_size
))
5128 && XINT (XCDR (Vx_max_tooltip_size
)) > 0)
5130 w
->total_cols
= XCAR (Vx_max_tooltip_size
);
5131 w
->total_lines
= XCDR (Vx_max_tooltip_size
);
5135 w
->total_cols
= make_number (80);
5136 w
->total_lines
= make_number (40);
5139 FRAME_TOTAL_COLS (f
) = XINT (w
->total_cols
);
5141 w
->pseudo_window_p
= 1;
5143 /* Display the tooltip text in a temporary buffer. */
5144 old_buffer
= current_buffer
;
5145 set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f
))->buffer
));
5146 current_buffer
->truncate_lines
= Qnil
;
5147 clear_glyph_matrix (w
->desired_matrix
);
5148 clear_glyph_matrix (w
->current_matrix
);
5149 SET_TEXT_POS (pos
, BEGV
, BEGV_BYTE
);
5150 try_window (FRAME_ROOT_WINDOW (f
), pos
, TRY_WINDOW_IGNORE_FONTS_CHANGE
);
5152 /* Compute width and height of the tooltip. */
5154 for (i
= 0; i
< w
->desired_matrix
->nrows
; ++i
)
5156 struct glyph_row
*row
= &w
->desired_matrix
->rows
[i
];
5160 /* Stop at the first empty row at the end. */
5161 if (!row
->enabled_p
|| !row
->displays_text_p
)
5164 /* Let the row go over the full width of the frame. */
5165 row
->full_width_p
= 1;
5167 row_width
= row
->pixel_width
;
5168 /* There's a glyph at the end of rows that is used to place
5169 the cursor there. Don't include the width of this glyph. */
5170 if (row
->used
[TEXT_AREA
])
5172 last
= &row
->glyphs
[TEXT_AREA
][row
->used
[TEXT_AREA
] - 1];
5173 if (INTEGERP (last
->object
))
5174 row_width
-= last
->pixel_width
;
5177 height
+= row
->height
;
5178 width
= max (width
, row_width
);
5181 /* Add the frame's internal border to the width and height the X
5182 window should have. */
5183 height
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
5184 width
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
5186 /* Move the tooltip window where the mouse pointer is. Resize and
5188 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, &root_x
, &root_y
);
5191 XMoveResizeWindow (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
5192 root_x
, root_y
, width
, height
);
5193 XMapRaised (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
));
5196 /* Draw into the window. */
5197 w
->must_be_updated_p
= 1;
5198 update_single_window (w
, 1);
5200 /* Restore original current buffer. */
5201 set_buffer_internal_1 (old_buffer
);
5202 windows_or_buffers_changed
= old_windows_or_buffers_changed
;
5205 /* Let the tip disappear after timeout seconds. */
5206 tip_timer
= call3 (intern ("run-at-time"), timeout
, Qnil
,
5207 intern ("x-hide-tip"));
5210 return unbind_to (count
, Qnil
);
5214 DEFUN ("x-hide-tip", Fx_hide_tip
, Sx_hide_tip
, 0, 0, 0,
5215 doc
: /* Hide the current tooltip window, if there is any.
5216 Value is t if tooltip was open, nil otherwise. */)
5220 Lisp_Object deleted
, frame
, timer
;
5221 struct gcpro gcpro1
, gcpro2
;
5224 /* Return quickly if nothing to do. */
5225 if (NILP (tip_timer
) && NILP (tip_frame
))
5230 GCPRO2 (frame
, timer
);
5231 tip_frame
= tip_timer
= deleted
= Qnil
;
5233 count
= SPECPDL_INDEX ();
5234 specbind (Qinhibit_redisplay
, Qt
);
5235 specbind (Qinhibit_quit
, Qt
);
5238 call1 (Qcancel_timer
, timer
);
5241 /* When using system tooltip, tip_frame is the Emacs frame on which
5242 the tip is shown. */
5244 if (FRAME_LIVE_P (f
) && xg_hide_tooltip (f
))
5250 delete_frame (frame
, Qnil
);
5254 /* Bloodcurdling hack alert: The Lucid menu bar widget's
5255 redisplay procedure is not called when a tip frame over menu
5256 items is unmapped. Redisplay the menu manually... */
5259 f
= SELECTED_FRAME ();
5260 w
= f
->output_data
.x
->menubar_widget
;
5262 if (!DoesSaveUnders (FRAME_X_DISPLAY_INFO (f
)->screen
)
5266 xlwmenu_redisplay (w
);
5270 #endif /* USE_LUCID */
5274 return unbind_to (count
, deleted
);
5279 /***********************************************************************
5280 File selection dialog
5281 ***********************************************************************/
5283 DEFUN ("x-uses-old-gtk-dialog", Fx_uses_old_gtk_dialog
,
5284 Sx_uses_old_gtk_dialog
,
5286 doc
: /* Return t if the old Gtk+ file selection dialog is used. */)
5293 && xg_uses_old_file_dialog ())
5301 /* Callback for "OK" and "Cancel" on file selection dialog. */
5304 file_dialog_cb (Widget widget
, XtPointer client_data
, XtPointer call_data
)
5306 int *result
= (int *) client_data
;
5307 XmAnyCallbackStruct
*cb
= (XmAnyCallbackStruct
*) call_data
;
5308 *result
= cb
->reason
;
5312 /* Callback for unmapping a file selection dialog. This is used to
5313 capture the case where a dialog is closed via a window manager's
5314 closer button, for example. Using a XmNdestroyCallback didn't work
5318 file_dialog_unmap_cb (Widget widget
, XtPointer client_data
, XtPointer call_data
)
5320 int *result
= (int *) client_data
;
5321 *result
= XmCR_CANCEL
;
5325 clean_up_file_dialog (Lisp_Object arg
)
5327 struct Lisp_Save_Value
*p
= XSAVE_VALUE (arg
);
5328 Widget dialog
= (Widget
) p
->pointer
;
5332 XtUnmanageChild (dialog
);
5333 XtDestroyWidget (dialog
);
5334 x_menu_set_in_use (0);
5341 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
5342 doc
: /* Read file name, prompting with PROMPT in directory DIR.
5343 Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
5344 selection box, if specified. If MUSTMATCH is non-nil, the returned file
5345 or directory must exist. ONLY-DIR-P is ignored." */)
5346 (Lisp_Object prompt
, Lisp_Object dir
, Lisp_Object default_filename
, Lisp_Object mustmatch
, Lisp_Object only_dir_p
)
5349 struct frame
*f
= SELECTED_FRAME ();
5350 Lisp_Object file
= Qnil
;
5351 Lisp_Object decoded_file
;
5352 Widget dialog
, text
, help
;
5355 XmString dir_xmstring
, pattern_xmstring
;
5356 int count
= SPECPDL_INDEX ();
5357 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
5361 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
, file
);
5363 if (popup_activated ())
5364 error ("Trying to use a menu from within a menu-entry");
5366 CHECK_STRING (prompt
);
5369 /* Prevent redisplay. */
5370 specbind (Qinhibit_redisplay
, Qt
);
5374 /* Create the dialog with PROMPT as title, using DIR as initial
5375 directory and using "*" as pattern. */
5376 dir
= Fexpand_file_name (dir
, Qnil
);
5377 dir_xmstring
= XmStringCreateLocalized (SDATA (dir
));
5378 pattern_xmstring
= XmStringCreateLocalized ("*");
5380 XtSetArg (al
[ac
], XmNtitle
, SDATA (prompt
)); ++ac
;
5381 XtSetArg (al
[ac
], XmNdirectory
, dir_xmstring
); ++ac
;
5382 XtSetArg (al
[ac
], XmNpattern
, pattern_xmstring
); ++ac
;
5383 XtSetArg (al
[ac
], XmNresizePolicy
, XmRESIZE_GROW
); ++ac
;
5384 XtSetArg (al
[ac
], XmNdialogStyle
, XmDIALOG_APPLICATION_MODAL
); ++ac
;
5385 dialog
= XmCreateFileSelectionDialog (f
->output_data
.x
->widget
,
5387 XmStringFree (dir_xmstring
);
5388 XmStringFree (pattern_xmstring
);
5390 /* Add callbacks for OK and Cancel. */
5391 XtAddCallback (dialog
, XmNokCallback
, file_dialog_cb
,
5392 (XtPointer
) &result
);
5393 XtAddCallback (dialog
, XmNcancelCallback
, file_dialog_cb
,
5394 (XtPointer
) &result
);
5395 XtAddCallback (dialog
, XmNunmapCallback
, file_dialog_unmap_cb
,
5396 (XtPointer
) &result
);
5398 /* Remove the help button since we can't display help. */
5399 help
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_HELP_BUTTON
);
5400 XtUnmanageChild (help
);
5402 /* Mark OK button as default. */
5403 XtVaSetValues (XmFileSelectionBoxGetChild (dialog
, XmDIALOG_OK_BUTTON
),
5404 XmNshowAsDefault
, True
, NULL
);
5406 /* If MUSTMATCH is non-nil, disable the file entry field of the
5407 dialog, so that the user must select a file from the files list
5408 box. We can't remove it because we wouldn't have a way to get at
5409 the result file name, then. */
5410 text
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_TEXT
);
5411 if (!NILP (mustmatch
))
5414 label
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_SELECTION_LABEL
);
5415 XtSetSensitive (text
, False
);
5416 XtSetSensitive (label
, False
);
5419 /* Manage the dialog, so that list boxes get filled. */
5420 XtManageChild (dialog
);
5422 if (STRINGP (default_filename
))
5424 XmString default_xmstring
;
5425 Widget wtext
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_TEXT
);
5426 Widget list
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_LIST
);
5428 XmTextPosition last_pos
= XmTextFieldGetLastPosition (wtext
);
5429 XmTextFieldReplace (wtext
, 0, last_pos
,
5430 (SDATA (Ffile_name_nondirectory (default_filename
))));
5432 /* Select DEFAULT_FILENAME in the files list box. DEFAULT_FILENAME
5433 must include the path for this to work. */
5435 default_xmstring
= XmStringCreateLocalized (SDATA (default_filename
));
5437 if (XmListItemExists (list
, default_xmstring
))
5439 int item_pos
= XmListItemPos (list
, default_xmstring
);
5440 /* Select the item and scroll it into view. */
5441 XmListSelectPos (list
, item_pos
, True
);
5442 XmListSetPos (list
, item_pos
);
5445 XmStringFree (default_xmstring
);
5448 record_unwind_protect (clean_up_file_dialog
, make_save_value (dialog
, 0));
5450 /* Process events until the user presses Cancel or OK. */
5451 x_menu_set_in_use (1);
5456 x_menu_wait_for_event (0);
5457 XtAppNextEvent (Xt_app_con
, &event
);
5458 if (event
.type
== KeyPress
5459 && FRAME_X_DISPLAY (f
) == event
.xkey
.display
)
5461 KeySym keysym
= XLookupKeysym (&event
.xkey
, 0);
5463 /* Pop down on C-g. */
5464 if (keysym
== XK_g
&& (event
.xkey
.state
& ControlMask
) != 0)
5465 XtUnmanageChild (dialog
);
5468 (void) x_dispatch_event (&event
, FRAME_X_DISPLAY (f
));
5471 /* Get the result. */
5472 if (result
== XmCR_OK
)
5477 XtVaGetValues (dialog
, XmNtextString
, &text
, NULL
);
5478 XmStringGetLtoR (text
, XmFONTLIST_DEFAULT_TAG
, &data
);
5479 XmStringFree (text
);
5480 file
= build_string (data
);
5489 /* Make "Cancel" equivalent to C-g. */
5491 Fsignal (Qquit
, Qnil
);
5493 decoded_file
= DECODE_FILE (file
);
5495 return unbind_to (count
, decoded_file
);
5498 #endif /* USE_MOTIF */
5503 clean_up_dialog (Lisp_Object arg
)
5505 x_menu_set_in_use (0);
5510 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
5511 doc
: /* Read file name, prompting with PROMPT in directory DIR.
5512 Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
5513 selection box, if specified. If MUSTMATCH is non-nil, the returned file
5514 or directory must exist. If ONLY-DIR-P is non-nil, the user can only select
5516 (Lisp_Object prompt
, Lisp_Object dir
, Lisp_Object default_filename
, Lisp_Object mustmatch
, Lisp_Object only_dir_p
)
5518 FRAME_PTR f
= SELECTED_FRAME ();
5520 Lisp_Object file
= Qnil
;
5521 Lisp_Object decoded_file
;
5522 int count
= SPECPDL_INDEX ();
5523 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
5528 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
, file
);
5530 if (popup_activated ())
5531 error ("Trying to use a menu from within a menu-entry");
5533 CHECK_STRING (prompt
);
5536 /* Prevent redisplay. */
5537 specbind (Qinhibit_redisplay
, Qt
);
5538 record_unwind_protect (clean_up_dialog
, Qnil
);
5542 if (STRINGP (default_filename
))
5543 cdef_file
= SDATA (default_filename
);
5545 cdef_file
= SDATA (dir
);
5547 fn
= xg_get_file_name (f
, SDATA (prompt
), cdef_file
,
5549 ! NILP (only_dir_p
));
5553 file
= build_string (fn
);
5560 /* Make "Cancel" equivalent to C-g. */
5562 Fsignal (Qquit
, Qnil
);
5564 decoded_file
= DECODE_FILE (file
);
5566 return unbind_to (count
, decoded_file
);
5570 #ifdef HAVE_FREETYPE
5572 DEFUN ("x-select-font", Fx_select_font
, Sx_select_font
, 0, 2, 0,
5573 doc
: /* Read a font name using a GTK font selection dialog.
5574 Return a GTK-style font string corresponding to the selection.
5576 If FRAME is omitted or nil, it defaults to the selected frame. */)
5577 (Lisp_Object frame
, Lisp_Object ignored
)
5579 FRAME_PTR f
= check_x_frame (frame
);
5582 Lisp_Object font_param
;
5583 char *default_name
= NULL
;
5584 struct gcpro gcpro1
, gcpro2
;
5585 int count
= SPECPDL_INDEX ();
5589 if (popup_activated ())
5590 error ("Trying to use a menu from within a menu-entry");
5592 /* Prevent redisplay. */
5593 specbind (Qinhibit_redisplay
, Qt
);
5594 record_unwind_protect (clean_up_dialog
, Qnil
);
5598 GCPRO2(font_param
, font
);
5600 XSETFONT (font
, FRAME_FONT (f
));
5601 font_param
= Ffont_get (font
, intern (":name"));
5602 if (STRINGP (font_param
))
5603 default_name
= xstrdup (SDATA (font_param
));
5606 font_param
= Fframe_parameter (frame
, Qfont_param
);
5607 if (STRINGP (font_param
))
5608 default_name
= xstrdup (SDATA (font_param
));
5611 if (default_name
== NULL
&& x_last_font_name
!= NULL
)
5612 default_name
= xstrdup (x_last_font_name
);
5614 /* Convert fontconfig names to Gtk names, i.e. remove - before number */
5617 char *p
= strrchr (default_name
, '-');
5621 while (isdigit (*ep
))
5623 if (*ep
== '\0') *p
= ' ';
5627 name
= xg_get_font_name (f
, default_name
);
5628 xfree (default_name
);
5632 font
= build_string (name
);
5633 g_free (x_last_font_name
);
5634 x_last_font_name
= name
;
5640 Fsignal (Qquit
, Qnil
);
5642 return unbind_to (count
, font
);
5644 #endif /* HAVE_FREETYPE */
5646 #endif /* USE_GTK */
5649 /***********************************************************************
5651 ***********************************************************************/
5653 #ifdef HAVE_XKBGETKEYBOARD
5654 #include <X11/XKBlib.h>
5655 #include <X11/keysym.h>
5658 DEFUN ("x-backspace-delete-keys-p", Fx_backspace_delete_keys_p
,
5659 Sx_backspace_delete_keys_p
, 0, 1, 0,
5660 doc
: /* Check if both Backspace and Delete keys are on the keyboard of FRAME.
5661 FRAME nil means use the selected frame.
5662 Value is t if we know that both keys are present, and are mapped to the
5663 usual X keysyms. Value is `lambda' if we cannot determine if both keys are
5664 present and mapped to the usual X keysyms. */)
5667 #ifdef HAVE_XKBGETKEYBOARD
5669 struct frame
*f
= check_x_frame (frame
);
5670 Display
*dpy
= FRAME_X_DISPLAY (f
);
5671 Lisp_Object have_keys
;
5672 int major
, minor
, op
, event
, error
;
5676 /* Check library version in case we're dynamically linked. */
5677 major
= XkbMajorVersion
;
5678 minor
= XkbMinorVersion
;
5679 if (!XkbLibraryVersion (&major
, &minor
))
5685 /* Check that the server supports XKB. */
5686 major
= XkbMajorVersion
;
5687 minor
= XkbMinorVersion
;
5688 if (!XkbQueryExtension (dpy
, &op
, &event
, &error
, &major
, &minor
))
5694 /* In this code we check that the keyboard has physical keys with names
5695 that start with BKSP (Backspace) and DELE (Delete), and that they
5696 generate keysym XK_BackSpace and XK_Delete respectively.
5697 This function is used to test if normal-erase-is-backspace should be
5699 An alternative approach would be to just check if XK_BackSpace and
5700 XK_Delete are mapped to any key. But if any of those are mapped to
5701 some non-intuitive key combination (Meta-Shift-Ctrl-whatever) and the
5702 user doesn't know about it, it is better to return false here.
5703 It is more obvious to the user what to do if she/he has two keys
5704 clearly marked with names/symbols and one key does something not
5705 expected (i.e. she/he then tries the other).
5706 The cases where Backspace/Delete is mapped to some other key combination
5707 are rare, and in those cases, normal-erase-is-backspace can be turned on
5711 kb
= XkbGetMap (dpy
, XkbAllMapComponentsMask
, XkbUseCoreKbd
);
5714 int delete_keycode
= 0, backspace_keycode
= 0, i
;
5716 if (XkbGetNames (dpy
, XkbAllNamesMask
, kb
) == Success
)
5718 for (i
= kb
->min_key_code
;
5719 (i
< kb
->max_key_code
5720 && (delete_keycode
== 0 || backspace_keycode
== 0));
5723 /* The XKB symbolic key names can be seen most easily in
5724 the PS file generated by `xkbprint -label name
5726 if (memcmp ("DELE", kb
->names
->keys
[i
].name
, 4) == 0)
5728 else if (memcmp ("BKSP", kb
->names
->keys
[i
].name
, 4) == 0)
5729 backspace_keycode
= i
;
5732 XkbFreeNames (kb
, 0, True
);
5735 XkbFreeClientMap (kb
, 0, True
);
5738 && backspace_keycode
5739 && XKeysymToKeycode (dpy
, XK_Delete
) == delete_keycode
5740 && XKeysymToKeycode (dpy
, XK_BackSpace
) == backspace_keycode
)
5745 #else /* not HAVE_XKBGETKEYBOARD */
5747 #endif /* not HAVE_XKBGETKEYBOARD */
5752 /***********************************************************************
5754 ***********************************************************************/
5756 /* Keep this list in the same order as frame_parms in frame.c.
5757 Use 0 for unsupported frame parameters. */
5759 frame_parm_handler x_frame_parm_handlers
[] =
5763 x_set_background_color
,
5769 x_set_foreground_color
,
5772 x_set_internal_border_width
,
5773 x_set_menu_bar_lines
,
5775 x_explicitly_set_name
,
5776 x_set_scroll_bar_width
,
5779 x_set_vertical_scroll_bars
,
5781 x_set_tool_bar_lines
,
5782 x_set_scroll_bar_foreground
,
5783 x_set_scroll_bar_background
,
5793 x_set_tool_bar_position
,
5799 /* This is zero if not using X windows. */
5802 /* The section below is built by the lisp expression at the top of the file,
5803 just above where these variables are declared. */
5804 /*&&& init symbols here &&&*/
5805 Qnone
= intern_c_string ("none");
5807 Qsuppress_icon
= intern_c_string ("suppress-icon");
5808 staticpro (&Qsuppress_icon
);
5809 Qundefined_color
= intern_c_string ("undefined-color");
5810 staticpro (&Qundefined_color
);
5811 Qcompound_text
= intern_c_string ("compound-text");
5812 staticpro (&Qcompound_text
);
5813 Qcancel_timer
= intern_c_string ("cancel-timer");
5814 staticpro (&Qcancel_timer
);
5815 Qfont_param
= intern_c_string ("font-parameter");
5816 staticpro (&Qfont_param
);
5817 /* This is the end of symbol initialization. */
5819 /* Text property `display' should be nonsticky by default. */
5820 Vtext_property_default_nonsticky
5821 = Fcons (Fcons (Qdisplay
, Qt
), Vtext_property_default_nonsticky
);
5824 Fput (Qundefined_color
, Qerror_conditions
,
5825 pure_cons (Qundefined_color
, pure_cons (Qerror
, Qnil
)));
5826 Fput (Qundefined_color
, Qerror_message
,
5827 make_pure_c_string ("Undefined color"));
5829 DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape
,
5830 doc
: /* The shape of the pointer when over text.
5831 Changing the value does not affect existing frames
5832 unless you set the mouse color. */);
5833 Vx_pointer_shape
= Qnil
;
5835 #if 0 /* This doesn't really do anything. */
5836 DEFVAR_LISP ("x-nontext-pointer-shape", &Vx_nontext_pointer_shape
,
5837 doc
: /* The shape of the pointer when not over text.
5838 This variable takes effect when you create a new frame
5839 or when you set the mouse color. */);
5841 Vx_nontext_pointer_shape
= Qnil
;
5843 DEFVAR_LISP ("x-hourglass-pointer-shape", &Vx_hourglass_pointer_shape
,
5844 doc
: /* The shape of the pointer when Emacs is busy.
5845 This variable takes effect when you create a new frame
5846 or when you set the mouse color. */);
5847 Vx_hourglass_pointer_shape
= Qnil
;
5849 #if 0 /* This doesn't really do anything. */
5850 DEFVAR_LISP ("x-mode-pointer-shape", &Vx_mode_pointer_shape
,
5851 doc
: /* The shape of the pointer when over the mode line.
5852 This variable takes effect when you create a new frame
5853 or when you set the mouse color. */);
5855 Vx_mode_pointer_shape
= Qnil
;
5857 DEFVAR_LISP ("x-sensitive-text-pointer-shape",
5858 &Vx_sensitive_text_pointer_shape
,
5859 doc
: /* The shape of the pointer when over mouse-sensitive text.
5860 This variable takes effect when you create a new frame
5861 or when you set the mouse color. */);
5862 Vx_sensitive_text_pointer_shape
= Qnil
;
5864 DEFVAR_LISP ("x-window-horizontal-drag-cursor",
5865 &Vx_window_horizontal_drag_shape
,
5866 doc
: /* Pointer shape to use for indicating a window can be dragged horizontally.
5867 This variable takes effect when you create a new frame
5868 or when you set the mouse color. */);
5869 Vx_window_horizontal_drag_shape
= Qnil
;
5871 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel
,
5872 doc
: /* A string indicating the foreground color of the cursor box. */);
5873 Vx_cursor_fore_pixel
= Qnil
;
5875 DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size
,
5876 doc
: /* Maximum size for tooltips.
5877 Value is a pair (COLUMNS . ROWS). Text larger than this is clipped. */);
5878 Vx_max_tooltip_size
= Fcons (make_number (80), make_number (40));
5880 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager
,
5881 doc
: /* Non-nil if no X window manager is in use.
5882 Emacs doesn't try to figure this out; this is always nil
5883 unless you set it to something else. */);
5884 /* We don't have any way to find this out, so set it to nil
5885 and maybe the user would like to set it to t. */
5886 Vx_no_window_manager
= Qnil
;
5888 DEFVAR_LISP ("x-pixel-size-width-font-regexp",
5889 &Vx_pixel_size_width_font_regexp
,
5890 doc
: /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'.
5892 Since Emacs gets width of a font matching with this regexp from
5893 PIXEL_SIZE field of the name, font finding mechanism gets faster for
5894 such a font. This is especially effective for such large fonts as
5895 Chinese, Japanese, and Korean. */);
5896 Vx_pixel_size_width_font_regexp
= Qnil
;
5898 /* This is not ifdef:ed, so other builds than GTK can customize it. */
5899 DEFVAR_BOOL ("x-gtk-use-old-file-dialog", &x_gtk_use_old_file_dialog
,
5900 doc
: /* *Non-nil means prompt with the old GTK file selection dialog.
5901 If nil or if the file selection dialog is not available, the new GTK file
5902 chooser is used instead. To turn off all file dialogs set the
5903 variable `use-file-dialog'. */);
5904 x_gtk_use_old_file_dialog
= 0;
5906 DEFVAR_BOOL ("x-gtk-show-hidden-files", &x_gtk_show_hidden_files
,
5907 doc
: /* *If non-nil, the GTK file chooser will by default show hidden files.
5908 Note that this is just the default, there is a toggle button on the file
5909 chooser to show or not show hidden files on a case by case basis. */);
5910 x_gtk_show_hidden_files
= 0;
5912 DEFVAR_BOOL ("x-gtk-file-dialog-help-text", &x_gtk_file_dialog_help_text
,
5913 doc
: /* *If non-nil, the GTK file chooser will show additional help text.
5914 If more space for files in the file chooser dialog is wanted, set this to nil
5915 to turn the additional text off. */);
5916 x_gtk_file_dialog_help_text
= 1;
5918 DEFVAR_BOOL ("x-gtk-whole-detached-tool-bar", &x_gtk_whole_detached_tool_bar
,
5919 doc
: /* *If non-nil, a detached tool bar is shown in full.
5920 The default is to just show an arrow and pressing on that arrow shows
5921 the tool bar buttons. */);
5922 x_gtk_whole_detached_tool_bar
= 0;
5924 DEFVAR_BOOL ("x-gtk-use-system-tooltips", &x_gtk_use_system_tooltips
,
5925 doc
: /* *If non-nil with a Gtk+ built Emacs, the Gtk+ toolip is used.
5926 Otherwise use Emacs own tooltip implementation.
5927 When using Gtk+ tooltips, the tooltip face is not used. */);
5928 x_gtk_use_system_tooltips
= 1;
5930 Fprovide (intern_c_string ("x"), Qnil
);
5932 #ifdef USE_X_TOOLKIT
5933 Fprovide (intern_c_string ("x-toolkit"), Qnil
);
5935 Fprovide (intern_c_string ("motif"), Qnil
);
5937 DEFVAR_LISP ("motif-version-string", &Vmotif_version_string
,
5938 doc
: /* Version info for LessTif/Motif. */);
5939 Vmotif_version_string
= build_string (XmVERSION_STRING
);
5940 #endif /* USE_MOTIF */
5941 #endif /* USE_X_TOOLKIT */
5944 /* Provide x-toolkit also for GTK. Internally GTK does not use Xt so it
5945 is not an X toolkit in that sense (USE_X_TOOLKIT is not defined).
5946 But for a user it is a toolkit for X, and indeed, configure
5947 accepts --with-x-toolkit=gtk. */
5948 Fprovide (intern_c_string ("x-toolkit"), Qnil
);
5949 Fprovide (intern_c_string ("gtk"), Qnil
);
5950 Fprovide (intern_c_string ("move-toolbar"), Qnil
);
5952 DEFVAR_LISP ("gtk-version-string", &Vgtk_version_string
,
5953 doc
: /* Version info for GTK+. */);
5955 char gtk_version
[40];
5956 g_snprintf (gtk_version
, sizeof (gtk_version
), "%u.%u.%u",
5957 GTK_MAJOR_VERSION
, GTK_MINOR_VERSION
, GTK_MICRO_VERSION
);
5958 Vgtk_version_string
= make_pure_string (gtk_version
, strlen (gtk_version
), strlen (gtk_version
), 0);
5960 #endif /* USE_GTK */
5962 /* X window properties. */
5963 defsubr (&Sx_change_window_property
);
5964 defsubr (&Sx_delete_window_property
);
5965 defsubr (&Sx_window_property
);
5967 defsubr (&Sxw_display_color_p
);
5968 defsubr (&Sx_display_grayscale_p
);
5969 defsubr (&Sxw_color_defined_p
);
5970 defsubr (&Sxw_color_values
);
5971 defsubr (&Sx_server_max_request_size
);
5972 defsubr (&Sx_server_vendor
);
5973 defsubr (&Sx_server_version
);
5974 defsubr (&Sx_display_pixel_width
);
5975 defsubr (&Sx_display_pixel_height
);
5976 defsubr (&Sx_display_mm_width
);
5977 defsubr (&Sx_display_mm_height
);
5978 defsubr (&Sx_display_screens
);
5979 defsubr (&Sx_display_planes
);
5980 defsubr (&Sx_display_color_cells
);
5981 defsubr (&Sx_display_visual_class
);
5982 defsubr (&Sx_display_backing_store
);
5983 defsubr (&Sx_display_save_under
);
5984 defsubr (&Sx_wm_set_size_hint
);
5985 defsubr (&Sx_create_frame
);
5986 defsubr (&Sx_open_connection
);
5987 defsubr (&Sx_close_connection
);
5988 defsubr (&Sx_display_list
);
5989 defsubr (&Sx_synchronize
);
5990 defsubr (&Sx_focus_frame
);
5991 defsubr (&Sx_backspace_delete_keys_p
);
5993 /* Setting callback functions for fontset handler. */
5994 check_window_system_func
= check_x
;
5996 defsubr (&Sx_show_tip
);
5997 defsubr (&Sx_hide_tip
);
5999 staticpro (&tip_timer
);
6001 staticpro (&tip_frame
);
6003 last_show_tip_args
= Qnil
;
6004 staticpro (&last_show_tip_args
);
6006 defsubr (&Sx_uses_old_gtk_dialog
);
6007 #if defined (USE_MOTIF) || defined (USE_GTK)
6008 defsubr (&Sx_file_dialog
);
6011 #if defined (USE_GTK) && defined (HAVE_FREETYPE)
6012 defsubr (&Sx_select_font
);
6013 x_last_font_name
= NULL
;
6017 #endif /* HAVE_X_WINDOWS */
6019 /* arch-tag: 55040d02-5485-4d58-8b22-95a7a05f3288
6020 (do not change this comment) */