1 /* Functions for the X window system.
2 Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2004, 2005 Free Software Foundation.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
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"
49 #include "termhooks.h"
56 #include <sys/types.h>
60 #if 1 /* Used to be #ifdef EMACS_BITMAP_FILES, but this should always work. */
61 #include "bitmaps/gray.xbm"
63 #include <X11/bitmaps/gray>
66 #include "[.bitmaps]gray.xbm"
74 #include <X11/Shell.h>
77 #include <X11/Xaw/Paned.h>
78 #include <X11/Xaw/Label.h>
79 #endif /* USE_MOTIF */
82 #undef USG /* ####KLUDGE for Solaris 2.2 and up */
91 #include "../lwlib/lwlib.h"
95 #include <Xm/DialogS.h>
96 #include <Xm/FileSB.h>
99 /* Do the EDITRES protocol if running X11R5
100 Exception: HP-UX (at least version A.09.05) has X11R5 without EditRes */
102 #if (XtSpecificationRelease >= 5) && !defined(NO_EDITRES)
104 extern void _XEditResCheckMessages ();
105 #endif /* R5 + Athena */
107 /* Unique id counter for widgets created by the Lucid Widget Library. */
109 extern LWLIB_ID widget_id_tick
;
112 /* This is part of a kludge--see lwlib/xlwmenu.c. */
113 extern XFontStruct
*xlwmenu_default_font
;
116 extern void free_frame_menubar ();
117 extern double atof ();
121 /* LessTif/Motif version info. */
123 static Lisp_Object Vmotif_version_string
;
125 #endif /* USE_MOTIF */
127 #endif /* USE_X_TOOLKIT */
131 /* GTK+ version info */
133 static Lisp_Object Vgtk_version_string
;
138 #define MAXREQUEST(dpy) (XMaxRequestSize (dpy))
140 #define MAXREQUEST(dpy) ((dpy)->max_request_size)
143 /* The gray bitmap `bitmaps/gray'. This is done because xterm.c uses
144 it, and including `bitmaps/gray' more than once is a problem when
145 config.h defines `static' as an empty replacement string. */
147 int gray_bitmap_width
= gray_width
;
148 int gray_bitmap_height
= gray_height
;
149 char *gray_bitmap_bits
= gray_bits
;
151 /* Non-zero means we're allowed to display an hourglass cursor. */
153 int display_hourglass_p
;
155 /* Non-zero means prompt with the old GTK file selection dialog. */
157 int x_use_old_gtk_file_dialog
;
159 /* The background and shape of the mouse pointer, and shape when not
160 over text or in the modeline. */
162 Lisp_Object Vx_pointer_shape
, Vx_nontext_pointer_shape
, Vx_mode_pointer_shape
;
163 Lisp_Object Vx_hourglass_pointer_shape
;
165 /* The shape when over mouse-sensitive text. */
167 Lisp_Object Vx_sensitive_text_pointer_shape
;
169 /* If non-nil, the pointer shape to indicate that windows can be
170 dragged horizontally. */
172 Lisp_Object Vx_window_horizontal_drag_shape
;
174 /* Color of chars displayed in cursor box. */
176 Lisp_Object Vx_cursor_fore_pixel
;
178 /* Nonzero if using X. */
182 /* Non nil if no window manager is in use. */
184 Lisp_Object Vx_no_window_manager
;
186 /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'. */
188 Lisp_Object Vx_pixel_size_width_font_regexp
;
191 Lisp_Object Qsuppress_icon
;
192 Lisp_Object Qundefined_color
;
193 Lisp_Object Qcompound_text
, Qcancel_timer
;
197 extern Lisp_Object Vwindow_system_version
;
199 /* The below are defined in frame.c. */
202 int image_cache_refcount
, dpyinfo_refcount
;
207 /* Error if we are not connected to X. */
213 error ("X windows are not in use or not initialized");
216 /* Nonzero if we can use mouse menus.
217 You should not call this unless HAVE_MENUS is defined. */
225 /* Extract a frame as a FRAME_PTR, defaulting to the selected frame
226 and checking validity for X. */
229 check_x_frame (frame
)
235 frame
= selected_frame
;
236 CHECK_LIVE_FRAME (frame
);
239 error ("Non-X frame used");
243 /* Let the user specify an X display with a frame.
244 nil stands for the selected frame--or, if that is not an X frame,
245 the first X display on the list. */
247 struct x_display_info
*
248 check_x_display_info (frame
)
251 struct x_display_info
*dpyinfo
= NULL
;
255 struct frame
*sf
= XFRAME (selected_frame
);
257 if (FRAME_X_P (sf
) && FRAME_LIVE_P (sf
))
258 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
259 else if (x_display_list
!= 0)
260 dpyinfo
= x_display_list
;
262 error ("X windows are not in use or not initialized");
264 else if (INTEGERP (frame
))
266 struct display
*d
= get_display (XINT (frame
), 1);
268 if (d
->type
!= output_x_window
)
269 error ("Display %d is not an X display", XINT (frame
));
271 dpyinfo
= d
->display_info
.x
;
273 else if (STRINGP (frame
))
274 dpyinfo
= x_display_info_for_name (frame
);
277 FRAME_PTR f
= check_x_frame (frame
);
278 dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
285 /* Return the Emacs frame-object corresponding to an X window.
286 It could be the frame's main window or an icon window. */
288 /* This function can be called during GC, so use GC_xxx type test macros. */
291 x_window_to_frame (dpyinfo
, wdesc
)
292 struct x_display_info
*dpyinfo
;
295 Lisp_Object tail
, frame
;
298 if (wdesc
== None
) return 0;
300 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
303 if (!GC_FRAMEP (frame
))
306 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
308 if (f
->output_data
.x
->hourglass_window
== wdesc
)
311 if ((f
->output_data
.x
->edit_widget
312 && XtWindow (f
->output_data
.x
->edit_widget
) == wdesc
)
313 /* A tooltip frame? */
314 || (!f
->output_data
.x
->edit_widget
315 && FRAME_X_WINDOW (f
) == wdesc
)
316 || f
->output_data
.x
->icon_desc
== wdesc
)
318 #else /* not USE_X_TOOLKIT */
320 if (f
->output_data
.x
->edit_widget
)
322 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
323 struct x_output
*x
= f
->output_data
.x
;
324 if (gwdesc
!= 0 && gwdesc
== x
->edit_widget
)
328 if (FRAME_X_WINDOW (f
) == wdesc
329 || f
->output_data
.x
->icon_desc
== wdesc
)
331 #endif /* not USE_X_TOOLKIT */
336 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
337 /* Like x_window_to_frame but also compares the window with the widget's
341 x_any_window_to_frame (dpyinfo
, wdesc
)
342 struct x_display_info
*dpyinfo
;
345 Lisp_Object tail
, frame
;
346 struct frame
*f
, *found
;
349 if (wdesc
== None
) return NULL
;
352 for (tail
= Vframe_list
; GC_CONSP (tail
) && !found
; tail
= XCDR (tail
))
355 if (!GC_FRAMEP (frame
))
359 if (FRAME_X_P (f
) && FRAME_X_DISPLAY_INFO (f
) == dpyinfo
)
361 /* This frame matches if the window is any of its widgets. */
362 x
= f
->output_data
.x
;
363 if (x
->hourglass_window
== wdesc
)
368 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
370 && (gwdesc
== x
->widget
371 || gwdesc
== x
->edit_widget
372 || gwdesc
== x
->vbox_widget
373 || gwdesc
== x
->menubar_widget
))
376 if (wdesc
== XtWindow (x
->widget
)
377 || wdesc
== XtWindow (x
->column_widget
)
378 || wdesc
== XtWindow (x
->edit_widget
))
380 /* Match if the window is this frame's menubar. */
381 else if (lw_window_is_in_menubar (wdesc
, x
->menubar_widget
))
385 else if (FRAME_X_WINDOW (f
) == wdesc
)
386 /* A tooltip frame. */
394 /* Likewise, but exclude the menu bar widget. */
397 x_non_menubar_window_to_frame (dpyinfo
, wdesc
)
398 struct x_display_info
*dpyinfo
;
401 Lisp_Object tail
, frame
;
405 if (wdesc
== None
) return 0;
407 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
410 if (!GC_FRAMEP (frame
))
413 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
415 x
= f
->output_data
.x
;
416 /* This frame matches if the window is any of its widgets. */
417 if (x
->hourglass_window
== wdesc
)
422 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
424 && (gwdesc
== x
->widget
425 || gwdesc
== x
->edit_widget
426 || gwdesc
== x
->vbox_widget
))
429 if (wdesc
== XtWindow (x
->widget
)
430 || wdesc
== XtWindow (x
->column_widget
)
431 || wdesc
== XtWindow (x
->edit_widget
))
435 else if (FRAME_X_WINDOW (f
) == wdesc
)
436 /* A tooltip frame. */
442 /* Likewise, but consider only the menu bar widget. */
445 x_menubar_window_to_frame (dpyinfo
, wdesc
)
446 struct x_display_info
*dpyinfo
;
449 Lisp_Object tail
, frame
;
453 if (wdesc
== None
) return 0;
455 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
458 if (!GC_FRAMEP (frame
))
461 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
463 x
= f
->output_data
.x
;
464 /* Match if the window is this frame's menubar. */
466 if (x
->menubar_widget
)
468 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
473 && (gwdesc
== x
->menubar_widget
474 || gtk_widget_get_parent (gwdesc
) == x
->menubar_widget
))
480 if (x
->menubar_widget
481 && lw_window_is_in_menubar (wdesc
, x
->menubar_widget
))
488 /* Return the frame whose principal (outermost) window is WDESC.
489 If WDESC is some other (smaller) window, we return 0. */
492 x_top_window_to_frame (dpyinfo
, wdesc
)
493 struct x_display_info
*dpyinfo
;
496 Lisp_Object tail
, frame
;
500 if (wdesc
== None
) return 0;
502 for (tail
= Vframe_list
; GC_CONSP (tail
); tail
= XCDR (tail
))
505 if (!GC_FRAMEP (frame
))
508 if (!FRAME_X_P (f
) || FRAME_X_DISPLAY_INFO (f
) != dpyinfo
)
510 x
= f
->output_data
.x
;
514 /* This frame matches if the window is its topmost widget. */
516 GtkWidget
*gwdesc
= xg_win_to_widget (dpyinfo
->display
, wdesc
);
517 if (gwdesc
== x
->widget
)
520 if (wdesc
== XtWindow (x
->widget
))
522 #if 0 /* I don't know why it did this,
523 but it seems logically wrong,
524 and it causes trouble for MapNotify events. */
525 /* Match if the window is this frame's menubar. */
526 if (x
->menubar_widget
527 && wdesc
== XtWindow (x
->menubar_widget
))
532 else if (FRAME_X_WINDOW (f
) == wdesc
)
538 #endif /* USE_X_TOOLKIT || USE_GTK */
542 static Lisp_Object unwind_create_frame
P_ ((Lisp_Object
));
543 static Lisp_Object unwind_create_tip_frame
P_ ((Lisp_Object
));
545 void x_set_foreground_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
546 static void x_set_wait_for_wm
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
547 void x_set_background_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
548 void x_set_mouse_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
549 void x_set_cursor_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
550 void x_set_border_color
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
551 void x_set_cursor_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
552 void x_set_icon_type
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
553 void x_set_icon_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
554 void x_explicitly_set_name
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
555 void x_set_menu_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
556 void x_set_title
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
557 void x_set_tool_bar_lines
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
));
558 void x_set_scroll_bar_foreground
P_ ((struct frame
*, Lisp_Object
,
560 void x_set_scroll_bar_background
P_ ((struct frame
*, Lisp_Object
,
562 static Lisp_Object x_default_scroll_bar_color_parameter
P_ ((struct frame
*,
569 /* Store the screen positions of frame F into XPTR and YPTR.
570 These are the positions of the containing window manager window,
571 not Emacs's own window. */
574 x_real_positions (f
, xptr
, yptr
)
578 int win_x
, win_y
, outer_x
, outer_y
;
579 int real_x
= 0, real_y
= 0;
581 Window win
= f
->output_data
.x
->parent_desc
;
587 count
= x_catch_errors (FRAME_X_DISPLAY (f
));
589 if (win
== FRAME_X_DISPLAY_INFO (f
)->root_window
)
590 win
= FRAME_OUTER_WINDOW (f
);
592 /* This loop traverses up the containment tree until we hit the root
593 window. Window managers may intersect many windows between our window
594 and the root window. The window we find just before the root window
595 should be the outer WM window. */
598 Window wm_window
, rootw
;
599 Window
*tmp_children
;
600 unsigned int tmp_nchildren
;
603 success
= XQueryTree (FRAME_X_DISPLAY (f
), win
, &rootw
,
604 &wm_window
, &tmp_children
, &tmp_nchildren
);
606 had_errors
= x_had_errors_p (FRAME_X_DISPLAY (f
));
608 /* Don't free tmp_children if XQueryTree failed. */
612 XFree ((char *) tmp_children
);
614 if (wm_window
== rootw
|| had_errors
)
625 /* Get the real coordinates for the WM window upper left corner */
626 XGetGeometry (FRAME_X_DISPLAY (f
), win
,
627 &rootw
, &real_x
, &real_y
, &ign
, &ign
, &ign
, &ign
);
629 /* Translate real coordinates to coordinates relative to our
630 window. For our window, the upper left corner is 0, 0.
631 Since the upper left corner of the WM window is outside
632 our window, win_x and win_y will be negative:
634 ------------------ ---> x
636 | ----------------- v y
639 XTranslateCoordinates (FRAME_X_DISPLAY (f
),
641 /* From-window, to-window. */
642 FRAME_X_DISPLAY_INFO (f
)->root_window
,
645 /* From-position, to-position. */
646 real_x
, real_y
, &win_x
, &win_y
,
651 if (FRAME_X_WINDOW (f
) == FRAME_OUTER_WINDOW (f
))
658 XTranslateCoordinates (FRAME_X_DISPLAY (f
),
660 /* From-window, to-window. */
661 FRAME_X_DISPLAY_INFO (f
)->root_window
,
662 FRAME_OUTER_WINDOW (f
),
664 /* From-position, to-position. */
665 real_x
, real_y
, &outer_x
, &outer_y
,
671 had_errors
= x_had_errors_p (FRAME_X_DISPLAY (f
));
674 x_uncatch_errors (FRAME_X_DISPLAY (f
), count
);
678 if (had_errors
) return;
680 f
->x_pixels_diff
= -win_x
;
681 f
->y_pixels_diff
= -win_y
;
683 FRAME_X_OUTPUT (f
)->x_pixels_outer_diff
= -outer_x
;
684 FRAME_X_OUTPUT (f
)->y_pixels_outer_diff
= -outer_y
;
693 /* Gamma-correct COLOR on frame F. */
696 gamma_correct (f
, color
)
702 color
->red
= pow (color
->red
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
703 color
->green
= pow (color
->green
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
704 color
->blue
= pow (color
->blue
/ 65535.0, f
->gamma
) * 65535.0 + 0.5;
709 /* Decide if color named COLOR_NAME is valid for use on frame F. If
710 so, return the RGB values in COLOR. If ALLOC_P is non-zero,
711 allocate the color. Value is zero if COLOR_NAME is invalid, or
712 no color could be allocated. */
715 x_defined_color (f
, color_name
, color
, alloc_p
)
722 Display
*dpy
= FRAME_X_DISPLAY (f
);
723 Colormap cmap
= FRAME_X_COLORMAP (f
);
726 success_p
= XParseColor (dpy
, cmap
, color_name
, color
);
727 if (success_p
&& alloc_p
)
728 success_p
= x_alloc_nearest_color (f
, cmap
, color
);
735 /* Return the pixel color value for color COLOR_NAME on frame F. If F
736 is a monochrome frame, return MONO_COLOR regardless of what ARG says.
737 Signal an error if color can't be allocated. */
740 x_decode_color (f
, color_name
, mono_color
)
742 Lisp_Object color_name
;
747 CHECK_STRING (color_name
);
749 #if 0 /* Don't do this. It's wrong when we're not using the default
750 colormap, it makes freeing difficult, and it's probably not
751 an important optimization. */
752 if (strcmp (SDATA (color_name
), "black") == 0)
753 return BLACK_PIX_DEFAULT (f
);
754 else if (strcmp (SDATA (color_name
), "white") == 0)
755 return WHITE_PIX_DEFAULT (f
);
758 /* Return MONO_COLOR for monochrome frames. */
759 if (FRAME_X_DISPLAY_INFO (f
)->n_planes
== 1)
762 /* x_defined_color is responsible for coping with failures
763 by looking for a near-miss. */
764 if (x_defined_color (f
, SDATA (color_name
), &cdef
, 1))
767 Fsignal (Qerror
, Fcons (build_string ("Undefined color"),
768 Fcons (color_name
, Qnil
)));
774 /* Change the `wait-for-wm' frame parameter of frame F. OLD_VALUE is
775 the previous value of that parameter, NEW_VALUE is the new value.
776 See also the comment of wait_for_wm in struct x_output. */
779 x_set_wait_for_wm (f
, new_value
, old_value
)
781 Lisp_Object new_value
, old_value
;
783 f
->output_data
.x
->wait_for_wm
= !NILP (new_value
);
788 /* Set icon from FILE for frame F. By using GTK functions the icon
789 may be any format that GdkPixbuf knows about, i.e. not just bitmaps. */
792 xg_set_icon (f
, file
)
802 found
= x_find_image_file (file
);
810 filename
= SDATA (found
);
813 pixbuf
= gdk_pixbuf_new_from_file (filename
, &err
);
817 gtk_window_set_icon (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)),
819 g_object_unref (pixbuf
);
835 /* Functions called only from `x_set_frame_param'
836 to set individual parameters.
838 If FRAME_X_WINDOW (f) is 0,
839 the frame is being created and its X-window does not exist yet.
840 In that case, just record the parameter's new value
841 in the standard place; do not attempt to change the window. */
844 x_set_foreground_color (f
, arg
, oldval
)
846 Lisp_Object arg
, oldval
;
848 struct x_output
*x
= f
->output_data
.x
;
849 unsigned long fg
, old_fg
;
851 fg
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
852 old_fg
= x
->foreground_pixel
;
853 x
->foreground_pixel
= fg
;
855 if (FRAME_X_WINDOW (f
) != 0)
857 Display
*dpy
= FRAME_X_DISPLAY (f
);
860 XSetForeground (dpy
, x
->normal_gc
, fg
);
861 XSetBackground (dpy
, x
->reverse_gc
, fg
);
863 if (x
->cursor_pixel
== old_fg
)
865 unload_color (f
, x
->cursor_pixel
);
866 x
->cursor_pixel
= x_copy_color (f
, fg
);
867 XSetBackground (dpy
, x
->cursor_gc
, x
->cursor_pixel
);
872 update_face_from_frame_parameter (f
, Qforeground_color
, arg
);
874 if (FRAME_VISIBLE_P (f
))
878 unload_color (f
, old_fg
);
882 x_set_background_color (f
, arg
, oldval
)
884 Lisp_Object arg
, oldval
;
886 struct x_output
*x
= f
->output_data
.x
;
889 bg
= x_decode_color (f
, arg
, WHITE_PIX_DEFAULT (f
));
890 unload_color (f
, x
->background_pixel
);
891 x
->background_pixel
= bg
;
893 if (FRAME_X_WINDOW (f
) != 0)
895 Display
*dpy
= FRAME_X_DISPLAY (f
);
898 XSetBackground (dpy
, x
->normal_gc
, bg
);
899 XSetForeground (dpy
, x
->reverse_gc
, bg
);
900 XSetWindowBackground (dpy
, FRAME_X_WINDOW (f
), bg
);
901 XSetForeground (dpy
, x
->cursor_gc
, bg
);
904 xg_set_background_color (f
, bg
);
907 #ifndef USE_TOOLKIT_SCROLL_BARS /* Turns out to be annoying with
908 toolkit scroll bars. */
911 for (bar
= FRAME_SCROLL_BARS (f
);
913 bar
= XSCROLL_BAR (bar
)->next
)
915 Window window
= SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar
));
916 XSetWindowBackground (dpy
, window
, bg
);
919 #endif /* USE_TOOLKIT_SCROLL_BARS */
922 update_face_from_frame_parameter (f
, Qbackground_color
, arg
);
924 if (FRAME_VISIBLE_P (f
))
930 x_set_mouse_color (f
, arg
, oldval
)
932 Lisp_Object arg
, oldval
;
934 struct x_output
*x
= f
->output_data
.x
;
935 Display
*dpy
= FRAME_X_DISPLAY (f
);
936 Cursor cursor
, nontext_cursor
, mode_cursor
, hand_cursor
;
937 Cursor hourglass_cursor
, horizontal_drag_cursor
;
939 unsigned long pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
940 unsigned long mask_color
= x
->background_pixel
;
942 /* Don't let pointers be invisible. */
943 if (mask_color
== pixel
)
945 x_free_colors (f
, &pixel
, 1);
946 pixel
= x_copy_color (f
, x
->foreground_pixel
);
949 unload_color (f
, x
->mouse_pixel
);
950 x
->mouse_pixel
= pixel
;
954 /* It's not okay to crash if the user selects a screwy cursor. */
955 count
= x_catch_errors (dpy
);
957 if (!NILP (Vx_pointer_shape
))
959 CHECK_NUMBER (Vx_pointer_shape
);
960 cursor
= XCreateFontCursor (dpy
, XINT (Vx_pointer_shape
));
963 cursor
= XCreateFontCursor (dpy
, XC_xterm
);
964 x_check_errors (dpy
, "bad text pointer cursor: %s");
966 if (!NILP (Vx_nontext_pointer_shape
))
968 CHECK_NUMBER (Vx_nontext_pointer_shape
);
970 = XCreateFontCursor (dpy
, XINT (Vx_nontext_pointer_shape
));
973 nontext_cursor
= XCreateFontCursor (dpy
, XC_left_ptr
);
974 x_check_errors (dpy
, "bad nontext pointer cursor: %s");
976 if (!NILP (Vx_hourglass_pointer_shape
))
978 CHECK_NUMBER (Vx_hourglass_pointer_shape
);
980 = XCreateFontCursor (dpy
, XINT (Vx_hourglass_pointer_shape
));
983 hourglass_cursor
= XCreateFontCursor (dpy
, XC_watch
);
984 x_check_errors (dpy
, "bad hourglass pointer cursor: %s");
986 if (!NILP (Vx_mode_pointer_shape
))
988 CHECK_NUMBER (Vx_mode_pointer_shape
);
989 mode_cursor
= XCreateFontCursor (dpy
, XINT (Vx_mode_pointer_shape
));
992 mode_cursor
= XCreateFontCursor (dpy
, XC_xterm
);
993 x_check_errors (dpy
, "bad modeline pointer cursor: %s");
995 if (!NILP (Vx_sensitive_text_pointer_shape
))
997 CHECK_NUMBER (Vx_sensitive_text_pointer_shape
);
999 = XCreateFontCursor (dpy
, XINT (Vx_sensitive_text_pointer_shape
));
1002 hand_cursor
= XCreateFontCursor (dpy
, XC_hand2
);
1004 if (!NILP (Vx_window_horizontal_drag_shape
))
1006 CHECK_NUMBER (Vx_window_horizontal_drag_shape
);
1007 horizontal_drag_cursor
1008 = XCreateFontCursor (dpy
, XINT (Vx_window_horizontal_drag_shape
));
1011 horizontal_drag_cursor
1012 = XCreateFontCursor (dpy
, XC_sb_h_double_arrow
);
1014 /* Check and report errors with the above calls. */
1015 x_check_errors (dpy
, "can't set cursor shape: %s");
1016 x_uncatch_errors (dpy
, count
);
1019 XColor fore_color
, back_color
;
1021 fore_color
.pixel
= x
->mouse_pixel
;
1022 x_query_color (f
, &fore_color
);
1023 back_color
.pixel
= mask_color
;
1024 x_query_color (f
, &back_color
);
1026 XRecolorCursor (dpy
, cursor
, &fore_color
, &back_color
);
1027 XRecolorCursor (dpy
, nontext_cursor
, &fore_color
, &back_color
);
1028 XRecolorCursor (dpy
, mode_cursor
, &fore_color
, &back_color
);
1029 XRecolorCursor (dpy
, hand_cursor
, &fore_color
, &back_color
);
1030 XRecolorCursor (dpy
, hourglass_cursor
, &fore_color
, &back_color
);
1031 XRecolorCursor (dpy
, horizontal_drag_cursor
, &fore_color
, &back_color
);
1034 if (FRAME_X_WINDOW (f
) != 0)
1035 XDefineCursor (dpy
, FRAME_X_WINDOW (f
), cursor
);
1037 if (cursor
!= x
->text_cursor
1038 && x
->text_cursor
!= 0)
1039 XFreeCursor (dpy
, x
->text_cursor
);
1040 x
->text_cursor
= cursor
;
1042 if (nontext_cursor
!= x
->nontext_cursor
1043 && x
->nontext_cursor
!= 0)
1044 XFreeCursor (dpy
, x
->nontext_cursor
);
1045 x
->nontext_cursor
= nontext_cursor
;
1047 if (hourglass_cursor
!= x
->hourglass_cursor
1048 && x
->hourglass_cursor
!= 0)
1049 XFreeCursor (dpy
, x
->hourglass_cursor
);
1050 x
->hourglass_cursor
= hourglass_cursor
;
1052 if (mode_cursor
!= x
->modeline_cursor
1053 && x
->modeline_cursor
!= 0)
1054 XFreeCursor (dpy
, f
->output_data
.x
->modeline_cursor
);
1055 x
->modeline_cursor
= mode_cursor
;
1057 if (hand_cursor
!= x
->hand_cursor
1058 && x
->hand_cursor
!= 0)
1059 XFreeCursor (dpy
, x
->hand_cursor
);
1060 x
->hand_cursor
= hand_cursor
;
1062 if (horizontal_drag_cursor
!= x
->horizontal_drag_cursor
1063 && x
->horizontal_drag_cursor
!= 0)
1064 XFreeCursor (dpy
, x
->horizontal_drag_cursor
);
1065 x
->horizontal_drag_cursor
= horizontal_drag_cursor
;
1070 update_face_from_frame_parameter (f
, Qmouse_color
, arg
);
1074 x_set_cursor_color (f
, arg
, oldval
)
1076 Lisp_Object arg
, oldval
;
1078 unsigned long fore_pixel
, pixel
;
1079 int fore_pixel_allocated_p
= 0, pixel_allocated_p
= 0;
1080 struct x_output
*x
= f
->output_data
.x
;
1082 if (!NILP (Vx_cursor_fore_pixel
))
1084 fore_pixel
= x_decode_color (f
, Vx_cursor_fore_pixel
,
1085 WHITE_PIX_DEFAULT (f
));
1086 fore_pixel_allocated_p
= 1;
1089 fore_pixel
= x
->background_pixel
;
1091 pixel
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1092 pixel_allocated_p
= 1;
1094 /* Make sure that the cursor color differs from the background color. */
1095 if (pixel
== x
->background_pixel
)
1097 if (pixel_allocated_p
)
1099 x_free_colors (f
, &pixel
, 1);
1100 pixel_allocated_p
= 0;
1103 pixel
= x
->mouse_pixel
;
1104 if (pixel
== fore_pixel
)
1106 if (fore_pixel_allocated_p
)
1108 x_free_colors (f
, &fore_pixel
, 1);
1109 fore_pixel_allocated_p
= 0;
1111 fore_pixel
= x
->background_pixel
;
1115 unload_color (f
, x
->cursor_foreground_pixel
);
1116 if (!fore_pixel_allocated_p
)
1117 fore_pixel
= x_copy_color (f
, fore_pixel
);
1118 x
->cursor_foreground_pixel
= fore_pixel
;
1120 unload_color (f
, x
->cursor_pixel
);
1121 if (!pixel_allocated_p
)
1122 pixel
= x_copy_color (f
, pixel
);
1123 x
->cursor_pixel
= pixel
;
1125 if (FRAME_X_WINDOW (f
) != 0)
1128 XSetBackground (FRAME_X_DISPLAY (f
), x
->cursor_gc
, x
->cursor_pixel
);
1129 XSetForeground (FRAME_X_DISPLAY (f
), x
->cursor_gc
, fore_pixel
);
1132 if (FRAME_VISIBLE_P (f
))
1134 x_update_cursor (f
, 0);
1135 x_update_cursor (f
, 1);
1139 update_face_from_frame_parameter (f
, Qcursor_color
, arg
);
1142 /* Set the border-color of frame F to pixel value PIX.
1143 Note that this does not fully take effect if done before
1144 F has an x-window. */
1147 x_set_border_pixel (f
, pix
)
1151 unload_color (f
, f
->output_data
.x
->border_pixel
);
1152 f
->output_data
.x
->border_pixel
= pix
;
1154 if (FRAME_X_WINDOW (f
) != 0 && f
->border_width
> 0)
1157 XSetWindowBorder (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1158 (unsigned long)pix
);
1161 if (FRAME_VISIBLE_P (f
))
1166 /* Set the border-color of frame F to value described by ARG.
1167 ARG can be a string naming a color.
1168 The border-color is used for the border that is drawn by the X server.
1169 Note that this does not fully take effect if done before
1170 F has an x-window; it must be redone when the window is created.
1172 Note: this is done in two routines because of the way X10 works.
1174 Note: under X11, this is normally the province of the window manager,
1175 and so emacs' border colors may be overridden. */
1178 x_set_border_color (f
, arg
, oldval
)
1180 Lisp_Object arg
, oldval
;
1185 pix
= x_decode_color (f
, arg
, BLACK_PIX_DEFAULT (f
));
1186 x_set_border_pixel (f
, pix
);
1187 update_face_from_frame_parameter (f
, Qborder_color
, arg
);
1192 x_set_cursor_type (f
, arg
, oldval
)
1194 Lisp_Object arg
, oldval
;
1196 set_frame_cursor_types (f
, arg
);
1198 /* Make sure the cursor gets redrawn. */
1199 cursor_type_changed
= 1;
1203 x_set_icon_type (f
, arg
, oldval
)
1205 Lisp_Object arg
, oldval
;
1211 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1214 else if (!STRINGP (oldval
) && EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
1219 result
= x_text_icon (f
,
1220 (char *) SDATA ((!NILP (f
->icon_name
)
1224 result
= x_bitmap_icon (f
, arg
);
1229 error ("No icon window available");
1232 XFlush (FRAME_X_DISPLAY (f
));
1237 x_set_icon_name (f
, arg
, oldval
)
1239 Lisp_Object arg
, oldval
;
1245 if (STRINGP (oldval
) && EQ (Fstring_equal (oldval
, arg
), Qt
))
1248 else if (!STRINGP (oldval
) && EQ (oldval
, Qnil
) == EQ (arg
, Qnil
))
1253 if (f
->output_data
.x
->icon_bitmap
!= 0)
1258 result
= x_text_icon (f
,
1259 (char *) SDATA ((!NILP (f
->icon_name
)
1268 error ("No icon window available");
1271 XFlush (FRAME_X_DISPLAY (f
));
1277 x_set_menu_bar_lines (f
, value
, oldval
)
1279 Lisp_Object value
, oldval
;
1282 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
1283 int olines
= FRAME_MENU_BAR_LINES (f
);
1286 /* Right now, menu bars don't work properly in minibuf-only frames;
1287 most of the commands try to apply themselves to the minibuffer
1288 frame itself, and get an error because you can't switch buffers
1289 in or split the minibuffer window. */
1290 if (FRAME_MINIBUF_ONLY_P (f
))
1293 if (INTEGERP (value
))
1294 nlines
= XINT (value
);
1298 /* Make sure we redisplay all windows in this frame. */
1299 windows_or_buffers_changed
++;
1301 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
1302 FRAME_MENU_BAR_LINES (f
) = 0;
1305 FRAME_EXTERNAL_MENU_BAR (f
) = 1;
1306 if (FRAME_X_P (f
) && f
->output_data
.x
->menubar_widget
== 0)
1307 /* Make sure next redisplay shows the menu bar. */
1308 XWINDOW (FRAME_SELECTED_WINDOW (f
))->update_mode_line
= Qt
;
1312 if (FRAME_EXTERNAL_MENU_BAR (f
) == 1)
1313 free_frame_menubar (f
);
1314 FRAME_EXTERNAL_MENU_BAR (f
) = 0;
1316 f
->output_data
.x
->menubar_widget
= 0;
1318 #else /* not USE_X_TOOLKIT && not USE_GTK */
1319 FRAME_MENU_BAR_LINES (f
) = nlines
;
1320 change_window_heights (f
->root_window
, nlines
- olines
);
1321 #endif /* not USE_X_TOOLKIT */
1326 /* Set the number of lines used for the tool bar of frame F to VALUE.
1327 VALUE not an integer, or < 0 means set the lines to zero. OLDVAL
1328 is the old number of tool bar lines. This function changes the
1329 height of all windows on frame F to match the new tool bar height.
1330 The frame's height doesn't change. */
1333 x_set_tool_bar_lines (f
, value
, oldval
)
1335 Lisp_Object value
, oldval
;
1337 int delta
, nlines
, root_height
;
1338 Lisp_Object root_window
;
1340 /* Treat tool bars like menu bars. */
1341 if (FRAME_MINIBUF_ONLY_P (f
))
1344 /* Use VALUE only if an integer >= 0. */
1345 if (INTEGERP (value
) && XINT (value
) >= 0)
1346 nlines
= XFASTINT (value
);
1351 FRAME_TOOL_BAR_LINES (f
) = 0;
1354 FRAME_EXTERNAL_TOOL_BAR (f
) = 1;
1355 if (FRAME_X_P (f
) && f
->output_data
.x
->toolbar_widget
== 0)
1356 /* Make sure next redisplay shows the tool bar. */
1357 XWINDOW (FRAME_SELECTED_WINDOW (f
))->update_mode_line
= Qt
;
1358 update_frame_tool_bar (f
);
1362 if (FRAME_EXTERNAL_TOOL_BAR (f
))
1363 free_frame_tool_bar (f
);
1364 FRAME_EXTERNAL_TOOL_BAR (f
) = 0;
1370 /* Make sure we redisplay all windows in this frame. */
1371 ++windows_or_buffers_changed
;
1373 delta
= nlines
- FRAME_TOOL_BAR_LINES (f
);
1375 /* Don't resize the tool-bar to more than we have room for. */
1376 root_window
= FRAME_ROOT_WINDOW (f
);
1377 root_height
= WINDOW_TOTAL_LINES (XWINDOW (root_window
));
1378 if (root_height
- delta
< 1)
1380 delta
= root_height
- 1;
1381 nlines
= FRAME_TOOL_BAR_LINES (f
) + delta
;
1384 FRAME_TOOL_BAR_LINES (f
) = nlines
;
1385 change_window_heights (root_window
, delta
);
1388 /* We also have to make sure that the internal border at the top of
1389 the frame, below the menu bar or tool bar, is redrawn when the
1390 tool bar disappears. This is so because the internal border is
1391 below the tool bar if one is displayed, but is below the menu bar
1392 if there isn't a tool bar. The tool bar draws into the area
1393 below the menu bar. */
1394 if (FRAME_X_WINDOW (f
) && FRAME_TOOL_BAR_LINES (f
) == 0)
1397 clear_current_matrices (f
);
1400 /* If the tool bar gets smaller, the internal border below it
1401 has to be cleared. It was formerly part of the display
1402 of the larger tool bar, and updating windows won't clear it. */
1405 int height
= FRAME_INTERNAL_BORDER_WIDTH (f
);
1406 int width
= FRAME_PIXEL_WIDTH (f
);
1407 int y
= nlines
* FRAME_LINE_HEIGHT (f
);
1409 /* height can be zero here. */
1410 if (height
> 0 && width
> 0)
1413 x_clear_area (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1414 0, y
, width
, height
, False
);
1418 if (WINDOWP (f
->tool_bar_window
))
1419 clear_glyph_matrix (XWINDOW (f
->tool_bar_window
)->current_matrix
);
1424 /* Set the foreground color for scroll bars on frame F to VALUE.
1425 VALUE should be a string, a color name. If it isn't a string or
1426 isn't a valid color name, do nothing. OLDVAL is the old value of
1427 the frame parameter. */
1430 x_set_scroll_bar_foreground (f
, value
, oldval
)
1432 Lisp_Object value
, oldval
;
1434 unsigned long pixel
;
1436 if (STRINGP (value
))
1437 pixel
= x_decode_color (f
, value
, BLACK_PIX_DEFAULT (f
));
1441 if (f
->output_data
.x
->scroll_bar_foreground_pixel
!= -1)
1442 unload_color (f
, f
->output_data
.x
->scroll_bar_foreground_pixel
);
1444 f
->output_data
.x
->scroll_bar_foreground_pixel
= pixel
;
1445 if (FRAME_X_WINDOW (f
) && FRAME_VISIBLE_P (f
))
1447 /* Remove all scroll bars because they have wrong colors. */
1448 if (FRAME_DISPLAY (f
)->condemn_scroll_bars_hook
)
1449 (*FRAME_DISPLAY (f
)->condemn_scroll_bars_hook
) (f
);
1450 if (FRAME_DISPLAY (f
)->judge_scroll_bars_hook
)
1451 (*FRAME_DISPLAY (f
)->judge_scroll_bars_hook
) (f
);
1453 update_face_from_frame_parameter (f
, Qscroll_bar_foreground
, value
);
1459 /* Set the background color for scroll bars on frame F to VALUE VALUE
1460 should be a string, a color name. If it isn't a string or isn't a
1461 valid color name, do nothing. OLDVAL is the old value of the frame
1465 x_set_scroll_bar_background (f
, value
, oldval
)
1467 Lisp_Object value
, oldval
;
1469 unsigned long pixel
;
1471 if (STRINGP (value
))
1472 pixel
= x_decode_color (f
, value
, WHITE_PIX_DEFAULT (f
));
1476 if (f
->output_data
.x
->scroll_bar_background_pixel
!= -1)
1477 unload_color (f
, f
->output_data
.x
->scroll_bar_background_pixel
);
1479 #ifdef USE_TOOLKIT_SCROLL_BARS
1480 /* Scrollbar shadow colors. */
1481 if (f
->output_data
.x
->scroll_bar_top_shadow_pixel
!= -1)
1483 unload_color (f
, f
->output_data
.x
->scroll_bar_top_shadow_pixel
);
1484 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
1486 if (f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
!= -1)
1488 unload_color (f
, f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
);
1489 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
1491 #endif /* USE_TOOLKIT_SCROLL_BARS */
1493 f
->output_data
.x
->scroll_bar_background_pixel
= pixel
;
1494 if (FRAME_X_WINDOW (f
) && FRAME_VISIBLE_P (f
))
1496 /* Remove all scroll bars because they have wrong colors. */
1497 if (FRAME_DISPLAY (f
)->condemn_scroll_bars_hook
)
1498 (*FRAME_DISPLAY (f
)->condemn_scroll_bars_hook
) (f
);
1499 if (FRAME_DISPLAY (f
)->judge_scroll_bars_hook
)
1500 (*FRAME_DISPLAY (f
)->judge_scroll_bars_hook
) (f
);
1502 update_face_from_frame_parameter (f
, Qscroll_bar_background
, value
);
1508 /* Encode Lisp string STRING as a text in a format appropriate for
1509 XICCC (X Inter Client Communication Conventions).
1511 If STRING contains only ASCII characters, do no conversion and
1512 return the string data of STRING. Otherwise, encode the text by
1513 CODING_SYSTEM, and return a newly allocated memory area which
1514 should be freed by `xfree' by a caller.
1516 SELECTIONP non-zero means the string is being encoded for an X
1517 selection, so it is safe to run pre-write conversions (which
1520 Store the byte length of resulting text in *TEXT_BYTES.
1522 If the text contains only ASCII and Latin-1, store 1 in *STRING_P,
1523 which means that the `encoding' of the result can be `STRING'.
1524 Otherwise store 0 in *STRINGP, which means that the `encoding' of
1525 the result should be `COMPOUND_TEXT'. */
1528 x_encode_text (string
, coding_system
, selectionp
, text_bytes
, stringp
)
1529 Lisp_Object string
, coding_system
;
1530 int *text_bytes
, *stringp
;
1533 unsigned char *str
= SDATA (string
);
1534 int chars
= SCHARS (string
);
1535 int bytes
= SBYTES (string
);
1539 struct coding_system coding
;
1540 extern Lisp_Object Qcompound_text_with_extensions
;
1542 charset_info
= find_charset_in_text (str
, chars
, bytes
, NULL
, Qnil
);
1543 if (charset_info
== 0)
1545 /* No multibyte character in OBJ. We need not encode it. */
1546 *text_bytes
= bytes
;
1551 setup_coding_system (coding_system
, &coding
);
1553 && SYMBOLP (coding
.pre_write_conversion
)
1554 && !NILP (Ffboundp (coding
.pre_write_conversion
)))
1556 string
= run_pre_post_conversion_on_str (string
, &coding
, 1);
1557 str
= SDATA (string
);
1558 chars
= SCHARS (string
);
1559 bytes
= SBYTES (string
);
1561 coding
.src_multibyte
= 1;
1562 coding
.dst_multibyte
= 0;
1563 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1564 if (coding
.type
== coding_type_iso2022
)
1565 coding
.flags
|= CODING_FLAG_ISO_SAFE
;
1566 /* We suppress producing escape sequences for composition. */
1567 coding
.composing
= COMPOSITION_DISABLED
;
1568 bufsize
= encoding_buffer_size (&coding
, bytes
);
1569 buf
= (unsigned char *) xmalloc (bufsize
);
1570 encode_coding (&coding
, str
, buf
, bytes
, bufsize
);
1571 *text_bytes
= coding
.produced
;
1572 *stringp
= (charset_info
== 1
1573 || (!EQ (coding_system
, Qcompound_text
)
1574 && !EQ (coding_system
, Qcompound_text_with_extensions
)));
1579 /* Set the WM name to NAME for frame F. Also set the icon name.
1580 If the frame already has an icon name, use that, otherwise set the
1581 icon name to NAME. */
1584 x_set_name_internal (f
, name
)
1588 if (FRAME_X_WINDOW (f
))
1593 XTextProperty text
, icon
;
1595 int do_free_icon_value
= 0, do_free_text_value
= 0;
1596 Lisp_Object coding_system
;
1598 coding_system
= Qcompound_text
;
1599 /* Note: Encoding strategy
1601 We encode NAME by compound-text and use "COMPOUND-TEXT" in
1602 text.encoding. But, there are non-internationalized window
1603 managers which don't support that encoding. So, if NAME
1604 contains only ASCII and 8859-1 characters, encode it by
1605 iso-latin-1, and use "STRING" in text.encoding hoping that
1606 such window managers at least analyze this format correctly,
1607 i.e. treat 8-bit bytes as 8859-1 characters.
1609 We may also be able to use "UTF8_STRING" in text.encoding
1610 in the future which can encode all Unicode characters.
1611 But, for the moment, there's no way to know that the
1612 current window manager supports it or not. */
1613 text
.value
= x_encode_text (name
, coding_system
, 0, &bytes
, &stringp
);
1614 text
.encoding
= (stringp
? XA_STRING
1615 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
1617 text
.nitems
= bytes
;
1619 /* Check early, because ENCODE_UTF_8 below may GC and name may be
1621 do_free_text_value
= text
.value
!= SDATA (name
);
1623 if (NILP (f
->icon_name
))
1629 /* See the above comment "Note: Encoding strategy". */
1630 icon
.value
= x_encode_text (f
->icon_name
, coding_system
, 0,
1632 icon
.encoding
= (stringp
? XA_STRING
1633 : FRAME_X_DISPLAY_INFO (f
)->Xatom_COMPOUND_TEXT
);
1635 icon
.nitems
= bytes
;
1636 do_free_icon_value
= icon
.value
!= SDATA (f
->icon_name
);
1640 gtk_window_set_title (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f
)),
1641 SDATA (ENCODE_UTF_8 (name
)));
1642 #else /* not USE_GTK */
1643 XSetWMName (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
), &text
);
1644 #endif /* not USE_GTK */
1646 XSetWMIconName (FRAME_X_DISPLAY (f
), FRAME_OUTER_WINDOW (f
), &icon
);
1648 if (do_free_icon_value
)
1650 if (do_free_text_value
)
1653 #else /* not HAVE_X11R4 */
1654 XSetIconName (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1656 XStoreName (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
1658 #endif /* not HAVE_X11R4 */
1663 /* Change the name of frame F to NAME. If NAME is nil, set F's name to
1666 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1667 name; if NAME is a string, set F's name to NAME and set
1668 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1670 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1671 suggesting a new name, which lisp code should override; if
1672 F->explicit_name is set, ignore the new name; otherwise, set it. */
1675 x_set_name (f
, name
, explicit)
1680 /* Make sure that requests from lisp code override requests from
1681 Emacs redisplay code. */
1684 /* If we're switching from explicit to implicit, we had better
1685 update the mode lines and thereby update the title. */
1686 if (f
->explicit_name
&& NILP (name
))
1687 update_mode_lines
= 1;
1689 f
->explicit_name
= ! NILP (name
);
1691 else if (f
->explicit_name
)
1694 /* If NAME is nil, set the name to the x_id_name. */
1697 /* Check for no change needed in this very common case
1698 before we do any consing. */
1699 if (!strcmp (FRAME_X_DISPLAY_INFO (f
)->x_id_name
,
1702 name
= build_string (FRAME_X_DISPLAY_INFO (f
)->x_id_name
);
1705 CHECK_STRING (name
);
1707 /* Don't change the name if it's already NAME. */
1708 if (! NILP (Fstring_equal (name
, f
->name
)))
1713 /* For setting the frame title, the title parameter should override
1714 the name parameter. */
1715 if (! NILP (f
->title
))
1718 x_set_name_internal (f
, name
);
1721 /* This function should be called when the user's lisp code has
1722 specified a name for the frame; the name will override any set by the
1725 x_explicitly_set_name (f
, arg
, oldval
)
1727 Lisp_Object arg
, oldval
;
1729 x_set_name (f
, arg
, 1);
1732 /* This function should be called by Emacs redisplay code to set the
1733 name; names set this way will never override names set by the user's
1736 x_implicitly_set_name (f
, arg
, oldval
)
1738 Lisp_Object arg
, oldval
;
1740 x_set_name (f
, arg
, 0);
1743 /* Change the title of frame F to NAME.
1744 If NAME is nil, use the frame name as the title.
1746 If EXPLICIT is non-zero, that indicates that lisp code is setting the
1747 name; if NAME is a string, set F's name to NAME and set
1748 F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
1750 If EXPLICIT is zero, that indicates that Emacs redisplay code is
1751 suggesting a new name, which lisp code should override; if
1752 F->explicit_name is set, ignore the new name; otherwise, set it. */
1755 x_set_title (f
, name
, old_name
)
1757 Lisp_Object name
, old_name
;
1759 /* Don't change the title if it's already NAME. */
1760 if (EQ (name
, f
->title
))
1763 update_mode_lines
= 1;
1770 CHECK_STRING (name
);
1772 x_set_name_internal (f
, name
);
1776 x_set_scroll_bar_default_width (f
)
1779 int wid
= FRAME_COLUMN_WIDTH (f
);
1781 #ifdef USE_TOOLKIT_SCROLL_BARS
1782 /* A minimum width of 14 doesn't look good for toolkit scroll bars. */
1783 int width
= 16 + 2 * VERTICAL_SCROLL_BAR_WIDTH_TRIM
;
1784 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (width
+ wid
- 1) / wid
;
1785 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = width
;
1787 /* Make the actual width at least 14 pixels and a multiple of a
1789 FRAME_CONFIG_SCROLL_BAR_COLS (f
) = (14 + wid
- 1) / wid
;
1791 /* Use all of that space (aside from required margins) for the
1793 FRAME_CONFIG_SCROLL_BAR_WIDTH (f
) = 0;
1798 /* Record in frame F the specified or default value according to ALIST
1799 of the parameter named PROP (a Lisp symbol). If no value is
1800 specified for PROP, look for an X default for XPROP on the frame
1801 named NAME. If that is not found either, use the value DEFLT. */
1804 x_default_scroll_bar_color_parameter (f
, alist
, prop
, xprop
, xclass
,
1813 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
1816 tem
= x_get_arg (dpyinfo
, alist
, prop
, xprop
, xclass
, RES_TYPE_STRING
);
1817 if (EQ (tem
, Qunbound
))
1819 #ifdef USE_TOOLKIT_SCROLL_BARS
1821 /* See if an X resource for the scroll bar color has been
1823 tem
= display_x_get_resource (dpyinfo
,
1824 build_string (foreground_p
1828 build_string ("verticalScrollBar"),
1832 /* If nothing has been specified, scroll bars will use a
1833 toolkit-dependent default. Because these defaults are
1834 difficult to get at without actually creating a scroll
1835 bar, use nil to indicate that no color has been
1840 #else /* not USE_TOOLKIT_SCROLL_BARS */
1844 #endif /* not USE_TOOLKIT_SCROLL_BARS */
1847 x_set_frame_parameters (f
, Fcons (Fcons (prop
, tem
), Qnil
));
1853 #if !defined (HAVE_X11R4) && !defined (HAVE_XSETWMPROTOCOLS)
1856 XSetWMProtocols (dpy
, w
, protocols
, count
)
1863 prop
= XInternAtom (dpy
, "WM_PROTOCOLS", False
);
1864 if (prop
== None
) return False
;
1865 XChangeProperty (dpy
, w
, prop
, XA_ATOM
, 32, PropModeReplace
,
1866 (unsigned char *) protocols
, count
);
1869 #endif /* not HAVE_X11R4 && not HAVE_XSETWMPROTOCOLS */
1871 #ifdef USE_X_TOOLKIT
1873 /* If the WM_PROTOCOLS property does not already contain WM_TAKE_FOCUS,
1874 WM_DELETE_WINDOW, and WM_SAVE_YOURSELF, then add them. (They may
1875 already be present because of the toolkit (Motif adds some of them,
1876 for example, but Xt doesn't). */
1879 hack_wm_protocols (f
, widget
)
1883 Display
*dpy
= XtDisplay (widget
);
1884 Window w
= XtWindow (widget
);
1885 int need_delete
= 1;
1892 unsigned char *catoms
;
1894 unsigned long nitems
= 0;
1895 unsigned long bytes_after
;
1897 if ((XGetWindowProperty (dpy
, w
,
1898 FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
1899 (long)0, (long)100, False
, XA_ATOM
,
1900 &type
, &format
, &nitems
, &bytes_after
,
1903 && format
== 32 && type
== XA_ATOM
)
1905 Atom
*atoms
= (Atom
*) catoms
;
1910 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
)
1912 else if (atoms
[nitems
]
1913 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_take_focus
)
1915 else if (atoms
[nitems
]
1916 == FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
)
1927 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
;
1929 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_take_focus
;
1931 props
[count
++] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
;
1933 XChangeProperty (dpy
, w
, FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
1934 XA_ATOM
, 32, PropModeAppend
,
1935 (unsigned char *) props
, count
);
1943 /* Support routines for XIC (X Input Context). */
1947 static XFontSet xic_create_xfontset
P_ ((struct frame
*, char *));
1948 static XIMStyle best_xim_style
P_ ((XIMStyles
*, XIMStyles
*));
1951 /* Supported XIM styles, ordered by preference. */
1953 static XIMStyle supported_xim_styles
[] =
1955 XIMPreeditPosition
| XIMStatusArea
,
1956 XIMPreeditPosition
| XIMStatusNothing
,
1957 XIMPreeditPosition
| XIMStatusNone
,
1958 XIMPreeditNothing
| XIMStatusArea
,
1959 XIMPreeditNothing
| XIMStatusNothing
,
1960 XIMPreeditNothing
| XIMStatusNone
,
1961 XIMPreeditNone
| XIMStatusArea
,
1962 XIMPreeditNone
| XIMStatusNothing
,
1963 XIMPreeditNone
| XIMStatusNone
,
1968 /* Create an X fontset on frame F with base font name BASE_FONTNAME. */
1970 char xic_defaut_fontset
[] = "-*-*-*-r-normal--14-*-*-*-*-*-*-*";
1972 /* Create an Xt fontset spec from the name of a base font.
1973 If `motif' is True use the Motif syntax. */
1975 xic_create_fontsetname (base_fontname
, motif
)
1976 char *base_fontname
;
1979 const char *sep
= motif
? ";" : ",";
1982 /* Make a fontset name from the base font name. */
1983 if (xic_defaut_fontset
== base_fontname
)
1984 { /* There is no base font name, use the default. */
1985 int len
= strlen (base_fontname
) + 2;
1986 fontsetname
= xmalloc (len
);
1987 bzero (fontsetname
, len
);
1988 strcpy (fontsetname
, base_fontname
);
1992 /* Make a fontset name from the base font name.
1993 The font set will be made of the following elements:
1995 - the base font where the charset spec is replaced by -*-*.
1996 - the same but with the family also replaced with -*-*-. */
1997 char *p
= base_fontname
;
2000 for (i
= 0; *p
; p
++)
2003 { /* As the font name doesn't conform to XLFD, we can't
2004 modify it to generalize it to allcs and allfamilies.
2005 Use the specified font plus the default. */
2006 int len
= strlen (base_fontname
) + strlen (xic_defaut_fontset
) + 3;
2007 fontsetname
= xmalloc (len
);
2008 bzero (fontsetname
, len
);
2009 strcpy (fontsetname
, base_fontname
);
2010 strcat (fontsetname
, sep
);
2011 strcat (fontsetname
, xic_defaut_fontset
);
2016 char *p1
= NULL
, *p2
= NULL
;
2017 char *font_allcs
= NULL
;
2018 char *font_allfamilies
= NULL
;
2019 char *font_all
= NULL
;
2020 char *allcs
= "*-*-*-*-*-*-*";
2021 char *allfamilies
= "-*-*-";
2022 char *all
= "*-*-*-*-";
2024 for (i
= 0, p
= base_fontname
; i
< 8; p
++)
2035 /* Build the font spec that matches all charsets. */
2036 len
= p
- base_fontname
+ strlen (allcs
) + 1;
2037 font_allcs
= (char *) alloca (len
);
2038 bzero (font_allcs
, len
);
2039 bcopy (base_fontname
, font_allcs
, p
- base_fontname
);
2040 strcat (font_allcs
, allcs
);
2042 /* Build the font spec that matches all families. */
2043 len
= p
- p1
+ strlen (allcs
) + strlen (allfamilies
) + 1;
2044 font_allfamilies
= (char *) alloca (len
);
2045 bzero (font_allfamilies
, len
);
2046 strcpy (font_allfamilies
, allfamilies
);
2047 bcopy (p1
, font_allfamilies
+ strlen (allfamilies
), p
- p1
);
2048 strcat (font_allfamilies
, allcs
);
2050 /* Build the font spec that matches all. */
2051 len
= p
- p2
+ strlen (allcs
) + strlen (all
) + strlen (allfamilies
) + 1;
2052 font_all
= (char *) alloca (len
);
2053 bzero (font_all
, len
);
2054 strcpy (font_all
, allfamilies
);
2055 strcat (font_all
, all
);
2056 bcopy (p2
, font_all
+ strlen (all
) + strlen (allfamilies
), p
- p2
);
2057 strcat (font_all
, allcs
);
2059 /* Build the actual font set name. */
2060 len
= strlen (base_fontname
) + strlen (font_allcs
)
2061 + strlen (font_allfamilies
) + strlen (font_all
) + 5;
2062 fontsetname
= xmalloc (len
);
2063 bzero (fontsetname
, len
);
2064 strcpy (fontsetname
, base_fontname
);
2065 strcat (fontsetname
, sep
);
2066 strcat (fontsetname
, font_allcs
);
2067 strcat (fontsetname
, sep
);
2068 strcat (fontsetname
, font_allfamilies
);
2069 strcat (fontsetname
, sep
);
2070 strcat (fontsetname
, font_all
);
2074 strcat (fontsetname
, ":");
2079 xic_create_xfontset (f
, base_fontname
)
2081 char *base_fontname
;
2083 XFontSet xfs
= NULL
;
2084 char **missing_list
= NULL
;
2087 Lisp_Object rest
, frame
;
2090 base_fontname
= xic_defaut_fontset
;
2092 /* See if there is another frame already using same fontset. */
2093 FOR_EACH_FRAME (rest
, frame
)
2095 struct frame
*cf
= XFRAME (frame
);
2096 if (cf
!= f
&& FRAME_LIVE_P (f
) && FRAME_X_P (cf
)
2097 && FRAME_X_DISPLAY_INFO (cf
) == FRAME_X_DISPLAY_INFO (f
)
2098 && FRAME_XIC_BASE_FONTNAME (cf
)
2099 && !strcmp (FRAME_XIC_BASE_FONTNAME (cf
), base_fontname
))
2101 xfs
= FRAME_XIC_FONTSET (cf
);
2108 char *fontsetname
= xic_create_fontsetname (base_fontname
, False
);
2111 xfs
= XCreateFontSet (FRAME_X_DISPLAY (f
),
2112 fontsetname
, &missing_list
,
2113 &missing_count
, &def_string
);
2115 XFreeStringList (missing_list
);
2116 xfree (fontsetname
);
2119 if (FRAME_XIC_BASE_FONTNAME (f
))
2120 xfree (FRAME_XIC_BASE_FONTNAME (f
));
2121 FRAME_XIC_BASE_FONTNAME (f
) = xstrdup (base_fontname
);
2123 /* No need to free def_string. */
2127 /* Free the X fontset of frame F if it is the last frame using it. */
2130 xic_free_xfontset (f
)
2133 Lisp_Object rest
, frame
;
2136 if (!FRAME_XIC_FONTSET (f
))
2139 /* See if there is another frame sharing the same fontset. */
2140 FOR_EACH_FRAME (rest
, frame
)
2142 struct frame
*cf
= XFRAME (frame
);
2143 if (cf
!= f
&& FRAME_LIVE_P (f
) && FRAME_X_P (cf
)
2144 && FRAME_X_DISPLAY_INFO (cf
) == FRAME_X_DISPLAY_INFO (f
)
2145 && FRAME_XIC_FONTSET (cf
) == FRAME_XIC_FONTSET (f
))
2153 /* The fontset is not used anymore. It is safe to free it. */
2154 XFreeFontSet (FRAME_X_DISPLAY (f
), FRAME_XIC_FONTSET (f
));
2156 if (FRAME_XIC_BASE_FONTNAME (f
))
2157 xfree (FRAME_XIC_BASE_FONTNAME (f
));
2158 FRAME_XIC_BASE_FONTNAME (f
) = NULL
;
2159 FRAME_XIC_FONTSET (f
) = NULL
;
2163 /* Value is the best input style, given user preferences USER (already
2164 checked to be supported by Emacs), and styles supported by the
2165 input method XIM. */
2168 best_xim_style (user
, xim
)
2174 for (i
= 0; i
< user
->count_styles
; ++i
)
2175 for (j
= 0; j
< xim
->count_styles
; ++j
)
2176 if (user
->supported_styles
[i
] == xim
->supported_styles
[j
])
2177 return user
->supported_styles
[i
];
2179 /* Return the default style. */
2180 return XIMPreeditNothing
| XIMStatusNothing
;
2183 /* Create XIC for frame F. */
2185 static XIMStyle xic_style
;
2188 create_frame_xic (f
)
2193 XFontSet xfs
= NULL
;
2198 /* Create X fontset. */
2199 xfs
= xic_create_xfontset
2200 (f
, (FRAME_FONTSET (f
) < 0) ? NULL
2201 : (char *) SDATA (fontset_ascii (FRAME_FONTSET (f
))));
2203 xim
= FRAME_X_XIM (f
);
2208 XVaNestedList preedit_attr
;
2209 XVaNestedList status_attr
;
2211 s_area
.x
= 0; s_area
.y
= 0; s_area
.width
= 1; s_area
.height
= 1;
2212 spot
.x
= 0; spot
.y
= 1;
2214 /* Determine XIC style. */
2217 XIMStyles supported_list
;
2218 supported_list
.count_styles
= (sizeof supported_xim_styles
2219 / sizeof supported_xim_styles
[0]);
2220 supported_list
.supported_styles
= supported_xim_styles
;
2221 xic_style
= best_xim_style (&supported_list
,
2222 FRAME_X_XIM_STYLES (f
));
2225 preedit_attr
= XVaCreateNestedList (0,
2228 FRAME_FOREGROUND_PIXEL (f
),
2230 FRAME_BACKGROUND_PIXEL (f
),
2231 (xic_style
& XIMPreeditPosition
2236 status_attr
= XVaCreateNestedList (0,
2242 FRAME_FOREGROUND_PIXEL (f
),
2244 FRAME_BACKGROUND_PIXEL (f
),
2247 xic
= XCreateIC (xim
,
2248 XNInputStyle
, xic_style
,
2249 XNClientWindow
, FRAME_X_WINDOW (f
),
2250 XNFocusWindow
, FRAME_X_WINDOW (f
),
2251 XNStatusAttributes
, status_attr
,
2252 XNPreeditAttributes
, preedit_attr
,
2254 XFree (preedit_attr
);
2255 XFree (status_attr
);
2258 FRAME_XIC (f
) = xic
;
2259 FRAME_XIC_STYLE (f
) = xic_style
;
2260 FRAME_XIC_FONTSET (f
) = xfs
;
2264 /* Destroy XIC and free XIC fontset of frame F, if any. */
2270 if (FRAME_XIC (f
) == NULL
)
2273 XDestroyIC (FRAME_XIC (f
));
2274 xic_free_xfontset (f
);
2276 FRAME_XIC (f
) = NULL
;
2280 /* Place preedit area for XIC of window W's frame to specified
2281 pixel position X/Y. X and Y are relative to window W. */
2284 xic_set_preeditarea (w
, x
, y
)
2288 struct frame
*f
= XFRAME (w
->frame
);
2292 spot
.x
= WINDOW_TO_FRAME_PIXEL_X (w
, x
) + WINDOW_LEFT_FRINGE_WIDTH (w
);
2293 spot
.y
= WINDOW_TO_FRAME_PIXEL_Y (w
, y
) + FONT_BASE (FRAME_FONT (f
));
2294 attr
= XVaCreateNestedList (0, XNSpotLocation
, &spot
, NULL
);
2295 XSetICValues (FRAME_XIC (f
), XNPreeditAttributes
, attr
, NULL
);
2300 /* Place status area for XIC in bottom right corner of frame F.. */
2303 xic_set_statusarea (f
)
2306 XIC xic
= FRAME_XIC (f
);
2311 /* Negotiate geometry of status area. If input method has existing
2312 status area, use its current size. */
2313 area
.x
= area
.y
= area
.width
= area
.height
= 0;
2314 attr
= XVaCreateNestedList (0, XNAreaNeeded
, &area
, NULL
);
2315 XSetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2318 attr
= XVaCreateNestedList (0, XNAreaNeeded
, &needed
, NULL
);
2319 XGetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2322 if (needed
->width
== 0) /* Use XNArea instead of XNAreaNeeded */
2324 attr
= XVaCreateNestedList (0, XNArea
, &needed
, NULL
);
2325 XGetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2329 area
.width
= needed
->width
;
2330 area
.height
= needed
->height
;
2331 area
.x
= FRAME_PIXEL_WIDTH (f
) - area
.width
- FRAME_INTERNAL_BORDER_WIDTH (f
);
2332 area
.y
= (FRAME_PIXEL_HEIGHT (f
) - area
.height
2333 - FRAME_MENUBAR_HEIGHT (f
)
2334 - FRAME_TOOLBAR_HEIGHT (f
)
2335 - FRAME_INTERNAL_BORDER_WIDTH (f
));
2338 attr
= XVaCreateNestedList (0, XNArea
, &area
, NULL
);
2339 XSetICValues (xic
, XNStatusAttributes
, attr
, NULL
);
2344 /* Set X fontset for XIC of frame F, using base font name
2345 BASE_FONTNAME. Called when a new Emacs fontset is chosen. */
2348 xic_set_xfontset (f
, base_fontname
)
2350 char *base_fontname
;
2355 xic_free_xfontset (f
);
2357 xfs
= xic_create_xfontset (f
, base_fontname
);
2359 attr
= XVaCreateNestedList (0, XNFontSet
, xfs
, NULL
);
2360 if (FRAME_XIC_STYLE (f
) & XIMPreeditPosition
)
2361 XSetICValues (FRAME_XIC (f
), XNPreeditAttributes
, attr
, NULL
);
2362 if (FRAME_XIC_STYLE (f
) & XIMStatusArea
)
2363 XSetICValues (FRAME_XIC (f
), XNStatusAttributes
, attr
, NULL
);
2366 FRAME_XIC_FONTSET (f
) = xfs
;
2369 #endif /* HAVE_X_I18N */
2373 #ifdef USE_X_TOOLKIT
2375 /* Create and set up the X widget for frame F. */
2378 x_window (f
, window_prompting
, minibuffer_only
)
2380 long window_prompting
;
2381 int minibuffer_only
;
2383 XClassHint class_hints
;
2384 XSetWindowAttributes attributes
;
2385 unsigned long attribute_mask
;
2386 Widget shell_widget
;
2388 Widget frame_widget
;
2394 /* Use the resource name as the top-level widget name
2395 for looking up resources. Make a non-Lisp copy
2396 for the window manager, so GC relocation won't bother it.
2398 Elsewhere we specify the window name for the window manager. */
2401 char *str
= (char *) SDATA (Vx_resource_name
);
2402 f
->namebuf
= (char *) xmalloc (strlen (str
) + 1);
2403 strcpy (f
->namebuf
, str
);
2407 XtSetArg (al
[ac
], XtNallowShellResize
, 1); ac
++;
2408 XtSetArg (al
[ac
], XtNinput
, 1); ac
++;
2409 XtSetArg (al
[ac
], XtNmappedWhenManaged
, 0); ac
++;
2410 XtSetArg (al
[ac
], XtNborderWidth
, f
->border_width
); ac
++;
2411 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2412 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2413 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2414 shell_widget
= XtAppCreateShell (f
->namebuf
, EMACS_CLASS
,
2415 applicationShellWidgetClass
,
2416 FRAME_X_DISPLAY (f
), al
, ac
);
2418 f
->output_data
.x
->widget
= shell_widget
;
2419 /* maybe_set_screen_title_format (shell_widget); */
2421 pane_widget
= lw_create_widget ("main", "pane", widget_id_tick
++,
2422 (widget_value
*) NULL
,
2423 shell_widget
, False
,
2427 (lw_callback
) NULL
);
2430 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2431 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2432 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2433 XtSetValues (pane_widget
, al
, ac
);
2434 f
->output_data
.x
->column_widget
= pane_widget
;
2436 /* mappedWhenManaged to false tells to the paned window to not map/unmap
2437 the emacs screen when changing menubar. This reduces flickering. */
2440 XtSetArg (al
[ac
], XtNmappedWhenManaged
, 0); ac
++;
2441 XtSetArg (al
[ac
], XtNshowGrip
, 0); ac
++;
2442 XtSetArg (al
[ac
], XtNallowResize
, 1); ac
++;
2443 XtSetArg (al
[ac
], XtNresizeToPreferred
, 1); ac
++;
2444 XtSetArg (al
[ac
], XtNemacsFrame
, f
); ac
++;
2445 XtSetArg (al
[ac
], XtNvisual
, FRAME_X_VISUAL (f
)); ac
++;
2446 XtSetArg (al
[ac
], XtNdepth
, FRAME_X_DISPLAY_INFO (f
)->n_planes
); ac
++;
2447 XtSetArg (al
[ac
], XtNcolormap
, FRAME_X_COLORMAP (f
)); ac
++;
2448 frame_widget
= XtCreateWidget (f
->namebuf
, emacsFrameClass
, pane_widget
,
2451 f
->output_data
.x
->edit_widget
= frame_widget
;
2453 XtManageChild (frame_widget
);
2455 /* Do some needed geometry management. */
2458 char *tem
, shell_position
[32];
2461 int extra_borders
= 0;
2463 = (f
->output_data
.x
->menubar_widget
2464 ? (f
->output_data
.x
->menubar_widget
->core
.height
2465 + f
->output_data
.x
->menubar_widget
->core
.border_width
)
2468 #if 0 /* Experimentally, we now get the right results
2469 for -geometry -0-0 without this. 24 Aug 96, rms. */
2470 if (FRAME_EXTERNAL_MENU_BAR (f
))
2473 XtVaGetValues (pane_widget
, XtNinternalBorderWidth
, &ibw
, NULL
);
2474 menubar_size
+= ibw
;
2478 f
->output_data
.x
->menubar_height
= menubar_size
;
2481 /* Motif seems to need this amount added to the sizes
2482 specified for the shell widget. The Athena/Lucid widgets don't.
2483 Both conclusions reached experimentally. -- rms. */
2484 XtVaGetValues (f
->output_data
.x
->edit_widget
, XtNinternalBorderWidth
,
2485 &extra_borders
, NULL
);
2489 /* Convert our geometry parameters into a geometry string
2491 Note that we do not specify here whether the position
2492 is a user-specified or program-specified one.
2493 We pass that information later, in x_wm_set_size_hints. */
2495 int left
= f
->left_pos
;
2496 int xneg
= window_prompting
& XNegative
;
2497 int top
= f
->top_pos
;
2498 int yneg
= window_prompting
& YNegative
;
2504 if (window_prompting
& USPosition
)
2505 sprintf (shell_position
, "=%dx%d%c%d%c%d",
2506 FRAME_PIXEL_WIDTH (f
) + extra_borders
,
2507 FRAME_PIXEL_HEIGHT (f
) + menubar_size
+ extra_borders
,
2508 (xneg
? '-' : '+'), left
,
2509 (yneg
? '-' : '+'), top
);
2512 sprintf (shell_position
, "=%dx%d",
2513 FRAME_PIXEL_WIDTH (f
) + extra_borders
,
2514 FRAME_PIXEL_HEIGHT (f
) + menubar_size
+ extra_borders
);
2516 /* Setting x and y when the position is not specified in
2517 the geometry string will set program position in the WM hints.
2518 If Emacs had just one program position, we could set it in
2519 fallback resources, but since each make-frame call can specify
2520 different program positions, this is easier. */
2521 XtSetArg (al
[ac
], XtNx
, left
); ac
++;
2522 XtSetArg (al
[ac
], XtNy
, top
); ac
++;
2526 len
= strlen (shell_position
) + 1;
2527 /* We don't free this because we don't know whether
2528 it is safe to free it while the frame exists.
2529 It isn't worth the trouble of arranging to free it
2530 when the frame is deleted. */
2531 tem
= (char *) xmalloc (len
);
2532 strncpy (tem
, shell_position
, len
);
2533 XtSetArg (al
[ac
], XtNgeometry
, tem
); ac
++;
2534 XtSetValues (shell_widget
, al
, ac
);
2537 XtManageChild (pane_widget
);
2538 XtRealizeWidget (shell_widget
);
2540 FRAME_X_WINDOW (f
) = XtWindow (frame_widget
);
2542 validate_x_resource_name ();
2544 class_hints
.res_name
= (char *) SDATA (Vx_resource_name
);
2545 class_hints
.res_class
= (char *) SDATA (Vx_resource_class
);
2546 XSetClassHint (FRAME_X_DISPLAY (f
), XtWindow (shell_widget
), &class_hints
);
2549 FRAME_XIC (f
) = NULL
;
2551 create_frame_xic (f
);
2554 f
->output_data
.x
->wm_hints
.input
= True
;
2555 f
->output_data
.x
->wm_hints
.flags
|= InputHint
;
2556 XSetWMHints (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2557 &f
->output_data
.x
->wm_hints
);
2559 hack_wm_protocols (f
, shell_widget
);
2562 XtAddEventHandler (shell_widget
, 0, True
, _XEditResCheckMessages
, 0);
2565 /* Do a stupid property change to force the server to generate a
2566 PropertyNotify event so that the event_stream server timestamp will
2567 be initialized to something relevant to the time we created the window.
2569 XChangeProperty (XtDisplay (frame_widget
), XtWindow (frame_widget
),
2570 FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_protocols
,
2571 XA_ATOM
, 32, PropModeAppend
,
2572 (unsigned char*) NULL
, 0);
2574 /* Make all the standard events reach the Emacs frame. */
2575 attributes
.event_mask
= STANDARD_EVENT_SET
;
2580 /* XIM server might require some X events. */
2581 unsigned long fevent
= NoEventMask
;
2582 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2583 attributes
.event_mask
|= fevent
;
2585 #endif /* HAVE_X_I18N */
2587 attribute_mask
= CWEventMask
;
2588 XChangeWindowAttributes (XtDisplay (shell_widget
), XtWindow (shell_widget
),
2589 attribute_mask
, &attributes
);
2591 XtMapWidget (frame_widget
);
2593 /* x_set_name normally ignores requests to set the name if the
2594 requested name is the same as the current name. This is the one
2595 place where that assumption isn't correct; f->name is set, but
2596 the X server hasn't been told. */
2599 int explicit = f
->explicit_name
;
2601 f
->explicit_name
= 0;
2604 x_set_name (f
, name
, explicit);
2607 XDefineCursor (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2608 f
->output_data
.x
->text_cursor
);
2612 /* This is a no-op, except under Motif. Make sure main areas are
2613 set to something reasonable, in case we get an error later. */
2614 lw_set_main_areas (pane_widget
, 0, frame_widget
);
2617 #else /* not USE_X_TOOLKIT */
2623 if (! xg_create_frame_widgets (f
))
2624 error ("Unable to create window");
2627 FRAME_XIC (f
) = NULL
;
2631 create_frame_xic (f
);
2634 /* XIM server might require some X events. */
2635 unsigned long fevent
= NoEventMask
;
2636 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2638 if (fevent
!= NoEventMask
)
2640 XSetWindowAttributes attributes
;
2641 XWindowAttributes wattr
;
2642 unsigned long attribute_mask
;
2644 XGetWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2646 attributes
.event_mask
= wattr
.your_event_mask
| fevent
;
2647 attribute_mask
= CWEventMask
;
2648 XChangeWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2649 attribute_mask
, &attributes
);
2657 #else /*! USE_GTK */
2658 /* Create and set up the X window for frame F. */
2665 XClassHint class_hints
;
2666 XSetWindowAttributes attributes
;
2667 unsigned long attribute_mask
;
2669 attributes
.background_pixel
= f
->output_data
.x
->background_pixel
;
2670 attributes
.border_pixel
= f
->output_data
.x
->border_pixel
;
2671 attributes
.bit_gravity
= StaticGravity
;
2672 attributes
.backing_store
= NotUseful
;
2673 attributes
.save_under
= True
;
2674 attributes
.event_mask
= STANDARD_EVENT_SET
;
2675 attributes
.colormap
= FRAME_X_COLORMAP (f
);
2676 attribute_mask
= (CWBackPixel
| CWBorderPixel
| CWBitGravity
| CWEventMask
2681 = XCreateWindow (FRAME_X_DISPLAY (f
),
2682 f
->output_data
.x
->parent_desc
,
2685 FRAME_PIXEL_WIDTH (f
), FRAME_PIXEL_HEIGHT (f
),
2687 CopyFromParent
, /* depth */
2688 InputOutput
, /* class */
2690 attribute_mask
, &attributes
);
2695 create_frame_xic (f
);
2698 /* XIM server might require some X events. */
2699 unsigned long fevent
= NoEventMask
;
2700 XGetICValues (FRAME_XIC (f
), XNFilterEvents
, &fevent
, NULL
);
2701 attributes
.event_mask
|= fevent
;
2702 attribute_mask
= CWEventMask
;
2703 XChangeWindowAttributes (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2704 attribute_mask
, &attributes
);
2707 #endif /* HAVE_X_I18N */
2709 validate_x_resource_name ();
2711 class_hints
.res_name
= (char *) SDATA (Vx_resource_name
);
2712 class_hints
.res_class
= (char *) SDATA (Vx_resource_class
);
2713 XSetClassHint (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), &class_hints
);
2715 /* The menubar is part of the ordinary display;
2716 it does not count in addition to the height of the window. */
2717 f
->output_data
.x
->menubar_height
= 0;
2719 /* This indicates that we use the "Passive Input" input model.
2720 Unless we do this, we don't get the Focus{In,Out} events that we
2721 need to draw the cursor correctly. Accursed bureaucrats.
2722 XWhipsAndChains (FRAME_X_DISPLAY (f), IronMaiden, &TheRack); */
2724 f
->output_data
.x
->wm_hints
.input
= True
;
2725 f
->output_data
.x
->wm_hints
.flags
|= InputHint
;
2726 XSetWMHints (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2727 &f
->output_data
.x
->wm_hints
);
2728 f
->output_data
.x
->wm_hints
.icon_pixmap
= None
;
2730 /* Request "save yourself" and "delete window" commands from wm. */
2733 protocols
[0] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_delete_window
;
2734 protocols
[1] = FRAME_X_DISPLAY_INFO (f
)->Xatom_wm_save_yourself
;
2735 XSetWMProtocols (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), protocols
, 2);
2738 /* x_set_name normally ignores requests to set the name if the
2739 requested name is the same as the current name. This is the one
2740 place where that assumption isn't correct; f->name is set, but
2741 the X server hasn't been told. */
2744 int explicit = f
->explicit_name
;
2746 f
->explicit_name
= 0;
2749 x_set_name (f
, name
, explicit);
2752 XDefineCursor (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2753 f
->output_data
.x
->text_cursor
);
2757 if (FRAME_X_WINDOW (f
) == 0)
2758 error ("Unable to create window");
2761 #endif /* not USE_GTK */
2762 #endif /* not USE_X_TOOLKIT */
2764 /* Verify that the icon position args for this window are valid. */
2767 x_icon_verify (f
, parms
)
2771 Lisp_Object icon_x
, icon_y
;
2773 /* Set the position of the icon. Note that twm groups all
2774 icons in an icon window. */
2775 icon_x
= x_frame_get_and_record_arg (f
, parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2776 icon_y
= x_frame_get_and_record_arg (f
, parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2777 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2779 CHECK_NUMBER (icon_x
);
2780 CHECK_NUMBER (icon_y
);
2782 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2783 error ("Both left and top icon corners of icon must be specified");
2786 /* Handle the icon stuff for this window. Perhaps later we might
2787 want an x_set_icon_position which can be called interactively as
2795 Lisp_Object icon_x
, icon_y
;
2796 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2798 /* Set the position of the icon. Note that twm groups all
2799 icons in an icon window. */
2800 icon_x
= x_frame_get_and_record_arg (f
, parms
, Qicon_left
, 0, 0, RES_TYPE_NUMBER
);
2801 icon_y
= x_frame_get_and_record_arg (f
, parms
, Qicon_top
, 0, 0, RES_TYPE_NUMBER
);
2802 if (!EQ (icon_x
, Qunbound
) && !EQ (icon_y
, Qunbound
))
2804 CHECK_NUMBER (icon_x
);
2805 CHECK_NUMBER (icon_y
);
2807 else if (!EQ (icon_x
, Qunbound
) || !EQ (icon_y
, Qunbound
))
2808 error ("Both left and top icon corners of icon must be specified");
2812 if (! EQ (icon_x
, Qunbound
))
2813 x_wm_set_icon_position (f
, XINT (icon_x
), XINT (icon_y
));
2815 /* Start up iconic or window? */
2816 x_wm_set_window_state
2817 (f
, (EQ (x_get_arg (dpyinfo
, parms
, Qvisibility
, 0, 0, RES_TYPE_SYMBOL
),
2822 x_text_icon (f
, (char *) SDATA ((!NILP (f
->icon_name
)
2829 /* Make the GCs needed for this window, setting the
2830 background, border and mouse colors; also create the
2831 mouse cursor and the gray border tile. */
2833 static char cursor_bits
[] =
2835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2836 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
2845 XGCValues gc_values
;
2849 /* Create the GCs of this frame.
2850 Note that many default values are used. */
2853 gc_values
.font
= FRAME_FONT (f
)->fid
;
2854 gc_values
.foreground
= f
->output_data
.x
->foreground_pixel
;
2855 gc_values
.background
= f
->output_data
.x
->background_pixel
;
2856 gc_values
.line_width
= 0; /* Means 1 using fast algorithm. */
2857 f
->output_data
.x
->normal_gc
2858 = XCreateGC (FRAME_X_DISPLAY (f
),
2860 GCLineWidth
| GCFont
| GCForeground
| GCBackground
,
2863 /* Reverse video style. */
2864 gc_values
.foreground
= f
->output_data
.x
->background_pixel
;
2865 gc_values
.background
= f
->output_data
.x
->foreground_pixel
;
2866 f
->output_data
.x
->reverse_gc
2867 = XCreateGC (FRAME_X_DISPLAY (f
),
2869 GCFont
| GCForeground
| GCBackground
| GCLineWidth
,
2872 /* Cursor has cursor-color background, background-color foreground. */
2873 gc_values
.foreground
= f
->output_data
.x
->background_pixel
;
2874 gc_values
.background
= f
->output_data
.x
->cursor_pixel
;
2875 gc_values
.fill_style
= FillOpaqueStippled
;
2877 = XCreateBitmapFromData (FRAME_X_DISPLAY (f
),
2878 FRAME_X_DISPLAY_INFO (f
)->root_window
,
2879 cursor_bits
, 16, 16);
2880 f
->output_data
.x
->cursor_gc
2881 = XCreateGC (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
2882 (GCFont
| GCForeground
| GCBackground
2883 | GCFillStyle
/* | GCStipple */ | GCLineWidth
),
2887 f
->output_data
.x
->white_relief
.gc
= 0;
2888 f
->output_data
.x
->black_relief
.gc
= 0;
2890 /* Create the gray border tile used when the pointer is not in
2891 the frame. Since this depends on the frame's pixel values,
2892 this must be done on a per-frame basis. */
2893 f
->output_data
.x
->border_tile
2894 = (XCreatePixmapFromBitmapData
2895 (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
2896 gray_bits
, gray_width
, gray_height
,
2897 f
->output_data
.x
->foreground_pixel
,
2898 f
->output_data
.x
->background_pixel
,
2899 DefaultDepth (FRAME_X_DISPLAY (f
), FRAME_X_SCREEN_NUMBER (f
))));
2905 /* Free what was was allocated in x_make_gc. */
2911 Display
*dpy
= FRAME_X_DISPLAY (f
);
2915 if (f
->output_data
.x
->normal_gc
)
2917 XFreeGC (dpy
, f
->output_data
.x
->normal_gc
);
2918 f
->output_data
.x
->normal_gc
= 0;
2921 if (f
->output_data
.x
->reverse_gc
)
2923 XFreeGC (dpy
, f
->output_data
.x
->reverse_gc
);
2924 f
->output_data
.x
->reverse_gc
= 0;
2927 if (f
->output_data
.x
->cursor_gc
)
2929 XFreeGC (dpy
, f
->output_data
.x
->cursor_gc
);
2930 f
->output_data
.x
->cursor_gc
= 0;
2933 if (f
->output_data
.x
->border_tile
)
2935 XFreePixmap (dpy
, f
->output_data
.x
->border_tile
);
2936 f
->output_data
.x
->border_tile
= 0;
2943 /* Handler for signals raised during x_create_frame and
2944 x_create_top_frame. FRAME is the frame which is partially
2948 unwind_create_frame (frame
)
2951 struct frame
*f
= XFRAME (frame
);
2953 /* If frame is already dead, nothing to do. This can happen if the
2954 display is disconnected after the frame has become official, but
2955 before x_create_frame removes the unwind protect. */
2956 if (!FRAME_LIVE_P (f
))
2959 /* If frame is ``official'', nothing to do. */
2960 if (!CONSP (Vframe_list
) || !EQ (XCAR (Vframe_list
), frame
))
2963 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2966 x_free_frame_resources (f
);
2969 /* Check that reference counts are indeed correct. */
2970 xassert (dpyinfo
->reference_count
== dpyinfo_refcount
);
2971 xassert (dpyinfo
->image_cache
->refcount
== image_cache_refcount
);
2980 DEFUN ("x-create-frame", Fx_create_frame
, Sx_create_frame
,
2982 doc
: /* Make a new X window, which is called a "frame" in Emacs terms.
2983 Returns an Emacs frame object.
2984 ALIST is an alist of frame parameters.
2985 If the parameters specify that the frame should not have a minibuffer,
2986 and do not specify a specific minibuffer window to use,
2987 then `default-minibuffer-frame' must be a frame whose minibuffer can
2988 be shared by the new frame.
2990 This function is an internal primitive--use `make-frame' instead. */)
2995 Lisp_Object frame
, tem
;
2997 int minibuffer_only
= 0;
2998 long window_prompting
= 0;
3000 int count
= SPECPDL_INDEX ();
3001 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
3002 Lisp_Object display
;
3003 struct x_display_info
*dpyinfo
= NULL
;
3007 /* Use this general default value to start with
3008 until we know if this frame has a specified name. */
3009 Vx_resource_name
= Vinvocation_name
;
3011 display
= x_get_arg (dpyinfo
, parms
, Qdisplay_id
, 0, 0, RES_TYPE_NUMBER
);
3012 if (EQ (display
, Qunbound
))
3013 display
= x_get_arg (dpyinfo
, parms
, Qdisplay
, 0, 0, RES_TYPE_STRING
);
3014 if (EQ (display
, Qunbound
))
3016 dpyinfo
= check_x_display_info (display
);
3018 kb
= dpyinfo
->kboard
;
3020 kb
= &the_only_kboard
;
3023 name
= x_get_arg (dpyinfo
, parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
3025 && ! EQ (name
, Qunbound
)
3027 error ("Invalid frame name--not a string or nil");
3030 Vx_resource_name
= name
;
3032 /* See if parent window is specified. */
3033 parent
= x_get_arg (dpyinfo
, parms
, Qparent_id
, NULL
, NULL
, RES_TYPE_NUMBER
);
3034 if (EQ (parent
, Qunbound
))
3036 if (! NILP (parent
))
3037 CHECK_NUMBER (parent
);
3039 /* make_frame_without_minibuffer can run Lisp code and garbage collect. */
3040 /* No need to protect DISPLAY because that's not used after passing
3041 it to make_frame_without_minibuffer. */
3043 GCPRO4 (parms
, parent
, name
, frame
);
3044 tem
= x_get_arg (dpyinfo
, parms
, Qminibuffer
, "minibuffer", "Minibuffer",
3046 if (EQ (tem
, Qnone
) || NILP (tem
))
3047 f
= make_frame_without_minibuffer (Qnil
, kb
, display
);
3048 else if (EQ (tem
, Qonly
))
3050 f
= make_minibuffer_frame ();
3051 minibuffer_only
= 1;
3053 else if (WINDOWP (tem
))
3054 f
= make_frame_without_minibuffer (tem
, kb
, display
);
3058 XSETFRAME (frame
, f
);
3060 /* Note that X Windows does support scroll bars. */
3061 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 1;
3063 f
->display
= dpyinfo
->frame_display
;
3064 f
->display
->reference_count
++;
3066 f
->output_method
= output_x_window
;
3067 f
->output_data
.x
= (struct x_output
*) xmalloc (sizeof (struct x_output
));
3068 bzero (f
->output_data
.x
, sizeof (struct x_output
));
3069 f
->output_data
.x
->icon_bitmap
= -1;
3070 FRAME_FONTSET (f
) = -1;
3071 f
->output_data
.x
->scroll_bar_foreground_pixel
= -1;
3072 f
->output_data
.x
->scroll_bar_background_pixel
= -1;
3073 #ifdef USE_TOOLKIT_SCROLL_BARS
3074 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
3075 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
3076 #endif /* USE_TOOLKIT_SCROLL_BARS */
3077 record_unwind_protect (unwind_create_frame
, frame
);
3080 = x_get_arg (dpyinfo
, parms
, Qicon_name
, "iconName", "Title",
3082 if (! STRINGP (f
->icon_name
))
3083 f
->icon_name
= Qnil
;
3085 FRAME_X_DISPLAY_INFO (f
) = dpyinfo
;
3087 image_cache_refcount
= FRAME_X_IMAGE_CACHE (f
)->refcount
;
3088 dpyinfo_refcount
= dpyinfo
->reference_count
;
3089 #endif /* GLYPH_DEBUG */
3091 FRAME_KBOARD (f
) = kb
;
3094 /* These colors will be set anyway later, but it's important
3095 to get the color reference counts right, so initialize them! */
3098 struct gcpro gcpro1
;
3100 /* Function x_decode_color can signal an error. Make
3101 sure to initialize color slots so that we won't try
3102 to free colors we haven't allocated. */
3103 f
->output_data
.x
->foreground_pixel
= -1;
3104 f
->output_data
.x
->background_pixel
= -1;
3105 f
->output_data
.x
->cursor_pixel
= -1;
3106 f
->output_data
.x
->cursor_foreground_pixel
= -1;
3107 f
->output_data
.x
->border_pixel
= -1;
3108 f
->output_data
.x
->mouse_pixel
= -1;
3110 black
= build_string ("black");
3112 f
->output_data
.x
->foreground_pixel
3113 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3114 f
->output_data
.x
->background_pixel
3115 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3116 f
->output_data
.x
->cursor_pixel
3117 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3118 f
->output_data
.x
->cursor_foreground_pixel
3119 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3120 f
->output_data
.x
->border_pixel
3121 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3122 f
->output_data
.x
->mouse_pixel
3123 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
3127 /* Specify the parent under which to make this X window. */
3131 f
->output_data
.x
->parent_desc
= (Window
) XFASTINT (parent
);
3132 f
->output_data
.x
->explicit_parent
= 1;
3136 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
3137 f
->output_data
.x
->explicit_parent
= 0;
3140 /* Set the name; the functions to which we pass f expect the name to
3142 if (EQ (name
, Qunbound
) || NILP (name
))
3144 f
->name
= build_string (dpyinfo
->x_id_name
);
3145 f
->explicit_name
= 0;
3150 f
->explicit_name
= 1;
3151 /* use the frame's title when getting resources for this frame. */
3152 specbind (Qx_resource_name
, name
);
3155 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qwindow_system
, Qx
), Qnil
));
3157 /* Extract the window parameters from the supplied values
3158 that are needed to determine window geometry. */
3162 font
= x_get_arg (dpyinfo
, parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
3165 /* First, try whatever font the caller has specified. */
3168 tem
= Fquery_fontset (font
, Qnil
);
3170 font
= x_new_fontset (f
, SDATA (tem
));
3172 font
= x_new_font (f
, SDATA (font
));
3175 /* Try out a font which we hope has bold and italic variations. */
3176 if (!STRINGP (font
))
3177 font
= x_new_font (f
, "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1");
3178 if (!STRINGP (font
))
3179 font
= x_new_font (f
, "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
3180 if (! STRINGP (font
))
3181 font
= x_new_font (f
, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
3182 if (! STRINGP (font
))
3183 /* This was formerly the first thing tried, but it finds too many fonts
3184 and takes too long. */
3185 font
= x_new_font (f
, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1");
3186 /* If those didn't work, look for something which will at least work. */
3187 if (! STRINGP (font
))
3188 font
= x_new_font (f
, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1");
3190 if (! STRINGP (font
))
3191 font
= build_string ("fixed");
3193 x_default_parameter (f
, parms
, Qfont
, font
,
3194 "font", "Font", RES_TYPE_STRING
);
3198 /* Prevent lwlib/xlwmenu.c from crashing because of a bug
3199 whereby it fails to get any font. */
3200 xlwmenu_default_font
= FRAME_FONT (f
);
3203 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
3204 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
3206 /* This defaults to 1 in order to match xterm. We recognize either
3207 internalBorderWidth or internalBorder (which is what xterm calls
3209 if (NILP (Fassq (Qinternal_border_width
, parms
)))
3213 value
= x_get_arg (dpyinfo
, parms
, Qinternal_border_width
,
3214 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
3215 if (! EQ (value
, Qunbound
))
3216 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
3219 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
3220 "internalBorderWidth", "internalBorderWidth",
3222 x_default_parameter (f
, parms
, Qvertical_scroll_bars
, Qleft
,
3223 "verticalScrollBars", "ScrollBars",
3226 /* Also do the stuff which must be set before the window exists. */
3227 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
3228 "foreground", "Foreground", RES_TYPE_STRING
);
3229 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
3230 "background", "Background", RES_TYPE_STRING
);
3231 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
3232 "pointerColor", "Foreground", RES_TYPE_STRING
);
3233 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
3234 "cursorColor", "Foreground", RES_TYPE_STRING
);
3235 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
3236 "borderColor", "BorderColor", RES_TYPE_STRING
);
3237 x_default_parameter (f
, parms
, Qscreen_gamma
, Qnil
,
3238 "screenGamma", "ScreenGamma", RES_TYPE_FLOAT
);
3239 x_default_parameter (f
, parms
, Qline_spacing
, Qnil
,
3240 "lineSpacing", "LineSpacing", RES_TYPE_NUMBER
);
3241 x_default_parameter (f
, parms
, Qleft_fringe
, Qnil
,
3242 "leftFringe", "LeftFringe", RES_TYPE_NUMBER
);
3243 x_default_parameter (f
, parms
, Qright_fringe
, Qnil
,
3244 "rightFringe", "RightFringe", RES_TYPE_NUMBER
);
3246 x_default_scroll_bar_color_parameter (f
, parms
, Qscroll_bar_foreground
,
3247 "scrollBarForeground",
3248 "ScrollBarForeground", 1);
3249 x_default_scroll_bar_color_parameter (f
, parms
, Qscroll_bar_background
,
3250 "scrollBarBackground",
3251 "ScrollBarBackground", 0);
3253 /* Init faces before x_default_parameter is called for scroll-bar
3254 parameters because that function calls x_set_scroll_bar_width,
3255 which calls change_frame_size, which calls Fset_window_buffer,
3256 which runs hooks, which call Fvertical_motion. At the end, we
3257 end up in init_iterator with a null face cache, which should not
3259 init_frame_faces (f
);
3261 x_default_parameter (f
, parms
, Qmenu_bar_lines
, make_number (1),
3262 "menuBar", "MenuBar", RES_TYPE_NUMBER
);
3263 x_default_parameter (f
, parms
, Qtool_bar_lines
, make_number (1),
3264 "toolBar", "ToolBar", RES_TYPE_NUMBER
);
3265 x_default_parameter (f
, parms
, Qbuffer_predicate
, Qnil
,
3266 "bufferPredicate", "BufferPredicate",
3268 x_default_parameter (f
, parms
, Qtitle
, Qnil
,
3269 "title", "Title", RES_TYPE_STRING
);
3270 x_default_parameter (f
, parms
, Qwait_for_wm
, Qt
,
3271 "waitForWM", "WaitForWM", RES_TYPE_BOOLEAN
);
3272 x_default_parameter (f
, parms
, Qfullscreen
, Qnil
,
3273 "fullscreen", "Fullscreen", RES_TYPE_SYMBOL
);
3275 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
3277 /* Compute the size of the X window. */
3278 window_prompting
= x_figure_window_size (f
, parms
, 1);
3280 tem
= x_get_arg (dpyinfo
, parms
, Qunsplittable
, 0, 0, RES_TYPE_BOOLEAN
);
3281 f
->no_split
= minibuffer_only
|| EQ (tem
, Qt
);
3283 x_icon_verify (f
, parms
);
3285 /* Create the X widget or window. */
3286 #ifdef USE_X_TOOLKIT
3287 x_window (f
, window_prompting
, minibuffer_only
);
3295 /* Now consider the frame official. */
3296 FRAME_X_DISPLAY_INFO (f
)->reference_count
++;
3297 Vframe_list
= Fcons (frame
, Vframe_list
);
3299 /* We need to do this after creating the X window, so that the
3300 icon-creation functions can say whose icon they're describing. */
3301 x_default_parameter (f
, parms
, Qicon_type
, Qnil
,
3302 "bitmapIcon", "BitmapIcon", RES_TYPE_SYMBOL
);
3304 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
3305 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3306 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
3307 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
3308 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
3309 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
3310 x_default_parameter (f
, parms
, Qscroll_bar_width
, Qnil
,
3311 "scrollBarWidth", "ScrollBarWidth",
3314 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
3315 Change will not be effected unless different from the current
3317 width
= FRAME_COLS (f
);
3318 height
= FRAME_LINES (f
);
3320 SET_FRAME_COLS (f
, 0);
3321 FRAME_LINES (f
) = 0;
3322 change_frame_size (f
, height
, width
, 1, 0, 0);
3324 #if defined (USE_X_TOOLKIT) || defined (USE_GTK)
3325 /* Create the menu bar. */
3326 if (!minibuffer_only
&& FRAME_EXTERNAL_MENU_BAR (f
))
3328 /* If this signals an error, we haven't set size hints for the
3329 frame and we didn't make it visible. */
3330 initialize_frame_menubar (f
);
3333 /* This is a no-op, except under Motif where it arranges the
3334 main window for the widgets on it. */
3335 lw_set_main_areas (f
->output_data
.x
->column_widget
,
3336 f
->output_data
.x
->menubar_widget
,
3337 f
->output_data
.x
->edit_widget
);
3338 #endif /* not USE_GTK */
3340 #endif /* USE_X_TOOLKIT || USE_GTK */
3342 /* Tell the server what size and position, etc, we want, and how
3343 badly we want them. This should be done after we have the menu
3344 bar so that its size can be taken into account. */
3346 x_wm_set_size_hint (f
, window_prompting
, 0);
3349 /* Make the window appear on the frame and enable display, unless
3350 the caller says not to. However, with explicit parent, Emacs
3351 cannot control visibility, so don't try. */
3352 if (! f
->output_data
.x
->explicit_parent
)
3354 Lisp_Object visibility
;
3356 visibility
= x_get_arg (dpyinfo
, parms
, Qvisibility
, 0, 0,
3358 if (EQ (visibility
, Qunbound
))
3361 if (EQ (visibility
, Qicon
))
3362 x_iconify_frame (f
);
3363 else if (! NILP (visibility
))
3364 x_make_frame_visible (f
);
3366 /* Must have been Qnil. */
3370 /* Set the WM leader property. GTK does this itself, so this is not
3371 needed when using GTK. */
3372 if (dpyinfo
->client_leader_window
!= 0)
3375 XChangeProperty (FRAME_X_DISPLAY (f
),
3376 FRAME_OUTER_WINDOW (f
),
3377 dpyinfo
->Xatom_wm_client_leader
,
3378 XA_WINDOW
, 32, PropModeReplace
,
3379 (char *) &dpyinfo
->client_leader_window
, 1);
3385 /* Make sure windows on this frame appear in calls to next-window
3386 and similar functions. */
3387 Vwindow_list
= Qnil
;
3389 return unbind_to (count
, frame
);
3393 /* FRAME is used only to get a handle on the X display. We don't pass the
3394 display info directly because we're called from frame.c, which doesn't
3395 know about that structure. */
3398 x_get_focus_frame (frame
)
3399 struct frame
*frame
;
3401 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (frame
);
3403 if (! dpyinfo
->x_focus_frame
)
3406 XSETFRAME (xfocus
, dpyinfo
->x_focus_frame
);
3411 /* In certain situations, when the window manager follows a
3412 click-to-focus policy, there seems to be no way around calling
3413 XSetInputFocus to give another frame the input focus .
3415 In an ideal world, XSetInputFocus should generally be avoided so
3416 that applications don't interfere with the window manager's focus
3417 policy. But I think it's okay to use when it's clearly done
3418 following a user-command. */
3420 DEFUN ("x-focus-frame", Fx_focus_frame
, Sx_focus_frame
, 1, 1, 0,
3421 doc
: /* Set the input focus to FRAME.
3422 FRAME nil means use the selected frame. */)
3426 struct frame
*f
= check_x_frame (frame
);
3427 Display
*dpy
= FRAME_X_DISPLAY (f
);
3431 count
= x_catch_errors (dpy
);
3432 XSetInputFocus (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
3433 RevertToParent
, CurrentTime
);
3434 x_uncatch_errors (dpy
, count
);
3441 DEFUN ("xw-color-defined-p", Fxw_color_defined_p
, Sxw_color_defined_p
, 1, 2, 0,
3442 doc
: /* Internal function called by `color-defined-p', which see. */)
3444 Lisp_Object color
, frame
;
3447 FRAME_PTR f
= check_x_frame (frame
);
3449 CHECK_STRING (color
);
3451 if (x_defined_color (f
, SDATA (color
), &foo
, 0))
3457 DEFUN ("xw-color-values", Fxw_color_values
, Sxw_color_values
, 1, 2, 0,
3458 doc
: /* Internal function called by `color-values', which see. */)
3460 Lisp_Object color
, frame
;
3463 FRAME_PTR f
= check_x_frame (frame
);
3465 CHECK_STRING (color
);
3467 if (x_defined_color (f
, SDATA (color
), &foo
, 0))
3471 rgb
[0] = make_number (foo
.red
);
3472 rgb
[1] = make_number (foo
.green
);
3473 rgb
[2] = make_number (foo
.blue
);
3474 return Flist (3, rgb
);
3480 DEFUN ("xw-display-color-p", Fxw_display_color_p
, Sxw_display_color_p
, 0, 1, 0,
3481 doc
: /* Internal function called by `display-color-p', which see. */)
3483 Lisp_Object display
;
3485 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3487 if (dpyinfo
->n_planes
<= 2)
3490 switch (dpyinfo
->visual
->class)
3503 DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p
, Sx_display_grayscale_p
,
3505 doc
: /* Return t if the X display supports shades of gray.
3506 Note that color displays do support shades of gray.
3507 The optional argument DISPLAY specifies which display to ask about.
3508 DISPLAY should be either a frame or a display name (a string).
3509 If omitted or nil, that stands for the selected frame's display. */)
3511 Lisp_Object display
;
3513 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3515 if (dpyinfo
->n_planes
<= 1)
3518 switch (dpyinfo
->visual
->class)
3533 DEFUN ("x-display-pixel-width", Fx_display_pixel_width
, Sx_display_pixel_width
,
3535 doc
: /* Returns the width in pixels of the X display DISPLAY.
3536 The optional argument DISPLAY specifies which display to ask about.
3537 DISPLAY should be either a frame or a display name (a string).
3538 If omitted or nil, that stands for the selected frame's display. */)
3540 Lisp_Object display
;
3542 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3544 return make_number (dpyinfo
->width
);
3547 DEFUN ("x-display-pixel-height", Fx_display_pixel_height
,
3548 Sx_display_pixel_height
, 0, 1, 0,
3549 doc
: /* Returns the height in pixels of the X display DISPLAY.
3550 The optional argument DISPLAY specifies which display to ask about.
3551 DISPLAY should be either a frame or a display name (a string).
3552 If omitted or nil, that stands for the selected frame's display. */)
3554 Lisp_Object display
;
3556 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3558 return make_number (dpyinfo
->height
);
3561 DEFUN ("x-display-planes", Fx_display_planes
, Sx_display_planes
,
3563 doc
: /* Returns the number of bitplanes of the X display DISPLAY.
3564 The optional argument DISPLAY specifies which display to ask about.
3565 DISPLAY should be either a frame or a display name (a string).
3566 If omitted or nil, that stands for the selected frame's display. */)
3568 Lisp_Object display
;
3570 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3572 return make_number (dpyinfo
->n_planes
);
3575 DEFUN ("x-display-color-cells", Fx_display_color_cells
, Sx_display_color_cells
,
3577 doc
: /* Returns the number of color cells of the X display DISPLAY.
3578 The optional argument DISPLAY specifies which display to ask about.
3579 DISPLAY should be either a frame or a display name (a string).
3580 If omitted or nil, that stands for the selected frame's display. */)
3582 Lisp_Object display
;
3584 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3586 int nr_planes
= DisplayPlanes (dpyinfo
->display
,
3587 XScreenNumberOfScreen (dpyinfo
->screen
));
3589 /* Truncate nr_planes to 24 to avoid integer overflow.
3590 Some displays says 32, but only 24 bits are actually significant.
3591 There are only very few and rare video cards that have more than
3592 24 significant bits. Also 24 bits is more than 16 million colors,
3593 it "should be enough for everyone". */
3594 if (nr_planes
> 24) nr_planes
= 24;
3596 return make_number (1 << nr_planes
);
3599 DEFUN ("x-server-max-request-size", Fx_server_max_request_size
,
3600 Sx_server_max_request_size
,
3602 doc
: /* Returns the maximum request size of the X server of display DISPLAY.
3603 The optional argument DISPLAY specifies which display to ask about.
3604 DISPLAY should be either a frame or a display name (a string).
3605 If omitted or nil, that stands for the selected frame's display. */)
3607 Lisp_Object display
;
3609 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3611 return make_number (MAXREQUEST (dpyinfo
->display
));
3614 DEFUN ("x-server-vendor", Fx_server_vendor
, Sx_server_vendor
, 0, 1, 0,
3615 doc
: /* Returns the "vendor ID" string of the X server of display DISPLAY.
3616 \(Labelling every distributor as a "vendor" embodies the false assumption
3617 that operating systems cannot be developed and distributed noncommercially.)
3618 The optional argument DISPLAY specifies which display to ask about.
3619 DISPLAY should be either a frame or a display name (a string).
3620 If omitted or nil, that stands for the selected frame's display. */)
3622 Lisp_Object display
;
3624 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3625 char *vendor
= ServerVendor (dpyinfo
->display
);
3627 if (! vendor
) vendor
= "";
3628 return build_string (vendor
);
3631 DEFUN ("x-server-version", Fx_server_version
, Sx_server_version
, 0, 1, 0,
3632 doc
: /* Returns the version numbers of the X server of display DISPLAY.
3633 The value is a list of three integers: the major and minor
3634 version numbers of the X Protocol in use, and the distributor-specific release
3635 number. See also the function `x-server-vendor'.
3637 The optional argument DISPLAY specifies which display to ask about.
3638 DISPLAY should be either a frame or a display name (a string).
3639 If omitted or nil, that stands for the selected frame's display. */)
3641 Lisp_Object display
;
3643 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3644 Display
*dpy
= dpyinfo
->display
;
3646 return Fcons (make_number (ProtocolVersion (dpy
)),
3647 Fcons (make_number (ProtocolRevision (dpy
)),
3648 Fcons (make_number (VendorRelease (dpy
)), Qnil
)));
3651 DEFUN ("x-display-screens", Fx_display_screens
, Sx_display_screens
, 0, 1, 0,
3652 doc
: /* Return the number of screens on the X server of display DISPLAY.
3653 The optional argument DISPLAY specifies which display to ask about.
3654 DISPLAY should be either a frame or a display name (a string).
3655 If omitted or nil, that stands for the selected frame's display. */)
3657 Lisp_Object display
;
3659 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3661 return make_number (ScreenCount (dpyinfo
->display
));
3664 DEFUN ("x-display-mm-height", Fx_display_mm_height
, Sx_display_mm_height
, 0, 1, 0,
3665 doc
: /* Return the height in millimeters of the X display DISPLAY.
3666 The optional argument DISPLAY specifies which display to ask about.
3667 DISPLAY should be either a frame or a display name (a string).
3668 If omitted or nil, that stands for the selected frame's display. */)
3670 Lisp_Object display
;
3672 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3674 return make_number (HeightMMOfScreen (dpyinfo
->screen
));
3677 DEFUN ("x-display-mm-width", Fx_display_mm_width
, Sx_display_mm_width
, 0, 1, 0,
3678 doc
: /* Return the width in millimeters of the X display DISPLAY.
3679 The optional argument DISPLAY specifies which display to ask about.
3680 DISPLAY should be either a frame or a display name (a string).
3681 If omitted or nil, that stands for the selected frame's display. */)
3683 Lisp_Object display
;
3685 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3687 return make_number (WidthMMOfScreen (dpyinfo
->screen
));
3690 DEFUN ("x-display-backing-store", Fx_display_backing_store
,
3691 Sx_display_backing_store
, 0, 1, 0,
3692 doc
: /* Returns an indication of whether X display DISPLAY does backing store.
3693 The value may be `always', `when-mapped', or `not-useful'.
3694 The optional argument DISPLAY specifies which display to ask about.
3695 DISPLAY should be either a frame or a display name (a string).
3696 If omitted or nil, that stands for the selected frame's display. */)
3698 Lisp_Object display
;
3700 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3703 switch (DoesBackingStore (dpyinfo
->screen
))
3706 result
= intern ("always");
3710 result
= intern ("when-mapped");
3714 result
= intern ("not-useful");
3718 error ("Strange value for BackingStore parameter of screen");
3725 DEFUN ("x-display-visual-class", Fx_display_visual_class
,
3726 Sx_display_visual_class
, 0, 1, 0,
3727 doc
: /* Return the visual class of the X display DISPLAY.
3728 The value is one of the symbols `static-gray', `gray-scale',
3729 `static-color', `pseudo-color', `true-color', or `direct-color'.
3731 The optional argument DISPLAY specifies which display to ask about.
3732 DISPLAY should be either a frame or a display name (a string).
3733 If omitted or nil, that stands for the selected frame's display. */)
3735 Lisp_Object display
;
3737 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3740 switch (dpyinfo
->visual
->class)
3743 result
= intern ("static-gray");
3746 result
= intern ("gray-scale");
3749 result
= intern ("static-color");
3752 result
= intern ("pseudo-color");
3755 result
= intern ("true-color");
3758 result
= intern ("direct-color");
3761 error ("Display has an unknown visual class");
3768 DEFUN ("x-display-save-under", Fx_display_save_under
,
3769 Sx_display_save_under
, 0, 1, 0,
3770 doc
: /* Returns t if the X display DISPLAY supports the save-under feature.
3771 The optional argument DISPLAY specifies which display to ask about.
3772 DISPLAY should be either a frame or a display name (a string).
3773 If omitted or nil, that stands for the selected frame's display. */)
3775 Lisp_Object display
;
3777 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
3779 if (DoesSaveUnders (dpyinfo
->screen
) == True
)
3787 register struct frame
*f
;
3789 return FRAME_PIXEL_WIDTH (f
);
3794 register struct frame
*f
;
3796 return FRAME_PIXEL_HEIGHT (f
);
3801 register struct frame
*f
;
3803 return FRAME_COLUMN_WIDTH (f
);
3808 register struct frame
*f
;
3810 return FRAME_LINE_HEIGHT (f
);
3815 register struct frame
*f
;
3817 return FRAME_X_DISPLAY_INFO (f
)->n_planes
;
3822 /************************************************************************
3824 ************************************************************************/
3827 /* Mapping visual names to visuals. */
3829 static struct visual_class
3836 {"StaticGray", StaticGray
},
3837 {"GrayScale", GrayScale
},
3838 {"StaticColor", StaticColor
},
3839 {"PseudoColor", PseudoColor
},
3840 {"TrueColor", TrueColor
},
3841 {"DirectColor", DirectColor
},
3846 #ifndef HAVE_XSCREENNUMBEROFSCREEN
3848 /* Value is the screen number of screen SCR. This is a substitute for
3849 the X function with the same name when that doesn't exist. */
3852 XScreenNumberOfScreen (scr
)
3853 register Screen
*scr
;
3855 Display
*dpy
= scr
->display
;
3858 for (i
= 0; i
< dpy
->nscreens
; ++i
)
3859 if (scr
== dpy
->screens
+ i
)
3865 #endif /* not HAVE_XSCREENNUMBEROFSCREEN */
3868 /* Select the visual that should be used on display DPYINFO. Set
3869 members of DPYINFO appropriately. Called from x_term_init. */
3872 select_visual (dpyinfo
)
3873 struct x_display_info
*dpyinfo
;
3875 Display
*dpy
= dpyinfo
->display
;
3876 Screen
*screen
= dpyinfo
->screen
;
3879 /* See if a visual is specified. */
3880 value
= display_x_get_resource (dpyinfo
,
3881 build_string ("visualClass"),
3882 build_string ("VisualClass"),
3884 if (STRINGP (value
))
3886 /* VALUE should be of the form CLASS-DEPTH, where CLASS is one
3887 of `PseudoColor', `TrueColor' etc. and DEPTH is the color
3888 depth, a decimal number. NAME is compared with case ignored. */
3889 char *s
= (char *) alloca (SBYTES (value
) + 1);
3894 strcpy (s
, SDATA (value
));
3895 dash
= index (s
, '-');
3898 dpyinfo
->n_planes
= atoi (dash
+ 1);
3902 /* We won't find a matching visual with depth 0, so that
3903 an error will be printed below. */
3904 dpyinfo
->n_planes
= 0;
3906 /* Determine the visual class. */
3907 for (i
= 0; visual_classes
[i
].name
; ++i
)
3908 if (xstricmp (s
, visual_classes
[i
].name
) == 0)
3910 class = visual_classes
[i
].class;
3914 /* Look up a matching visual for the specified class. */
3916 || !XMatchVisualInfo (dpy
, XScreenNumberOfScreen (screen
),
3917 dpyinfo
->n_planes
, class, &vinfo
))
3918 fatal ("Invalid visual specification `%s'", SDATA (value
));
3920 dpyinfo
->visual
= vinfo
.visual
;
3925 XVisualInfo
*vinfo
, vinfo_template
;
3927 dpyinfo
->visual
= DefaultVisualOfScreen (screen
);
3930 vinfo_template
.visualid
= XVisualIDFromVisual (dpyinfo
->visual
);
3932 vinfo_template
.visualid
= dpyinfo
->visual
->visualid
;
3934 vinfo_template
.screen
= XScreenNumberOfScreen (screen
);
3935 vinfo
= XGetVisualInfo (dpy
, VisualIDMask
| VisualScreenMask
,
3936 &vinfo_template
, &n_visuals
);
3938 fatal ("Can't get proper X visual info");
3940 dpyinfo
->n_planes
= vinfo
->depth
;
3941 XFree ((char *) vinfo
);
3946 /* Return the X display structure for the display named NAME.
3947 Open a new connection if necessary. */
3949 struct x_display_info
*
3950 x_display_info_for_name (name
)
3954 struct x_display_info
*dpyinfo
;
3956 CHECK_STRING (name
);
3959 if (! EQ (Vinitial_window_system
, intern ("x")))
3960 error ("Not using X Windows"); /* That doesn't stop us anymore. */
3963 for (dpyinfo
= x_display_list
, names
= x_display_name_list
;
3965 dpyinfo
= dpyinfo
->next
, names
= XCDR (names
))
3968 tem
= Fstring_equal (XCAR (XCAR (names
)), name
);
3973 /* Use this general default value to start with. */
3974 Vx_resource_name
= Vinvocation_name
;
3976 validate_x_resource_name ();
3978 dpyinfo
= x_term_init (name
, (char *)0,
3979 (char *) SDATA (Vx_resource_name
));
3982 error ("Cannot connect to X server %s", SDATA (name
));
3985 XSETFASTINT (Vwindow_system_version
, 11);
3991 DEFUN ("x-open-connection", Fx_open_connection
, Sx_open_connection
,
3993 doc
: /* Open a connection to an X server.
3994 DISPLAY is the name of the display to connect to.
3995 Optional second arg XRM-STRING is a string of resources in xrdb format.
3996 If the optional third arg MUST-SUCCEED is non-nil,
3997 terminate Emacs if we can't open the connection. */)
3998 (display
, xrm_string
, must_succeed
)
3999 Lisp_Object display
, xrm_string
, must_succeed
;
4001 unsigned char *xrm_option
;
4002 struct x_display_info
*dpyinfo
;
4004 CHECK_STRING (display
);
4005 if (! NILP (xrm_string
))
4006 CHECK_STRING (xrm_string
);
4009 if (! EQ (Vinitial_window_system
, intern ("x")))
4010 error ("Not using X Windows"); /* That doesn't stop us anymore. */
4013 if (! NILP (xrm_string
))
4014 xrm_option
= (unsigned char *) SDATA (xrm_string
);
4016 xrm_option
= (unsigned char *) 0;
4018 validate_x_resource_name ();
4020 /* This is what opens the connection and sets x_current_display.
4021 This also initializes many symbols, such as those used for input. */
4022 dpyinfo
= x_term_init (display
, xrm_option
,
4023 (char *) SDATA (Vx_resource_name
));
4027 if (!NILP (must_succeed
))
4028 fatal ("Cannot connect to X server %s.\n\
4029 Check the DISPLAY environment variable or use `-d'.\n\
4030 Also use the `xauth' program to verify that you have the proper\n\
4031 authorization information needed to connect the X server.\n\
4032 An insecure way to solve the problem may be to use `xhost'.\n",
4035 error ("Cannot connect to X server %s", SDATA (display
));
4040 XSETFASTINT (Vwindow_system_version
, 11);
4044 DEFUN ("x-close-connection", Fx_close_connection
,
4045 Sx_close_connection
, 1, 1, 0,
4046 doc
: /* Close the connection to DISPLAY's X server.
4047 For DISPLAY, specify either a frame or a display name (a string).
4048 If DISPLAY is nil, that stands for the selected frame's display. */)
4050 Lisp_Object display
;
4052 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
4054 if (dpyinfo
->reference_count
> 0)
4055 error ("Display still has frames on it");
4057 x_delete_frame_display (dpyinfo
->frame_display
);
4062 DEFUN ("x-display-list", Fx_display_list
, Sx_display_list
, 0, 0, 0,
4063 doc
: /* Return the list of display names that Emacs has connections to. */)
4066 Lisp_Object tail
, result
;
4069 for (tail
= x_display_name_list
; ! NILP (tail
); tail
= XCDR (tail
))
4070 result
= Fcons (XCAR (XCAR (tail
)), result
);
4075 DEFUN ("x-synchronize", Fx_synchronize
, Sx_synchronize
, 1, 2, 0,
4076 doc
: /* If ON is non-nil, report X errors as soon as the erring request is made.
4077 If ON is nil, allow buffering of requests.
4078 Turning on synchronization prohibits the Xlib routines from buffering
4079 requests and seriously degrades performance, but makes debugging much
4081 The optional second argument DISPLAY specifies which display to act on.
4082 DISPLAY should be either a frame or a display name (a string).
4083 If DISPLAY is omitted or nil, that stands for the selected frame's display. */)
4085 Lisp_Object display
, on
;
4087 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
4089 XSynchronize (dpyinfo
->display
, !EQ (on
, Qnil
));
4094 /* Wait for responses to all X commands issued so far for frame F. */
4101 XSync (FRAME_X_DISPLAY (f
), False
);
4106 /***********************************************************************
4108 ***********************************************************************/
4110 DEFUN ("x-change-window-property", Fx_change_window_property
,
4111 Sx_change_window_property
, 2, 6, 0,
4112 doc
: /* Change window property PROP to VALUE on the X window of FRAME.
4113 PROP must be a string.
4114 VALUE may be a string or a list of conses, numbers and/or strings.
4115 If an element in the list is a string, it is converted to
4116 an Atom and the value of the Atom is used. If an element is a cons,
4117 it is converted to a 32 bit number where the car is the 16 top bits and the
4118 cdr is the lower 16 bits.
4119 FRAME nil or omitted means use the selected frame.
4120 If TYPE is given and non-nil, it is the name of the type of VALUE.
4121 If TYPE is not given or nil, the type is STRING.
4122 FORMAT gives the size in bits of each element if VALUE is a list.
4123 It must be one of 8, 16 or 32.
4124 If VALUE is a string or FORMAT is nil or not given, FORMAT defaults to 8.
4125 If OUTER_P is non-nil, the property is changed for the outer X window of
4126 FRAME. Default is to change on the edit X window.
4129 (prop
, value
, frame
, type
, format
, outer_p
)
4130 Lisp_Object prop
, value
, frame
, type
, format
, outer_p
;
4132 struct frame
*f
= check_x_frame (frame
);
4134 Atom target_type
= XA_STRING
;
4135 int element_format
= 8;
4136 unsigned char *data
;
4140 CHECK_STRING (prop
);
4142 if (! NILP (format
))
4144 CHECK_NUMBER (format
);
4145 element_format
= XFASTINT (format
);
4147 if (element_format
!= 8 && element_format
!= 16
4148 && element_format
!= 32)
4149 error ("FORMAT must be one of 8, 16 or 32");
4154 nelements
= x_check_property_data (value
);
4155 if (nelements
== -1)
4156 error ("Bad data in VALUE, must be number, string or cons");
4158 if (element_format
== 8)
4159 data
= (unsigned char *) xmalloc (nelements
);
4160 else if (element_format
== 16)
4161 data
= (unsigned char *) xmalloc (nelements
*2);
4162 else /* format == 32 */
4163 /* The man page for XChangeProperty:
4164 "If the specified format is 32, the property data must be a
4166 This applies even if long is more than 64 bits. The X library
4167 converts to 32 bits before sending to the X server. */
4168 data
= (unsigned char *) xmalloc (nelements
* sizeof(long));
4170 x_fill_property_data (FRAME_X_DISPLAY (f
), value
, data
, element_format
);
4174 CHECK_STRING (value
);
4175 data
= SDATA (value
);
4176 nelements
= SCHARS (value
);
4180 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4183 CHECK_STRING (type
);
4184 target_type
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (type
), False
);
4187 if (! NILP (outer_p
)) w
= FRAME_OUTER_WINDOW (f
);
4188 else w
= FRAME_X_WINDOW (f
);
4190 XChangeProperty (FRAME_X_DISPLAY (f
), w
,
4191 prop_atom
, target_type
, element_format
, PropModeReplace
,
4194 if (CONSP (value
)) xfree (data
);
4196 /* Make sure the property is set when we return. */
4197 XFlush (FRAME_X_DISPLAY (f
));
4204 DEFUN ("x-delete-window-property", Fx_delete_window_property
,
4205 Sx_delete_window_property
, 1, 2, 0,
4206 doc
: /* Remove window property PROP from X window of FRAME.
4207 FRAME nil or omitted means use the selected frame. Value is PROP. */)
4209 Lisp_Object prop
, frame
;
4211 struct frame
*f
= check_x_frame (frame
);
4214 CHECK_STRING (prop
);
4216 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4217 XDeleteProperty (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
), prop_atom
);
4219 /* Make sure the property is removed when we return. */
4220 XFlush (FRAME_X_DISPLAY (f
));
4227 DEFUN ("x-window-property", Fx_window_property
, Sx_window_property
,
4229 doc
: /* Value is the value of window property PROP on FRAME.
4230 If FRAME is nil or omitted, use the selected frame.
4231 If TYPE is nil or omitted, get the property as a string. Otherwise TYPE
4232 is the name of the Atom that denotes the type expected.
4233 If SOURCE is non-nil, get the property on that window instead of from
4234 FRAME. The number 0 denotes the root window.
4235 If DELETE_P is non-nil, delete the property after retreiving it.
4236 If VECTOR_RET_P is non-nil, don't return a string but a vector of values.
4238 Value is nil if FRAME hasn't a property with name PROP or if PROP has
4239 no value of TYPE. */)
4240 (prop
, frame
, type
, source
, delete_p
, vector_ret_p
)
4241 Lisp_Object prop
, frame
, type
, source
, delete_p
, vector_ret_p
;
4243 struct frame
*f
= check_x_frame (frame
);
4246 Lisp_Object prop_value
= Qnil
;
4247 unsigned char *tmp_data
= NULL
;
4249 Atom target_type
= XA_STRING
;
4251 unsigned long actual_size
, bytes_remaining
;
4252 Window target_window
= FRAME_X_WINDOW (f
);
4253 struct gcpro gcpro1
;
4255 GCPRO1 (prop_value
);
4256 CHECK_STRING (prop
);
4258 if (! NILP (source
))
4260 if (NUMBERP (source
))
4262 if (FLOATP (source
))
4263 target_window
= (Window
) XFLOAT (source
);
4265 target_window
= XFASTINT (source
);
4267 if (target_window
== 0)
4268 target_window
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4270 else if (CONSP (source
))
4271 target_window
= cons_to_long (source
);
4277 if (strcmp ("AnyPropertyType", SDATA (type
)) == 0)
4278 target_type
= AnyPropertyType
;
4280 target_type
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (type
), False
);
4283 prop_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SDATA (prop
), False
);
4284 rc
= XGetWindowProperty (FRAME_X_DISPLAY (f
), target_window
,
4285 prop_atom
, 0, 0, False
, target_type
,
4286 &actual_type
, &actual_format
, &actual_size
,
4287 &bytes_remaining
, &tmp_data
);
4290 int size
= bytes_remaining
;
4295 rc
= XGetWindowProperty (FRAME_X_DISPLAY (f
), target_window
,
4296 prop_atom
, 0, bytes_remaining
,
4297 ! NILP (delete_p
), target_type
,
4298 &actual_type
, &actual_format
,
4299 &actual_size
, &bytes_remaining
,
4301 if (rc
== Success
&& tmp_data
)
4303 /* The man page for XGetWindowProperty says:
4304 "If the returned format is 32, the returned data is represented
4305 as a long array and should be cast to that type to obtain the
4307 This applies even if long is more than 32 bits, the X library
4308 converts from 32 bit elements received from the X server to long
4309 and passes the long array to us. Thus, for that case bcopy can not
4310 be used. We convert to a 32 bit type here, because so much code
4313 The bytes and offsets passed to XGetWindowProperty refers to the
4314 property and those are indeed in 32 bit quantities if format is
4317 if (actual_format
== 32 && actual_format
< BITS_PER_LONG
)
4320 int *idata
= (int *) tmp_data
;
4321 long *ldata
= (long *) tmp_data
;
4323 for (i
= 0; i
< actual_size
; ++i
)
4324 idata
[i
] = (int) ldata
[i
];
4327 if (NILP (vector_ret_p
))
4328 prop_value
= make_string (tmp_data
, size
);
4330 prop_value
= x_property_data_to_lisp (f
,
4337 if (tmp_data
) XFree (tmp_data
);
4347 /***********************************************************************
4349 ***********************************************************************/
4351 /* If non-null, an asynchronous timer that, when it expires, displays
4352 an hourglass cursor on all frames. */
4354 static struct atimer
*hourglass_atimer
;
4356 /* Non-zero means an hourglass cursor is currently shown. */
4358 static int hourglass_shown_p
;
4360 /* Number of seconds to wait before displaying an hourglass cursor. */
4362 static Lisp_Object Vhourglass_delay
;
4364 /* Default number of seconds to wait before displaying an hourglass
4367 #define DEFAULT_HOURGLASS_DELAY 1
4369 /* Function prototypes. */
4371 static void show_hourglass
P_ ((struct atimer
*));
4372 static void hide_hourglass
P_ ((void));
4374 /* Return non-zero if houglass timer has been started or hourglass is shown. */
4377 hourglass_started ()
4379 return hourglass_shown_p
|| hourglass_atimer
!= NULL
;
4383 /* Cancel a currently active hourglass timer, and start a new one. */
4389 int secs
, usecs
= 0;
4391 cancel_hourglass ();
4393 if (INTEGERP (Vhourglass_delay
)
4394 && XINT (Vhourglass_delay
) > 0)
4395 secs
= XFASTINT (Vhourglass_delay
);
4396 else if (FLOATP (Vhourglass_delay
)
4397 && XFLOAT_DATA (Vhourglass_delay
) > 0)
4400 tem
= Ftruncate (Vhourglass_delay
, Qnil
);
4401 secs
= XFASTINT (tem
);
4402 usecs
= (XFLOAT_DATA (Vhourglass_delay
) - secs
) * 1000000;
4405 secs
= DEFAULT_HOURGLASS_DELAY
;
4407 EMACS_SET_SECS_USECS (delay
, secs
, usecs
);
4408 hourglass_atimer
= start_atimer (ATIMER_RELATIVE
, delay
,
4409 show_hourglass
, NULL
);
4413 /* Cancel the hourglass cursor timer if active, hide a busy cursor if
4419 if (hourglass_atimer
)
4421 cancel_atimer (hourglass_atimer
);
4422 hourglass_atimer
= NULL
;
4425 if (hourglass_shown_p
)
4430 /* Timer function of hourglass_atimer. TIMER is equal to
4433 Display an hourglass pointer on all frames by mapping the frames'
4434 hourglass_window. Set the hourglass_p flag in the frames'
4435 output_data.x structure to indicate that an hourglass cursor is
4436 shown on the frames. */
4439 show_hourglass (timer
)
4440 struct atimer
*timer
;
4442 /* The timer implementation will cancel this timer automatically
4443 after this function has run. Set hourglass_atimer to null
4444 so that we know the timer doesn't have to be canceled. */
4445 hourglass_atimer
= NULL
;
4447 if (!hourglass_shown_p
)
4449 Lisp_Object rest
, frame
;
4453 FOR_EACH_FRAME (rest
, frame
)
4455 struct frame
*f
= XFRAME (frame
);
4457 if (FRAME_LIVE_P (f
) && FRAME_X_P (f
) && FRAME_X_DISPLAY (f
))
4459 Display
*dpy
= FRAME_X_DISPLAY (f
);
4461 #ifdef USE_X_TOOLKIT
4462 if (f
->output_data
.x
->widget
)
4464 if (FRAME_OUTER_WINDOW (f
))
4467 f
->output_data
.x
->hourglass_p
= 1;
4469 if (!f
->output_data
.x
->hourglass_window
)
4471 unsigned long mask
= CWCursor
;
4472 XSetWindowAttributes attrs
;
4474 Window parent
= FRAME_X_WINDOW (f
);
4476 Window parent
= FRAME_OUTER_WINDOW (f
);
4478 attrs
.cursor
= f
->output_data
.x
->hourglass_cursor
;
4480 f
->output_data
.x
->hourglass_window
4481 = XCreateWindow (dpy
, parent
,
4482 0, 0, 32000, 32000, 0, 0,
4488 XMapRaised (dpy
, f
->output_data
.x
->hourglass_window
);
4494 hourglass_shown_p
= 1;
4500 /* Hide the hourglass pointer on all frames, if it is currently
4506 if (hourglass_shown_p
)
4508 Lisp_Object rest
, frame
;
4511 FOR_EACH_FRAME (rest
, frame
)
4513 struct frame
*f
= XFRAME (frame
);
4516 /* Watch out for newly created frames. */
4517 && f
->output_data
.x
->hourglass_window
)
4519 XUnmapWindow (FRAME_X_DISPLAY (f
),
4520 f
->output_data
.x
->hourglass_window
);
4521 /* Sync here because XTread_socket looks at the
4522 hourglass_p flag that is reset to zero below. */
4523 XSync (FRAME_X_DISPLAY (f
), False
);
4524 f
->output_data
.x
->hourglass_p
= 0;
4528 hourglass_shown_p
= 0;
4535 /***********************************************************************
4537 ***********************************************************************/
4539 static Lisp_Object x_create_tip_frame
P_ ((struct x_display_info
*,
4540 Lisp_Object
, Lisp_Object
));
4541 static void compute_tip_xy
P_ ((struct frame
*, Lisp_Object
, Lisp_Object
,
4542 Lisp_Object
, int, int, int *, int *));
4544 /* The frame of a currently visible tooltip. */
4546 Lisp_Object tip_frame
;
4548 /* If non-nil, a timer started that hides the last tooltip when it
4551 Lisp_Object tip_timer
;
4554 /* If non-nil, a vector of 3 elements containing the last args
4555 with which x-show-tip was called. See there. */
4557 Lisp_Object last_show_tip_args
;
4559 /* Maximum size for tooltips; a cons (COLUMNS . ROWS). */
4561 Lisp_Object Vx_max_tooltip_size
;
4565 unwind_create_tip_frame (frame
)
4568 Lisp_Object deleted
;
4570 deleted
= unwind_create_frame (frame
);
4571 if (EQ (deleted
, Qt
))
4581 /* Create a frame for a tooltip on the display described by DPYINFO.
4582 PARMS is a list of frame parameters. TEXT is the string to
4583 display in the tip frame. Value is the frame.
4585 Note that functions called here, esp. x_default_parameter can
4586 signal errors, for instance when a specified color name is
4587 undefined. We have to make sure that we're in a consistent state
4588 when this happens. */
4591 x_create_tip_frame (dpyinfo
, parms
, text
)
4592 struct x_display_info
*dpyinfo
;
4593 Lisp_Object parms
, text
;
4596 Lisp_Object frame
, tem
;
4598 long window_prompting
= 0;
4600 int count
= SPECPDL_INDEX ();
4601 struct gcpro gcpro1
, gcpro2
, gcpro3
;
4603 int face_change_count_before
= face_change_count
;
4605 struct buffer
*old_buffer
;
4611 kb
= dpyinfo
->kboard
;
4613 kb
= &the_only_kboard
;
4616 /* Get the name of the frame to use for resource lookup. */
4617 name
= x_get_arg (dpyinfo
, parms
, Qname
, "name", "Name", RES_TYPE_STRING
);
4619 && !EQ (name
, Qunbound
)
4621 error ("Invalid frame name--not a string or nil");
4624 GCPRO3 (parms
, name
, frame
);
4626 XSETFRAME (frame
, f
);
4628 buffer
= Fget_buffer_create (build_string (" *tip*"));
4629 Fset_window_buffer (FRAME_ROOT_WINDOW (f
), buffer
, Qnil
);
4630 old_buffer
= current_buffer
;
4631 set_buffer_internal_1 (XBUFFER (buffer
));
4632 current_buffer
->truncate_lines
= Qnil
;
4633 specbind (Qinhibit_read_only
, Qt
);
4634 specbind (Qinhibit_modification_hooks
, Qt
);
4637 set_buffer_internal_1 (old_buffer
);
4639 FRAME_CAN_HAVE_SCROLL_BARS (f
) = 0;
4640 record_unwind_protect (unwind_create_tip_frame
, frame
);
4642 f
->display
= dpyinfo
->frame_display
;
4643 f
->display
->reference_count
++;
4645 /* By setting the output method, we're essentially saying that
4646 the frame is live, as per FRAME_LIVE_P. If we get a signal
4647 from this point on, x_destroy_window might screw up reference
4649 f
->output_method
= output_x_window
;
4650 f
->output_data
.x
= (struct x_output
*) xmalloc (sizeof (struct x_output
));
4651 bzero (f
->output_data
.x
, sizeof (struct x_output
));
4652 f
->output_data
.x
->icon_bitmap
= -1;
4653 FRAME_FONTSET (f
) = -1;
4654 f
->output_data
.x
->scroll_bar_foreground_pixel
= -1;
4655 f
->output_data
.x
->scroll_bar_background_pixel
= -1;
4656 #ifdef USE_TOOLKIT_SCROLL_BARS
4657 f
->output_data
.x
->scroll_bar_top_shadow_pixel
= -1;
4658 f
->output_data
.x
->scroll_bar_bottom_shadow_pixel
= -1;
4659 #endif /* USE_TOOLKIT_SCROLL_BARS */
4660 f
->icon_name
= Qnil
;
4661 FRAME_X_DISPLAY_INFO (f
) = dpyinfo
;
4663 image_cache_refcount
= FRAME_X_IMAGE_CACHE (f
)->refcount
;
4664 dpyinfo_refcount
= dpyinfo
->reference_count
;
4665 #endif /* GLYPH_DEBUG */
4667 FRAME_KBOARD (f
) = kb
;
4669 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4670 f
->output_data
.x
->explicit_parent
= 0;
4672 /* These colors will be set anyway later, but it's important
4673 to get the color reference counts right, so initialize them! */
4676 struct gcpro gcpro1
;
4678 /* Function x_decode_color can signal an error. Make
4679 sure to initialize color slots so that we won't try
4680 to free colors we haven't allocated. */
4681 f
->output_data
.x
->foreground_pixel
= -1;
4682 f
->output_data
.x
->background_pixel
= -1;
4683 f
->output_data
.x
->cursor_pixel
= -1;
4684 f
->output_data
.x
->cursor_foreground_pixel
= -1;
4685 f
->output_data
.x
->border_pixel
= -1;
4686 f
->output_data
.x
->mouse_pixel
= -1;
4688 black
= build_string ("black");
4690 f
->output_data
.x
->foreground_pixel
4691 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4692 f
->output_data
.x
->background_pixel
4693 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4694 f
->output_data
.x
->cursor_pixel
4695 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4696 f
->output_data
.x
->cursor_foreground_pixel
4697 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4698 f
->output_data
.x
->border_pixel
4699 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4700 f
->output_data
.x
->mouse_pixel
4701 = x_decode_color (f
, black
, BLACK_PIX_DEFAULT (f
));
4705 /* Set the name; the functions to which we pass f expect the name to
4707 if (EQ (name
, Qunbound
) || NILP (name
))
4709 f
->name
= build_string (dpyinfo
->x_id_name
);
4710 f
->explicit_name
= 0;
4715 f
->explicit_name
= 1;
4716 /* use the frame's title when getting resources for this frame. */
4717 specbind (Qx_resource_name
, name
);
4720 /* Extract the window parameters from the supplied values that are
4721 needed to determine window geometry. */
4725 font
= x_get_arg (dpyinfo
, parms
, Qfont
, "font", "Font", RES_TYPE_STRING
);
4728 /* First, try whatever font the caller has specified. */
4731 tem
= Fquery_fontset (font
, Qnil
);
4733 font
= x_new_fontset (f
, SDATA (tem
));
4735 font
= x_new_font (f
, SDATA (font
));
4738 /* Try out a font which we hope has bold and italic variations. */
4739 if (!STRINGP (font
))
4740 font
= x_new_font (f
, "-adobe-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-1");
4741 if (!STRINGP (font
))
4742 font
= x_new_font (f
, "-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
4743 if (! STRINGP (font
))
4744 font
= x_new_font (f
, "-*-*-medium-r-normal-*-*-140-*-*-c-*-iso8859-1");
4745 if (! STRINGP (font
))
4746 /* This was formerly the first thing tried, but it finds too many fonts
4747 and takes too long. */
4748 font
= x_new_font (f
, "-*-*-medium-r-*-*-*-*-*-*-c-*-iso8859-1");
4749 /* If those didn't work, look for something which will at least work. */
4750 if (! STRINGP (font
))
4751 font
= x_new_font (f
, "-*-fixed-*-*-*-*-*-140-*-*-c-*-iso8859-1");
4753 if (! STRINGP (font
))
4754 font
= build_string ("fixed");
4756 x_default_parameter (f
, parms
, Qfont
, font
,
4757 "font", "Font", RES_TYPE_STRING
);
4760 x_default_parameter (f
, parms
, Qborder_width
, make_number (2),
4761 "borderWidth", "BorderWidth", RES_TYPE_NUMBER
);
4763 /* This defaults to 2 in order to match xterm. We recognize either
4764 internalBorderWidth or internalBorder (which is what xterm calls
4766 if (NILP (Fassq (Qinternal_border_width
, parms
)))
4770 value
= x_get_arg (dpyinfo
, parms
, Qinternal_border_width
,
4771 "internalBorder", "internalBorder", RES_TYPE_NUMBER
);
4772 if (! EQ (value
, Qunbound
))
4773 parms
= Fcons (Fcons (Qinternal_border_width
, value
),
4777 x_default_parameter (f
, parms
, Qinternal_border_width
, make_number (1),
4778 "internalBorderWidth", "internalBorderWidth",
4781 /* Also do the stuff which must be set before the window exists. */
4782 x_default_parameter (f
, parms
, Qforeground_color
, build_string ("black"),
4783 "foreground", "Foreground", RES_TYPE_STRING
);
4784 x_default_parameter (f
, parms
, Qbackground_color
, build_string ("white"),
4785 "background", "Background", RES_TYPE_STRING
);
4786 x_default_parameter (f
, parms
, Qmouse_color
, build_string ("black"),
4787 "pointerColor", "Foreground", RES_TYPE_STRING
);
4788 x_default_parameter (f
, parms
, Qcursor_color
, build_string ("black"),
4789 "cursorColor", "Foreground", RES_TYPE_STRING
);
4790 x_default_parameter (f
, parms
, Qborder_color
, build_string ("black"),
4791 "borderColor", "BorderColor", RES_TYPE_STRING
);
4793 /* Init faces before x_default_parameter is called for scroll-bar
4794 parameters because that function calls x_set_scroll_bar_width,
4795 which calls change_frame_size, which calls Fset_window_buffer,
4796 which runs hooks, which call Fvertical_motion. At the end, we
4797 end up in init_iterator with a null face cache, which should not
4799 init_frame_faces (f
);
4801 f
->output_data
.x
->parent_desc
= FRAME_X_DISPLAY_INFO (f
)->root_window
;
4803 window_prompting
= x_figure_window_size (f
, parms
, 0);
4806 XSetWindowAttributes attrs
;
4810 mask
= CWBackPixel
| CWOverrideRedirect
| CWEventMask
;
4811 if (DoesSaveUnders (dpyinfo
->screen
))
4812 mask
|= CWSaveUnder
;
4814 /* Window managers look at the override-redirect flag to determine
4815 whether or net to give windows a decoration (Xlib spec, chapter
4817 attrs
.override_redirect
= True
;
4818 attrs
.save_under
= True
;
4819 attrs
.background_pixel
= FRAME_BACKGROUND_PIXEL (f
);
4820 /* Arrange for getting MapNotify and UnmapNotify events. */
4821 attrs
.event_mask
= StructureNotifyMask
;
4823 = FRAME_X_WINDOW (f
)
4824 = XCreateWindow (FRAME_X_DISPLAY (f
),
4825 FRAME_X_DISPLAY_INFO (f
)->root_window
,
4826 /* x, y, width, height */
4830 CopyFromParent
, InputOutput
, CopyFromParent
,
4837 x_default_parameter (f
, parms
, Qauto_raise
, Qnil
,
4838 "autoRaise", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
4839 x_default_parameter (f
, parms
, Qauto_lower
, Qnil
,
4840 "autoLower", "AutoRaiseLower", RES_TYPE_BOOLEAN
);
4841 x_default_parameter (f
, parms
, Qcursor_type
, Qbox
,
4842 "cursorType", "CursorType", RES_TYPE_SYMBOL
);
4844 /* Dimensions, especially FRAME_LINES (f), must be done via change_frame_size.
4845 Change will not be effected unless different from the current
4847 width
= FRAME_COLS (f
);
4848 height
= FRAME_LINES (f
);
4849 SET_FRAME_COLS (f
, 0);
4850 FRAME_LINES (f
) = 0;
4851 change_frame_size (f
, height
, width
, 1, 0, 0);
4853 /* Add `tooltip' frame parameter's default value. */
4854 if (NILP (Fframe_parameter (frame
, intern ("tooltip"))))
4855 Fmodify_frame_parameters (frame
, Fcons (Fcons (intern ("tooltip"), Qt
),
4858 /* Set up faces after all frame parameters are known. This call
4859 also merges in face attributes specified for new frames.
4861 Frame parameters may be changed if .Xdefaults contains
4862 specifications for the default font. For example, if there is an
4863 `Emacs.default.attributeBackground: pink', the `background-color'
4864 attribute of the frame get's set, which let's the internal border
4865 of the tooltip frame appear in pink. Prevent this. */
4867 Lisp_Object bg
= Fframe_parameter (frame
, Qbackground_color
);
4869 /* Set tip_frame here, so that */
4871 call1 (Qface_set_after_frame_default
, frame
);
4873 if (!EQ (bg
, Fframe_parameter (frame
, Qbackground_color
)))
4874 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qbackground_color
, bg
),
4878 Fmodify_frame_parameters (frame
, Fcons (Fcons (Qwindow_system
, Qx
), Qnil
));
4884 /* It is now ok to make the frame official even if we get an error
4885 below. And the frame needs to be on Vframe_list or making it
4886 visible won't work. */
4887 Vframe_list
= Fcons (frame
, Vframe_list
);
4889 /* Now that the frame is official, it counts as a reference to
4891 FRAME_X_DISPLAY_INFO (f
)->reference_count
++;
4893 /* Setting attributes of faces of the tooltip frame from resources
4894 and similar will increment face_change_count, which leads to the
4895 clearing of all current matrices. Since this isn't necessary
4896 here, avoid it by resetting face_change_count to the value it
4897 had before we created the tip frame. */
4898 face_change_count
= face_change_count_before
;
4900 /* Discard the unwind_protect. */
4901 return unbind_to (count
, frame
);
4905 /* Compute where to display tip frame F. PARMS is the list of frame
4906 parameters for F. DX and DY are specified offsets from the current
4907 location of the mouse. WIDTH and HEIGHT are the width and height
4908 of the tooltip. Return coordinates relative to the root window of
4909 the display in *ROOT_X, and *ROOT_Y. */
4912 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, root_x
, root_y
)
4914 Lisp_Object parms
, dx
, dy
;
4916 int *root_x
, *root_y
;
4918 Lisp_Object left
, top
;
4923 /* User-specified position? */
4924 left
= Fcdr (Fassq (Qleft
, parms
));
4925 top
= Fcdr (Fassq (Qtop
, parms
));
4927 /* Move the tooltip window where the mouse pointer is. Resize and
4929 if (!INTEGERP (left
) || !INTEGERP (top
))
4932 XQueryPointer (FRAME_X_DISPLAY (f
), FRAME_X_DISPLAY_INFO (f
)->root_window
,
4933 &root
, &child
, root_x
, root_y
, &win_x
, &win_y
, &pmask
);
4938 *root_y
= XINT (top
);
4939 else if (*root_y
+ XINT (dy
) - height
< 0)
4940 *root_y
-= XINT (dy
);
4944 *root_y
+= XINT (dy
);
4947 if (INTEGERP (left
))
4948 *root_x
= XINT (left
);
4949 else if (*root_x
+ XINT (dx
) + width
<= FRAME_X_DISPLAY_INFO (f
)->width
)
4950 /* It fits to the right of the pointer. */
4951 *root_x
+= XINT (dx
);
4952 else if (width
+ XINT (dx
) <= *root_x
)
4953 /* It fits to the left of the pointer. */
4954 *root_x
-= width
+ XINT (dx
);
4956 /* Put it left-justified on the screen--it ought to fit that way. */
4961 DEFUN ("x-show-tip", Fx_show_tip
, Sx_show_tip
, 1, 6, 0,
4962 doc
: /* Show STRING in a "tooltip" window on frame FRAME.
4963 A tooltip window is a small X window displaying a string.
4965 FRAME nil or omitted means use the selected frame.
4967 PARMS is an optional list of frame parameters which can be used to
4968 change the tooltip's appearance.
4970 Automatically hide the tooltip after TIMEOUT seconds. TIMEOUT nil
4971 means use the default timeout of 5 seconds.
4973 If the list of frame parameters PARAMS contains a `left' parameters,
4974 the tooltip is displayed at that x-position. Otherwise it is
4975 displayed at the mouse position, with offset DX added (default is 5 if
4976 DX isn't specified). Likewise for the y-position; if a `top' frame
4977 parameter is specified, it determines the y-position of the tooltip
4978 window, otherwise it is displayed at the mouse position, with offset
4979 DY added (default is -10).
4981 A tooltip's maximum size is specified by `x-max-tooltip-size'.
4982 Text larger than the specified size is clipped. */)
4983 (string
, frame
, parms
, timeout
, dx
, dy
)
4984 Lisp_Object string
, frame
, parms
, timeout
, dx
, dy
;
4989 struct buffer
*old_buffer
;
4990 struct text_pos pos
;
4991 int i
, width
, height
;
4992 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
;
4993 int old_windows_or_buffers_changed
= windows_or_buffers_changed
;
4994 int count
= SPECPDL_INDEX ();
4996 specbind (Qinhibit_redisplay
, Qt
);
4998 GCPRO4 (string
, parms
, frame
, timeout
);
5000 CHECK_STRING (string
);
5001 f
= check_x_frame (frame
);
5003 timeout
= make_number (5);
5005 CHECK_NATNUM (timeout
);
5008 dx
= make_number (5);
5013 dy
= make_number (-10);
5017 if (NILP (last_show_tip_args
))
5018 last_show_tip_args
= Fmake_vector (make_number (3), Qnil
);
5020 if (!NILP (tip_frame
))
5022 Lisp_Object last_string
= AREF (last_show_tip_args
, 0);
5023 Lisp_Object last_frame
= AREF (last_show_tip_args
, 1);
5024 Lisp_Object last_parms
= AREF (last_show_tip_args
, 2);
5026 if (EQ (frame
, last_frame
)
5027 && !NILP (Fequal (last_string
, string
))
5028 && !NILP (Fequal (last_parms
, parms
)))
5030 struct frame
*f
= XFRAME (tip_frame
);
5032 /* Only DX and DY have changed. */
5033 if (!NILP (tip_timer
))
5035 Lisp_Object timer
= tip_timer
;
5037 call1 (Qcancel_timer
, timer
);
5041 compute_tip_xy (f
, parms
, dx
, dy
, FRAME_PIXEL_WIDTH (f
),
5042 FRAME_PIXEL_HEIGHT (f
), &root_x
, &root_y
);
5043 XMoveWindow (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
5050 /* Hide a previous tip, if any. */
5053 ASET (last_show_tip_args
, 0, string
);
5054 ASET (last_show_tip_args
, 1, frame
);
5055 ASET (last_show_tip_args
, 2, parms
);
5057 /* Add default values to frame parameters. */
5058 if (NILP (Fassq (Qname
, parms
)))
5059 parms
= Fcons (Fcons (Qname
, build_string ("tooltip")), parms
);
5060 if (NILP (Fassq (Qinternal_border_width
, parms
)))
5061 parms
= Fcons (Fcons (Qinternal_border_width
, make_number (3)), parms
);
5062 if (NILP (Fassq (Qborder_width
, parms
)))
5063 parms
= Fcons (Fcons (Qborder_width
, make_number (1)), parms
);
5064 if (NILP (Fassq (Qborder_color
, parms
)))
5065 parms
= Fcons (Fcons (Qborder_color
, build_string ("lightyellow")), parms
);
5066 if (NILP (Fassq (Qbackground_color
, parms
)))
5067 parms
= Fcons (Fcons (Qbackground_color
, build_string ("lightyellow")),
5070 /* Create a frame for the tooltip, and record it in the global
5071 variable tip_frame. */
5072 frame
= x_create_tip_frame (FRAME_X_DISPLAY_INFO (f
), parms
, string
);
5075 /* Set up the frame's root window. */
5076 w
= XWINDOW (FRAME_ROOT_WINDOW (f
));
5077 w
->left_col
= w
->top_line
= make_number (0);
5079 if (CONSP (Vx_max_tooltip_size
)
5080 && INTEGERP (XCAR (Vx_max_tooltip_size
))
5081 && XINT (XCAR (Vx_max_tooltip_size
)) > 0
5082 && INTEGERP (XCDR (Vx_max_tooltip_size
))
5083 && XINT (XCDR (Vx_max_tooltip_size
)) > 0)
5085 w
->total_cols
= XCAR (Vx_max_tooltip_size
);
5086 w
->total_lines
= XCDR (Vx_max_tooltip_size
);
5090 w
->total_cols
= make_number (80);
5091 w
->total_lines
= make_number (40);
5094 FRAME_TOTAL_COLS (f
) = XINT (w
->total_cols
);
5096 w
->pseudo_window_p
= 1;
5098 /* Display the tooltip text in a temporary buffer. */
5099 old_buffer
= current_buffer
;
5100 set_buffer_internal_1 (XBUFFER (XWINDOW (FRAME_ROOT_WINDOW (f
))->buffer
));
5101 current_buffer
->truncate_lines
= Qnil
;
5102 clear_glyph_matrix (w
->desired_matrix
);
5103 clear_glyph_matrix (w
->current_matrix
);
5104 SET_TEXT_POS (pos
, BEGV
, BEGV_BYTE
);
5105 try_window (FRAME_ROOT_WINDOW (f
), pos
);
5107 /* Compute width and height of the tooltip. */
5109 for (i
= 0; i
< w
->desired_matrix
->nrows
; ++i
)
5111 struct glyph_row
*row
= &w
->desired_matrix
->rows
[i
];
5115 /* Stop at the first empty row at the end. */
5116 if (!row
->enabled_p
|| !row
->displays_text_p
)
5119 /* Let the row go over the full width of the frame. */
5120 row
->full_width_p
= 1;
5122 /* There's a glyph at the end of rows that is used to place
5123 the cursor there. Don't include the width of this glyph. */
5124 if (row
->used
[TEXT_AREA
])
5126 last
= &row
->glyphs
[TEXT_AREA
][row
->used
[TEXT_AREA
] - 1];
5127 row_width
= row
->pixel_width
- last
->pixel_width
;
5130 row_width
= row
->pixel_width
;
5132 height
+= row
->height
;
5133 width
= max (width
, row_width
);
5136 /* Add the frame's internal border to the width and height the X
5137 window should have. */
5138 height
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
5139 width
+= 2 * FRAME_INTERNAL_BORDER_WIDTH (f
);
5141 /* Move the tooltip window where the mouse pointer is. Resize and
5143 compute_tip_xy (f
, parms
, dx
, dy
, width
, height
, &root_x
, &root_y
);
5146 XMoveResizeWindow (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
),
5147 root_x
, root_y
, width
, height
);
5148 XMapRaised (FRAME_X_DISPLAY (f
), FRAME_X_WINDOW (f
));
5151 /* Draw into the window. */
5152 w
->must_be_updated_p
= 1;
5153 update_single_window (w
, 1);
5155 /* Restore original current buffer. */
5156 set_buffer_internal_1 (old_buffer
);
5157 windows_or_buffers_changed
= old_windows_or_buffers_changed
;
5160 /* Let the tip disappear after timeout seconds. */
5161 tip_timer
= call3 (intern ("run-at-time"), timeout
, Qnil
,
5162 intern ("x-hide-tip"));
5165 return unbind_to (count
, Qnil
);
5169 DEFUN ("x-hide-tip", Fx_hide_tip
, Sx_hide_tip
, 0, 0, 0,
5170 doc
: /* Hide the current tooltip window, if there is any.
5171 Value is t if tooltip was open, nil otherwise. */)
5175 Lisp_Object deleted
, frame
, timer
;
5176 struct gcpro gcpro1
, gcpro2
;
5178 /* Return quickly if nothing to do. */
5179 if (NILP (tip_timer
) && NILP (tip_frame
))
5184 GCPRO2 (frame
, timer
);
5185 tip_frame
= tip_timer
= deleted
= Qnil
;
5187 count
= SPECPDL_INDEX ();
5188 specbind (Qinhibit_redisplay
, Qt
);
5189 specbind (Qinhibit_quit
, Qt
);
5192 call1 (Qcancel_timer
, timer
);
5196 Fdelete_frame (frame
, Qnil
);
5200 /* Bloodcurdling hack alert: The Lucid menu bar widget's
5201 redisplay procedure is not called when a tip frame over menu
5202 items is unmapped. Redisplay the menu manually... */
5204 struct frame
*f
= SELECTED_FRAME ();
5205 Widget w
= f
->output_data
.x
->menubar_widget
;
5206 extern void xlwmenu_redisplay
P_ ((Widget
));
5208 if (!DoesSaveUnders (FRAME_X_DISPLAY_INFO (f
)->screen
)
5212 xlwmenu_redisplay (w
);
5216 #endif /* USE_LUCID */
5220 return unbind_to (count
, deleted
);
5225 /***********************************************************************
5226 File selection dialog
5227 ***********************************************************************/
5231 /* Callback for "OK" and "Cancel" on file selection dialog. */
5234 file_dialog_cb (widget
, client_data
, call_data
)
5236 XtPointer call_data
, client_data
;
5238 int *result
= (int *) client_data
;
5239 XmAnyCallbackStruct
*cb
= (XmAnyCallbackStruct
*) call_data
;
5240 *result
= cb
->reason
;
5244 /* Callback for unmapping a file selection dialog. This is used to
5245 capture the case where a dialog is closed via a window manager's
5246 closer button, for example. Using a XmNdestroyCallback didn't work
5250 file_dialog_unmap_cb (widget
, client_data
, call_data
)
5252 XtPointer call_data
, client_data
;
5254 int *result
= (int *) client_data
;
5255 *result
= XmCR_CANCEL
;
5259 clean_up_file_dialog (arg
)
5262 struct Lisp_Save_Value
*p
= XSAVE_VALUE (arg
);
5263 Widget dialog
= (Widget
) p
->pointer
;
5267 XtUnmanageChild (dialog
);
5268 XtDestroyWidget (dialog
);
5269 x_menu_set_in_use (0);
5276 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
5277 doc
: /* Read file name, prompting with PROMPT in directory DIR.
5278 Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
5279 selection box, if specified. If MUSTMATCH is non-nil, the returned file
5280 or directory must exist. ONLY-DIR-P is ignored." */)
5281 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
)
5282 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, only_dir_p
;
5285 struct frame
*f
= SELECTED_FRAME ();
5286 Lisp_Object file
= Qnil
;
5287 Widget dialog
, text
, help
;
5290 extern XtAppContext Xt_app_con
;
5291 XmString dir_xmstring
, pattern_xmstring
;
5292 int count
= SPECPDL_INDEX ();
5293 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
5295 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
, file
);
5297 if (popup_activated ())
5298 error ("Trying to use a menu from within a menu-entry");
5300 CHECK_STRING (prompt
);
5303 /* Prevent redisplay. */
5304 specbind (Qinhibit_redisplay
, Qt
);
5308 /* Create the dialog with PROMPT as title, using DIR as initial
5309 directory and using "*" as pattern. */
5310 dir
= Fexpand_file_name (dir
, Qnil
);
5311 dir_xmstring
= XmStringCreateLocalized (SDATA (dir
));
5312 pattern_xmstring
= XmStringCreateLocalized ("*");
5314 XtSetArg (al
[ac
], XmNtitle
, SDATA (prompt
)); ++ac
;
5315 XtSetArg (al
[ac
], XmNdirectory
, dir_xmstring
); ++ac
;
5316 XtSetArg (al
[ac
], XmNpattern
, pattern_xmstring
); ++ac
;
5317 XtSetArg (al
[ac
], XmNresizePolicy
, XmRESIZE_GROW
); ++ac
;
5318 XtSetArg (al
[ac
], XmNdialogStyle
, XmDIALOG_APPLICATION_MODAL
); ++ac
;
5319 dialog
= XmCreateFileSelectionDialog (f
->output_data
.x
->widget
,
5321 XmStringFree (dir_xmstring
);
5322 XmStringFree (pattern_xmstring
);
5324 /* Add callbacks for OK and Cancel. */
5325 XtAddCallback (dialog
, XmNokCallback
, file_dialog_cb
,
5326 (XtPointer
) &result
);
5327 XtAddCallback (dialog
, XmNcancelCallback
, file_dialog_cb
,
5328 (XtPointer
) &result
);
5329 XtAddCallback (dialog
, XmNunmapCallback
, file_dialog_unmap_cb
,
5330 (XtPointer
) &result
);
5332 /* Remove the help button since we can't display help. */
5333 help
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_HELP_BUTTON
);
5334 XtUnmanageChild (help
);
5336 /* Mark OK button as default. */
5337 XtVaSetValues (XmFileSelectionBoxGetChild (dialog
, XmDIALOG_OK_BUTTON
),
5338 XmNshowAsDefault
, True
, NULL
);
5340 /* If MUSTMATCH is non-nil, disable the file entry field of the
5341 dialog, so that the user must select a file from the files list
5342 box. We can't remove it because we wouldn't have a way to get at
5343 the result file name, then. */
5344 text
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_TEXT
);
5345 if (!NILP (mustmatch
))
5348 label
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_SELECTION_LABEL
);
5349 XtSetSensitive (text
, False
);
5350 XtSetSensitive (label
, False
);
5353 /* Manage the dialog, so that list boxes get filled. */
5354 XtManageChild (dialog
);
5356 if (STRINGP (default_filename
))
5358 XmString default_xmstring
;
5359 Widget wtext
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_TEXT
);
5360 Widget list
= XmFileSelectionBoxGetChild (dialog
, XmDIALOG_LIST
);
5362 XmTextPosition last_pos
= XmTextFieldGetLastPosition (wtext
);
5363 XmTextFieldReplace (wtext
, 0, last_pos
,
5364 (SDATA (Ffile_name_nondirectory (default_filename
))));
5366 /* Select DEFAULT_FILENAME in the files list box. DEFAULT_FILENAME
5367 must include the path for this to work. */
5369 default_xmstring
= XmStringCreateLocalized (SDATA (default_filename
));
5371 if (XmListItemExists (list
, default_xmstring
))
5373 int item_pos
= XmListItemPos (list
, default_xmstring
);
5374 /* Select the item and scroll it into view. */
5375 XmListSelectPos (list
, item_pos
, True
);
5376 XmListSetPos (list
, item_pos
);
5379 XmStringFree (default_xmstring
);
5382 record_unwind_protect (clean_up_file_dialog
, make_save_value (dialog
, 0));
5384 /* Process events until the user presses Cancel or OK. */
5385 x_menu_set_in_use (1);
5390 x_menu_wait_for_event (0);
5391 XtAppNextEvent (Xt_app_con
, &event
);
5392 if (event
.type
== KeyPress
5393 && FRAME_X_DISPLAY (f
) == event
.xkey
.display
)
5395 KeySym keysym
= XLookupKeysym (&event
.xkey
, 0);
5397 /* Pop down on C-g. */
5398 if (keysym
== XK_g
&& (event
.xkey
.state
& ControlMask
) != 0)
5399 XtUnmanageChild (dialog
);
5402 (void) x_dispatch_event (&event
, FRAME_X_DISPLAY (f
));
5405 /* Get the result. */
5406 if (result
== XmCR_OK
)
5411 XtVaGetValues (dialog
, XmNtextString
, &text
, NULL
);
5412 XmStringGetLtoR (text
, XmFONTLIST_DEFAULT_TAG
, &data
);
5413 XmStringFree (text
);
5414 file
= build_string (data
);
5423 /* Make "Cancel" equivalent to C-g. */
5425 Fsignal (Qquit
, Qnil
);
5427 return unbind_to (count
, file
);
5430 #endif /* USE_MOTIF */
5435 clean_up_dialog (arg
)
5438 x_menu_set_in_use (0);
5443 DEFUN ("x-file-dialog", Fx_file_dialog
, Sx_file_dialog
, 2, 5, 0,
5444 doc
: /* Read file name, prompting with PROMPT in directory DIR.
5445 Use a file selection dialog. Select DEFAULT-FILENAME in the dialog's file
5446 selection box, if specified. If MUSTMATCH is non-nil, the returned file
5447 or directory must exist. If ONLY-DIR-P is non-nil, the user can only select
5449 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
)
5450 Lisp_Object prompt
, dir
, default_filename
, mustmatch
, only_dir_p
;
5452 FRAME_PTR f
= SELECTED_FRAME ();
5454 Lisp_Object file
= Qnil
;
5455 int count
= SPECPDL_INDEX ();
5456 struct gcpro gcpro1
, gcpro2
, gcpro3
, gcpro4
, gcpro5
, gcpro6
;
5459 GCPRO6 (prompt
, dir
, default_filename
, mustmatch
, only_dir_p
, file
);
5461 if (popup_activated ())
5462 error ("Trying to use a menu from within a menu-entry");
5464 CHECK_STRING (prompt
);
5467 /* Prevent redisplay. */
5468 specbind (Qinhibit_redisplay
, Qt
);
5469 record_unwind_protect (clean_up_dialog
, Qnil
);
5473 if (STRINGP (default_filename
))
5474 cdef_file
= SDATA (default_filename
);
5476 cdef_file
= SDATA (dir
);
5478 fn
= xg_get_file_name (f
, SDATA (prompt
), cdef_file
,
5480 ! NILP (only_dir_p
));
5484 file
= build_string (fn
);
5491 /* Make "Cancel" equivalent to C-g. */
5493 Fsignal (Qquit
, Qnil
);
5495 return unbind_to (count
, file
);
5498 #endif /* USE_GTK */
5501 /***********************************************************************
5503 ***********************************************************************/
5505 #ifdef HAVE_XKBGETKEYBOARD
5506 #include <X11/XKBlib.h>
5507 #include <X11/keysym.h>
5510 DEFUN ("x-backspace-delete-keys-p", Fx_backspace_delete_keys_p
,
5511 Sx_backspace_delete_keys_p
, 0, 1, 0,
5512 doc
: /* Check if both Backspace and Delete keys are on the keyboard of FRAME.
5513 FRAME nil means use the selected frame.
5514 Value is t if we know that both keys are present, and are mapped to the
5515 usual X keysyms. */)
5519 #ifdef HAVE_XKBGETKEYBOARD
5521 struct frame
*f
= check_x_frame (frame
);
5522 Display
*dpy
= FRAME_X_DISPLAY (f
);
5523 Lisp_Object have_keys
;
5524 int major
, minor
, op
, event
, error
;
5528 /* Check library version in case we're dynamically linked. */
5529 major
= XkbMajorVersion
;
5530 minor
= XkbMinorVersion
;
5531 if (!XkbLibraryVersion (&major
, &minor
))
5537 /* Check that the server supports XKB. */
5538 major
= XkbMajorVersion
;
5539 minor
= XkbMinorVersion
;
5540 if (!XkbQueryExtension (dpy
, &op
, &event
, &error
, &major
, &minor
))
5546 /* In this code we check that the keyboard has physical keys with names
5547 that start with BKSP (Backspace) and DELE (Delete), and that they
5548 generate keysym XK_BackSpace and XK_Delete respectively.
5549 This function is used to test if normal-erase-is-backspace should be
5551 An alternative approach would be to just check if XK_BackSpace and
5552 XK_Delete are mapped to any key. But if any of those are mapped to
5553 some non-intuitive key combination (Meta-Shift-Ctrl-whatever) and the
5554 user doesn't know about it, it is better to return false here.
5555 It is more obvious to the user what to do if she/he has two keys
5556 clearly marked with names/symbols and one key does something not
5557 expected (i.e. she/he then tries the other).
5558 The cases where Backspace/Delete is mapped to some other key combination
5559 are rare, and in those cases, normal-erase-is-backspace can be turned on
5563 kb
= XkbGetMap (dpy
, XkbAllMapComponentsMask
, XkbUseCoreKbd
);
5566 int delete_keycode
= 0, backspace_keycode
= 0, i
;
5568 if (XkbGetNames (dpy
, XkbAllNamesMask
, kb
) == Success
)
5570 for (i
= kb
->min_key_code
;
5571 (i
< kb
->max_key_code
5572 && (delete_keycode
== 0 || backspace_keycode
== 0));
5575 /* The XKB symbolic key names can be seen most easily in
5576 the PS file generated by `xkbprint -label name
5578 if (bcmp ("DELE", kb
->names
->keys
[i
].name
, 4) == 0)
5580 else if (bcmp ("BKSP", kb
->names
->keys
[i
].name
, 4) == 0)
5581 backspace_keycode
= i
;
5584 XkbFreeNames (kb
, 0, True
);
5587 XkbFreeClientMap (kb
, 0, True
);
5590 && backspace_keycode
5591 && XKeysymToKeycode (dpy
, XK_Delete
) == delete_keycode
5592 && XKeysymToKeycode (dpy
, XK_BackSpace
) == backspace_keycode
)
5597 #else /* not HAVE_XKBGETKEYBOARD */
5599 #endif /* not HAVE_XKBGETKEYBOARD */
5604 /***********************************************************************
5606 ***********************************************************************/
5608 /* Keep this list in the same order as frame_parms in frame.c.
5609 Use 0 for unsupported frame parameters. */
5611 frame_parm_handler x_frame_parm_handlers
[] =
5615 x_set_background_color
,
5621 x_set_foreground_color
,
5624 x_set_internal_border_width
,
5625 x_set_menu_bar_lines
,
5627 x_explicitly_set_name
,
5628 x_set_scroll_bar_width
,
5631 x_set_vertical_scroll_bars
,
5633 x_set_tool_bar_lines
,
5634 x_set_scroll_bar_foreground
,
5635 x_set_scroll_bar_background
,
5647 /* This is zero if not using X windows. */
5650 /* The section below is built by the lisp expression at the top of the file,
5651 just above where these variables are declared. */
5652 /*&&& init symbols here &&&*/
5653 Qnone
= intern ("none");
5655 Qsuppress_icon
= intern ("suppress-icon");
5656 staticpro (&Qsuppress_icon
);
5657 Qundefined_color
= intern ("undefined-color");
5658 staticpro (&Qundefined_color
);
5659 Qcompound_text
= intern ("compound-text");
5660 staticpro (&Qcompound_text
);
5661 Qcancel_timer
= intern ("cancel-timer");
5662 staticpro (&Qcancel_timer
);
5663 /* This is the end of symbol initialization. */
5665 /* Text property `display' should be nonsticky by default. */
5666 Vtext_property_default_nonsticky
5667 = Fcons (Fcons (Qdisplay
, Qt
), Vtext_property_default_nonsticky
);
5670 Fput (Qundefined_color
, Qerror_conditions
,
5671 Fcons (Qundefined_color
, Fcons (Qerror
, Qnil
)));
5672 Fput (Qundefined_color
, Qerror_message
,
5673 build_string ("Undefined color"));
5675 DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape
,
5676 doc
: /* The shape of the pointer when over text.
5677 Changing the value does not affect existing frames
5678 unless you set the mouse color. */);
5679 Vx_pointer_shape
= Qnil
;
5681 #if 0 /* This doesn't really do anything. */
5682 DEFVAR_LISP ("x-nontext-pointer-shape", &Vx_nontext_pointer_shape
,
5683 doc
: /* The shape of the pointer when not over text.
5684 This variable takes effect when you create a new frame
5685 or when you set the mouse color. */);
5687 Vx_nontext_pointer_shape
= Qnil
;
5689 DEFVAR_LISP ("x-hourglass-pointer-shape", &Vx_hourglass_pointer_shape
,
5690 doc
: /* The shape of the pointer when Emacs is busy.
5691 This variable takes effect when you create a new frame
5692 or when you set the mouse color. */);
5693 Vx_hourglass_pointer_shape
= Qnil
;
5695 DEFVAR_BOOL ("display-hourglass", &display_hourglass_p
,
5696 doc
: /* Non-zero means Emacs displays an hourglass pointer on window systems. */);
5697 display_hourglass_p
= 1;
5699 DEFVAR_LISP ("hourglass-delay", &Vhourglass_delay
,
5700 doc
: /* *Seconds to wait before displaying an hourglass pointer.
5701 Value must be an integer or float. */);
5702 Vhourglass_delay
= make_number (DEFAULT_HOURGLASS_DELAY
);
5704 #if 0 /* This doesn't really do anything. */
5705 DEFVAR_LISP ("x-mode-pointer-shape", &Vx_mode_pointer_shape
,
5706 doc
: /* The shape of the pointer when over the mode line.
5707 This variable takes effect when you create a new frame
5708 or when you set the mouse color. */);
5710 Vx_mode_pointer_shape
= Qnil
;
5712 DEFVAR_LISP ("x-sensitive-text-pointer-shape",
5713 &Vx_sensitive_text_pointer_shape
,
5714 doc
: /* The shape of the pointer when over mouse-sensitive text.
5715 This variable takes effect when you create a new frame
5716 or when you set the mouse color. */);
5717 Vx_sensitive_text_pointer_shape
= Qnil
;
5719 DEFVAR_LISP ("x-window-horizontal-drag-cursor",
5720 &Vx_window_horizontal_drag_shape
,
5721 doc
: /* Pointer shape to use for indicating a window can be dragged horizontally.
5722 This variable takes effect when you create a new frame
5723 or when you set the mouse color. */);
5724 Vx_window_horizontal_drag_shape
= Qnil
;
5726 DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel
,
5727 doc
: /* A string indicating the foreground color of the cursor box. */);
5728 Vx_cursor_fore_pixel
= Qnil
;
5730 DEFVAR_LISP ("x-max-tooltip-size", &Vx_max_tooltip_size
,
5731 doc
: /* Maximum size for tooltips. Value is a pair (COLUMNS . ROWS).
5732 Text larger than this is clipped. */);
5733 Vx_max_tooltip_size
= Fcons (make_number (80), make_number (40));
5735 DEFVAR_LISP ("x-no-window-manager", &Vx_no_window_manager
,
5736 doc
: /* Non-nil if no X window manager is in use.
5737 Emacs doesn't try to figure this out; this is always nil
5738 unless you set it to something else. */);
5739 /* We don't have any way to find this out, so set it to nil
5740 and maybe the user would like to set it to t. */
5741 Vx_no_window_manager
= Qnil
;
5743 DEFVAR_LISP ("x-pixel-size-width-font-regexp",
5744 &Vx_pixel_size_width_font_regexp
,
5745 doc
: /* Regexp matching a font name whose width is the same as `PIXEL_SIZE'.
5747 Since Emacs gets width of a font matching with this regexp from
5748 PIXEL_SIZE field of the name, font finding mechanism gets faster for
5749 such a font. This is especially effective for such large fonts as
5750 Chinese, Japanese, and Korean. */);
5751 Vx_pixel_size_width_font_regexp
= Qnil
;
5753 /* This is not ifdef:ed, so other builds than GTK can customize it. */
5754 DEFVAR_BOOL ("x-use-old-gtk-file-dialog", &x_use_old_gtk_file_dialog
,
5755 doc
: /* *Non-nil means prompt with the old GTK file selection dialog.
5756 If nil or if the file selection dialog is not available, the new GTK file
5757 chooser is used instead. To turn off all file dialogs set the
5758 variable `use-file-dialog'. */);
5759 x_use_old_gtk_file_dialog
= 0;
5761 #ifdef USE_X_TOOLKIT
5762 Fprovide (intern ("x-toolkit"), Qnil
);
5764 Fprovide (intern ("motif"), Qnil
);
5766 DEFVAR_LISP ("motif-version-string", &Vmotif_version_string
,
5767 doc
: /* Version info for LessTif/Motif. */);
5768 Vmotif_version_string
= build_string (XmVERSION_STRING
);
5769 #endif /* USE_MOTIF */
5770 #endif /* USE_X_TOOLKIT */
5773 /* Provide x-toolkit also for GTK. Internally GTK does not use Xt so it
5774 is not an X toolkit in that sense (USE_X_TOOLKIT is not defined).
5775 But for a user it is a toolkit for X, and indeed, configure
5776 accepts --with-x-toolkit=gtk. */
5777 Fprovide (intern ("x-toolkit"), Qnil
);
5778 Fprovide (intern ("gtk"), Qnil
);
5780 DEFVAR_LISP ("gtk-version-string", &Vgtk_version_string
,
5781 doc
: /* Version info for GTK+. */);
5783 char gtk_version
[40];
5784 g_snprintf (gtk_version
, sizeof (gtk_version
), "%u.%u.%u",
5785 GTK_MAJOR_VERSION
, GTK_MINOR_VERSION
, GTK_MICRO_VERSION
);
5786 Vgtk_version_string
= build_string (gtk_version
);
5788 #endif /* USE_GTK */
5790 /* X window properties. */
5791 defsubr (&Sx_change_window_property
);
5792 defsubr (&Sx_delete_window_property
);
5793 defsubr (&Sx_window_property
);
5795 defsubr (&Sxw_display_color_p
);
5796 defsubr (&Sx_display_grayscale_p
);
5797 defsubr (&Sxw_color_defined_p
);
5798 defsubr (&Sxw_color_values
);
5799 defsubr (&Sx_server_max_request_size
);
5800 defsubr (&Sx_server_vendor
);
5801 defsubr (&Sx_server_version
);
5802 defsubr (&Sx_display_pixel_width
);
5803 defsubr (&Sx_display_pixel_height
);
5804 defsubr (&Sx_display_mm_width
);
5805 defsubr (&Sx_display_mm_height
);
5806 defsubr (&Sx_display_screens
);
5807 defsubr (&Sx_display_planes
);
5808 defsubr (&Sx_display_color_cells
);
5809 defsubr (&Sx_display_visual_class
);
5810 defsubr (&Sx_display_backing_store
);
5811 defsubr (&Sx_display_save_under
);
5812 defsubr (&Sx_create_frame
);
5813 defsubr (&Sx_open_connection
);
5814 defsubr (&Sx_close_connection
);
5815 defsubr (&Sx_display_list
);
5816 defsubr (&Sx_synchronize
);
5817 defsubr (&Sx_focus_frame
);
5818 defsubr (&Sx_backspace_delete_keys_p
);
5820 /* Setting callback functions for fontset handler. */
5821 get_font_info_func
= x_get_font_info
;
5823 #if 0 /* This function pointer doesn't seem to be used anywhere.
5824 And the pointer assigned has the wrong type, anyway. */
5825 list_fonts_func
= x_list_fonts
;
5828 load_font_func
= x_load_font
;
5829 find_ccl_program_func
= x_find_ccl_program
;
5830 query_font_func
= x_query_font
;
5831 set_frame_fontset_func
= x_set_font
;
5832 check_window_system_func
= check_x
;
5834 hourglass_atimer
= NULL
;
5835 hourglass_shown_p
= 0;
5837 defsubr (&Sx_show_tip
);
5838 defsubr (&Sx_hide_tip
);
5840 staticpro (&tip_timer
);
5842 staticpro (&tip_frame
);
5844 last_show_tip_args
= Qnil
;
5845 staticpro (&last_show_tip_args
);
5847 #if defined (USE_MOTIF) || defined (USE_GTK)
5848 defsubr (&Sx_file_dialog
);
5852 #endif /* HAVE_X_WINDOWS */
5854 /* arch-tag: 55040d02-5485-4d58-8b22-95a7a05f3288
5855 (do not change this comment) */